#include <SiPixelFedFillerWordEventNumber.h>
Public Member Functions | |
SiPixelFedFillerWordEventNumber (const edm::ParameterSet &) | |
~SiPixelFedFillerWordEventNumber () | |
Public Attributes | |
std::string | instance |
std::string | label |
bool | SaveFillerWordsbool |
Private Member Functions | |
virtual void | beginJob () |
unsigned int | CalibStatFillWord (unsigned int, int) |
virtual void | endJob () |
virtual void | produce (edm::Event &, const edm::EventSetup &) |
int | PwordSlink64 (uint64_t *, const int, uint32_t &) |
Private Attributes | |
unsigned int | CalibStatFill |
edm::ParameterSet | config_ |
unsigned int | EventNum |
int | status |
std::vector< uint32_t > | vecFillerWordsEventNumber1 |
std::vector< uint32_t >::iterator | vecFillerWordsEventNumber1_It |
std::vector< uint32_t > | vecFillerWordsEventNumber2 |
std::vector< uint32_t >::iterator | vecFillerWordsEventNumber2_It |
std::vector< uint32_t > | vecSaveFillerWords |
std::vector< uint32_t >::iterator | vecSaveFillerWords_It |
FedFillerWords/SiPixelFedFillerWordEventNumber /src/SiPixelFedFillerWordEventNumber .cc
Description: <one line="" class="" summary>="">
Implementation: <Notes on="" implementation>="">
Definition at line 22 of file SiPixelFedFillerWordEventNumber.h.
SiPixelFedFillerWordEventNumber::SiPixelFedFillerWordEventNumber | ( | const edm::ParameterSet & | iConfig | ) | [explicit] |
Definition at line 26 of file SiPixelFedFillerWordEventNumber.cc.
References edm::ParameterSet::getParameter(), edm::ParameterSet::getUntrackedParameter(), instance, label, and SaveFillerWordsbool.
{ SaveFillerWordsbool = iConfig.getParameter<bool>("SaveFillerWords"); label =iConfig.getUntrackedParameter<std::string>("InputLabel","source"); instance = iConfig.getUntrackedParameter<std::string>("InputInstance",""); produces<std::vector<uint32_t> > ("FillerWordEventNumber1"); produces<std::vector<uint32_t> > ("FillerWordEventNumber2"); if (SaveFillerWordsbool == true){ produces<std::vector<uint32_t> > ("SaveFillerWord"); } }
SiPixelFedFillerWordEventNumber::~SiPixelFedFillerWordEventNumber | ( | ) |
Definition at line 38 of file SiPixelFedFillerWordEventNumber.cc.
{ }
void SiPixelFedFillerWordEventNumber::beginJob | ( | void | ) | [private, virtual] |
Reimplemented from edm::EDProducer.
Definition at line 413 of file SiPixelFedFillerWordEventNumber.cc.
{ }
unsigned int SiPixelFedFillerWordEventNumber::CalibStatFillWord | ( | unsigned int | totword, |
int | status | ||
) | [private] |
Definition at line 42 of file SiPixelFedFillerWordEventNumber.cc.
References EventNum, vecFillerWordsEventNumber1, and vecFillerWordsEventNumber2.
Referenced by PwordSlink64().
{ //===== Variables to get each filler word out of the totword and // to conform the last 16 bit filler word if Filler3 is zero. unsigned int Filler1 = (totword)&0x000000ff; unsigned int Filler2 = ((totword)&0x0000ff00)>>8; unsigned int Filler3 = ((totword)&0x00ff0000)>>16; unsigned int Filler4 = ((totword)&0xffff0000)>>16; unsigned int maskFiller4 = ((totword)&0xff000000)>>16; unsigned int Filler14 = (Filler1&maskFiller4); unsigned int Filler24 = (Filler2&maskFiller4); unsigned int CalibFiller1 = 0; unsigned int CalibFiller2 = 0; bool BoolStat = false; //=====Possible cases for the totword. "CalibFiller1" and "CalibFiller2" take their valur // according to the value of the totword. if ((status == 0x1)||(status == 0x9)){ CalibFiller1 = Filler1; if((status == 0x9)){CalibFiller2 = Filler14;} } if ((status == 0x2)||(status == 0xa)){ CalibFiller1 = Filler2; if((status == 0xa)){CalibFiller2 = Filler24;} } if ((status == 0x4)||(status == 0xc)){ CalibFiller1 = Filler3; if((status == 0xc)){CalibFiller2 = Filler4;} } if ((status == 0x8)){CalibFiller2 = Filler4;} if((status == 0x7)||(status == 0xf)){ if((Filler1 == Filler2)&&(Filler1 == Filler3)&&(Filler2 == Filler3)){ CalibFiller1 = Filler1; BoolStat = true; if(status == 0xf){CalibFiller2 = Filler4;} }else{ edm::LogError("AnazrFedFillerWords")<<"Status: "<<status << "Event ID in Filler words don't match" <<'\t'<<"Filler1: "<<(Filler1%256) <<'\t'<<"Filler2: "<<(Filler2%256) <<'\t'<<"Filler3: "<<(Filler3%256) <<std::endl; } } if((status == 0x3)||(status == 0xb)){ if((Filler1 == Filler2)){ CalibFiller1 = Filler1; BoolStat = true; if(status == 0xb){CalibFiller2 = Filler14;} }else{ edm::LogError("AnazrFedFillerWords")<<"Status: "<<status << "Event ID in Filler words don't match" <<'\t'<<"Filler1: "<<(Filler1%256) <<'\t'<<"Filler2: "<<(Filler2%256) <<std::endl; } } if((status == 0x5)||(status == 0xd)){ if((Filler1 == Filler3)){ CalibFiller1 = Filler1; BoolStat = true; if(status == 0xd){CalibFiller2 = Filler4;} }else{ edm::LogError("AnazrFedFillerWords")<<"Status: "<<status << "Event ID in Filler words don't match" <<'\t'<<"Filler1: "<<(Filler1%256) <<'\t'<<"Filler3: "<<(Filler3%256) <<std::endl; } } if((status == 0x6)||(status == 0xe)){ if((Filler2 == Filler3)){ CalibFiller1 = Filler2; BoolStat = true; if(status == 0xe){CalibFiller2 = Filler4;} }else{ edm::LogError("AnazrFedFillerWords")<<"Status: "<<status << "Event ID Filler words don't match" <<'\t'<<"Filler2: "<<(Filler2%256) <<'\t'<<"Filler3: "<<(Filler3%256) <<std::endl; } } //===== Using the Event number from CMSSW to get a value to compare with the value encoded // in the filler words. unsigned int CalibEvtNum = ((EventNum -1)/10); if((CalibFiller1 != 0)&&(CalibEvtNum != CalibFiller1)){ edm::LogError("AnazrFedFillerWords")<<"Error, Event ID Numbers Don't match---->"<<"Filler1 Event ID: " << CalibFiller1 <<'\t'<<"Run Event ID: " <<CalibEvtNum<<'\t'<<std::endl; }else if((CalibFiller1 != 0)&&(CalibEvtNum == CalibFiller1)){ vecFillerWordsEventNumber1.push_back((CalibFiller1%256)); edm::LogInfo("AnazrFedFillerWords")<<"Filler1 Event ID: " <<(CalibFiller1%256)<<std::endl; }else if((CalibFiller2 != 0)&&(BoolStat == true)){ vecFillerWordsEventNumber2.push_back((((CalibFiller2%65536)&(0xff00))>>8)); edm::LogInfo("AnazrFedFillerWords")<<"Filler2 Event ID:" <<(((CalibFiller2%65536)&(0xff00))>>8)<<std::endl; }else if((CalibFiller2 != 0)&&(BoolStat == false)){ if((status == 0x9)||(status == 0xa)||(status == 0xc)){ vecFillerWordsEventNumber2.push_back((((CalibFiller2%65536)&(0xff00))>>8)); edm::LogInfo("AnazrFedFillerWords")<<"Filler2 Event ID:"<<(((CalibFiller2%65536)&(0xff00))>>8)<<std::endl; }else if((status == 0x8)){ edm::LogError("AnazrFedFillerWords")<<"Status: "<<status <<" No Filler1 found, is not possible get any Event ID Number" <<std::endl; } } return 0; }
void SiPixelFedFillerWordEventNumber::endJob | ( | void | ) | [private, virtual] |
Reimplemented from edm::EDProducer.
Definition at line 419 of file SiPixelFedFillerWordEventNumber.cc.
{ }
void SiPixelFedFillerWordEventNumber::produce | ( | edm::Event & | iEvent, |
const edm::EventSetup & | iSetup | ||
) | [private, virtual] |
Implements edm::EDProducer.
Definition at line 359 of file SiPixelFedFillerWordEventNumber.cc.
References FEDRawData::data(), edm::EventID::event(), EventNum, edm::Event::getByLabel(), edm::EventBase::id(), instance, label, edm::Event::put(), PwordSlink64(), SaveFillerWordsbool, FEDRawData::size(), relativeConstraints::value, vecFillerWordsEventNumber1, vecFillerWordsEventNumber1_It, vecFillerWordsEventNumber2, vecFillerWordsEventNumber2_It, vecSaveFillerWords, and vecSaveFillerWords_It.
{ EventNum = iEvent.id().event(); edm::Handle<FEDRawDataCollection> buffers; iEvent.getByLabel( label, instance, buffers); std::auto_ptr<std::vector<uint32_t> > FillerWordEventNumbers1(new std::vector<uint32_t>); std::auto_ptr<std::vector<uint32_t> > FillerWordEventNumbers2(new std::vector<uint32_t>); std::auto_ptr<std::vector<uint32_t> > SaveFillerWords(new std::vector<uint32_t>); //===== Loop over all the FEDs ======================================================== FEDNumbering fednum; std::pair<int,int> fedIds; fedIds.first = 0; fedIds.second = 39; for (int fedId = fedIds.first; fedId <= fedIds.second; fedId++) { edm::LogInfo("FedFillerWords") << " examining FED: " << fedId << std::endl; const FEDRawData& fedRawData = buffers->FEDData( fedId ); //get event data for this fed //======== Run the fill word finder... if(fedRawData.size()!= 0){ uint32_t totword; int value = PwordSlink64((uint64_t*)fedRawData.data(),(int)fedRawData.size(), totword); if(value!=0){ //====== Verify that the vector is not empty if(vecSaveFillerWords.size()!=0){ for(vecSaveFillerWords_It = vecSaveFillerWords.begin(); vecSaveFillerWords_It != vecSaveFillerWords.end(); vecSaveFillerWords_It++){ SaveFillerWords->push_back(*vecSaveFillerWords_It); } }else{ edm::LogWarning("FedFillerWords") <<"========= Filler Words Vector is empty! ==========" <<std::endl; } } edm::LogInfo("FedFillerWords") << "Found " << value << " filler words in FED " << fedId << std::endl; for (vecFillerWordsEventNumber1_It = vecFillerWordsEventNumber1.begin(); vecFillerWordsEventNumber1_It != vecFillerWordsEventNumber1.end(); vecFillerWordsEventNumber1_It++){ FillerWordEventNumbers1->push_back(*vecFillerWordsEventNumber1_It); } for(vecFillerWordsEventNumber2_It = vecFillerWordsEventNumber2.begin(); vecFillerWordsEventNumber2_It != vecFillerWordsEventNumber2.end(); vecFillerWordsEventNumber2_It++){ FillerWordEventNumbers2->push_back(*vecFillerWordsEventNumber2_It); } } } iEvent.put(FillerWordEventNumbers1 , "FillerWordEventNumber1"); iEvent.put(FillerWordEventNumbers2 , "FillerWordEventNumber2"); //====== bool variable to be controled in the config file, allows the user to put or // the filler words inside the output root file if(SaveFillerWordsbool == true) { iEvent.put(SaveFillerWords, "SaveFillerWord"); } vecSaveFillerWords.erase(vecSaveFillerWords.begin(), vecSaveFillerWords.end()); vecFillerWordsEventNumber1.erase(vecFillerWordsEventNumber1.begin(), vecFillerWordsEventNumber1.end()); }
int SiPixelFedFillerWordEventNumber::PwordSlink64 | ( | uint64_t * | ldata, |
const int | length, | ||
uint32_t & | totword | ||
) | [private] |
Definition at line 148 of file SiPixelFedFillerWordEventNumber.cc.
References CalibStatFill, CalibStatFillWord(), EventNum, status, and vecSaveFillerWords.
Referenced by produce().
{ edm::LogInfo("FedFillerWords") <<"Begin of data"<<std::endl; if( (ldata[0]&0xf000000000000000LL) != 0x5000000000000000LL )//header { return 0; } //========= analyze the data buffer to find private words ================================ int fif2cnt=0; int dumcnt=0; int gapcnt=0; uint32_t gap[8]; uint32_t dum[8]; uint32_t word1=0; uint32_t word2=0; uint32_t chan=0; uint32_t roc=0; const uint32_t rocmsk = 0x3e00000; const uint32_t chnlmsk = 0xfc000000; for(int jk=0;jk<8;jk++)gap[jk]=0; for(int jk=0;jk<8;jk++)dum[jk]=0; totword=0; int fifcnt=1; for(int kk=1;kk<length-1;kk++) { //======= if statement to make analize just data with the right format =================== if((((ldata[kk]&0xff00000000000000LL)>>32) == 0xa0000000) && (((ldata[kk]&0xffffff00000000LL)>>32)== (uint64_t)(kk+1))){break;} word2 = (uint32_t) ldata[kk]; word1 = (uint32_t) (ldata[kk]>>32); //======= 1st word ====================================================================== chan= ((word1&chnlmsk)>>26); roc= ((word1&rocmsk)>>21); //======count non-error words if(roc<25){ if(dumcnt>0){ dumcnt=0; }//stale dummy! if((chan<5)&&(fifcnt!=1)){ edm::LogError("FedFillerWords") <<" error in fifo counting!"<<std::endl; } if((chan>4)&&(chan<10)&&(fifcnt!=2)) {fif2cnt=0;fifcnt=2;} if((chan>9)&&(chan<14)&&(fifcnt!=3)) {fif2cnt=0;fifcnt=3;} if((chan>13)&&(chan<19)&&(fifcnt!=4)){fif2cnt=0;fifcnt=4;} if((chan>18)&&(chan<23)&&(fifcnt!=5)){fif2cnt=0;fifcnt=5;} if((chan>22)&&(chan<28)&&(fifcnt!=6)){fif2cnt=0;fifcnt=6;} if((chan>27)&&(chan<32)&&(fifcnt!=7)){fif2cnt=0;fifcnt=7;} if((chan>31)&&(fifcnt!=8)){fif2cnt=0;fifcnt=8;} fif2cnt++; } //====== Gap Word if(roc==26){ gap[fifcnt-1]=(0x1000+(word1&0xff)); gapcnt++; } //====== Dummy Word if((roc==27)&&((fif2cnt+dumcnt)<6)){ dum[fifcnt-1]=(0x1000+(word1&0xff)); dumcnt++; } else if((roc==27)&&((fif2cnt+dumcnt)>6)){ dumcnt=1; fif2cnt=0; fifcnt++; } //======== 2nd word ============================================================ chan= ((word2&chnlmsk)>>26); roc= ((word2&rocmsk)>>21); if(roc<25) { if(dumcnt>0){ dumcnt=0; edm::LogInfo("FedFillerWords") <<" ***Stale dummy!"<<std::endl; }//stale dummy! if((chan<5)&&(fifcnt!=1)){ edm::LogError("FedFillerWords") <<" error in fifo counting!"<<std::endl; } if((chan>4)&&(chan<10)&&(fifcnt!=2)) {fif2cnt=0;fifcnt=2;} if((chan>9)&&(chan<14)&&(fifcnt!=3)) {fif2cnt=0;fifcnt=3;} if((chan>13)&&(chan<19)&&(fifcnt!=4)){fif2cnt=0;fifcnt=4;} if((chan>18)&&(chan<23)&&(fifcnt!=5)){fif2cnt=0;fifcnt=5;} if((chan>22)&&(chan<28)&&(fifcnt!=6)){fif2cnt=0;fifcnt=6;} if((chan>27)&&(chan<32)&&(fifcnt!=7)){fif2cnt=0;fifcnt=7;} if((chan>31)&&(fifcnt!=8)){fif2cnt=0;fifcnt=8;} fif2cnt++; } if(roc==26){ gap[fifcnt-1]=(0x1000+(word2&0xff)); gapcnt++; } if ((roc==27)&&((fif2cnt+dumcnt)<6)){ dum[fifcnt-1]=(0x1000+(word1&0xff)); dumcnt++; } else if((roc==27)&&((fif2cnt+dumcnt)>6)){ dumcnt=1; fif2cnt=0; fifcnt++; } //word check complete if(((fif2cnt+dumcnt)==6)&&(dumcnt>0)){ //done with this fifo dumcnt=0; fif2cnt=0; fifcnt++; } if((gapcnt>0)&&((dumcnt+fif2cnt)>5)){//done with this fifo gapcnt=0; fifcnt++; fif2cnt=0; dumcnt=0; } else if((gapcnt>0)&&((dumcnt+fif2cnt)<6)){ gapcnt=0; } }//==End of fifo-3 word loop //========== FPGAs Status ================================================== status = 0; if(gap[0]>0) { totword=(gap[0]&0xff); status=1; } else if(gap[1]>0){ totword=(gap[1]&0xff); status=1; } else if(dum[0]>0){ totword=(dum[0]&0xff); status=1; } else if(dum[1]>0){ totword=(dum[1]&0xff); status=1; } if(gap[2]>0) { totword=totword|((gap[2]&0xff)<<8); status=status|0x2; } else if(gap[3]>0){ totword=totword|((gap[3]&0xff)<<8); status=status|0x2; } else if(dum[2]>0){ totword=totword|((dum[2]&0xff)<<8); status=status|0x2; } else if(dum[3]>0){ totword=totword|((dum[3]&0xff)<<8); status=status|0x2; } if(gap[4]>0) { totword=totword|((gap[4]&0xff)<<16); status=status|0x4; } else if(gap[5]>0){ totword=totword|((gap[5]&0xff)<<16); status=status|0x4; } else if(dum[4]>0){ totword=totword|((dum[4]&0xff)<<16); status=status|0x4; } else if(dum[5]>0){ totword=totword|((dum[5]&0xff)<<16); status=status|0x4; } if(gap[6]>0){ totword=totword|((gap[6]&0xff)<<24); status=status|0x8; } else if(gap[7]>0){ totword=totword|((gap[7]&0xff)<<24); status=status|0x8; } else if(dum[6]>0){ totword=totword|((dum[6]&0xff)<<24); status=status|0x8; } else if(dum[7]>0){ totword=totword|((dum[7]&0xff)<<24); status=status|0x8; } vecSaveFillerWords.push_back(totword); if((EventNum%10) == 0){ CalibStatFill = CalibStatFillWord(totword, status); } edm::LogInfo("FedFillerWords") <<"total word = 0x" <<std::hex<<totword <<std::hex<<" Status = 0x" <<status<<std::dec<<std::endl; return(status); }
unsigned int SiPixelFedFillerWordEventNumber::CalibStatFill [private] |
Definition at line 41 of file SiPixelFedFillerWordEventNumber.h.
Referenced by PwordSlink64().
Definition at line 34 of file SiPixelFedFillerWordEventNumber.h.
unsigned int SiPixelFedFillerWordEventNumber::EventNum [private] |
Definition at line 36 of file SiPixelFedFillerWordEventNumber.h.
Referenced by CalibStatFillWord(), produce(), and PwordSlink64().
std::string SiPixelFedFillerWordEventNumber::instance |
Definition at line 27 of file SiPixelFedFillerWordEventNumber.h.
Referenced by produce(), and SiPixelFedFillerWordEventNumber().
std::string SiPixelFedFillerWordEventNumber::label |
Definition at line 26 of file SiPixelFedFillerWordEventNumber.h.
Referenced by produce(), and SiPixelFedFillerWordEventNumber().
Definition at line 28 of file SiPixelFedFillerWordEventNumber.h.
Referenced by produce(), and SiPixelFedFillerWordEventNumber().
int SiPixelFedFillerWordEventNumber::status [private] |
Definition at line 35 of file SiPixelFedFillerWordEventNumber.h.
Referenced by PwordSlink64().
std::vector<uint32_t> SiPixelFedFillerWordEventNumber::vecFillerWordsEventNumber1 [private] |
Definition at line 44 of file SiPixelFedFillerWordEventNumber.h.
Referenced by CalibStatFillWord(), and produce().
std::vector<uint32_t>::iterator SiPixelFedFillerWordEventNumber::vecFillerWordsEventNumber1_It [private] |
Definition at line 45 of file SiPixelFedFillerWordEventNumber.h.
Referenced by produce().
std::vector<uint32_t> SiPixelFedFillerWordEventNumber::vecFillerWordsEventNumber2 [private] |
Definition at line 46 of file SiPixelFedFillerWordEventNumber.h.
Referenced by CalibStatFillWord(), and produce().
std::vector<uint32_t>::iterator SiPixelFedFillerWordEventNumber::vecFillerWordsEventNumber2_It [private] |
Definition at line 47 of file SiPixelFedFillerWordEventNumber.h.
Referenced by produce().
std::vector<uint32_t> SiPixelFedFillerWordEventNumber::vecSaveFillerWords [private] |
Definition at line 42 of file SiPixelFedFillerWordEventNumber.h.
Referenced by produce(), and PwordSlink64().
std::vector<uint32_t>::iterator SiPixelFedFillerWordEventNumber::vecSaveFillerWords_It [private] |
Definition at line 43 of file SiPixelFedFillerWordEventNumber.h.
Referenced by produce().