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
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
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
00105 LogDebug("CSCTFSectorProcessor") << "Initializing pT LUT from EventSetup";
00106 ptLUT_ = new CSCTFPtLUT(c);
00107
00108
00109 edm::ESHandle<L1MuCSCTFConfiguration> config;
00110 c.get<L1MuCSCTFConfigurationRcd>().get(config);
00111
00112
00113 readParameters(config.product()->parameters((m_endcap-1)*2+(m_sector-1)));
00114 }
00115
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]];
00210 srLUTs_[FPGAs[i]] = NULL;
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;
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);
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 }
00380
00381 l1_tracks = tftks;
00382
00383
00384
00385 CSCTriggerContainer<csctf::TrackStub> myStubContainer[7];
00386
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
00404
00405 int shift = (m_maxBX + m_minBX)/2 - m_minBX;
00406
00407
00408
00409 CSCTriggerContainer<csc::L1Track> tracksFromSingles;
00410 for(int bx=0; bx<7; bx++)
00411 if( myStubContainer[bx].get().size() ){
00412 bool coreTrackExists = false;
00413
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
00431
00432
00433
00434
00435
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
00442
00443 return (l1_tracks.get().size() > 0);
00444 }
00445