00001 #include "L1Trigger/RegionalCaloTrigger/interface/L1RCTProducer.h"
00002
00003
00004 #include <vector>
00005 using std::vector;
00006 #include <iostream>
00007
00008
00009
00010 using std::cout;
00011 using std::endl;
00012 const int L1RCTProducer::crateFED[18][5]=
00013 {{613, 614, 603, 702, 718},
00014 {611, 612, 602, 700, 718},
00015 {627, 610, 601,716, 722},
00016 {625, 626, 609, 714, 722},
00017 {623, 624, 608, 712, 722},
00018 {621, 622, 607, 710, 720},
00019 {619, 620, 606, 708, 720},
00020 {617, 618, 605, 706, 720},
00021 {615, 616, 604, 704, 718},
00022 {631, 632, 648, 703, 719},
00023 {629, 630, 647, 701, 719},
00024 {645, 628, 646, 717, 723},
00025 {643, 644, 654, 715, 723},
00026 {641, 642, 653, 713, 723},
00027 {639, 640, 652, 711, 721},
00028 {637, 638, 651, 709, 721},
00029 {635, 636, 650, 707, 721},
00030 {633, 634, 649, 705, 719}};
00031
00032
00033
00034 L1RCTProducer::L1RCTProducer(const edm::ParameterSet& conf) :
00035 rctLookupTables(new L1RCTLookupTables),
00036 rct(new L1RCT(rctLookupTables)),
00037 useEcal(conf.getParameter<bool>("useEcal")),
00038 useHcal(conf.getParameter<bool>("useHcal")),
00039 ecalDigis(conf.getParameter<std::vector<edm::InputTag> >("ecalDigis")),
00040 hcalDigis(conf.getParameter<std::vector<edm::InputTag> >("hcalDigis")),
00041 bunchCrossings(conf.getParameter<std::vector<int> >("BunchCrossings")),
00042 fedUpdatedMask(0)
00043 {
00044 produces<L1CaloEmCollection>();
00045 produces<L1CaloRegionCollection>();
00046
00047
00048
00049 }
00050
00051 L1RCTProducer::~L1RCTProducer()
00052 {
00053 if(rct != 0) delete rct;
00054 if(rctLookupTables != 0) delete rctLookupTables;
00055 if(fedUpdatedMask != 0) delete fedUpdatedMask;
00056 }
00057
00058
00059 void L1RCTProducer::beginRun(edm::Run& run, const edm::EventSetup& eventSetup)
00060 {
00061
00062 }
00063
00064 void L1RCTProducer::beginLuminosityBlock(edm::LuminosityBlock& lumiSeg,const edm::EventSetup& context)
00065 {
00066 updateConfiguration(context);
00067 }
00068
00069
00070
00071 void L1RCTProducer::updateConfiguration(const edm::EventSetup& eventSetup)
00072 {
00073
00074
00075
00076
00077
00078 edm::ESHandle<L1RCTParameters> rctParameters;
00079 eventSetup.get<L1RCTParametersRcd>().get(rctParameters);
00080 const L1RCTParameters* r = rctParameters.product();
00081
00082
00083 edm::ESHandle<L1RCTChannelMask> channelMask;
00084 eventSetup.get<L1RCTChannelMaskRcd>().get(channelMask);
00085 const L1RCTChannelMask* cEs = channelMask.product();
00086
00087
00088
00089 edm::ESHandle<L1RCTNoisyChannelMask> hotChannelMask;
00090 eventSetup.get<L1RCTNoisyChannelMaskRcd>().get(hotChannelMask);
00091 const L1RCTNoisyChannelMask* cEsNoise = hotChannelMask.product();
00092 rctLookupTables->setNoisyChannelMask(cEsNoise);
00093
00094
00095
00096
00097
00098
00099
00100 if(fedUpdatedMask!=0) delete fedUpdatedMask;
00101
00102 fedUpdatedMask = new L1RCTChannelMask();
00103
00104 for (int i = 0; i < 18; i++)
00105 {
00106 for (int j = 0; j < 2; j++)
00107 {
00108 for (int k = 0; k < 28; k++)
00109 {
00110 fedUpdatedMask->ecalMask[i][j][k] = cEs->ecalMask[i][j][k];
00111 fedUpdatedMask->hcalMask[i][j][k] =cEs->hcalMask[i][j][k] ;
00112 }
00113 for (int k = 0; k < 4; k++)
00114 {
00115 fedUpdatedMask->hfMask[i][j][k] = cEs->hfMask[i][j][k];
00116 }
00117 }
00118 }
00119
00120
00121
00122 edm::ESHandle<RunInfo> sum;
00123 eventSetup.get<RunInfoRcd>().get(sum);
00124 const RunInfo* summary=sum.product();
00125
00126
00127 std::vector<int> caloFeds;
00128
00129
00130 const std::vector<int> Feds = summary->m_fed_in;
00131 for(std::vector<int>::const_iterator cf = Feds.begin(); cf != Feds.end(); ++cf){
00132 int fedNum = *cf;
00133 if(fedNum > 600 && fedNum <724)
00134 caloFeds.push_back(fedNum);
00135 }
00136
00137 for(int cr = 0; cr < 18; ++cr){
00138
00139 for(crateSection cs = c_min; cs <= c_max; cs = crateSection(cs +1)) {
00140 bool fedFound = false;
00141
00142
00143
00144 std::vector<int>::iterator fv = std::find(caloFeds.begin(),caloFeds.end(),crateFED[cr][cs]);
00145 if(fv!=caloFeds.end())
00146 fedFound = true;
00147
00148 if(!fedFound) {
00149 int eta_min=0;
00150 int eta_max=0;
00151 bool phi_even[2] = {false};
00152 bool ecal=false;
00153
00154 switch (cs) {
00155 case ebEvenFed :
00156 eta_min = minBarrel;
00157 eta_max = maxBarrel;
00158 phi_even[0] = true;
00159 ecal = true;
00160 break;
00161
00162 case ebOddFed:
00163 eta_min = minBarrel;
00164 eta_max = maxBarrel;
00165 phi_even[1] = true;
00166 ecal = true;
00167 break;
00168
00169 case eeFed:
00170 eta_min = minEndcap;
00171 eta_max = maxEndcap;
00172 phi_even[0] = true;
00173 phi_even[1] = true;
00174 ecal = true;
00175 break;
00176
00177 case hbheFed:
00178 eta_min = minBarrel;
00179 eta_max = maxEndcap;
00180 phi_even[0] = true;
00181 phi_even[1] = true;
00182 ecal = false;
00183 break;
00184
00185 case hfFed:
00186 eta_min = minHF;
00187 eta_max = maxHF;
00188
00189 phi_even[0] = true;
00190 phi_even[1] = true;
00191 ecal = false;
00192 break;
00193 default:
00194 break;
00195
00196 }
00197 for(int ieta = eta_min; ieta <= eta_max; ++ieta){
00198 if(ieta<=28)
00199 for(int even = 0; even<=1 ; even++){
00200 if(phi_even[even]){
00201 if(ecal)
00202 fedUpdatedMask->ecalMask[cr][even][ieta-1] = true;
00203 else
00204 fedUpdatedMask->hcalMask[cr][even][ieta-1] = true;
00205 }
00206 }
00207 else
00208 for(int even = 0; even<=1 ; even++)
00209 if(phi_even[even])
00210 fedUpdatedMask->hfMask[cr][even][ieta-29] = true;
00211
00212 }
00213 }
00214 }
00215 }
00216
00217
00218
00219
00220
00221 edm::ESHandle<L1CaloEtScale> emScale;
00222 eventSetup.get<L1EmEtScaleRcd>().get(emScale);
00223 const L1CaloEtScale* s = emScale.product();
00224
00225
00226
00227 edm::ESHandle<L1CaloEcalScale> ecalScale;
00228 eventSetup.get<L1CaloEcalScaleRcd>().get(ecalScale);
00229 const L1CaloEcalScale* e = ecalScale.product();
00230
00231
00232 edm::ESHandle<L1CaloHcalScale> hcalScale;
00233 eventSetup.get<L1CaloHcalScaleRcd>().get(hcalScale);
00234 const L1CaloHcalScale* h = hcalScale.product();
00235
00236
00237 rctLookupTables->setEcalScale(e);
00238 rctLookupTables->setHcalScale(h);
00239
00240
00241 rctLookupTables->setRCTParameters(r);
00242 rctLookupTables->setChannelMask(fedUpdatedMask);
00243 rctLookupTables->setL1CaloEtScale(s);
00244 }
00245
00246
00247 void L1RCTProducer::produce(edm::Event& event, const edm::EventSetup& eventSetup)
00248 {
00249
00250
00251 std::auto_ptr<L1CaloEmCollection> rctEmCands (new L1CaloEmCollection);
00252 std::auto_ptr<L1CaloRegionCollection> rctRegions (new L1CaloRegionCollection);
00253
00254
00255 if(!(ecalDigis.size()==hcalDigis.size()&&hcalDigis.size()==bunchCrossings.size()))
00256 throw cms::Exception("BadInput")
00257 << "From what I see the number of your your ECAL input digi collections.\n"
00258 <<"is different from the size of your HCAL digi input collections\n"
00259 <<"or the size of your BX factor collection"
00260 <<"They must be the same to correspond to the same Bxs\n"
00261 << "It does not matter if one of them is empty\n";
00262
00263
00264
00265
00266
00267 for (unsigned short sample = 0; sample < bunchCrossings.size(); sample++)
00268 {
00269 edm::Handle<EcalTrigPrimDigiCollection> ecal;
00270 edm::Handle<HcalTrigPrimDigiCollection> hcal;
00271
00272 EcalTrigPrimDigiCollection ecalIn;
00273 HcalTrigPrimDigiCollection hcalIn;
00274
00275
00276 if(useHcal&&event.getByLabel(hcalDigis[sample], hcal))
00277 hcalIn = *hcal;
00278
00279 if(useEcal&&event.getByLabel(ecalDigis[sample],ecal))
00280 ecalIn = *ecal;
00281
00282 rct->digiInput(ecalIn,hcalIn);
00283 rct->processEvent();
00284
00285
00286 for (int j = 0; j<18; j++)
00287 {
00288 L1CaloEmCollection isolatedEGObjects = rct->getIsolatedEGObjects(j);
00289 L1CaloEmCollection nonisolatedEGObjects = rct->getNonisolatedEGObjects(j);
00290 for (int i = 0; i<4; i++)
00291 {
00292 isolatedEGObjects.at(i).setBx(bunchCrossings[sample]);
00293 nonisolatedEGObjects.at(i).setBx(bunchCrossings[sample]);
00294 rctEmCands->push_back(isolatedEGObjects.at(i));
00295 rctEmCands->push_back(nonisolatedEGObjects.at(i));
00296 }
00297 }
00298
00299
00300 for (int i = 0; i < 18; i++)
00301 {
00302 std::vector<L1CaloRegion> regions = rct->getRegions(i);
00303 for (int j = 0; j < 22; j++)
00304 {
00305 regions.at(j).setBx(bunchCrossings[sample]);
00306 rctRegions->push_back(regions.at(j));
00307 }
00308 }
00309
00310 }
00311
00312
00313
00314 event.put(rctEmCands);
00315 event.put(rctRegions);
00316
00317 }