CMS 3D CMS Logo

L1GTDigiToRaw Class Reference

Description: generate raw data from digis. More...

#include <EventFilter/L1GlobalTriggerRawToDigi/interface/L1GTDigiToRaw.h>

Inheritance diagram for L1GTDigiToRaw:

edm::EDProducer edm::ProducerBase edm::ProductRegistryHelper

List of all members.

Public Member Functions

 L1GTDigiToRaw (const edm::ParameterSet &)
 constructor(s)
virtual ~L1GTDigiToRaw ()
 destructor

Private Member Functions

virtual void beginJob (const edm::EventSetup &)
 beginning of job stuff
virtual void endJob ()
 end of job stuff
unsigned int flipPtQ (unsigned int)
void packFDL (const edm::EventSetup &, unsigned char *, L1GtFdlWord &)
 pack FDL blocks for various bunch crosses
unsigned int packGMT (L1MuGMTReadoutRecord const &, unsigned char *)
 pack a GMT record
unsigned int packGmtCollection (unsigned char *ptrGt, L1MuGMTReadoutCollection const *digis)
 pack the GMT collection using packGMT (GMT record packing)
void packGTFE (const edm::EventSetup &, unsigned char *, L1GtfeWord &, 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 DAQ record
void packHeader (unsigned char *, edm::Event &)
 block packers -------------
void packPSB (const edm::EventSetup &, unsigned char *, L1GtPsbWord &)
 pack PSB blocks packing is done in PSB class format
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_daqGtFedId
 FED Id for GT DAQ record default value defined in DataFormats/FEDRawData/src/FEDNumbering.cc.
edm::InputTag m_daqGtInputTag
 input tag for GT DAQ 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
edm::InputTag m_muGmtInputTag
 input tag for GMT record
int m_totalBxInEvent
 total Bx's in the event, obtained from GTFE block
int m_verbosity
 verbosity level


Detailed Description

Description: generate raw data from digis.

Implementation: <TODO: enter implementation details>

Author:
: Vasile Mihai Ghete - HEPHY Vienna - GT

: Ivan Mikulec - HEPHY Vienna - GMT

$Date$ $Revision$

Definition at line 46 of file L1GTDigiToRaw.h.


Constructor & Destructor Documentation

L1GTDigiToRaw::L1GTDigiToRaw ( const edm::ParameterSet pSet  )  [explicit]

constructor(s)

Definition at line 62 of file L1GTDigiToRaw.cc.

References lat::endl(), LogDebug, m_activeBoardsMaskGt, m_daqGtFedId, m_daqGtInputTag, m_isDebugEnabled, m_muGmtInputTag, and m_verbosity.

00062                                                         :
00063 
00064     m_daqGtFedId(pSet.getUntrackedParameter<int> (
00065             "DaqGtFedId", FEDNumbering::getTriggerGTPFEDIds().second)),
00066     m_daqGtInputTag(pSet.getParameter<edm::InputTag> ("DaqGtInputTag")),
00067     m_muGmtInputTag(pSet.getParameter<edm::InputTag> ("MuGmtInputTag")),
00068     m_activeBoardsMaskGt(pSet.getParameter<unsigned int> ("ActiveBoardsMask")),
00069     m_totalBxInEvent(0),
00070     m_minBxInEvent(0), m_maxBxInEvent(),
00071     m_verbosity(pSet.getUntrackedParameter<int> ("Verbosity", 0)),
00072     m_isDebugEnabled(edm::isDebugEnabled())
00073 
00074 {
00075 
00076     if (m_verbosity && m_isDebugEnabled) {
00077         LogDebug("L1GTDigiToRaw")
00078                 << "\nFED Id for DAQ GT record: " << m_daqGtFedId << " \n"
00079                 << "\nInput tag for DAQ GT record: " << m_daqGtInputTag << " \n"
00080                 << "\nInput tag for GMT record: " << m_muGmtInputTag << " \n"
00081                 << "\nMask for active boards (hex format): " << std::hex
00082                 << std::setw(sizeof(m_activeBoardsMaskGt) * 2) << std::setfill('0')
00083                 << m_activeBoardsMaskGt
00084                 << std::dec << std::setfill(' ') << " \n"
00085                 << std::endl;
00086     }
00087 
00088     //
00089     produces<FEDRawDataCollection> ();
00090 
00091 }

L1GTDigiToRaw::~L1GTDigiToRaw (  )  [virtual]

destructor

Definition at line 94 of file L1GTDigiToRaw.cc.

00095 {
00096 
00097     // empty now
00098 
00099 }


Member Function Documentation

void L1GTDigiToRaw::beginJob ( const edm::EventSetup evSetup  )  [private, virtual]

beginning of job stuff

Reimplemented from edm::EDProducer.

Definition at line 104 of file L1GTDigiToRaw.cc.

00105 {
00106 
00107     // empty now
00108 
00109 }

void L1GTDigiToRaw::endJob ( void   )  [private, virtual]

end of job stuff

Reimplemented from edm::EDProducer.

Definition at line 887 of file L1GTDigiToRaw.cc.

00888 {
00889 
00890     // empty now
00891 }

unsigned int L1GTDigiToRaw::flipPtQ ( unsigned int  w  )  [private]

Definition at line 853 of file L1GTDigiToRaw.cc.

00854 {
00855     return ( (w&0xffff00ff) | ((~w)&0x0000ff00) );
00856 }

void L1GTDigiToRaw::packFDL ( const edm::EventSetup evSetup,
unsigned char *  ptrGt,
L1GtFdlWord fdlBlock 
) [private]

pack FDL blocks for various bunch crosses

Definition at line 612 of file L1GTDigiToRaw.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().

00613                                                                                    {
00614 
00615     if (m_verbosity && m_isDebugEnabled) {
00616 
00617         LogDebug("L1GTDigiToRaw") << "\nPacking FDL \n" << std::endl;
00618     }
00619 
00620     int uLength = L1GlobalTriggerReadoutSetup::UnitLength;
00621 
00622     // initialize the required number of word64
00623     int nrWord64 = fdlBlock.getSize() / uLength;
00624     std::vector<boost::uint64_t> tmpWord64;
00625     tmpWord64.resize(nrWord64);
00626 
00627     for (int iWord = 0; iWord < nrWord64; ++iWord) {
00628         tmpWord64[iWord] = 0x0000000000000000ULL;
00629     }
00630 
00631     // fill the values in the words
00632     for (int iWord = 0; iWord < nrWord64; ++iWord) {
00633 
00634         fdlBlock.setBoardIdWord64(tmpWord64[iWord], iWord);
00635         fdlBlock.setBxInEventWord64(tmpWord64[iWord], iWord);
00636         fdlBlock.setBxNrWord64(tmpWord64[iWord], iWord);
00637         fdlBlock.setEventNrWord64(tmpWord64[iWord], iWord);
00638 
00639         fdlBlock.setGtTechnicalTriggerWordWord64(tmpWord64[iWord], iWord);
00640 
00641         fdlBlock.setGtDecisionWordAWord64(tmpWord64[iWord], iWord);
00642         fdlBlock.setGtDecisionWordBWord64(tmpWord64[iWord], iWord);
00643 
00644         fdlBlock.setGtDecisionWordExtendedWord64(tmpWord64[iWord], iWord);
00645 
00646         fdlBlock.setPhysicsDeclaredWord64(tmpWord64[iWord], iWord);
00647         fdlBlock.setGtPrescaleFactorIndexTechWord64(tmpWord64[iWord], iWord);
00648         fdlBlock.setGtPrescaleFactorIndexAlgoWord64(tmpWord64[iWord], iWord);
00649         fdlBlock.setNoAlgoWord64(tmpWord64[iWord], iWord);
00650         fdlBlock.setFinalORWord64(tmpWord64[iWord], iWord);
00651 
00652         fdlBlock.setOrbitNrWord64(tmpWord64[iWord], iWord);
00653         fdlBlock.setLumiSegmentNrWord64(tmpWord64[iWord], iWord);
00654         fdlBlock.setLocalBxNrWord64(tmpWord64[iWord], iWord);
00655 
00656     }
00657 
00658     // put the words in the FED record
00659 
00660     boost::uint64_t* pw = reinterpret_cast<boost::uint64_t*> (const_cast<unsigned char*> (ptrGt));
00661 
00662     for (int iWord = 0; iWord < nrWord64; ++iWord) {
00663 
00664         *pw++ = tmpWord64[iWord];
00665 
00666         if (m_verbosity && m_isDebugEnabled) {
00667 
00668             LogTrace("L1GTDigiToRaw")
00669                     << std::setw(4) << iWord << "  "
00670                     << std::hex << std::setfill('0') << std::setw(16) << tmpWord64[iWord] << std::dec
00671                     << std::setfill(' ')
00672                     << std::endl;
00673         }
00674     }
00675 
00676 }

unsigned L1GTDigiToRaw::packGMT ( L1MuGMTReadoutRecord const &  gmtrr,
unsigned char *  chp 
) [private]

pack a GMT record

Definition at line 757 of file L1GTDigiToRaw.cc.

References L1MuGMTReadoutRecord::getBCERR(), L1MuGMTReadoutRecord::getBrlRPCCands(), L1MuGMTReadoutRecord::getBxInEvent(), L1MuGMTReadoutRecord::getBxNr(), L1MuGMTReadoutRecord::getCSCCands(), L1MuGMTReadoutRecord::getDTBXCands(), L1MuGMTReadoutRecord::getEvNr(), L1MuGMTReadoutRecord::getFwdRPCCands(), L1MuGMTReadoutRecord::getGMTBrlCands(), L1MuGMTReadoutRecord::getGMTCands(), L1MuGMTReadoutRecord::getGMTFwdCands(), i, p, and w.

Referenced by packGmtCollection().

00758 {
00759 
00760     const unsigned SIZE=136;
00761     const unsigned boardId=0xdd12;
00762     memset(chp,0,SIZE);
00763 
00764     unsigned* p = (unsigned*) chp;
00765 
00766     // event number + bcerr
00767     *p++ = (gmtrr.getEvNr()&0xffffff) | ((gmtrr.getBCERR()&0xff)<<24);
00768     // bx number, bx in event, length(?), board-id(?)
00769     *p++ = (gmtrr.getBxNr()&0xfff) | ((gmtrr.getBxInEvent()&0xf)<<12) | (boardId<<16);
00770 
00771     std::vector<L1MuRegionalCand> vrc;
00772     std::vector<L1MuRegionalCand>::const_iterator irc;
00773     unsigned* pp = p;
00774 
00775     vrc = gmtrr.getDTBXCands();
00776     pp = p;
00777     for(irc=vrc.begin(); irc!=vrc.end(); irc++) {
00778         *pp++ = (*irc).getDataWord();
00779     }
00780     p+=4;
00781 
00782     vrc = gmtrr.getBrlRPCCands();
00783     pp = p;
00784     for(irc=vrc.begin(); irc!=vrc.end(); irc++) {
00785         *pp++ = (*irc).getDataWord();
00786     }
00787     p+=4;
00788 
00789     vrc = gmtrr.getCSCCands();
00790     pp = p;
00791     for(irc=vrc.begin(); irc!=vrc.end(); irc++) {
00792         *pp++ = (*irc).getDataWord();
00793     }
00794     p+=4;
00795 
00796     vrc = gmtrr.getFwdRPCCands();
00797     pp = p;
00798     for(irc=vrc.begin(); irc!=vrc.end(); irc++) {
00799         *pp++ = (*irc).getDataWord();
00800     }
00801     p+=4;
00802 
00803     // the regional candidates are written to the record with inverted Pt and qual bits
00804     pp = p-16;
00805     for(int i=0; i<16; i++) {
00806         unsigned w = *pp;
00807         *pp++ = (w&0xffff00ff) | ((~w)&0x0000ff00);
00808     }
00809 
00810     std::vector<L1MuGMTExtendedCand> vgc;
00811     std::vector<L1MuGMTExtendedCand>::const_iterator igc;
00812 
00813     vgc = gmtrr.getGMTBrlCands();
00814     pp = p;
00815     for(igc=vgc.begin(); igc!=vgc.end(); igc++) {
00816         *pp++ = (*igc).getDataWord();
00817     }
00818     p+=4;
00819 
00820     vgc = gmtrr.getGMTFwdCands();
00821     pp = p;
00822     for(igc=vgc.begin(); igc!=vgc.end(); igc++) {
00823         *pp++ = (*igc).getDataWord();
00824     }
00825     p+=4;
00826 
00827     vgc = gmtrr.getGMTCands();
00828     pp = p;
00829     for(igc=vgc.begin(); igc!=vgc.end(); igc++) {
00830         *pp++ = (*igc).getDataWord();
00831     }
00832     p+=4;
00833 
00834     unsigned char* chpp;
00835 
00836     vgc = gmtrr.getGMTBrlCands();
00837     chpp = (unsigned char*) p;
00838     for(igc=vgc.begin(); igc!=vgc.end(); igc++) {
00839         *chpp++ = (*igc).rank();
00840     }
00841     p++;
00842 
00843     vgc = gmtrr.getGMTFwdCands();
00844     chpp = (unsigned char*) p;
00845     for(igc=vgc.begin(); igc!=vgc.end(); igc++) {
00846         *chpp++ = (*igc).rank();
00847     }
00848     p++;
00849 
00850     return SIZE;
00851 }

unsigned int L1GTDigiToRaw::packGmtCollection ( unsigned char *  ptrGt,
L1MuGMTReadoutCollection const *  digis 
) [private]

pack the GMT collection using packGMT (GMT record packing)

Definition at line 733 of file L1GTDigiToRaw.cc.

References lat::endl(), L1MuGMTReadoutCollection::getRecord(), LogDebug, m_isDebugEnabled, m_maxBxInEvent, m_minBxInEvent, m_totalBxInEvent, m_verbosity, and packGMT().

Referenced by produce().

00736 {
00737 
00738     if (m_verbosity && m_isDebugEnabled) {
00739         LogDebug("L1GTDigiToRaw") << "\nPacking GMT collection \n" << std::endl;
00740     }
00741 
00742     unsigned gmtsize = 0;
00743 
00744     // loop range: int m_totalBxInEvent is normally even (L1A-1, L1A, L1A+1, with L1A = 0)
00745     for (int iBxInEvent = m_minBxInEvent; iBxInEvent <= m_maxBxInEvent;
00746             ++iBxInEvent) {
00747         L1MuGMTReadoutRecord const& gmtrr = digis->getRecord(iBxInEvent);
00748         gmtsize = packGMT(gmtrr, ptrGt);
00749         ptrGt += gmtsize;
00750     }
00751 
00752     return m_totalBxInEvent*gmtsize;
00753 
00754 }

void L1GTDigiToRaw::packGTFE ( const edm::EventSetup evSetup,
unsigned char *  ptrGt,
L1GtfeWord 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 DAQ record

Definition at line 558 of file L1GTDigiToRaw.cc.

References lat::endl(), L1GtfeWord::getSize(), LogDebug, LogTrace, m_isDebugEnabled, m_verbosity, L1GtfeWord::setActiveBoardsWord64(), L1GtfeWord::setAltNrBxBoardWord64(), L1GtfeWord::setBoardIdWord64(), L1GtfeWord::setBxNrWord64(), L1GtfeWord::setRecordLength1Word64(), L1GtfeWord::setRecordLengthWord64(), L1GtfeWord::setSetupVersionWord64(), L1GtfeWord::setTotalTriggerNrWord64(), and L1GlobalTriggerReadoutSetup::UnitLength.

Referenced by produce().

00560                                            {
00561 
00562     if (m_verbosity && m_isDebugEnabled) {
00563         LogDebug("L1GTDigiToRaw") << "\nPacking GTFE \n" << std::endl;
00564     }
00565 
00566     int uLength = L1GlobalTriggerReadoutSetup::UnitLength;
00567 
00568     // initialize the required number of word64
00569     int nrWord64 = gtfeBlock.getSize() / uLength;
00570     std::vector<boost::uint64_t> tmpWord64;
00571     tmpWord64.resize(nrWord64);
00572 
00573     for (int iWord = 0; iWord < nrWord64; ++iWord) {
00574         tmpWord64[iWord] = 0x0000000000000000ULL;
00575     }
00576 
00577     // fill the values in the words
00578     for (int iWord = 0; iWord < nrWord64; ++iWord) {
00579 
00580         gtfeBlock.setBoardIdWord64(tmpWord64[iWord], iWord);
00581         gtfeBlock.setRecordLength1Word64(tmpWord64[iWord], iWord);
00582         gtfeBlock.setRecordLengthWord64(tmpWord64[iWord], iWord);
00583         gtfeBlock.setBxNrWord64(tmpWord64[iWord], iWord);
00584         gtfeBlock.setSetupVersionWord64(tmpWord64[iWord], iWord);
00585         gtfeBlock.setActiveBoardsWord64(tmpWord64[iWord], iWord, activeBoardsGtValue);
00586         gtfeBlock.setAltNrBxBoardWord64(tmpWord64[iWord], iWord);
00587         gtfeBlock.setTotalTriggerNrWord64(tmpWord64[iWord], iWord);
00588 
00589     }
00590 
00591     // put the words in the FED record
00592 
00593     boost::uint64_t* pw = reinterpret_cast<boost::uint64_t*> (const_cast<unsigned char*> (ptrGt));
00594 
00595     for (int iWord = 0; iWord < nrWord64; ++iWord) {
00596 
00597         *pw++ = tmpWord64[iWord];
00598 
00599         if (m_verbosity && m_isDebugEnabled) {
00600             LogTrace("L1GTDigiToRaw")
00601                     << std::setw(4) << iWord << "  "
00602                     << std::hex << std::setfill('0') << std::setw(16) << tmpWord64[iWord] << std::dec
00603                     << std::setfill(' ')
00604                     << std::endl;
00605         }
00606     }
00607 
00608 }

void L1GTDigiToRaw::packHeader ( unsigned char *  ptrGt,
edm::Event iEvent 
) [private]

block packers -------------

pack header

Definition at line 516 of file L1GTDigiToRaw.cc.

References edm::Event::bunchCrossing(), lat::endl(), edm::Event::id(), LogDebug, m_daqGtFedId, m_isDebugEnabled, m_verbosity, and FEDHeader::set().

Referenced by produce().

00516                                                                      {
00517     // TODO FIXME where from to get all numbers?
00518 
00519     // Event Trigger type identifier
00520     int triggerTypeVal = 0;
00521 
00522     // Level-1 event number generated by the TTC system
00523     int lvl1IdVal = iEvent.id().event();
00524 
00525     // The bunch crossing number
00526     int bxCross = iEvent.bunchCrossing();
00527     boost::uint16_t bxCrossHw = 0;
00528     if ( ( bxCross & 0xFFF ) == bxCross) {
00529         bxCrossHw = static_cast<boost::uint16_t> (bxCross);
00530     } else {
00531         bxCrossHw = 0; // Bx number too large, set to 0!
00532         if (m_verbosity && m_isDebugEnabled) {
00533             LogDebug("L1GTDigiToRaw") << "\nBunch cross number [hex] = " << std::hex << bxCross
00534                     << "\n  larger than 12 bits. Set to 0! \n" << std::dec << std::endl;
00535         }
00536     }
00537     int bxIdVal = bxCrossHw;
00538 
00539     // Identifier of the FED
00540     int sourceIdVal = m_daqGtFedId;
00541 
00542     // Version identifier of the FED data format
00543     int versionVal = 0;
00544 
00545     // 0 -> the current header word is the last one.
00546     // 1-> other header words can follow
00547     // (always 1 for ECAL)
00548     bool moreHeadersVal = false;
00549 
00550     FEDHeader gtFEDHeader(ptrGt);
00551 
00552     gtFEDHeader.set(
00553             ptrGt, triggerTypeVal, lvl1IdVal, bxIdVal, sourceIdVal, versionVal, moreHeadersVal);
00554 
00555 }

void L1GTDigiToRaw::packPSB ( const edm::EventSetup evSetup,
unsigned char *  ptrGt,
L1GtPsbWord psbBlock 
) [private]

pack PSB blocks packing is done in PSB class format

Definition at line 679 of file L1GTDigiToRaw.cc.

References lat::endl(), L1GtPsbWord::getSize(), LogDebug, LogTrace, m_isDebugEnabled, m_verbosity, L1GtPsbWord::setADataWord64(), L1GtPsbWord::setBDataWord64(), L1GtPsbWord::setBoardIdWord64(), L1GtPsbWord::setBxInEventWord64(), L1GtPsbWord::setBxNrWord64(), L1GtPsbWord::setEventNrWord64(), L1GtPsbWord::setLocalBxNrWord64(), and L1GlobalTriggerReadoutSetup::UnitLength.

Referenced by produce().

00680                                                                                    {
00681     if (m_verbosity && m_isDebugEnabled) {
00682 
00683         LogDebug("L1GTDigiToRaw") << "\nPacking PSB \n" << std::endl;
00684     }
00685 
00686     int uLength = L1GlobalTriggerReadoutSetup::UnitLength;
00687 
00688     // initialize the required number of word64
00689     int nrWord64 = psbBlock.getSize() / uLength;
00690     std::vector<boost::uint64_t> tmpWord64;
00691     tmpWord64.resize(nrWord64);
00692 
00693     for (int iWord = 0; iWord < nrWord64; ++iWord) {
00694         tmpWord64[iWord] = 0x0000000000000000ULL;
00695     }
00696 
00697     // fill the values in the words
00698     for (int iWord = 0; iWord < nrWord64; ++iWord) {
00699 
00700         psbBlock.setBoardIdWord64(tmpWord64[iWord], iWord);
00701         psbBlock.setBxInEventWord64(tmpWord64[iWord], iWord);
00702         psbBlock.setBxNrWord64(tmpWord64[iWord], iWord);
00703         psbBlock.setEventNrWord64(tmpWord64[iWord], iWord);
00704 
00705         psbBlock.setADataWord64(tmpWord64[iWord], iWord);
00706         psbBlock.setBDataWord64(tmpWord64[iWord], iWord);
00707 
00708         psbBlock.setLocalBxNrWord64(tmpWord64[iWord], iWord);
00709 
00710     }
00711 
00712     // put the words in the FED record
00713 
00714     boost::uint64_t* pw = reinterpret_cast<boost::uint64_t*> (const_cast<unsigned char*> (ptrGt));
00715 
00716     for (int iWord = 0; iWord < nrWord64; ++iWord) {
00717 
00718         *pw++ = tmpWord64[iWord];
00719 
00720         if (m_verbosity && m_isDebugEnabled) {
00721 
00722             LogTrace("L1GTDigiToRaw")
00723                     << std::setw(4) << iWord << "  "
00724                     << std::hex << std::setfill('0') << std::setw(16) << tmpWord64[iWord] << std::dec
00725                     << std::setfill(' ')
00726                     << std::endl;
00727         }
00728     }
00729 
00730 }

void L1GTDigiToRaw::packTrailer ( unsigned char *  ptrGt,
unsigned char *  ptrGtBegin,
int  dataSize 
) [private]

pack trailer word

Definition at line 859 of file L1GTDigiToRaw.cc.

References evf::compute_crc(), and FEDTrailer::set().

Referenced by produce().

00859                                                                                              {
00860 
00861     // TODO FIXME where from to get all numbers?
00862 
00863     // The length of the event fragment counted in 64-bit words including header and trailer
00864     int lengthVal = dataSize / 8;
00865 
00866     // Cyclic Redundancy Code of the event fragment including header and trailer
00867     int crcVal = evf::compute_crc(ptrGtBegin, dataSize);
00868 
00869     // Event fragment status information
00870     int evtStatusVal = 0;
00871 
00872     // Current value of the Trigger Throttling System bits.
00873     int ttsBitsVal = 0;
00874 
00875     // 0 -> the current trailer word is the last one.
00876     // 1-> other trailer words can follow
00877     // (always 0 for ECAL)
00878     bool moreTrailersVal = false;
00879 
00880     FEDTrailer gtFEDTrailer(ptrGt);
00881     gtFEDTrailer.set(ptrGt, lengthVal, crcVal, evtStatusVal, ttsBitsVal, moreTrailersVal);
00882 
00883 }

void L1GTDigiToRaw::produce ( edm::Event iEvent,
const edm::EventSetup evSetup 
) [private, virtual]

loop over events

Implements edm::EDProducer.

Definition at line 113 of file L1GTDigiToRaw.cc.

References L1GtfeWord::activeBoards(), L1GtfeWord::altNrBxBoard(), FEDRawData::data(), lat::endl(), FDL, edm::EventSetup::get(), edm::Event::getByLabel(), L1GtPsbWord::getSize(), L1TcsWord::getSize(), L1GtfeWord::getSize(), L1GtFdlWord::getSize(), GMT, GTFE, edm::Handle< T >::isValid(), LogDebug, LogTrace, m_activeBoardsMaskGt, m_daqGtFedId, m_daqGtInputTag, m_isDebugEnabled, m_maxBxInEvent, m_minBxInEvent, m_muGmtInputTag, m_totalBxInEvent, m_verbosity, packFDL(), packGmtCollection(), packGTFE(), packHeader(), packPSB(), packTrailer(), L1GtFdlWord::print(), L1GtfeWord::print(), L1GtPsbWord::print(), edm::Handle< T >::product(), PSB, edm::Event::put(), L1GtfeWord::recordLength(), L1GtfeWord::recordLength1(), FEDRawData::resize(), FEDRawData::size(), TCS, and TIM.

00114 {
00115 
00116     // define new FEDRawDataCollection
00117     // it contains ALL FEDs in an event
00118     std::auto_ptr<FEDRawDataCollection> allFedRawData(new FEDRawDataCollection);
00119 
00120     FEDRawData& gtRawData = allFedRawData->FEDData(m_daqGtFedId);
00121 
00122     // get records from EventSetup
00123 
00124     //  board maps
00125     edm::ESHandle< L1GtBoardMaps > l1GtBM;
00126     evSetup.get< L1GtBoardMapsRcd >().get( l1GtBM );
00127 
00128     const std::vector<L1GtBoard> boardMaps = l1GtBM->gtBoardMaps();
00129     int boardMapsSize = boardMaps.size();
00130 
00131     typedef std::vector<L1GtBoard>::const_iterator CItBoardMaps;
00132 
00133     // create an ordered vector for the GT DAQ record
00134     // header (pos 0 in record) and trailer (last position in record)
00135     // not included, as they are not in board list
00136     std::vector<L1GtBoard> gtRecordMap;
00137     gtRecordMap.reserve(boardMapsSize);
00138 
00139     for (int iPos = 0; iPos < boardMapsSize; ++iPos) {
00140         for (CItBoardMaps itBoard = boardMaps.begin(); itBoard
00141                 != boardMaps.end(); ++itBoard) {
00142 
00143             if (itBoard->gtPositionDaqRecord() == iPos) {
00144                 gtRecordMap.push_back(*itBoard);
00145                 break;
00146             }
00147 
00148         }
00149     }
00150 
00151 
00152     // get L1GlobalTriggerReadoutRecord
00153     edm::Handle<L1GlobalTriggerReadoutRecord> gtReadoutRecord;
00154     iEvent.getByLabel(m_daqGtInputTag, gtReadoutRecord);
00155 
00156     if (!gtReadoutRecord.isValid()) {
00157         if (m_verbosity) {
00158             edm::LogWarning("L1GTDigiToRaw")
00159                     << "\nWarning: L1GlobalTriggerReadoutRecord with input tag " << m_daqGtInputTag
00160                     << "\nrequested in configuration, but not found in the event."
00161                     << "\nQuit packing this event" << std::endl;
00162         }
00163 
00164         // put the raw data in the event
00165         iEvent.put(allFedRawData);
00166 
00167         return;
00168     }
00169 
00170     if (m_verbosity && m_isDebugEnabled) {
00171         std::ostringstream myCoutStream;
00172         gtReadoutRecord->print(myCoutStream);
00173         LogTrace("L1GTDigiToRaw")
00174                 << "\n The following L1 GT DAQ readout record will be packed.\n"
00175                 << " Some boards could be disabled before packing,"
00176                 << " see detailed board packing.\n" << myCoutStream.str() << "\n"
00177                 << std::endl;
00178     }
00179 
00180     // get GTFE block
00181     L1GtfeWord gtfeBlock = gtReadoutRecord->gtfeWord();
00182 
00183     // get the number of Bx in the event for alternative 0 and alternative 1
00184     boost::uint16_t recordLength0 = gtfeBlock.recordLength();
00185     boost::uint16_t recordLength1 = gtfeBlock.recordLength1();
00186 
00187 
00188     // get list of active boards from the GTFE payload
00189     // and mask some boards, if required
00190     // boards not active are not written to the record
00191 
00192     boost::uint16_t activeBoardsGtInitial = gtfeBlock.activeBoards();
00193     boost::uint16_t altNrBxBoardInitial = gtfeBlock.altNrBxBoard();
00194 
00195     // mask some boards, if needed
00196 
00197     boost::uint16_t activeBoardsGt = activeBoardsGtInitial & m_activeBoardsMaskGt;
00198 
00199     if (m_verbosity && m_isDebugEnabled) {
00200         LogDebug("L1GTDigiToRaw")
00201                 << "\nActive boards before masking(hex format): " << std::hex
00202                 << std::setw(sizeof ( activeBoardsGtInitial ) * 2) << std::setfill('0')
00203                 << activeBoardsGtInitial << std::dec << std::setfill(' ')
00204                 << "Active boards after masking(hex format):  " << std::hex
00205                 << std::setw(sizeof ( activeBoardsGt ) * 2) << std::setfill('0') << activeBoardsGt
00206                 << std::dec << std::setfill(' ') << " \n"
00207                 << std::endl;
00208     }
00209 
00210     // get the size of the record
00211 
00212     unsigned int gtDataSize = 0;
00213 
00214     unsigned int headerSize = 8;
00215     gtDataSize += headerSize;
00216 
00217     for (CItBoardMaps
00218             itBoard = boardMaps.begin();
00219             itBoard != boardMaps.end(); ++itBoard) {
00220 
00221         if (itBoard->gtBoardType() == GTFE) {
00222             gtDataSize += gtfeBlock.getSize();
00223             continue;
00224         }
00225 
00226 
00227         int iActiveBit = itBoard->gtBitDaqActiveBoards();
00228         bool activeBoardToPack = false;
00229 
00230         int altNrBxBoardVal = -1;
00231 
00232         if (iActiveBit >= 0) {
00233             activeBoardToPack = activeBoardsGt & (1 << iActiveBit);
00234 
00235             altNrBxBoardVal = (altNrBxBoardInitial & ( 1 << iActiveBit )) >> iActiveBit;
00236 
00237             if (altNrBxBoardVal == 1) {
00238                 m_totalBxInEvent = recordLength1;
00239             } else if (altNrBxBoardVal == 0) {
00240                 m_totalBxInEvent = recordLength0;
00241             } else {
00242                 if (m_verbosity) {
00243                     edm::LogWarning("L1GTDigiToRaw")
00244                     << "\n\nWARNING: Wrong value altNrBxBoardVal = " << altNrBxBoardVal
00245                     << " for board " << std::hex << ( itBoard->gtBoardId() ) << std::dec
00246                     << "\n  iActiveBit =            " << iActiveBit
00247                     << "\n  altNrBxBoardInitial = 0x" << std::hex << altNrBxBoardInitial <<  std::dec
00248                     << "\n  activeBoardsGt =      0x" << std::hex << activeBoardsGt <<  std::dec
00249                     << "\n  activeBoardToPack =   " << activeBoardToPack
00250                     << "\n Set altNrBxBoardVal tentatively to "
00251                     << recordLength0 << "\n Job may crash or produce wrong results!\n\n"
00252                     << std::endl;
00253                 }
00254 
00255                 m_totalBxInEvent = recordLength0;
00256             }
00257 
00258 
00259         } else {
00260             // board not in the ActiveBoards for the record
00261             continue;
00262         }
00263 
00264         if (activeBoardToPack) {
00265 
00266             switch (itBoard->gtBoardType()) {
00267                 case GTFE: {
00268                         // size already added;
00269                     }
00270 
00271                     break;
00272                 case FDL: {
00273                         L1GtFdlWord fdlBlock;
00274                         gtDataSize += m_totalBxInEvent*fdlBlock.getSize();
00275                     }
00276 
00277                     break;
00278                 case PSB: {
00279                         L1GtPsbWord psbBlock;
00280                         gtDataSize += m_totalBxInEvent*psbBlock.getSize();
00281                     }
00282 
00283                     break;
00284                 case GMT: {
00285                         // 17*64/8 TODO FIXME ask Ivan for a getSize() function for GMT record
00286                         unsigned int gmtRecordSize = 136;
00287                         unsigned int gmtCollSize = m_totalBxInEvent*gmtRecordSize;
00288                         gtDataSize += gmtCollSize;
00289                     }
00290 
00291                     break;
00292                 case TCS: {
00293                         L1TcsWord tcsBlock;
00294                         gtDataSize += tcsBlock.getSize();
00295                     }
00296 
00297                     break;
00298                 case TIM: {
00299                         // not considered
00300                     }
00301 
00302                     break;
00303                 default: {
00304                         // do nothing, all blocks are given in GtBoardType enum
00305                     }
00306 
00307                     break;
00308             }
00309         }
00310 
00311     }
00312 
00313 
00314     unsigned int trailerSize = 8;
00315     gtDataSize += trailerSize;
00316 
00317 
00318     // resize, GT raw data record has variable length,
00319     // depending on active boards (read in GTFE)
00320     gtRawData.resize(gtDataSize);
00321 
00322 
00323     // ptrGt: pointer to the beginning of GT record in the raw data
00324 
00325     unsigned char* ptrGt = gtRawData.data();
00326     unsigned char* ptrGtBegin = gtRawData.data();
00327 
00328     if (m_verbosity && m_isDebugEnabled) {
00329         LogDebug("L1GTDigiToRaw") << "\n Size of raw data: " << gtRawData.size() << "\n"
00330                 << std::endl;
00331     }
00332 
00333     // ------- pack boards -------
00334 
00335     // pack header
00336     packHeader(ptrGt, iEvent);
00337     ptrGt += headerSize; // advance with header size
00338 
00339     // loop over other blocks in the raw record, if they are active
00340 
00341     for (CItBoardMaps
00342             itBoard = gtRecordMap.begin();
00343             itBoard != gtRecordMap.end(); ++itBoard) {
00344 
00345         if (itBoard->gtBoardType() == GTFE) {
00346 
00347             packGTFE(evSetup, ptrGt, gtfeBlock, activeBoardsGt);
00348 
00349             if (m_verbosity && m_isDebugEnabled) {
00350 
00351                 std::ostringstream myCoutStream;
00352                 gtfeBlock.print(myCoutStream);
00353                 LogTrace("L1GTDigiToRaw") << myCoutStream.str() << "\n" << std::endl;
00354             }
00355 
00356             ptrGt += gtfeBlock.getSize(); // advance with GTFE block size
00357 
00358             continue;
00359         }
00360 
00361 
00362         // pack modules other than GTFE if they are active
00363 
00364         int iActiveBit = itBoard->gtBitDaqActiveBoards();
00365         bool activeBoardToPack = false;
00366 
00367         int altNrBxBoardVal = -1;
00368 
00369         if (iActiveBit >= 0) {
00370             activeBoardToPack = activeBoardsGt & (1 << iActiveBit);
00371 
00372             altNrBxBoardVal = (altNrBxBoardInitial & ( 1 << iActiveBit )) >> iActiveBit;
00373 
00374             if (altNrBxBoardVal == 1) {
00375                 m_totalBxInEvent = recordLength1;
00376             } else if (altNrBxBoardVal == 0) {
00377                 m_totalBxInEvent = recordLength0;
00378             } else {
00379                 if (m_verbosity) {
00380                     edm::LogWarning("L1GTDigiToRaw")
00381                     << "\n\nWARNING: Wrong value altNrBxBoardVal = " << altNrBxBoardVal
00382                     << " for board " << std::hex << ( itBoard->gtBoardId() ) << std::dec
00383                     << "\n  iActiveBit =            " << iActiveBit
00384                     << "\n  altNrBxBoardInitial = 0x" << std::hex << altNrBxBoardInitial <<  std::dec
00385                     << "\n  activeBoardsGt =      0x" << std::hex << activeBoardsGt <<  std::dec
00386                     << "\n  activeBoardToPack =   " << activeBoardToPack
00387                     << "\n Set altNrBxBoardVal tentatively to "
00388                     << recordLength0 << "\n Job may crash or produce wrong results!\n\n"
00389                     << std::endl;
00390                 }
00391 
00392                 m_totalBxInEvent = recordLength0;
00393             }
00394 
00395             m_minBxInEvent = (m_totalBxInEvent + 1)/2 - m_totalBxInEvent;
00396             m_maxBxInEvent = (m_totalBxInEvent + 1)/2 - 1;
00397 
00398 
00399         } else {
00400             // board not in the ActiveBoards for the record
00401             continue;
00402         }
00403 
00404         if (activeBoardToPack) {
00405 
00406             if (m_verbosity && m_isDebugEnabled) {
00407                 LogDebug("L1GTDigiToRaw")
00408                         << "\nBoard " << std::hex << "0x" << ( itBoard->gtBoardId() ) << std::dec
00409                         << "\n  Number of bunch crosses in the record: " << m_totalBxInEvent
00410                         << " = " << "[" << m_minBxInEvent << ", " << m_maxBxInEvent
00411                         << "] BX\n"
00412                         << std::endl;
00413             }
00414 
00415             // active board, pack it
00416             switch (itBoard->gtBoardType()) {
00417 
00418                 case FDL: {
00419 
00420                     for (int iBxInEvent = m_minBxInEvent; iBxInEvent <= m_maxBxInEvent; ++iBxInEvent) {
00421 
00422                         L1GtFdlWord fdlBlock = gtReadoutRecord->gtFdlWord(iBxInEvent);
00423                         packFDL(evSetup, ptrGt, fdlBlock);
00424 
00425                         if (m_verbosity && m_isDebugEnabled) {
00426 
00427                             std::ostringstream myCoutStream;
00428                             fdlBlock.print(myCoutStream);
00429                             LogTrace("L1GTDigiToRaw") << myCoutStream.str() << "\n" << std::endl;
00430                         }
00431 
00432                         ptrGt += fdlBlock.getSize(); // advance with FDL block size
00433                     }
00434 
00435                 }
00436                     break;
00437                 case PSB: {
00438 
00439                     if (m_verbosity && m_isDebugEnabled) {
00440                         LogDebug("L1GTDigiToRaw") << "\nBoard of type " << itBoard->gtBoardName()
00441                                 << " with index " << itBoard->gtBoardIndex() << " and boardId "
00442                                 << std::hex << itBoard->gtBoardId() << std::dec << "\n"
00443                                 << std::endl;
00444                     }
00445 
00446                     for (int iBxInEvent = m_minBxInEvent; iBxInEvent <= m_maxBxInEvent; ++iBxInEvent) {
00447 
00448                         L1GtPsbWord psbBlock = gtReadoutRecord->gtPsbWord(
00449                                 itBoard->gtBoardId(), iBxInEvent);
00450 
00451                         packPSB(evSetup, ptrGt, psbBlock);
00452 
00453                         if (m_verbosity && m_isDebugEnabled) {
00454 
00455                             std::ostringstream myCoutStream;
00456                             psbBlock.print(myCoutStream);
00457                             LogTrace("L1GTDigiToRaw") << myCoutStream.str() << "\n" << std::endl;
00458                         }
00459 
00460                         ptrGt += psbBlock.getSize(); // advance with PSB block size
00461                     }
00462 
00463                 }
00464                     break;
00465                 case GMT: {
00466 
00467                     // get GMT record TODO separate GMT record or via RefProd from GT record
00468                     edm::Handle<L1MuGMTReadoutCollection> gmtrc_handle;
00469                     iEvent.getByLabel(m_muGmtInputTag, gmtrc_handle);
00470                     if (!gmtrc_handle.isValid()) {
00471                         if (m_verbosity) {
00472                             edm::LogWarning("L1GTDigiToRaw")
00473                                     << "\nWarning: L1MuGMTReadoutCollection with input tag "
00474                                     << m_muGmtInputTag
00475                                     << "\nrequested in configuration, but not found in the event."
00476                                     << "\nQuit packing this event" << std::endl;
00477                         }
00478 
00479                         std::auto_ptr<FEDRawDataCollection> allFedRawData(new FEDRawDataCollection);
00480 
00481                         // put the raw data in the event
00482                         iEvent.put(allFedRawData);
00483 
00484                         return;
00485                     }
00486 
00487                     L1MuGMTReadoutCollection const* gmtrc = gmtrc_handle.product();
00488 
00489                     // pack the GMT record
00490 
00491                     unsigned int gmtCollSize = 0;
00492                     gmtCollSize = packGmtCollection(ptrGt, gmtrc);
00493                     ptrGt += gmtCollSize; // advance with GMT collection size
00494 
00495                 }
00496                     break;
00497                 default: {
00498 
00499                     // do nothing, all blocks are given in GtBoardType enum
00500                     break;
00501                 }
00502             }
00503 
00504         }
00505     }
00506 
00507     // pack trailer
00508     packTrailer(ptrGt, ptrGtBegin, gtDataSize);
00509 
00510     // put the raw data in the event
00511     iEvent.put(allFedRawData);
00512 }


Member Data Documentation

boost::uint16_t L1GTDigiToRaw::m_activeBoardsMaskGt [private]

mask for active boards

Definition at line 111 of file L1GTDigiToRaw.h.

Referenced by L1GTDigiToRaw(), and produce().

int L1GTDigiToRaw::m_daqGtFedId [private]

FED Id for GT DAQ record default value defined in DataFormats/FEDRawData/src/FEDNumbering.cc.

Definition at line 102 of file L1GTDigiToRaw.h.

Referenced by L1GTDigiToRaw(), packHeader(), and produce().

edm::InputTag L1GTDigiToRaw::m_daqGtInputTag [private]

input tag for GT DAQ record

Definition at line 105 of file L1GTDigiToRaw.h.

Referenced by L1GTDigiToRaw(), and produce().

bool L1GTDigiToRaw::m_isDebugEnabled [private]

Definition at line 128 of file L1GTDigiToRaw.h.

Referenced by L1GTDigiToRaw(), packFDL(), packGmtCollection(), packGTFE(), packHeader(), packPSB(), and produce().

int L1GTDigiToRaw::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 122 of file L1GTDigiToRaw.h.

Referenced by packGmtCollection(), and produce().

int L1GTDigiToRaw::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 118 of file L1GTDigiToRaw.h.

Referenced by packGmtCollection(), and produce().

edm::InputTag L1GTDigiToRaw::m_muGmtInputTag [private]

input tag for GMT record

Definition at line 108 of file L1GTDigiToRaw.h.

Referenced by L1GTDigiToRaw(), and produce().

int L1GTDigiToRaw::m_totalBxInEvent [private]

total Bx's in the event, obtained from GTFE block

Definition at line 114 of file L1GTDigiToRaw.h.

Referenced by packGmtCollection(), and produce().

int L1GTDigiToRaw::m_verbosity [private]

verbosity level

Definition at line 127 of file L1GTDigiToRaw.h.

Referenced by L1GTDigiToRaw(), packFDL(), packGmtCollection(), packGTFE(), packHeader(), packPSB(), and produce().


The documentation for this class was generated from the following files:
Generated on Tue Jun 9 18:26:43 2009 for CMSSW by  doxygen 1.5.4