CMS 3D CMS Logo

List of all members | Classes | Public Member Functions | Protected Member Functions | Static Protected Member Functions | Protected Attributes | Private Member Functions | Private Attributes
CaloSD Class Referenceabstract

#include <CaloSD.h>

Inheritance diagram for CaloSD:
SensitiveCaloDetector Observer< const BeginOfRun *> Observer< const BeginOfEvent *> Observer< const BeginOfTrack *> Observer< const EndOfTrack *> Observer< const EndOfEvent *> SensitiveDetector AHCalSD CastorSD DreamSD ECalSD EcalTBH4BeamSD HCalSD HcalTB02SD HcalTB06BeamSD HFNoseSD HGCalSD HGCalTB16SD01 HGCScintSD HGCSD TotemT2ScintSD ZdcSD

Classes

struct  Detector
 

Public Member Functions

 CaloSD (const std::string &aSDname, const SensitiveDetectorCatalog &clg, edm::ParameterSet const &p, const SimTrackManager *, float timeSlice=1., bool ignoreTkID=false)
 
void clear () override
 
void clearHits () override
 
void DrawAll () override
 
void EndOfEvent (G4HCofThisEvent *eventHC) override
 
void fillHits (edm::PCaloHitContainer &, const std::string &) override
 
void Initialize (G4HCofThisEvent *HCE) override
 
bool isItFineCalo (const G4VTouchable *touch)
 
void PrintAll () override
 
G4bool ProcessHits (G4Step *step, G4TouchableHistory *) override
 
bool ProcessHits (G4GFlashSpot *aSpot, G4TouchableHistory *) override
 
void reset () override
 
uint32_t setDetUnitId (const G4Step *step) override=0
 
 ~CaloSD () override
 
- Public Member Functions inherited from SensitiveCaloDetector
 SensitiveCaloDetector (const std::string &iname, const SensitiveDetectorCatalog &clg)
 
- Public Member Functions inherited from SensitiveDetector
void EndOfEvent (G4HCofThisEvent *eventHC) override
 
const std::vector< std::string > & getNames () const
 
void Initialize (G4HCofThisEvent *eventHC) override
 
bool isCaloSD () const
 
 SensitiveDetector (const std::string &iname, const SensitiveDetectorCatalog &, bool calo)
 
 ~SensitiveDetector () override
 
- Public Member Functions inherited from Observer< const BeginOfRun *>
 Observer ()
 
void slotForUpdate (const BeginOfRun * iT)
 
virtual ~Observer ()
 
- Public Member Functions inherited from Observer< const BeginOfEvent *>
 Observer ()
 
void slotForUpdate (const BeginOfEvent * iT)
 
virtual ~Observer ()
 
- Public Member Functions inherited from Observer< const BeginOfTrack *>
 Observer ()
 
void slotForUpdate (const BeginOfTrack * iT)
 
virtual ~Observer ()
 
- Public Member Functions inherited from Observer< const EndOfTrack *>
 Observer ()
 
void slotForUpdate (const EndOfTrack * iT)
 
virtual ~Observer ()
 
- Public Member Functions inherited from Observer< const EndOfEvent *>
 Observer ()
 
void slotForUpdate (const EndOfEvent * iT)
 
virtual ~Observer ()
 

Protected Member Functions

bool checkHit ()
 
CaloG4HitcreateNewHit (const G4Step *, const G4Track *)
 
virtual void endEvent ()
 
virtual double EnergyCorrected (const G4Step &step, const G4Track *)
 
virtual bool filterHit (CaloG4Hit *, double)
 
unsigned int findBoundaryCrossingParent (const G4Track *track, bool markParentAsSaveable=true)
 
double getAttenuation (const G4Step *aStep, double birk1, double birk2, double birk3) const
 
virtual uint16_t getDepth (const G4Step *)
 
virtual double getEnergyDeposit (const G4Step *step)
 
virtual bool getFromLibrary (const G4Step *step)
 
int getNumberOfHits ()
 
double getResponseWt (const G4Track *)
 
virtual int getTrackID (const G4Track *)
 
bool hitExists (const G4Step *)
 
void ignoreRejection ()
 
virtual void initEvent (const BeginOfEvent *)
 
virtual void initRun ()
 
void printDetectorLevels (const G4VTouchable *) const
 
void processHit (const G4Step *step)
 
void resetForNewPrimary (const G4Step *)
 
void setNumberCheckedHits (int val)
 
void setParameterized (bool val)
 
G4ThreeVector setToGlobal (const G4ThreeVector &, const G4VTouchable *) const
 
G4ThreeVector setToLocal (const G4ThreeVector &, const G4VTouchable *) const
 
virtual int setTrackID (const G4Step *)
 
void setUseMap (bool val)
 
std::string shortreprID (const CaloHitID &ID)
 
std::string shortreprID (const CaloG4Hit *hit)
 
void update (const BeginOfRun *) override
 This routine will be called when the appropriate signal arrives. More...
 
void update (const BeginOfEvent *) override
 This routine will be called when the appropriate signal arrives. More...
 
void update (const BeginOfTrack *trk) override
 This routine will be called when the appropriate signal arrives. More...
 
void update (const EndOfTrack *trk) override
 This routine will be called when the appropriate signal arrives. More...
 
void update (const ::EndOfEvent *) override
 
void updateHit (CaloG4Hit *)
 
- Protected Member Functions inherited from SensitiveDetector
TrackInformationcmsTrackInformation (const G4Track *aTrack)
 
Local3DPoint ConvertToLocal3DPoint (const G4ThreeVector &point) const
 
Local3DPoint FinalStepPosition (const G4Step *step, coordinates) const
 
Local3DPoint InitialStepPosition (const G4Step *step, coordinates) const
 
Local3DPoint LocalPostStepPosition (const G4Step *step) const
 
Local3DPoint LocalPreStepPosition (const G4Step *step) const
 
void NaNTrap (const G4Step *step) const
 
void setNames (const std::vector< std::string > &)
 
- Protected Member Functions inherited from Observer< const EndOfEvent *>
virtual void update (const EndOfEvent *)=0
 This routine will be called when the appropriate signal arrives. More...
 

Static Protected Member Functions

static std::string printableDecayChain (const std::vector< unsigned int > &decayChain)
 

Protected Attributes

CaloG4HitcurrentHit
 
CaloHitID currentID
 
float edepositEM
 
float edepositHAD
 
double eminHit
 
double energyCut
 
G4ThreeVector entranceLocal
 
G4ThreeVector entrancePoint
 
bool forceSave
 
float incidentEnergy
 
double kmaxIon
 
double kmaxNeutron
 
double kmaxProton
 
G4ThreeVector posGlobal
 
CaloHitID previousID
 
bool suppressHeavy
 
double tmaxHit
 

Private Member Functions

void cleanHitCollection ()
 
bool saveHit (CaloG4Hit *)
 
void storeHit (CaloG4Hit *)
 

Private Attributes

std::unordered_map< unsigned int, unsigned int > boundaryCrossingParentMap_
 
int cleanIndex
 
double correctT
 
bool corrTOFBeam
 
bool doFineCalo_
 
bool doFineCaloThisStep_
 
double eMinFine_
 
double eminHitD
 
std::vector< DetectorfineDetectors_
 
int hcID
 
std::map< CaloHitID, CaloG4Hit * > hitMap
 
bool ignoreReject
 
bool ignoreTrackID
 
bool isParameterized
 
const SimTrackManagerm_trackManager
 
std::unique_ptr< CaloMeanResponsemeanResponse
 
int nCheckedHits
 
int primAncestor
 
int primIDSaved
 
std::vector< std::unique_ptr< CaloG4Hit > > reusehit
 
std::unique_ptr< CaloSlaveSDslave
 
CaloG4HitCollectiontheHC
 
float timeSlice
 
std::map< int, TrackWithHistory * > tkMap
 
int totalHits
 
bool useMap
 

Additional Inherited Members

- Protected Types inherited from SensitiveDetector
enum  coordinates { WorldCoordinates, LocalCoordinates }
 

Detailed Description

Definition at line 40 of file CaloSD.h.

Constructor & Destructor Documentation

◆ CaloSD()

CaloSD::CaloSD ( const std::string &  aSDname,
const SensitiveDetectorCatalog clg,
edm::ParameterSet const &  p,
const SimTrackManager manager,
float  timeSlice = 1.,
bool  ignoreTkID = false 
)

Definition at line 33 of file CaloSD.cc.

References cleanIndex, correctT, corrTOFBeam, currentID, hgcalTestNeighbor_cfi::detector, doFineCalo_, edepositEM, edepositHAD, eMinFine_, eminHit, eminHitD, energyCut, entranceLocal, entrancePoint, fineDetectors_, forceSave, edm::ParameterSet::getParameter(), edm::ParameterSet::getUntrackedParameter(), mps_fire::i, ignoreTrackID, incidentEnergy, isParameterized, dqmdumpme::k, kmaxIon, kmaxNeutron, kmaxProton, personalPlayback::level, meanResponse, Skims_PA_cff::name, nCheckedHits, AlCaHLTBitMon_ParallelJobs::p, posGlobal, previousID, primAncestor, primIDSaved, slave, suppressHeavy, timeSlice, tmaxHit, totalHits, and useMap.

40  G4VGFlashSensitiveDetector(),
41  eminHit(0.),
42  currentHit(nullptr),
43  m_trackManager(manager),
44  theHC(nullptr),
45  ignoreTrackID(ignoreTkID),
46  hcID(-1),
47  timeSlice(timeSliceUnit),
48  eminHitD(0.) {
49  //Parameters
50  bool dd4hep = p.getParameter<bool>("g4GeometryDD4hepSource");
51  int addlevel = dd4hep ? 1 : 0;
52  edm::ParameterSet m_CaloSD = p.getParameter<edm::ParameterSet>("CaloSD");
53  energyCut = m_CaloSD.getParameter<double>("EminTrack") * CLHEP::GeV;
54  tmaxHit = m_CaloSD.getParameter<double>("TmaxHit") * CLHEP::ns;
55  std::vector<double> eminHits = m_CaloSD.getParameter<std::vector<double>>("EminHits");
56  std::vector<double> tmaxHits = m_CaloSD.getParameter<std::vector<double>>("TmaxHits");
57  std::vector<std::string> hcn = m_CaloSD.getParameter<std::vector<std::string>>("HCNames");
58  std::vector<int> useResMap = m_CaloSD.getParameter<std::vector<int>>("UseResponseTables");
59  std::vector<double> eminHitX = m_CaloSD.getParameter<std::vector<double>>("EminHitsDepth");
60  suppressHeavy = m_CaloSD.getParameter<bool>("SuppressHeavy");
61  kmaxIon = m_CaloSD.getParameter<double>("IonThreshold") * CLHEP::MeV;
62  kmaxProton = m_CaloSD.getParameter<double>("ProtonThreshold") * CLHEP::MeV;
63  kmaxNeutron = m_CaloSD.getParameter<double>("NeutronThreshold") * CLHEP::MeV;
64  nCheckedHits = m_CaloSD.getUntrackedParameter<int>("CheckHits", 25);
65  useMap = m_CaloSD.getUntrackedParameter<bool>("UseMap", true);
66  int verbn = m_CaloSD.getUntrackedParameter<int>("Verbosity", 0);
67  corrTOFBeam = m_CaloSD.getParameter<bool>("CorrectTOFBeam");
68  double beamZ = m_CaloSD.getParameter<double>("BeamPosition") * CLHEP::cm;
69  correctT = beamZ / CLHEP::c_light / CLHEP::nanosecond;
70  doFineCalo_ = m_CaloSD.getParameter<bool>("DoFineCalo");
71  eMinFine_ = m_CaloSD.getParameter<double>("EminFineTrack") * CLHEP::MeV;
72  std::vector<std::string> fineNames = m_CaloSD.getParameter<std::vector<std::string>>("FineCaloNames");
73  std::vector<int> fineLevels = m_CaloSD.getParameter<std::vector<int>>("FineCaloLevels");
74  std::vector<int> useFines = m_CaloSD.getParameter<std::vector<int>>("UseFineCalo");
75  for (auto& level : fineLevels)
76  level += addlevel;
77 
78  SetVerboseLevel(verbn);
79  meanResponse.reset(nullptr);
80  for (unsigned int k = 0; k < hcn.size(); ++k) {
81  if (name == hcn[k]) {
82  if (k < eminHits.size())
83  eminHit = eminHits[k] * CLHEP::MeV;
84  if (k < eminHitX.size())
85  eminHitD = eminHitX[k] * CLHEP::MeV;
86  if (k < tmaxHits.size())
87  tmaxHit = tmaxHits[k] * CLHEP::ns;
88  if (k < useResMap.size() && useResMap[k] > 0) {
89  meanResponse = std::make_unique<CaloMeanResponse>(p);
90  break;
91  }
92  }
93  }
94  slave = std::make_unique<CaloSlaveSD>(name);
95 
98  isParameterized = false;
99 
100  entrancePoint.set(0., 0., 0.);
101  entranceLocal.set(0., 0., 0.);
102  posGlobal.set(0., 0., 0.);
104 
106  forceSave = false;
107 
108  edm::LogVerbatim("CaloSim") << "CaloSD: Minimum energy of track for saving it " << energyCut / CLHEP::GeV
109  << " GeV\n Use of HitID Map " << useMap << "\n Check last " << nCheckedHits
110  << " before saving the hit\n Correct TOF globally by " << correctT
111  << " ns (Flag =" << corrTOFBeam << ")\n Save hits recorded before " << tmaxHit
112  << " ns and if energy is above " << eminHit / CLHEP::MeV << " MeV (for depth 0) or "
113  << eminHitD / CLHEP::MeV << " MeV (for nonzero depths);\n Time Slice Unit "
114  << timeSlice << "\nIgnore TrackID Flag " << ignoreTrackID << " doFineCalo flag "
115  << doFineCalo_ << "\nBeam Position " << beamZ / CLHEP::cm << " cm";
116  if (doFineCalo_)
117  edm::LogVerbatim("DoFineCalo") << "Using finecalo v2";
118 
119  // Treat fine calorimeters
120  edm::LogVerbatim("CaloSim") << "CaloSD: Have a possibility of " << fineNames.size() << " fine calorimeters of which "
121  << useFines.size() << " are selected";
122  for (unsigned int k = 0; k < fineNames.size(); ++k)
123  edm::LogVerbatim("CaloSim") << "[" << k << "] " << fineNames[k] << " at " << fineLevels[k];
124  std::ostringstream st1;
125  for (unsigned int k = 0; k < useFines.size(); ++k)
126  st1 << " [" << k << "] " << useFines[k] << ":" << fineNames[useFines[k]];
127  edm::LogVerbatim("CaloSim") << "CaloSD used calorimeters" << st1.str();
128  const G4LogicalVolumeStore* lvs = G4LogicalVolumeStore::GetInstance();
129  std::vector<G4LogicalVolume*>::const_iterator lvcite;
130  for (unsigned int i = 0; i < useFines.size(); i++) {
131  G4LogicalVolume* lv = nullptr;
132  G4String name = static_cast<G4String>(fineNames[useFines[i]]);
133  for (lvcite = lvs->begin(); lvcite != lvs->end(); lvcite++) {
134  G4String namx(static_cast<std::string>(dd4hep::dd::noNamespace((*lvcite)->GetName())));
135  if (namx == name) {
136  lv = (*lvcite);
137  break;
138  }
139  }
140  if (lv != nullptr) {
142  detector.name = name;
143  detector.lv = lv;
144  detector.level = fineLevels[useFines[i]];
145  fineDetectors_.emplace_back(detector);
146  }
147  }
148 #ifdef EDM_ML_DEBUG
149  edm::LogVerbatim("CaloSim") << "CaloSD::Loads information for " << fineDetectors_.size() << " fine detectors";
150  unsigned int k(0);
151  for (const auto& detector : fineDetectors_) {
152  edm::LogVerbatim("CaloSim") << "Detector[" << k << "] " << detector.name << " at level " << detector.level
153  << " pointer to LV: " << detector.lv;
154  }
155 #endif
156 }
float edepositEM
Definition: CaloSD.h:140
double energyCut
Definition: CaloSD.h:144
Log< level::Info, true > LogVerbatim
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
double kmaxNeutron
Definition: CaloSD.h:149
double eMinFine_
Definition: CaloSD.h:185
bool corrTOFBeam
Definition: CaloSD.h:172
int totalHits
Definition: CaloSD.h:177
bool useMap
Definition: CaloSD.h:171
int hcID
Definition: CaloSD.h:174
double eminHitD
Definition: CaloSD.h:182
G4ThreeVector posGlobal
Definition: CaloSD.h:138
int primIDSaved
Definition: CaloSD.h:178
int primAncestor
Definition: CaloSD.h:175
double kmaxProton
Definition: CaloSD.h:149
std::vector< Detector > fineDetectors_
Definition: CaloSD.h:191
double eminHit
Definition: CaloSD.h:144
T getUntrackedParameter(std::string const &, T const &) const
bool forceSave
Definition: CaloSD.h:151
float timeSlice
Definition: CaloSD.h:181
double kmaxIon
Definition: CaloSD.h:149
bool suppressHeavy
Definition: CaloSD.h:148
std::unique_ptr< CaloSlaveSD > slave
Definition: CaloSD.h:163
float edepositHAD
Definition: CaloSD.h:140
bool doFineCalo_
Definition: CaloSD.h:184
SensitiveCaloDetector(const std::string &iname, const SensitiveDetectorCatalog &clg)
CaloHitID previousID
Definition: CaloSD.h:142
CaloG4Hit * currentHit
Definition: CaloSD.h:146
double tmaxHit
Definition: CaloSD.h:144
std::unique_ptr< CaloMeanResponse > meanResponse
Definition: CaloSD.h:164
CaloHitID currentID
Definition: CaloSD.h:142
double correctT
Definition: CaloSD.h:183
int nCheckedHits
Definition: CaloSD.h:179
CaloG4HitCollection * theHC
Definition: CaloSD.h:166
float incidentEnergy
Definition: CaloSD.h:139
bool isParameterized
Definition: CaloSD.h:169
const SimTrackManager * m_trackManager
Definition: CaloSD.h:161
G4ThreeVector entrancePoint
Definition: CaloSD.h:136
G4ThreeVector entranceLocal
Definition: CaloSD.h:137
int cleanIndex
Definition: CaloSD.h:176
bool ignoreTrackID
Definition: CaloSD.h:168

◆ ~CaloSD()

CaloSD::~CaloSD ( )
override

Definition at line 158 of file CaloSD.cc.

158 {}

Member Function Documentation

◆ checkHit()

bool CaloSD::checkHit ( )
protected

Definition at line 432 of file CaloSD.cc.

References currentHit, currentID, newFWLiteAna::found, hitMap, dqmiolumiharvest::j, SiStripPI::max, nCheckedHits, nhits, theHC, updateHit(), and useMap.

Referenced by hitExists(), processHit(), and ProcessHits().

432  {
433  //look in the HitContainer whether a hit with the same ID already exists:
434  bool found = false;
435  if (useMap) {
436  std::map<CaloHitID, CaloG4Hit*>::const_iterator it = hitMap.find(currentID);
437  if (it != hitMap.end()) {
438  currentHit = it->second;
439  found = true;
440  }
441  } else if (nCheckedHits > 0) {
442  int nhits = theHC->entries();
443  int minhit = std::max(nhits - nCheckedHits, 0);
444  int maxhit = nhits - 1;
445 
446  for (int j = maxhit; j > minhit; --j) {
447  if ((*theHC)[j]->getID() == currentID) {
448  currentHit = (*theHC)[j];
449  found = true;
450  break;
451  }
452  }
453  }
454 
455  if (found) {
457  }
458  return found;
459 }
void updateHit(CaloG4Hit *)
Definition: CaloSD.cc:642
bool useMap
Definition: CaloSD.h:171
CaloG4Hit * currentHit
Definition: CaloSD.h:146
CaloHitID currentID
Definition: CaloSD.h:142
std::map< CaloHitID, CaloG4Hit * > hitMap
Definition: CaloSD.h:187
int nCheckedHits
Definition: CaloSD.h:179
CaloG4HitCollection * theHC
Definition: CaloSD.h:166

◆ cleanHitCollection()

void CaloSD::cleanHitCollection ( )
private

Definition at line 965 of file CaloSD.cc.

References cleanIndex, correctT, corrTOFBeam, cond::serialization::equal(), filterHit(), CaloG4Hit::getTimeSlice(), hitMap, mps_fire::i, cuy::ii, dqmiolumiharvest::j, hltrates_dqm_sourceclient-live_cfg::offset, AlCaHLTBitMon_ParallelJobs::p, reusehit, jetsAK4_CHS_cff::sort, theHC, protons_cff::time, totalHits, and useMap.

Referenced by EndOfEvent(), and update().

965  {
966  std::vector<CaloG4Hit*>* theCollection = theHC->GetVector();
967 
968 #ifdef EDM_ML_DEBUG
969  edm::LogVerbatim("CaloSim") << "CaloSD: collection before merging, size = " << theHC->entries();
970 #endif
971  if (reusehit.empty())
972  reusehit.reserve(theHC->entries() - cleanIndex);
973 
974  // if no map used, merge before hits to have the save situation as a map
975  if (!useMap) {
976  std::vector<CaloG4Hit*> hitvec;
977 
978  hitvec.swap(*theCollection);
979  sort((hitvec.begin() + cleanIndex), hitvec.end(), CaloG4HitLess());
980 #ifdef EDM_ML_DEBUG
981  edm::LogVerbatim("CaloSim") << "CaloSD::cleanHitCollection: sort hits in buffer starting from "
982  << "element = " << cleanIndex;
983  for (unsigned int i = 0; i < hitvec.size(); ++i) {
984  if (hitvec[i] == nullptr)
985  edm::LogVerbatim("CaloSim") << i << " has a null pointer";
986  else
987  edm::LogVerbatim("CaloSim") << i << " " << *hitvec[i];
988  }
989 #endif
991  for (unsigned int i = cleanIndex; i < hitvec.size(); ++i) {
992  int jump = 0;
993  for (unsigned int j = i + 1; j < hitvec.size() && equal(hitvec[i], hitvec[j]); ++j) {
994  ++jump;
995  // merge j to i
996  (*hitvec[i]).addEnergyDeposit(*hitvec[j]);
997  (*hitvec[j]).setEM(0.);
998  (*hitvec[j]).setHadr(0.);
999  reusehit.emplace_back(hitvec[j]);
1000  hitvec[j] = nullptr;
1001  }
1002  i += jump;
1003  }
1004 #ifdef EDM_ML_DEBUG
1005  edm::LogVerbatim("CaloSim") << "CaloSD: cleanHitCollection merge the hits in buffer ";
1006  for (unsigned int i = 0; i < hitvec.size(); ++i) {
1007  if (hitvec[i] == nullptr)
1008  edm::LogVerbatim("CaloSim") << i << " has a null pointer";
1009  else
1010  edm::LogVerbatim("CaloSim") << i << " " << *hitvec[i];
1011  }
1012 #endif
1013  //move all nullptr to end of list and then remove them
1014  hitvec.erase(
1015  std::stable_partition(hitvec.begin() + cleanIndex, hitvec.end(), [](CaloG4Hit* p) { return p != nullptr; }),
1016  hitvec.end());
1017 #ifdef EDM_ML_DEBUG
1018  edm::LogVerbatim("CaloSim") << "CaloSD::cleanHitCollection: remove the merged hits in buffer,"
1019  << " new size = " << hitvec.size();
1020 #endif
1021  hitvec.swap(*theCollection);
1022  totalHits = theHC->entries();
1023  }
1024 
1025 #ifdef EDM_ML_DEBUG
1026  edm::LogVerbatim("CaloSim") << "CaloSD: collection after merging, size= " << theHC->entries()
1027  << " Size of reusehit= " << reusehit.size()
1028  << "\n starting hit selection from index = " << cleanIndex;
1029 #endif
1030 
1031  int addhit = 0;
1032  for (unsigned int i = cleanIndex; i < theCollection->size(); ++i) {
1033  CaloG4Hit* aHit((*theCollection)[i]);
1034 
1035  // selection
1036 
1037  double time = aHit->getTimeSlice();
1038  if (corrTOFBeam)
1039  time += correctT;
1040  if (!filterHit(aHit, time)) {
1041 #ifdef EDM_ML_DEBUG
1042  edm::LogVerbatim("CaloSim") << "CaloSD: dropped CaloG4Hit "
1043  << " " << *aHit;
1044 #endif
1045 
1046  // create the list of hits to be reused
1047 
1048  reusehit.emplace_back((*theCollection)[i]);
1049  (*theCollection)[i] = nullptr;
1050  ++addhit;
1051  }
1052  }
1053 
1054 #ifdef EDM_ML_DEBUG
1055  edm::LogVerbatim("CaloSim") << "CaloSD: Size of reusehit after selection = " << reusehit.size()
1056  << " Number of added hit = " << addhit;
1057 #endif
1058  if (useMap) {
1059  if (addhit > 0) {
1060  int offset = reusehit.size() - addhit;
1061  for (int ii = addhit - 1; ii >= 0; --ii) {
1062  CaloHitID theID = reusehit[offset + ii]->getID();
1063  hitMap.erase(theID);
1064  }
1065  }
1066  }
1067 
1068  //move all nullptr to end of list and then remove them
1069  theCollection->erase(
1070  std::stable_partition(
1071  theCollection->begin() + cleanIndex, theCollection->end(), [](CaloG4Hit* p) { return p != nullptr; }),
1072  theCollection->end());
1073 #ifdef EDM_ML_DEBUG
1074  edm::LogVerbatim("CaloSim") << "CaloSD: hit collection after selection, size = " << theHC->entries();
1075  theHC->PrintAllHits();
1076 #endif
1077 
1078  cleanIndex = theHC->entries();
1079 }
Log< level::Info, true > LogVerbatim
bool corrTOFBeam
Definition: CaloSD.h:172
int totalHits
Definition: CaloSD.h:177
bool useMap
Definition: CaloSD.h:171
bool equal(const T &first, const T &second)
Definition: Equal.h:32
virtual bool filterHit(CaloG4Hit *, double)
Definition: CaloSD.cc:847
ii
Definition: cuy.py:589
double correctT
Definition: CaloSD.h:183
std::map< CaloHitID, CaloG4Hit * > hitMap
Definition: CaloSD.h:187
CaloG4HitCollection * theHC
Definition: CaloSD.h:166
std::vector< std::unique_ptr< CaloG4Hit > > reusehit
Definition: CaloSD.h:190
int cleanIndex
Definition: CaloSD.h:176

◆ clear()

void CaloSD::clear ( void  )
override

Definition at line 381 of file CaloSD.cc.

381 {}

◆ clearHits()

void CaloSD::clearHits ( )
overridevirtual

Implements SensitiveDetector.

Definition at line 782 of file CaloSD.cc.

References cleanIndex, previousID, primIDSaved, CaloHitID::reset(), and slave.

Referenced by update().

782  {
783  cleanIndex = 0;
784  previousID.reset();
785  primIDSaved = -99;
786 #ifdef EDM_ML_DEBUG
787  edm::LogVerbatim("CaloSim") << "CaloSD: Clears hit vector for " << GetName()
788  << " and initialise slave: " << slave.get()->name();
789 #endif
790  slave.get()->Initialize();
791 }
Log< level::Info, true > LogVerbatim
int primIDSaved
Definition: CaloSD.h:178
void reset()
Definition: CaloHitID.cc:49
std::unique_ptr< CaloSlaveSD > slave
Definition: CaloSD.h:163
CaloHitID previousID
Definition: CaloSD.h:142
int cleanIndex
Definition: CaloSD.h:176

◆ createNewHit()

CaloG4Hit * CaloSD::createNewHit ( const G4Step *  aStep,
const G4Track *  theTrack 
)
protected

Definition at line 564 of file CaloSD.cc.

References SensitiveDetector::cmsTrackInformation(), currentID, CaloHitID::depth(), doFineCaloThisStep_, edepositEM, edepositHAD, energyCut, entranceLocal, entrancePoint, f, forceSave, getNumberOfHits(), incidentEnergy, isItFineCalo(), TrackWithHistory::momentum(), posGlobal, primIDSaved, TrackInformation::putInHistory(), reusehit, TrackWithHistory::save(), CaloG4Hit::setEM(), CaloG4Hit::setEntry(), CaloG4Hit::setEntryLocal(), CaloG4Hit::setHadr(), CaloG4Hit::setID(), CaloG4Hit::setIncidentEnergy(), CaloG4Hit::setPosition(), shortreprID(), mathSSE::sqrt(), storeHit(), TrackInformation::storeTrack(), CaloHitID::timeSliceID(), tkMap, totalHits, CaloHitID::trackID(), CaloHitID::unitID(), updateHit(), and useMap.

Referenced by processHit(), and ProcessHits().

564  {
565 #ifdef EDM_ML_DEBUG
566  edm::LogVerbatim("CaloSim") << "CaloSD::CreateNewHit " << getNumberOfHits() << " for " << GetName()
567  << " Unit:" << currentID.unitID() << " " << currentID.depth() << " Edep= " << edepositEM
568  << " " << edepositHAD << " primaryID= " << currentID.trackID()
569  << " timeSlice= " << currentID.timeSliceID() << " ID= " << theTrack->GetTrackID() << " "
570  << theTrack->GetDefinition()->GetParticleName()
571  << " E(GeV)= " << theTrack->GetKineticEnergy() / CLHEP::GeV
572  << " parentID= " << theTrack->GetParentID() << "\n Ein= " << incidentEnergy
573  << " entranceGlobal: " << entrancePoint << " entranceLocal: " << entranceLocal
574  << " posGlobal: " << posGlobal;
575 #endif
576 
577  CaloG4Hit* aHit;
578  if (!reusehit.empty()) {
579  aHit = reusehit.back().release();
580  aHit->setEM(0.f);
581  aHit->setHadr(0.f);
582  reusehit.pop_back();
583  } else {
584  aHit = new CaloG4Hit;
585  }
586 
587  aHit->setID(currentID);
588  aHit->setEntry(entrancePoint.x(), entrancePoint.y(), entrancePoint.z());
590  aHit->setPosition(posGlobal.x(), posGlobal.y(), posGlobal.z());
592  updateHit(aHit);
593 
594  storeHit(aHit);
595  TrackInformation* trkInfo = cmsTrackInformation(theTrack);
596 
597 #ifdef EDM_ML_DEBUG
599  edm::LogVerbatim("DoFineCalo") << "New hit " << shortreprID(aHit) << " using finecalo;"
600  << " isItFineCalo(post)=" << isItFineCalo(aStep->GetPostStepPoint()->GetTouchable())
601  << " isItFineCalo(pre)=" << isItFineCalo(aStep->GetPreStepPoint()->GetTouchable());
602 #endif
603 
604  // 'Traditional', non-fine history bookkeeping
605  if (!doFineCaloThisStep_) {
606  double etrack = 0;
607  if (currentID.trackID() == primIDSaved) { // The track is saved; nothing to be done
608  } else if (currentID.trackID() == theTrack->GetTrackID()) {
609  etrack = theTrack->GetKineticEnergy();
610 #ifdef EDM_ML_DEBUG
611  edm::LogVerbatim("CaloSim") << "CaloSD: set save the track " << currentID.trackID() << " etrack " << etrack
612  << " eCut " << energyCut << " force: " << forceSave
613  << " save: " << (etrack >= energyCut || forceSave);
614 #endif
615  if (etrack >= energyCut || forceSave) {
616  trkInfo->storeTrack(true);
617  trkInfo->putInHistory();
618  }
619  } else {
621 #ifdef EDM_ML_DEBUG
622  edm::LogVerbatim("CaloSim") << "CaloSD : TrackWithHistory pointer for " << currentID.trackID() << " is " << trkh;
623 #endif
624  if (trkh != nullptr) {
625  etrack = sqrt(trkh->momentum().Mag2());
626  if (etrack >= energyCut) {
627  trkh->save();
628 #ifdef EDM_ML_DEBUG
629  edm::LogVerbatim("CaloSim") << "CaloSD: set save the track " << currentID.trackID() << " with Hit";
630 #endif
631  }
632  }
633  }
635  }
636 
637  if (useMap)
638  ++totalHits;
639  return aHit;
640 }
float edepositEM
Definition: CaloSD.h:140
bool storeTrack() const
double energyCut
Definition: CaloSD.h:144
Log< level::Info, true > LogVerbatim
bool doFineCaloThisStep_
Definition: CaloSD.h:192
void updateHit(CaloG4Hit *)
Definition: CaloSD.cc:642
int totalHits
Definition: CaloSD.h:177
void setIncidentEnergy(double e)
Definition: CaloG4Hit.h:62
const math::XYZVectorD & momentum() const
void setEntryLocal(double x, double y, double z)
Definition: CaloG4Hit.h:50
bool useMap
Definition: CaloSD.h:171
G4ThreeVector posGlobal
Definition: CaloSD.h:138
int primIDSaved
Definition: CaloSD.h:178
bool forceSave
Definition: CaloSD.h:151
int timeSliceID() const
Definition: CaloHitID.h:21
bool isItFineCalo(const G4VTouchable *touch)
Definition: CaloSD.cc:330
float edepositHAD
Definition: CaloSD.h:140
T sqrt(T t)
Definition: SSEVec.h:19
void setEM(double e)
Definition: CaloG4Hit.h:56
void setID(uint32_t i, double d, int j, uint16_t k=0)
Definition: CaloG4Hit.h:73
double f[11][100]
int getNumberOfHits()
Definition: CaloSD.cc:461
uint32_t unitID() const
Definition: CaloHitID.h:20
void storeHit(CaloG4Hit *)
Definition: CaloSD.cc:867
TrackInformation * cmsTrackInformation(const G4Track *aTrack)
CaloHitID currentID
Definition: CaloSD.h:142
void setHadr(double e)
Definition: CaloG4Hit.h:59
float incidentEnergy
Definition: CaloSD.h:139
void setPosition(double x, double y, double z)
Definition: CaloG4Hit.h:53
void setEntry(double x, double y, double z)
Definition: CaloG4Hit.h:47
std::map< int, TrackWithHistory * > tkMap
Definition: CaloSD.h:188
std::vector< std::unique_ptr< CaloG4Hit > > reusehit
Definition: CaloSD.h:190
std::string shortreprID(const CaloHitID &ID)
Definition: CaloSD.cc:478
int trackID() const
Definition: CaloHitID.h:23
G4ThreeVector entrancePoint
Definition: CaloSD.h:136
G4ThreeVector entranceLocal
Definition: CaloSD.h:137
uint16_t depth() const
Definition: CaloHitID.h:24

◆ DrawAll()

void CaloSD::DrawAll ( )
override

Definition at line 383 of file CaloSD.cc.

383 {}

◆ endEvent()

void CaloSD::endEvent ( )
protectedvirtual

Reimplemented in HCalSD, and HGCSD.

Definition at line 803 of file CaloSD.cc.

Referenced by update().

803 {}

◆ EndOfEvent()

void CaloSD::EndOfEvent ( G4HCofThisEvent *  eventHC)
override

Definition at line 368 of file CaloSD.cc.

References cleanHitCollection(), and theHC.

368  {
369  // clean the hits for the last tracks
370 
372 
373 #ifdef EDM_ML_DEBUG
374  if (theHC == nullptr)
375  edm::LogVerbatim("CaloSim") << "CaloSD: EndofEvent entered with no entries";
376  else
377  edm::LogVerbatim("CaloSim") << "CaloSD: EndofEvent entered with " << theHC->entries() << " entries";
378 #endif
379 }
Log< level::Info, true > LogVerbatim
void cleanHitCollection()
Definition: CaloSD.cc:965
CaloG4HitCollection * theHC
Definition: CaloSD.h:166

◆ EnergyCorrected()

double CaloSD::EnergyCorrected ( const G4Step &  step,
const G4Track *   
)
protectedvirtual

Reimplemented in ECalSD.

Definition at line 326 of file CaloSD.cc.

Referenced by ProcessHits().

326 { return aStep.GetTotalEnergyDeposit(); }

◆ fillHits()

void CaloSD::fillHits ( edm::PCaloHitContainer cc,
const std::string &  hname 
)
overridevirtual

Implements SensitiveCaloDetector.

Definition at line 392 of file CaloSD.cc.

References slave.

392  {
393 #ifdef EDM_ML_DEBUG
394  edm::LogVerbatim("CaloSim") << "CaloSD: Tries to transfer " << slave.get()->hits().size() << " hits for "
395  << slave.get()->name() << " " << hname;
396 #endif
397  if (slave.get()->name() == hname) {
398  cc = slave.get()->hits();
399  }
400  slave.get()->Clean();
401 }
Log< level::Info, true > LogVerbatim
std::unique_ptr< CaloSlaveSD > slave
Definition: CaloSD.h:163

◆ filterHit()

bool CaloSD::filterHit ( CaloG4Hit hit,
double  time 
)
protectedvirtual

Reimplemented in HCalSD, HGCSD, HFNoseSD, HGCalSD, HGCScintSD, and AHCalSD.

Definition at line 847 of file CaloSD.cc.

References eminHit, eminHitD, protons_cff::time, and tmaxHit.

Referenced by cleanHitCollection().

847  {
848  double emin(eminHit);
849  if (hit->getDepth() > 0)
850  emin = eminHitD;
851 #ifdef EDM_ML_DEBUG
852  edm::LogVerbatim("CaloSim") << "CaloSD::filterHit(..) Depth " << hit->getDepth() << " Emin = " << emin << " ("
853  << eminHit << ", " << eminHitD << ")";
854 #endif
855  return ((time <= tmaxHit) && (hit->getEnergyDeposit() > emin));
856 }
Log< level::Info, true > LogVerbatim
double eminHitD
Definition: CaloSD.h:182
double eminHit
Definition: CaloSD.h:144
double tmaxHit
Definition: CaloSD.h:144

◆ findBoundaryCrossingParent()

unsigned int CaloSD::findBoundaryCrossingParent ( const G4Track *  track,
bool  markParentAsSaveable = true 
)
protected

Definition at line 492 of file CaloSD.cc.

References boundaryCrossingParentMap_, SensitiveDetector::cmsTrackInformation(), TrackInformation::crossedBoundary(), Exception, SimTrackManager::getTrackByID(), l1ctLayer2EG_cff::id, m_trackManager, TrackWithHistory::parentID(), cosmicMuonLinks_cfi::parentTrack, printableDecayChain(), TrackInformation::storeTrack(), and HLT_2022v15_cff::track.

Referenced by ProcessHits().

492  {
494  unsigned int id = track->GetTrackID();
495  // First see if this track is already in the map
496  auto it = boundaryCrossingParentMap_.find(id);
497  if (it != boundaryCrossingParentMap_.end()) {
498 #ifdef EDM_ML_DEBUG
499  edm::LogVerbatim("DoFineCalo") << "Track " << id << " parent already cached: " << it->second;
500 #endif
501  return it->second;
502  }
503  // Then see if the track itself crosses the boundary
504  else if (trkInfo->crossedBoundary()) {
505 #ifdef EDM_ML_DEBUG
506  edm::LogVerbatim("DoFineCalo") << "Track " << id << " crosses boundary itself";
507 #endif
509  trkInfo->storeTrack(true);
510  return id;
511  }
512  // Else, traverse the history of the track
513  std::vector<unsigned int> decayChain{id};
514 #ifdef EDM_ML_DEBUG
515  edm::LogVerbatim("DoFineCalo") << "Track " << id << ": Traversing history to find boundary-crossing parent";
516 #endif
517  unsigned int parentID = track->GetParentID();
518  while (true) {
519  if (parentID == 0)
520  throw cms::Exception("Unknown", "CaloSD")
521  << "Hit end of parentage for track " << id << " without finding a boundary-crossing parent";
522  // First check if this ancestor is already in the map
523  auto it = boundaryCrossingParentMap_.find(parentID);
524  if (it != boundaryCrossingParentMap_.end()) {
525 #ifdef EDM_ML_DEBUG
526  edm::LogVerbatim("DoFineCalo") << " Track " << parentID
527  << " boundary-crossing parent already cached: " << it->second;
528 #endif
529  // Store this parent also for the rest of the traversed decay chain
530  for (auto ancestorID : decayChain)
531  boundaryCrossingParentMap_[ancestorID] = it->second;
532 #ifdef EDM_ML_DEBUG
533  // In debug mode, still build the rest of the decay chain for debugging
534  decayChain.push_back(parentID);
535  while (parentID != it->second) {
536  parentID = m_trackManager->getTrackByID(parentID, true)->parentID();
537  decayChain.push_back(parentID);
538  }
539  edm::LogVerbatim("DoFineCalo") << " Full decay chain: " << printableDecayChain(decayChain);
540 #endif
541  return it->second;
542  }
543  // If not, get this parent from the track manager (expensive)
545  if (parentTrack->crossedBoundary()) {
546  if (markAsSaveable)
547  parentTrack->save();
548  decayChain.push_back(parentID);
549  // Record this boundary crossing parent for all traversed ancestors
550  for (auto ancestorID : decayChain)
551  boundaryCrossingParentMap_[ancestorID] = parentID;
552 #ifdef EDM_ML_DEBUG
553  edm::LogVerbatim("DoFineCalo") << " Found boundary-crossing ancestor " << parentID << " for track " << id
554  << "; decay chain: " << printableDecayChain(decayChain);
555 #endif
556  return parentID;
557  }
558  // Next iteration
559  decayChain.push_back(parentID);
560  parentID = parentTrack->parentID();
561  }
562 }
bool storeTrack() const
Log< level::Info, true > LogVerbatim
bool crossedBoundary() const
int parentID() const
TrackWithHistory * getTrackByID(unsigned int trackID, bool strict=false) const
std::unordered_map< unsigned int, unsigned int > boundaryCrossingParentMap_
Definition: CaloSD.h:189
static std::string printableDecayChain(const std::vector< unsigned int > &decayChain)
Definition: CaloSD.cc:467
TrackInformation * cmsTrackInformation(const G4Track *aTrack)
const SimTrackManager * m_trackManager
Definition: CaloSD.h:161

◆ getAttenuation()

double CaloSD::getAttenuation ( const G4Step *  aStep,
double  birk1,
double  birk2,
double  birk3 
) const
protected

Definition at line 666 of file CaloSD.cc.

References funct::abs(), c, ALCARECOTkAlJpsiMuMu_cff::charge, fastSimProducer_cff::density, and mps_merge::weight.

Referenced by TotemT2ScintSD::getEnergyDeposit(), AHCalSD::getEnergyDeposit(), HGCalTB16SD01::getEnergyDeposit(), HcalTB06BeamSD::getEnergyDeposit(), HGCScintSD::getEnergyDeposit(), EcalTBH4BeamSD::getEnergyDeposit(), DreamSD::getEnergyDeposit(), ECalSD::getEnergyDeposit(), HcalTB02SD::getEnergyDeposit(), and HCalSD::getEnergyDeposit().

666  {
667  double weight = 1.;
668  double charge = aStep->GetPreStepPoint()->GetCharge();
669  double length = aStep->GetStepLength();
670 
671  if (charge != 0. && length > 0.) {
672  double density = aStep->GetPreStepPoint()->GetMaterial()->GetDensity();
673  double dedx = aStep->GetTotalEnergyDeposit() / length;
674  double rkb = birk1 / density;
675  double c = birk2 * rkb * rkb;
676  if (std::abs(charge) >= 2.)
677  rkb /= birk3; // based on alpha particle data
678  weight = 1. / (1. + rkb * dedx + c * dedx * dedx);
679 #ifdef EDM_ML_DEBUG
680  edm::LogVerbatim("CaloSim") << "CaloSD::getAttenuation in " << aStep->GetPreStepPoint()->GetMaterial()->GetName()
681  << " Charge " << charge << " dE/dx " << dedx << " Birk Const " << rkb << ", " << c
682  << " Weight = " << weight << " dE " << aStep->GetTotalEnergyDeposit();
683 #endif
684  }
685  return weight;
686 }
Log< level::Info, true > LogVerbatim
Definition: weight.py:1
Abs< T >::type abs(const T &t)
Definition: Abs.h:22

◆ getDepth()

uint16_t CaloSD::getDepth ( const G4Step *  )
protectedvirtual

Reimplemented in ECalSD.

Definition at line 845 of file CaloSD.cc.

Referenced by ProcessHits().

845 { return 0; }

◆ getEnergyDeposit()

double CaloSD::getEnergyDeposit ( const G4Step *  step)
protectedvirtual

Reimplemented in HCalSD, ECalSD, HcalTB02SD, CastorSD, DreamSD, HGCSD, HFNoseSD, HGCalSD, EcalTBH4BeamSD, HGCScintSD, HcalTB06BeamSD, ZdcSD, HGCalTB16SD01, AHCalSD, and TotemT2ScintSD.

Definition at line 324 of file CaloSD.cc.

Referenced by ProcessHits().

324 { return aStep->GetTotalEnergyDeposit(); }

◆ getFromLibrary()

bool CaloSD::getFromLibrary ( const G4Step *  step)
protectedvirtual

Reimplemented in HCalSD, CastorSD, and ZdcSD.

Definition at line 328 of file CaloSD.cc.

Referenced by ProcessHits().

328 { return false; }

◆ getNumberOfHits()

int CaloSD::getNumberOfHits ( )
protected

Definition at line 461 of file CaloSD.cc.

References theHC.

Referenced by createNewHit(), and HCalSD::getFromLibrary().

461 { return theHC->entries(); }
CaloG4HitCollection * theHC
Definition: CaloSD.h:166

◆ getResponseWt()

double CaloSD::getResponseWt ( const G4Track *  aTrack)
protected

Definition at line 858 of file CaloSD.cc.

References SensitiveDetector::cmsTrackInformation(), TrackInformation::genParticleP(), TrackInformation::genParticlePID(), and meanResponse.

Referenced by ECalSD::EnergyCorrected(), HGCScintSD::getEnergyDeposit(), HFNoseSD::getEnergyDeposit(), HGCalSD::getEnergyDeposit(), HGCSD::getEnergyDeposit(), ECalSD::getEnergyDeposit(), and HCalSD::getEnergyDeposit().

858  {
859  double wt = 1.0;
860  if (meanResponse.get()) {
861  TrackInformation* trkInfo = cmsTrackInformation(aTrack);
862  wt = meanResponse.get()->getWeight(trkInfo->genParticlePID(), trkInfo->genParticleP());
863  }
864  return wt;
865 }
double genParticleP() const
TrackInformation * cmsTrackInformation(const G4Track *aTrack)
int genParticlePID() const
std::unique_ptr< CaloMeanResponse > meanResponse
Definition: CaloSD.h:164

◆ getTrackID()

int CaloSD::getTrackID ( const G4Track *  aTrack)
protectedvirtual

Reimplemented in ECalSD.

Definition at line 805 of file CaloSD.cc.

References SensitiveDetector::cmsTrackInformation(), and TrackInformation::getIDonCaloSurface().

Referenced by ECalSD::getTrackID(), and ProcessHits().

805  {
806  int primaryID = 0;
807  TrackInformation* trkInfo = cmsTrackInformation(aTrack);
808  if (trkInfo) {
809  primaryID = trkInfo->getIDonCaloSurface();
810 #ifdef EDM_ML_DEBUG
811  edm::LogVerbatim("CaloSim") << "Track ID: " << trkInfo->getIDonCaloSurface() << ":" << aTrack->GetTrackID() << ":"
812  << primaryID;
813 #endif
814  } else {
815  primaryID = aTrack->GetTrackID();
816 #ifdef EDM_ML_DEBUG
817  edm::LogWarning("CaloSim") << "CaloSD: Problem with primaryID **** set by force to TkID **** " << primaryID;
818 #endif
819  }
820  return primaryID;
821 }
Log< level::Info, true > LogVerbatim
TrackInformation * cmsTrackInformation(const G4Track *aTrack)
int getIDonCaloSurface() const
Log< level::Warning, false > LogWarning

◆ hitExists()

bool CaloSD::hitExists ( const G4Step *  aStep)
protected

Definition at line 411 of file CaloSD.cc.

References checkHit(), currentHit, currentID, posGlobal, previousID, resetForNewPrimary(), CaloHitID::trackID(), and updateHit().

Referenced by ProcessHits().

411  {
412  // Update if in the same detector, time-slice and for same track
413  if (currentID == previousID) {
415  return true;
416  }
417 
418  // Note T. Klijnsma:
419  // This is a rather strange place to set these class variables.
420  // The code would be much more readable if all logic for determining
421  // whether to update a hit or create a new hit is done in one place,
422  // and only then perform the actual updating or creating of the hit.
423 
424  // Reset entry point for new primary
425  posGlobal = aStep->GetPreStepPoint()->GetPosition();
426  if (currentID.trackID() != previousID.trackID()) {
427  resetForNewPrimary(aStep);
428  }
429  return checkHit();
430 }
void updateHit(CaloG4Hit *)
Definition: CaloSD.cc:642
G4ThreeVector posGlobal
Definition: CaloSD.h:138
bool checkHit()
Definition: CaloSD.cc:432
void resetForNewPrimary(const G4Step *)
Definition: CaloSD.cc:653
CaloHitID previousID
Definition: CaloSD.h:142
CaloG4Hit * currentHit
Definition: CaloSD.h:146
CaloHitID currentID
Definition: CaloSD.h:142
int trackID() const
Definition: CaloHitID.h:23

◆ ignoreRejection()

void CaloSD::ignoreRejection ( )
inlineprotected

Definition at line 108 of file CaloSD.h.

References ignoreReject.

Referenced by HGCalSD::setDetUnitId().

108 { ignoreReject = true; }
bool ignoreReject
Definition: CaloSD.h:170

◆ initEvent()

void CaloSD::initEvent ( const BeginOfEvent )
protectedvirtual

Reimplemented in HCalSD, and HGCSD.

Definition at line 801 of file CaloSD.cc.

Referenced by update().

801 {}

◆ Initialize()

void CaloSD::Initialize ( G4HCofThisEvent *  HCE)
override

Definition at line 350 of file CaloSD.cc.

References bysipixelclustmulteventfilter_cfi::collectionName, hcID, theHC, and totalHits.

350  {
351  totalHits = 0;
352 
353 #ifdef EDM_ML_DEBUG
354  edm::LogVerbatim("CaloSim") << "CaloSD : Initialize called for " << GetName();
355 #endif
356 
357  //This initialization is performed at the beginning of an event
358  //------------------------------------------------------------
359  theHC = new CaloG4HitCollection(GetName(), collectionName[0]);
360 
361  if (hcID < 0) {
362  hcID = G4SDManager::GetSDMpointer()->GetCollectionID(collectionName[0]);
363  }
364  //theHC ownership is transfered here to HCE
365  HCE->AddHitsCollection(hcID, theHC);
366 }
Log< level::Info, true > LogVerbatim
int totalHits
Definition: CaloSD.h:177
int hcID
Definition: CaloSD.h:174
CaloG4HitCollection * theHC
Definition: CaloSD.h:166
G4THitsCollection< CaloG4Hit > CaloG4HitCollection

◆ initRun()

void CaloSD::initRun ( )
protectedvirtual

Reimplemented in HCalSD, HGCSD, DreamSD, HFNoseSD, HGCalSD, HGCScintSD, and ZdcSD.

Definition at line 799 of file CaloSD.cc.

Referenced by update().

799 {}

◆ isItFineCalo()

bool CaloSD::isItFineCalo ( const G4VTouchable *  touch)

Definition at line 330 of file CaloSD.cc.

References hgcalTestNeighbor_cfi::detector, fineDetectors_, cuy::ii, personalPlayback::level, convertSQLiteXML::ok, and AlCaHLTBitMon_QueryRunRegistry::string.

Referenced by createNewHit(), and ProcessHits().

330  {
331  bool ok(false);
332  int level = ((touch->GetHistoryDepth()) + 1);
333  for (const auto& detector : fineDetectors_) {
334  if (level > 0 && level >= detector.level) {
335  int ii = level - detector.level;
336  G4LogicalVolume* lv = touch->GetVolume(ii)->GetLogicalVolume();
337  ok = (lv == detector.lv);
338 #ifdef EDM_ML_DEBUG
339  std::string name1 = (lv == 0) ? "Unknown" : lv->GetName();
340  edm::LogVerbatim("CaloSim") << "CaloSD: volume " << name1 << ":" << detector.name << " at Level "
341  << detector.level << " Flag " << ok;
342 #endif
343  if (ok)
344  break;
345  }
346  }
347  return ok;
348 }
Log< level::Info, true > LogVerbatim
std::vector< Detector > fineDetectors_
Definition: CaloSD.h:191
ii
Definition: cuy.py:589

◆ printableDecayChain()

std::string CaloSD::printableDecayChain ( const std::vector< unsigned int > &  decayChain)
staticprotected

Definition at line 467 of file CaloSD.cc.

References mps_fire::i, and contentValuesCheck::ss.

Referenced by findBoundaryCrossingParent().

467  {
468  std::stringstream ss;
469  for (long unsigned int i = 0; i < decayChain.size(); i++) {
470  if (i > 0)
471  ss << " <- ";
472  ss << decayChain[i];
473  }
474  return ss.str();
475 }

◆ PrintAll()

void CaloSD::PrintAll ( )
override

Definition at line 385 of file CaloSD.cc.

References theHC.

385  {
386 #ifdef EDM_ML_DEBUG
387  edm::LogVerbatim("CaloSim") << "CaloSD: Collection " << theHC->GetName();
388 #endif
389  theHC->PrintAllHits();
390 }
Log< level::Info, true > LogVerbatim
CaloG4HitCollection * theHC
Definition: CaloSD.h:166

◆ printDetectorLevels()

void CaloSD::printDetectorLevels ( const G4VTouchable *  touch) const
protected

Definition at line 1081 of file CaloSD.cc.

References mps_fire::i, cuy::ii, personalPlayback::level, Skims_PA_cff::name, and AlCaHLTBitMon_QueryRunRegistry::string.

Referenced by HGCScintSD::setDetUnitId(), and HGCalSD::setDetUnitId().

1081  {
1082  //Print name and copy numbers
1083  int level = ((touch->GetHistoryDepth()) + 1);
1084  std::ostringstream st1;
1085  st1 << level << " Levels:";
1086  if (level > 0) {
1087  for (int ii = 0; ii < level; ii++) {
1088  int i = level - ii - 1;
1089  G4VPhysicalVolume* pv = touch->GetVolume(i);
1090  std::string name = (pv != nullptr) ? pv->GetName() : "Unknown";
1091  st1 << " " << name << ":" << touch->GetReplicaNumber(i);
1092  }
1093  }
1094  edm::LogVerbatim("CaloSim") << st1.str();
1095 }
Log< level::Info, true > LogVerbatim
ii
Definition: cuy.py:589

◆ processHit()

void CaloSD::processHit ( const G4Step *  step)
inlineprotected

Definition at line 113 of file CaloSD.h.

References checkHit(), createNewHit(), currentHit, currentID, previousID, and updateHit().

Referenced by HCalSD::getFromHFLibrary(), ZdcSD::getFromLibrary(), CastorSD::getFromLibrary(), HCalSD::getFromParam(), HCalSD::getHitFibreBundle(), HCalSD::getHitPMT(), and HCalSD::hitForFibre().

113  {
114  // check if it is in the same unit and timeslice as the previous one
115  if (currentID == previousID) {
117  } else if (!checkHit()) {
118  currentHit = createNewHit(step, step->GetTrack());
119  }
120  }
void updateHit(CaloG4Hit *)
Definition: CaloSD.cc:642
bool checkHit()
Definition: CaloSD.cc:432
CaloG4Hit * createNewHit(const G4Step *, const G4Track *)
Definition: CaloSD.cc:564
CaloHitID previousID
Definition: CaloSD.h:142
CaloG4Hit * currentHit
Definition: CaloSD.h:146
CaloHitID currentID
Definition: CaloSD.h:142
step
Definition: StallMonitor.cc:98

◆ ProcessHits() [1/2]

G4bool CaloSD::ProcessHits ( G4Step *  step,
G4TouchableHistory *   
)
overridevirtual

Implements SensitiveDetector.

Definition at line 160 of file CaloSD.cc.

References createNewHit(), currentHit, currentID, TauDecayModes::dec, LEDCalibrationChannels::depth, doFineCalo_, doFineCaloThisStep_, edepositEM, edepositHAD, HCALHighEnergyHPDFilter_cfi::energy, findBoundaryCrossingParent(), getDepth(), getEnergyDeposit(), getFromLibrary(), getTrackID(), hitExists(), ignoreReject, G4TrackToParticleID::isGammaElectronPositron(), isItFineCalo(), isParameterized, CaloHitID::markAsFinecaloTrackID(), SensitiveDetector::NaNTrap(), previousID, setDetUnitId(), CaloHitID::setID(), shortreprID(), protons_cff::time, and CaloHitID::unitID().

160  {
161  NaNTrap(aStep);
162  ignoreReject = false;
163 
164 #ifdef EDM_ML_DEBUG
165  edm::LogVerbatim("CaloSim") << "CaloSD::" << GetName() << " ID= " << aStep->GetTrack()->GetTrackID()
166  << " prID= " << aStep->GetTrack()->GetParentID()
167  << " Eprestep= " << aStep->GetPreStepPoint()->GetKineticEnergy()
168  << " step= " << aStep->GetStepLength() << " Edep= " << aStep->GetTotalEnergyDeposit();
169 #endif
170 
171  // Class variable to determine whether finecalo rules should apply for this step
172  doFineCaloThisStep_ = (doFineCalo_ && isItFineCalo(aStep->GetPreStepPoint()->GetTouchable()));
173 
174  // apply shower library or parameterisation
175  // independent on energy deposition at a step
176  if (isParameterized) {
177  if (getFromLibrary(aStep)) {
178  // for parameterized showers the primary track should be killed
179  // secondary tracks should be killed if they are in the same volume
180  (aStep->GetTrack())->SetTrackStatus(fStopAndKill);
181  if (0 < aStep->GetNumberOfSecondariesInCurrentStep()) {
182  auto tv = aStep->GetSecondaryInCurrentStep();
183  auto vol = aStep->GetPreStepPoint()->GetPhysicalVolume();
184  for (auto& tk : *tv) {
185  if (tk->GetVolume() == vol) {
186  const_cast<G4Track*>(tk)->SetTrackStatus(fStopAndKill);
187  }
188  }
189  }
190  return true;
191  }
192  }
193 
194  // ignore steps without energy deposit
195  edepositEM = edepositHAD = 0.f;
196  if (aStep->GetTotalEnergyDeposit() <= 0.0) {
197  return false;
198  }
199 
200  // check unitID
201  unsigned int unitID = setDetUnitId(aStep);
202  auto const theTrack = aStep->GetTrack();
203  uint16_t depth = getDepth(aStep);
204 
205  double time = theTrack->GetGlobalTime() / nanosecond;
206  int primaryID = getTrackID(theTrack);
207  if (unitID > 0) {
208  currentID.setID(unitID, time, primaryID, depth);
209  } else {
210  if (!ignoreReject) {
211  const G4TouchableHistory* touch = static_cast<const G4TouchableHistory*>(theTrack->GetTouchable());
212  edm::LogVerbatim("CaloSim") << "CaloSD::ProcessHits: unitID= " << unitID << " currUnit= " << currentID.unitID()
213  << " Detector: " << GetName() << " trackID= " << theTrack->GetTrackID() << " "
214  << theTrack->GetDefinition()->GetParticleName()
215  << "\n Edep= " << aStep->GetTotalEnergyDeposit()
216  << " PV: " << touch->GetVolume(0)->GetName()
217  << " PVid= " << touch->GetReplicaNumber(0) << " MVid= " << touch->GetReplicaNumber(1);
218  }
219  return false;
220  }
221  double energy = getEnergyDeposit(aStep);
222  if (energy <= 0.0) {
223  return false;
224  }
225 
226  if (doFineCaloThisStep_) {
227  currentID.setID(unitID, time, findBoundaryCrossingParent(theTrack), depth);
229  }
230 
232  edepositEM = energy;
233  } else {
235  }
236 #ifdef EDM_ML_DEBUG
237  const G4TouchableHistory* touch = static_cast<const G4TouchableHistory*>(theTrack->GetTouchable());
238  edm::LogVerbatim("CaloSim") << "CaloSD::" << GetName() << " PV:" << touch->GetVolume(0)->GetName()
239  << " PVid=" << touch->GetReplicaNumber(0) << " MVid=" << touch->GetReplicaNumber(1)
240  << " Unit:" << std::hex << unitID << std::dec << " Edep=" << edepositEM << " "
241  << edepositHAD << " ID=" << theTrack->GetTrackID() << " pID=" << theTrack->GetParentID()
242  << " E=" << theTrack->GetKineticEnergy() << " S=" << aStep->GetStepLength() << "\n "
243  << theTrack->GetDefinition()->GetParticleName() << " primaryID= " << primaryID
244  << " currentID= (" << currentID << ") previousID= (" << previousID << ")";
245 #endif
246  if (!hitExists(aStep)) {
247  currentHit = createNewHit(aStep, theTrack);
248  } else {
249 #ifdef EDM_ML_DEBUG
250  edm::LogVerbatim("DoFineCalo") << "Not creating new hit, only updating " << shortreprID(currentHit);
251 #endif
252  }
253  return true;
254 }
float edepositEM
Definition: CaloSD.h:140
Log< level::Info, true > LogVerbatim
bool ignoreReject
Definition: CaloSD.h:170
virtual bool getFromLibrary(const G4Step *step)
Definition: CaloSD.cc:328
bool doFineCaloThisStep_
Definition: CaloSD.h:192
virtual uint16_t getDepth(const G4Step *)
Definition: CaloSD.cc:845
virtual double getEnergyDeposit(const G4Step *step)
Definition: CaloSD.cc:324
unsigned int findBoundaryCrossingParent(const G4Track *track, bool markParentAsSaveable=true)
Definition: CaloSD.cc:492
uint32_t setDetUnitId(const G4Step *step) override=0
virtual int getTrackID(const G4Track *)
Definition: CaloSD.cc:805
bool isItFineCalo(const G4VTouchable *touch)
Definition: CaloSD.cc:330
float edepositHAD
Definition: CaloSD.h:140
bool doFineCalo_
Definition: CaloSD.h:184
CaloG4Hit * createNewHit(const G4Step *, const G4Track *)
Definition: CaloSD.cc:564
CaloHitID previousID
Definition: CaloSD.h:142
CaloG4Hit * currentHit
Definition: CaloSD.h:146
uint32_t unitID() const
Definition: CaloHitID.h:20
void setID(uint32_t unitID, double timeSlice, int trackID, uint16_t depth=0)
Definition: CaloHitID.cc:41
bool hitExists(const G4Step *)
Definition: CaloSD.cc:411
CaloHitID currentID
Definition: CaloSD.h:142
void markAsFinecaloTrackID(bool flag=true)
Definition: CaloHitID.h:29
static bool isGammaElectronPositron(int pdgCode)
bool isParameterized
Definition: CaloSD.h:169
std::string shortreprID(const CaloHitID &ID)
Definition: CaloSD.cc:478
void NaNTrap(const G4Step *step) const

◆ ProcessHits() [2/2]

bool CaloSD::ProcessHits ( G4GFlashSpot *  aSpot,
G4TouchableHistory *   
)
override

Definition at line 256 of file CaloSD.cc.

References checkHit(), createNewHit(), currentHit, currentID, TauDecayModes::dec, LEDCalibrationChannels::depth, edepositEM, edepositHAD, EnergyCorrected(), entranceLocal, entrancePoint, getDepth(), getTrackID(), incidentEnergy, G4TrackToParticleID::isGammaElectronPositron(), posGlobal, previousID, setDetUnitId(), CaloHitID::setID(), protons_cff::time, HLT_2022v15_cff::track, CaloHitID::trackID(), CaloHitID::unitID(), and updateHit().

256  {
257  edepositEM = edepositHAD = 0.f;
258  const G4Track* track = aSpot->GetOriginatorTrack()->GetPrimaryTrack();
259 
260  double edep = aSpot->GetEnergySpot()->GetEnergy();
261  if (edep <= 0.0) {
262  return false;
263  }
264 
265  G4Step fFakeStep;
266  G4StepPoint* fFakePreStepPoint = fFakeStep.GetPreStepPoint();
267  G4StepPoint* fFakePostStepPoint = fFakeStep.GetPostStepPoint();
268  fFakePreStepPoint->SetPosition(aSpot->GetPosition());
269  fFakePostStepPoint->SetPosition(aSpot->GetPosition());
270 
271  G4TouchableHandle fTouchableHandle = aSpot->GetTouchableHandle();
272  fFakePreStepPoint->SetTouchableHandle(fTouchableHandle);
273  fFakeStep.SetTotalEnergyDeposit(edep);
274  edep = EnergyCorrected(fFakeStep, track);
275 
276  // zero edep means hit outside the calorimeter
277  if (edep <= 0.0) {
278  return false;
279  }
280 
282  edepositEM = edep;
283  } else {
284  edepositHAD = edep;
285  }
286 
287  unsigned int unitID = setDetUnitId(&fFakeStep);
288 
289  if (unitID > 0) {
290  // time of initial track
291  double time = track->GetGlobalTime() / nanosecond;
292  int primaryID = getTrackID(track);
293  uint16_t depth = getDepth(&fFakeStep);
294  currentID.setID(unitID, time, primaryID, depth);
295 #ifdef EDM_ML_DEBUG
296  edm::LogVerbatim("CaloSim") << "CaloSD:: GetSpotInfo for Unit 0x" << std::hex << currentID.unitID() << std::dec
297  << " Edeposit = " << edepositEM << " " << edepositHAD;
298 #endif
299  // Update if in the same detector, time-slice and for same track
300  if (currentID == previousID) {
302  } else {
303  posGlobal = aSpot->GetEnergySpot()->GetPosition();
304  // Reset entry point for new primary
305  if (currentID.trackID() != previousID.trackID()) {
306  entrancePoint = aSpot->GetPosition();
307  entranceLocal = aSpot->GetTouchableHandle()->GetHistory()->GetTopTransform().TransformPoint(entrancePoint);
308  incidentEnergy = track->GetKineticEnergy();
309 #ifdef EDM_ML_DEBUG
310  edm::LogVerbatim("CaloSim") << "CaloSD: Incident energy " << incidentEnergy / CLHEP::GeV << " GeV and"
311  << " entrance point " << entrancePoint << " (Global) " << entranceLocal
312  << " (Local)";
313 #endif
314  }
315  if (!checkHit()) {
316  currentHit = createNewHit(&fFakeStep, track);
317  }
318  }
319  return true;
320  }
321  return false;
322 }
float edepositEM
Definition: CaloSD.h:140
Log< level::Info, true > LogVerbatim
void updateHit(CaloG4Hit *)
Definition: CaloSD.cc:642
virtual uint16_t getDepth(const G4Step *)
Definition: CaloSD.cc:845
virtual double EnergyCorrected(const G4Step &step, const G4Track *)
Definition: CaloSD.cc:326
uint32_t setDetUnitId(const G4Step *step) override=0
G4ThreeVector posGlobal
Definition: CaloSD.h:138
virtual int getTrackID(const G4Track *)
Definition: CaloSD.cc:805
bool checkHit()
Definition: CaloSD.cc:432
float edepositHAD
Definition: CaloSD.h:140
CaloG4Hit * createNewHit(const G4Step *, const G4Track *)
Definition: CaloSD.cc:564
CaloHitID previousID
Definition: CaloSD.h:142
CaloG4Hit * currentHit
Definition: CaloSD.h:146
uint32_t unitID() const
Definition: CaloHitID.h:20
void setID(uint32_t unitID, double timeSlice, int trackID, uint16_t depth=0)
Definition: CaloHitID.cc:41
CaloHitID currentID
Definition: CaloSD.h:142
float incidentEnergy
Definition: CaloSD.h:139
static bool isGammaElectronPositron(int pdgCode)
int trackID() const
Definition: CaloHitID.h:23
G4ThreeVector entrancePoint
Definition: CaloSD.h:136
G4ThreeVector entranceLocal
Definition: CaloSD.h:137

◆ reset()

void CaloSD::reset ( void  )
overridevirtual

Reimplemented from SensitiveCaloDetector.

Definition at line 793 of file CaloSD.cc.

References fpCaloG4HitAllocator.

793  {
794  if (fpCaloG4HitAllocator) {
795  fpCaloG4HitAllocator->ResetStorage();
796  }
797 }
G4ThreadLocal G4Allocator< CaloG4Hit > * fpCaloG4HitAllocator
Definition: CaloG4Hit.cc:11

◆ resetForNewPrimary()

void CaloSD::resetForNewPrimary ( const G4Step *  aStep)
protected

Definition at line 653 of file CaloSD.cc.

References entranceLocal, entrancePoint, incidentEnergy, and setToLocal().

Referenced by HCalSD::getFromHFLibrary(), ZdcSD::getFromLibrary(), CastorSD::getFromLibrary(), HCalSD::getHitFibreBundle(), HCalSD::getHitPMT(), hitExists(), and setTrackID().

653  {
654  auto const preStepPoint = aStep->GetPreStepPoint();
655  entrancePoint = preStepPoint->GetPosition();
656  entranceLocal = setToLocal(entrancePoint, preStepPoint->GetTouchable());
657  incidentEnergy = preStepPoint->GetKineticEnergy();
658 #ifdef EDM_ML_DEBUG
659  edm::LogVerbatim("CaloSim") << "CaloSD::resetForNewPrimary for " << GetName()
660  << " ID= " << aStep->GetTrack()->GetTrackID() << " Ein= " << incidentEnergy / CLHEP::GeV
661  << " GeV and"
662  << " entrance point global: " << entrancePoint << " local: " << entranceLocal;
663 #endif
664 }
Log< level::Info, true > LogVerbatim
G4ThreeVector setToLocal(const G4ThreeVector &, const G4VTouchable *) const
Definition: CaloSD.cc:403
float incidentEnergy
Definition: CaloSD.h:139
G4ThreeVector entrancePoint
Definition: CaloSD.h:136
G4ThreeVector entranceLocal
Definition: CaloSD.h:137

◆ saveHit()

bool CaloSD::saveHit ( CaloG4Hit aHit)
private

Definition at line 879 of file CaloSD.cc.

References correctT, corrTOFBeam, TauDecayModes::dec, doFineCalo_, Exception, CaloG4Hit::getDepth(), CaloG4Hit::getEM(), CaloG4Hit::getHadr(), CaloG4Hit::getTimeSlice(), CaloG4Hit::getTrackID(), CaloG4Hit::getUnitID(), SimTrackManager::giveMotherNeeded(), CaloG4Hit::isFinecaloTrackID(), m_trackManager, convertSQLiteXML::ok, shortreprID(), slave, protons_cff::time, and SimTrackManager::trackExists().

Referenced by update().

879  {
880  int tkID;
881  bool ok = true;
882 
883  double time = aHit->getTimeSlice();
884  if (corrTOFBeam)
885  time += correctT;
886 
887  // More strict bookkeeping for finecalo
888  if (doFineCalo_ && aHit->isFinecaloTrackID()) {
889 #ifdef EDM_ML_DEBUG
890  edm::LogVerbatim("DoFineCalo") << "Saving hit " << shortreprID(aHit);
891 #endif
892  if (!m_trackManager)
893  throw cms::Exception("Unknown", "CaloSD") << "m_trackManager not set, needed for finecalo!";
894  if (!m_trackManager->trackExists(aHit->getTrackID()))
895  throw cms::Exception("Unknown", "CaloSD")
896  << "Error on hit " << shortreprID(aHit) << ": Parent track not in track manager";
897  slave.get()->processHits(aHit->getUnitID(),
898  aHit->getEM() / CLHEP::GeV,
899  aHit->getHadr() / CLHEP::GeV,
900  time,
901  aHit->getTrackID(),
902  aHit->getDepth());
903  }
904  // Regular, not-fine way:
905  else {
906  if (m_trackManager) {
907  tkID = m_trackManager->giveMotherNeeded(aHit->getTrackID());
908  if (tkID == 0) {
909  if (m_trackManager->trackExists(aHit->getTrackID()))
910  tkID = (aHit->getTrackID());
911  else {
912  ok = false;
913  }
914  }
915  } else {
916  tkID = aHit->getTrackID();
917  ok = false;
918  }
919 #ifdef EDM_ML_DEBUG
920  edm::LogVerbatim("DoFineCalo") << "Saving hit " << shortreprID(aHit) << " with trackID=" << tkID;
921 #endif
922  slave.get()->processHits(
923  aHit->getUnitID(), aHit->getEM() / CLHEP::GeV, aHit->getHadr() / CLHEP::GeV, time, tkID, aHit->getDepth());
924  }
925 
926 #ifdef EDM_ML_DEBUG
927  if (!ok)
928  edm::LogWarning("CaloSim") << "CaloSD:Cannot find track ID for " << aHit->getTrackID();
929  edm::LogVerbatim("CaloSim") << "CalosD: Track ID " << aHit->getTrackID() << " changed to " << tkID
930  << " by SimTrackManager Status " << ok;
931 #endif
932 
933 #ifdef EDM_ML_DEBUG
934  edm::LogVerbatim("CaloSim") << "CaloSD: Store Hit at " << std::hex << aHit->getUnitID() << std::dec << " "
935  << aHit->getDepth() << " due to " << tkID << " in time " << time << " of energy "
936  << aHit->getEM() / CLHEP::GeV << " GeV (EM) and " << aHit->getHadr() / CLHEP::GeV
937  << " GeV (Hadr)";
938 #endif
939  return ok;
940 }
Log< level::Info, true > LogVerbatim
int getTrackID() const
Definition: CaloG4Hit.h:64
bool corrTOFBeam
Definition: CaloSD.h:172
double getEM() const
Definition: CaloG4Hit.h:55
uint16_t getDepth() const
Definition: CaloG4Hit.h:69
double getHadr() const
Definition: CaloG4Hit.h:58
bool trackExists(unsigned int i) const
bool isFinecaloTrackID() const
Definition: CaloG4Hit.h:70
std::unique_ptr< CaloSlaveSD > slave
Definition: CaloSD.h:163
bool doFineCalo_
Definition: CaloSD.h:184
double correctT
Definition: CaloSD.h:183
uint32_t getUnitID() const
Definition: CaloG4Hit.h:66
double getTimeSlice() const
Definition: CaloG4Hit.h:67
int giveMotherNeeded(int i) const
const SimTrackManager * m_trackManager
Definition: CaloSD.h:161
std::string shortreprID(const CaloHitID &ID)
Definition: CaloSD.cc:478
Log< level::Warning, false > LogWarning

◆ setDetUnitId()

uint32_t CaloSD::setDetUnitId ( const G4Step *  step)
overridepure virtual

◆ setNumberCheckedHits()

void CaloSD::setNumberCheckedHits ( int  val)
inlineprotected

Definition at line 122 of file CaloSD.h.

References nCheckedHits, and heppy_batch::val.

Referenced by HFNoseSD::HFNoseSD(), HGCalSD::HGCalSD(), HGCScintSD::HGCScintSD(), and HGCSD::HGCSD().

122 { nCheckedHits = val; }
int nCheckedHits
Definition: CaloSD.h:179

◆ setParameterized()

void CaloSD::setParameterized ( bool  val)
inlineprotected

Definition at line 110 of file CaloSD.h.

References isParameterized, and heppy_batch::val.

Referenced by CastorSD::CastorSD(), HCalSD::HCalSD(), and ZdcSD::ZdcSD().

110 { isParameterized = val; }
bool isParameterized
Definition: CaloSD.h:169

◆ setToGlobal()

G4ThreeVector CaloSD::setToGlobal ( const G4ThreeVector &  local,
const G4VTouchable *  touch 
) const
protected

Definition at line 407 of file CaloSD.cc.

References DTRecHitClients_cfi::local.

407  {
408  return touch->GetHistory()->GetTopTransform().Inverse().TransformPoint(local);
409 }

◆ setToLocal()

G4ThreeVector CaloSD::setToLocal ( const G4ThreeVector &  global,
const G4VTouchable *  touch 
) const
protected

Definition at line 403 of file CaloSD.cc.

Referenced by DreamSD::curve_LY(), HcalTB02SD::curve_LY(), ECalSD::EnergyCorrected(), ECalSD::getDepth(), ECalSD::getRadiationLength(), resetForNewPrimary(), and HcalTB06BeamSD::setDetUnitId().

403  {
404  return touch->GetHistory()->GetTopTransform().TransformPoint(global);
405 }

◆ setTrackID()

int CaloSD::setTrackID ( const G4Step *  aStep)
protectedvirtual

Definition at line 823 of file CaloSD.cc.

References SensitiveDetector::cmsTrackInformation(), TrackInformation::getIDonCaloSurface(), previousID, resetForNewPrimary(), and CaloHitID::trackID().

Referenced by HCalSD::getFromHFLibrary(), ZdcSD::getFromLibrary(), CastorSD::getFromLibrary(), HCalSD::getFromParam(), and HCalSD::hitForFibre().

823  {
824  auto const theTrack = aStep->GetTrack();
825  TrackInformation* trkInfo = cmsTrackInformation(theTrack);
826  int primaryID = trkInfo->getIDonCaloSurface();
827  if (primaryID <= 0) {
828  primaryID = theTrack->GetTrackID();
829  }
830 #ifdef EDM_ML_DEBUG
831  edm::LogVerbatim("CaloSim") << "Track ID: " << trkInfo->getIDonCaloSurface() << ":" << theTrack->GetTrackID() << ":"
832  << primaryID;
833 #endif
834 
835  if (primaryID != previousID.trackID()) {
836  resetForNewPrimary(aStep);
837  }
838 #ifdef EDM_ML_DEBUG
839  edm::LogVerbatim("CaloSim") << "CaloSD::setTrackID for " << GetName()
840  << " trackID= " << aStep->GetTrack()->GetTrackID() << " primaryID= " << primaryID;
841 #endif
842  return primaryID;
843 }
Log< level::Info, true > LogVerbatim
void resetForNewPrimary(const G4Step *)
Definition: CaloSD.cc:653
CaloHitID previousID
Definition: CaloSD.h:142
TrackInformation * cmsTrackInformation(const G4Track *aTrack)
int getIDonCaloSurface() const
int trackID() const
Definition: CaloHitID.h:23

◆ setUseMap()

void CaloSD::setUseMap ( bool  val)
inlineprotected

Definition at line 111 of file CaloSD.h.

References useMap, and heppy_batch::val.

Referenced by HFNoseSD::HFNoseSD(), HGCalSD::HGCalSD(), HGCScintSD::HGCScintSD(), and HGCSD::HGCSD().

111 { useMap = val; }
bool useMap
Definition: CaloSD.h:171

◆ shortreprID() [1/2]

std::string CaloSD::shortreprID ( const CaloHitID ID)
protected

Definition at line 478 of file CaloSD.cc.

References contentValuesCheck::ss.

Referenced by createNewHit(), ProcessHits(), saveHit(), and shortreprID().

478  {
479  std::stringstream ss;
480  ss << GetName() << "/" << ID.unitID() << "/trk" << ID.trackID() << "/d" << ID.depth() << "/time" << ID.timeSliceID();
481  if (ID.isFinecaloTrackID())
482  ss << "/FC";
483  return ss.str();
484 }
uint32_t ID
Definition: Definitions.h:24

◆ shortreprID() [2/2]

std::string CaloSD::shortreprID ( const CaloG4Hit hit)
protected

Definition at line 487 of file CaloSD.cc.

References shortreprID().

487 { return shortreprID(hit->getID()); }
std::string shortreprID(const CaloHitID &ID)
Definition: CaloSD.cc:478

◆ storeHit()

void CaloSD::storeHit ( CaloG4Hit hit)
private

Definition at line 867 of file CaloSD.cc.

References hitMap, previousID, theHC, CaloHitID::trackID(), and useMap.

Referenced by createNewHit().

867  {
868  if (hit == nullptr || previousID.trackID() < 0) {
869  edm::LogWarning("CaloSim") << "CaloSD: hit to be stored is nullptr !!"
870  << " previousID.trackID()= " << previousID.trackID();
871  return;
872  }
873 
874  theHC->insert(hit);
875  if (useMap)
876  hitMap.insert(std::pair<CaloHitID, CaloG4Hit*>(previousID, hit));
877 }
bool useMap
Definition: CaloSD.h:171
CaloHitID previousID
Definition: CaloSD.h:142
std::map< CaloHitID, CaloG4Hit * > hitMap
Definition: CaloSD.h:187
CaloG4HitCollection * theHC
Definition: CaloSD.h:166
Log< level::Warning, false > LogWarning
int trackID() const
Definition: CaloHitID.h:23

◆ update() [1/5]

void CaloSD::update ( const BeginOfRun )
overrideprotectedvirtual

This routine will be called when the appropriate signal arrives.

Implements Observer< const BeginOfRun *>.

Definition at line 688 of file CaloSD.cc.

References initRun().

Referenced by progressbar.ProgressBar::__next__(), MatrixUtil.Matrix::__setitem__(), MatrixUtil.Steps::__setitem__(), progressbar.ProgressBar::finish(), and MatrixUtil.Steps::overwrite().

688 { initRun(); }
virtual void initRun()
Definition: CaloSD.cc:799

◆ update() [2/5]

void CaloSD::update ( const BeginOfEvent )
overrideprotectedvirtual

This routine will be called when the appropriate signal arrives.

Implements Observer< const BeginOfEvent *>.

Definition at line 690 of file CaloSD.cc.

References clearHits(), and initEvent().

Referenced by progressbar.ProgressBar::__next__(), MatrixUtil.Matrix::__setitem__(), MatrixUtil.Steps::__setitem__(), progressbar.ProgressBar::finish(), and MatrixUtil.Steps::overwrite().

690  {
691 #ifdef EDM_ML_DEBUG
692  edm::LogVerbatim("CaloSim") << "CaloSD: Dispatched BeginOfEvent for " << GetName() << " !";
693 #endif
694  clearHits();
695  initEvent(g4Event);
696 }
Log< level::Info, true > LogVerbatim
virtual void initEvent(const BeginOfEvent *)
Definition: CaloSD.cc:801
void clearHits() override
Definition: CaloSD.cc:782

◆ update() [3/5]

void CaloSD::update ( const BeginOfTrack )
overrideprotectedvirtual

This routine will be called when the appropriate signal arrives.

Implements Observer< const BeginOfTrack *>.

Definition at line 942 of file CaloSD.cc.

References cleanHitCollection(), SensitiveDetector::cmsTrackInformation(), TrackInformation::isPrimary(), primAncestor, and theHC.

Referenced by progressbar.ProgressBar::__next__(), MatrixUtil.Matrix::__setitem__(), MatrixUtil.Steps::__setitem__(), progressbar.ProgressBar::finish(), and MatrixUtil.Steps::overwrite().

942  {
943  int primary = -1;
944  TrackInformation* trkInfo = cmsTrackInformation((*trk)());
945  if (trkInfo->isPrimary())
946  primary = (*trk)()->GetTrackID();
947 
948 #ifdef EDM_ML_DEBUG
949  edm::LogVerbatim("CaloSim") << "New track: isPrimary " << trkInfo->isPrimary() << " primary ID = " << primary
950  << " primary ancestor ID " << primAncestor;
951 #endif
952 
953  // update the information if a different primary track ID
954 
955  if (primary > 0 && primary != primAncestor) {
956  primAncestor = primary;
957 
958  // clean the hits information
959 
960  if (theHC->entries() > 0)
962  }
963 }
Log< level::Info, true > LogVerbatim
bool isPrimary() const
int primAncestor
Definition: CaloSD.h:175
void cleanHitCollection()
Definition: CaloSD.cc:965
TrackInformation * cmsTrackInformation(const G4Track *aTrack)
CaloG4HitCollection * theHC
Definition: CaloSD.h:166

◆ update() [4/5]

void CaloSD::update ( const EndOfTrack )
overrideprotectedvirtual

This routine will be called when the appropriate signal arrives.

Implements Observer< const EndOfTrack *>.

Definition at line 698 of file CaloSD.cc.

References SensitiveDetector::cmsTrackInformation(), TrackInformation::getIDonCaloSurface(), createfilelist::int, m_trackManager, tkMap, SimTrackManager::trackContainer(), and TrackWithHistory::trackID().

Referenced by progressbar.ProgressBar::__next__(), MatrixUtil.Matrix::__setitem__(), MatrixUtil.Steps::__setitem__(), progressbar.ProgressBar::finish(), and MatrixUtil.Steps::overwrite().

698  {
699  int id = (*trk)()->GetTrackID();
700  TrackInformation* trkI = cmsTrackInformation((*trk)());
701  int lastTrackID = -1;
702  if (trkI)
703  lastTrackID = trkI->getIDonCaloSurface();
704  if (id == lastTrackID) {
705  const TrackContainer* trksForThisEvent = m_trackManager->trackContainer();
706  if (trksForThisEvent != nullptr) {
707  int it = (int)(trksForThisEvent->size()) - 1;
708  if (it >= 0) {
709  TrackWithHistory* trkH = (*trksForThisEvent)[it];
710  if (trkH->trackID() == (unsigned int)(id))
711  tkMap[id] = trkH;
712 #ifdef EDM_ML_DEBUG
713  edm::LogVerbatim("CaloSim") << "CaloSD: get track " << it << " from Container of size "
714  << trksForThisEvent->size() << " with ID " << trkH->trackID();
715  } else {
716  edm::LogVerbatim("CaloSim") << "CaloSD: get track " << it << " from Container of size "
717  << trksForThisEvent->size() << " with no ID";
718 #endif
719  }
720  }
721  }
722 }
Log< level::Info, true > LogVerbatim
std::vector< TrackWithHistory * > TrackContainer
Definition: TrackContainer.h:8
TrackInformation * cmsTrackInformation(const G4Track *aTrack)
int getIDonCaloSurface() const
const TrackContainer * trackContainer() const
std::map< int, TrackWithHistory * > tkMap
Definition: CaloSD.h:188
const SimTrackManager * m_trackManager
Definition: CaloSD.h:161
unsigned int trackID() const

◆ update() [5/5]

void CaloSD::update ( const ::EndOfEvent )
overrideprotected

Definition at line 724 of file CaloSD.cc.

References funct::abs(), boundaryCrossingParentMap_, submitPVResolutionJobs::count, endEvent(), edm::roottree::getEntry(), hitMap, mps_fire::i, reusehit, saveHit(), slave, mathSSE::sqrt(), edm::swap(), theHC, tkMap, totalHits, groupFilesInBlocks::tt, useMap, x, and z.

Referenced by progressbar.ProgressBar::__next__(), MatrixUtil.Matrix::__setitem__(), MatrixUtil.Steps::__setitem__(), progressbar.ProgressBar::finish(), and MatrixUtil.Steps::overwrite().

724  {
725  endEvent();
726  slave.get()->ReserveMemory(theHC->entries());
727 
728  int count(0);
729  int wrong(0);
730  double eEM(0.0);
731  double eHAD(0.0);
732  double eEM2(0.0);
733  double eHAD2(0.0);
734  double tt(0.0);
735  double zloc(0.0);
736  double zglob(0.0);
737  double ee(0.0);
738  int hc_entries = theHC->entries();
739  for (int i = 0; i < hc_entries; ++i) {
740  if (!saveHit((*theHC)[i])) {
741  ++wrong;
742  }
743  ++count;
744  double x = (*theHC)[i]->getEM();
745  eEM += x;
746  eEM2 += x * x;
747  x = (*theHC)[i]->getHadr();
748  eHAD += x;
749  eHAD2 += x * x;
750  tt += (*theHC)[i]->getTimeSlice();
751  ee += (*theHC)[i]->getIncidentEnergy();
752  zglob += std::abs((*theHC)[i]->getEntry().z());
753  zloc += std::abs((*theHC)[i]->getEntryLocal().z());
754  }
755 
756  double norm = (count > 0) ? 1.0 / count : 0.0;
757  eEM *= norm;
758  eEM2 *= norm;
759  eHAD *= norm;
760  eHAD2 *= norm;
761  eEM2 = std::sqrt(eEM2 - eEM * eEM);
762  eHAD2 = std::sqrt(eHAD2 - eHAD * eHAD);
763  tt *= norm;
764  ee *= norm;
765  zglob *= norm;
766  zloc *= norm;
767 
768 #ifdef EDM_ML_DEBUG
769  edm::LogVerbatim("CaloSim") << "CaloSD: " << GetName() << " store " << count << " hits; " << wrong
770  << " track IDs not given properly and " << totalHits - count
771  << " hits not passing cuts\n EmeanEM= " << eEM << " ErmsEM= " << eEM2
772  << "\n EmeanHAD= " << eHAD << " ErmsHAD= " << eHAD2 << " TimeMean= " << tt
773  << " E0mean= " << ee << " Zglob= " << zglob << " Zloc= " << zloc << " ";
774 #endif
775  tkMap.erase(tkMap.begin(), tkMap.end());
776  std::vector<std::unique_ptr<CaloG4Hit>>().swap(reusehit);
777  if (useMap)
778  hitMap.erase(hitMap.begin(), hitMap.end());
780 }
Int_t getEntry(TBranch *branch, EntryNumber entryNumber)
Definition: RootTree.cc:527
Log< level::Info, true > LogVerbatim
int totalHits
Definition: CaloSD.h:177
bool useMap
Definition: CaloSD.h:171
void swap(Association< C > &lhs, Association< C > &rhs)
Definition: Association.h:117
std::unordered_map< unsigned int, unsigned int > boundaryCrossingParentMap_
Definition: CaloSD.h:189
Definition: TTTypes.h:54
std::unique_ptr< CaloSlaveSD > slave
Definition: CaloSD.h:163
T sqrt(T t)
Definition: SSEVec.h:19
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
std::map< CaloHitID, CaloG4Hit * > hitMap
Definition: CaloSD.h:187
virtual void endEvent()
Definition: CaloSD.cc:803
CaloG4HitCollection * theHC
Definition: CaloSD.h:166
std::map< int, TrackWithHistory * > tkMap
Definition: CaloSD.h:188
std::vector< std::unique_ptr< CaloG4Hit > > reusehit
Definition: CaloSD.h:190
bool saveHit(CaloG4Hit *)
Definition: CaloSD.cc:879

◆ updateHit()

void CaloSD::updateHit ( CaloG4Hit aHit)
protected

Definition at line 642 of file CaloSD.cc.

References CaloG4Hit::addEnergyDeposit(), currentID, edepositEM, edepositHAD, and previousID.

Referenced by checkHit(), createNewHit(), hitExists(), processHit(), and ProcessHits().

642  {
644 #ifdef EDM_ML_DEBUG
645  edm::LogVerbatim("CaloSim") << "CaloSD:" << GetName() << " Add energy deposit in " << currentID
646  << " Edep_em(MeV)= " << edepositEM << " Edep_had(MeV)= " << edepositHAD;
647 #endif
648 
649  // buffer for next steps:
651 }
float edepositEM
Definition: CaloSD.h:140
Log< level::Info, true > LogVerbatim
void addEnergyDeposit(double em, double hd)
Definition: CaloG4Hit.cc:45
float edepositHAD
Definition: CaloSD.h:140
CaloHitID previousID
Definition: CaloSD.h:142
CaloHitID currentID
Definition: CaloSD.h:142

Member Data Documentation

◆ boundaryCrossingParentMap_

std::unordered_map<unsigned int, unsigned int> CaloSD::boundaryCrossingParentMap_
private

Definition at line 189 of file CaloSD.h.

Referenced by findBoundaryCrossingParent(), and update().

◆ cleanIndex

int CaloSD::cleanIndex
private

Definition at line 176 of file CaloSD.h.

Referenced by CaloSD(), cleanHitCollection(), and clearHits().

◆ correctT

double CaloSD::correctT
private

Definition at line 183 of file CaloSD.h.

Referenced by CaloSD(), cleanHitCollection(), and saveHit().

◆ corrTOFBeam

bool CaloSD::corrTOFBeam
private

Definition at line 172 of file CaloSD.h.

Referenced by CaloSD(), cleanHitCollection(), and saveHit().

◆ currentHit

CaloG4Hit* CaloSD::currentHit
protected

Definition at line 146 of file CaloSD.h.

Referenced by checkHit(), ZdcSD::getFromLibrary(), hitExists(), processHit(), and ProcessHits().

◆ currentID

CaloHitID CaloSD::currentID
protected

◆ doFineCalo_

bool CaloSD::doFineCalo_
private

Definition at line 184 of file CaloSD.h.

Referenced by CaloSD(), ProcessHits(), and saveHit().

◆ doFineCaloThisStep_

bool CaloSD::doFineCaloThisStep_
private

Definition at line 192 of file CaloSD.h.

Referenced by createNewHit(), and ProcessHits().

◆ edepositEM

float CaloSD::edepositEM
protected

◆ edepositHAD

float CaloSD::edepositHAD
protected

◆ eMinFine_

double CaloSD::eMinFine_
private

Definition at line 185 of file CaloSD.h.

Referenced by CaloSD().

◆ eminHit

double CaloSD::eminHit
protected

Definition at line 144 of file CaloSD.h.

Referenced by CaloSD(), filterHit(), and HGCSD::HGCSD().

◆ eminHitD

double CaloSD::eminHitD
private

Definition at line 182 of file CaloSD.h.

Referenced by CaloSD(), and filterHit().

◆ energyCut

double CaloSD::energyCut
protected

Definition at line 144 of file CaloSD.h.

Referenced by CaloSD(), createNewHit(), HCalSD::getHitFibreBundle(), and HCalSD::getHitPMT().

◆ entranceLocal

G4ThreeVector CaloSD::entranceLocal
protected

◆ entrancePoint

G4ThreeVector CaloSD::entrancePoint
protected

◆ fineDetectors_

std::vector<Detector> CaloSD::fineDetectors_
private

Definition at line 191 of file CaloSD.h.

Referenced by CaloSD(), and isItFineCalo().

◆ forceSave

bool CaloSD::forceSave
protected

Definition at line 151 of file CaloSD.h.

Referenced by CaloSD(), createNewHit(), and ECalSD::getTrackID().

◆ hcID

int CaloSD::hcID
private

Definition at line 174 of file CaloSD.h.

Referenced by Initialize().

◆ hitMap

std::map<CaloHitID, CaloG4Hit*> CaloSD::hitMap
private

Definition at line 187 of file CaloSD.h.

Referenced by checkHit(), cleanHitCollection(), storeHit(), and update().

◆ ignoreReject

bool CaloSD::ignoreReject
private

Definition at line 170 of file CaloSD.h.

Referenced by ignoreRejection(), and ProcessHits().

◆ ignoreTrackID

bool CaloSD::ignoreTrackID
private

Definition at line 168 of file CaloSD.h.

Referenced by CaloSD().

◆ incidentEnergy

float CaloSD::incidentEnergy
protected

◆ isParameterized

bool CaloSD::isParameterized
private

Definition at line 169 of file CaloSD.h.

Referenced by CaloSD(), ProcessHits(), and setParameterized().

◆ kmaxIon

double CaloSD::kmaxIon
protected

◆ kmaxNeutron

double CaloSD::kmaxNeutron
protected

◆ kmaxProton

double CaloSD::kmaxProton
protected

◆ m_trackManager

const SimTrackManager* CaloSD::m_trackManager
private

Definition at line 161 of file CaloSD.h.

Referenced by findBoundaryCrossingParent(), saveHit(), and update().

◆ meanResponse

std::unique_ptr<CaloMeanResponse> CaloSD::meanResponse
private

Definition at line 164 of file CaloSD.h.

Referenced by CaloSD(), and getResponseWt().

◆ nCheckedHits

int CaloSD::nCheckedHits
private

Definition at line 179 of file CaloSD.h.

Referenced by CaloSD(), checkHit(), and setNumberCheckedHits().

◆ posGlobal

G4ThreeVector CaloSD::posGlobal
protected

Definition at line 138 of file CaloSD.h.

Referenced by CaloSD(), createNewHit(), ZdcSD::getFromLibrary(), hitExists(), and ProcessHits().

◆ previousID

CaloHitID CaloSD::previousID
protected

◆ primAncestor

int CaloSD::primAncestor
private

Definition at line 175 of file CaloSD.h.

Referenced by CaloSD(), and update().

◆ primIDSaved

int CaloSD::primIDSaved
private

Definition at line 178 of file CaloSD.h.

Referenced by CaloSD(), clearHits(), and createNewHit().

◆ reusehit

std::vector<std::unique_ptr<CaloG4Hit> > CaloSD::reusehit
private

Definition at line 190 of file CaloSD.h.

Referenced by cleanHitCollection(), createNewHit(), and update().

◆ slave

std::unique_ptr<CaloSlaveSD> CaloSD::slave
private

Definition at line 163 of file CaloSD.h.

Referenced by CaloSD(), clearHits(), fillHits(), saveHit(), and update().

◆ suppressHeavy

bool CaloSD::suppressHeavy
protected

◆ theHC

CaloG4HitCollection* CaloSD::theHC
private

◆ timeSlice

float CaloSD::timeSlice
private

Definition at line 181 of file CaloSD.h.

Referenced by CaloSD().

◆ tkMap

std::map<int, TrackWithHistory*> CaloSD::tkMap
private

Definition at line 188 of file CaloSD.h.

Referenced by createNewHit(), and update().

◆ tmaxHit

double CaloSD::tmaxHit
protected

◆ totalHits

int CaloSD::totalHits
private

Definition at line 177 of file CaloSD.h.

Referenced by CaloSD(), cleanHitCollection(), createNewHit(), Initialize(), and update().

◆ useMap

bool CaloSD::useMap
private

Definition at line 171 of file CaloSD.h.

Referenced by CaloSD(), checkHit(), cleanHitCollection(), createNewHit(), setUseMap(), storeHit(), and update().