ATLAS Offline Software
Public Member Functions | Protected Member Functions | Protected Attributes | Private Member Functions | List of all members
FCS_StepInfoSD Class Reference

Common sensitive detector class for LAr systems. More...

#include <FCS_StepInfoSD.h>

Inheritance diagram for FCS_StepInfoSD:
Collaboration diagram for FCS_StepInfoSD:

Public Member Functions

 FCS_StepInfoSD (G4String a_name, const FCS_Param::Config &config)
 Constructor. More...
 
virtual G4bool ProcessHits (G4Step *a_step, G4TouchableHistory *) override
 Main processing method. More...
 
void EndOfAthenaEvent (ISF_FCS_Parametrization::FCS_StepInfoCollection *hitContnainer)
 End of athena event processing. More...
 
void setupHelpers (const LArEM_ID *EM, const LArFCAL_ID *FCAL, const LArHEC_ID *HEC, const TileID *tile)
 Sets the ID helper pointers. More...
 

Protected Member Functions

void getCaloDDManager ()
 Keep a map instead of trying to keep the full vector. More...
 
void update_map (const CLHEP::Hep3Vector &l_vec, const Identifier &l_identifier, double l_energy, double l_time, bool l_valid, int l_detector)
 

Protected Attributes

FCS_Param::Config m_config
 
const LArEM_IDm_larEmID {nullptr}
 Pointers to the identifier helpers. More...
 
const LArFCAL_IDm_larFcalID {nullptr}
 
const LArHEC_IDm_larHecID {nullptr}
 
const TileIDm_tileID {nullptr}
 
CxxUtils::CachedPointer< const CaloDetDescrManagerm_calo_dd_man
 
std::map< Identifier, std::vector< ISF_FCS_Parametrization::FCS_StepInfo * > * > m_hit_map
 

Private Member Functions

double getMaxTime (const CaloCell_ID::CaloSample &layer) const
 

Detailed Description

Common sensitive detector class for LAr systems.

This SD implementation saves the standard LArHits. See LArG4CalibSD for an SD that handles calibration hits.

Definition at line 71 of file FCS_StepInfoSD.h.

Constructor & Destructor Documentation

◆ FCS_StepInfoSD()

FCS_StepInfoSD::FCS_StepInfoSD ( G4String  a_name,
const FCS_Param::Config config 
)

Constructor.

Definition at line 21 of file FCS_StepInfoSD.cxx.

22  : G4VSensitiveDetector(std::move(a_name)),
24  m_calo_dd_man(nullptr) {}

Member Function Documentation

◆ EndOfAthenaEvent()

void FCS_StepInfoSD::EndOfAthenaEvent ( ISF_FCS_Parametrization::FCS_StepInfoCollection hitContnainer)

End of athena event processing.

Definition at line 146 of file FCS_StepInfoSD.cxx.

147  {
148  // Unpack map into vector
149  for (auto it : m_hit_map) {
150  for (auto* a_s : *it.second) {
151  // Giving away ownership of the objects!
152  hitContainer->push_back(a_s);
153  }
154  it.second->clear();
155  delete it.second;
156  } // Vector of IDs in the map
157  m_hit_map.clear();
158  if (m_config.verboseLevel > 4) {
159  G4cout << this->GetName()
160  << " DEBUG EndOfAthenaEvent: After initial cleanup, N="
161  << hitContainer->size() << G4endl;
162  }
163  return;
164 }

◆ getCaloDDManager()

void FCS_StepInfoSD::getCaloDDManager ( )
protected

Keep a map instead of trying to keep the full vector.

At the end of the event we'll push the map back into the FCS_StepInfoCollection in StoreGate.

Definition at line 49 of file FCS_StepInfoSD.cxx.

49  {
50  SG::ReadCondHandleKey<CaloDetDescrManager> caloMgrKey{"CaloDetDescrManager"};
51  if (caloMgrKey.initialize().isFailure()) {
52  G4ExceptionDescription description;
53  description << "Failed to get CaloDetDescrManager!";
54  G4Exception("FCS_StepInfoSD", "FCSBadCall", FatalException, description);
55  abort();
56  }
58  caloMgrKey, Gaudi::Hive::currentContext());
59  m_calo_dd_man.set(*caloMgr);
60 }

◆ getMaxTime()

double FCS_StepInfoSD::getMaxTime ( const CaloCell_ID::CaloSample layer) const
inlineprivate

NB The result of this function should actually be constant for each SD

Definition at line 34 of file FCS_StepInfoSD.cxx.

35  {
38  return m_config.m_maxTimeLAr;
39  }
41  return m_config.m_maxTimeHEC;
42  }
44  return m_config.m_maxTimeFCAL;
45  }
46  return m_config.m_maxTime;
47 }

◆ ProcessHits()

G4bool FCS_StepInfoSD::ProcessHits ( G4Step *  a_step,
G4TouchableHistory *   
)
overridevirtual

Main processing method.

Reimplemented in LArFCS_StepInfoSD, and TileFCS_StepInfoSD.

Definition at line 26 of file FCS_StepInfoSD.cxx.

26  {
27  G4ExceptionDescription description;
28  description << "ProcessHits: Base class method should not be called!!!";
29  G4Exception("FCS_StepInfoSD", "FCSBadCall", FatalException, description);
30  abort();
31  return false;
32 }

◆ setupHelpers()

void FCS_StepInfoSD::setupHelpers ( const LArEM_ID EM,
const LArFCAL_ID FCAL,
const LArHEC_ID HEC,
const TileID tile 
)
inline

Sets the ID helper pointers.

Definition at line 84 of file FCS_StepInfoSD.h.

85  {
86  m_larEmID = EM;
87  m_larFcalID = FCAL;
88  m_larHecID = HEC;
89  m_tileID = tile;
90  }

◆ update_map()

void FCS_StepInfoSD::update_map ( const CLHEP::Hep3Vector &  l_vec,
const Identifier l_identifier,
double  l_energy,
double  l_time,
bool  l_valid,
int  l_detector 
)
protected

Definition at line 62 of file FCS_StepInfoSD.cxx.

66 {
67  // NB l_identifier refers to:
68  // - the cell identifier for LAr
69  // - the PMT identifier for Tile
70 
71  // Drop any hits that don't have a good identifier attached
72  if (!m_calo_dd_man.get()->get_element(l_identifier)) {
73  if (m_config.verboseLevel > 4) {
74  G4cout << this->GetName() << " DEBUG update_map: bad identifier: "
75  << l_identifier.getString() << " skipping this hit." << G4endl;
76  }
77  return;
78  }
79 
80  auto map_item = m_hit_map.find(l_identifier);
81  if (map_item == m_hit_map.end()) {
82  m_hit_map[l_identifier] =
83  new std::vector<ISF_FCS_Parametrization::FCS_StepInfo*>;
84  m_hit_map[l_identifier]->reserve(200);
85  m_hit_map[l_identifier]->push_back(
86  new ISF_FCS_Parametrization::FCS_StepInfo(l_vec, l_identifier, l_energy,
87  l_time, l_valid, l_detector));
88  } else {
89 
90  // Get the appropriate merging limits
92  m_calo_dd_man.get()->get_element(l_identifier)->getSampling();
93 
94  double timeWindow = m_config.m_maxTime;
95  const double distWinLong = m_config.m_maxRadiusLongitudinal.at(layer);
96  const double distWinLat = m_config.m_maxRadiusLateral.at(layer);
97 
98  const double tsame(this->getMaxTime(layer));
99  bool match = false;
100  for (auto* map_it : *map_item->second) {
101  // Time check ... both a global flag and a check on the layer
102  const double delta_t = std::fabs(map_it->time() - l_time);
103  if (delta_t >= tsame) {
104  continue;
105  }
106  if (delta_t >= timeWindow) {
107  continue;
108  }
109 
110  // Distance check
111  const CLHEP::Hep3Vector& currentPosition = map_it->position();
112  const double currentPosition_mag = currentPosition.mag();
113  const double proj_longitudinal =
114  currentPosition.dot(l_vec) / currentPosition_mag;
115  const double delta_longitudinal = currentPosition_mag - proj_longitudinal;
116  if (std::fabs(delta_longitudinal) >= distWinLong) {
117  continue;
118  }
119 
120  // Lateral distance check
121  double delta_lateral_2 = l_vec.mag2() - proj_longitudinal * proj_longitudinal;
122  if (delta_lateral_2 < 0) {
123  delta_lateral_2 = 0; // Avoid negative square root
124  }
125  const double delta_lateral =
126  std::sqrt(delta_lateral_2);
127  if (delta_lateral >= distWinLat) {
128  continue;
129  }
130 
131  // Found a match. Make a temporary that will be deleted!
133  l_vec, l_identifier, l_energy, l_time, l_valid, l_detector);
134  *map_it += my_info;
135  match = true;
136  break;
137  } // End of search for match in time and space
138  if (!match) {
139  map_item->second->push_back(new ISF_FCS_Parametrization::FCS_StepInfo(
140  l_vec, l_identifier, l_energy, l_time, l_valid, l_detector));
141  } // Didn't match
142  } // ID already in the map
143  return;
144 } // That's it for updating the map!

Member Data Documentation

◆ m_calo_dd_man

CxxUtils::CachedPointer<const CaloDetDescrManager> FCS_StepInfoSD::m_calo_dd_man
protected

Definition at line 106 of file FCS_StepInfoSD.h.

◆ m_config

FCS_Param::Config FCS_StepInfoSD::m_config
protected

Definition at line 100 of file FCS_StepInfoSD.h.

◆ m_hit_map

std::map<Identifier, std::vector<ISF_FCS_Parametrization::FCS_StepInfo*>*> FCS_StepInfoSD::m_hit_map
protected

Definition at line 108 of file FCS_StepInfoSD.h.

◆ m_larEmID

const LArEM_ID* FCS_StepInfoSD::m_larEmID {nullptr}
protected

Pointers to the identifier helpers.

Definition at line 102 of file FCS_StepInfoSD.h.

◆ m_larFcalID

const LArFCAL_ID* FCS_StepInfoSD::m_larFcalID {nullptr}
protected

Definition at line 103 of file FCS_StepInfoSD.h.

◆ m_larHecID

const LArHEC_ID* FCS_StepInfoSD::m_larHecID {nullptr}
protected

Definition at line 104 of file FCS_StepInfoSD.h.

◆ m_tileID

const TileID* FCS_StepInfoSD::m_tileID {nullptr}
protected

Definition at line 105 of file FCS_StepInfoSD.h.


The documentation for this class was generated from the following files:
LArSamples::HEC
@ HEC
Definition: CaloId.h:26
SG::ReadCondHandle
Definition: ReadCondHandle.h:44
FCS_Param::Config::m_maxRadiusLateral
std::vector< double > m_maxRadiusLateral
property, see LArG4GenShowerLib::LArG4GenShowerLib
Definition: FCS_StepInfoSD.h:46
skel.it
it
Definition: skel.GENtoEVGEN.py:407
FCS_StepInfoSD::getMaxTime
double getMaxTime(const CaloCell_ID::CaloSample &layer) const
Definition: FCS_StepInfoSD.cxx:34
FCS_StepInfoSD::m_calo_dd_man
CxxUtils::CachedPointer< const CaloDetDescrManager > m_calo_dd_man
Definition: FCS_StepInfoSD.h:106
config
Definition: PhysicsAnalysis/AnalysisCommon/AssociationUtils/python/config.py:1
CxxUtils::CachedPointer::set
void set(pointer_t elt) const
Set the element, assuming it is currently null.
ReadCellNoiseFromCool.tile
tile
Definition: ReadCellNoiseFromCool.py:92
FCS_Param::Config::m_maxRadiusLongitudinal
std::vector< double > m_maxRadiusLongitudinal
property, see LArG4GenShowerLib::LArG4GenShowerLib
Definition: FCS_StepInfoSD.h:49
Ringer::EM
@ EM
Definition: CaloRingsDefs.h:19
CaloSampling::CaloSample
CaloSample
Definition: Calorimeter/CaloGeoHelpers/CaloGeoHelpers/CaloSampling.h:22
TRT::Hit::layer
@ layer
Definition: HitInfo.h:79
FCS_StepInfoSD::m_larHecID
const LArHEC_ID * m_larHecID
Definition: FCS_StepInfoSD.h:104
FCS_Param::Config::m_maxTime
double m_maxTime
Definition: FCS_StepInfoSD.h:53
FCS_StepInfoSD::m_tileID
const TileID * m_tileID
Definition: FCS_StepInfoSD.h:105
FCS_Param::Config::m_maxTimeFCAL
double m_maxTimeFCAL
Definition: FCS_StepInfoSD.h:56
FCS_StepInfoSD::m_larEmID
const LArEM_ID * m_larEmID
Pointers to the identifier helpers.
Definition: FCS_StepInfoSD.h:102
CaloCell_ID_FCS::EME3
@ EME3
Definition: FastCaloSim_CaloCell_ID.h:26
FCS_Param::Config::m_maxTimeHEC
double m_maxTimeHEC
Definition: FCS_StepInfoSD.h:55
ISF_FCS_Parametrization::FCS_StepInfo
Definition: FCS_StepInfo.h:45
CaloCell_ID_FCS::HEC0
@ HEC0
Definition: FastCaloSim_CaloCell_ID.h:27
SG::ReadCondHandleKey< CaloDetDescrManager >
LArSamples::FCAL
@ FCAL
Definition: CaloId.h:26
Identifier::getString
std::string getString() const
Provide a string form of the identifier - hexadecimal.
Definition: Identifier.cxx:25
FCS_Param::Config::m_maxTimeLAr
double m_maxTimeLAr
Definition: FCS_StepInfoSD.h:54
CaloCell_ID_FCS::PreSamplerB
@ PreSamplerB
Definition: FastCaloSim_CaloCell_ID.h:19
CxxUtils::CachedPointer::get
pointer_t get() const
Return the current value of the element.
CaloCell_ID_FCS::FCAL2
@ FCAL2
Definition: FastCaloSim_CaloCell_ID.h:42
FCS_StepInfoSD::m_config
FCS_Param::Config m_config
Definition: FCS_StepInfoSD.h:100
CaloCell_ID_FCS::HEC3
@ HEC3
Definition: FastCaloSim_CaloCell_ID.h:30
CaloCell_ID_FCS::FCAL0
@ FCAL0
Definition: FastCaloSim_CaloCell_ID.h:40
FCS_Param::Config::verboseLevel
int verboseLevel
Helper to keep the same verbosity everywhere.
Definition: FCS_StepInfoSD.h:39
match
bool match(std::string s1, std::string s2)
match the individual directories of two strings
Definition: hcg.cxx:356
FCS_StepInfoSD::m_hit_map
std::map< Identifier, std::vector< ISF_FCS_Parametrization::FCS_StepInfo * > * > m_hit_map
Definition: FCS_StepInfoSD.h:108
description
std::string description
glabal timer - how long have I taken so far?
Definition: hcg.cxx:88
FCS_StepInfoSD::m_larFcalID
const LArFCAL_ID * m_larFcalID
Definition: FCS_StepInfoSD.h:103