00001 #include "L1Trigger/RegionalCaloTrigger/interface/L1RCTTPGProvider.h"
00002 #include "DataFormats/EcalDigi/interface/EcalDigiCollections.h"
00003 #include "DataFormats/HcalDigi/interface/HcalDigiCollections.h"
00004
00005 L1RCTTPGProvider::L1RCTTPGProvider(const edm::ParameterSet& iConfig):
00006 ecalTPG_(iConfig.getParameter<edm::InputTag>("ecalTPGs")),
00007 hcalTPG_(iConfig.getParameter<edm::InputTag>("hcalTPGs")),
00008 useHcalCosmicTiming(iConfig.getParameter<bool>("useHCALCosmicTiming")),
00009 useEcalCosmicTiming(iConfig.getParameter<bool>("useECALCosmicTiming")),
00010 preSamples(iConfig.getParameter<int>("preSamples")),
00011 postSamples(iConfig.getParameter<int>("postSamples")),
00012 hfShift(iConfig.getParameter<int>("HFShift")),
00013 hbShift(iConfig.getParameter<int>("HBShift"))
00014 {
00015
00016
00017
00018
00019 char ecal_label[200];
00020 char hcal_label[200];
00021
00022
00023
00024 for(int i=preSamples;i>0;--i)
00025 {
00026 sprintf(ecal_label,"ECALBxminus%d",i);
00027 sprintf(hcal_label,"HCALBxminus%d",i);
00028 produces<EcalTrigPrimDigiCollection>(ecal_label);
00029 produces<HcalTrigPrimDigiCollection>(hcal_label);
00030 }
00031
00032 produces<EcalTrigPrimDigiCollection>("ECALBx0");
00033 produces<HcalTrigPrimDigiCollection>("HCALBx0");
00034
00035 for(int i=0;i<postSamples;++i)
00036 {
00037 sprintf(ecal_label,"ECALBxplus%d",i+1);
00038 sprintf(hcal_label,"HCALBxplus%d",i+1);
00039 produces<EcalTrigPrimDigiCollection>(ecal_label);
00040 produces<HcalTrigPrimDigiCollection>(hcal_label);
00041 }
00042 }
00043
00044 L1RCTTPGProvider::~L1RCTTPGProvider()
00045 {
00046
00047
00048 }
00049
00050
00051
00052
00053
00054
00055
00056 void
00057 L1RCTTPGProvider::produce(edm::Event& iEvent, const edm::EventSetup& iSetup)
00058 {
00059 using namespace edm;
00060
00061 Handle<EcalTrigPrimDigiCollection> ecal;
00062 Handle<HcalTrigPrimDigiCollection> hcal;
00063
00064
00065
00066 std::vector<EcalTrigPrimDigiCollection> ecalColl(preSamples+1+postSamples);
00067 std::vector<HcalTrigPrimDigiCollection> hcalColl(preSamples+1+postSamples);
00068
00069 unsigned nSamples = preSamples + postSamples + 1;
00070
00071
00072 if(iEvent.getByLabel(ecalTPG_,ecal))
00073 if (ecal.isValid())
00074 {
00075
00076 for (EcalTrigPrimDigiCollection::const_iterator ecal_it = ecal->begin(); ecal_it != ecal->end(); ecal_it++)
00077 {
00078 short zside = ecal_it->id().zside();
00079 unsigned short ietaAbs = ecal_it->id().ietaAbs();
00080 short iphi = ecal_it->id().iphi();
00081 unsigned short digiSize = ecal_it->size();
00082 unsigned short nSOI = (unsigned short) ( ecal_it->sampleOfInterest() );
00083 if (digiSize < nSamples || nSOI < preSamples || ((int)(digiSize - nSOI) < (int)(nSamples - preSamples)))
00084 {
00085 unsigned short preLoopsZero = (unsigned short) (preSamples)- nSOI;
00086
00087
00088 for (int sample = 0; sample < preLoopsZero; sample++)
00089 {
00090
00091 EcalTriggerPrimitiveDigi
00092 ecalDigi(EcalTrigTowerDetId((int) zside, EcalTriggerTower,
00093 (int) ietaAbs, (int) iphi));
00094 ecalDigi.setSize(1);
00095 ecalDigi.setSample(0, EcalTriggerPrimitiveSample(0,false,0));
00096 ecalColl[sample].push_back(ecalDigi);
00097 }
00098
00099
00100 for (int sample = preLoopsZero;sample < (preLoopsZero + digiSize); sample++)
00101 {
00102
00103 EcalTriggerPrimitiveDigi
00104 ecalDigi(EcalTrigTowerDetId((int) zside, EcalTriggerTower,
00105 (int) ietaAbs, (int) iphi));
00106 ecalDigi.setSize(1);
00107 if (useEcalCosmicTiming && iphi >= 1 && iphi <= 36)
00108 {
00109 if (nSOI < (preSamples + 1))
00110 {
00111 edm::LogWarning ("TooLittleData")
00112 << "ECAL data needs at least one presample "
00113 << "more than the number requested "
00114 << "to use ecal cosmic timing mod! "
00115 << "reverting to useEcalCosmicTiming = false "
00116 << "for rest of job.";
00117 useEcalCosmicTiming = false;
00118 }
00119 else
00120 {
00121 ecalDigi.setSample(0, EcalTriggerPrimitiveSample
00122 (ecal_it->sample(nSOI + sample -
00123 preSamples -
00124 1).raw()));
00125 }
00126 }
00127
00128 if ((!useEcalCosmicTiming) || (iphi >=37 && iphi <= 72))
00129 {
00130 ecalDigi.setSample(0, EcalTriggerPrimitiveSample
00131 (ecal_it->sample(nSOI + sample -
00132 preSamples).raw()));
00133 }
00134 ecalColl[sample].push_back(ecalDigi);
00135 }
00136
00137
00138 for (unsigned int sample = (preLoopsZero + digiSize);
00139 sample < nSamples; sample++)
00140 {
00141
00142 EcalTriggerPrimitiveDigi
00143 ecalDigi(EcalTrigTowerDetId((int) zside, EcalTriggerTower,
00144 (int) ietaAbs, (int) iphi));
00145 ecalDigi.setSize(1);
00146 ecalDigi.setSample(0, EcalTriggerPrimitiveSample(0,false,0));
00147 ecalColl[sample].push_back(ecalDigi);
00148 }
00149 }
00150 else
00151 {
00152 for (unsigned short sample = 0; sample < nSamples; sample++)
00153 {
00154
00155 short zside = ecal_it->id().zside();
00156 unsigned short ietaAbs = ecal_it->id().ietaAbs();
00157 short iphi = ecal_it->id().iphi();
00158 EcalTriggerPrimitiveDigi
00159 ecalDigi(EcalTrigTowerDetId((int) zside, EcalTriggerTower,
00160 (int) ietaAbs, (int) iphi));
00161 ecalDigi.setSize(1);
00162
00163 if (useEcalCosmicTiming && iphi >= 1 && iphi <=36)
00164 {
00165 if (nSOI < (preSamples + 1))
00166 {
00167 edm::LogWarning ("TooLittleData")
00168 << "ECAL data needs at least one presample "
00169 << "more than the number requested "
00170 << "to use ecal cosmic timing mod! "
00171 << "reverting to useEcalCosmicTiming = false "
00172 << "for rest of job.";
00173 useEcalCosmicTiming = false;
00174 }
00175 else
00176 {
00177 ecalDigi.setSample(0, EcalTriggerPrimitiveSample
00178 (ecal_it->sample
00179 (ecal_it->sampleOfInterest() +
00180 sample - preSamples -
00181 1).raw()));
00182 }
00183 }
00184
00185 if ((!useEcalCosmicTiming) || (iphi >=37 && iphi <= 72))
00186 {
00187 ecalDigi.setSample(0, EcalTriggerPrimitiveSample
00188 (ecal_it->sample
00189 (ecal_it->sampleOfInterest() +
00190 sample - preSamples).raw()));
00191 }
00192
00193 ecalColl[sample].push_back(ecalDigi);
00194 }
00195 }
00196 }
00197 }
00198
00199 if(iEvent.getByLabel(hcalTPG_,hcal))
00200 if (hcal.isValid())
00201 {
00202
00203 for (HcalTrigPrimDigiCollection::const_iterator hcal_it = hcal->begin(); hcal_it != hcal->end(); hcal_it++)
00204 {
00205 short ieta = hcal_it->id().ieta();
00206 short iphi = hcal_it->id().iphi();
00207
00208 unsigned short digiSize = hcal_it->size();
00209
00210 unsigned short nSOI = (unsigned short) (hcal_it->presamples());
00211 if (digiSize < nSamples || nSOI < preSamples
00212 || ((int)(digiSize - nSOI) < (int)(nSamples - preSamples)))
00213 {
00214 unsigned short preLoopsZero = (unsigned short) (preSamples)
00215 - nSOI;
00216
00217 for (int sample = 0; sample < preLoopsZero; sample++)
00218 {
00219
00220 HcalTriggerPrimitiveDigi hcalDigi(HcalTrigTowerDetId((int) ieta, (int) iphi));
00221 hcalDigi.setSize(1);
00222 hcalDigi.setPresamples(0);
00223 hcalDigi.setSample(0, HcalTriggerPrimitiveSample(0,false,0,0));
00224 hcalColl[sample].push_back(hcalDigi);
00225 }
00226
00227
00228 for (int sample = preLoopsZero;
00229 sample < (preLoopsZero + digiSize); sample++)
00230 {
00231
00232 HcalTriggerPrimitiveDigi hcalDigi(HcalTrigTowerDetId((int) ieta, (int) iphi));
00233 hcalDigi.setSize(1);
00234 hcalDigi.setPresamples(0);
00235
00236 if (useHcalCosmicTiming && iphi >= 1 && iphi <= 36)
00237 {
00238 if (nSOI < (preSamples + 1))
00239 {
00240 edm::LogWarning ("TooLittleData")
00241 << "HCAL data needs at least one presample "
00242 << "more than the number requested "
00243 << "to use hcal cosmic timing mod! "
00244 << "reverting to useHcalCosmicTiming = false "
00245 << "for rest of job.";
00246 useHcalCosmicTiming = false;
00247 }
00248 else
00249 {
00250 hcalDigi.setSample(0, HcalTriggerPrimitiveSample
00251 (hcal_it->sample(hcal_it->
00252 presamples() +
00253 sample -
00254 preSamples -
00255 1).raw()));
00256 }
00257 }
00258
00259 if ((!useHcalCosmicTiming) || (iphi >= 37 && iphi <= 72))
00260 {
00261
00262 hcalDigi.setSample(0, HcalTriggerPrimitiveSample
00263 (hcal_it->sample(hcal_it->
00264 presamples() +
00265 sample -
00266 preSamples).raw()));
00267
00268 }
00269 hcalColl[sample].push_back(hcalDigi);
00270 }
00271
00272
00273 for (unsigned int sample = (preLoopsZero + digiSize);
00274 sample < nSamples; sample++)
00275 {
00276
00277 HcalTriggerPrimitiveDigi
00278 hcalDigi(HcalTrigTowerDetId((int) ieta, (int) iphi));
00279 hcalDigi.setSize(1);
00280 hcalDigi.setPresamples(0);
00281 hcalDigi.setSample(0, HcalTriggerPrimitiveSample(0,false,0,0));
00282 hcalColl[sample].push_back(hcalDigi);
00283 }
00284 }
00285 else
00286 {
00287 for (unsigned short sample = 0; sample < nSamples; sample++)
00288 {
00289
00290 HcalTriggerPrimitiveDigi hcalDigi(HcalTrigTowerDetId((int) ieta, (int) iphi));
00291 hcalDigi.setSize(1);
00292 hcalDigi.setPresamples(0);
00293
00294 if (useHcalCosmicTiming && iphi >= 1 && iphi <= 36)
00295 {
00296 if (nSOI < (preSamples + 1))
00297 {
00298 edm::LogWarning ("TooLittleData")
00299 << "HCAL data needs at least one presample "
00300 << "more than the number requested "
00301 << "to use hcal cosmic timing mod! "
00302 << "reverting to useHcalCosmicTiming = false "
00303 << "for rest of job.";
00304 useHcalCosmicTiming = false;
00305 }
00306 else
00307 {
00308 hcalDigi.setSample(0, HcalTriggerPrimitiveSample
00309 (hcal_it->sample(hcal_it->
00310 presamples() +
00311 sample -
00312 preSamples -
00313 1).raw()));
00314 }
00315 }
00316
00317 if ((!useHcalCosmicTiming) || (iphi >= 37 && iphi <= 72))
00318 {
00319 if(ieta>-29 && ieta<29)
00320 hcalDigi.setSample(0, HcalTriggerPrimitiveSample
00321 (hcal_it->sample(hcal_it->
00322 presamples() +
00323 sample -
00324 preSamples+hbShift).raw()));
00325 if(ieta<=-29 || ieta>=29)
00326 hcalDigi.setSample(0, HcalTriggerPrimitiveSample
00327 (hcal_it->sample(hcal_it->
00328 presamples() +
00329 sample -
00330 preSamples+hfShift).raw()));
00331 }
00332 hcalColl[sample].push_back(hcalDigi);
00333 }
00334 }
00335 }
00336 }
00337
00338
00339
00340
00341 for(int i=0;i<preSamples;++i)
00342 {
00343 char ecal_label[200];
00344 char hcal_label[200];
00345
00346
00347 sprintf(ecal_label,"ECALBxminus%d",preSamples-i);
00348 sprintf(hcal_label,"HCALBxminus%d",preSamples-i);
00349
00350 std::auto_ptr<EcalTrigPrimDigiCollection> ecalIn(new EcalTrigPrimDigiCollection);
00351 std::auto_ptr<HcalTrigPrimDigiCollection> hcalIn(new HcalTrigPrimDigiCollection);
00352 for(unsigned int j=0;j<ecalColl[i].size();++j)
00353 {
00354 ecalIn->push_back((ecalColl[i])[j]);
00355 }
00356 for(unsigned int j=0;j<hcalColl[i].size();++j)
00357 hcalIn->push_back((hcalColl[i])[j]);
00358
00359 iEvent.put(ecalIn,ecal_label);
00360 iEvent.put(hcalIn,hcal_label);
00361
00362 }
00363
00364
00365 std::auto_ptr<EcalTrigPrimDigiCollection> ecal0(new EcalTrigPrimDigiCollection);
00366 std::auto_ptr<HcalTrigPrimDigiCollection> hcal0(new HcalTrigPrimDigiCollection);
00367 for(unsigned int j=0;j<ecalColl[preSamples].size();++j)
00368 ecal0->push_back((ecalColl[preSamples])[j]);
00369 for(unsigned int j=0;j<hcalColl[preSamples].size();++j)
00370 hcal0->push_back((hcalColl[preSamples])[j]);
00371
00372 iEvent.put(ecal0,"ECALBx0");
00373 iEvent.put(hcal0,"HCALBx0");
00374
00375
00376 for(int i=preSamples+1;i<preSamples+postSamples+1;++i)
00377 {
00378 char ecal_label[200];
00379 char hcal_label[200];
00380
00381 sprintf(ecal_label,"ECALBxplus%d",i-preSamples);
00382 sprintf(hcal_label,"HCALBxplus%d",i-preSamples);
00383
00384 std::auto_ptr<EcalTrigPrimDigiCollection> ecalIn2(new EcalTrigPrimDigiCollection);
00385 std::auto_ptr<HcalTrigPrimDigiCollection> hcalIn2(new HcalTrigPrimDigiCollection);
00386
00387 for(unsigned int j=0;j<ecalColl[i].size();++j)
00388 ecalIn2->push_back((ecalColl[i])[j]);
00389
00390 for(unsigned int j=0;j<hcalColl[i].size();++j)
00391 hcalIn2->push_back((hcalColl[i])[j]);
00392
00393
00394 iEvent.put(ecalIn2,ecal_label);
00395 iEvent.put(hcalIn2,hcal_label);
00396 }
00397 }
00398
00399
00400
00401
00402
00403 void
00404 L1RCTTPGProvider::endJob() {
00405 }