00001 #include "SimCalorimetry/EcalElectronicsEmulation/interface/EcalSimRawData.h"
00002 #include "FWCore/Framework/interface/Event.h"
00003 #include "FWCore/Framework/interface/EventSetup.h"
00004 #include "Geometry/Records/interface/IdealGeometryRecord.h"
00005 #include "FWCore/Framework/interface/ESHandle.h"
00006 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00007 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00008
00009 #include <memory>
00010
00011 #include <fstream>
00012 #include <iostream>
00013 #include <iomanip>
00014 #include <cmath>
00015 #include "DataFormats/EcalDigi/interface/EcalMGPASample.h"
00016 #include "FWCore/Utilities/interface/Exception.h"
00017
00018 using namespace std;
00019 using namespace edm;
00020
00021 const int EcalSimRawData::ttType[nEbTtEta] = {
00022 0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,1,
00023 0,0,0,1,1,0,0,1,1,0,0,1,1,0,0,1,1
00024 };
00025
00026 const int EcalSimRawData::stripCh2Phi[nTtTypes][ttEdge][ttEdge] = {
00027
00028
00029 {{4,3,2,1,0},
00030 {0,1,2,3,4},
00031 {4,3,2,1,0},
00032 {0,1,2,3,4},
00033 {4,3,2,1,0}},
00034
00035 {{0,1,2,3,4},
00036 {4,3,2,1,0},
00037 {0,1,2,3,4},
00038 {4,3,2,1,0},
00039 {0,1,2,3,4}}
00040 };
00041
00042 const int EcalSimRawData::strip2Eta[nTtTypes][ttEdge] = {
00043 {4,3,2,1,0},
00044 {0,1,2,3,4}
00045 };
00046
00047 EcalSimRawData::EcalSimRawData(const edm::ParameterSet& params){
00048
00049 digiProducer_ = params.getParameter<string>("unsuppressedDigiProducer");
00050 ebDigiCollection_ = params.getParameter<std::string>("EBdigiCollection");
00051 eeDigiCollection_ = params.getParameter<std::string>("EEdigiCollection");
00052 srDigiProducer_ = params.getParameter<string>("srProducer");
00053 ebSrFlagCollection_ = params.getParameter<std::string>("EBSrFlagCollection");
00054 eeSrFlagCollection_ = params.getParameter<std::string>("EESrFlagCollection");
00055 tpDigiCollection_
00056 = params.getParameter<std::string>("trigPrimDigiCollection");
00057 tcpDigiCollection_ = params.getParameter<std::string>("tcpDigiCollection");
00058 tpProducer_ = params.getParameter<string>("trigPrimProducer");
00059 xtalVerbose_ = params.getUntrackedParameter<bool>("xtalVerbose", false);
00060 tpVerbose_ = params.getUntrackedParameter<bool>("tpVerbose", false);
00061 tcc2dcc_ = params.getUntrackedParameter<bool>("tcc2dccData", true);
00062 srp2dcc_ = params.getUntrackedParameter<bool>("srp2dccData", true);
00063 fe2dcc_ = params.getUntrackedParameter<bool>("fe2dccData", true);
00064 fe2tcc_ = params.getUntrackedParameter<bool>("fe2tccData", true);
00065 dccNum_ = params.getUntrackedParameter<int>("dccNum", -1);
00066 tccNum_ = params.getUntrackedParameter<int>("tccNum", -1);
00067 tccInDefaultVal_ = params.getUntrackedParameter<int>("tccInDefaultVal", 0xffff);
00068 basename_ = params.getUntrackedParameter<std::string>("outputBaseName");
00069
00070
00071 string writeMode = params.getParameter<string>("writeMode");
00072
00073 if(writeMode==string("littleEndian")){
00074 writeMode_ = littleEndian;
00075 } else if(writeMode==string("bigEndian")){
00076 writeMode_ = bigEndian;
00077 } else{
00078 writeMode_ = ascii;
00079 }
00080 }
00081
00082 void
00083 EcalSimRawData::analyze(const edm::Event& event,
00084 const edm::EventSetup& es){
00085
00086 static int iEvent = 0;
00087 ++iEvent;
00088
00089 if(xtalVerbose_ | tpVerbose_){
00090 cout << "======================================================================\n"
00091 << " Event " << iEvent << "\n"
00092 << "----------------------------------------------------------------------\n";
00093 }
00094
00095 if(fe2dcc_){
00096 vector<uint16_t> adc[nEbEta][nEbPhi];
00097 getEbDigi(event, adc);
00098 genFeData(basename_, iEvent, adc);
00099 }
00100
00101 if(fe2tcc_){
00102 int tcp[nTtEta][nTtPhi]={{0}};
00103 getTp(event, tcpDigiCollection_, tcp);
00104 genTccIn(basename_, iEvent, tcp);
00105 }
00106
00107 if(tcc2dcc_){
00108 int tp[nTtEta][nTtPhi]={{0}};
00109 getTp(event, tpDigiCollection_, tp);
00110 genTccOut(basename_, iEvent, tp);
00111 }
00112
00113
00114 int ebSrf[nTtEta][nTtPhi];
00115 int eeSrf[nEndcaps][nScX][nScY];
00116
00117 if(srp2dcc_){
00118 getSrfs(event, ebSrf, eeSrf);
00119 genSrData(basename_, iEvent, ebSrf);
00120 }
00121
00122 }
00123
00124 void EcalSimRawData::elec2GeomNum(int ittEta0, int ittPhi0, int strip1,
00125 int ch1, int& iEta0, int& iPhi0) const{
00126 assert(0<=ittEta0 && ittEta0<nEbTtEta);
00127 assert(0<=ittPhi0 && ittPhi0<nTtPhi);
00128 assert(1<=strip1&& strip1<=ttEdge);
00129 assert(1<=ch1 && ch1<=ttEdge);
00130 const int type = ttType[ittEta0];
00131 iEta0 = ittEta0*ttEdge + strip2Eta[type][strip1-1];
00132 iPhi0 = ittPhi0*ttEdge + stripCh2Phi[type][strip1-1][ch1-1];
00133 assert(0<=iEta0 && iEta0<nEbEta);
00134 assert(0<=iPhi0 && iPhi0<nEbPhi);
00135 }
00136
00137 void EcalSimRawData::fwrite(ofstream& f, uint16_t data,
00138 int& iWord, bool hpar) const{
00139
00140 if(hpar){
00141
00142 setHParity(data);
00143 }
00144
00145 switch(writeMode_){
00146 case littleEndian:
00147 {
00148 char c = data & 0x00FF;
00149 f.write(&c, sizeof(c));
00150 c = (data >>8) & 0x00FF;
00151 f.write(&c, sizeof(c));
00152 }
00153 break;
00154 case bigEndian:
00155 {
00156 char c = (data >>8) & 0x00FF;
00157 f.write(&c, sizeof(c));
00158 c = data & 0x00FF;
00159 f.write(&c, sizeof(c));
00160 }
00161 break;
00162 case ascii:
00163 f << ((iWord%8==0&&iWord!=0)?"\n":"")
00164 << "0x" << setfill('0') << setw(4) << hex << data << "\t"
00165 << dec << setfill(' ');
00166 break;
00167 }
00168 ++iWord;
00169 }
00170
00171 string EcalSimRawData::getExt() const{
00172 switch(writeMode_){
00173 case littleEndian:
00174 return ".le";
00175 case bigEndian:
00176 return ".be";
00177 case ascii:
00178 return ".txt";
00179 default:
00180 return".?";
00181 }
00182 }
00183
00184 void EcalSimRawData::genFeData(string basename, int iEvent,
00185 const vector<uint16_t> adcCount[nEbEta][nEbPhi]
00186 ) const{
00187 int smf = 0;
00188 int gmf = 0;
00189 int nPendingEvt = 0;
00190 int monitorFlag = 0;
00191 int chFrameLen = adcCount[0][0].size() + 1;
00192
00193 int iWord = 0;
00194
00195 for(int iZ0 = 0; iZ0<2; ++iZ0){
00196 for(int iDccPhi0 = 0; iDccPhi0<nDccInPhi; ++iDccPhi0){
00197 int iDcc1 = iDccPhi0 + iZ0*nDccInPhi + nDccEndcap + 1;
00198
00199 if(dccNum_!=-1 && dccNum_!=iDcc1) continue;
00200
00201 stringstream s;
00202 s.str("");
00203 const string& ext = getExt();
00204 s << basename << "_fe2dcc" << setfill('0') << setw(2) << iDcc1
00205 << setfill(' ') << ext;
00206 ofstream f(s.str().c_str(), (iEvent==1?ios::ate:ios::app));
00207
00208 if(!f) return;
00209
00210
00211 if(writeMode_==ascii){
00212 f << (iEvent==1?"":"\n") << "[Event:" << iEvent << "]\n";
00213 }
00214
00215 for(int iTtEtaInSm0 = 0; iTtEtaInSm0 < nTtSmEta; ++iTtEtaInSm0){
00216 int iTtEta0 = iZ0*nTtSmEta + iTtEtaInSm0;
00217 for(int iTtPhiInSm0 = 0; iTtPhiInSm0 < nTtSmPhi; ++iTtPhiInSm0){
00218
00219 int iTtPhi0 = -nTtPhisPerEbDcc/2 + iDccPhi0*nTtPhisPerEbDcc
00220 + iTtPhiInSm0;
00221 if(iTtPhi0<0) iTtPhi0 += nTtPhi;
00222 for(int stripId1 = 1; stripId1 <= ttEdge; ++stripId1){
00223 uint16_t stripHeader =
00224 0xF << 11
00225 | (nPendingEvt & 0x3F) << 5
00226 | (gmf & 0x1) << 4
00227 | (smf & 0x1) << 3
00228 | (stripId1 & 0x7);
00230 fwrite(f,stripHeader, iWord);
00231
00232 for(int xtalId1 = 1; xtalId1 <= ttEdge; ++xtalId1){
00233
00234 uint16_t crystalHeader =
00235 1 <<14
00236 | (chFrameLen & 0xFF) <<4
00237 | (monitorFlag & 0x1) <<3
00238 | (xtalId1 & 0x7);
00239
00240 fwrite(f, crystalHeader, iWord);
00241
00242 int iEta0;
00243 int iPhi0;
00244 elec2GeomNum(iTtEta0, iTtPhi0, stripId1, xtalId1,
00245 iEta0, iPhi0);
00246 if(xtalVerbose_){
00247 cout << dec
00248 << "iDcc1 = " << iDcc1 << "\t"
00249 << "iEbTtEta0 = " << iTtEta0 << "\t"
00250 << "iEbTtPhi0 = " << iTtPhi0 << "\t"
00251 << "stripId1 = " << stripId1 << "\t"
00252 << "xtalId1 = " << xtalId1 << "\t"
00253 << "iEta0 = " << iEta0 << "\t"
00254 << "iPhi0 = " << iPhi0 << "\t"
00255 << "adc[5] = 0x" << hex << adcCount[iEta0][iPhi0][5]
00256 << dec << "\n";
00257 }
00258
00259
00260 const vector<uint16_t>& adc = adcCount[iEta0][iPhi0];
00261 for(unsigned iSample=0; iSample < adc.size(); ++iSample){
00262 uint16_t data = adc[iSample] & 0x3FFF;
00263
00264 fwrite(f, data, iWord);
00265 }
00266 }
00267 }
00268 }
00269 }
00270 }
00271 }
00272 }
00273
00274 void EcalSimRawData::genSrData(string basename, int iEvent,
00275 int srf[nEbTtEta][nTtPhi]) const{
00276 for(int iZ0 = 0; iZ0<2; ++iZ0){
00277 for(int iDccPhi0 = 0; iDccPhi0<nDccInPhi; ++iDccPhi0){
00278 int iDcc1 = iDccPhi0 + iZ0*nDccInPhi + nDccEndcap + 1;
00279 if(dccNum_!=-1 && dccNum_!=iDcc1) continue;
00280 stringstream s;
00281 s.str("");
00282 s << basename << "_ab2dcc" << setfill('0') << setw(2) << iDcc1
00283 << setfill(' ') << getExt();
00284 ofstream f(s.str().c_str(), (iEvent==1?ios::ate:ios::app));
00285
00286 if(!f) throw cms::Exception(string("Cannot create/open file ")
00287 + s.str() + ".");
00288
00289 int iWord = 0;
00290
00291 if(writeMode_==ascii){
00292 f << (iEvent==1?"":"\n")<< "[Event:" << iEvent << "]\n";
00293 }
00294
00295 const uint16_t le1 = 0;
00296 const uint16_t le0 = 0;
00297 const uint16_t h1 = 1;
00298 const uint16_t nFlags = 68;
00299 uint16_t data = (h1 & 0x1)<< 14
00300 | (le1 & 0x1) << 12
00301 | (le0 & 0x1) << 11
00302 | (nFlags & 0x7F);
00303
00304 fwrite(f, data, iWord, true);
00305
00306 int iFlag = 0;
00307 data = 0;
00308
00309 for(int iTtEtaInSm0 = 0; iTtEtaInSm0 < nTtSmEta; ++iTtEtaInSm0){
00310
00311 int iTtEta0 = nEeTtEta + iZ0*nTtSmEta + iTtEtaInSm0;
00312 for(int iTtPhiInSm0 = 0; iTtPhiInSm0 < nTtSmPhi; ++iTtPhiInSm0){
00313
00314 int iTtPhi0 = -nTtPhisPerEbDcc/2 + iDccPhi0*nTtPhisPerEbDcc
00315 + iTtPhiInSm0;
00316 if(iTtPhi0<0) iTtPhi0 += nTtPhi;
00317
00318
00319
00320
00321 const int field = iFlag%4;
00322
00323
00324
00325 data |= srf[iTtEta0][iTtPhi0] << (field*3);
00326
00327 if(field==3){
00328
00329 fwrite(f, data, iWord, true);
00330 data = 0;
00331 }
00332 ++iFlag;
00333 }
00334 }
00335 }
00336 }
00337 }
00338
00339
00340 void EcalSimRawData::genTccIn(string basename, int iEvent,
00341 const int tcp[nTtEta][nTtPhi]) const{
00342 for(int iZ0 = 0; iZ0<2; ++iZ0){
00343 for(int iTccPhi0 = 0; iTccPhi0<nTccInPhi; ++iTccPhi0){
00344 int iTcc1 = iTccPhi0 + iZ0*nTccInPhi + nTccEndcap + 1;
00345
00346 if(tccNum_!=-1 && tccNum_!=iTcc1) continue;
00347
00348 stringstream s;
00349 s.str("");
00350 const char* ext = ".txt";
00351
00352 s << basename << "_tcc" << setfill('0') << setw(2) << iTcc1
00353 << setfill(' ') << ext;
00354 ofstream fe2tcc(s.str().c_str(), (iEvent==1?ios::ate:ios::app));
00355
00356 if(!fe2tcc) throw cms::Exception(string("Failed to create file ")
00357 + s.str() + ".");
00358
00359 int memPos = iEvent-1;
00360 int iCh1 = 1;
00361 for(int iTtEtaInSm0 = 0; iTtEtaInSm0 < nTtSmEta; ++iTtEtaInSm0){
00362 int iTtEta0 = (iZ0==0) ? 27 - iTtEtaInSm0 : 28 + iTtEtaInSm0;
00363 for(int iTtPhiInSm0 = 0; iTtPhiInSm0 < nTtSmPhi; ++iTtPhiInSm0){
00364
00365 int iTtPhi0 = -nTtPhisPerEbTcc/2 + iTccPhi0*nTtPhisPerEbTcc
00366 + iTtPhiInSm0;
00367 iTtPhi0 += nTtPhisPerEbTcc*iTccPhi0;
00368 if(iTtPhi0<0) iTtPhi0 += nTtPhi;
00369 uint16_t tp_fe2tcc = (tcp[iTtEta0][iTtPhi0] & 0x7ff) ;
00370
00371 if(tpVerbose_ && tp_fe2tcc!=0){
00372 cout << dec
00373 << "iTcc1 = " << iTcc1 << "\t"
00374 << "iTtEta0 = " << iTtEta0 << "\t"
00375 << "iTtPhi0 = " << iTtPhi0 << "\t"
00376 << "iCh1 = " << iCh1 << "\t"
00377 << "memPos = " << memPos << "\t"
00378 << "tp = 0x" << setfill('0') << hex << setw(3)
00379 << tp_fe2tcc
00380 << dec << setfill(' ') << "\n";
00381 }
00382 fe2tcc << iCh1 << "\t"
00383 << memPos << "\t"
00384 << setfill('0') << hex
00385 << "0x" << setw(4) << tp_fe2tcc << "\t"
00386 << "0"
00387 << dec << setfill(' ') << "\n";
00388 ++iCh1;
00389 }
00390 }
00391 fe2tcc << std::flush;
00392 fe2tcc.close();
00393 }
00394 }
00395 }
00396
00397
00398 void EcalSimRawData::genTccOut(string basename, int iEvent,
00399 const int tps[nTtEta][nTtPhi]) const{
00400 int iDccWord = 0;
00401
00402 for(int iZ0 = 0; iZ0<2; ++iZ0){
00403 for(int iTccPhi0 = 0; iTccPhi0<nTccInPhi; ++iTccPhi0){
00404 int iTcc1 = iTccPhi0 + iZ0*nTccInPhi + nTccEndcap + 1;
00405
00406 if(tccNum_!=-1 && tccNum_!=iTcc1) continue;
00407
00408 stringstream s;
00409 s.str("");
00410 const char* ext = ".txt";
00411
00412 s << basename << "_tcc" << setfill('0') << setw(2) << iTcc1
00413 << setfill(' ') << ext;
00414
00415 s.str("");
00416 s << basename << "_tcc2dcc" << setfill('0') << setw(2) << iTcc1
00417 << setfill(' ') << getExt();
00418 ofstream dccF(s.str().c_str(), (iEvent==1?ios::ate:ios::app));
00419
00420 if(!dccF){
00421 cout << "Warning: failed to create or open file " << s << ".\n";
00422 return;
00423 }
00424
00425 const uint16_t h1 = 1;
00426 const uint16_t le1 = 0;
00427 const uint16_t le0 = 0;
00428 const uint16_t nSamples = 1;
00429 const uint16_t nTts = 68;
00430 const uint16_t data = (h1 & 0x1) << 14
00431 | (le1 & 0x1) << 12
00432 | (le0 & 0x1) << 11
00433 | (nSamples & 0xF) << 7
00434 | (nTts & 0x7F);
00435 dccF << (iEvent==1?"":"\n") << "[Event:" << iEvent << "]\n";
00436 fwrite(dccF, data, iDccWord, false);
00437
00438 int memPos = iEvent-1;
00439 int iCh1 = 1;
00440 for(int iTtEtaInSm0 = 0; iTtEtaInSm0 < nTtSmEta; ++iTtEtaInSm0){
00441 int iTtEta0 = nEeTtEta + iZ0*nTtSmEta + iTtEtaInSm0;
00442 for(int iTtPhiInSm0 = 0; iTtPhiInSm0 < nTtSmPhi; ++iTtPhiInSm0){
00443
00444 int iTtPhi0 = -nTtPhisPerEbTcc/2 + iTccPhi0*nTtPhisPerEbTcc
00445 + iTtPhiInSm0;
00446 if(iTtPhi0<0) iTtPhi0 += nTtPhi;
00447
00448 if(tpVerbose_){
00449 cout << dec
00450 << "iTcc1 = " << iTcc1 << "\t"
00451 << "iTtEta0 = " << iTtEta0 << "\t"
00452 << "iTtPhi0 = " << iTtPhi0 << "\t"
00453 << "iCh1 = " << iCh1 << "\t"
00454 << "memPos = " << memPos << "\t"
00455 << "tp = 0x" << hex << tps[iTtEta0][iTtPhi0]
00456 << dec << "\n";
00457 }
00458 fwrite(dccF, tps[iTtEta0][iTtPhi0], iDccWord, false);
00459 ++iCh1;
00460 }
00461 }
00462 }
00463 }
00464 }
00465
00466
00467 void EcalSimRawData::setHParity(uint16_t& a) const{
00468 const int odd = 1 <<15;
00469 const int even = 0;
00470
00471
00472 const int p[16] = {even,odd,odd,even,odd,even,even,odd,odd,even,even,odd,even,odd,odd,even};
00473
00474 a ^= p[a&0xF] ^ p[(a>>4)&0xF] ^ p[(a>>8)&0xF] ^ p[a>>12&0xF] ^ odd;
00475 }
00476
00477 void EcalSimRawData::getSrfs(const edm::Event& event,
00478 int ebSrf[nTtEta][nTtPhi],
00479 int eeSrf[nEndcaps][nScX][nScY]) const{
00480
00481
00482 edm::Handle<EESrFlagCollection> hEeSrFlags;
00483 event.getByLabel(srDigiProducer_, eeSrFlagCollection_, hEeSrFlags);
00484 for(size_t i=0; i < sizeof(eeSrf)/sizeof(int); ((int*)eeSrf)[i++] = -1){};
00485 if(hEeSrFlags.isValid()){
00486 for(EESrFlagCollection::const_iterator it = hEeSrFlags->begin();
00487 it != hEeSrFlags->end(); ++it){
00488 const EESrFlag& flag = *it;
00489 int iZ0 = flag.id().zside()>0?1:0;
00490 int iX0 = flag.id().ix()-1;
00491 int iY0 = flag.id().iy()-1;
00492 assert(iZ0>=0 && iZ0<nEndcaps);
00493 assert(iX0>=0 && iX0<nScX);
00494 assert(iY0>=0 && iY0<nScY);
00495 eeSrf[iZ0][iX0][iY0] = flag.value();
00496 }
00497 } else{
00498 LogWarning("EcalSimRawData") << "EE SR flag not found ("
00499 << "Product label: " << srDigiProducer_
00500 << "Producet instance: "
00501 << eeSrFlagCollection_ << ")";
00502 }
00503
00504
00505 edm::Handle<EBSrFlagCollection> hEbSrFlags;
00506 event.getByLabel(srDigiProducer_, ebSrFlagCollection_, hEbSrFlags);
00507 for(size_t i=0; i<sizeof(ebSrf)/sizeof(int); ((int*)ebSrf)[i++] = -1){};
00508 if(hEbSrFlags.isValid()){
00509 for(EBSrFlagCollection::const_iterator it = hEbSrFlags->begin();
00510 it != hEbSrFlags->end(); ++it){
00511
00512 const EBSrFlag& flag = *it;
00513 int iEta = flag.id().ieta();
00514 int iEta0 = iEta + nTtEta/2 - (iEta>=0?1:0);
00515 int iEbEta0 = iEta0 - nEeTtEta;
00516 int iPhi0 = flag.id().iphi() - 1;
00517
00518 assert(iEbEta0>=0 && iEbEta0<nEbTtEta);
00519 assert(iPhi0>=0 && iPhi0<nTtPhi);
00520
00521 ebSrf[iEbEta0][iPhi0] = flag.value();
00522 }
00523 } else{
00524 LogWarning("EcalSimRawData") << "EB SR flag not found ("
00525 << "Product label: " << srDigiProducer_
00526 << "Producet instance: "
00527 << ebSrFlagCollection_ << ")";
00528 }
00529 }
00530
00531 void EcalSimRawData::getEbDigi(const edm::Event& event,
00532 vector<uint16_t> adc[nEbEta][nEbPhi]) const{
00533
00534 edm::Handle<EBDigiCollection> hEbDigis;
00535 event.getByLabel(digiProducer_, ebDigiCollection_, hEbDigis);
00536
00537 int nSamples = 0;
00538 if(hEbDigis.isValid() && hEbDigis->size()>0){
00539 nSamples = hEbDigis->begin()->size();
00540 }
00541
00542
00543 const uint16_t suppressed = 0xFFFF;
00544
00545 adc[0][0] = vector<uint16_t>(nSamples, suppressed);
00546
00547 for(int iEbEta=0; iEbEta<nEbEta; ++iEbEta){
00548 for(int iEbPhi=0; iEbPhi<nEbPhi; ++iEbPhi){
00549 adc[iEbEta][iEbPhi] = adc[0][0];
00550 }
00551 }
00552 if(hEbDigis.isValid()){
00553 if(xtalVerbose_) cout << setfill('0');
00554 for(EBDigiCollection::const_iterator it = hEbDigis->begin();
00555 it != hEbDigis->end(); ++it){
00556 const EBDataFrame& frame = *it;
00557
00558 int iEta0 = iEta2cIndex((frame.id()).ieta());
00559 int iPhi0 = iPhi2cIndex((frame.id()).iphi());
00560
00561
00562
00563
00564
00565 if(iEta0<0 || iEta0>=nEbEta){
00566 cout << "iEta0 (= " << iEta0 << ") is out of range ("
00567 << "[0," << nEbEta -1 << "])\n";
00568 }
00569 if(iPhi0<0 || iPhi0>=nEbPhi){
00570 cout << "iPhi0 (= " << iPhi0 << ") is out of range ("
00571 << "[0," << nEbPhi -1 << "])\n";
00572 }
00573
00574 if(xtalVerbose_){
00575 cout << iEta0 << "\t" << iPhi0 << ":\t";
00576 cout << hex;
00577 }
00578
00579 if(nSamples!=frame.size()){
00580 throw cms::Exception("EcalSimRawData", "Found EB digis with different sample count! This is not supported by EcalSimRawData.");
00581 }
00582
00583 for(int iSample=0; iSample<nSamples; ++iSample){
00584 const EcalMGPASample& sample = frame.sample(iSample);
00585 uint16_t encodedAdc = sample.raw();
00586 adc[iEta0][iPhi0][iSample] = encodedAdc;
00587 if(xtalVerbose_){
00588 cout << (iSample>0?" ":"") << "0x" << setw(4)
00589 << encodedAdc;
00590 }
00591 }
00592 if(xtalVerbose_) cout << "\n" << dec;
00593 }
00594 if(xtalVerbose_) cout << setfill(' ');
00595 }
00596 }
00597
00598
00599 void EcalSimRawData::getTp(const edm::Event& event,
00600 const std::string& collName,
00601 int tcp[nTtEta][nTtPhi]) const{
00602 edm::Handle<EcalTrigPrimDigiCollection> hTpDigis;
00603 event.getByLabel(tpProducer_, collName, hTpDigis);
00604 if(hTpDigis.isValid() && hTpDigis->size()>0){
00605 const EcalTrigPrimDigiCollection& tpDigis = *hTpDigis.product();
00606
00607
00608 for(int iTtEta0=0; iTtEta0 < nTtEta; ++iTtEta0){
00609 for(int iTtPhi0=0; iTtPhi0 < nTtPhi; ++iTtPhi0){
00610 tcp[iTtEta0][iTtPhi0] = tccInDefaultVal_ ;
00611 }
00612 }
00613 if(tpVerbose_){
00614 cout << setfill('0');
00615 }
00616 for(EcalTrigPrimDigiCollection::const_iterator it = tpDigis.begin();
00617 it != tpDigis.end(); ++it){
00618 const EcalTriggerPrimitiveDigi& tp = *it;
00619 int iTtEta0 = iTtEta2cIndex(tp.id().ieta());
00620 int iTtPhi0 = iTtPhi2cIndex(tp.id().iphi());
00621 if(iTtEta0<0 || iTtEta0>=nTtEta){
00622 cout << "iTtEta0 (= " << iTtEta0 << ") is out of range ("
00623 << "[0," << nEbTtEta -1 << "])\n";
00624 }
00625 if(iTtPhi0<0 || iTtPhi0>=nTtPhi){
00626 cout << "iTtPhi0 (= " << iTtPhi0 << ") is out of range ("
00627 << "[0," << nTtPhi -1 << "])\n";
00628 }
00629
00630 tcp[iTtEta0][iTtPhi0] = tp[tp.sampleOfInterest()].raw();
00631
00632 if(tpVerbose_){
00633 if(tcp[iTtEta0][iTtPhi0]!=0)
00634 cout << collName << (collName.size()==0?"":" ")
00635 << "TP(" << setw(2) << iTtEta0 << "," << iTtPhi0 << ") = "
00636 << "0x" << setw(4)
00637 << tcp[iTtEta0][iTtPhi0]
00638 << "\tcmssw indices: "
00639 << tp.id().ieta() << " " << tp.id().iphi() << "\n";
00640 }
00641 }
00642 if(tpVerbose_) cout << setfill(' ');
00643 }
00644 }