#include <EventFilter/L1GlobalTriggerRawToDigi/interface/L1GTEvmDigiToRaw.h>
Public Member Functions | |
L1GTEvmDigiToRaw (const edm::ParameterSet &) | |
constructor(s) | |
virtual | ~L1GTEvmDigiToRaw () |
destructor | |
Private Member Functions | |
virtual void | beginJob (const edm::EventSetup &) |
beginning of job stuff | |
virtual void | endJob () |
end of job stuff | |
void | packFDL (const edm::EventSetup &, unsigned char *, L1GtFdlWord &) |
pack FDL blocks for various bunch crosses | |
void | packGTFE (const edm::EventSetup &, unsigned char *, L1GtfeExtWord &, boost::uint16_t activeBoardsGtValue) |
pack the GTFE block gives the number of bunch crosses in the event, as well as the active boards records for inactive boards are not written in the GT EVM record | |
void | packHeader (unsigned char *, edm::Event &) |
block packers ------------- | |
void | packTCS (const edm::EventSetup &evSetup, unsigned char *ptrGt, L1TcsWord &tcsBlock) |
pack the TCS block | |
void | packTrailer (unsigned char *, unsigned char *, int) |
pack trailer word | |
virtual void | produce (edm::Event &, const edm::EventSetup &) |
loop over events | |
Private Attributes | |
boost::uint16_t | m_activeBoardsMaskGt |
mask for active boards | |
int | m_bstLengthBytes |
length of BST record (in bytes) | |
int | m_evmGtFedId |
FED Id for GT EVM record default value defined in DataFormats/FEDRawData/src/FEDNumbering.cc. | |
edm::InputTag | m_evmGtInputTag |
input tag for GT EVM record | |
bool | m_isDebugEnabled |
int | m_maxBxInEvent |
max Bx's in the event, computed after m_totalBxInEvent is obtained from GTFE block assume symmetrical number of BX around L1Accept | |
int | m_minBxInEvent |
min Bx's in the event, computed after m_totalBxInEvent is obtained from GTFE block assume symmetrical number of BX around L1Accept | |
int | m_totalBxInEvent |
total Bx's in the event, obtained from GTFE block | |
int | m_verbosity |
verbosity level |
Implementation: <TODO: enter implementation details>
$Date$ $Revision$
Definition at line 44 of file L1GTEvmDigiToRaw.h.
L1GTEvmDigiToRaw::L1GTEvmDigiToRaw | ( | const edm::ParameterSet & | pSet | ) | [explicit] |
constructor(s)
Definition at line 57 of file L1GTEvmDigiToRaw.cc.
References lat::endl(), LogDebug, m_activeBoardsMaskGt, m_evmGtFedId, and m_evmGtInputTag.
00057 : 00058 m_evmGtFedId(pSet.getUntrackedParameter<int>("EvmGtFedId", 00059 FEDNumbering::getTriggerGTPFEDIds().first)), 00060 m_evmGtInputTag(pSet.getParameter<edm::InputTag>("EvmGtInputTag")), 00061 m_activeBoardsMaskGt(pSet.getParameter<unsigned int>("ActiveBoardsMask")), 00062 m_totalBxInEvent(0), 00063 m_minBxInEvent(0), m_maxBxInEvent(), 00064 m_verbosity(pSet.getUntrackedParameter<int> ("Verbosity", 0)), 00065 m_isDebugEnabled(edm::isDebugEnabled()) 00066 00067 00068 00069 { 00070 00071 LogDebug("L1GTEvmDigiToRaw") << "\nMask for active boards (hex format): " 00072 << std::hex << std::setw(sizeof(m_activeBoardsMaskGt)*2) 00073 << std::setfill('0') << m_activeBoardsMaskGt << std::dec 00074 << std::setfill(' ') << "\nInput tag for EVM GT record: " 00075 << m_evmGtInputTag << "\nFED Id for EVM GT record: " 00076 << m_evmGtFedId << " \n" << std::endl; 00077 00078 // 00079 produces<FEDRawDataCollection>(); 00080 00081 }
L1GTEvmDigiToRaw::~L1GTEvmDigiToRaw | ( | ) | [virtual] |
void L1GTEvmDigiToRaw::beginJob | ( | const edm::EventSetup & | evSetup | ) | [private, virtual] |
beginning of job stuff
Reimplemented from edm::EDProducer.
Definition at line 94 of file L1GTEvmDigiToRaw.cc.
end of job stuff
Reimplemented from edm::EDProducer.
Definition at line 736 of file L1GTEvmDigiToRaw.cc.
void L1GTEvmDigiToRaw::packFDL | ( | const edm::EventSetup & | evSetup, | |
unsigned char * | ptrGt, | |||
L1GtFdlWord & | fdlBlock | |||
) | [private] |
pack FDL blocks for various bunch crosses
Definition at line 634 of file L1GTEvmDigiToRaw.cc.
References lat::endl(), L1GtFdlWord::getSize(), LogDebug, LogTrace, m_isDebugEnabled, m_verbosity, L1GtFdlWord::setBoardIdWord64(), L1GtFdlWord::setBxInEventWord64(), L1GtFdlWord::setBxNrWord64(), L1GtFdlWord::setEventNrWord64(), L1GtFdlWord::setFinalORWord64(), L1GtFdlWord::setGtDecisionWordAWord64(), L1GtFdlWord::setGtDecisionWordBWord64(), L1GtFdlWord::setGtDecisionWordExtendedWord64(), L1GtFdlWord::setGtPrescaleFactorIndexAlgoWord64(), L1GtFdlWord::setGtPrescaleFactorIndexTechWord64(), L1GtFdlWord::setGtTechnicalTriggerWordWord64(), L1GtFdlWord::setLocalBxNrWord64(), L1GtFdlWord::setLumiSegmentNrWord64(), L1GtFdlWord::setNoAlgoWord64(), L1GtFdlWord::setOrbitNrWord64(), L1GtFdlWord::setPhysicsDeclaredWord64(), and L1GlobalTriggerReadoutSetup::UnitLength.
Referenced by produce().
00638 { 00639 00640 if (m_verbosity && m_isDebugEnabled) { 00641 LogDebug("L1GTEvmDigiToRaw") << "\nPacking FDL \n" << std::endl; 00642 } 00643 00644 int uLength = L1GlobalTriggerReadoutSetup::UnitLength; 00645 00646 // initialize the required number of word64 00647 int nrWord64 = fdlBlock.getSize()/uLength; 00648 std::vector<boost::uint64_t> tmpWord64; 00649 tmpWord64.resize(nrWord64); 00650 00651 for (int iWord = 0; iWord < nrWord64; ++iWord) { 00652 tmpWord64[iWord] = 0x0000000000000000ULL; 00653 } 00654 00655 // fill the values in the words 00656 for (int iWord = 0; iWord < nrWord64; ++iWord) { 00657 00658 fdlBlock.setBoardIdWord64(tmpWord64[iWord], iWord); 00659 fdlBlock.setBxInEventWord64(tmpWord64[iWord], iWord); 00660 fdlBlock.setBxNrWord64(tmpWord64[iWord], iWord); 00661 fdlBlock.setEventNrWord64(tmpWord64[iWord], iWord); 00662 00663 fdlBlock.setGtTechnicalTriggerWordWord64(tmpWord64[iWord], iWord); 00664 00665 fdlBlock.setGtDecisionWordAWord64(tmpWord64[iWord], iWord); 00666 fdlBlock.setGtDecisionWordBWord64(tmpWord64[iWord], iWord); 00667 00668 fdlBlock.setGtDecisionWordExtendedWord64(tmpWord64[iWord], iWord); 00669 00670 fdlBlock.setPhysicsDeclaredWord64(tmpWord64[iWord], iWord); 00671 fdlBlock.setGtPrescaleFactorIndexTechWord64(tmpWord64[iWord], iWord); 00672 fdlBlock.setGtPrescaleFactorIndexAlgoWord64(tmpWord64[iWord], iWord); 00673 fdlBlock.setNoAlgoWord64(tmpWord64[iWord], iWord); 00674 fdlBlock.setFinalORWord64(tmpWord64[iWord], iWord); 00675 00676 fdlBlock.setOrbitNrWord64(tmpWord64[iWord], iWord); 00677 fdlBlock.setLumiSegmentNrWord64(tmpWord64[iWord], iWord); 00678 fdlBlock.setLocalBxNrWord64(tmpWord64[iWord], iWord); 00679 00680 } 00681 00682 // put the words in the FED record 00683 00684 boost::uint64_t* pw = 00685 reinterpret_cast<boost::uint64_t*>(const_cast<unsigned char*>(ptrGt)); 00686 00687 for (int iWord = 0; iWord < nrWord64; ++iWord) { 00688 00689 *pw++ = tmpWord64[iWord]; 00690 00691 if (m_verbosity && m_isDebugEnabled) { 00692 LogTrace("L1GTEvmDigiToRaw") 00693 << std::setw(4) << iWord << " " 00694 << std::hex << std::setfill('0') 00695 << std::setw(16) << tmpWord64[iWord] 00696 << std::dec << std::setfill(' ') 00697 << std::endl; 00698 } 00699 } 00700 00701 }
void L1GTEvmDigiToRaw::packGTFE | ( | const edm::EventSetup & | evSetup, | |
unsigned char * | ptrGt, | |||
L1GtfeExtWord & | gtfeBlock, | |||
boost::uint16_t | activeBoardsGtValue | |||
) | [private] |
pack the GTFE block gives the number of bunch crosses in the event, as well as the active boards records for inactive boards are not written in the GT EVM record
Definition at line 507 of file L1GTEvmDigiToRaw.cc.
References lat::endl(), L1GtfeExtWord::getSize(), LogDebug, LogTrace, m_bstLengthBytes, m_isDebugEnabled, m_verbosity, L1GtfeWord::setActiveBoardsWord64(), L1GtfeWord::setAltNrBxBoardWord64(), L1GtfeWord::setBoardIdWord64(), L1GtfeExtWord::setBstWord64(), L1GtfeWord::setBxNrWord64(), L1GtfeWord::setRecordLength1Word64(), L1GtfeWord::setRecordLengthWord64(), L1GtfeWord::setSetupVersionWord64(), L1GtfeWord::setTotalTriggerNrWord64(), and L1GlobalTriggerReadoutSetup::UnitLength.
Referenced by produce().
00512 { 00513 00514 if (m_verbosity && m_isDebugEnabled) { 00515 LogDebug("L1GTEvmDigiToRaw") << "\nPacking GTFE \n" << std::endl; 00516 } 00517 00518 int uLength = L1GlobalTriggerReadoutSetup::UnitLength; 00519 00520 // initialize the required number of word64 00521 int nrWord64 = gtfeBlock.getSize()/uLength; 00522 std::vector<boost::uint64_t> tmpWord64; 00523 tmpWord64.resize(nrWord64); 00524 00525 for (int iWord = 0; iWord < nrWord64; ++iWord) { 00526 tmpWord64[iWord] = 0x0000000000000000ULL; 00527 } 00528 00529 // fill the values in the words 00530 for (int iWord = 0; iWord < nrWord64; ++iWord) { 00531 00532 gtfeBlock.setBoardIdWord64(tmpWord64[iWord], iWord); 00533 gtfeBlock.setRecordLength1Word64(tmpWord64[iWord], iWord); 00534 gtfeBlock.setRecordLengthWord64(tmpWord64[iWord], iWord); 00535 gtfeBlock.setBxNrWord64(tmpWord64[iWord], iWord); 00536 gtfeBlock.setSetupVersionWord64(tmpWord64[iWord], iWord); 00537 gtfeBlock.setActiveBoardsWord64(tmpWord64[iWord], iWord, activeBoardsGtValue); 00538 gtfeBlock.setAltNrBxBoardWord64(tmpWord64[iWord], iWord); 00539 gtfeBlock.setTotalTriggerNrWord64(tmpWord64[iWord], iWord); 00540 00541 for (int iBst = 0; iBst < m_bstLengthBytes; ++iBst) { 00542 gtfeBlock.setBstWord64(tmpWord64[iWord], iBst, iWord); 00543 } 00544 00545 } 00546 00547 // put the words in the FED record 00548 00549 boost::uint64_t* pw = 00550 reinterpret_cast<boost::uint64_t*>(const_cast<unsigned char*>(ptrGt)); 00551 00552 for (int iWord = 0; iWord < nrWord64; ++iWord) { 00553 00554 *pw++ = tmpWord64[iWord]; 00555 00556 if (m_verbosity && m_isDebugEnabled) { 00557 LogTrace("L1GTEvmDigiToRaw") 00558 << std::setw(4) << iWord << " " 00559 << std::hex << std::setfill('0') 00560 << std::setw(16) << tmpWord64[iWord] 00561 << std::dec << std::setfill(' ') 00562 << std::endl; 00563 } 00564 } 00565 00566 00567 }
void L1GTEvmDigiToRaw::packHeader | ( | unsigned char * | ptrGt, | |
edm::Event & | iEvent | |||
) | [private] |
block packers -------------
pack header
Definition at line 456 of file L1GTEvmDigiToRaw.cc.
References edm::Event::bunchCrossing(), lat::endl(), edm::Event::id(), LogDebug, m_evmGtFedId, m_isDebugEnabled, m_verbosity, and FEDHeader::set().
Referenced by produce().
00457 { 00458 // TODO FIXME where from to get all numbers? 00459 00460 // Event Trigger type identifier 00461 int triggerTypeVal = 0; 00462 00463 // Level-1 event number generated by the TTC system 00464 int lvl1IdVal = iEvent.id().event(); 00465 00466 // The bunch crossing number 00467 int bxCross = iEvent.bunchCrossing(); 00468 boost::uint16_t bxCrossHw = 0; 00469 if ((bxCross & 0xFFF) == bxCross) { 00470 bxCrossHw = static_cast<boost::uint16_t> (bxCross); 00471 } 00472 else { 00473 bxCrossHw = 0; // Bx number too large, set to 0! 00474 if (m_verbosity && m_isDebugEnabled) { 00475 LogDebug("L1GTEvmDigiToRaw") 00476 << "\nBunch cross number [hex] = " 00477 << std::hex << bxCross 00478 << "\n larger than 12 bits. Set to 0! \n" 00479 << std::dec 00480 << std::endl; 00481 } 00482 } 00483 int bxIdVal = bxCrossHw; 00484 00485 // Identifier of the FED 00486 int sourceIdVal = m_evmGtFedId; 00487 00488 // Version identifier of the FED data format 00489 int versionVal = 0; 00490 00491 // 0 -> the current header word is the last one. 00492 // 1-> other header words can follow 00493 // (always 1 for ECAL) 00494 bool moreHeadersVal = false; 00495 00496 00497 FEDHeader gtFEDHeader(ptrGt); 00498 00499 gtFEDHeader.set(ptrGt, 00500 triggerTypeVal, lvl1IdVal, bxIdVal, sourceIdVal, versionVal, 00501 moreHeadersVal); 00502 00503 00504 }
void L1GTEvmDigiToRaw::packTCS | ( | const edm::EventSetup & | evSetup, | |
unsigned char * | ptrGt, | |||
L1TcsWord & | tcsBlock | |||
) | [private] |
pack the TCS block
Definition at line 570 of file L1GTEvmDigiToRaw.cc.
References lat::endl(), L1TcsWord::getSize(), LogDebug, LogTrace, m_isDebugEnabled, m_verbosity, L1TcsWord::setAssignedPartitionsWord64(), L1TcsWord::setBoardIdWord64(), L1TcsWord::setBxNrWord64(), L1TcsWord::setDaqNrWord64(), L1TcsWord::setEventNrWord64(), L1TcsWord::setLuminositySegmentNrWord64(), L1TcsWord::setOrbitNrWord64(), L1TcsWord::setPartRunNrWord64(), L1TcsWord::setPartTrigNrWord64(), L1TcsWord::setStatusWord64(), L1TcsWord::setTriggerTypeWord64(), and L1GlobalTriggerReadoutSetup::UnitLength.
Referenced by produce().
00574 { 00575 00576 if (m_verbosity && m_isDebugEnabled) { 00577 LogDebug("L1GTEvmDigiToRaw") << "\nPacking TCS \n" << std::endl; 00578 } 00579 00580 int uLength = L1GlobalTriggerReadoutSetup::UnitLength; 00581 00582 // initialize the required number of word64 00583 int nrWord64 = tcsBlock.getSize()/uLength; 00584 std::vector<boost::uint64_t> tmpWord64; 00585 tmpWord64.resize(nrWord64); 00586 00587 for (int iWord = 0; iWord < nrWord64; ++iWord) { 00588 tmpWord64[iWord] = 0x0000000000000000ULL; 00589 } 00590 00591 // fill the values in the words 00592 for (int iWord = 0; iWord < nrWord64; ++iWord) { 00593 00594 tcsBlock.setBoardIdWord64(tmpWord64[iWord], iWord); 00595 tcsBlock.setBxNrWord64(tmpWord64[iWord], iWord); 00596 tcsBlock.setDaqNrWord64(tmpWord64[iWord], iWord); 00597 tcsBlock.setTriggerTypeWord64(tmpWord64[iWord], iWord); 00598 tcsBlock.setStatusWord64(tmpWord64[iWord], iWord); 00599 tcsBlock.setLuminositySegmentNrWord64(tmpWord64[iWord], iWord); 00600 00601 tcsBlock.setPartRunNrWord64(tmpWord64[iWord], iWord); 00602 tcsBlock.setAssignedPartitionsWord64(tmpWord64[iWord], iWord); 00603 00604 tcsBlock.setPartTrigNrWord64(tmpWord64[iWord], iWord); 00605 tcsBlock.setEventNrWord64(tmpWord64[iWord], iWord); 00606 00607 tcsBlock.setOrbitNrWord64(tmpWord64[iWord], iWord); 00608 00609 } 00610 00611 // put the words in the FED record 00612 00613 boost::uint64_t* pw = 00614 reinterpret_cast<boost::uint64_t*>(const_cast<unsigned char*>(ptrGt)); 00615 00616 for (int iWord = 0; iWord < nrWord64; ++iWord) { 00617 00618 *pw++ = tmpWord64[iWord]; 00619 00620 if (m_verbosity && m_isDebugEnabled) { 00621 LogTrace("L1GTEvmDigiToRaw") 00622 << std::setw(4) << iWord << " " 00623 << std::hex << std::setfill('0') 00624 << std::setw(16) << tmpWord64[iWord] 00625 << std::dec << std::setfill(' ') 00626 << std::endl; 00627 } 00628 } 00629 00630 00631 }
void L1GTEvmDigiToRaw::packTrailer | ( | unsigned char * | ptrGt, | |
unsigned char * | ptrGtBegin, | |||
int | dataSize | |||
) | [private] |
pack trailer word
Definition at line 705 of file L1GTEvmDigiToRaw.cc.
References evf::compute_crc(), and FEDTrailer::set().
Referenced by produce().
00707 { 00708 00709 // TODO FIXME where from to get all numbers? 00710 00711 // The length of the event fragment counted in 64-bit words including header and trailer 00712 int lengthVal = dataSize/8; 00713 00714 // Cyclic Redundancy Code of the event fragment including header and trailer 00715 int crcVal = evf::compute_crc(ptrGtBegin, dataSize); 00716 00717 // Event fragment status information 00718 int evtStatusVal = 0; 00719 00720 // Current value of the Trigger Throttling System bits. 00721 int ttsBitsVal = 0; 00722 00723 // 0 -> the current trailer word is the last one. 00724 // 1-> other trailer words can follow 00725 // (always 0 for ECAL) 00726 bool moreTrailersVal = false; 00727 00728 FEDTrailer gtFEDTrailer(ptrGt); 00729 gtFEDTrailer.set(ptrGt, 00730 lengthVal, crcVal, evtStatusVal, ttsBitsVal, 00731 moreTrailersVal); 00732 00733 }
void L1GTEvmDigiToRaw::produce | ( | edm::Event & | iEvent, | |
const edm::EventSetup & | evSetup | |||
) | [private, virtual] |
loop over events
Implements edm::EDProducer.
Definition at line 103 of file L1GTEvmDigiToRaw.cc.
References L1GtfeWord::activeBoards(), L1GtfeWord::altNrBxBoard(), L1GtfeExtWord::bstLengthBytes(), FEDRawData::data(), lat::endl(), FDL, edm::EventSetup::get(), edm::Event::getByLabel(), L1TcsWord::getSize(), L1GtfeExtWord::getSize(), L1GtFdlWord::getSize(), GTFE, edm::Handle< T >::isValid(), LogDebug, LogTrace, m_activeBoardsMaskGt, m_bstLengthBytes, m_evmGtFedId, m_evmGtInputTag, m_isDebugEnabled, m_maxBxInEvent, m_minBxInEvent, m_totalBxInEvent, m_verbosity, packFDL(), packGTFE(), packHeader(), packTCS(), packTrailer(), L1GtfeExtWord::print(), L1TcsWord::print(), L1GtFdlWord::print(), edm::Event::put(), L1GtfeWord::recordLength(), L1GtfeWord::recordLength1(), FEDRawData::resize(), FEDRawData::size(), TCS, and TIM.
00104 { 00105 00106 // define new FEDRawDataCollection 00107 // it contains ALL FEDs in an event 00108 std::auto_ptr<FEDRawDataCollection> allFedRawData(new FEDRawDataCollection); 00109 00110 FEDRawData& gtRawData = allFedRawData->FEDData(m_evmGtFedId); 00111 00112 // get records from EventSetup 00113 00114 // board maps 00115 edm::ESHandle< L1GtBoardMaps > l1GtBM; 00116 evSetup.get< L1GtBoardMapsRcd >().get( l1GtBM ); 00117 00118 const std::vector<L1GtBoard> boardMaps = l1GtBM->gtBoardMaps(); 00119 int boardMapsSize = boardMaps.size(); 00120 00121 typedef std::vector<L1GtBoard>::const_iterator CItBoardMaps; 00122 00123 // create an ordered vector for the GT EVM record 00124 // header (pos 0 in record) and trailer (last position in record) 00125 // not included, as they are not in board list 00126 std::vector<L1GtBoard> gtRecordMap; 00127 gtRecordMap.reserve(boardMapsSize); 00128 00129 for (int iPos = 0; iPos < boardMapsSize; ++iPos) { 00130 for (CItBoardMaps itBoard = boardMaps.begin(); itBoard 00131 != boardMaps.end(); ++itBoard) { 00132 00133 if (itBoard->gtPositionEvmRecord() == iPos) { 00134 gtRecordMap.push_back(*itBoard); 00135 break; 00136 } 00137 00138 } 00139 } 00140 00141 00142 00143 // get L1GlobalTriggerEvmReadoutRecord 00144 edm::Handle<L1GlobalTriggerEvmReadoutRecord> gtReadoutRecord; 00145 iEvent.getByLabel(m_evmGtInputTag, gtReadoutRecord); 00146 00147 if (!gtReadoutRecord.isValid()) { 00148 edm::LogWarning("L1GTEvmDigiToRaw") 00149 << "\nWarning: L1GlobalTriggerEvmReadoutRecord with input tag " << m_evmGtInputTag 00150 << "\nrequested in configuration, but not found in the event." 00151 << "\nQuit packing this event" << std::endl; 00152 00153 // put the raw data in the event 00154 iEvent.put(allFedRawData); 00155 00156 return; 00157 } 00158 00159 if (m_verbosity && m_isDebugEnabled) { 00160 std::ostringstream myCoutStream; 00161 gtReadoutRecord->print(myCoutStream); 00162 LogTrace("L1GTEvmDigiToRaw") 00163 << "\n The following L1 GT EVM readout record will be packed.\n" 00164 << " Some boards could be disabled before packing," 00165 << " see detailed board packing.\n" 00166 << myCoutStream.str() << "\n" 00167 << std::endl; 00168 } 00169 00170 // get GTFE block 00171 L1GtfeExtWord gtfeBlock = gtReadoutRecord->gtfeWord(); 00172 00173 // get the number of Bx in the event for alternative 0 and alternative 1 00174 boost::uint16_t recordLength0 = gtfeBlock.recordLength(); 00175 boost::uint16_t recordLength1 = gtfeBlock.recordLength1(); 00176 00177 // length of BST record (in bytes) 00178 m_bstLengthBytes= static_cast<int> (gtfeBlock.bstLengthBytes()); 00179 00180 // get list of active blocks from the GTFE block 00181 // and mask some blocks, if required 00182 // blocks not active are not written to the record 00183 00184 boost::uint16_t activeBoardsGtInitial = gtfeBlock.activeBoards(); 00185 boost::uint16_t altNrBxBoardInitial = gtfeBlock.altNrBxBoard(); 00186 00187 // mask some boards, if needed 00188 00189 boost::uint16_t activeBoardsGt = activeBoardsGtInitial & m_activeBoardsMaskGt; 00190 00191 if (m_verbosity && m_isDebugEnabled) { 00192 LogDebug("L1GTEvmDigiToRaw") 00193 << "\nActive boards before masking(hex format): " << std::hex 00194 << std::setw(sizeof ( activeBoardsGtInitial ) * 2) << std::setfill('0') 00195 << activeBoardsGtInitial << std::dec << std::setfill(' ') 00196 << "\nActive boards after masking(hex format): " << std::hex 00197 << std::setw(sizeof ( activeBoardsGt ) * 2) << std::setfill('0') 00198 << activeBoardsGt << std::dec 00199 << std::setfill(' ') << " \n" 00200 << std::endl; 00201 } 00202 00203 // get the size of the record 00204 00205 unsigned int gtDataSize = 0; 00206 00207 unsigned int headerSize = 8; 00208 gtDataSize += headerSize; 00209 00210 for (CItBoardMaps 00211 itBoard = boardMaps.begin(); 00212 itBoard != boardMaps.end(); ++itBoard) { 00213 00214 if (itBoard->gtBoardType() == GTFE) { 00215 gtDataSize += gtfeBlock.getSize(); 00216 continue; 00217 } 00218 00219 00220 int iActiveBit = itBoard->gtBitEvmActiveBoards(); 00221 bool activeBoardToPack = false; 00222 00223 int altNrBxBoardVal = -1; 00224 00225 if (iActiveBit >= 0) { 00226 activeBoardToPack = activeBoardsGt & (1 << iActiveBit); 00227 00228 altNrBxBoardVal = (altNrBxBoardInitial & ( 1 << iActiveBit )) >> iActiveBit; 00229 00230 if (altNrBxBoardVal == 1) { 00231 m_totalBxInEvent = recordLength1; 00232 } else if (altNrBxBoardVal == 0) { 00233 m_totalBxInEvent = recordLength0; 00234 } else { 00235 if (m_verbosity) { 00236 edm::LogWarning("L1GTEvmDigiToRaw") 00237 << "\n\nWARNING: Wrong value altNrBxBoardVal = " << altNrBxBoardVal 00238 << " for board " << std::hex << ( itBoard->gtBoardId() ) << std::dec 00239 << "\n iActiveBit = " << iActiveBit 00240 << "\n altNrBxBoardInitial = 0x" << std::hex << altNrBxBoardInitial << std::dec 00241 << "\n activeBoardsGt = 0x" << std::hex << activeBoardsGt << std::dec 00242 << "\n activeBoardToPack = " << activeBoardToPack 00243 << "\n Set altNrBxBoardVal tentatively to " 00244 << recordLength0 << "\n Job may crash or produce wrong results!\n\n" 00245 << std::endl; 00246 } 00247 00248 m_totalBxInEvent = recordLength0; 00249 } 00250 } else { 00251 // board not in the ActiveBoards for the record 00252 continue; 00253 } 00254 00255 if (activeBoardToPack) { 00256 00257 switch (itBoard->gtBoardType()) { 00258 case GTFE: { 00259 // size already added; 00260 } 00261 00262 break; 00263 case FDL: { 00264 L1GtFdlWord fdlBlock; 00265 gtDataSize += m_totalBxInEvent*fdlBlock.getSize(); 00266 } 00267 00268 break; 00269 case TCS: { 00270 L1TcsWord tcsBlock; 00271 gtDataSize += tcsBlock.getSize(); 00272 } 00273 00274 break; 00275 case TIM: { 00276 // not considered 00277 } 00278 00279 break; 00280 default: { 00281 // do nothing, all blocks are given in GtBoardType enum 00282 } 00283 00284 break; 00285 } 00286 } 00287 00288 } 00289 00290 00291 unsigned int trailerSize = 8; 00292 gtDataSize += trailerSize; 00293 00294 // resize, GT raw data record has variable length, 00295 // depending on active boards (read in GTFE) 00296 gtRawData.resize(gtDataSize); 00297 00298 // ptrGt: pointer to the beginning of GT record in the raw data 00299 00300 unsigned char* ptrGt = gtRawData.data(); 00301 unsigned char* ptrGtBegin = gtRawData.data(); 00302 00303 if (m_verbosity && m_isDebugEnabled) { 00304 LogDebug("L1GTEvmDigiToRaw") << "\n Size of raw data: " << gtRawData.size() << "\n" 00305 << std::endl; 00306 } 00307 00308 // ------- pack boards ------- 00309 00310 // pack header 00311 packHeader(ptrGt, iEvent); 00312 ptrGt += headerSize; // advance with header size 00313 00314 // loop over other blocks in the raw record, if they are active 00315 00316 for (CItBoardMaps 00317 itBoard = gtRecordMap.begin(); 00318 itBoard != gtRecordMap.end(); ++itBoard) { 00319 00320 if (itBoard->gtBoardType() == GTFE) { 00321 00322 packGTFE(evSetup, ptrGt, gtfeBlock, activeBoardsGt); 00323 00324 if (m_verbosity && m_isDebugEnabled) { 00325 00326 std::ostringstream myCoutStream; 00327 gtfeBlock.print(myCoutStream); 00328 LogTrace("L1GTEvmDigiToRaw") 00329 << myCoutStream.str() << "\n" 00330 << std::endl; 00331 } 00332 00333 ptrGt += gtfeBlock.getSize(); // advance with GTFE block size 00334 00335 continue; 00336 } 00337 00338 00339 // pack modules other than GTFE if they are active 00340 00341 int iActiveBit = itBoard->gtBitEvmActiveBoards(); 00342 bool activeBoardToPack = false; 00343 00344 int altNrBxBoardVal = -1; 00345 00346 if (iActiveBit >= 0) { 00347 activeBoardToPack = activeBoardsGt & (1 << iActiveBit); 00348 00349 altNrBxBoardVal = (altNrBxBoardInitial & ( 1 << iActiveBit )) >> iActiveBit; 00350 00351 if (altNrBxBoardVal == 1) { 00352 m_totalBxInEvent = recordLength1; 00353 } else if (altNrBxBoardVal == 0) { 00354 m_totalBxInEvent = recordLength0; 00355 } else { 00356 if (m_verbosity) { 00357 edm::LogWarning("L1GTEvmDigiToRaw") 00358 << "\n\nWARNING: Wrong value altNrBxBoardVal = " << altNrBxBoardVal 00359 << " for board " << std::hex << ( itBoard->gtBoardId() ) << std::dec 00360 << "\n iActiveBit = " << iActiveBit 00361 << "\n altNrBxBoardInitial = 0x" << std::hex << altNrBxBoardInitial << std::dec 00362 << "\n activeBoardsGt = 0x" << std::hex << activeBoardsGt << std::dec 00363 << "\n activeBoardToPack = " << activeBoardToPack 00364 << "\n Set altNrBxBoardVal tentatively to " 00365 << recordLength0 << "\n Job may crash or produce wrong results!\n\n" 00366 << std::endl; 00367 } 00368 00369 m_totalBxInEvent = recordLength0; 00370 } 00371 00372 m_minBxInEvent = (m_totalBxInEvent + 1)/2 - m_totalBxInEvent; 00373 m_maxBxInEvent = (m_totalBxInEvent + 1)/2 - 1; 00374 00375 } else { 00376 // board not in the ActiveBoards for the record 00377 continue; 00378 } 00379 00380 if (activeBoardToPack) { 00381 00382 if (m_verbosity && m_isDebugEnabled) { 00383 LogDebug("L1GTEvmDigiToRaw") 00384 << "\nBoard " << std::hex << "0x" << ( itBoard->gtBoardId() ) << std::dec 00385 << "\n Number of bunch crosses in the record: " << m_totalBxInEvent 00386 << " = " << "[" << m_minBxInEvent << ", " << m_maxBxInEvent 00387 << "] BX\n" 00388 << std::endl; 00389 } 00390 00391 // active board, pack it 00392 switch (itBoard->gtBoardType()) { 00393 00394 case TCS: { 00395 00396 L1TcsWord tcsBlock = gtReadoutRecord->tcsWord(); 00397 packTCS(evSetup, ptrGt, tcsBlock); 00398 00399 if (m_verbosity && m_isDebugEnabled) { 00400 00401 std::ostringstream myCoutStream; 00402 tcsBlock.print(myCoutStream); 00403 LogTrace("L1GTEvmDigiToRaw") 00404 << myCoutStream.str() << "\n" 00405 << std::endl; 00406 } 00407 00408 ptrGt += tcsBlock.getSize(); // advance with TCS block size 00409 00410 } 00411 break; 00412 case FDL: { 00413 00414 for (int iBxInEvent = m_minBxInEvent; iBxInEvent <= m_maxBxInEvent; 00415 ++iBxInEvent) { 00416 00417 L1GtFdlWord fdlBlock = gtReadoutRecord->gtFdlWord(iBxInEvent); 00418 packFDL(evSetup, ptrGt, fdlBlock); 00419 00420 if (m_verbosity && m_isDebugEnabled) { 00421 00422 std::ostringstream myCoutStream; 00423 fdlBlock.print(myCoutStream); 00424 LogTrace("L1GTEvmDigiToRaw") 00425 << myCoutStream.str() << "\n" 00426 << std::endl; 00427 } 00428 00429 ptrGt += fdlBlock.getSize(); // advance with FDL block size 00430 } 00431 00432 } 00433 break; 00434 default: { 00435 00436 // do nothing, all blocks are given in GtBoardType enum 00437 break; 00438 } 00439 } 00440 00441 } 00442 } 00443 00444 // pack trailer 00445 packTrailer(ptrGt, ptrGtBegin, gtDataSize); 00446 00447 // put the raw data in the event 00448 00449 iEvent.put(allFedRawData); 00450 00451 00452 }
boost::uint16_t L1GTEvmDigiToRaw::m_activeBoardsMaskGt [private] |
mask for active boards
Definition at line 97 of file L1GTEvmDigiToRaw.h.
Referenced by L1GTEvmDigiToRaw(), and produce().
int L1GTEvmDigiToRaw::m_bstLengthBytes [private] |
length of BST record (in bytes)
Definition at line 111 of file L1GTEvmDigiToRaw.h.
Referenced by packGTFE(), and produce().
int L1GTEvmDigiToRaw::m_evmGtFedId [private] |
FED Id for GT EVM record default value defined in DataFormats/FEDRawData/src/FEDNumbering.cc.
Definition at line 91 of file L1GTEvmDigiToRaw.h.
Referenced by L1GTEvmDigiToRaw(), packHeader(), and produce().
input tag for GT EVM record
Definition at line 94 of file L1GTEvmDigiToRaw.h.
Referenced by L1GTEvmDigiToRaw(), and produce().
bool L1GTEvmDigiToRaw::m_isDebugEnabled [private] |
Definition at line 117 of file L1GTEvmDigiToRaw.h.
Referenced by packFDL(), packGTFE(), packHeader(), packTCS(), and produce().
int L1GTEvmDigiToRaw::m_maxBxInEvent [private] |
max Bx's in the event, computed after m_totalBxInEvent is obtained from GTFE block assume symmetrical number of BX around L1Accept
Definition at line 108 of file L1GTEvmDigiToRaw.h.
Referenced by produce().
int L1GTEvmDigiToRaw::m_minBxInEvent [private] |
min Bx's in the event, computed after m_totalBxInEvent is obtained from GTFE block assume symmetrical number of BX around L1Accept
Definition at line 104 of file L1GTEvmDigiToRaw.h.
Referenced by produce().
int L1GTEvmDigiToRaw::m_totalBxInEvent [private] |
total Bx's in the event, obtained from GTFE block
Definition at line 100 of file L1GTEvmDigiToRaw.h.
Referenced by produce().
int L1GTEvmDigiToRaw::m_verbosity [private] |
verbosity level
Definition at line 116 of file L1GTEvmDigiToRaw.h.
Referenced by packFDL(), packGTFE(), packHeader(), packTCS(), and produce().