CMS 3D CMS Logo

HcalTestAnalysis.cc
Go to the documentation of this file.
5 
6 // to retreive hits
13 
18 
19 #include "G4SDManager.hh"
20 #include "G4Step.hh"
21 #include "G4Track.hh"
22 #include "G4VProcess.hh"
23 #include "G4HCofThisEvent.hh"
24 #include "CLHEP/Units/GlobalSystemOfUnits.h"
25 #include "CLHEP/Units/GlobalPhysicalConstants.h"
26 #include "Randomize.hh"
27 
28 #include <cmath>
29 #include <iostream>
30 #include <iomanip>
31 
33  : addTower_(3), tuples_(nullptr), hcons_(nullptr), org_(nullptr) {
34  edm::ParameterSet m_Anal = p.getParameter<edm::ParameterSet>("HcalTestAnalysis");
35  eta0_ = m_Anal.getParameter<double>("Eta0");
36  phi0_ = m_Anal.getParameter<double>("Phi0");
37  int laygroup = m_Anal.getParameter<int>("LayerGrouping");
38  centralTower_ = m_Anal.getParameter<int>("CentralTower");
39  names_ = m_Anal.getParameter<std::vector<std::string> >("Names");
40  fileName_ = m_Anal.getParameter<std::string>("FileName");
41 
42  tuplesManager_.reset(nullptr);
43  numberingFromDDD_.reset(nullptr);
44  edm::LogVerbatim("HcalSim") << "HcalTestAnalysis:: Initialised as observer of begin/end events"
45  << " and of G4step";
46 
47  count_ = 0;
48  group_ = layerGrouping(laygroup);
49  nGroup_ = 0;
50  for (unsigned int i = 0; i < group_.size(); i++)
51  if (group_[i] > nGroup_)
52  nGroup_ = group_[i];
53  tower_ = towersToAdd(centralTower_, addTower_);
54  nTower_ = tower_.size() / 2;
55 
56  edm::LogVerbatim("HcalSim") << "HcalTestAnalysis:: initialised for " << nGroup_ << " Longitudinal groups and "
57  << nTower_ << " towers";
58 
59  // qie
60  myqie_.reset(new HcalQie(p));
61 }
62 
64  edm::LogVerbatim("HcalSim") << "HcalTestAnalysis: --------> Total number of selected entries : " << count_;
65  edm::LogVerbatim("HcalSim") << "HcalTestAnalysis: Pointers:: HistoClass " << tuples_ << ", Numbering Scheme " << org_;
66 }
67 
68 std::vector<int> HcalTestAnalysis::layerGrouping(int group) {
69  std::vector<int> temp(19);
70  if (group <= 1) {
71  int grp[19] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2};
72  for (int i = 0; i < 19; i++)
73  temp[i] = grp[i];
74  } else if (group == 2) {
75  int grp[19] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19};
76  for (int i = 0; i < 19; i++)
77  temp[i] = grp[i];
78  } else if (group == 3) {
79  int grp[19] = {1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7};
80  for (int i = 0; i < 19; i++)
81  temp[i] = grp[i];
82  } else if (group == 4) {
83  int grp[19] = {1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7};
84  for (int i = 0; i < 19; i++)
85  temp[i] = grp[i];
86  } else {
87  int grp[19] = {1, 1, 2, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7};
88  for (int i = 0; i < 19; i++)
89  temp[i] = grp[i];
90  }
91 
92  edm::LogVerbatim("HcalSim") << "HcalTestAnalysis:: Layer Grouping ";
93  for (int i = 0; i < 19; i++)
94  edm::LogVerbatim("HcalSim") << "HcalTestAnalysis: Group[" << i << "] = " << temp[i];
95  return temp;
96 }
97 
98 std::vector<int> HcalTestAnalysis::towersToAdd(int centre, int nadd) {
99  int etac = (centre / 100) % 100;
100  int phic = (centre % 100);
101  int etamin, etamax, phimin, phimax;
102  if (etac > 0) {
103  etamin = etac - nadd;
104  etamax = etac + nadd;
105  } else {
106  etamin = etac;
107  etamax = etac;
108  }
109  if (phic > 0) {
110  phimin = phic - nadd;
111  phimax = phic + nadd;
112  } else {
113  phimin = phic;
114  phimax = phic;
115  }
116 
117  int nbuf, kount = 0;
118  nbuf = (etamax - etamin + 1) * (phimax - phimin + 1);
119  std::vector<int> temp(2 * nbuf);
120  for (int eta = etamin; eta <= etamax; eta++) {
121  for (int phi = phimin; phi <= phimax; phi++) {
122  temp[kount] = (eta * 100 + phi);
123  temp[kount + nbuf] = std::max(abs(eta - etac), abs(phi - phic));
124  kount++;
125  }
126  }
127 
128  edm::LogVerbatim("HcalSim") << "HcalTestAnalysis:: Towers to be considered for Central " << centre << " and " << nadd
129  << " on either side";
130  for (int i = 0; i < nbuf; i++)
131  edm::LogVerbatim("HcalSim") << "HcalTestAnalysis: Tower[" << std::setw(3) << i << "] " << temp[i] << " "
132  << temp[nbuf + i];
133  return temp;
134 }
135 
136 //==================================================================== per JOB
137 
139  // Numbering From DDD
141  (*job)()->get<HcalSimNumberingRecord>().get(hdc);
142  hcons_ = hdc.product();
143  edm::LogVerbatim("HcalSim") << "HcalTestAnalysis:: Initialise HcalNumberingFromDDD for " << names_[0];
145 
146  // Ntuples
148 
149  // Numbering scheme
150  org_ = new HcalTestNumberingScheme(false);
151 }
152 
153 //==================================================================== per RUN
155  int irun = (*run)()->GetRunID();
156  edm::LogVerbatim("HcalSim") << "HcalTestAnalysis:: Begin of Run = " << irun;
157 
158  bool loop = true, eta = true, phi = true;
159  int etac = (centralTower_ / 100) % 100;
160  if (etac == 0) {
161  etac = 1;
162  eta = false;
163  }
164  int phic = (centralTower_ % 100);
165  if (phic == 0) {
166  phic = 1;
167  phi = false;
168  }
169  int idet = static_cast<int>(HcalBarrel);
170  while (loop) {
171  HcalCellType::HcalCell tmp = hcons_->cell(idet, 1, 1, etac, phic);
172  if (tmp.ok) {
173  if (eta)
174  eta0_ = tmp.eta;
175  if (phi)
176  phi0_ = tmp.phi;
177  loop = false;
178  } else if (idet == static_cast<int>(HcalBarrel)) {
179  idet = static_cast<int>(HcalEndcap);
180  } else if (idet == static_cast<int>(HcalEndcap)) {
181  idet = static_cast<int>(HcalForward);
182  } else {
183  loop = false;
184  }
185  }
186 
187  edm::LogVerbatim("HcalSim") << "HcalTestAnalysis:: Central Tower " << centralTower_
188  << " corresponds to eta0 = " << eta0_ << " phi0 = " << phi0_;
189 
190  std::string sdname = names_[0];
191  G4SDManager* sd = G4SDManager::GetSDMpointerIfExist();
192  if (sd != nullptr) {
193  G4VSensitiveDetector* aSD = sd->FindSensitiveDetector(sdname);
194  if (aSD == nullptr) {
195  edm::LogWarning("HcalSim") << "HcalTestAnalysis::beginOfRun: No SD with "
196  << "name " << sdname << " in this Setup";
197  } else {
198  HCalSD* theCaloSD = dynamic_cast<HCalSD*>(aSD);
199  edm::LogVerbatim("HcalSim") << "HcalTestAnalysis::beginOfRun: Finds SD with name " << theCaloSD->GetName()
200  << " in this Setup";
201  if (org_) {
202  theCaloSD->setNumberingScheme(org_);
203  edm::LogVerbatim("HcalSim") << "HcalTestAnalysis::beginOfRun: set a new numbering scheme";
204  }
205  }
206  } else {
207  edm::LogWarning("HcalSim") << "HcalTestAnalysis::beginOfRun: Could not get"
208  << " SD Manager!";
209  }
210 }
211 
212 //=================================================================== per EVENT
214  // create tuple object
215  tuples_ = new HcalTestHistoClass();
216  // Reset counters
217  tuples_->setCounters();
218 
219  int i = 0;
220  edepEB_ = edepEE_ = edepHB_ = edepHE_ = edepHO_ = 0.;
221  for (i = 0; i < 20; i++)
222  edepl_[i] = 0.;
223  for (i = 0; i < 20; i++)
224  mudist_[i] = -1.;
225 
226  edm::LogVerbatim("HcalSim") << "HcalTestAnalysis: Begin of event = " << (*evt)()->GetEventID();
227 }
228 
229 //=================================================================== each STEP
230 void HcalTestAnalysis::update(const G4Step* aStep) {
231  if (aStep != nullptr) {
232  G4VPhysicalVolume* curPV = aStep->GetPreStepPoint()->GetPhysicalVolume();
233  G4String name = curPV->GetName();
234  name.assign(name, 0, 3);
235  double edeposit = aStep->GetTotalEnergyDeposit();
236  int layer = -1;
237  if (name == "EBR") {
238  edepEB_ += edeposit;
239  } else if (name == "EFR") {
240  edepEE_ += edeposit;
241  } else if (name == "HBS") {
242  layer = (curPV->GetCopyNo() / 10) % 100;
243  if (layer >= 0 && layer < 17) {
244  edepHB_ += edeposit;
245  } else {
246  edm::LogWarning("HcalSim") << "HcalTestAnalysis::Error in HB " << curPV->GetName() << curPV->GetCopyNo();
247  layer = -1;
248  }
249  } else if (name == "HES") {
250  layer = (curPV->GetCopyNo() / 10) % 100;
251  if (layer >= 0 && layer < 19) {
252  edepHE_ += edeposit;
253  } else {
254  edm::LogWarning("HcalSim") << "HcalTestAnalysis::Error in HE " << curPV->GetName() << curPV->GetCopyNo();
255  layer = -1;
256  }
257  } else if (name == "HTS") {
258  layer = (curPV->GetCopyNo() / 10) % 100;
259  if (layer >= 17 && layer < 20) {
260  edepHO_ += edeposit;
261  } else {
262  edm::LogWarning("HcalSim") << "HcalTestAnalysis::Error in HO " << curPV->GetName() << curPV->GetCopyNo();
263  layer = -1;
264  }
265  }
266  if (layer >= 0 && layer < 20) {
267  edepl_[layer] += edeposit;
268 
269  // Calculate the distance if it is a muon
270  G4String part = aStep->GetTrack()->GetDefinition()->GetParticleName();
271  if ((part == "mu-" || part == "mu+") && mudist_[layer] < 0) {
272  math::XYZPoint pos(aStep->GetPreStepPoint()->GetPosition().x(),
273  aStep->GetPreStepPoint()->GetPosition().y(),
274  aStep->GetPreStepPoint()->GetPosition().z());
275  double theta = pos.theta();
276  double eta = -log(tan(theta * 0.5));
277  double phi = pos.phi();
278  double dist = sqrt((eta - eta0_) * (eta - eta0_) + (phi - phi0_) * (phi - phi0_));
279  mudist_[layer] = dist * std::sqrt(pos.perp2());
280  }
281  }
282 
283  if (layer >= 0 && layer < 20) {
284  edm::LogVerbatim("HcalSim") << "HcalTestAnalysis:: G4Step: " << name << " Layer " << std::setw(3) << layer
285  << " Edep " << std::setw(6) << edeposit / MeV << " MeV";
286  }
287  } else {
288  edm::LogVerbatim("HcalSim") << "HcalTestAnalysis:: G4Step: Null Step";
289  }
290 }
291 
292 //================================================================ End of EVENT
294  ++count_;
295  // Fill event input
296  fill(evt);
297  edm::LogVerbatim("HcalSim") << "HcalTestAnalysis:: --- after Fill";
298 
299  // Qie analysis
300  CLHEP::HepRandomEngine* engine = G4Random::getTheEngine();
301  qieAnalysis(engine);
302  edm::LogVerbatim("HcalSim") << "HcalTestAnalysis:: --- after QieAnalysis";
303 
304  // Layers tuples filling
305  layerAnalysis();
306  edm::LogVerbatim("HcalSim") << "HcalTestAnalysis:: --- after LayerAnalysis";
307 
308  // Writing the data to the Tree
309  tuplesManager_.get()->fillTree(tuples_); // (no need to delete it...)
310  tuples_ = nullptr; // but avoid to reuse it...
311  edm::LogVerbatim("HcalSim") << "HcalTestAnalysis:: --- after fillTree";
312 }
313 
314 //---------------------------------------------------
316  edm::LogVerbatim("HcalSim") << "HcalTestAnalysis: Fill event " << (*evt)()->GetEventID();
317 
318  // access to the G4 hit collections
319  G4HCofThisEvent* allHC = (*evt)()->GetHCofThisEvent();
320 
321  int nhc = 0, neb = 0, nef = 0, j = 0;
322  caloHitCache_.erase(caloHitCache_.begin(), caloHitCache_.end());
323 
324  // Hcal
325  int HCHCid = G4SDManager::GetSDMpointer()->GetCollectionID(names_[0]);
326  CaloG4HitCollection* theHCHC = (CaloG4HitCollection*)allHC->GetHC(HCHCid);
327  edm::LogVerbatim("HcalSim") << "HcalTestAnalysis :: Hit Collection for " << names_[0] << " of ID " << HCHCid
328  << " is obtained at " << theHCHC;
329  if (HCHCid >= 0 && theHCHC != nullptr) {
330  for (j = 0; j < theHCHC->entries(); j++) {
331  CaloG4Hit* aHit = (*theHCHC)[j];
332 
333  double e = aHit->getEnergyDeposit() / GeV;
334  double time = aHit->getTimeSlice();
335 
336  math::XYZPoint pos = aHit->getPosition();
337  double theta = pos.theta();
338  double eta = -log(tan(theta * 0.5));
339  double phi = pos.phi();
340 
341  uint32_t unitID = aHit->getUnitID();
342  int subdet, zside, layer, etaIndex, phiIndex, lay;
343  org_->unpackHcalIndex(unitID, subdet, zside, layer, etaIndex, phiIndex, lay);
344  double jitter = time - timeOfFlight(subdet, lay, eta);
345  if (jitter < 0)
346  jitter = 0;
347  CaloHit hit(subdet, lay, e, eta, phi, jitter, unitID);
348  caloHitCache_.push_back(hit);
349  nhc++;
350 
351  std::string det = "HB";
352  if (subdet == static_cast<int>(HcalForward)) {
353  det = "HF";
354  } else if (subdet == static_cast<int>(HcalEndcap)) {
355  if (etaIndex <= 20) {
356  det = "HES";
357  } else {
358  det = "HED";
359  }
360  }
361 
362  edm::LogVerbatim("HcalSim") << "HcalTest: " << det << " layer " << std::setw(2) << layer << " time "
363  << std::setw(6) << time << " theta " << std::setw(8) << theta << " eta "
364  << std::setw(8) << eta << " phi " << std::setw(8) << phi << " e " << std::setw(8)
365  << e;
366  }
367  }
368  edm::LogVerbatim("HcalSim") << "HcalTestAnalysis::HCAL hits : " << nhc;
369 
370  // EB
371  int EBHCid = G4SDManager::GetSDMpointer()->GetCollectionID(names_[1]);
372  CaloG4HitCollection* theEBHC = (CaloG4HitCollection*)allHC->GetHC(EBHCid);
373  edm::LogVerbatim("HcalSim") << "HcalTestAnalysis :: Hit Collection for " << names_[1] << " of ID " << EBHCid
374  << " is obtained at " << theEBHC;
375  if (EBHCid >= 0 && theEBHC != nullptr) {
376  for (j = 0; j < theEBHC->entries(); j++) {
377  CaloG4Hit* aHit = (*theEBHC)[j];
378 
379  double e = aHit->getEnergyDeposit() / GeV;
380  double time = aHit->getTimeSlice();
381  std::string det = "EB";
382 
383  math::XYZPoint pos = aHit->getPosition();
384  double theta = pos.theta();
385  double eta = -log(tan(theta / 2.));
386  double phi = pos.phi();
387 
388  HcalNumberingFromDDD::HcalID id = numberingFromDDD_->unitID(eta, phi, 1, 1);
389  uint32_t unitID = org_->getUnitID(id);
390  int subdet, zside, layer, ieta, iphi, lay;
391  org_->unpackHcalIndex(unitID, subdet, zside, layer, ieta, iphi, lay);
392  subdet = 10;
393  layer = 0;
394  unitID = org_->packHcalIndex(subdet, zside, layer, ieta, iphi, lay);
395  CaloHit hit(subdet, lay, e, eta, phi, time, unitID);
396  caloHitCache_.push_back(hit);
397  neb++;
398  edm::LogVerbatim("HcalSim") << "HcalTest: " << det << " layer " << std::setw(2) << layer << " time "
399  << std::setw(6) << time << " theta " << std::setw(8) << theta << " eta "
400  << std::setw(8) << eta << " phi " << std::setw(8) << phi << " e " << std::setw(8)
401  << e;
402  }
403  }
404  edm::LogVerbatim("HcalSim") << "HcalTestAnalysis::EB hits : " << neb;
405 
406  // EE
407  int EEHCid = G4SDManager::GetSDMpointer()->GetCollectionID(names_[2]);
408  CaloG4HitCollection* theEEHC = (CaloG4HitCollection*)allHC->GetHC(EEHCid);
409  edm::LogVerbatim("HcalSim") << "HcalTestAnalysis :: Hit Collection for " << names_[2] << " of ID " << EEHCid
410  << " is obtained at " << theEEHC;
411  if (EEHCid >= 0 && theEEHC != nullptr) {
412  for (j = 0; j < theEEHC->entries(); j++) {
413  CaloG4Hit* aHit = (*theEEHC)[j];
414 
415  double e = aHit->getEnergyDeposit() / GeV;
416  double time = aHit->getTimeSlice();
417  std::string det = "EE";
418 
419  math::XYZPoint pos = aHit->getPosition();
420  double theta = pos.theta();
421  double eta = -log(tan(theta / 2.));
422  double phi = pos.phi();
423 
424  HcalNumberingFromDDD::HcalID id = numberingFromDDD_->unitID(eta, phi, 1, 1);
425  uint32_t unitID = org_->getUnitID(id);
426  int subdet, zside, layer, ieta, iphi, lay;
427  org_->unpackHcalIndex(unitID, subdet, zside, layer, ieta, iphi, lay);
428  subdet = 11;
429  layer = 0;
430  unitID = org_->packHcalIndex(subdet, zside, layer, ieta, iphi, lay);
431  CaloHit hit(subdet, lay, e, eta, phi, time, unitID);
432  caloHitCache_.push_back(hit);
433  nef++;
434  edm::LogVerbatim("HcalSim") << "HcalTest: " << det << " layer " << std::setw(2) << layer << " time "
435  << std::setw(6) << time << " theta " << std::setw(8) << theta << " eta "
436  << std::setw(8) << eta << " phi " << std::setw(8) << phi << " e " << std::setw(8)
437  << e;
438  }
439  }
440  edm::LogVerbatim("HcalSim") << "HcalTestAnalysis::EE hits : " << nef;
441 }
442 
443 //-----------------------------------------------------------------------------
444 void HcalTestAnalysis::qieAnalysis(CLHEP::HepRandomEngine* engine) {
445  //Fill tuple with hit information
446  int hittot = caloHitCache_.size();
448 
449  //Get the index of the central tower
451  uint32_t unitID = org_->getUnitID(id);
452  int subdet, zside, layer, ieta, iphi, lay;
453  org_->unpackHcalIndex(unitID, subdet, zside, layer, ieta, iphi, lay);
454  int laymax = 0;
455  std::string det = "Unknown";
456  if (subdet == static_cast<int>(HcalBarrel)) {
457  laymax = 4;
458  det = "HB";
459  } else if (subdet == static_cast<int>(HcalEndcap)) {
460  laymax = 2;
461  det = "HES";
462  }
463  edm::LogVerbatim("HcalSim") << "HcalTestAnalysis::Qie: " << det << " Eta " << ieta << " Phi " << iphi << " Laymax "
464  << laymax << " Hits " << hittot;
465 
466  if (laymax > 0 && hittot > 0) {
467  std::vector<CaloHit> hits(hittot);
468  std::vector<double> eqielay(80, 0.0), esimlay(80, 0.0), esimtot(4, 0.0);
469  std::vector<double> eqietow(200, 0.0), esimtow(200, 0.0), eqietot(4, 0.0);
470  int etac = (centralTower_ / 100) % 100;
471  int phic = (centralTower_ % 100);
472 
473  for (int layr = 0; layr < nGroup_; layr++) {
474  /*
475  int layx, layy=20;
476  for (int i=0; i<20; i++)
477  if (group_[i] == layr+1 && i < layy) layy = i+1;
478  if (subdet == static_cast<int>(HcalBarrel)) {
479  if (layy < 2) layx = 0;
480  else if (layy < 17) layx = 1;
481  else if (layy == 17) layx = 2;
482  else layx = 3;
483  } else {
484  if (layy < 2) layx = 0;
485  else layx = 1;
486  }
487  */
488  for (int it = 0; it < nTower_; it++) {
489  int nhit = 0;
490  double esim = 0;
491  for (int k1 = 0; k1 < hittot; k1++) {
492  CaloHit hit = caloHitCache_[k1];
493  int subdetc = hit.det();
494  int layer = hit.layer();
495  int group = 0;
496  if (layer > 0 && layer < 20)
497  group = group_[layer];
498  if (subdetc == subdet && group == layr + 1) {
499  int zsidec, ietac, iphic, idx;
500  unitID = hit.id();
501  org_->unpackHcalIndex(unitID, subdetc, zsidec, layer, ietac, iphic, lay);
502  if (etac > 0 && phic > 0) {
503  idx = ietac * 100 + iphic;
504  } else if (etac > 0) {
505  idx = ietac * 100;
506  } else if (phic > 0) {
507  idx = iphic;
508  } else {
509  idx = 0;
510  }
511  if (zsidec == zside && idx == tower_[it]) {
512  hits[nhit] = hit;
513  edm::LogVerbatim("HcalSim") << "HcalTest: Hit " << nhit << " " << hit;
514  nhit++;
515  esim += hit.e();
516  }
517  }
518  }
519 
520  std::vector<int> cd = myqie_->getCode(nhit, hits, engine);
521  double eqie = myqie_->getEnergy(cd);
522 
523  edm::LogVerbatim("HcalSim") << "HcalTestAnalysis::Qie: Energy in layer " << layr << " Sim " << esim
524  << " After QIE " << eqie;
525  for (int i = 0; i < 4; i++) {
526  if (tower_[nTower_ + it] <= i) {
527  esimtot[i] += esim;
528  eqietot[i] += eqie;
529  esimlay[20 * i + layr] += esim;
530  eqielay[20 * i + layr] += eqie;
531  esimtow[50 * i + it] += esim;
532  eqietow[50 * i + it] += eqie;
533  }
534  }
535  }
536  }
537  edm::LogVerbatim("HcalSim") << "HcalTestAnalysis::Qie: Total energy " << esimtot[3] << " (SimHit) " << eqietot[3]
538  << " (After QIE)";
539 
540  std::vector<double> latphi(10);
541  int nt = 2 * addTower_ + 1;
542  for (int it = 0; it < nt; it++)
543  latphi[it] = it - addTower_;
544  for (int i = 0; i < 4; i++) {
545  double scals = 1, scalq = 1;
546  std::vector<double> latfs(10, 0.), latfq(10, 0.), longs(20), longq(20);
547  if (esimtot[i] > 0)
548  scals = 1. / esimtot[i];
549  if (eqietot[i] > 0)
550  scalq = 1. / eqietot[i];
551  for (int it = 0; it < nTower_; it++) {
552  int phib = it % nt;
553  latfs[phib] += scals * esimtow[50 * i + it];
554  latfq[phib] += scalq * eqietow[50 * i + it];
555  }
556  for (int layr = 0; layr <= nGroup_; layr++) {
557  longs[layr] = scals * esimlay[20 * i + layr];
558  longq[layr] = scalq * eqielay[20 * i + layr];
559  }
560  tuples_->fillQie(i, esimtot[i], eqietot[i], nGroup_, longs, longq, nt, latphi, latfs, latfq);
561  }
562  }
563 }
564 
565 //---------------------------------------------------
567  int i = 0;
568  edm::LogVerbatim("HcalSim") << "\n ===>>> HcalTestAnalysis: Energy deposit "
569  << "\n at EB : " << std::setw(6) << edepEB_ / MeV << "\n at EE : " << std::setw(6)
570  << edepEE_ / MeV << "\n at HB : " << std::setw(6) << edepHB_ / MeV
571  << "\n at HE : " << std::setw(6) << edepHE_ / MeV << "\n at HO : " << std::setw(6)
572  << edepHO_ / MeV << "\n ---- HcalTestAnalysis: Energy deposit in Layers";
573  for (i = 0; i < 20; i++)
574  edm::LogVerbatim("HcalSim") << " Layer " << std::setw(2) << i << " E " << std::setw(8) << edepl_[i] / MeV << " MeV";
575 
577 }
578 
579 //---------------------------------------------------
580 double HcalTestAnalysis::timeOfFlight(int det, int layer, double eta) {
581  double theta = 2.0 * atan(exp(-eta));
582  double dist = 0.;
583  if (det == static_cast<int>(HcalBarrel)) {
584  const double rLay[19] = {1836.0,
585  1902.0,
586  1962.0,
587  2022.0,
588  2082.0,
589  2142.0,
590  2202.0,
591  2262.0,
592  2322.0,
593  2382.0,
594  2448.0,
595  2514.0,
596  2580.0,
597  2646.0,
598  2712.0,
599  2776.0,
600  2862.5,
601  3847.0,
602  4052.0};
603  if (layer > 0 && layer < 20)
604  dist += rLay[layer - 1] * mm / sin(theta);
605  } else {
606  const double zLay[19] = {4034.0,
607  4032.0,
608  4123.0,
609  4210.0,
610  4297.0,
611  4384.0,
612  4471.0,
613  4558.0,
614  4645.0,
615  4732.0,
616  4819.0,
617  4906.0,
618  4993.0,
619  5080.0,
620  5167.0,
621  5254.0,
622  5341.0,
623  5428.0,
624  5515.0};
625  if (layer > 0 && layer < 20)
626  dist += zLay[layer - 1] * mm / cos(theta);
627  }
628  double tmp = dist / c_light / ns;
629  edm::LogVerbatim("HcalSim") << "HcalTestAnalysis::timeOfFlight " << tmp << " for det/lay " << det << " " << layer
630  << " eta/theta " << eta << " " << theta / deg << " dist " << dist;
631  return tmp;
632 }
void fillQie(int id, double esimtot, double eqietot, int nGroup, const std::vector< double > &longs, const std::vector< double > &longq, int nTower, const std::vector< double > &latphi, const std::vector< double > &latfs, const std::vector< double > &latfq)
T getParameter(std::string const &) const
HcalTestNumberingScheme * org_
math::XYZPoint getPosition() const
Definition: CaloG4Hit.h:52
const double GeV
Definition: MathUtil.h:16
int det() const
Definition: CaloHit.h:19
void fillLayers(double el[], double ho, double hbhe, double muxy[])
std::vector< int > layerGrouping(int)
std::unique_ptr< HcalNumberingFromDDD > numberingFromDDD_
Sin< T >::type sin(const T &t)
Definition: Sin.h:22
#define nullptr
Geom::Theta< T > theta() const
void fillHits(std::vector< CaloHit > &)
std::vector< std::string > names_
void update(const BeginOfJob *run) override
This routine will be called when the appropriate signal arrives.
int zside(DetId const &)
HcalCellType::HcalCell cell(const int &det, const int &zside, const int &depth, const int &etaR, const int &iphi) const
void setNumberingScheme(HcalNumberingScheme *)
Definition: HCalSD.cc:532
HcalTestHistoClass * tuples_
std::vector< int > towersToAdd(int centre, int nadd)
const double MeV
double timeOfFlight(int det, int layer, double eta)
Definition: HCalSD.h:37
uint32_t id() const
Definition: CaloHit.h:25
void fill(const EndOfEvent *ev)
static uint32_t packHcalIndex(int det, int z, int depth, int eta, int phi, int lay)
std::vector< int > tower_
HcalTestAnalysis(const edm::ParameterSet &p)
T sqrt(T t)
Definition: SSEVec.h:18
const HcalDDDSimConstants * hcons_
Cos< T >::type cos(const T &t)
Definition: Cos.h:22
unsigned int count_
~HcalTestAnalysis() override
std::unique_ptr< HcalQie > myqie_
Tan< T >::type tan(const T &t)
Definition: Tan.h:22
int layer() const
Definition: CaloHit.h:20
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
int nt
Definition: AMPTWrapper.h:32
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
double sd
part
Definition: HCALResponse.h:20
double e() const
Definition: CaloHit.h:21
std::vector< std::vector< double > > tmp
Definition: MVATrainer.cc:100
std::vector< CaloHit > caloHitCache_
G4THitsCollection< CaloG4Hit > CaloG4HitCollection
std::string fileName_
static void unpackHcalIndex(const uint32_t &idx, int &det, int &z, int &depth, int &eta, int &phi, int &lay)
double getTimeSlice() const
Definition: CaloG4Hit.h:66
void qieAnalysis(CLHEP::HepRandomEngine *)
uint32_t getUnitID() const
Definition: CaloG4Hit.h:65
std::vector< int > group_
T const * product() const
Definition: ESHandle.h:86
std::unique_ptr< HcalTestHistoManager > tuplesManager_
double getEnergyDeposit() const
Definition: CaloG4Hit.h:77
uint32_t getUnitID(const HcalNumberingFromDDD::HcalID &id) override