Go to the documentation of this file.00001 #include "CondFormats/EcalObjects/interface/EcalTPGLutIdMap.h"
00002 #include "CondFormats/EcalObjects/interface/EcalTPGLutGroup.h"
00003 #include "CondFormats/DataRecord/interface/EcalTPGLutIdMapRcd.h"
00004 #include "CondFormats/DataRecord/interface/EcalTPGLutGroupRcd.h"
00005 #include "SimCalorimetry/EcalElectronicsEmulation/interface/EcalFEtoDigi.h"
00006
00007 EcalFEtoDigi::EcalFEtoDigi(const edm::ParameterSet& iConfig) {
00008 basename_ = iConfig.getUntrackedParameter<std::string>("FlatBaseName","ecal_tcc_");
00009 sm_ = iConfig.getUntrackedParameter<int>("SuperModuleId",-1);
00010 fileEventOffset_ = iConfig.getUntrackedParameter<int>("FileEventOffset",0);
00011 useIdentityLUT_ = iConfig.getUntrackedParameter<bool>("UseIdentityLUT",false);
00012 debug_ = iConfig.getUntrackedParameter<bool>("debugPrintFlag", false);
00013
00014 singlefile = (sm_==-1)?false:true;
00015
00016 produces<EcalTrigPrimDigiCollection>();
00017 produces<EcalTrigPrimDigiCollection >("formatTCP");
00018
00019 }
00020
00022 void
00023 EcalFEtoDigi::produce(edm::Event& iEvent, const edm::EventSetup& iSetup)
00024 {
00025
00027 static int current_bx = -1;
00028 current_bx++;
00029
00031
00032
00033 if(debug_)
00034 std::cout << "[EcalFEtoDigi::produce] producing event " << current_bx << std::endl;
00035
00036 std::auto_ptr<EcalTrigPrimDigiCollection>
00037 e_tpdigis (new EcalTrigPrimDigiCollection);
00038 std::auto_ptr<EcalTrigPrimDigiCollection>
00039 e_tpdigisTcp (new EcalTrigPrimDigiCollection);
00040
00041 std::vector<TCCinput>::const_iterator it;
00042
00043 for(int i=0; i<N_SM; i++) {
00044
00045 if(!singlefile)
00046 sm_=i+1;
00047
00048 for(it = inputdata_[i].begin(); it != inputdata_[i].end(); it++) {
00049
00050 if(!(*it).is_current(current_bx+fileEventOffset_))
00051 continue;
00052 else
00053 if(debug_ && (*it).input!=0 )
00054 std::cout << "[EcalFEtoDigi] "
00055 << "\tsupermodule:" << sm_
00056 << "\tevent: " << current_bx
00057 << "\tbx: " << (*it).bunchCrossing
00058 << "\tvalue:0x" << std::setfill('0') << std::setw(4)
00059 << std::hex << (*it).input << std::setfill(' ') << std::dec
00060 << std::endl;
00061
00062
00064 const EcalTrigTowerDetId e_id = create_TTDetId(*it);
00065
00066
00067
00068
00069
00070
00072 EcalTriggerPrimitiveDigi *e_digi = new EcalTriggerPrimitiveDigi(e_id);
00073 EcalTriggerPrimitiveDigi *e_digiTcp = new EcalTriggerPrimitiveDigi(e_id);
00074
00076 EcalTriggerPrimitiveSample e_sample = create_TPSample(*it, iSetup);
00077 EcalTriggerPrimitiveSample e_sampleTcp = create_TPSampleTcp(*it, iSetup);
00078
00080 e_digi->setSize(1);
00081 e_digi->setSample(0,e_sample);
00082
00084 e_tpdigis->push_back(*e_digi);
00085
00087 e_digiTcp->setSize(1);
00088 e_digiTcp->setSample(0,e_sampleTcp);
00089
00091 e_tpdigisTcp->push_back(*e_digiTcp);
00092
00093 if(debug_)
00094 outfile << (*it).tower << '\t'
00095 << (*it).bunchCrossing << '\t'<< std::setfill('0') << std::hex
00096 << "0x" << std::setw(4) << (*it).input << '\t'
00097 << "0" << std::dec << std::setfill(' ')
00098 << std::endl;
00099
00101 if(debug_ && (*it).input!=0 )
00102 std::cout << "[EcalFEtoDigi] debug id: " << e_digi->id() << "\n\t"
00103 << std::dec
00104 << "\tieta: " << e_digi->id().ieta()
00105 << "\tiphi: " << e_digi->id().iphi()
00106 << "\tsize: " << e_digi->size()
00107 << "\tfg: " <<(e_digi->fineGrain()?1:0)
00108 << std::hex
00109 << "\tEt: 0x" << e_digi->compressedEt()
00110 << " (0x" << (*it).get_energy() << ")"
00111 << "\tttflag: 0x" << e_digi->ttFlag()
00112 << std::dec
00113 << std::endl;
00114
00115 delete e_digi;
00116 delete e_digiTcp;
00117
00118 }
00119
00120 if(singlefile)
00121 break;
00122 }
00123
00125 if(e_tpdigis->size()==0) {
00126 std::cout << "[EcalFEtoDigi] creating empty collection for the event!\n";
00127 EcalTriggerPrimitiveDigi *e_digi = new EcalTriggerPrimitiveDigi();
00128 e_tpdigis->push_back(*e_digi);
00129 }
00130
00131 iEvent.put(e_tpdigis);
00132 iEvent.put(e_tpdigisTcp,"formatTCP");
00133
00134 }
00135
00136
00138 void
00139 EcalFEtoDigi::readInput() {
00140
00141 if(debug_)
00142 std::cout << "\n[EcalFEtoDigi::readInput] Reading input data\n";
00143
00144 if(!singlefile)
00145 sm_=-1;
00146 for(int i=0; i<N_SM; i++)
00147 inputdata_[i].clear();
00148
00149 std::stringstream s;
00150 int tcc;
00151
00152 for (int i=0; i<N_SM; i++) {
00153
00154 tcc = (sm_==-1)?SMidToTCCid(i+1):SMidToTCCid(sm_);
00155
00156 s.str("");
00157 s << basename_ << tcc << ".txt";
00158
00159 std::ifstream f(s.str().c_str());
00160
00161 if(debug_) {
00162 std::cout << " opening " << s.str().c_str() << "..." << std::endl;
00163 if(!f.good())
00164 std::cout << " skipped!";
00165 std::cout << std::endl;
00166 }
00167
00168
00169
00170
00171 int n_bx=0;
00172 int tt; int bx; unsigned val; int dummy;
00173
00174 while(f.good()) {
00175 if(f.eof()) break;
00176 tt=0; bx=-1; val=0x0; dummy=0;
00177 f >> tt >> bx >> std::hex >> val >> std::dec >> dummy;
00178 if(bx==-1 || bx < fileEventOffset_ ) continue;
00179 if( !n_bx || (bx!=(inputdata_[i].back()).bunchCrossing) )
00180 n_bx++;
00181 TCCinput ttdata(tt,bx,val);
00182 inputdata_[i].push_back(ttdata);
00183
00184 if(debug_&&val!=0)
00185 printf("\treading tower:%d bx:%d input:0x%x dummy:%2d\n",
00186 tt, bx, val, dummy);
00187 }
00188
00189 f.close();
00190
00191 if(sm_!=-1)
00192 break;
00193 }
00194
00195 if(debug_)
00196 std::cout << "[EcalFEtoDigi::readInput] Done reading." << std::endl;
00197
00198 return;
00199 }
00200
00202 EcalTrigTowerDetId
00203 EcalFEtoDigi::create_TTDetId(TCCinput data) {
00204
00205
00206 static const int kTowersInPhi = 4;
00207
00208 int iTT = data.tower;
00209 int zside = (sm_>18)?-1:+1;
00210 int SMid = sm_;
00211
00212 int jtower = iTT-1;
00213 int etaTT = jtower / kTowersInPhi +1;
00214 int phiTT;
00215 if (zside < 0)
00216 phiTT = (SMid-19) * kTowersInPhi + jtower % kTowersInPhi;
00217 else
00218 phiTT = (SMid- 1) * kTowersInPhi + kTowersInPhi-(jtower % kTowersInPhi)-1;
00219
00220 phiTT ++;
00221
00222 phiTT = phiTT -2;
00223 if (phiTT <= 0) phiTT = 72+phiTT;
00224
00226 if(debug_&&data.get_energy()!=0)
00227 printf("[EcalFEtoDigi] Creating EcalTrigTowerDetId (SMid,itt)=(%d,%d)->(eta,phi)=(%d,%d) \n", SMid, iTT, etaTT, phiTT);
00228
00229 EcalTrigTowerDetId
00230 e_id( zside , EcalBarrel, etaTT, phiTT, 0);
00231
00232 return e_id;
00233 }
00234
00236 EcalTriggerPrimitiveSample
00237 EcalFEtoDigi::create_TPSample(TCCinput data, const edm::EventSetup& evtSetup) {
00238
00239 int tower = create_TTDetId(data).rawId() ;
00240 int Et = data.get_energy();
00241 bool tt_fg = data.get_fg();
00242
00243
00244
00245
00247 unsigned int lut_[1024] ;
00248 if(!useIdentityLUT_)
00249 getLUT(lut_, tower, evtSetup) ;
00250 else
00251 for(int i=0; i<1024; i++) lut_[i] = i ;
00252
00254 int lut_out = lut_[Et];
00255 int ttFlag = (lut_out & 0x700) >> 8;
00256 int cEt = (lut_out & 0xff );
00257
00259 if(debug_&&data.get_energy()!=0)
00260 printf("[EcalFEtoDigi] Creating sample; input:0x%X (Et:0x%x) cEt:0x%x fg:%d ttflag:0x%x \n",
00261 data.input, Et, cEt, tt_fg, ttFlag);
00262
00263 EcalTriggerPrimitiveSample e_sample(cEt, tt_fg, ttFlag);
00264
00265 return e_sample;
00266 }
00267
00269 EcalTriggerPrimitiveSample
00270 EcalFEtoDigi::create_TPSampleTcp(TCCinput data, const edm::EventSetup& evtSetup) {
00271
00272 int tower = create_TTDetId(data).rawId() ;
00273 int Et = data.get_energy();
00274 bool tt_fg = data.get_fg();
00275
00277 unsigned int lut_[1024] ;
00278 if(!useIdentityLUT_)
00279 getLUT(lut_, tower, evtSetup) ;
00280 else
00281 for(int i=0; i<1024; i++) lut_[i] = i ;
00282
00283 int lut_out = lut_[Et];
00284 int ttFlag = (lut_out & 0x700) >> 8;
00285 int tcpdata = ((ttFlag&0x7)<<11) | ((tt_fg & 0x1)<<10) | (Et & 0x3ff) ;
00286
00287 EcalTriggerPrimitiveSample e_sample(tcpdata);
00288
00289 return e_sample;
00290 }
00291
00292
00294 void
00295 EcalFEtoDigi::beginJob(){
00296
00299 if(sm_!=-1 && (sm_<1 || sm_>36))
00300 throw cms::Exception("EcalFEtoDigiInvalidDetId")
00301 << "EcalFEtoDigi: Adapt SM numbering convention.\n";
00302
00304 if(debug_)
00305 outfile.open("inputcopy.txt");
00306
00307 readInput();
00308
00309 }
00310
00311
00313 void
00314 EcalFEtoDigi::endJob() {
00315 if(outfile.is_open())
00316 outfile.close();
00317 }
00318
00320 int
00321 EcalFEtoDigi::SMidToTCCid( const int smid ) const {
00322
00323 return (smid<=18) ? smid+55-1 : smid+37-19;
00324
00325 }
00326
00328 void EcalFEtoDigi::getLUT(unsigned int * lut, const int towerId, const edm::EventSetup& evtSetup) const
00329 {
00330 edm::ESHandle<EcalTPGLutGroup> lutGrpHandle;
00331 evtSetup.get<EcalTPGLutGroupRcd>().get( lutGrpHandle );
00332 const EcalTPGGroups::EcalTPGGroupsMap & lutGrpMap = lutGrpHandle.product()->getMap() ;
00333 EcalTPGGroups::EcalTPGGroupsMapItr itgrp = lutGrpMap.find(towerId) ;
00334 uint32_t lutGrp = 999 ;
00335 if (itgrp != lutGrpMap.end()) lutGrp = itgrp->second ;
00336
00337 edm::ESHandle<EcalTPGLutIdMap> lutMapHandle;
00338 evtSetup.get<EcalTPGLutIdMapRcd>().get( lutMapHandle );
00339 const EcalTPGLutIdMap::EcalTPGLutMap & lutMap = lutMapHandle.product()->getMap() ;
00340 EcalTPGLutIdMap::EcalTPGLutMapItr itLut = lutMap.find(lutGrp) ;
00341 if (itLut != lutMap.end()) {
00342 const unsigned int * theLut = (itLut->second).getLut() ;
00343 for (unsigned int i=0 ; i<1024 ; i++) lut[i] = theLut[i] ;
00344 }
00345 }