00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include <cmath>
00016 #include <iostream>
00017 #include <iomanip>
00018
00019
00020 #include "SimG4CMS/HcalTestBeam/interface/HcalTB02Analysis.h"
00021
00022
00023 #include "SimG4CMS/Calo/interface/CaloG4Hit.h"
00024 #include "SimG4CMS/Calo/interface/CaloG4HitCollection.h"
00025 #include "SimG4CMS/HcalTestBeam/interface/HcalTB02HcalNumberingScheme.h"
00026 #include "SimG4CMS/HcalTestBeam/interface/HcalTB02XtalNumberingScheme.h"
00027
00028 #include "FWCore/Framework/interface/Event.h"
00029 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00030 #include "FWCore/ServiceRegistry/interface/Service.h"
00031 #include "FWCore/Utilities/interface/RandomNumberGenerator.h"
00032 #include "CLHEP/Random/RandGaussQ.h"
00033 #include "FWCore/Utilities/interface/Exception.h"
00034
00035 #include "G4SDManager.hh"
00036 #include "G4VProcess.hh"
00037 #include "G4HCofThisEvent.hh"
00038 #include "CLHEP/Units/SystemOfUnits.h"
00039 #include "CLHEP/Units/PhysicalConstants.h"
00040
00041
00042
00043
00044
00045 HcalTB02Analysis::HcalTB02Analysis(const edm::ParameterSet &p): histo(0) {
00046
00047 edm::ParameterSet m_Anal = p.getParameter<edm::ParameterSet>("HcalTB02Analysis");
00048 hcalOnly = m_Anal.getUntrackedParameter<bool>("HcalClusterOnly",true);
00049 names = m_Anal.getParameter<std::vector<std::string> >("Names");
00050
00051 produces<HcalTB02HistoClass>();
00052
00053 edm::LogInfo("HcalTBSim") << "HcalTB02Analysis:: Initialised as observer of "
00054 << "BeginOfJob/BeginOfEvent/EndOfEvent with "
00055 << "Parameter values:\n \thcalOnly = " << hcalOnly;
00056
00057 histo = new HcalTB02Histo(m_Anal);
00058 }
00059
00060 HcalTB02Analysis::~HcalTB02Analysis() {
00061
00062 finish();
00063
00064 if (histo) {
00065 delete histo;
00066 histo = 0;
00067 }
00068 edm::LogInfo("HcalTBSim") << "HcalTB02Analysis is deleting";
00069 }
00070
00071
00072
00073
00074
00075 void HcalTB02Analysis::produce(edm::Event& e, const edm::EventSetup&) {
00076
00077 std::auto_ptr<HcalTB02HistoClass> product(new HcalTB02HistoClass);
00078 fillEvent(*product);
00079 e.put(product);
00080 }
00081
00082 void HcalTB02Analysis::update(const BeginOfEvent * evt) {
00083
00084 edm::LogInfo("HcalTBSim") << "HcalTB02Analysis: =====> Begin of event = "
00085 << (*evt) ()->GetEventID();
00086 clear();
00087 }
00088
00089 void HcalTB02Analysis::update(const EndOfEvent * evt) {
00090
00091 edm::Service<edm::RandomNumberGenerator> rng;
00092 if ( ! rng.isAvailable()) {
00093 throw cms::Exception("Configuration")
00094 << "HcalTB02Analysis requires the RandomNumberGeneratorService\n"
00095 << "which is not present in the configuration file. "
00096 << "You must add the service\n in the configuration file or "
00097 << "remove the modules that require it.";
00098 }
00099 CLHEP::RandGaussQ randGauss(rng->getEngine());
00100
00101
00102 LogDebug("HcalTBSim") << "HcalTB02Analysis::Fill event "
00103 << (*evt)()->GetEventID();
00104
00105
00106 G4HCofThisEvent* allHC = (*evt)()->GetHCofThisEvent();
00107 int ihit = 0;
00108
00109
00110 std::string sd = names[0];
00111 int HCHCid = G4SDManager::GetSDMpointer()->GetCollectionID(sd);
00112 CaloG4HitCollection* theHCHC = (CaloG4HitCollection*) allHC->GetHC(HCHCid);
00113 HcalTB02HcalNumberingScheme *org = new HcalTB02HcalNumberingScheme();
00114 LogDebug("HcalTBSim") << "HcalTB02Analysis :: Hit Collection for " << sd
00115 << " of ID " << HCHCid << " is obtained at " <<theHCHC;
00116
00117 int nentries = 0;
00118 nentries = theHCHC->entries();
00119 if (nentries==0) return;
00120
00121 int xentries = 0;
00122 int XTALSid=0;
00123 CaloG4HitCollection* theXTHC=0;
00124
00125 if (!hcalOnly) {
00126
00127 sd = names[1];
00128 XTALSid = G4SDManager::GetSDMpointer()->GetCollectionID(sd);
00129
00130 theXTHC = (CaloG4HitCollection*) allHC->GetHC(XTALSid);
00131
00132
00133 LogDebug("HcalTBSim") << "HcalTB02Analysis :: Hit Collection for " << sd
00134 << " of ID " << XTALSid << " is obtained at "
00135 << theXTHC;
00136 xentries = theXTHC->entries();
00137 if (xentries==0) return;
00138 }
00139
00140 LogDebug("HcalTBSim") << "HcalTB02Analysis :: There are " << nentries
00141 << " HCal hits, and" << xentries << " xtal hits";
00142
00143 float ETot=0., xETot=0.;
00144
00145
00146 int scintID=0, xtalID=0;
00147
00148
00149
00150 if (HCHCid >= 0 && theHCHC > 0) {
00151 for ( ihit = 0; ihit < nentries; ihit++) {
00152
00153 CaloG4Hit* aHit = (*theHCHC)[ihit];
00154 scintID = aHit->getUnitID();
00155 int layer = org->getlayerID(scintID);
00156 float enEm = aHit->getEM();
00157 float enhad = aHit->getHadr();
00158
00159 if (layer==0) {
00160 enEm =enEm/2.;
00161 enhad=enhad/2.;
00162 }
00163
00164 energyInScints[scintID]+= enEm + enhad;
00165 primaries[aHit->getTrackID()]+= enEm + enhad;
00166 float time = aHit->getTimeSliceID();
00167 if (time > maxTime) maxTime=(int)time;
00168 histo->fillAllTime(time);
00169
00170 }
00171
00172
00173
00174
00175
00176 float TowerEne[8][18], TowerEneCF[8][18], LayerEne[19], EnRing[100];
00177 for (int iphi=0 ; iphi<8; iphi++) {
00178 for (int jeta=0 ; jeta<18; jeta++) {
00179 TowerEne[iphi][jeta]=0.;
00180 TowerEneCF[iphi][jeta]=0.;
00181 }
00182 }
00183
00184 for (int ilayer=0; ilayer<19; ilayer++) LayerEne[ilayer]=0.;
00185 for (int iring=0; iring<100; iring++) EnRing[iring]=0.;
00186
00187 for (std::map<int,float>::iterator is = energyInScints.begin();
00188 is!= energyInScints.end(); is++) {
00189
00190 ETot = (*is).second;
00191
00192 int layer = org->getlayerID((*is).first);
00193
00194 if ( (layer!=17) && (layer!=18) ) {
00195
00196 float eta = org->getetaID((*is).first);
00197 float phi = org->getphiID((*is).first);
00198
00199 SEnergy += ETot;
00200 TowerEne[(int)phi][(int)eta] += ETot;
00201
00202 TowerEneCF[(int)phi][(int)eta] += ETot*(1.+ 0.1*randGauss.fire() );
00203 double dR=0.08727*std::sqrt( (eta-8.)*(eta-8.) + (phi-3.)*(phi-3.) );
00204 EnRing[(int)(dR/0.01)] += ETot;
00205 }
00206
00207 LayerEne[layer] += ETot;
00208
00209 }
00210
00211 for (int ilayer=0 ; ilayer<19 ; ilayer++) {
00212 histo->fillProfile(ilayer,LayerEne[ilayer]/GeV);
00213 }
00214
00215 for (int iring=0; iring<100; iring++)
00216 histo->fillTransProf(0.01*iring+0.005,EnRing[iring]/GeV);
00217
00218 for (int iphi=0 ; iphi<8; iphi++) {
00219 for (int jeta=0 ; jeta<18; jeta++) {
00220
00221
00222 SEnergyN += TowerEneCF[iphi][jeta] + 3.*randGauss.fire();
00223
00224
00225
00226
00227
00228
00229
00230 double Rand = 3.*randGauss.fire();
00231
00232 if ( (iphi>=0) && (iphi<7) ) {
00233 if ( (jeta>=5) && (jeta<12) ) {
00234
00235 E7x7Matrix += TowerEne[iphi][jeta];
00236 E7x7MatrixN += TowerEneCF[iphi][jeta] + Rand;
00237
00238 if ( (iphi>=1) && (iphi<6) ) {
00239 if ( (jeta>=6) && (jeta<11) ) {
00240
00241 E5x5Matrix += TowerEne[iphi][jeta];
00242 E5x5MatrixN += TowerEneCF[iphi][jeta] + Rand;
00243
00244 }
00245 }
00246
00247 }
00248 }
00249
00250 }
00251 }
00252
00253
00254
00255
00256 int trackID = 0;
00257 G4PrimaryParticle* thePrim=0;
00258 G4int nvertex = (*evt)()->GetNumberOfPrimaryVertex();
00259 LogDebug("HcalTBSim") << "HcalTB02Analysis :: Event has " << nvertex
00260 << " vertex";
00261 if (nvertex==0)
00262 edm::LogWarning("HcalTBSim") << "HcalTB02Analysis:: End Of Event "
00263 << "ERROR: no vertex";
00264
00265 for (int i = 0 ; i<nvertex; i++) {
00266
00267 G4PrimaryVertex* avertex = (*evt)()->GetPrimaryVertex(i);
00268 if (avertex == 0) {
00269 edm::LogWarning("HcalTBSim") << "HcalTB02Analysis:: End Of Event "
00270 << "ERROR: pointer to vertex = 0";
00271 } else {
00272 int npart = avertex->GetNumberOfParticle();
00273 LogDebug("HcalTBSim") << "HcalTB02Analysis::Vertex number :" << i
00274 << " with " << npart << " particles";
00275 if (thePrim==0) thePrim=avertex->GetPrimary(trackID);
00276 }
00277 }
00278
00279 double px=0.,py=0.,pz=0.;
00280
00281 if (thePrim != 0) {
00282 px = thePrim->GetPx();
00283 py = thePrim->GetPy();
00284 pz = thePrim->GetPz();
00285 pInit = std::sqrt(pow(px,2.)+pow(py,2.)+pow(pz,2.));
00286 if (pInit==0) {
00287 edm::LogWarning("HcalTBSim") << "HcalTB02Analysis:: End Of Event "
00288 << " ERROR: primary has p=0 ";
00289 } else {
00290 float costheta = pz/pInit;
00291 float theta = acos(std::min(std::max(costheta,float(-1.)),float(1.)));
00292 eta = -log(tan(theta/2));
00293 if (px != 0) phi = atan(py/px);
00294 }
00295 particleType = thePrim->GetPDGcode();
00296 } else {
00297 LogDebug("HcalTBSim") << "HcalTB02Analysis:: End Of Event ERROR: could"
00298 << " not find primary ";
00299 }
00300
00301 CaloG4Hit* firstHit =(*theHCHC)[0];
00302 incidentEnergy = (firstHit->getIncidentEnergy()/GeV);
00303
00304 }
00305
00306 if (!hcalOnly) {
00307
00308
00309
00310 if (XTALSid >= 0 && theXTHC > 0) {
00311 for (int xihit = 0; xihit < xentries; xihit++) {
00312
00313 CaloG4Hit* xaHit = (*theXTHC)[xihit];
00314
00315 float xenEm = xaHit->getEM();
00316 float xenhad = xaHit->getHadr();
00317 xtalID = xaHit->getUnitID();
00318
00319 energyInCrystals[xtalID]+= xenEm + xenhad;
00320 }
00321
00322 float xCrysEne[7][7];
00323 for (int irow=0 ; irow<7; irow++) {
00324 for (int jcol=0 ; jcol<7; jcol++) {
00325 xCrysEne[irow][jcol]=0.;
00326 }
00327 }
00328
00329 for (std::map<int,float>::iterator is = energyInCrystals.begin();
00330 is!= energyInCrystals.end(); is++) {
00331 int xtalID = (*is).first;
00332 xETot = (*is).second;
00333
00334 int irow = (int)(xtalID/100.);
00335 int jcol = (int)(xtalID-100.*irow);
00336
00337 xSEnergy += xETot;
00338 xCrysEne[irow][jcol] = xETot;
00339
00340 float dR=std::sqrt( 0.01619*0.01619*(jcol-3)*(jcol-3) +
00341 0.01606*0.01606*(irow-3)*(irow-3) );
00342 histo->fillTransProf(dR,xETot*1.05);
00343
00344 if ( (irow>0) && (irow<6) ) {
00345 if ( (jcol>0) && (jcol<6) ) {
00346
00347 xE5x5Matrix += xCrysEne[irow][jcol];
00348 xE5x5MatrixN += xCrysEne[irow][jcol] + 108.5*randGauss.fire();
00349
00350 if ( (irow>1) && (irow<5) ) {
00351 if ( (jcol>1) && (jcol<5) ) {
00352 xE3x3Matrix += xCrysEne[irow][jcol];
00353 xE3x3MatrixN += xCrysEne[irow][jcol] +108.5*randGauss.fire();
00354 }
00355 }
00356 }
00357 }
00358
00359 }
00360
00361 if (!hcalOnly) {
00362
00363 if ( theXTHC != 0 ) {
00364 CaloG4Hit* xfirstHit =(*theXTHC)[0];
00365 xIncidentEnergy = xfirstHit->getIncidentEnergy()/GeV;
00366 }
00367 }
00368
00369 }
00370
00371 }
00372
00373 int iEvt = (*evt)()->GetEventID();
00374 if (iEvt < 10)
00375 std::cout << " Event " << iEvt << std::endl;
00376 else if ((iEvt < 100) && (iEvt%10 == 0))
00377 std::cout << " Event " << iEvt << std::endl;
00378 else if ((iEvt < 1000) && (iEvt%100 == 0))
00379 std::cout << " Event " << iEvt << std::endl;
00380 else if ((iEvt < 10000) && (iEvt%1000 == 0))
00381 std::cout << " Event " << iEvt << std::endl;
00382 }
00383
00384 void HcalTB02Analysis::fillEvent(HcalTB02HistoClass& product) {
00385
00386
00387 product.set_Nprim(float(primaries.size()));
00388 product.set_partType(particleType);
00389 product.set_Einit(pInit/GeV);
00390 product.set_eta(eta);
00391 product.set_phi(phi);
00392 product.set_Eentry(incidentEnergy);
00393
00394
00395 product.set_ETot(SEnergy/GeV );
00396 product.set_E7x7(E7x7Matrix/GeV );
00397 product.set_E5x5(E5x5Matrix/GeV );
00398 product.set_ETotN(SEnergyN/GeV);
00399 product.set_E7x7N(E7x7MatrixN/GeV );
00400 product.set_E5x5N(E5x5MatrixN/GeV );
00401 product.set_NUnit(float(energyInScints.size()));
00402 product.set_Ntimesli(float(maxTime));
00403
00404
00405 product.set_xEentry(xIncidentEnergy);
00406 product.set_xNUnit(float(energyInCrystals.size()));
00407 product.set_xETot(xSEnergy/GeV);
00408 product.set_xETotN(xSEnergyN/GeV);
00409 product.set_xE5x5(xE5x5Matrix/GeV);
00410 product.set_xE3x3(xE3x3Matrix/GeV);
00411 product.set_xE5x5N(xE5x5MatrixN/GeV);
00412 product.set_xE3x3N(xE3x3MatrixN/GeV);
00413 }
00414
00415 void HcalTB02Analysis::clear() {
00416
00417 primaries.clear();
00418 particleType = 0;
00419 pInit = eta = phi = incidentEnergy = 0;
00420
00421 SEnergy = E7x7Matrix = E5x5Matrix = SEnergyN = 0;
00422 E7x7MatrixN = E5x5MatrixN = 0;
00423 energyInScints.clear();
00424 maxTime = 0;
00425
00426 xIncidentEnergy = 0;
00427 energyInCrystals.clear();
00428 xSEnergy = xSEnergyN = xE5x5Matrix = xE3x3Matrix = 0;
00429 xE5x5MatrixN = xE3x3MatrixN = 0;
00430 }
00431
00432 void HcalTB02Analysis::finish() {
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467 }