Go to the documentation of this file.00001
00002
00003
00004
00005
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <memory>
00023 #include "SiPixelFedFillerWordEventNumber.h"
00024
00025
00026 SiPixelFedFillerWordEventNumber ::SiPixelFedFillerWordEventNumber (const edm::ParameterSet& iConfig)
00027 {
00028 SaveFillerWordsbool = iConfig.getParameter<bool>("SaveFillerWords");
00029 label =iConfig.getUntrackedParameter<std::string>("InputLabel","source");
00030 instance = iConfig.getUntrackedParameter<std::string>("InputInstance","");
00031 produces<std::vector<uint32_t> > ("FillerWordEventNumber1");
00032 produces<std::vector<uint32_t> > ("FillerWordEventNumber2");
00033 if (SaveFillerWordsbool == true){
00034 produces<std::vector<uint32_t> > ("SaveFillerWord");
00035 }
00036 }
00037
00038 SiPixelFedFillerWordEventNumber ::~SiPixelFedFillerWordEventNumber ()
00039 {
00040
00041 }
00042 unsigned int SiPixelFedFillerWordEventNumber ::CalibStatFillWord(unsigned int totword, int status){
00043
00044
00045 unsigned int Filler1 = (totword)&0x000000ff;
00046 unsigned int Filler2 = ((totword)&0x0000ff00)>>8;
00047 unsigned int Filler3 = ((totword)&0x00ff0000)>>16;
00048 unsigned int Filler4 = ((totword)&0xffff0000)>>16;
00049 unsigned int maskFiller4 = ((totword)&0xff000000)>>16;
00050 unsigned int Filler14 = (Filler1&maskFiller4);
00051 unsigned int Filler24 = (Filler2&maskFiller4);
00052 unsigned int CalibFiller1 = 0;
00053 unsigned int CalibFiller2 = 0;
00054 bool BoolStat = false;
00055
00056
00057 if ((status == 0x1)||(status == 0x9)){
00058 CalibFiller1 = Filler1;
00059 if((status == 0x9)){CalibFiller2 = Filler14;}
00060 }
00061 if ((status == 0x2)||(status == 0xa)){
00062 CalibFiller1 = Filler2;
00063 if((status == 0xa)){CalibFiller2 = Filler24;}
00064 }
00065 if ((status == 0x4)||(status == 0xc)){
00066 CalibFiller1 = Filler3;
00067 if((status == 0xc)){CalibFiller2 = Filler4;}
00068 }
00069 if ((status == 0x8)){CalibFiller2 = Filler4;}
00070 if((status == 0x7)||(status == 0xf)){
00071 if((Filler1 == Filler2)&&(Filler1 == Filler3)&&(Filler2 == Filler3)){
00072 CalibFiller1 = Filler1;
00073 BoolStat = true;
00074 if(status == 0xf){CalibFiller2 = Filler4;}
00075 }else{
00076 edm::LogError("AnazrFedFillerWords")<<"Status: "<<status << "Event ID in Filler words don't match"
00077 <<'\t'<<"Filler1: "<<(Filler1%256)
00078 <<'\t'<<"Filler2: "<<(Filler2%256)
00079 <<'\t'<<"Filler3: "<<(Filler3%256)
00080 <<std::endl;
00081 }
00082 }
00083 if((status == 0x3)||(status == 0xb)){
00084 if((Filler1 == Filler2)){
00085 CalibFiller1 = Filler1;
00086 BoolStat = true;
00087 if(status == 0xb){CalibFiller2 = Filler14;}
00088 }else{
00089 edm::LogError("AnazrFedFillerWords")<<"Status: "<<status << "Event ID in Filler words don't match"
00090 <<'\t'<<"Filler1: "<<(Filler1%256)
00091 <<'\t'<<"Filler2: "<<(Filler2%256)
00092 <<std::endl;
00093 }
00094 }
00095 if((status == 0x5)||(status == 0xd)){
00096 if((Filler1 == Filler3)){
00097 CalibFiller1 = Filler1;
00098 BoolStat = true;
00099 if(status == 0xd){CalibFiller2 = Filler4;}
00100 }else{
00101 edm::LogError("AnazrFedFillerWords")<<"Status: "<<status << "Event ID in Filler words don't match"
00102 <<'\t'<<"Filler1: "<<(Filler1%256)
00103 <<'\t'<<"Filler3: "<<(Filler3%256)
00104 <<std::endl;
00105 }
00106 }
00107 if((status == 0x6)||(status == 0xe)){
00108 if((Filler2 == Filler3)){
00109 CalibFiller1 = Filler2;
00110 BoolStat = true;
00111 if(status == 0xe){CalibFiller2 = Filler4;}
00112 }else{
00113 edm::LogError("AnazrFedFillerWords")<<"Status: "<<status << "Event ID Filler words don't match"
00114 <<'\t'<<"Filler2: "<<(Filler2%256)
00115 <<'\t'<<"Filler3: "<<(Filler3%256)
00116 <<std::endl;
00117 }
00118 }
00119
00120
00121 unsigned int CalibEvtNum = ((EventNum -1)/10);
00122 if((CalibFiller1 != 0)&&(CalibEvtNum != CalibFiller1)){
00123 edm::LogError("AnazrFedFillerWords")<<"Error, Event ID Numbers Don't match---->"<<"Filler1 Event ID: "
00124 << CalibFiller1 <<'\t'<<"Run Event ID: "
00125 <<CalibEvtNum<<'\t'<<std::endl;
00126 }else if((CalibFiller1 != 0)&&(CalibEvtNum == CalibFiller1)){
00127 vecFillerWordsEventNumber1.push_back((CalibFiller1%256));
00128 edm::LogInfo("AnazrFedFillerWords")<<"Filler1 Event ID: "
00129 <<(CalibFiller1%256)<<std::endl;
00130 }else if((CalibFiller2 != 0)&&(BoolStat == true)){
00131 vecFillerWordsEventNumber2.push_back((((CalibFiller2%65536)&(0xff00))>>8));
00132 edm::LogInfo("AnazrFedFillerWords")<<"Filler2 Event ID:"
00133 <<(((CalibFiller2%65536)&(0xff00))>>8)<<std::endl;
00134 }else if((CalibFiller2 != 0)&&(BoolStat == false)){
00135 if((status == 0x9)||(status == 0xa)||(status == 0xc)){
00136 vecFillerWordsEventNumber2.push_back((((CalibFiller2%65536)&(0xff00))>>8));
00137 edm::LogInfo("AnazrFedFillerWords")<<"Filler2 Event ID:"<<(((CalibFiller2%65536)&(0xff00))>>8)<<std::endl;
00138 }else if((status == 0x8)){
00139 edm::LogError("AnazrFedFillerWords")<<"Status: "<<status
00140 <<" No Filler1 found, is not possible get any Event ID Number"
00141 <<std::endl;
00142 }
00143 }
00144
00145 return 0;
00146 }
00147
00148 int SiPixelFedFillerWordEventNumber ::PwordSlink64(uint64_t * ldata, const int length, uint32_t &totword) {
00149 edm::LogInfo("FedFillerWords") <<"Begin of data"<<std::endl;
00150
00151 if( (ldata[0]&0xf000000000000000LL) != 0x5000000000000000LL )
00152 {
00153 return 0;
00154 }
00155
00156
00157 int fif2cnt=0;
00158 int dumcnt=0;
00159 int gapcnt=0;
00160
00161 uint32_t gap[8];
00162 uint32_t dum[8];
00163 uint32_t word1=0;
00164 uint32_t word2=0;
00165
00166 uint32_t chan=0;
00167 uint32_t roc=0;
00168
00169 const uint32_t rocmsk = 0x3e00000;
00170 const uint32_t chnlmsk = 0xfc000000;
00171
00172 for(int jk=0;jk<8;jk++)gap[jk]=0;
00173 for(int jk=0;jk<8;jk++)dum[jk]=0;
00174 totword=0;
00175 int fifcnt=1;
00176 for(int kk=1;kk<length-1;kk++) {
00177
00178 if((((ldata[kk]&0xff00000000000000LL)>>32) == 0xa0000000)
00179 && (((ldata[kk]&0xffffff00000000LL)>>32)== (uint64_t)(kk+1))){break;}
00180
00181 word2 = (uint32_t) ldata[kk];
00182 word1 = (uint32_t) (ldata[kk]>>32);
00183
00184
00185
00186 chan= ((word1&chnlmsk)>>26);
00187 roc= ((word1&rocmsk)>>21);
00188
00189
00190 if(roc<25){
00191 if(dumcnt>0){
00192 dumcnt=0;
00193 }
00194 if((chan<5)&&(fifcnt!=1)){
00195 edm::LogError("FedFillerWords") <<" error in fifo counting!"<<std::endl;
00196 }
00197 if((chan>4)&&(chan<10)&&(fifcnt!=2)) {fif2cnt=0;fifcnt=2;}
00198 if((chan>9)&&(chan<14)&&(fifcnt!=3)) {fif2cnt=0;fifcnt=3;}
00199 if((chan>13)&&(chan<19)&&(fifcnt!=4)){fif2cnt=0;fifcnt=4;}
00200 if((chan>18)&&(chan<23)&&(fifcnt!=5)){fif2cnt=0;fifcnt=5;}
00201 if((chan>22)&&(chan<28)&&(fifcnt!=6)){fif2cnt=0;fifcnt=6;}
00202 if((chan>27)&&(chan<32)&&(fifcnt!=7)){fif2cnt=0;fifcnt=7;}
00203 if((chan>31)&&(fifcnt!=8)){fif2cnt=0;fifcnt=8;}
00204 fif2cnt++;
00205 }
00206
00207 if(roc==26){
00208 gap[fifcnt-1]=(0x1000+(word1&0xff));
00209 gapcnt++;
00210 }
00211
00212 if((roc==27)&&((fif2cnt+dumcnt)<6)){
00213 dum[fifcnt-1]=(0x1000+(word1&0xff));
00214 dumcnt++;
00215 }
00216 else if((roc==27)&&((fif2cnt+dumcnt)>6)){
00217 dumcnt=1;
00218 fif2cnt=0;
00219 fifcnt++;
00220 }
00221
00222
00223
00224 chan= ((word2&chnlmsk)>>26);
00225 roc= ((word2&rocmsk)>>21);
00226
00227 if(roc<25)
00228 {
00229 if(dumcnt>0){
00230 dumcnt=0;
00231 edm::LogInfo("FedFillerWords") <<" ***Stale dummy!"<<std::endl;
00232 }
00233 if((chan<5)&&(fifcnt!=1)){
00234 edm::LogError("FedFillerWords") <<" error in fifo counting!"<<std::endl;
00235 }
00236 if((chan>4)&&(chan<10)&&(fifcnt!=2)) {fif2cnt=0;fifcnt=2;}
00237 if((chan>9)&&(chan<14)&&(fifcnt!=3)) {fif2cnt=0;fifcnt=3;}
00238 if((chan>13)&&(chan<19)&&(fifcnt!=4)){fif2cnt=0;fifcnt=4;}
00239 if((chan>18)&&(chan<23)&&(fifcnt!=5)){fif2cnt=0;fifcnt=5;}
00240 if((chan>22)&&(chan<28)&&(fifcnt!=6)){fif2cnt=0;fifcnt=6;}
00241 if((chan>27)&&(chan<32)&&(fifcnt!=7)){fif2cnt=0;fifcnt=7;}
00242 if((chan>31)&&(fifcnt!=8)){fif2cnt=0;fifcnt=8;}
00243 fif2cnt++;
00244 }
00245 if(roc==26){
00246 gap[fifcnt-1]=(0x1000+(word2&0xff));
00247 gapcnt++;
00248 }
00249 if ((roc==27)&&((fif2cnt+dumcnt)<6)){
00250 dum[fifcnt-1]=(0x1000+(word1&0xff));
00251 dumcnt++;
00252 }
00253 else if((roc==27)&&((fif2cnt+dumcnt)>6)){
00254 dumcnt=1;
00255 fif2cnt=0;
00256 fifcnt++;
00257 }
00258
00259
00260 if(((fif2cnt+dumcnt)==6)&&(dumcnt>0)){
00261 dumcnt=0;
00262 fif2cnt=0;
00263 fifcnt++;
00264 }
00265 if((gapcnt>0)&&((dumcnt+fif2cnt)>5)){
00266 gapcnt=0;
00267 fifcnt++;
00268 fif2cnt=0;
00269 dumcnt=0;
00270 }
00271 else if((gapcnt>0)&&((dumcnt+fif2cnt)<6)){
00272 gapcnt=0;
00273 }
00274
00275 }
00276
00277 status = 0;
00278
00279 if(gap[0]>0) {
00280 totword=(gap[0]&0xff);
00281 status=1;
00282 }
00283 else if(gap[1]>0){
00284 totword=(gap[1]&0xff);
00285 status=1;
00286 }
00287 else if(dum[0]>0){
00288 totword=(dum[0]&0xff);
00289 status=1;
00290 }
00291 else if(dum[1]>0){
00292 totword=(dum[1]&0xff);
00293 status=1;
00294 }
00295
00296 if(gap[2]>0) {
00297 totword=totword|((gap[2]&0xff)<<8);
00298 status=status|0x2;
00299 }
00300 else if(gap[3]>0){
00301 totword=totword|((gap[3]&0xff)<<8);
00302 status=status|0x2;
00303 }
00304 else if(dum[2]>0){
00305 totword=totword|((dum[2]&0xff)<<8);
00306 status=status|0x2;
00307 }
00308 else if(dum[3]>0){
00309 totword=totword|((dum[3]&0xff)<<8);
00310 status=status|0x2;
00311 }
00312
00313 if(gap[4]>0) {
00314 totword=totword|((gap[4]&0xff)<<16);
00315 status=status|0x4;
00316 }
00317 else if(gap[5]>0){
00318 totword=totword|((gap[5]&0xff)<<16);
00319 status=status|0x4;
00320 }
00321 else if(dum[4]>0){
00322 totword=totword|((dum[4]&0xff)<<16);
00323 status=status|0x4;
00324 }
00325 else if(dum[5]>0){
00326 totword=totword|((dum[5]&0xff)<<16);
00327 status=status|0x4;
00328 }
00329
00330 if(gap[6]>0){
00331 totword=totword|((gap[6]&0xff)<<24);
00332 status=status|0x8;
00333 }
00334 else if(gap[7]>0){
00335 totword=totword|((gap[7]&0xff)<<24);
00336 status=status|0x8;
00337 }
00338 else if(dum[6]>0){
00339 totword=totword|((dum[6]&0xff)<<24);
00340 status=status|0x8;
00341 }
00342 else if(dum[7]>0){
00343 totword=totword|((dum[7]&0xff)<<24);
00344 status=status|0x8;
00345 }
00346 vecSaveFillerWords.push_back(totword);
00347 if((EventNum%10) == 0){
00348 CalibStatFill = CalibStatFillWord(totword, status);
00349 }
00350 edm::LogInfo("FedFillerWords") <<"total word = 0x"
00351 <<std::hex<<totword
00352 <<std::hex<<" Status = 0x"
00353 <<status<<std::dec<<std::endl;
00354 return(status);
00355
00356 }
00357
00358 void
00359 SiPixelFedFillerWordEventNumber ::produce(edm::Event& iEvent, const edm::EventSetup& iSetup)
00360 {
00361 EventNum = iEvent.id().event();
00362 edm::Handle<FEDRawDataCollection> buffers;
00363 iEvent.getByLabel( label, instance, buffers);
00364 std::auto_ptr<std::vector<uint32_t> > FillerWordEventNumbers1(new std::vector<uint32_t>);
00365 std::auto_ptr<std::vector<uint32_t> > FillerWordEventNumbers2(new std::vector<uint32_t>);
00366 std::auto_ptr<std::vector<uint32_t> > SaveFillerWords(new std::vector<uint32_t>);
00367
00368 FEDNumbering fednum;
00369 std::pair<int,int> fedIds;
00370 fedIds.first = 0;
00371 fedIds.second = 39;
00372
00373 for (int fedId = fedIds.first; fedId <= fedIds.second; fedId++) {
00374 edm::LogInfo("FedFillerWords") << " examining FED: " << fedId << std::endl;
00375 const FEDRawData& fedRawData = buffers->FEDData( fedId );
00376
00377 if(fedRawData.size()!= 0){
00378 uint32_t totword;
00379 int value = PwordSlink64((uint64_t*)fedRawData.data(),(int)fedRawData.size(), totword);
00380 if(value!=0){
00381
00382 if(vecSaveFillerWords.size()!=0){
00383 for(vecSaveFillerWords_It = vecSaveFillerWords.begin(); vecSaveFillerWords_It != vecSaveFillerWords.end(); vecSaveFillerWords_It++){
00384 SaveFillerWords->push_back(*vecSaveFillerWords_It);
00385 }
00386 }else{
00387 edm::LogWarning("FedFillerWords") <<"========= Filler Words Vector is empty! ==========" <<std::endl;
00388 }
00389 }
00390 edm::LogInfo("FedFillerWords") << "Found " << value << " filler words in FED " << fedId << std::endl;
00391 for (vecFillerWordsEventNumber1_It = vecFillerWordsEventNumber1.begin(); vecFillerWordsEventNumber1_It != vecFillerWordsEventNumber1.end(); vecFillerWordsEventNumber1_It++){
00392 FillerWordEventNumbers1->push_back(*vecFillerWordsEventNumber1_It);
00393 }
00394 for(vecFillerWordsEventNumber2_It = vecFillerWordsEventNumber2.begin(); vecFillerWordsEventNumber2_It != vecFillerWordsEventNumber2.end(); vecFillerWordsEventNumber2_It++){
00395 FillerWordEventNumbers2->push_back(*vecFillerWordsEventNumber2_It);
00396 }
00397 }
00398 }
00399 iEvent.put(FillerWordEventNumbers1 , "FillerWordEventNumber1");
00400 iEvent.put(FillerWordEventNumbers2 , "FillerWordEventNumber2");
00401
00402
00403 if(SaveFillerWordsbool == true)
00404 {
00405 iEvent.put(SaveFillerWords, "SaveFillerWord");
00406 }
00407 vecSaveFillerWords.erase(vecSaveFillerWords.begin(), vecSaveFillerWords.end());
00408 vecFillerWordsEventNumber1.erase(vecFillerWordsEventNumber1.begin(), vecFillerWordsEventNumber1.end());
00409 }
00410
00411
00412 void
00413 SiPixelFedFillerWordEventNumber ::beginJob()
00414 {
00415 }
00416
00417
00418 void
00419 SiPixelFedFillerWordEventNumber ::endJob() {
00420 }
00421
00422 DEFINE_FWK_MODULE(SiPixelFedFillerWordEventNumber );