CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_7/src/L1Trigger/HardwareValidation/src/L1Comparator.cc

Go to the documentation of this file.
00001 #include "L1Trigger/HardwareValidation/interface/L1Comparator.h"
00002 #include "FWCore/Framework/interface/ESHandle.h"
00003 
00004 using namespace dedefs;
00005 
00006 L1Comparator::L1Comparator(const edm::ParameterSet& iConfig) {
00007 
00008   verbose_ = iConfig.getUntrackedParameter<int>("VerboseFlag",0);
00009 
00010   if(verbose())
00011     std::cout << "\nL1COMPARATOR constructor...\n" << std::flush;
00012 
00013   std::vector<unsigned int> dosys(0,DEnsys); 
00014   dosys = 
00015     iConfig.getUntrackedParameter<std::vector<unsigned int> >("COMPARE_COLLS", dosys);
00016   
00017   if((int)dosys.size()!=DEnsys)
00018     edm::LogError("L1Comparator") 
00019       << "wrong selection of systems to be compared\n"
00020       << "\t the size of the mask COMPARE_COLLS (" << dosys.size() 
00021       << ") is not " << DEnsys << std::endl;
00022   assert((int)dosys.size()==DEnsys);
00023   
00024   for(int isys=0; isys<DEnsys; isys++)
00025     if( dosys[isys]!=0 && dosys[isys]!=1 ) 
00026       throw cms::Exception("Invalid configuration") 
00027         << "L1Comparator: comparison flag for system " << isys 
00028         << " is non boolean: " << dosys[isys] << ". Exiting.\n";
00029     
00030   for(int i=0; i<DEnsys; i++)
00031     m_doSys[i] = dosys[i];
00032   
00033   if(verbose()) {
00034     std::cout << "[L1Comparator] do sys? ";
00035     for(int i=0; i<DEnsys; i++)
00036       std::cout << m_doSys[i] << " ";
00037     std::cout << std::endl;
00038 
00039     std::cout << "[L1Comparator] list of systems to process: ";
00040     for(int i=0; i<DEnsys; i++) 
00041       if(m_doSys[i]) 
00042         std::cout << SystLabel[i] << " ";
00043     std::cout << std::endl;
00044   }
00045 
00047   assert(ETP==0); assert(HTP==1); assert(RCT== 2); assert(GCT== 3);
00048   assert(DTP==4); assert(DTF==5); assert(CTP== 6); assert(CTF== 7);
00049   assert(RPC==8); assert(LTC==9); assert(GMT==10); assert(GLT==11);
00050 
00051   if(verbose())
00052     std::cout << "[L1Comparator] debug print collection labels\n";
00053 
00054   m_DEsource[RCT][0] = iConfig.getParameter<edm::InputTag>("RCTsourceData");
00055   m_DEsource[RCT][1] = iConfig.getParameter<edm::InputTag>("RCTsourceEmul");
00056 
00057   m_DEsource[GCT][0] = iConfig.getParameter<edm::InputTag>("GCTsourceData");
00058   m_DEsource[GCT][1] = iConfig.getParameter<edm::InputTag>("GCTsourceEmul");
00059 
00060   m_DEsource[DTP][0] = iConfig.getParameter<edm::InputTag>("DTPsourceData");
00061   m_DEsource[DTP][1] = iConfig.getParameter<edm::InputTag>("DTPsourceEmul");
00062 
00063   m_DEsource[DTF][0] = iConfig.getParameter<edm::InputTag>("DTFsourceData");
00064   m_DEsource[DTF][1] = iConfig.getParameter<edm::InputTag>("DTFsourceEmul");
00065 
00066   m_DEsource[RPC][0] = iConfig.getParameter<edm::InputTag>("RPCsourceData");
00067   m_DEsource[RPC][1] = iConfig.getParameter<edm::InputTag>("RPCsourceEmul");
00068 
00069   m_DEsource[GMT][0] = iConfig.getParameter<edm::InputTag>("GMTsourceData");
00070   m_DEsource[GMT][1] = iConfig.getParameter<edm::InputTag>("GMTsourceEmul");
00071 
00072   for(int sys=0; sys<DEnsys; sys++) {
00073     std::string data_label = SystLabel[sys] + "sourceData";
00074     std::string emul_label = SystLabel[sys] + "sourceEmul";
00075     //m_DEsource[sys][0] = iConfig.getParameter<edm::InputTag>(data_label);
00076     //m_DEsource[sys][1] = iConfig.getParameter<edm::InputTag>(emul_label);
00077     //if(sys==CTF) {
00078     //  std::string data_label(""); data_label+="CTTsourceData";
00079     //  std::string emul_label(""); emul_label+="CTTsourceEmul";
00080     //  m_DEsource[sys][2] = iConfig.getParameter<edm::InputTag>(data_label);
00081     //  m_DEsource[sys][3] = iConfig.getParameter<edm::InputTag>(emul_label);
00082     //}
00083     if(m_doSys[sys] && verbose()) {
00084       std::cout << " sys:"   << sys << " label:" << SystLabel[sys]  
00085                 << "\n\tdt:" << data_label << " : " <<m_DEsource[sys][0]
00086                 << "\n\tem:" << emul_label << " : " <<m_DEsource[sys][1]
00087                 << std::endl;
00088       if(sys==CTF) {
00089         std::cout << "\tdt:"     << data_label << " : " <<m_DEsource[sys][2]
00090                   << "\n\tem:" << emul_label << " : " <<m_DEsource[sys][3]
00091                   << std::endl;
00092       }
00093     }
00094   }
00095 
00096   
00098   m_dumpMode = iConfig.getUntrackedParameter<int>("DumpMode",0);  
00099   m_dumpFileName = iConfig.getUntrackedParameter<std::string>("DumpFile","");
00100   if(m_dumpMode) {
00101     m_dumpFile.open(m_dumpFileName.c_str(), std::ios::out);
00102     if(!m_dumpFile.good())
00103       edm::LogInfo("L1ComparatorDumpFileOpenError")
00104         << " L1Comparator::L1Comparator() : "
00105         << " couldn't open dump file " << m_dumpFileName.c_str() << std::endl;
00106   }
00107 
00108   m_match = true;
00109   dumpEvent_ = true;
00110   nevt_=-1;
00111 
00112   for(int i=0; i<DEnsys; i++) {
00113     for(int j=0; j<2; j++) 
00114       DEncand[i][j] = 0;
00115     DEmatchEvt[i] = true;
00116   }
00117 
00118   m_dedigis.clear();
00120   produces<L1DataEmulRecord>().setBranchAlias("L1DataEmulRecord");  
00121 
00122   if(verbose())
00123     std::cout << "\nL1Comparator constructor...done.\n" << std::flush;
00124 }
00125 
00126 
00127 L1Comparator::~L1Comparator(){}
00128 
00129 void L1Comparator::beginJob(void) {}
00130 
00131 void L1Comparator::beginRun(edm::Run const& iRun, const edm::EventSetup& iSetup) {
00132 
00133   if(verbose())
00134     std::cout << "\nL1COMPARATOR beginRun...\n" << std::flush;
00135 
00136 
00137   // disable subsystem if not included in current run configuration
00138   try 
00139     {
00140       edm::ESHandle< L1TriggerKey > pKey ;
00141       iSetup.get< L1TriggerKeyRcd >().get( pKey ) ;
00142 
00143       m_doSys[RCT] &= (!(pKey->subsystemKey( L1TriggerKey::kRCT)  .empty()));
00144       m_doSys[GCT] &= (!(pKey->subsystemKey( L1TriggerKey::kGCT)  .empty()));
00145       m_doSys[DTF] &= (!(pKey->subsystemKey( L1TriggerKey::kDTTF) .empty()));
00146       m_doSys[CTF] &= (!(pKey->subsystemKey( L1TriggerKey::kCSCTF).empty()));
00147       m_doSys[RPC] &= (!(pKey->subsystemKey( L1TriggerKey::kRPC)  .empty()));
00148       m_doSys[GMT] &= (!(pKey->subsystemKey( L1TriggerKey::kGMT)  .empty()));
00149       m_doSys[GLT] &= (!(pKey->subsystemKey( L1TriggerKey::kGT)   .empty()));
00150 
00151      if(verbose()) {
00152         if ( pKey->subsystemKey( L1TriggerKey::kRCT  ).empty() )
00153           std::cout << "RCT   key is empty. Sub-systems is disabled ("<<m_doSys[RCT]<<")\n";
00154         if ( pKey->subsystemKey( L1TriggerKey::kGCT  ).empty() )
00155           std::cout << "GCT   key is empty. Sub-systems is disabled ("<<m_doSys[GCT]<<")\n";
00156         if ( pKey->subsystemKey( L1TriggerKey::kDTTF ).empty() )
00157           std::cout << "DTTF  key is empty. Sub-systems is disabled ("<<m_doSys[DTF]<<")\n";
00158         if ( pKey->subsystemKey( L1TriggerKey::kCSCTF).empty() )
00159           std::cout << "CSCTF key is empty. Sub-systems is disabled ("<<m_doSys[CTF]<<")\n";
00160         if ( pKey->subsystemKey( L1TriggerKey::kRPC  ).empty() )
00161           std::cout << "RPC   key is empty. Sub-systems is disabled ("<<m_doSys[RPC]<<")\n";
00162         if ( pKey->subsystemKey( L1TriggerKey::kGMT  ).empty() )
00163           std::cout << "GMT   key is empty. Sub-systems is disabled ("<<m_doSys[GMT]<<")\n";
00164         if ( pKey->subsystemKey( L1TriggerKey::kGT   ).empty() )
00165           std::cout << "GT    key is empty. Sub-systems is disabled ("<<m_doSys[GLT]<<")\n";
00166         std::cout << "TSC key = " << pKey->tscKey() << std::endl; 
00167       }
00168 
00169       //access subsystem key if needed, eg:
00170       //std::cout << "RCT key:" << pKey->subsystemKey( L1TriggerKey::kRCT ) << std::endl;
00171     } 
00172   catch( cms::Exception& ex ) 
00173     {
00174       edm::LogWarning("L1Comparator") 
00175         << "No L1TriggerKey found." 
00176         << std::endl;
00177     }  
00178 
00179   if(verbose())
00180     std::cout << "L1COMPARATOR beginRun... done\n" << std::flush;
00181 
00182 }
00183 
00184 void L1Comparator::endJob() {
00185   if(m_dumpMode)
00186     m_dumpFile << "\n\n-------\n"
00187                << "Global data|emulator agreement: " 
00188                << m_match << std::endl;
00189   m_dumpFile.close();
00190 }
00191 
00192 void
00193 L1Comparator::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
00194 
00195   nevt_++;
00196   evtNum_ = iEvent.id().event();
00197   runNum_ = iEvent.id().run();
00198 
00199   if(verbose())
00200     std::cout << "\nL1COMPARATOR entry:" << nevt_ << " | evt:" << evtNum_ 
00201               << " | run:" << runNum_ << "\n" << std::flush;
00202 
00203   //flag whether event id has already been written to dumpFile
00204   dumpEvent_ = true;
00205 
00206   //reset event holder quantities
00207   for(int i=0; i<DEnsys; i++) {
00208     for(int j=0; j<2; j++) 
00209       DEncand[i][j] = 0;
00210     DEmatchEvt[i] = true;
00211   }
00212   m_dedigis.clear();
00213 
00214 
00216 
00217   // -- RCT [regional calorimeter trigger]
00218   edm::Handle<L1CaloEmCollection> rct_em_data;
00219   edm::Handle<L1CaloEmCollection> rct_em_emul;
00220   edm::Handle<L1CaloRegionCollection> rct_rgn_data;
00221   edm::Handle<L1CaloRegionCollection> rct_rgn_emul;
00222   if(m_doSys[RCT]) {
00223     iEvent.getByLabel(m_DEsource[RCT][0], rct_em_data);
00224     iEvent.getByLabel(m_DEsource[RCT][1], rct_em_emul);
00225     iEvent.getByLabel(m_DEsource[RCT][0], rct_rgn_data);
00226     iEvent.getByLabel(m_DEsource[RCT][1], rct_rgn_emul);
00227   }
00228 
00229   // -- GCT [global calorimeter trigger]
00230   edm::Handle<L1GctEmCandCollection>  gct_isolaem_data;
00231   edm::Handle<L1GctEmCandCollection>  gct_isolaem_emul;
00232   edm::Handle<L1GctEmCandCollection>  gct_noisoem_data;
00233   edm::Handle<L1GctEmCandCollection>  gct_noisoem_emul;
00234   edm::Handle<L1GctJetCandCollection> gct_cenjets_data;
00235   edm::Handle<L1GctJetCandCollection> gct_cenjets_emul;
00236   edm::Handle<L1GctJetCandCollection> gct_forjets_data;
00237   edm::Handle<L1GctJetCandCollection> gct_forjets_emul;
00238   edm::Handle<L1GctJetCandCollection> gct_taujets_data;
00239   edm::Handle<L1GctJetCandCollection> gct_taujets_emul;
00240 
00241   edm::Handle<L1GctEtHadCollection>       gct_ht_data;
00242   edm::Handle<L1GctEtHadCollection>       gct_ht_emul;
00243   edm::Handle<L1GctEtMissCollection>      gct_etmiss_data;
00244   edm::Handle<L1GctEtMissCollection>      gct_etmiss_emul;
00245   edm::Handle<L1GctEtTotalCollection>     gct_ettota_data;
00246   edm::Handle<L1GctEtTotalCollection>     gct_ettota_emul;
00247   edm::Handle<L1GctHtMissCollection>      gct_htmiss_data;
00248   edm::Handle<L1GctHtMissCollection>      gct_htmiss_emul;
00249   edm::Handle<L1GctHFRingEtSumsCollection>gct_hfring_data;
00250   edm::Handle<L1GctHFRingEtSumsCollection>gct_hfring_emul;
00251   edm::Handle<L1GctHFBitCountsCollection> gct_hfbcnt_data;
00252   edm::Handle<L1GctHFBitCountsCollection> gct_hfbcnt_emul;
00253   edm::Handle<L1GctJetCountsCollection>   gct_jetcnt_data;  
00254   edm::Handle<L1GctJetCountsCollection>   gct_jetcnt_emul;
00255 
00256   if(m_doSys[GCT]) {
00257    iEvent.getByLabel(m_DEsource[GCT][0].label(),"isoEm",   gct_isolaem_data);
00258    iEvent.getByLabel(m_DEsource[GCT][1].label(),"isoEm",   gct_isolaem_emul);
00259    iEvent.getByLabel(m_DEsource[GCT][0].label(),"nonIsoEm",gct_noisoem_data);
00260    iEvent.getByLabel(m_DEsource[GCT][1].label(),"nonIsoEm",gct_noisoem_emul);
00261    iEvent.getByLabel(m_DEsource[GCT][0].label(),"cenJets", gct_cenjets_data);
00262    iEvent.getByLabel(m_DEsource[GCT][1].label(),"cenJets", gct_cenjets_emul);
00263    iEvent.getByLabel(m_DEsource[GCT][0].label(),"forJets", gct_forjets_data);
00264    iEvent.getByLabel(m_DEsource[GCT][1].label(),"forJets", gct_forjets_emul);
00265    iEvent.getByLabel(m_DEsource[GCT][0].label(),"tauJets", gct_taujets_data);
00266    iEvent.getByLabel(m_DEsource[GCT][1].label(),"tauJets", gct_taujets_emul);
00267 
00268    iEvent.getByLabel(m_DEsource[GCT][0],gct_ht_data);     
00269    iEvent.getByLabel(m_DEsource[GCT][1],gct_ht_emul);    
00270    iEvent.getByLabel(m_DEsource[GCT][0],gct_etmiss_data);  
00271    iEvent.getByLabel(m_DEsource[GCT][1],gct_etmiss_emul);
00272    iEvent.getByLabel(m_DEsource[GCT][0],gct_ettota_data);         
00273    iEvent.getByLabel(m_DEsource[GCT][1],gct_ettota_emul); 
00274    iEvent.getByLabel(m_DEsource[GCT][0],gct_htmiss_data);  
00275    iEvent.getByLabel(m_DEsource[GCT][1],gct_htmiss_emul);
00276    iEvent.getByLabel(m_DEsource[GCT][0],gct_hfring_data);
00277    iEvent.getByLabel(m_DEsource[GCT][1],gct_hfring_emul);
00278    iEvent.getByLabel(m_DEsource[GCT][0],gct_hfbcnt_data);
00279    iEvent.getByLabel(m_DEsource[GCT][1],gct_hfbcnt_emul);
00280    iEvent.getByLabel(m_DEsource[GCT][0],gct_jetcnt_data);  
00281    iEvent.getByLabel(m_DEsource[GCT][1],gct_jetcnt_emul);
00282   }
00283 
00284   // -- DTP [drift tube trigger primitive]
00285   edm::Handle<L1MuDTChambPhContainer> dtp_ph_data_;
00286   edm::Handle<L1MuDTChambPhContainer> dtp_ph_emul_;
00287   edm::Handle<L1MuDTChambThContainer> dtp_th_data_;
00288   edm::Handle<L1MuDTChambThContainer> dtp_th_emul_;
00289   if(m_doSys[DTP]) {
00290     iEvent.getByLabel(m_DEsource[DTP][0],dtp_ph_data_);
00291     iEvent.getByLabel(m_DEsource[DTP][1],dtp_ph_emul_);
00292     iEvent.getByLabel(m_DEsource[DTP][0],dtp_th_data_);
00293     iEvent.getByLabel(m_DEsource[DTP][1],dtp_th_emul_);
00294   }
00295   L1MuDTChambPhDigiCollection const* dtp_ph_data = 0; 
00296   L1MuDTChambPhDigiCollection const* dtp_ph_emul = 0; 
00297   L1MuDTChambThDigiCollection const* dtp_th_data = 0; 
00298   L1MuDTChambThDigiCollection const* dtp_th_emul = 0; 
00299 
00300   if(dtp_ph_data_.isValid()) dtp_ph_data = dtp_ph_data_->getContainer();
00301   if(dtp_ph_emul_.isValid()) dtp_ph_emul = dtp_ph_emul_->getContainer();
00302   if(dtp_th_data_.isValid()) dtp_th_data = dtp_th_data_->getContainer();
00303   if(dtp_th_emul_.isValid()) dtp_th_emul = dtp_th_emul_->getContainer();
00304 
00305   // -- DTF [drift tube track finder]
00306   edm::Handle<L1MuDTTrackContainer>       dtf_trk_data_;
00307   edm::Handle<L1MuDTTrackContainer>       dtf_trk_emul_;
00308   L1MuRegionalCandCollection const* dtf_trk_data = 0;
00309   L1MuRegionalCandCollection const* dtf_trk_emul = 0;
00310   if(m_doSys[DTF]) {
00311     iEvent.getByLabel(m_DEsource[DTF][0].label(),"DATA",dtf_trk_data_);
00312     iEvent.getByLabel(m_DEsource[DTF][1].label(),"DTTF",dtf_trk_emul_);
00313   } 
00314   //extract the regional cands
00315   typedef std::vector<L1MuDTTrackCand> L1MuDTTrackCandCollection;
00316   L1MuRegionalCandCollection dtf_trk_data_v, dtf_trk_emul_v;
00317   dtf_trk_data_v.clear(); dtf_trk_emul_v.clear();
00318   if(dtf_trk_data_.isValid()) {
00319     L1MuDTTrackCandCollection *dttc = dtf_trk_data_->getContainer();
00320     for(L1MuDTTrackCandCollection::const_iterator  it=dttc->begin(); 
00321         it!=dttc->end(); it++)
00322       dtf_trk_data_v.push_back(L1MuRegionalCand(*it)); 
00323   }
00324   if(dtf_trk_emul_.isValid()) {
00325     L1MuDTTrackCandCollection *dttc = dtf_trk_emul_->getContainer();
00326     for(L1MuDTTrackCandCollection::const_iterator  it=dttc->begin(); 
00327         it!=dttc->end(); it++)
00328       dtf_trk_emul_v.push_back(L1MuRegionalCand(*it)); 
00329   }  
00330   dtf_trk_data =&dtf_trk_data_v;
00331   dtf_trk_emul =&dtf_trk_emul_v;
00332   
00333   
00334   // -- RPC [resistive plate chambers regional trigger] 
00335   edm::Handle<L1MuRegionalCandCollection> rpc_cen_data;
00336   edm::Handle<L1MuRegionalCandCollection> rpc_cen_emul;
00337   edm::Handle<L1MuRegionalCandCollection> rpc_for_data;
00338   edm::Handle<L1MuRegionalCandCollection> rpc_for_emul;
00339   if(m_doSys[RPC]) {
00340     iEvent.getByLabel(m_DEsource[RPC][0].label(),"RPCb",rpc_cen_data);
00341     iEvent.getByLabel(m_DEsource[RPC][1].label(),"RPCb",rpc_cen_emul);
00342     iEvent.getByLabel(m_DEsource[RPC][0].label(),"RPCf",rpc_for_data);
00343     iEvent.getByLabel(m_DEsource[RPC][1].label(),"RPCf",rpc_for_emul);
00344   } 
00345 
00346   // -- LTC [local trigger controller]
00347   edm::Handle<LTCDigiCollection> ltc_data;
00348   edm::Handle<LTCDigiCollection> ltc_emul;
00349   if(m_doSys[LTC]) {
00350     iEvent.getByLabel(m_DEsource[LTC][0],ltc_data);
00351     iEvent.getByLabel(m_DEsource[LTC][1],ltc_emul);
00352   }
00353 
00354   // -- GMT [global muon trigger]
00355   edm::Handle<L1MuGMTCandCollection> gmt_data;
00356   edm::Handle<L1MuGMTCandCollection> gmt_emul;
00357   edm::Handle<L1MuGMTReadoutCollection> gmt_rdt_data_;
00358   edm::Handle<L1MuGMTReadoutCollection> gmt_rdt_emul_;
00359   L1MuRegionalCandCollection const* gmt_rdt_data(new L1MuRegionalCandCollection);
00360   L1MuRegionalCandCollection const* gmt_rdt_emul(new L1MuRegionalCandCollection);
00361   //tbd: may compare extended candidates
00362   L1MuGMTCandCollection const *gmt_can_data(new L1MuGMTCandCollection);
00363   L1MuGMTCandCollection const *gmt_can_emul(new L1MuGMTCandCollection);
00364   if(m_doSys[GMT]) {
00365     iEvent.getByLabel(m_DEsource[GMT][0], gmt_data);
00366     iEvent.getByLabel(m_DEsource[GMT][1], gmt_emul);
00367     iEvent.getByLabel(m_DEsource[GMT][0], gmt_rdt_data_);
00368     iEvent.getByLabel(m_DEsource[GMT][1], gmt_rdt_emul_);
00369   }  
00370   L1MuGMTCandCollection      gmt_can_data_vec, gmt_can_emul_vec;
00371   L1MuRegionalCandCollection gmt_rdt_data_vec, gmt_rdt_emul_vec;
00372   gmt_can_data_vec.clear();  gmt_can_emul_vec.clear();
00373   gmt_rdt_data_vec.clear();  gmt_rdt_emul_vec.clear();
00374   if( gmt_rdt_data_.isValid() && gmt_rdt_emul_.isValid() ) {
00375     typedef std::vector<L1MuGMTReadoutRecord>::const_iterator GmtRrIt;
00376     //get record vector for data 
00377     std::vector<L1MuGMTReadoutRecord> gmt_rdt_data_bx = gmt_rdt_data_->getRecords();
00378     for(GmtRrIt igmtrr=gmt_rdt_data_bx.begin(); igmtrr!=gmt_rdt_data_bx.end(); igmtrr++) {
00379       //get gmt cands
00380       typedef std::vector<L1MuGMTExtendedCand>::const_iterator GmtECIt;
00381       std::vector<L1MuGMTExtendedCand> gmc;
00382       gmc = igmtrr->getGMTCands();
00383       for(GmtECIt iter1=gmc.begin(); iter1!=gmc.end(); iter1++) {
00384         L1MuGMTCand cand(iter1->getDataWord(),iter1->bx());
00385         cand.setPhiValue(iter1->phiValue());
00386         cand.setEtaValue(iter1->etaValue());
00387         cand.setPtValue (iter1->ptValue ());
00388         gmt_can_data_vec.push_back(cand);
00389       }
00390       //get reg cands
00391       typedef L1MuRegionalCandCollection::const_iterator GmtRCIt;
00392       L1MuRegionalCandCollection rmc;
00393       rmc.clear();
00394       rmc = igmtrr->getDTBXCands();
00395       gmt_rdt_data_vec.insert(gmt_rdt_data_vec.end(),rmc.begin(),rmc.end());
00396       rmc.clear();
00397       rmc = igmtrr->getCSCCands();
00398       gmt_rdt_data_vec.insert(gmt_rdt_data_vec.end(),rmc.begin(),rmc.end());
00399       rmc.clear();
00400       rmc = igmtrr->getBrlRPCCands();
00401       gmt_rdt_data_vec.insert(gmt_rdt_data_vec.end(),rmc.begin(),rmc.end());
00402       rmc.clear();
00403       rmc = igmtrr->getFwdRPCCands();
00404       gmt_rdt_data_vec.insert(gmt_rdt_data_vec.end(),rmc.begin(),rmc.end());
00405     }
00406     //get record vector for emul 
00407     std::vector<L1MuGMTReadoutRecord> gmt_rdt_emul_bx = gmt_rdt_emul_->getRecords();
00408     for(GmtRrIt igmtrr=gmt_rdt_emul_bx.begin(); igmtrr!=gmt_rdt_emul_bx.end(); igmtrr++) {
00409       //get gmt cands
00410       typedef std::vector<L1MuGMTExtendedCand>::const_iterator GmtECIt;
00411       std::vector<L1MuGMTExtendedCand> gmc;
00412       gmc = igmtrr->getGMTCands();
00413       for(GmtECIt iter1=gmc.begin(); iter1!=gmc.end(); iter1++) {
00414         gmt_can_emul_vec.push_back(L1MuGMTCand(iter1->getDataWord(),iter1->bx()));
00415       }
00416       //get reg cands
00417       typedef L1MuRegionalCandCollection::const_iterator GmtRCIt;
00418       L1MuRegionalCandCollection rmc;
00419       rmc.clear();
00420       rmc = igmtrr->getDTBXCands();
00421       gmt_rdt_emul_vec.insert(gmt_rdt_emul_vec.end(),rmc.begin(),rmc.end());
00422       rmc.clear();
00423       rmc = igmtrr->getCSCCands();
00424       gmt_rdt_emul_vec.insert(gmt_rdt_emul_vec.end(),rmc.begin(),rmc.end());
00425       rmc.clear();
00426       rmc = igmtrr->getBrlRPCCands();
00427       gmt_rdt_emul_vec.insert(gmt_rdt_emul_vec.end(),rmc.begin(),rmc.end());
00428       rmc.clear();
00429       rmc = igmtrr->getFwdRPCCands();
00430       gmt_rdt_emul_vec.insert(gmt_rdt_emul_vec.end(),rmc.begin(),rmc.end());
00431     }
00432   }
00433   gmt_rdt_data = &gmt_rdt_data_vec;
00434   gmt_rdt_emul = &gmt_rdt_emul_vec;
00435   gmt_can_data = &gmt_can_data_vec;
00436   gmt_can_emul = &gmt_can_emul_vec;
00437 
00439 
00440   //check collections validity
00441   bool isValidDE[DEnsys][2];// = {false};
00442   for(int i=0; i<DEnsys; i++) for(int j=0; j<2; j++) isValidDE[i][j]=false;
00443 
00444   isValidDE[RCT][0] =      rct_em_data .isValid(); isValidDE[RCT][1] =     rct_em_emul .isValid();
00445   isValidDE[RCT][0]&=     rct_rgn_data .isValid(); isValidDE[RCT][1] =    rct_rgn_emul .isValid();
00446 
00447   isValidDE[GCT][0] = gct_isolaem_data .isValid(); isValidDE[GCT][1] =gct_isolaem_emul .isValid();
00448   isValidDE[GCT][0]&= gct_noisoem_data .isValid(); isValidDE[GCT][1]&=gct_noisoem_emul .isValid();
00449   isValidDE[GCT][0]&= gct_cenjets_data .isValid(); isValidDE[GCT][1]&=gct_cenjets_emul .isValid();
00450   isValidDE[GCT][0]&= gct_forjets_data .isValid(); isValidDE[GCT][1]&=gct_forjets_emul .isValid();
00451   isValidDE[GCT][0]&= gct_taujets_data .isValid(); isValidDE[GCT][1]&=gct_taujets_emul .isValid();
00452   isValidDE[GCT][0]&=  gct_etmiss_data .isValid(); isValidDE[GCT][1]&= gct_etmiss_emul .isValid();
00453   isValidDE[GCT][0]&=  gct_ettota_data .isValid(); isValidDE[GCT][1]&= gct_ettota_emul .isValid();
00454   isValidDE[GCT][0]&=  gct_htmiss_data .isValid(); isValidDE[GCT][1]&= gct_htmiss_emul .isValid();
00455   isValidDE[GCT][0]&=  gct_hfring_data .isValid(); isValidDE[GCT][1]&= gct_hfring_emul .isValid();
00456   isValidDE[GCT][0]&=  gct_hfbcnt_data .isValid(); isValidDE[GCT][1]&= gct_hfbcnt_emul .isValid();
00457 //isValidDE[GCT][0]&=  gct_jetcnt_data .isValid(); isValidDE[GCT][1]&= gct_jetcnt_emul .isValid(); #temporary
00458 
00459   isValidDE[DTP][0] =      dtp_ph_data_.isValid(); isValidDE[DTP][1] =     dtp_ph_emul_.isValid();
00460   isValidDE[DTP][0]&=      dtp_th_data_.isValid(); isValidDE[DTP][1]&=     dtp_th_emul_.isValid();
00461 
00462   isValidDE[DTF][0] =     dtf_trk_data_.isValid(); isValidDE[DTF][1] =    dtf_trk_emul_.isValid();
00463 
00464   isValidDE[RPC][0] =     rpc_cen_data .isValid(); isValidDE[RPC][1] =    rpc_cen_emul .isValid();
00465   isValidDE[RPC][0]&=     rpc_for_data .isValid(); isValidDE[RPC][1]&=    rpc_for_emul .isValid();
00466 
00467   isValidDE[LTC][0] =         ltc_data .isValid(); isValidDE[LTC][1] =        ltc_emul .isValid();
00468 
00469   isValidDE[GMT][0] =         gmt_data .isValid(); isValidDE[GMT][1] =        gmt_emul .isValid();
00470 //isValidDE[GMT][0]&=     gmt_rdt_data_.isValid(); isValidDE[GMT][1]&=    gmt_rdt_emul_.isValid();
00471 
00472 
00473   bool isValid[DEnsys];
00474   for(int i=0; i<DEnsys; i++) {
00475     isValid[i]=true;
00476     for(int j=0; j<2; j++) {
00477       isValid[i] &= isValidDE[i][j];
00478     }
00479   }
00480 
00481   if(verbose()) {
00482     std::cout << "L1Comparator sys isValid?  (evt:" << nevt_ << ") ";
00483     std::cout << "\n\t&: ";
00484     for(int i=0; i<DEnsys; i++)
00485       std::cout << isValid[i] << " ";
00486     std::cout << "\n\td: ";
00487     for(int i=0; i<DEnsys; i++)
00488       std::cout << isValidDE[i][0] << " ";
00489     std::cout << "\n\te: ";
00490     for(int i=0; i<DEnsys; i++)
00491       std::cout << isValidDE[i][1] << " ";
00492     std::cout << std::endl;
00493   }
00494   
00495   //reset flags...
00496   //for(int i=0; i<DEnsys; i++) isValid[i]=true;
00497 
00498   if(verbose())
00499     std::cout << "L1Comparator start processing the collections.\n" << std::flush;
00500 
00502   if(m_doSys[RCT]&&isValid[RCT]) process<L1CaloEmCollection>             (     rct_em_data,      rct_em_emul, RCT,RCTem);
00503   if(m_doSys[RCT]&&isValid[RCT]) process<L1CaloRegionCollection>         (    rct_rgn_data,     rct_rgn_emul, RCT,RCTrgn);
00504 
00505   if(m_doSys[GCT]&&isValid[GCT]) process<L1GctEmCandCollection>          (gct_isolaem_data, gct_isolaem_emul, GCT,GCTisolaem);
00506   if(m_doSys[GCT]&&isValid[GCT]) process<L1GctEmCandCollection>          (gct_noisoem_data, gct_noisoem_emul, GCT,GCTnoisoem);
00507   if(m_doSys[GCT]&&isValid[GCT]) process<L1GctJetCandCollection>         (gct_cenjets_data, gct_cenjets_emul, GCT,GCTcenjets);
00508   if(m_doSys[GCT]&&isValid[GCT]) process<L1GctJetCandCollection>         (gct_forjets_data, gct_forjets_emul, GCT,GCTforjets);
00509   if(m_doSys[GCT]&&isValid[GCT]) process<L1GctJetCandCollection>         (gct_taujets_data, gct_taujets_emul, GCT,GCTtaujets);
00510   if(m_doSys[GCT]&&isValid[GCT]) process<L1GctEtHadCollection>           (     gct_ht_data,      gct_ht_emul, GCT,GCTethad);
00511   if(m_doSys[GCT]&&isValid[GCT]) process<L1GctEtMissCollection>          ( gct_etmiss_data,  gct_etmiss_emul, GCT,GCTetmiss);
00512   if(m_doSys[GCT]&&isValid[GCT]) process<L1GctEtTotalCollection>         ( gct_ettota_data , gct_ettota_emul, GCT,GCTettot);
00513   if(m_doSys[GCT]&&isValid[GCT]) process<L1GctHtMissCollection>          ( gct_htmiss_data,  gct_htmiss_emul, GCT,GCThtmiss);
00514   if(m_doSys[GCT]&&isValid[GCT]) process<L1GctHFRingEtSumsCollection>    ( gct_hfring_data,  gct_hfring_emul, GCT,GCThfring);
00515   if(m_doSys[GCT]&&isValid[GCT]) process<L1GctHFBitCountsCollection>     ( gct_hfbcnt_data,  gct_hfbcnt_emul, GCT,GCThfbit);
00516 //if(m_doSys[GCT]&&isValid[GCT]) process<L1GctJetCountsCollection>       ( gct_jetcnt_data,  gct_jetcnt_emul, GCT,GCTjetcnt);#missing in emulator
00517 
00518   if(m_doSys[DTP]&&isValid[DTP]) process<L1MuDTChambPhDigiCollection>    (     dtp_ph_data,      dtp_ph_emul, DTP,DTtpPh);
00519   if(m_doSys[DTP]&&isValid[DTP]) process<L1MuDTChambThDigiCollection>    (     dtp_th_data,      dtp_th_emul, DTP,DTtpTh);
00520 
00521   if(m_doSys[DTF]&&isValid[DTF]) process<L1MuRegionalCandCollection>     (    dtf_trk_data,     dtf_trk_emul, DTF,DTtftrk);
00522 
00523   if(m_doSys[RPC]&&isValid[RPC]) process<L1MuRegionalCandCollection>     (    rpc_cen_data,     rpc_cen_emul, RPC,RPCcen);
00524   if(m_doSys[RPC]&&isValid[RPC]) process<L1MuRegionalCandCollection>     (    rpc_for_data,     rpc_for_emul, RPC,RPCfor);
00525 
00526   if(m_doSys[GMT]&&isValid[GMT]) process<L1MuGMTCandCollection>          (        gmt_data,         gmt_emul, GMT,GMTmain);
00527   if(m_doSys[GMT]&&isValid[GMT]) process<L1MuRegionalCandCollection>     (    gmt_rdt_data,     gmt_rdt_emul, GMT,GMTrdt);
00528   if(m_doSys[GMT]&&isValid[GMT]) process<L1MuGMTCandCollection>          (    gmt_can_data,     gmt_can_emul, GMT,GMTcnd);
00529 
00530   // >>---- GLT ---- <<  
00531   GltDEDigi gltdigimon;
00532   
00533 
00534   if(verbose())
00535     std::cout << "L1Comparator done processing all collections.\n" << std::flush;
00536 
00537   if(verbose()) {
00538     std::cout << "[L1Comparator] sys match? << evt." << nevt_ << ": ";
00539     for(int i=0; i<DEnsys; i++)
00540       std::cout << DEmatchEvt[i] << " ";
00541     std::cout << std::endl;
00542   }
00543 
00544 
00545   // >>---- Event match? ---- <<  
00546 
00547   bool evt_match  = true;
00548   for(int i=0; i<DEnsys; i++)
00549     evt_match &= DEmatchEvt[i];
00550 
00551   
00552   /* char ok[10];
00553      if(evt_match) sprintf(ok,"GOOD :]");
00554      else      sprintf(ok,"BAD !!!"); 
00555      char dumptofile[1000];
00556      sprintf(dumptofile,"\n -> event data and emulator match... %s\n", ok);
00557      m_dumpFile<<dumptofile;
00558   */
00559 
00560   // >>---- Global match? ---- <<  
00561   m_match &= evt_match;
00562   m_dumpFile << std::flush;
00563 
00564   //if collection is empty, add empty digi
00565   if(m_dedigis.size()==0) {
00566     if(verbose())
00567       std::cout << "\n [L1Comparator] adding empty collection to DErecord\n";
00568     m_dedigis.push_back(L1DataEmulDigi());
00569   }
00570   
00571   // >>---- d|e record ---- <<  
00572   std::auto_ptr<L1DataEmulRecord> record
00573     (new L1DataEmulRecord(evt_match,m_doSys,DEmatchEvt,DEncand,m_dedigis, gltdigimon));
00574   if(verbose()) {
00575     std::cout << "\n [L1Comparator] printing DErecord" 
00576               << "(entry:"<< nevt_ 
00577               << "|evt:"  << evtNum_
00578               << "|run:"  << runNum_ 
00579               << "):\n"    << std::flush;
00580     std::cout << *record 
00581               << "\n" << std::flush;
00582   }
00583 
00584   iEvent.put(record);
00585   
00586   if(verbose())
00587     std::cout << "L1comparator::analize() end. " << nevt_ << std::endl;
00588   
00589 }
00590 
00591 
00592 template <class T> 
00593 void L1Comparator::process(T const* data, T const* emul, const int sys, const int cid) {
00594 
00595   if(verbose())
00596     std::cout << "L1Comparator::process -ing system:" << sys 
00597               << " (" << SystLabel[sys] << "), data type " << cid 
00598               << "...\n" << std::flush;
00599   if(verbose())
00600   std::cout << "L1Comparator::process debug "
00601             << " (size "  << data->size() << "," <<emul->size() << ")"   
00602             << ".\n" << std::flush;
00603 
00605   bool prt = false; 
00606   if(!m_dumpMode)
00607     prt = false;
00608   else if(m_dumpMode==-1)
00609     prt=true;
00610   else if(m_dumpMode>0) {
00611     DEcompare<T> tmp(data,emul);
00612     if(tmp.get_ncand(0)==0 && tmp.get_ncand(1)==0)
00613       prt=false;
00614     else
00615     prt = !tmp.do_compare(m_dumpFile,0);
00616   }
00617 
00618   //declare de compare object
00619   DEcompare<T> cmp(data,emul);
00620 
00621   int ndata = cmp.get_ncand(0);
00622   int nemul = cmp.get_ncand(1);
00623   
00624   if(verbose())
00625     std::cout << "L1Comparator::process " 
00626               << " system:" << SystLabel[sys] << "(id " << sys << ")" 
00627               << " type:"   << cmp.GetName(0) << "(" << cmp.de_type() << ")"
00628               << " ndata:"  << ndata
00629               << " nemul:"  << nemul
00630               << " (size "  << data->size() << "," <<emul->size() << ")"   
00631               << ".\n" << std::flush;
00632   
00633   if(ndata==0&&nemul==0) {
00634     if(verbose())
00635       std::cout << "L1Comparator::process " 
00636                 << "empty collections -- exiting!\n" << std::flush;
00637     return;
00638   }
00639   
00640   m_dumpFile << std::setiosflags(std::ios::showpoint | std::ios::fixed 
00641                                  | std::ios::right | std::ios::adjustfield);
00642   std::cout  << std::setiosflags(std::ios::showpoint | std::ios::fixed 
00643                                  | std::ios::right | std::ios::adjustfield);
00644   
00645   if(dumpEvent_ &&  prt ) {
00646     m_dumpFile << "\nEntry: " << nevt_ 
00647                << " (event:"  << evtNum_
00648                << " | run:"   << runNum_ 
00649                << ")\n"       << std::flush;
00650     dumpEvent_=false;
00651   }
00652   
00653   if(prt)
00654     m_dumpFile << "\n  sys:" << SystLabel[sys] 
00655                << " (" << sys << "), type:" << cid //cmp.GetName() 
00656                << " ...\n";
00657   
00658   if(verbose())
00659     std::cout << "L1Comparator::process print:\n" << std::flush
00660               << cmp.print()
00661               << std::flush;
00662   
00664   DEmatchEvt[sys] &= cmp.do_compare(m_dumpFile,m_dumpMode);
00665   
00667   L1DEDigiCollection dg = cmp.getDEDigis();
00668 
00669   if(verbose())
00670     for(L1DEDigiCollection::iterator it=dg.begin(); it!=dg.end();it++)
00671       std::cout << *it << "\n";
00672 
00674   for(L1DEDigiCollection::iterator it=dg.begin(); it!=dg.end();it++)
00675     it->setSid(sys);
00677   for(L1DEDigiCollection::iterator it=dg.begin(); it!=dg.end();it++)
00678     it->setCid(cid);
00679 
00681   m_dedigis.insert(m_dedigis.end(), dg.begin(), dg.end()); 
00682   for(int i=0; i<2; i++)
00683     DEncand[sys][i] += cmp.get_ncand(i);
00684 
00685   if(verbose())
00686     std::cout << "L1Comparator::process " 
00687               << " system:" << SystLabel[sys] 
00688               << " type:"   << cmp.GetName(0) 
00689               << " ndata:"  << DEncand[sys][0]
00690               << " nemul:"  << DEncand[sys][1]
00691               << " (size "  << data->size() << "," <<emul->size() << ")"   
00692               << " ndigis:" << dg.size()
00693               << " agree? " << DEmatchEvt[sys]
00694               << std::endl;
00695 
00696   if(verbose())
00697     std::cout << "L1Comparator::process -ing system:" 
00698               << sys << " (" << SystLabel[sys] << ")...done.\n" 
00699               << std::flush;
00700 }
00701 
00702 template <class myCol> 
00703 bool L1Comparator::CompareCollections( edm::Handle<myCol> data, edm::Handle<myCol> emul) {
00704   bool match = true;
00705   typedef typename myCol::size_type col_sz;
00706   typedef typename myCol::iterator col_it;
00707   col_sz ndata = data->size();
00708   col_sz nemul = emul->size();
00709   if(ndata!=nemul) {
00710     match &= false;
00711     m_dumpFile << " #cand mismatch!"
00712                << "\tdata: " << ndata
00713                << "\temul: " << nemul
00714                << std::endl;
00715   }
00716   col_it itd = data -> begin();
00717   col_it itm = emul -> begin();
00718   for (col_sz i=0; i<ndata; i++) {
00719     match &= dumpCandidate(*itd++,*itm++, m_dumpFile);
00720   }  
00721   return match; 
00722 }
00723 
00724 template <class T> 
00725 bool L1Comparator::dumpCandidate( const T& dt, const T& em, std::ostream& s) {
00726   if(dt==em)
00727     return true;
00728   s<<dt<<std::endl; 
00729   s<<em<<std::endl<<std::endl;
00730   return false;
00731 }