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:641
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 962 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, jetUpdater_cfi::sort, theHC, protons_cff::time, totalHits, and useMap.

Referenced by EndOfEvent(), and update().

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

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

Referenced by update().

779  {
780  cleanIndex = 0;
781  previousID.reset();
782  primIDSaved = -99;
783 #ifdef EDM_ML_DEBUG
784  edm::LogVerbatim("CaloSim") << "CaloSD: Clears hit vector for " << GetName()
785  << " and initialise slave: " << slave.get()->name();
786 #endif
787  slave.get()->Initialize();
788 }
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, reusehit, CaloG4Hit::setEM(), CaloG4Hit::setEntry(), CaloG4Hit::setEntryLocal(), CaloG4Hit::setHadr(), CaloG4Hit::setID(), CaloG4Hit::setIncidentEnergy(), CaloG4Hit::setPosition(), TrackInformation::setStoreTrack(), TrackWithHistory::setToBeSaved(), shortreprID(), mathSSE::sqrt(), storeHit(), 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->setStoreTrack();
617  }
618  } else {
620 #ifdef EDM_ML_DEBUG
621  edm::LogVerbatim("CaloSim") << "CaloSD : TrackWithHistory pointer for " << currentID.trackID() << " is " << trkh;
622 #endif
623  if (trkh != nullptr) {
624  etrack = sqrt(trkh->momentum().Mag2());
625  if (etrack >= energyCut) {
626  trkh->setToBeSaved();
627 #ifdef EDM_ML_DEBUG
628  edm::LogVerbatim("CaloSim") << "CaloSD: set save the track " << currentID.trackID() << " with Hit";
629 #endif
630  }
631  }
632  }
634  }
635 
636  if (useMap)
637  ++totalHits;
638  return aHit;
639 }
float edepositEM
Definition: CaloSD.h:140
double energyCut
Definition: CaloSD.h:144
Log< level::Info, true > LogVerbatim
void setStoreTrack()
can only be set to true, cannot be reset to false!
bool doFineCaloThisStep_
Definition: CaloSD.h:192
void updateHit(CaloG4Hit *)
Definition: CaloSD.cc:641
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:864
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 800 of file CaloSD.cc.

Referenced by update().

800 {}

◆ 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:962
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 gpuPixelDoublets::cc, and 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
uint32_t cc[maxCellsPerHit]
Definition: gpuFishbone.h:49
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 844 of file CaloSD.cc.

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

Referenced by cleanHitCollection().

844  {
845  double emin(eminHit);
846  if (hit->getDepth() > 0)
847  emin = eminHitD;
848 #ifdef EDM_ML_DEBUG
849  edm::LogVerbatim("CaloSim") << "CaloSD::filterHit(..) Depth " << hit->getDepth() << " Emin = " << emin << " ("
850  << eminHit << ", " << eminHitD << ")";
851 #endif
852  return ((time <= tmaxHit) && (hit->getEnergyDeposit() > emin));
853 }
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::setStoreTrack(), and HLT_2023v12_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->setStoreTrack();
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->setToBeSaved();
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 }
Log< level::Info, true > LogVerbatim
void setStoreTrack()
can only be set to true, cannot be reset to false!
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 665 of file CaloSD.cc.

References funct::abs(), HltBtagPostValidation_cff::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().

665  {
666  double weight = 1.;
667  double charge = aStep->GetPreStepPoint()->GetCharge();
668  double length = aStep->GetStepLength();
669 
670  if (charge != 0. && length > 0.) {
671  double density = aStep->GetPreStepPoint()->GetMaterial()->GetDensity();
672  double dedx = aStep->GetTotalEnergyDeposit() / length;
673  double rkb = birk1 / density;
674  double c = birk2 * rkb * rkb;
675  if (std::abs(charge) >= 2.)
676  rkb /= birk3; // based on alpha particle data
677  weight = 1. / (1. + rkb * dedx + c * dedx * dedx);
678 #ifdef EDM_ML_DEBUG
679  edm::LogVerbatim("CaloSim") << "CaloSD::getAttenuation in " << aStep->GetPreStepPoint()->GetMaterial()->GetName()
680  << " Charge " << charge << " dE/dx " << dedx << " Birk Const " << rkb << ", " << c
681  << " Weight = " << weight << " dE " << aStep->GetTotalEnergyDeposit();
682 #endif
683  }
684  return weight;
685 }
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 842 of file CaloSD.cc.

Referenced by ProcessHits().

842 { 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 855 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().

855  {
856  double wt = 1.0;
857  if (meanResponse.get()) {
858  TrackInformation* trkInfo = cmsTrackInformation(aTrack);
859  wt = meanResponse.get()->getWeight(trkInfo->genParticlePID(), trkInfo->genParticleP());
860  }
861  return wt;
862 }
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 802 of file CaloSD.cc.

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

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

802  {
803  int primaryID = 0;
804  TrackInformation* trkInfo = cmsTrackInformation(aTrack);
805  if (trkInfo) {
806  primaryID = trkInfo->getIDonCaloSurface();
807 #ifdef EDM_ML_DEBUG
808  edm::LogVerbatim("CaloSim") << "Track ID: " << trkInfo->getIDonCaloSurface() << ":" << aTrack->GetTrackID() << ":"
809  << primaryID;
810 #endif
811  } else {
812  primaryID = aTrack->GetTrackID();
813 #ifdef EDM_ML_DEBUG
814  edm::LogWarning("CaloSim") << "CaloSD: Problem with primaryID **** set by force to TkID **** " << primaryID;
815 #endif
816  }
817  return primaryID;
818 }
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:641
G4ThreeVector posGlobal
Definition: CaloSD.h:138
bool checkHit()
Definition: CaloSD.cc:432
void resetForNewPrimary(const G4Step *)
Definition: CaloSD.cc:652
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 798 of file CaloSD.cc.

Referenced by update().

798 {}

◆ 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, HFNoseSD, HGCalSD, DreamSD, HGCScintSD, and ZdcSD.

Definition at line 796 of file CaloSD.cc.

Referenced by update().

796 {}

◆ 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 1078 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().

1078  {
1079  //Print name and copy numbers
1080  int level = ((touch->GetHistoryDepth()) + 1);
1081  std::ostringstream st1;
1082  st1 << level << " Levels:";
1083  if (level > 0) {
1084  for (int ii = 0; ii < level; ii++) {
1085  int i = level - ii - 1;
1086  G4VPhysicalVolume* pv = touch->GetVolume(i);
1087  std::string name = (pv != nullptr) ? pv->GetName() : "Unknown";
1088  st1 << " " << name << ":" << touch->GetReplicaNumber(i);
1089  }
1090  }
1091  edm::LogVerbatim("CaloSim") << st1.str();
1092 }
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:641
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:842
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:802
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_2023v12_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:641
virtual uint16_t getDepth(const G4Step *)
Definition: CaloSD.cc:842
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:802
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 790 of file CaloSD.cc.

References fpCaloG4HitAllocator.

790  {
791  if (fpCaloG4HitAllocator) {
792  fpCaloG4HitAllocator->ResetStorage();
793  }
794 }
G4ThreadLocal G4Allocator< CaloG4Hit > * fpCaloG4HitAllocator
Definition: CaloG4Hit.cc:11

◆ resetForNewPrimary()

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

Definition at line 652 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().

652  {
653  auto const preStepPoint = aStep->GetPreStepPoint();
654  entrancePoint = preStepPoint->GetPosition();
655  entranceLocal = setToLocal(entrancePoint, preStepPoint->GetTouchable());
656  incidentEnergy = preStepPoint->GetKineticEnergy();
657 #ifdef EDM_ML_DEBUG
658  edm::LogVerbatim("CaloSim") << "CaloSD::resetForNewPrimary for " << GetName()
659  << " ID= " << aStep->GetTrack()->GetTrackID() << " Ein= " << incidentEnergy / CLHEP::GeV
660  << " GeV and"
661  << " entrance point global: " << entrancePoint << " local: " << entranceLocal;
662 #endif
663 }
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 876 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().

876  {
877  int tkID;
878  bool ok = true;
879 
880  double time = aHit->getTimeSlice();
881  if (corrTOFBeam)
882  time += correctT;
883 
884  // More strict bookkeeping for finecalo
885  if (doFineCalo_ && aHit->isFinecaloTrackID()) {
886 #ifdef EDM_ML_DEBUG
887  edm::LogVerbatim("DoFineCalo") << "Saving hit " << shortreprID(aHit);
888 #endif
889  if (!m_trackManager)
890  throw cms::Exception("Unknown", "CaloSD") << "m_trackManager not set, needed for finecalo!";
891  if (!m_trackManager->trackExists(aHit->getTrackID()))
892  throw cms::Exception("Unknown", "CaloSD")
893  << "Error on hit " << shortreprID(aHit) << ": Parent track not in track manager";
894  slave.get()->processHits(aHit->getUnitID(),
895  aHit->getEM() / CLHEP::GeV,
896  aHit->getHadr() / CLHEP::GeV,
897  time,
898  aHit->getTrackID(),
899  aHit->getDepth());
900  }
901  // Regular, not-fine way:
902  else {
903  if (m_trackManager) {
904  tkID = m_trackManager->giveMotherNeeded(aHit->getTrackID());
905  if (tkID == 0) {
906  if (m_trackManager->trackExists(aHit->getTrackID()))
907  tkID = (aHit->getTrackID());
908  else {
909  ok = false;
910  }
911  }
912  } else {
913  tkID = aHit->getTrackID();
914  ok = false;
915  }
916 #ifdef EDM_ML_DEBUG
917  edm::LogVerbatim("DoFineCalo") << "Saving hit " << shortreprID(aHit) << " with trackID=" << tkID;
918 #endif
919  slave.get()->processHits(
920  aHit->getUnitID(), aHit->getEM() / CLHEP::GeV, aHit->getHadr() / CLHEP::GeV, time, tkID, aHit->getDepth());
921  }
922 
923 #ifdef EDM_ML_DEBUG
924  if (!ok)
925  edm::LogWarning("CaloSim") << "CaloSD:Cannot find track ID for " << aHit->getTrackID();
926  edm::LogVerbatim("CaloSim") << "CalosD: Track ID " << aHit->getTrackID() << " changed to " << tkID
927  << " by SimTrackManager Status " << ok;
928 #endif
929 
930 #ifdef EDM_ML_DEBUG
931  edm::LogVerbatim("CaloSim") << "CaloSD: Store Hit at " << std::hex << aHit->getUnitID() << std::dec << " "
932  << aHit->getDepth() << " due to " << tkID << " in time " << time << " of energy "
933  << aHit->getEM() / CLHEP::GeV << " GeV (EM) and " << aHit->getHadr() / CLHEP::GeV
934  << " GeV (Hadr)";
935 #endif
936  return ok;
937 }
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 820 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().

820  {
821  auto const theTrack = aStep->GetTrack();
822  TrackInformation* trkInfo = cmsTrackInformation(theTrack);
823  int primaryID = trkInfo->getIDonCaloSurface();
824  if (primaryID <= 0) {
825  primaryID = theTrack->GetTrackID();
826  }
827 #ifdef EDM_ML_DEBUG
828  edm::LogVerbatim("CaloSim") << "Track ID: " << trkInfo->getIDonCaloSurface() << ":" << theTrack->GetTrackID() << ":"
829  << primaryID;
830 #endif
831 
832  if (primaryID != previousID.trackID()) {
833  resetForNewPrimary(aStep);
834  }
835 #ifdef EDM_ML_DEBUG
836  edm::LogVerbatim("CaloSim") << "CaloSD::setTrackID for " << GetName()
837  << " trackID= " << aStep->GetTrack()->GetTrackID() << " primaryID= " << primaryID;
838 #endif
839  return primaryID;
840 }
Log< level::Info, true > LogVerbatim
void resetForNewPrimary(const G4Step *)
Definition: CaloSD.cc:652
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 864 of file CaloSD.cc.

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

Referenced by createNewHit().

864  {
865  if (hit == nullptr || previousID.trackID() < 0) {
866  edm::LogWarning("CaloSim") << "CaloSD: hit to be stored is nullptr !!"
867  << " previousID.trackID()= " << previousID.trackID();
868  return;
869  }
870 
871  theHC->insert(hit);
872  if (useMap)
873  hitMap.insert(std::pair<CaloHitID, CaloG4Hit*>(previousID, hit));
874 }
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 687 of file CaloSD.cc.

References initRun().

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

687 { initRun(); }
virtual void initRun()
Definition: CaloSD.cc:796

◆ 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 689 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().

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

◆ 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 939 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().

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

References SensitiveDetector::cmsTrackInformation(), TrackInformation::getIDonCaloSurface(), l1ctLayer2EG_cff::id, 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().

697  {
698  int id = (*trk)()->GetTrackID();
699  TrackInformation* trkI = cmsTrackInformation((*trk)());
700  int lastTrackID = -1;
701  if (trkI)
702  lastTrackID = trkI->getIDonCaloSurface();
703  if (id == lastTrackID) {
704  auto trksForThisEvent = m_trackManager->trackContainer();
705  if (!trksForThisEvent->empty()) {
706  TrackWithHistory* trkH = trksForThisEvent->back();
707  if (trkH->trackID() == (unsigned int)(id)) {
708  tkMap[id] = trkH;
709 #ifdef EDM_ML_DEBUG
710  edm::LogVerbatim("CaloSim") << "CaloSD: get track " << id << " from Container of size "
711  << trksForThisEvent->size() << " with ID " << trkH->trackID();
712 #endif
713  }
714  }
715  }
716 }
Log< level::Info, true > LogVerbatim
TrackInformation * cmsTrackInformation(const G4Track *aTrack)
int getIDonCaloSurface() const
const std::vector< TrackWithHistory * > * 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 718 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().

718  {
719  endEvent();
720  slave.get()->ReserveMemory(theHC->entries());
721 
722  int count(0);
723  int wrong(0);
724  double eEM(0.0);
725  double eHAD(0.0);
726  double eEM2(0.0);
727  double eHAD2(0.0);
728 #ifdef EDM_ML_DEBUG
729  double tt(0.0);
730  double zloc(0.0);
731  double zglob(0.0);
732  double ee(0.0);
733 #endif
734  int hc_entries = theHC->entries();
735  for (int i = 0; i < hc_entries; ++i) {
736  if (!saveHit((*theHC)[i])) {
737  ++wrong;
738  }
739  ++count;
740  double x = (*theHC)[i]->getEM();
741  eEM += x;
742  eEM2 += x * x;
743  x = (*theHC)[i]->getHadr();
744  eHAD += x;
745  eHAD2 += x * x;
746 #ifdef EDM_ML_DEBUG
747  tt += (*theHC)[i]->getTimeSlice();
748  ee += (*theHC)[i]->getIncidentEnergy();
749  zglob += std::abs((*theHC)[i]->getEntry().z());
750  zloc += std::abs((*theHC)[i]->getEntryLocal().z());
751 #endif
752  }
753 
754  double norm = (count > 0) ? 1.0 / count : 0.0;
755  eEM *= norm;
756  eEM2 *= norm;
757  eHAD *= norm;
758  eHAD2 *= norm;
759  eEM2 = std::sqrt(eEM2 - eEM * eEM);
760  eHAD2 = std::sqrt(eHAD2 - eHAD * eHAD);
761 #ifdef EDM_ML_DEBUG
762  tt *= norm;
763  ee *= norm;
764  zglob *= norm;
765  zloc *= norm;
766  edm::LogVerbatim("CaloSim") << "CaloSD: " << GetName() << " store " << count << " hits; " << wrong
767  << " track IDs not given properly and " << totalHits - count
768  << " hits not passing cuts\n EmeanEM= " << eEM << " ErmsEM= " << eEM2
769  << "\n EmeanHAD= " << eHAD << " ErmsHAD= " << eHAD2 << " TimeMean= " << tt
770  << " E0mean= " << ee << " Zglob= " << zglob << " Zloc= " << zloc << " ";
771 #endif
772  tkMap.erase(tkMap.begin(), tkMap.end());
773  std::vector<std::unique_ptr<CaloG4Hit>>().swap(reusehit);
774  if (useMap)
775  hitMap.erase(hitMap.begin(), hitMap.end());
777 }
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:800
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:876

◆ updateHit()

void CaloSD::updateHit ( CaloG4Hit aHit)
protected

Definition at line 641 of file CaloSD.cc.

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

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

641  {
643 #ifdef EDM_ML_DEBUG
644  edm::LogVerbatim("CaloSim") << "CaloSD:" << GetName() << " Add energy deposit in " << currentID
645  << " Edep_em(MeV)= " << edepositEM << " Edep_had(MeV)= " << edepositHAD;
646 #endif
647 
648  // buffer for next steps:
650 }
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().