18 #include "G4SDManager.hh"
21 #include "G4VProcess.hh"
22 #include "G4HCofThisEvent.hh"
23 #include "CLHEP/Units/GlobalSystemOfUnits.h"
24 #include "CLHEP/Units/GlobalPhysicalConstants.h"
25 #include "Randomize.hh"
33 : addTower_(3), tuples_(nullptr), hcons_(nullptr), org_(nullptr) {
37 int laygroup = m_Anal.
getParameter<
int>(
"LayerGrouping");
44 edm::LogVerbatim(
"HcalSim") <<
"HcalTestAnalysis:: Initialised as observer of begin/end events"
50 for (
unsigned int i = 0;
i <
group_.size();
i++)
60 myqie_ = std::make_unique<HcalQie>(
p);
64 edm::LogVerbatim(
"HcalSim") <<
"HcalTestAnalysis: --------> Total number of selected entries : " <<
count_;
69 std::vector<int>
temp(19);
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++)
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++)
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++)
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++)
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++)
93 for (
int i = 0;
i < 19;
i++)
99 int etac = (centre / 100) % 100;
100 int phic = (centre % 100);
119 std::vector<int>
temp(2 * nbuf);
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++)
141 (*job)()->get<HcalSimNumberingRecord>().get(hdc);
155 int irun = (*run)()->GetRunID();
156 edm::LogVerbatim(
"HcalSim") <<
"HcalTestAnalysis:: Begin of Run = " << irun;
178 }
else if (idet == static_cast<int>(
HcalBarrel)) {
180 }
else if (idet == static_cast<int>(
HcalEndcap)) {
188 <<
" corresponds to eta0 = " <<
eta0_ <<
" phi0 = " <<
phi0_;
191 G4SDManager*
sd = G4SDManager::GetSDMpointerIfExist();
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";
198 HCalSD* theCaloSD = dynamic_cast<HCalSD*>(aSD);
199 edm::LogVerbatim(
"HcalSim") <<
"HcalTestAnalysis::beginOfRun: Finds SD with name " << theCaloSD->GetName()
203 edm::LogVerbatim(
"HcalSim") <<
"HcalTestAnalysis::beginOfRun: set a new numbering scheme";
207 edm::LogWarning(
"HcalSim") <<
"HcalTestAnalysis::beginOfRun: Could not get"
221 for (
i = 0;
i < 20;
i++)
223 for (
i = 0;
i < 20;
i++)
226 edm::LogVerbatim(
"HcalSim") <<
"HcalTestAnalysis: Begin of event = " << (*evt)()->GetEventID();
231 if (aStep !=
nullptr) {
232 G4VPhysicalVolume* curPV = aStep->GetPreStepPoint()->GetPhysicalVolume();
233 G4String
name = curPV->GetName();
235 double edeposit = aStep->GetTotalEnergyDeposit();
239 }
else if (
name ==
"EFR") {
241 }
else if (
name ==
"HBS") {
242 layer = (curPV->GetCopyNo() / 10) % 100;
243 if (layer >= 0 && layer < 17) {
246 edm::LogWarning(
"HcalSim") <<
"HcalTestAnalysis::Error in HB " << curPV->GetName() << curPV->GetCopyNo();
249 }
else if (
name ==
"HES") {
250 layer = (curPV->GetCopyNo() / 10) % 100;
251 if (layer >= 0 && layer < 19) {
254 edm::LogWarning(
"HcalSim") <<
"HcalTestAnalysis::Error in HE " << curPV->GetName() << curPV->GetCopyNo();
257 }
else if (
name ==
"HTS") {
258 layer = (curPV->GetCopyNo() / 10) % 100;
259 if (layer >= 17 && layer < 20) {
262 edm::LogWarning(
"HcalSim") <<
"HcalTestAnalysis::Error in HO " << curPV->GetName() << curPV->GetCopyNo();
266 if (layer >= 0 && layer < 20) {
267 edepl_[layer] += edeposit;
270 G4String
part = aStep->GetTrack()->GetDefinition()->GetParticleName();
273 aStep->GetPreStepPoint()->GetPosition().y(),
274 aStep->GetPreStepPoint()->GetPosition().z());
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";
300 CLHEP::HepRandomEngine* engine = G4Random::getTheEngine();
306 edm::LogVerbatim(
"HcalSim") <<
"HcalTestAnalysis:: --- after LayerAnalysis";
316 edm::LogVerbatim(
"HcalSim") <<
"HcalTestAnalysis: Fill event " << (*evt)()->GetEventID();
319 G4HCofThisEvent* allHC = (*evt)()->GetHCofThisEvent();
321 int nhc = 0, neb = 0, nef = 0,
j = 0;
325 int HCHCid = G4SDManager::GetSDMpointer()->GetCollectionID(
names_[0]);
327 edm::LogVerbatim(
"HcalSim") <<
"HcalTestAnalysis :: Hit Collection for " <<
names_[0] <<
" of ID " << HCHCid
328 <<
" is obtained at " << theHCHC;
329 int hchc_entries = theHCHC->entries();
330 if (HCHCid >= 0 && theHCHC !=
nullptr) {
331 for (
j = 0;
j < hchc_entries;
j++) {
343 int subdet,
zside, layer, etaIndex, phiIndex, lay;
355 }
else if (subdet == static_cast<int>(
HcalEndcap)) {
356 if (etaIndex <= 20) {
363 edm::LogVerbatim(
"HcalSim") <<
"HcalTest: " << det <<
" layer " << std::setw(2) << layer <<
" time "
364 << std::setw(6) <<
time <<
" theta " << std::setw(8) <<
theta <<
" eta "
365 << std::setw(8) <<
eta <<
" phi " << std::setw(8) <<
phi <<
" e " << std::setw(8)
372 int EBHCid = G4SDManager::GetSDMpointer()->GetCollectionID(
names_[1]);
374 edm::LogVerbatim(
"HcalSim") <<
"HcalTestAnalysis :: Hit Collection for " <<
names_[1] <<
" of ID " << EBHCid
375 <<
" is obtained at " << theEBHC;
376 int ebhc_entries = theEBHC->entries();
377 if (EBHCid >= 0 && theEBHC !=
nullptr) {
378 for (
j = 0;
j < ebhc_entries;
j++) {
400 edm::LogVerbatim(
"HcalSim") <<
"HcalTest: " << det <<
" layer " << std::setw(2) << layer <<
" time "
401 << std::setw(6) <<
time <<
" theta " << std::setw(8) <<
theta <<
" eta "
402 << std::setw(8) <<
eta <<
" phi " << std::setw(8) <<
phi <<
" e " << std::setw(8)
409 int EEHCid = G4SDManager::GetSDMpointer()->GetCollectionID(
names_[2]);
411 edm::LogVerbatim(
"HcalSim") <<
"HcalTestAnalysis :: Hit Collection for " <<
names_[2] <<
" of ID " << EEHCid
412 <<
" is obtained at " << theEEHC;
413 int eehc_entries = theEEHC->entries();
414 if (EEHCid >= 0 && theEEHC !=
nullptr) {
415 for (
j = 0;
j < eehc_entries;
j++) {
437 edm::LogVerbatim(
"HcalSim") <<
"HcalTest: " << det <<
" layer " << std::setw(2) << layer <<
" time "
438 << std::setw(6) <<
time <<
" theta " << std::setw(8) <<
theta <<
" eta "
439 << std::setw(8) <<
eta <<
" phi " << std::setw(8) <<
phi <<
" e " << std::setw(8)
462 }
else if (subdet == static_cast<int>(
HcalEndcap)) {
467 << laymax <<
" Hits " << hittot;
469 if (laymax > 0 && hittot > 0) {
470 std::vector<CaloHit>
hits(hittot);
471 std::vector<double> eqielay(80, 0.0), esimlay(80, 0.0), esimtot(4, 0.0);
472 std::vector<double> eqietow(200, 0.0), esimtow(200, 0.0), eqietot(4, 0.0);
476 for (
int layr = 0; layr <
nGroup_; layr++) {
491 for (
int it = 0; it <
nTower_; it++) {
494 for (
int k1 = 0; k1 < hittot; k1++) {
496 int subdetc =
hit.det();
497 int layer =
hit.layer();
499 if (layer > 0 && layer < 20)
501 if (subdetc == subdet &&
group == layr + 1) {
502 int zsidec, ietac, iphic,
idx;
505 if (etac > 0 && phic > 0) {
506 idx = ietac * 100 + iphic;
507 }
else if (etac > 0) {
509 }
else if (phic > 0) {
523 std::vector<int>
cd =
myqie_->getCode(nhit,
hits, engine);
524 double eqie =
myqie_->getEnergy(
cd);
526 edm::LogVerbatim(
"HcalSim") <<
"HcalTestAnalysis::Qie: Energy in layer " << layr <<
" Sim " << esim
527 <<
" After QIE " << eqie;
528 for (
int i = 0;
i < 4;
i++) {
532 esimlay[20 *
i + layr] += esim;
533 eqielay[20 *
i + layr] += eqie;
534 esimtow[50 *
i + it] += esim;
535 eqietow[50 *
i + it] += eqie;
540 edm::LogVerbatim(
"HcalSim") <<
"HcalTestAnalysis::Qie: Total energy " << esimtot[3] <<
" (SimHit) " << eqietot[3]
543 std::vector<double> latphi(10);
545 for (
int it = 0; it <
nt; it++)
547 for (
int i = 0;
i < 4;
i++) {
548 double scals = 1, scalq = 1;
549 std::vector<double> latfs(10, 0.), latfq(10, 0.), longs(20), longq(20);
551 scals = 1. / esimtot[
i];
553 scalq = 1. / eqietot[
i];
554 for (
int it = 0; it <
nTower_; it++) {
556 latfs[phib] += scals * esimtow[50 *
i + it];
557 latfq[phib] += scalq * eqietow[50 *
i + it];
559 for (
int layr = 0; layr <=
nGroup_; layr++) {
560 longs[layr] = scals * esimlay[20 *
i + layr];
561 longq[layr] = scalq * eqielay[20 *
i + layr];
571 edm::LogVerbatim(
"HcalSim") <<
"\n ===>>> HcalTestAnalysis: Energy deposit "
572 <<
"\n at EB : " << std::setw(6) <<
edepEB_ /
MeV <<
"\n at EE : " << std::setw(6)
574 <<
"\n at HE : " << std::setw(6) <<
edepHE_ /
MeV <<
"\n at HO : " << std::setw(6)
575 <<
edepHO_ /
MeV <<
"\n ---- HcalTestAnalysis: Energy deposit in Layers";
576 for (
i = 0;
i < 20;
i++)
587 const double rLay[19] = {1836.0,
606 if (layer > 0 && layer < 20)
607 dist += rLay[layer - 1] * mm /
sin(
theta);
609 const double zLay[19] = {4034.0,
628 if (layer > 0 && layer < 20)
629 dist += zLay[layer - 1] * mm /
cos(
theta);
631 double tmp = dist / c_light / ns;
632 edm::LogVerbatim(
"HcalSim") <<
"HcalTestAnalysis::timeOfFlight " <<
tmp <<
" for det/lay " << det <<
" " << layer
633 <<
" eta/theta " <<
eta <<
" " <<
theta / deg <<
" dist " << dist;