LArG4Detector_service.cc
Go to the documentation of this file.
1 //=============================================================================
2 // LArG4Detector_service.hh:
3 // LArG4DetectorService is the service that constructs the Geant 4 Geometry
4 // as specified in a gdml file.
5 // To use this service, all you need to do is put it in the services section
6 // of the fcl configuration file, like this (Just change the name of the gdml file):
7 //
8 // <pre>
9 // services: {
10 // ...
11 // ...
12 // LArG4Detector :
13 // {
14 // category: "world"
15 // gdmlFileName_ : "ta_target.gdml"
16 // }
17 // }
18 // </pre>
19 // Author: Hans Wenzel (Fermilab)
20 // Modified: David Rivera
21 //=============================================================================
22 
23 // framework includes:
26 #include "cetlib/search_path.h"
27 
28 // larg4 includes:
30 
31 // artg4tk includes:
32 #include "artg4tk/pluginDetectors/gdml/ByParticle.hh"
33 #include "artg4tk/pluginDetectors/gdml/CalorimeterHit.hh"
34 #include "artg4tk/pluginDetectors/gdml/CalorimeterSD.hh"
35 #include "artg4tk/pluginDetectors/gdml/ColorReader.hh"
36 #include "artg4tk/pluginDetectors/gdml/DRCalorimeterHit.hh"
37 #include "artg4tk/pluginDetectors/gdml/DRCalorimeterSD.hh"
38 #include "artg4tk/pluginDetectors/gdml/HadIntAndEdepTrkSD.hh"
39 #include "artg4tk/pluginDetectors/gdml/HadInteractionSD.hh"
40 #include "artg4tk/pluginDetectors/gdml/PhotonHit.hh"
41 #include "artg4tk/pluginDetectors/gdml/PhotonSD.hh"
42 #include "artg4tk/pluginDetectors/gdml/TrackerHit.hh"
43 #include "artg4tk/pluginDetectors/gdml/TrackerSD.hh"
48 //
49 // Geant 4 includes:
50 #include "Geant4/G4AutoDelete.hh"
51 #include "Geant4/G4GDMLParser.hh"
52 #include "Geant4/G4LogicalVolume.hh"
53 #include "Geant4/G4LogicalVolumeStore.hh"
54 #include "Geant4/G4PhysicalVolumeStore.hh"
55 #include "Geant4/G4RegionStore.hh"
56 #include "Geant4/G4SDManager.hh"
57 #include "Geant4/G4StepLimiter.hh"
58 #include "Geant4/G4Types.hh"
59 #include "Geant4/G4UnitsTable.hh"
60 #include "Geant4/G4UserLimits.hh"
61 #include "Geant4/G4VPhysicalVolume.hh"
62 #include "Geant4/G4VUserDetectorConstruction.hh"
63 #include "Geant4/globals.hh"
64 
65 // C++ includes
66 #include <unordered_map>
67 
68 using std::string;
69 
70 namespace {
71  template <typename T>
72  auto
73  make_product(T t)
74  {
75  return std::make_unique<T>(std::move(t));
76  }
77 }
78 
80  : artg4tk::DetectorBase(p,
81  p.get<string>("name", "LArG4DetectorService"),
82  p.get<string>("category", "World"),
83  p.get<string>("mother_category", ""))
84  , gdmlFileName_{p.get<std::string>("gdmlFileName_", "")}
85  , checkOverlaps_{p.get<bool>("CheckOverlaps", false)}
86  , volumeNames_{p.get<std::vector<std::string>>("volumeNames", {})}
87  , stepLimits_{p.get<std::vector<float>>("stepLimits", {})}
89  , dumpMP_{p.get<bool>("DumpMaterialProperties", false)}
90 {
91  // Make sure units are defined.
92  G4UnitDefinition::GetUnitsTable();
93 
94  // -- D.R. : Check for valid volume, steplimit pairs
95  if (inputVolumes_ != size(stepLimits_)) {
96  throw cet::exception("LArG4DetectorService") << "Configuration error: volumeNames:[] and"
97  << " stepLimits:[] have different sizes!"
98  << "\n";
99  }
100 
101  //-- define commonly used units, that we might need
102  new G4UnitDefinition("volt/cm", "V/cm", "Electric field", CLHEP::volt / CLHEP::cm);
103 
104  if (inputVolumes_ > 0) {
105  mf::LogInfo("LArG4DetectorService::Ctr")
106  << "Reading stepLimit(s) from the configuration file, for volume(s):";
107  }
108  for (size_t i = 0; i < inputVolumes_; ++i) {
109  if (stepLimits_[i] < 0) {
110  throw cet::exception("LArG4DetectorService")
111  << "Invalid stepLimits found. Step limits must be"
112  << " positive! Bad value : stepLimits[" << i << "] = " << stepLimits_.at(i) << " [mm]\n";
113  }
114 
116  mf::LogInfo("LArG4DetectorService::Ctr")
117  << "Volume: " << volumeNames_[i] << ", stepLimit: " << stepLimits_[i];
118  } //--loop over inputVolumes
119 } //--Ctor
120 
121 // Destructor
122 
123 std::vector<G4LogicalVolume*>
125 {
126  ColorReader reader;
127  G4GDMLParser parser(&reader);
128  parser.SetOverlapCheck(checkOverlaps_);
129  cet::search_path sp{"FW_SEARCH_PATH"};
130  std::string fullGDMLFileName;
131  if (!sp.find_file(gdmlFileName_, fullGDMLFileName)) {
132  throw cet::exception("LArG4DetectorService") << "Cannot find file: " << gdmlFileName_;
133  }
134  parser.Read(fullGDMLFileName);
135  G4VPhysicalVolume* World = parser.GetWorldVolume();
136 
137  std::stringstream ss;
138  ss << World->GetTranslation() << "\n\n";
139  ss << "Found World: " << World->GetName() << "\n";
140  ss << "World LV: " << World->GetLogicalVolume()->GetName() << "\n";
141  G4LogicalVolumeStore* pLVStore = G4LogicalVolumeStore::GetInstance();
142  ss << "Found " << pLVStore->size() << " logical volumes."
143  << "\n\n";
144  G4PhysicalVolumeStore* pPVStore = G4PhysicalVolumeStore::GetInstance();
145  ss << "Found " << pPVStore->size() << " physical volumes."
146  << "\n\n";
147  G4SDManager* SDman = G4SDManager::GetSDMpointer();
148  const G4GDMLAuxMapType* auxmap = parser.GetAuxMap();
149  ss << "Found " << auxmap->size() << " volume(s) with auxiliary information."
150  << "\n\n";
151  ss << "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
152  mf::LogInfo("LArG4DetectorService::doBuildLVs") << ss.str();
153 
154  for (auto const& [volume, auxes] : *auxmap) {
155  G4cout << "Volume " << volume->GetName()
156  << " has the following list of auxiliary information: \n";
157  for (auto const& aux : auxes) {
158  G4cout << "--> Type: " << aux.type << " Value: " << aux.value << "\n";
159 
160  G4double value = atof(aux.value);
161  G4double val_unit = 1; //--no unit
162  G4String provided_category = "NONE";
163  if ((aux.unit) && (aux.unit != "")) { // -- if provided and non-NULL
164  val_unit = G4UnitDefinition::GetValueOf(aux.unit);
165  provided_category = G4UnitDefinition::GetCategory(aux.unit);
166  mf::LogInfo("AuxUnit") << " Unit parsed = " << aux.unit
167  << " from unit category: " << provided_category.c_str();
168  value *=
169  val_unit; //-- Now do something with the value, making sure that the unit is appropriate
170  }
171 
172  if (aux.type == "StepLimit") {
173  G4UserLimits* fStepLimit = new G4UserLimits();
174  G4AutoDelete::Register(fStepLimit);
175 
176  //-- check that steplimit has valid length unit category
177  G4String steplimit_category = "Length";
178  if (provided_category == steplimit_category) {
179  mf::LogInfo("AuxUnit") << "Valid StepLimit unit category obtained: "
180  << provided_category.c_str();
181  // -- convert length to mm
182  value = (value / CLHEP::mm) * CLHEP::mm;
183  fStepLimit->SetMaxAllowedStep(value);
184  mf::LogInfo("fStepLimit")
185  << "fStepLimit: " << value << " " << value / CLHEP::cm << " cm\n";
186  }
187  else if (provided_category ==
188  "NONE") { //--no unit category provided, use the default CLHEP::mm
189  MF_LOG_WARNING("StepLimitUnit") << "StepLimit in geometry file does not have a unit!"
190  << " Defaulting to mm...";
191  value *= CLHEP::mm;
192  fStepLimit->SetMaxAllowedStep(value);
193  mf::LogInfo("fStepLimit")
194  << "fStepLimit: " << value << " " << value / CLHEP::cm << " cm\n";
195  }
196  else { //--wrong unit category provided
197  throw cet::exception("StepLimitUnit")
198  << "StepLimit does not have a valid length unit!\n"
199  << " Category of unit provided = " << provided_category << ".\n";
200  }
201 
202  volume->SetUserLimits(fStepLimit);
203  // -- D.R. insert into map <volName,stepLimit> to cross-check later
204  MF_LOG_DEBUG("LArG4DetectorService::")
205  << "Set stepLimit for volume: " << volume->GetName() << " from the GDML file.";
206  setGDMLVolumes_.insert(std::make_pair(volume->GetName(), (float)(value / CLHEP::mm)));
207  }
208  if (aux.type == "SensDet") {
209  if (aux.value == "DRCalorimeter") {
210  G4String name = volume->GetName() + "_DRCalorimeter";
211  artg4tk::DRCalorimeterSD* aDRCalorimeterSD = new artg4tk::DRCalorimeterSD(name);
212  SDman->AddNewDetector(aDRCalorimeterSD);
213  volume->SetSensitiveDetector(aDRCalorimeterSD);
214  std::cout << "Attaching sensitive Detector: " << aux.value
215  << " to Volume: " << volume->GetName() << "\n";
216  detectors_.emplace_back(volume->GetName(), aux.value);
217  }
218  else if (aux.value == "Calorimeter") {
219  G4String name = volume->GetName() + "_Calorimeter";
220  artg4tk::CalorimeterSD* aCalorimeterSD = new artg4tk::CalorimeterSD(name);
221  SDman->AddNewDetector(aCalorimeterSD);
222  volume->SetSensitiveDetector(aCalorimeterSD);
223  std::cout << "Attaching sensitive Detector: " << aux.value
224  << " to Volume: " << volume->GetName() << "\n";
225  detectors_.emplace_back(volume->GetName(), aux.value);
226  }
227  else if (aux.value == "PhotonDetector") {
228  G4String name = volume->GetName() + "_PhotonDetector";
229  artg4tk::PhotonSD* aPhotonSD = new artg4tk::PhotonSD(name);
230  SDman->AddNewDetector(aPhotonSD);
231  volume->SetSensitiveDetector(aPhotonSD);
232  std::cout << "Attaching sensitive Detector: " << aux.value
233  << " to Volume: " << volume->GetName() << "\n";
234  detectors_.emplace_back(volume->GetName(), aux.value);
235  }
236  else if (aux.value == "Tracker") {
237  G4String name = volume->GetName() + "_Tracker";
238  artg4tk::TrackerSD* aTrackerSD = new artg4tk::TrackerSD(name);
239  SDman->AddNewDetector(aTrackerSD);
240  volume->SetSensitiveDetector(aTrackerSD);
241  std::cout << "Attaching sensitive Detector: " << aux.value
242  << " to Volume: " << volume->GetName() << "\n";
243  detectors_.push_back(std::make_pair(volume->GetName(), aux.value));
244  }
245  else if (aux.value == "SimEnergyDeposit") {
246  G4String name = volume->GetName() + "_SimEnergyDeposit";
247  SimEnergyDepositSD* aSimEnergyDepositSD = new SimEnergyDepositSD(name);
248  SDman->AddNewDetector(aSimEnergyDepositSD);
249  volume->SetSensitiveDetector(aSimEnergyDepositSD);
250  std::cout << "Attaching sensitive Detector: " << aux.value
251  << " to Volume: " << volume->GetName() << "\n";
252  detectors_.emplace_back(volume->GetName(), aux.value);
253  }
254  else if (aux.value == "AuxDet") {
255  G4String name = volume->GetName() + "_AuxDet";
256  AuxDetSD* aAuxDetSD = new AuxDetSD(name);
257  SDman->AddNewDetector(aAuxDetSD);
258  volume->SetSensitiveDetector(aAuxDetSD);
259  std::cout << "Attaching sensitive Detector: " << aux.value
260  << " to Volume: " << volume->GetName() << "\n";
261  detectors_.emplace_back(volume->GetName(), aux.value);
262  }
263  else if (aux.value == "HadInteraction") {
264  G4String name = volume->GetName() + "_HadInteraction";
265  artg4tk::HadInteractionSD* aHadInteractionSD = new artg4tk::HadInteractionSD(name);
266  // NOTE: This will be done in the HadInteractionSD ctor
267  // SDman->AddNewDetector(aHadInteractionSD);
268  volume->SetSensitiveDetector(aHadInteractionSD);
269  std::cout << "Attaching sensitive Detector: " << aux.value
270  << " to Volume: " << volume->GetName() << "\n";
271  detectors_.emplace_back(volume->GetName(), aux.value);
272  }
273  else if (aux.value == "HadIntAndEdepTrk") {
274  G4String name = volume->GetName() + "_HadIntAndEdepTrk";
275  artg4tk::HadIntAndEdepTrkSD* aHadIntAndEdepTrkSD = new artg4tk::HadIntAndEdepTrkSD(name);
276  // NOTE: This will be done in the HadIntAndEdepTrkSD ctor
277  // SDman->AddNewDetector(aHadIntAndEdepTrkSD);
278  volume->SetSensitiveDetector(aHadIntAndEdepTrkSD);
279  std::cout << "Attaching sensitive Detector: " << aux.value
280  << " to Volume: " << volume->GetName() << "\n";
281  detectors_.emplace_back(volume->GetName(), aux.value);
282  }
283  }
284  }
285  std::cout
286  << "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
287  }
288  if (dumpMP_) { G4cout << *(G4Material::GetMaterialTable()) << G4endl; }
289  if (inputVolumes_ > 0) { setStepLimits(); }
290  std::cout << "List SD Tree: \n";
291  SDman->ListTree();
292  std::cout << " Collection Capacity: " << SDman->GetCollectionCapacity() << "\n";
293  G4HCtable* hctable = SDman->GetHCtable();
294  for (G4int j = 0; j < SDman->GetCollectionCapacity(); ++j) {
295  std::cout << "HC Name: " << hctable->GetHCname(j) << " SD Name: " << hctable->GetSDname(j)
296  << "\n";
297  }
298  std::cout << "==================================================\n";
299  // Return our logical volumes.
300  std::vector<G4LogicalVolume*> myLVvec;
301  myLVvec.push_back(pLVStore->at(0)); // only need to return the LV of the world
302  std::cout << "nr of LV ======================: " << myLVvec.size() << "\n";
303 
304  return myLVvec;
305 }
306 
307 std::vector<G4VPhysicalVolume*>
308 larg4::LArG4DetectorService::doPlaceToPVs(std::vector<G4LogicalVolume*>)
309 {
310  // Note we don't use our input.
311  std::vector<G4VPhysicalVolume*> myPVvec;
312  G4PhysicalVolumeStore* pPVStore = G4PhysicalVolumeStore::GetInstance();
313  myPVvec.push_back(pPVStore->at(
314  pPVStore->size() - 1)); // only need to return the PV of the world (last entry in Volume Store)
315  return myPVvec;
316 }
317 
318 void
320 {
321  // -- D. Rivera : This function sets step limits for volumes provided in the configuration file
322  // and overrides the step limit (if any) set for the same volumes but from the GMDL
323  // geometry file. The GDML step limit (if provided in the gdml file) is set first
324  // and later overriden by this method if a valid volumeName,setStepLimit is provided.
325  MF_LOG_WARNING("LArG4DetectorService::setStepLimits")
326  << "Setting step limits from configuration"
327  << " file. This will OVERRIDE redundant stepLimit(s) set in the GDML file. Note"
328  << " that stepLimits are only active if enabled in the physicsListService via the"
329  << " appropriate parameter.";
330 
331  std::string volumeName = "";
332  G4LogicalVolume* setVol = nullptr;
333  for (auto const& [name, newStepLimit] : overrideGDMLStepLimit_Map) {
334  G4double previousStepLimit = 0.;
335 
336  // -- Check whether the volumeName provided corresponds to a valid volumeName in the geometry
337  if (setVol = G4LogicalVolumeStore::GetInstance()->GetVolume(name, false); !setVol) {
338  throw cet::exception("invalidInputVolumeName")
339  << "Provided volume name : " << name << " not found!\n";
340  }
341 
342  // -- get the G4LogicalVolume corresponding to the selectedVolume
343  volumeName = setVol->GetName();
344  MF_LOG_DEBUG("LArG4DetectorService::setStepLimits")
345  << "Got logical volume with name: " << volumeName;
346 
347  G4UserLimits* fStepLimitOverride = new G4UserLimits();
348  G4AutoDelete::Register(fStepLimitOverride);
349 
350  // -- check if a stepLimit for this volume has been set before:
351  auto search = setGDMLVolumes_.find(volumeName);
352  if (search != setGDMLVolumes_.end()) { // -- volume name found in override list
353  previousStepLimit = (G4double)(search->second);
354  if (newStepLimit != previousStepLimit) {
355  MF_LOG_WARNING("LArG4DetectorService::setStepLimits")
356  << "OVERRIDING PREVIOUSLY SET"
357  << " STEPLIMIT FOR VOLUME : " << volumeName << " FROM " << previousStepLimit << " mm TO "
358  << newStepLimit << " mm";
359  }
360  else {
361  MF_LOG_WARNING("LArG4DetectorService::setStepLimits")
362  << "New stepLimit matches previously"
363  << " set stepLimit from the GDML file for volume : " << volumeName
364  << " stepLimit : " << newStepLimit << " mm. Nothing will be changed.";
365  continue;
366  }
367  } //--check if new steplimit differs from a previously set value
368 
369  fStepLimitOverride->SetMaxAllowedStep(newStepLimit); // -- !
370  mf::LogInfo("LArG4DetectorService::setStepLimits")
371  << "fStepLimitOverride: " << newStepLimit / CLHEP::mm << " mm " << newStepLimit / CLHEP::cm
372  << " cm "
373  << "for volume: " << volumeName << "\n"
374  << "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n";
375  setVol->SetUserLimits(fStepLimitOverride);
376  } //--loop over input volumes
377 } //--end of setStepLimit()
378 
381 {
382  return myName() + volume_name;
383 }
384 
385 void
387 {
388  // Tell Art what we produce, and label the entries
389  for (auto const& [volume_name, sd_name] : detectors_) {
390  if (sd_name == "DRCalorimeter") {
391  auto const instance = instanceName(volume_name);
392  collector.produces<artg4tk::DRCalorimeterHitCollection>(instance);
393  collector.produces<artg4tk::ByParticle>(instance + "Edep");
394  collector.produces<artg4tk::ByParticle>(instance + "NCeren");
395  }
396  else if (sd_name == "Calorimeter") {
397  collector.produces<artg4tk::CalorimeterHitCollection>(instanceName(volume_name));
398  }
399  else if (sd_name == "PhotonDetector") {
400  collector.produces<artg4tk::PhotonHitCollection>(instanceName(volume_name));
401  }
402  else if (sd_name == "Tracker") {
403  collector.produces<artg4tk::TrackerHitCollection>(instanceName(volume_name));
404  }
405  else if (sd_name == "SimEnergyDeposit") {
407  }
408  else if (sd_name == "AuxDet") {
410  }
411  else if (sd_name == "HadInteraction") {
412  collector.produces<artg4tk::ArtG4tkVtx>(); // do NOT use product instance name (for now)
413  }
414  else if (sd_name == "HadIntAndEdepTrk") {
415  collector.produces<artg4tk::ArtG4tkVtx>();
416  collector.produces<artg4tk::TrackerHitCollection>();
417  }
418  }
419 }
420 
421 void
423 {
424  //
425  // NOTE(JVY): 1st hadronic interaction will be fetched as-is from HadInteractionSD
426  // a copy (via copy ctor) will be placed directly into art::Event
427  //
428  G4SDManager* sdman = G4SDManager::GetSDMpointer();
430  art::Event& e = detectorHolder->getCurrArtEvent();
431  for (auto const& [volume_name, sd_name] : detectors_) {
432  auto sd = sdman->FindSensitiveDetector(volume_name + "_" + sd_name);
433  if (sd_name == "HadInteraction") {
434  if (auto hisd = dynamic_cast<artg4tk::HadInteractionSD*>(sd)) {
435  if (auto const& inter = hisd->Get1stInteraction(); inter.GetNumOutcoming() > 0) {
436  e.put(make_product(inter));
437  }
438  hisd->clear();
439  }
440  }
441  else if (sd_name == "HadIntAndEdepTrk") {
442  if (auto trksd = dynamic_cast<artg4tk::HadIntAndEdepTrkSD*>(sd)) {
443  if (auto const& inter = trksd->Get1stInteraction(); inter.GetNumOutcoming() > 0) {
444  e.put(make_product(inter));
445  }
446  if (auto const& trkhits = trksd->GetEdepTrkHits(); !trkhits.empty()) {
447  e.put(make_product(trkhits));
448  }
449  trksd->clear();
450  }
451  }
452  else if (sd_name == "Tracker") {
453  auto trsd = dynamic_cast<artg4tk::TrackerSD*>(sd);
454  e.put(make_product(trsd->GetHits()), instanceName(volume_name));
455  }
456  else if (sd_name == "SimEnergyDeposit") {
457  auto sedsd = dynamic_cast<SimEnergyDepositSD*>(sd);
458  e.put(make_product(sedsd->GetHits()), instanceName(volume_name));
459  }
460  else if (sd_name == "AuxDet") {
461  auto auxsd = dynamic_cast<AuxDetSD*>(sd);
462  e.put(make_product(auxsd->GetHits()), instanceName(volume_name));
463  }
464  else if (sd_name == "Calorimeter") {
465  auto calsd = dynamic_cast<artg4tk::CalorimeterSD*>(sd);
466  e.put(make_product(calsd->GetHits()), instanceName(volume_name));
467  }
468  else if (sd_name == "DRCalorimeter") {
469  auto drcalsd = dynamic_cast<artg4tk::DRCalorimeterSD*>(sd);
470  auto const identifier = instanceName(volume_name);
471  e.put(make_product(drcalsd->GetHits()), identifier);
472  e.put(make_product(drcalsd->GetEbyParticle()), identifier + "Edep");
473  e.put(make_product(drcalsd->GetNCerenbyParticle()), identifier + "NCeren");
474  }
475  else if (sd_name == "PhotonDetector") {
476  auto phsd = dynamic_cast<artg4tk::PhotonSD*>(sd);
477  e.put(make_product(phsd->GetHits()), instanceName(volume_name));
478  }
479  }
480 }
481 
static constexpr double cm
Definition: Units.h:68
static QCString name
Definition: declinfo.cpp:673
std::string string
Definition: nybbler.cc:12
MaybeLogger_< ELseverityLevel::ELsev_info, false > LogInfo
std::vector< G4LogicalVolume * > doBuildLVs() override
void doCallArtProduces(art::ProducesCollector &collector) override
static const std::string volume[nvol]
const std::string instance
void doFillEventWithArtHits(G4HCofThisEvent *hc) override
LArG4DetectorService(fhicl::ParameterSet const &)
std::string instanceName(std::string const &) const
std::vector< std::pair< std::string, std::string > > detectors_
decltype(auto) constexpr size(T &&obj)
ADL-aware version of std::size.
Definition: StdUtils.h:92
void produces(std::string const &instanceName={}, Persistable const persistable=Persistable::Yes)
const double e
def move(depos, offset)
Definition: depos.py:107
T get(std::string const &key) const
Definition: ParameterSet.h:271
p
Definition: test.py:223
volt_as<> volt
Type of potential stored in volts, in double precision.
std::vector< std::string > volumeNames_
ProductID put(std::unique_ptr< PROD > &&edp, std::string const &instance={})
Definition: DataViewImpl.h:686
Definition: search.py:1
std::vector< G4VPhysicalVolume * > doPlaceToPVs(std::vector< G4LogicalVolume * >) override
std::vector< float > stepLimits_
std::vector< AuxDetHit > AuxDetHitCollection
Definition: AuxDetHit.h:183
#define DEFINE_ART_SERVICE(svc)
std::vector< SimEnergyDeposit > SimEnergyDepositCollection
contains information for a single step in the detector simulation
#define MF_LOG_DEBUG(id)
static constexpr double mm
Definition: Units.h:65
auto const & get(AssnsNode< L, R, D > const &r)
Definition: AssnsNode.h:115
#define MF_LOG_WARNING(category)
std::map< std::string, G4double > overrideGDMLStepLimit_Map
std::unordered_map< std::string, float > setGDMLVolumes_
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33