CMS 3D CMS Logo

CSCTFSectorProcessor.cc

Go to the documentation of this file.
00001 #include <L1Trigger/CSCTrackFinder/interface/CSCTFSectorProcessor.h>
00002 #include <L1Trigger/CSCTrackFinder/interface/CSCTrackFinderDataTypes.h>
00003 #include <DataFormats/MuonDetId/interface/CSCTriggerNumbering.h>
00004 
00005 #include <FWCore/MessageLogger/interface/MessageLogger.h>
00006 
00007 #include "CondFormats/L1TObjects/interface/L1MuCSCTFConfiguration.h"
00008 #include "CondFormats/DataRecord/interface/L1MuCSCTFConfigurationRcd.h"
00009 #include "FWCore/Framework/interface/ESHandle.h"
00010 #include <stdlib.h>
00011 #include <sstream>
00012 
00013 const std::string CSCTFSectorProcessor::FPGAs[5] = {"F1","F2","F3","F4","F5"};
00014 
00015 CSCTFSectorProcessor::CSCTFSectorProcessor(const unsigned& endcap,
00016                                            const unsigned& sector,
00017                                            const edm::ParameterSet& pset,
00018                                            bool tmb07,
00019                                            const L1MuTriggerScales* scales,
00020                                            const L1MuTriggerPtScale* ptScale)
00021 {
00022   m_endcap = endcap;
00023   m_sector = sector;
00024   TMB07    = tmb07;
00025 
00026   // Parameter below should always present in ParameterSet:
00027   m_latency = pset.getParameter<unsigned>("CoreLatency");
00028   m_minBX = pset.getParameter<int>("MinBX");
00029   m_maxBX = pset.getParameter<int>("MaxBX");
00030   initializeFromPSet = pset.getParameter<bool>("initializeFromPSet");
00031   if( m_maxBX-m_minBX >= 7 ) edm::LogWarning("CSCTFTrackBuilder::ctor")<<" BX window width >= 7BX. Resetting m_maxBX="<<(m_maxBX=m_minBX+6);
00032 
00033   // All following parameters may appear in either ParameterSet of in EventSetup; uninitialize:
00034   m_bxa_depth = -1;
00035   m_allowALCTonly = -1;
00036   m_allowCLCTonly = -1;
00037   m_preTrigger = -1;
00038 
00039   for(int index=0; index<6; index++) m_etawin[index] = -1;
00040   for(int index=0; index<8; index++) m_etamin[index] = -1;
00041   for(int index=0; index<8; index++) m_etamax[index] = -1;
00042 
00043   m_mindphip=-1;
00044   m_mindeta_accp=-1;
00045   m_maxdeta_accp=-1;
00046   m_maxdphi_accp=-1;
00047 
00048   kill_fiber = -1;
00049   QualityEnableME1a = -1;
00050   QualityEnableME1b = -1;
00051   QualityEnableME1c = -1;
00052   QualityEnableME1d = -1;
00053   QualityEnableME1e = -1;
00054   QualityEnableME1f = -1;
00055   QualityEnableME2a = -1;
00056   QualityEnableME2b = -1;
00057   QualityEnableME2c = -1;
00058   QualityEnableME3a = -1;
00059   QualityEnableME3b = -1;
00060   QualityEnableME3c = -1;
00061   QualityEnableME4a = -1;
00062   QualityEnableME4b = -1;
00063   QualityEnableME4c = -1;
00064 
00065   run_core = -1;
00066   trigger_on_ME1a = -1;
00067   trigger_on_ME1b = -1;
00068   trigger_on_ME2  = -1;
00069   trigger_on_ME3  = -1;
00070   trigger_on_ME4  = -1;
00071   trigger_on_MB1a = -1;
00072   trigger_on_MB1d = -1;
00073   singlesTrackPt  = -1;
00074   singlesTrackOutput = -1;
00075 
00076   if(initializeFromPSet) readParameters(pset);
00077 
00078     edm::ParameterSet srLUTset = pset.getParameter<edm::ParameterSet>("SRLUT");
00079     for(int i = 1; i <= 4; ++i)
00080       {
00081         if(i == 1)
00082           for(int j = 0; j < 2; j++)
00083           {
00084             srLUTs_[FPGAs[j]] = new CSCSectorReceiverLUT(endcap, sector, j+1, i, srLUTset, TMB07);
00085               }
00086           else
00087             srLUTs_[FPGAs[i]] = new CSCSectorReceiverLUT(endcap, sector, 0, i, srLUTset, TMB07);
00088       }
00089 
00090   core_ = new CSCTFSPCoreLogic();
00091 
00092   if(initializeFromPSet){
00093     edm::ParameterSet ptLUTset = pset.getParameter<edm::ParameterSet>("PTLUT");
00094     ptLUT_ = new CSCTFPtLUT(ptLUTset, scales, ptScale);
00095     LogDebug("CSCTFSectorProcessor") << "Using stand-alone PT LUT for endcap="<<m_endcap<<", sector="<<m_sector;
00096   } else {
00097     ptLUT_=0;
00098     LogDebug("CSCTFSectorProcessor") << "Looking for PT LUT in EventSetup for endcap="<<m_endcap<<", sector="<<m_sector;
00099   }
00100 }
00101 
00102 void CSCTFSectorProcessor::initialize(const edm::EventSetup& c){
00103   if(!initializeFromPSet){
00104     // Only pT lut can be initialized from EventSetup, all front LUTs are initialized locally from their parametrizations
00105     LogDebug("CSCTFSectorProcessor") << "Initializing pT LUT from EventSetup";
00106     ptLUT_ = new CSCTFPtLUT(c);
00107 
00108     // Extract from EventSetup alternative (to the one, used in constructor) ParameterSet
00109     edm::ESHandle<L1MuCSCTFConfiguration> config;
00110     c.get<L1MuCSCTFConfigurationRcd>().get(config);
00111     // And initialize only those parameters, which left uninitialized during construction
00112 //std::cout<<"Initializing endcap: "<<m_endcap<<" sector:"<<m_sector<<std::endl<<config.product()->parameters((m_endcap-1)*2+(m_sector-1))<<std::endl;;
00113     readParameters(config.product()->parameters((m_endcap-1)*2+(m_sector-1)));
00114   }
00115   // Check if parameters were not initialized in both: constuctor (from .cf? file) and initialize method (from EventSetup)
00116   if(m_bxa_depth    <0) throw cms::Exception("CSCTFSectorProcessor")<<"BXAdepth parameter left uninitialized for endcap="<<m_endcap<<", sector="<<m_sector;
00117   if(m_allowALCTonly<0) throw cms::Exception("CSCTFSectorProcessor")<<"AllowALCTonly parameter left uninitialized for endcap="<<m_endcap<<", sector="<<m_sector;
00118   if(m_allowCLCTonly<0) throw cms::Exception("CSCTFSectorProcessor")<<"AllowCLCTonly parameter left uninitialized for endcap="<<m_endcap<<", sector="<<m_sector;
00119   if(m_preTrigger   <0) throw cms::Exception("CSCTFSectorProcessor")<<"PreTrigger parameter left uninitialized for endcap="<<m_endcap<<", sector="<<m_sector;
00120   if(m_mindphip    <0) throw cms::Exception("CSCTFSectorProcessor")<<"mindphip parameter left uninitialized for endcap="<<m_endcap<<", sector="<<m_sector;
00121   if(m_mindeta_accp<0) throw cms::Exception("CSCTFSectorProcessor")<<"mindeta_accp parameter left uninitialized for endcap="<<m_endcap<<", sector="<<m_sector;
00122   if(m_maxdeta_accp<0) throw cms::Exception("CSCTFSectorProcessor")<<"maxdeta_accp parameter left uninitialized for endcap="<<m_endcap<<", sector="<<m_sector;
00123   if(m_maxdphi_accp<0) throw cms::Exception("CSCTFSectorProcessor")<<"maxdphi_accp parameter left uninitialized for endcap="<<m_endcap<<", sector="<<m_sector;
00124   for(int index=0; index<8; index++) if(m_etamax[index]<0) throw cms::Exception("CSCTFSectorProcessor")<<"Some ("<<(8-index)<<") of EtaMax parameters left uninitialized for endcap="<<m_endcap<<", sector="<<m_sector;
00125   for(int index=0; index<8; index++) if(m_etamin[index]<0) throw cms::Exception("CSCTFSectorProcessor")<<"Some ("<<(8-index)<<") of EtaMin parameters left uninitialized for endcap="<<m_endcap<<", sector="<<m_sector;
00126   for(int index=0; index<6; index++) if(m_etawin[index]<0) throw cms::Exception("CSCTFSectorProcessor")<<"Some ("<<(6-index)<<") of EtaWindows parameters left uninitialized for endcap="<<m_endcap<<", sector="<<m_sector;
00127   if(kill_fiber     <0) throw cms::Exception("CSCTFTrackBuilder")<<"kill_fiber parameter left uninitialized";
00128   if(run_core       <0) throw cms::Exception("CSCTFTrackBuilder")<<"run_core parameter left uninitialized";
00129   if(trigger_on_ME1a<0) throw cms::Exception("CSCTFTrackBuilder")<<"trigger_on_ME1a parameter left uninitialized";
00130   if(trigger_on_ME1b<0) throw cms::Exception("CSCTFTrackBuilder")<<"trigger_on_ME1b parameter left uninitialized";
00131   if(trigger_on_ME2 <0) throw cms::Exception("CSCTFTrackBuilder")<<"trigger_on_ME2 parameter left uninitialized";
00132   if(trigger_on_ME3 <0) throw cms::Exception("CSCTFTrackBuilder")<<"trigger_on_ME3 parameter left uninitialized";
00133   if(trigger_on_ME4 <0) throw cms::Exception("CSCTFTrackBuilder")<<"trigger_on_ME4 parameter left uninitialized";
00134   if(trigger_on_MB1a<0) throw cms::Exception("CSCTFTrackBuilder")<<"trigger_on_MB1a parameter left uninitialized";
00135   if(trigger_on_MB1d<0) throw cms::Exception("CSCTFTrackBuilder")<<"trigger_on_MB1d parameter left uninitialized";
00136   if( trigger_on_ME1a>0 || trigger_on_ME1b>0 ||trigger_on_ME2>0  ||
00137       trigger_on_ME3>0  || trigger_on_ME4>0  ||trigger_on_MB1a>0 ||trigger_on_MB1d>0 ){
00138       if(singlesTrackPt<0) throw cms::Exception("CSCTFTrackBuilder")<<"singlesTrackPt parameter left uninitialized";
00139       if(singlesTrackOutput<0) throw cms::Exception("CSCTFTrackBuilder")<<"singlesTrackOutput parameter left uninitialized";
00140   }
00141   if(QualityEnableME1a<0) throw cms::Exception("CSCTFTrackBuilder")<<"QualityEnableME1a parameter left uninitialized";
00142   if(QualityEnableME1b<0) throw cms::Exception("CSCTFTrackBuilder")<<"QualityEnableME1b parameter left uninitialized";
00143   if(QualityEnableME1c<0) throw cms::Exception("CSCTFTrackBuilder")<<"QualityEnableME1c parameter left uninitialized";
00144   if(QualityEnableME1d<0) throw cms::Exception("CSCTFTrackBuilder")<<"QualityEnableME1d parameter left uninitialized";
00145   if(QualityEnableME1e<0) throw cms::Exception("CSCTFTrackBuilder")<<"QualityEnableME1e parameter left uninitialized";
00146   if(QualityEnableME1f<0) throw cms::Exception("CSCTFTrackBuilder")<<"QualityEnableME1f parameter left uninitialized";
00147   if(QualityEnableME2a<0) throw cms::Exception("CSCTFTrackBuilder")<<"QualityEnableME2a parameter left uninitialized";
00148   if(QualityEnableME2b<0) throw cms::Exception("CSCTFTrackBuilder")<<"QualityEnableME2b parameter left uninitialized";
00149   if(QualityEnableME2c<0) throw cms::Exception("CSCTFTrackBuilder")<<"QualityEnableME2c parameter left uninitialized";
00150   if(QualityEnableME3a<0) throw cms::Exception("CSCTFTrackBuilder")<<"QualityEnableME3a parameter left uninitialized";
00151   if(QualityEnableME3b<0) throw cms::Exception("CSCTFTrackBuilder")<<"QualityEnableME3b parameter left uninitialized";
00152   if(QualityEnableME3c<0) throw cms::Exception("CSCTFTrackBuilder")<<"QualityEnableME3c parameter left uninitialized";
00153   if(QualityEnableME4a<0) throw cms::Exception("CSCTFTrackBuilder")<<"QualityEnableME4a parameter left uninitialized";
00154   if(QualityEnableME4b<0) throw cms::Exception("CSCTFTrackBuilder")<<"QualityEnableME4b parameter left uninitialized";
00155   if(QualityEnableME4c<0) throw cms::Exception("CSCTFTrackBuilder")<<"QualityEnableME4c parameter left uninitialized";
00156 }
00157 
00158 void CSCTFSectorProcessor::readParameters(const edm::ParameterSet& pset){
00159       m_bxa_depth = pset.getParameter<unsigned>("BXAdepth");
00160       m_allowALCTonly = ( pset.getParameter<bool>("AllowALCTonly") ? 1 : 0 );
00161       m_allowCLCTonly = ( pset.getParameter<bool>("AllowCLCTonly") ? 1 : 0 );
00162       m_preTrigger = pset.getParameter<unsigned>("PreTrigger");
00163 
00164   std::vector<unsigned>::const_iterator iter;
00165   int index=0;
00166       std::vector<unsigned> etawins = pset.getParameter<std::vector<unsigned> >("EtaWindows");
00167       for(iter=etawins.begin(),index=0; iter!=etawins.end()&&index<6; iter++,index++) m_etawin[index] = *iter;
00168       std::vector<unsigned> etamins = pset.getParameter<std::vector<unsigned> >("EtaMin");
00169       for(iter=etamins.begin(),index=0; iter!=etamins.end()&&index<8; iter++,index++) m_etamin[index] = *iter;
00170       std::vector<unsigned> etamaxs = pset.getParameter<std::vector<unsigned> >("EtaMax");
00171       for(iter=etamaxs.begin(),index=0; iter!=etamaxs.end()&&index<8; iter++,index++) m_etamax[index] = *iter;
00172 
00173           m_mindphip = pset.getParameter<unsigned>("mindphip");
00174       m_mindeta_accp = pset.getParameter<unsigned>("mindeta_accp");
00175       m_maxdeta_accp = pset.getParameter<unsigned>("maxdeta_accp");
00176       m_maxdphi_accp = pset.getParameter<unsigned>("maxdphi_accp");
00177       kill_fiber = pset.getParameter<unsigned>("kill_fiber");
00178       run_core = pset.getParameter<bool>("run_core");
00179       trigger_on_ME1a = pset.getParameter<bool>("trigger_on_ME1a");
00180       trigger_on_ME1b = pset.getParameter<bool>("trigger_on_ME1b");
00181       trigger_on_ME2 = pset.getParameter<bool>("trigger_on_ME2");
00182       trigger_on_ME3 = pset.getParameter<bool>("trigger_on_ME3");
00183       trigger_on_ME4 = pset.getParameter<bool>("trigger_on_ME4");
00184       trigger_on_MB1a = pset.getParameter<bool>("trigger_on_MB1a");
00185       trigger_on_MB1d = pset.getParameter<bool>("trigger_on_MB1d");
00186       singlesTrackPt = pset.getParameter<unsigned int>("singlesTrackPt");
00187       singlesTrackOutput = pset.getParameter<unsigned int>("singlesTrackOutput");
00188       QualityEnableME1a = pset.getParameter<unsigned int>("QualityEnableME1a");
00189       QualityEnableME1b = pset.getParameter<unsigned int>("QualityEnableME1b");
00190       QualityEnableME1c = pset.getParameter<unsigned int>("QualityEnableME1c");
00191       QualityEnableME1d = pset.getParameter<unsigned int>("QualityEnableME1d");
00192       QualityEnableME1e = pset.getParameter<unsigned int>("QualityEnableME1e");
00193       QualityEnableME1f = pset.getParameter<unsigned int>("QualityEnableME1f");
00194       QualityEnableME2a = pset.getParameter<unsigned int>("QualityEnableME2a");
00195       QualityEnableME2b = pset.getParameter<unsigned int>("QualityEnableME2b");
00196       QualityEnableME2c = pset.getParameter<unsigned int>("QualityEnableME2c");
00197       QualityEnableME3a = pset.getParameter<unsigned int>("QualityEnableME3a");
00198       QualityEnableME3b = pset.getParameter<unsigned int>("QualityEnableME3b");
00199       QualityEnableME3c = pset.getParameter<unsigned int>("QualityEnableME3c");
00200       QualityEnableME4a = pset.getParameter<unsigned int>("QualityEnableME4a");
00201       QualityEnableME4b = pset.getParameter<unsigned int>("QualityEnableME4b");
00202       QualityEnableME4c = pset.getParameter<unsigned int>("QualityEnableME4c");
00203 }
00204 
00205 CSCTFSectorProcessor::~CSCTFSectorProcessor()
00206 {
00207   for(int i = 0; i < 5; ++i)
00208     {
00209       if(srLUTs_[FPGAs[i]]) delete srLUTs_[FPGAs[i]]; // delete the pointer
00210       srLUTs_[FPGAs[i]] = NULL; // point it at a safe place
00211     }
00212 
00213   delete core_;
00214   core_ = NULL;
00215 
00216   if(ptLUT_) delete ptLUT_;
00217   ptLUT_ = NULL;
00218 }
00219 
00220 bool CSCTFSectorProcessor::run(const CSCTriggerContainer<csctf::TrackStub>& stubs)
00221 {
00222 
00223   if( !ptLUT_ )
00224     throw cms::Exception("Initialize CSC TF LUTs first (missed call to CSCTFTrackProducer::beginJob?)")<<"CSCTFSectorProcessor::run";
00225 
00226 
00227   l1_tracks.clear();
00228   dt_stubs.clear();
00229   stub_vec_filtered.clear();
00230 
00231   std::vector<csctf::TrackStub> stub_vec = stubs.get();
00232 
00236   for(std::vector<csctf::TrackStub>::const_iterator itr=stub_vec.begin(); itr!=stub_vec.end(); itr++)
00237       switch( itr->station() ){
00238         case 5: stub_vec_filtered.push_back(*itr); break; // DT stubs get filtered by the core controll register
00239         case 4:
00240           switch( itr->getMPCLink() ){
00241             case 3: if( (kill_fiber&0x4000)==0 && QualityEnableME4c&(1<<itr->getQuality()) ) stub_vec_filtered.push_back(*itr); break;
00242             case 2: if( (kill_fiber&0x2000)==0 && QualityEnableME4b&(1<<itr->getQuality()) ) stub_vec_filtered.push_back(*itr); break;
00243             case 1: if( (kill_fiber&0x1000)==0 && QualityEnableME4a&(1<<itr->getQuality()) ) stub_vec_filtered.push_back(*itr); break;
00244             default: edm::LogWarning("CSCTFSectorProcessor::run()") << "No MPC sorting for LCT: link="<<itr->getMPCLink()<<"\n";
00245           }
00246         break;
00247         case 3:
00248           switch( itr->getMPCLink() ){
00249             case 3: if( (kill_fiber&0x0800)==0 && QualityEnableME3c&(1<<itr->getQuality()) ) stub_vec_filtered.push_back(*itr); break;
00250             case 2: if( (kill_fiber&0x0400)==0 && QualityEnableME3b&(1<<itr->getQuality()) ) stub_vec_filtered.push_back(*itr); break;
00251             case 1: if( (kill_fiber&0x0200)==0 && QualityEnableME3a&(1<<itr->getQuality()) ) stub_vec_filtered.push_back(*itr); break;
00252             default: edm::LogWarning("CSCTFSectorProcessor::run()") << "No MPC sorting for LCT: link="<<itr->getMPCLink()<<"\n";
00253           }
00254         break;
00255         case 2:
00256           switch( itr->getMPCLink() ){
00257             case 3: if( (kill_fiber&0x0100)==0 && QualityEnableME2c&(1<<itr->getQuality()) ) stub_vec_filtered.push_back(*itr); break;
00258             case 2: if( (kill_fiber&0x0080)==0 && QualityEnableME2b&(1<<itr->getQuality()) ) stub_vec_filtered.push_back(*itr); break;
00259             case 1: if( (kill_fiber&0x0040)==0 && QualityEnableME2a&(1<<itr->getQuality()) ) stub_vec_filtered.push_back(*itr); break;
00260             default: edm::LogWarning("CSCTFSectorProcessor::run()") << "No MPC sorting for LCT: link="<<itr->getMPCLink()<<"\n";
00261           }
00262         break;
00263         case 1:
00264           switch( itr->getMPCLink() + (3*(CSCTriggerNumbering::triggerSubSectorFromLabels(CSCDetId(itr->getDetId().rawId())) - 1)) ){
00265             case 6: if( (kill_fiber&0x0020)==0 && QualityEnableME1f&(1<<itr->getQuality()) ) stub_vec_filtered.push_back(*itr); break;
00266             case 5: if( (kill_fiber&0x0010)==0 && QualityEnableME1e&(1<<itr->getQuality()) ) stub_vec_filtered.push_back(*itr); break;
00267             case 4: if( (kill_fiber&0x0008)==0 && QualityEnableME1d&(1<<itr->getQuality()) ) stub_vec_filtered.push_back(*itr); break;
00268             case 3: if( (kill_fiber&0x0004)==0 && QualityEnableME1c&(1<<itr->getQuality()) ) stub_vec_filtered.push_back(*itr); break;
00269             case 2: if( (kill_fiber&0x0002)==0 && QualityEnableME1b&(1<<itr->getQuality()) ) stub_vec_filtered.push_back(*itr); break;
00270             case 1: if( (kill_fiber&0x0001)==0 && QualityEnableME1a&(1<<itr->getQuality()) ) stub_vec_filtered.push_back(*itr); break;
00271             default: edm::LogWarning("CSCTFSectorProcessor::run()") << "No MPC sorting for LCT: link="<<itr->getMPCLink()<<"\n";
00272           }
00273         break;
00274         default: edm::LogWarning("CSCTFSectorProcessor::run()") << "Invalid station # encountered: "<<itr->station()<<"\n";
00275       }
00276 
00285   for(std::vector<csctf::TrackStub>::iterator itr=stub_vec_filtered.begin(); itr!=stub_vec_filtered.end(); itr++)
00286     {
00287       if(itr->station() != 5)
00288         {
00289           CSCDetId id(itr->getDetId().rawId());
00290           unsigned fpga = (id.station() == 1) ? CSCTriggerNumbering::triggerSubSectorFromLabels(id) - 1 : id.station();
00291 
00292           lclphidat lclPhi;
00293           try {
00294             lclPhi = srLUTs_[FPGAs[fpga]]->localPhi(itr->getStrip(), itr->getPattern(), itr->getQuality(), itr->getBend());
00295           } catch( cms::Exception &e ) {
00296             bzero(&lclPhi,sizeof(lclPhi));
00297             edm::LogWarning("CSCTFSectorProcessor:run()") << "Exception from LocalPhi LUT in " << FPGAs[fpga]
00298                << "(strip="<<itr->getStrip()<<",pattern="<<itr->getPattern()<<",quality="<<itr->getQuality()<<",bend="<<itr->getBend()<<")" <<std::endl;
00299           }
00300           gblphidat gblPhi;
00301           try {
00302             gblPhi = srLUTs_[FPGAs[fpga]]->globalPhiME(lclPhi.phi_local, itr->getKeyWG(), itr->cscid());
00303                   } catch( cms::Exception &e ) {
00304             bzero(&gblPhi,sizeof(gblPhi));
00305             edm::LogWarning("CSCTFSectorProcessor:run()") << "Exception from GlobalPhi LUT in " << FPGAs[fpga]
00306                << "(phi_local="<<lclPhi.phi_local<<",KeyWG="<<itr->getKeyWG()<<",csc="<<itr->cscid()<<")"<<std::endl;
00307           }
00308           gbletadat gblEta;
00309           try {
00310             gblEta = srLUTs_[FPGAs[fpga]]->globalEtaME(lclPhi.phi_bend_local, lclPhi.phi_local, itr->getKeyWG(), itr->cscid());
00311           } catch( cms::Exception &e ) {
00312             bzero(&gblEta,sizeof(gblEta));
00313             edm::LogWarning("CSCTFSectorProcessor:run()") << "Exception from GlobalEta LUT in " << FPGAs[fpga]
00314                << "(phi_bend_local="<<lclPhi.phi_bend_local<<",phi_local="<<lclPhi.phi_local<<",KeyWG="<<itr->getKeyWG()<<",csc="<<itr->cscid()<<")"<<std::endl;
00315           }
00316 
00317           itr->setEtaPacked(gblEta.global_eta);
00318           itr->setPhiPacked(gblPhi.global_phi);
00319 
00320           if(itr->station() == 1) dt_stubs.push_back(*itr); // send stubs to DT
00321 
00322           LogDebug("CSCTFSectorProcessor:run()") << "LCT found, processed by FPGA: " << FPGAs[fpga] << std::endl
00323                                                  << " LCT now has (eta, phi) of: (" << itr->etaValue() << "," << itr->phiValue() <<")\n";
00324         }
00325     }
00326 
00327   CSCTriggerContainer<csctf::TrackStub> processedStubs(stub_vec_filtered);
00328 
00335   std::vector<csc::L1Track> tftks;
00336 
00337   if(run_core){
00338     core_->loadData(processedStubs, m_endcap, m_sector, m_minBX, m_maxBX);
00339 
00340     if( core_->run(m_endcap, m_sector, m_latency,
00341                    m_etamin[0], m_etamin[1], m_etamin[2], m_etamin[3],
00342                    m_etamin[4], m_etamin[5], m_etamin[6], m_etamin[7],
00343                    m_etamax[0], m_etamax[1], m_etamax[2], m_etamax[3],
00344                    m_etamax[4], m_etamax[5], m_etamax[6], m_etamax[7],
00345                    m_etawin[0], m_etawin[1], m_etawin[2],
00346                    m_etawin[3], m_etawin[4], m_etawin[5],
00347                    m_mindphip,  m_mindeta_accp,  m_maxdeta_accp, m_maxdphi_accp,
00348                    m_bxa_depth, m_allowALCTonly, m_allowCLCTonly, m_preTrigger,
00349                    m_minBX, m_maxBX) )
00350       {
00351         l1_tracks = core_->tracks();
00352       }
00353 
00354     tftks = l1_tracks.get();
00355 
00361     std::vector<csc::L1Track>::iterator titr = tftks.begin();
00362 
00363     for(; titr != tftks.end(); titr++)
00364       {
00365         ptadd thePtAddress(titr->ptLUTAddress());
00366         ptdat thePtData = ptLUT_->Pt(thePtAddress);
00367 
00368         if(thePtAddress.track_fr)
00369         {
00370           titr->setRank(thePtData.front_rank);
00371           titr->setChargeValidPacked(thePtData.charge_valid_front);
00372             }
00373         else
00374         {
00375           titr->setRank(thePtData.rear_rank);
00376           titr->setChargeValidPacked(thePtData.charge_valid_rear);
00377         }
00378     }
00379   } //end of if(run_core)
00380 
00381   l1_tracks = tftks;
00382 
00383 
00384     // Add-on for singles:
00385     CSCTriggerContainer<csctf::TrackStub> myStubContainer[7]; //[BX]
00386     // Loop over CSC LCTs if triggering on them:
00387     if( trigger_on_ME1a || trigger_on_ME1b || trigger_on_ME2 || trigger_on_ME3 || trigger_on_ME4 || trigger_on_MB1a || trigger_on_MB1d )
00388         for(std::vector<csctf::TrackStub>::iterator itr=stub_vec_filtered.begin(); itr!=stub_vec_filtered.end(); itr++){
00389               int station = itr->station()-1;
00390               int subSector = CSCTriggerNumbering::triggerSubSectorFromLabels(CSCDetId(itr->getDetId().rawId()));
00391               int mpc = ( subSector ? subSector-1 : station+1 );
00392               if( (mpc==0&&trigger_on_ME1a) || (mpc==1&&trigger_on_ME1b) ||
00393                   (mpc==2&&trigger_on_ME2)  || (mpc==3&&trigger_on_ME3)  ||
00394                   (mpc==4&&trigger_on_ME4)  ||
00395                   (mpc==5&& ( (trigger_on_MB1a&&subSector%2==1) || (trigger_on_MB1d&&subSector%2==0) ) ) ){
00396                   int bx = itr->getBX() - m_minBX;
00397                   if( bx<0 || bx>=7 ) edm::LogWarning("CSCTFTrackBuilder::buildTracks()") << " LCT BX is out of ["<<m_minBX<<","<<m_maxBX<<") range: "<<itr->getBX();
00398                   else
00399                      if( itr->isValid() ) myStubContainer[bx].push_back(*itr);
00400               }
00401         }
00402 
00403     // Core's input was loaded in a relative time window BX=[0-7)
00404     // To relate it to time window of tracks (centred at BX=0) we introduce a shift:
00405     int shift = (m_maxBX + m_minBX)/2 - m_minBX;
00406 
00407     // Now we put tracks from singles in a certain bx
00408     //   if there were no tracks from the core in this endcap/sector/bx
00409     CSCTriggerContainer<csc::L1Track> tracksFromSingles;
00410     for(int bx=0; bx<7; bx++)
00411        if( myStubContainer[bx].get().size() ){ // VP this bx
00412           bool coreTrackExists = false;
00413           // tracks are not ordered to be accessible by bx => loop them all
00414           std::vector<csc::L1Track> tracks = l1_tracks.get();
00415           for(std::vector<csc::L1Track>::iterator trk=tracks.begin(); trk<tracks.end(); trk++)
00416              if( trk->BX()         == bx-shift &&
00417                  trk->outputLink() == singlesTrackOutput ){
00418                  coreTrackExists = true;
00419                  break;
00420              }
00421              if( coreTrackExists == false ){
00422                  csc::L1TrackId trackId(m_endcap,m_sector);
00423                  csc::L1Track   track(trackId);
00424                  track.setRank(singlesTrackPt&0x1F);
00425                  track.setBx(bx-shift);
00426                  track.setPtPacked(singlesTrackPt);
00427                  track.setQualityPacked((singlesTrackPt&0x60)>>5);
00428                  track.setChargeValidPacked((singlesTrackPt&0x80)>>7);
00429                  track.setPtLUTAddress(15<<16);
00430                  //CSCCorrelatedLCTDigiCollection singles;
00431                  //std::vector<csctf::TrackStub> stubs = myStubContainer[bx].get();
00432                  //for(std::vector<csctf::TrackStub>::const_iterator st_iter=stubs.begin();
00433                  //    st_iter!=stubs.end(); st_iter++)
00434                  //   singles.insertDigi(CSCDetId(st_iter->getDetId().rawId()),*st_iter);
00435                  //tracksFromSingles.push_back(L1CSCTrack(track,singles));
00436                  tracksFromSingles.push_back(track);
00437              }
00438        }
00439         std::vector<csc::L1Track> single_tracks = tracksFromSingles.get();
00440     if( single_tracks.size() ) l1_tracks.push_many(single_tracks);
00441     // End of add-on for singles
00442 
00443   return (l1_tracks.get().size() > 0);
00444 }
00445 

Generated on Tue Jun 9 17:39:42 2009 for CMSSW by  doxygen 1.5.4