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" 36 int laygroup = m_Anal.
getParameter<
int>(
"LayerGrouping");
43 edm::LogVerbatim(
"HcalSim") <<
"HcalTestAnalysis:: Initialised as observer of begin/end events" 49 for (
unsigned int i = 0;
i <
group_.size();
i++)
63 edm::LogVerbatim(
"HcalSim") <<
"HcalTestAnalysis: --------> Total number of selected entries : " <<
count_;
68 std::vector<int>
temp(19);
70 int grp[19] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2};
71 for (
int i = 0;
i < 19;
i++)
73 }
else if (group == 2) {
74 int grp[19] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19};
75 for (
int i = 0;
i < 19;
i++)
77 }
else if (group == 3) {
78 int grp[19] = {1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7};
79 for (
int i = 0;
i < 19;
i++)
81 }
else if (group == 4) {
82 int grp[19] = {1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7};
83 for (
int i = 0;
i < 19;
i++)
86 int grp[19] = {1, 1, 2, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7};
87 for (
int i = 0;
i < 19;
i++)
92 for (
int i = 0;
i < 19;
i++)
98 int etac = (centre / 100) % 100;
99 int phic = (centre % 100);
102 etamin = etac - nadd;
103 etamax = etac + nadd;
109 phimin = phic - nadd;
110 phimax = phic + nadd;
117 nbuf = (etamax - etamin + 1) * (phimax - phimin + 1);
118 std::vector<int>
temp(2 * nbuf);
121 temp[kount] = (
eta * 100 +
phi);
127 edm::LogVerbatim(
"HcalSim") <<
"HcalTestAnalysis:: Towers to be considered for Central " << centre <<
" and " << nadd
128 <<
" on either side";
129 for (
int i = 0;
i < nbuf;
i++)
130 edm::LogVerbatim(
"HcalSim") <<
"HcalTestAnalysis: Tower[" << std::setw(3) <<
i <<
"] " << temp[
i] <<
" " 140 (*job)()->get<HcalSimNumberingRecord>().get(hdc);
154 int irun = (*run)()->GetRunID();
155 edm::LogVerbatim(
"HcalSim") <<
"HcalTestAnalysis:: Begin of Run = " << irun;
177 }
else if (idet == static_cast<int>(
HcalBarrel)) {
179 }
else if (idet == static_cast<int>(
HcalEndcap)) {
187 <<
" corresponds to eta0 = " <<
eta0_ <<
" phi0 = " <<
phi0_;
190 G4SDManager*
sd = G4SDManager::GetSDMpointerIfExist();
192 G4VSensitiveDetector* aSD = sd->FindSensitiveDetector(sdname);
193 if (aSD ==
nullptr) {
194 edm::LogWarning(
"HcalSim") <<
"HcalTestAnalysis::beginOfRun: No SD with " 195 <<
"name " << sdname <<
" in this Setup";
198 edm::LogVerbatim(
"HcalSim") <<
"HcalTestAnalysis::beginOfRun: Finds SD with name " << theCaloSD->GetName()
202 edm::LogVerbatim(
"HcalSim") <<
"HcalTestAnalysis::beginOfRun: set a new numbering scheme";
206 edm::LogWarning(
"HcalSim") <<
"HcalTestAnalysis::beginOfRun: Could not get" 220 for (i = 0; i < 20; i++)
222 for (i = 0; i < 20; i++)
225 edm::LogVerbatim(
"HcalSim") <<
"HcalTestAnalysis: Begin of event = " << (*evt)()->GetEventID();
230 if (aStep !=
nullptr) {
231 G4VPhysicalVolume* curPV = aStep->GetPreStepPoint()->GetPhysicalVolume();
232 G4String
name = curPV->GetName();
233 name.assign(name, 0, 3);
234 double edeposit = aStep->GetTotalEnergyDeposit();
238 }
else if (name ==
"EFR") {
240 }
else if (name ==
"HBS") {
241 layer = (curPV->GetCopyNo() / 10) % 100;
242 if (layer >= 0 && layer < 17) {
245 edm::LogWarning(
"HcalSim") <<
"HcalTestAnalysis::Error in HB " << curPV->GetName() << curPV->GetCopyNo();
248 }
else if (name ==
"HES") {
249 layer = (curPV->GetCopyNo() / 10) % 100;
250 if (layer >= 0 && layer < 19) {
253 edm::LogWarning(
"HcalSim") <<
"HcalTestAnalysis::Error in HE " << curPV->GetName() << curPV->GetCopyNo();
256 }
else if (name ==
"HTS") {
257 layer = (curPV->GetCopyNo() / 10) % 100;
258 if (layer >= 17 && layer < 20) {
261 edm::LogWarning(
"HcalSim") <<
"HcalTestAnalysis::Error in HO " << curPV->GetName() << curPV->GetCopyNo();
265 if (layer >= 0 && layer < 20) {
266 edepl_[layer] += edeposit;
269 G4String
part = aStep->GetTrack()->GetDefinition()->GetParticleName();
270 if ((part ==
"mu-" || part ==
"mu+") &&
mudist_[layer] < 0) {
272 aStep->GetPreStepPoint()->GetPosition().y(),
273 aStep->GetPreStepPoint()->GetPosition().z());
282 if (layer >= 0 && layer < 20) {
283 edm::LogVerbatim(
"HcalSim") <<
"HcalTestAnalysis:: G4Step: " << name <<
" Layer " << std::setw(3) << layer
284 <<
" Edep " << std::setw(6) << edeposit /
MeV <<
" MeV";
299 CLHEP::HepRandomEngine* engine = G4Random::getTheEngine();
305 edm::LogVerbatim(
"HcalSim") <<
"HcalTestAnalysis:: --- after LayerAnalysis";
315 edm::LogVerbatim(
"HcalSim") <<
"HcalTestAnalysis: Fill event " << (*evt)()->GetEventID();
318 G4HCofThisEvent* allHC = (*evt)()->GetHCofThisEvent();
320 int nhc = 0, neb = 0, nef = 0,
j = 0;
324 int HCHCid = G4SDManager::GetSDMpointer()->GetCollectionID(
names_[0]);
326 edm::LogVerbatim(
"HcalSim") <<
"HcalTestAnalysis :: Hit Collection for " <<
names_[0] <<
" of ID " << HCHCid
327 <<
" is obtained at " << theHCHC;
328 if (HCHCid >= 0 && theHCHC !=
nullptr) {
329 for (
j = 0;
j < theHCHC->entries();
j++) {
336 double theta = pos.theta();
338 double phi = pos.phi();
341 int subdet,
zside, layer, etaIndex, phiIndex, lay;
346 CaloHit hit(subdet, lay, e, eta, phi, jitter, unitID);
353 }
else if (subdet == static_cast<int>(
HcalEndcap)) {
354 if (etaIndex <= 20) {
361 edm::LogVerbatim(
"HcalSim") <<
"HcalTest: " << det <<
" layer " << std::setw(2) << layer <<
" time " 362 << std::setw(6) << time <<
" theta " << std::setw(8) << theta <<
" eta " 363 << std::setw(8) << eta <<
" phi " << std::setw(8) << phi <<
" e " << std::setw(8)
370 int EBHCid = G4SDManager::GetSDMpointer()->GetCollectionID(
names_[1]);
372 edm::LogVerbatim(
"HcalSim") <<
"HcalTestAnalysis :: Hit Collection for " <<
names_[1] <<
" of ID " << EBHCid
373 <<
" is obtained at " << theEBHC;
374 if (EBHCid >= 0 && theEBHC !=
nullptr) {
375 for (
j = 0;
j < theEBHC->entries();
j++) {
383 double theta = pos.theta();
385 double phi = pos.phi();
394 CaloHit hit(subdet, lay, e, eta, phi, time, unitID);
397 edm::LogVerbatim(
"HcalSim") <<
"HcalTest: " << det <<
" layer " << std::setw(2) << layer <<
" time " 398 << std::setw(6) << time <<
" theta " << std::setw(8) << theta <<
" eta " 399 << std::setw(8) << eta <<
" phi " << std::setw(8) << phi <<
" e " << std::setw(8)
406 int EEHCid = G4SDManager::GetSDMpointer()->GetCollectionID(
names_[2]);
408 edm::LogVerbatim(
"HcalSim") <<
"HcalTestAnalysis :: Hit Collection for " <<
names_[2] <<
" of ID " << EEHCid
409 <<
" is obtained at " << theEEHC;
410 if (EEHCid >= 0 && theEEHC !=
nullptr) {
411 for (
j = 0;
j < theEEHC->entries();
j++) {
419 double theta = pos.theta();
421 double phi = pos.phi();
430 CaloHit hit(subdet, lay, e, eta, phi, time, unitID);
433 edm::LogVerbatim(
"HcalSim") <<
"HcalTest: " << det <<
" layer " << std::setw(2) << layer <<
" time " 434 << std::setw(6) << time <<
" theta " << std::setw(8) << theta <<
" eta " 435 << std::setw(8) << eta <<
" phi " << std::setw(8) << phi <<
" e " << std::setw(8)
458 }
else if (subdet == static_cast<int>(
HcalEndcap)) {
462 edm::LogVerbatim(
"HcalSim") <<
"HcalTestAnalysis::Qie: " << det <<
" Eta " << ieta <<
" Phi " << iphi <<
" Laymax " 463 << laymax <<
" Hits " << hittot;
465 if (laymax > 0 && hittot > 0) {
466 std::vector<CaloHit>
hits(hittot);
467 std::vector<double> eqielay(80, 0.0), esimlay(80, 0.0), esimtot(4, 0.0);
468 std::vector<double> eqietow(200, 0.0), esimtow(200, 0.0), eqietot(4, 0.0);
472 for (
int layr = 0; layr <
nGroup_; layr++) {
487 for (
int it = 0; it <
nTower_; it++) {
490 for (
int k1 = 0; k1 < hittot; k1++) {
492 int subdetc = hit.
det();
493 int layer = hit.
layer();
495 if (layer > 0 && layer < 20)
497 if (subdetc == subdet && group == layr + 1) {
498 int zsidec, ietac, iphic,
idx;
501 if (etac > 0 && phic > 0) {
502 idx = ietac * 100 + iphic;
503 }
else if (etac > 0) {
505 }
else if (phic > 0) {
510 if (zsidec == zside && idx ==
tower_[it]) {
519 std::vector<int>
cd =
myqie_->getCode(nhit, hits, engine);
520 double eqie =
myqie_->getEnergy(cd);
522 edm::LogVerbatim(
"HcalSim") <<
"HcalTestAnalysis::Qie: Energy in layer " << layr <<
" Sim " << esim
523 <<
" After QIE " << eqie;
524 for (
int i = 0;
i < 4;
i++) {
525 if (
tower_[nTower_ + it] <=
i) {
528 esimlay[20 *
i + layr] += esim;
529 eqielay[20 *
i + layr] += eqie;
530 esimtow[50 *
i + it] += esim;
531 eqietow[50 *
i + it] += eqie;
536 edm::LogVerbatim(
"HcalSim") <<
"HcalTestAnalysis::Qie: Total energy " << esimtot[3] <<
" (SimHit) " << eqietot[3]
539 std::vector<double> latphi(10);
541 for (
int it = 0; it <
nt; it++)
543 for (
int i = 0;
i < 4;
i++) {
544 double scals = 1, scalq = 1;
545 std::vector<double> latfs(10, 0.), latfq(10, 0.), longs(20), longq(20);
547 scals = 1. / esimtot[
i];
549 scalq = 1. / eqietot[
i];
550 for (
int it = 0; it <
nTower_; it++) {
552 latfs[phib] += scals * esimtow[50 *
i + it];
553 latfq[phib] += scalq * eqietow[50 *
i + it];
555 for (
int layr = 0; layr <=
nGroup_; layr++) {
556 longs[layr] = scals * esimlay[20 *
i + layr];
557 longq[layr] = scalq * eqielay[20 *
i + layr];
559 tuples_->
fillQie(
i, esimtot[
i], eqietot[i], nGroup_, longs, longq, nt, latphi, latfs, latfq);
567 edm::LogVerbatim(
"HcalSim") <<
"\n ===>>> HcalTestAnalysis: Energy deposit " 568 <<
"\n at EB : " << std::setw(6) <<
edepEB_ /
MeV <<
"\n at EE : " << std::setw(6)
570 <<
"\n at HE : " << std::setw(6) <<
edepHE_ /
MeV <<
"\n at HO : " << std::setw(6)
571 <<
edepHO_ /
MeV <<
"\n ---- HcalTestAnalysis: Energy deposit in Layers";
572 for (i = 0; i < 20; i++)
580 double theta = 2.0 * atan(
exp(-eta));
583 const double rLay[19] = {1836.0,
602 if (layer > 0 && layer < 20)
603 dist += rLay[layer - 1] * mm /
sin(theta);
605 const double zLay[19] = {4034.0,
624 if (layer > 0 && layer < 20)
625 dist += zLay[layer - 1] * mm /
cos(theta);
627 double tmp = dist / c_light / ns;
628 edm::LogVerbatim(
"HcalSim") <<
"HcalTestAnalysis::timeOfFlight " << tmp <<
" for det/lay " << det <<
" " << layer
629 <<
" eta/theta " << eta <<
" " << theta / deg <<
" dist " << dist;
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
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)
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.
HcalCellType::HcalCell cell(const int &det, const int &zside, const int &depth, const int &etaR, const int &iphi) const
void setNumberingScheme(HcalNumberingScheme *)
HcalTestHistoClass * tuples_
std::vector< int > towersToAdd(int centre, int nadd)
double timeOfFlight(int det, int layer, double eta)
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)
const HcalDDDSimConstants * hcons_
Cos< T >::type cos(const T &t)
~HcalTestAnalysis() override
std::unique_ptr< HcalQie > myqie_
Tan< T >::type tan(const T &t)
Abs< T >::type abs(const T &t)
XYZPointD XYZPoint
point in space with cartesian internal representation
std::vector< CaloHit > caloHitCache_
G4THitsCollection< CaloG4Hit > CaloG4HitCollection
static void unpackHcalIndex(const uint32_t &idx, int &det, int &z, int &depth, int &eta, int &phi, int &lay)
double getTimeSlice() const
void qieAnalysis(CLHEP::HepRandomEngine *)
uint32_t getUnitID() const
std::vector< int > group_
T const * product() const
std::unique_ptr< HcalTestHistoManager > tuplesManager_
double getEnergyDeposit() const
uint32_t getUnitID(const HcalNumberingFromDDD::HcalID &id) override