LArSoft  v10_06_00
Liquid Argon Software toolkit - https://larsoft.org/
G4InfoReducer_module.cc
Go to the documentation of this file.
1 // Class: G4InfoReducer
3 // Plugin Type: producer (Unknown Unknown)
4 // File: G4InfoReducer_module.cc
5 //
6 // Generated at Thu Jul 14 11:04:27 2022 by Laura Domine using cetskelgen
7 // from version .
9 
17 #include "fhiclcpp/ParameterSet.h"
19 
20 #include "larcore/CoreUtils/ServiceUtil.h" // for lar::providerFrom
23 #include "lardata/DetectorInfoServices/DetectorPropertiesServiceStandard.h" // for DetectorClocksService
26 
27 #include <memory>
28 #include <set>
29 
30 class G4InfoReducer;
31 
33 public:
34  explicit G4InfoReducer(fhicl::ParameterSet const& p);
35  // The compiler-generated destructor is fine for non-base
36  // classes without bare pointers or other resource use.
37 
38  // Plugins should not be copied or assigned.
39  G4InfoReducer(G4InfoReducer const&) = delete;
40  G4InfoReducer(G4InfoReducer&&) = delete;
41  G4InfoReducer& operator=(G4InfoReducer const&) = delete;
43 
44  // Required functions.
45  void produce(art::Event& e) override;
46 
47 private:
48  // Declare member data here.
50  double fMinX, fMinY, fMinZ;
53  bool fUseOrigTrackID; //Use orig track ID boolean
54  //services
56 };
57 
59  : EDProducer{p} // ,
60  , fGeometry(*lar::providerFrom<geo::Geometry>())
61 {
62  fSedLabel = p.get<art::InputTag>("SimEnergyDepositLabel", "largeant:TPCActive");
63 
64  // Prepare for voxelization
65  fVoxelSizeX = p.get<double>("VoxelSizeX", 0.3);
66  fVoxelSizeY = p.get<double>("VoxelSizeY", 0.3);
67  fVoxelSizeZ = p.get<double>("VoxelSizeZ", 0.3);
68 
69  //Ionization electrons travel at ~1.6mm/us at 500 V/cm electric field --> 1.6/10 cm/us
70  fElectronDriftVel = p.get<double>("ElectronDriftVel", 0.16); //cm/us
71 
72  //Use orig track id
73  fUseOrigTrackID = p.get<bool>("useOrigTrackID", true);
74 
75  if (fVoxelSizeX <= 0. || fVoxelSizeY <= 0. || fVoxelSizeZ <= 0.) {
76  std::cerr << "Voxel size must be strictly greater than zero." << std::endl;
77  throw std::exception();
78  }
79 
80  double min_x = std::numeric_limits<double>::max();
81  double min_y = std::numeric_limits<double>::max();
82  double min_z = std::numeric_limits<double>::max();
83  for (geo::TPCGeo const& tpc : fGeometry.Iterate<geo::TPCGeo>()) {
84  auto const& tpcabox = tpc.ActiveBoundingBox();
85  min_x = std::min(min_x, tpcabox.MinX());
86  min_y = std::min(min_y, tpcabox.MinY());
87  min_z = std::min(min_z, tpcabox.MinZ());
88  }
89  auto const clockData = art::ServiceHandle<detinfo::DetectorClocksService const>()->DataForJob();
90  // Take into account TPC readout window size
91  fMinX = min_x + clockData.TriggerOffsetTPC() * fElectronDriftVel;
92  fMinY = min_y;
93  fMinZ = min_z;
94  //std::cout << "G4InfoReducer " << fMinX << " " << fMinY << " " << fMinZ << std::endl;
95  //std::cout << clockData.TriggerOffsetTPC() << std::endl;
96 
97  // Call appropriate produces<>() functions here.
98  produces<std::vector<sim::SimEnergyDepositLite>>();
99 
100  // Call appropriate consumes<>() for any products to be retrieved by this module.
101  consumes<std::vector<sim::SimEnergyDeposit>>(fSedLabel);
102 }
103 
105 {
106  // Implementation of required member function here.
107 
108  // Collect SimEnergyDeposit
109  auto handle = e.getValidHandle<std::vector<sim::SimEnergyDeposit>>(fSedLabel);
110  if (!handle.isValid()) {
111  // throw some error
112  std::cerr << "SimEnergyDeposit not found" << std::endl;
113  throw std::exception();
114  }
115 
116  struct comp {
117  bool operator()(sim::SimEnergyDepositLite lhs, sim::SimEnergyDepositLite rhs) const
118  {
119  if (lhs.X() < rhs.X()) return true;
120  if (lhs.X() > rhs.X()) return false;
121  if (lhs.Y() < rhs.Y()) return true;
122  if (lhs.Y() > rhs.Y()) return false;
123  if (lhs.Z() < rhs.Z()) return true;
124  if (lhs.Z() > rhs.Z()) return false;
125  return lhs.TrackID() < rhs.TrackID();
126  }
127  };
128  std::set<sim::SimEnergyDepositLite, comp> sedlite_v2;
129  sim::SimEnergyDepositLite sed_lite;
130  sim::SimEnergyDepositLite new_sed_lite;
131 
132  auto const& sed_v = *handle;
133 
134  /*double total_edep = 0.;
135  for (size_t idx = 0; idx < sed_v.size(); ++idx) {
136  total_edep += sed_v[idx].E();
137  }
138  std::cout << "total edep = " << total_edep << " count = " << sed_v.size() << std::endl;*/
139 
140  for (size_t idx = 0; idx < sed_v.size(); ++idx) {
141  auto const& sed = sed_v[idx];
142  // Voxelize coordinates to closest coordinate using fVoxelSize
143  double x = sed.X() - std::fmod(sed.X() - fMinX, fVoxelSizeX) + fVoxelSizeX / 2.;
144  double y = sed.Y() - std::fmod(sed.Y() - fMinY, fVoxelSizeY) + fVoxelSizeY / 2.;
145  double z = sed.Z() - std::fmod(sed.Z() - fMinZ, fVoxelSizeZ) + fVoxelSizeZ / 2.;
146 
147  // Copy info to SimEnergyDepositLite
148  if (fUseOrigTrackID) {
149  sed_lite =
150  sim::SimEnergyDepositLite(sed.E(), geo::Point_t(x, y, z), sed.T(), sed.OrigTrackID());
151  }
152  else {
153  sed_lite = sim::SimEnergyDepositLite(sed.E(), geo::Point_t(x, y, z), sed.T(), sed.TrackID());
154  }
155  auto it = sedlite_v2.find(sed_lite);
156  // Attempt to insert, if already exist we sum up energy deposit
157 
158  if (it != sedlite_v2.end()) {
159  double new_energy = sed_lite.E() + it->E();
160  double new_time = std::min(sed_lite.T(), it->T());
161  sedlite_v2.erase(it);
162  if (fUseOrigTrackID) {
163  new_sed_lite =
164  sim::SimEnergyDepositLite(new_energy, geo::Point_t(x, y, z), new_time, sed.OrigTrackID());
165  }
166  else {
167  new_sed_lite =
168  sim::SimEnergyDepositLite(new_energy, geo::Point_t(x, y, z), new_time, sed.TrackID());
169  }
170  sedlite_v2.insert(new_sed_lite);
171  }
172  else {
173  sedlite_v2.insert(std::move(sed_lite));
174  }
175  }
176 
177  /*double new_total_edep = 0.;
178  int counts = 0;
179 
180  for (auto it : sedlite_v2) {
181  new_total_edep += it.E();
182  counts += 1;
183  }
184  std::cout << "new total edep = " << new_total_edep << " with counts " << counts << " " << sedlite_v2.size() << std::endl;
185  */
186 
187  // Create vector for SEDLite
188  std::unique_ptr<std::vector<sim::SimEnergyDepositLite>> sedlite_v(
189  new std::vector<sim::SimEnergyDepositLite>(sedlite_v2.begin(), sedlite_v2.end()));
190 
191  // Store SEDLite in event
192  e.put(std::move(sedlite_v));
193 }
194 
Float_t x
Definition: compare.C:6
Utilities related to art service access.
art::InputTag fSedLabel
module making the SimEnergyDeposit
Float_t y
Definition: compare.C:6
geo::Length_t Y() const
EDProducer(fhicl::ParameterSet const &pset)
Definition: EDProducer.cc:6
void produce(art::Event &e) override
Double_t z
Definition: plot.C:276
Geometry information for a single TPC.
Definition: TPCGeo.h:33
geo::Length_t Z() const
const geo::GeometryCore & fGeometry
double fMinZ
bottom left coordinate of union of all TPC active volumes
G4InfoReducer & operator=(G4InfoReducer const &)=delete
geo::Length_t X() const
PutHandle< PROD > put(std::unique_ptr< PROD > &&edp, std::string const &instance={})
Definition: Event.h:77
Access the description of the physical detector geometry.
double fElectronDriftVel
electron drift velocity (cm/us)
double fVoxelSizeZ
size of a voxel (cm)
#define DEFINE_ART_MODULE(klass)
Definition: ModuleMacros.h:65
contains information for a single step in the detector simulation (pared down in size to the essentia...
Description of the physical geometry of one entire detector.
Definition: GeometryCore.h:91
ROOT::Math::PositionVector3D< ROOT::Math::Cartesian3D< double >, ROOT::Math::GlobalCoordinateSystemTag > Point_t
Type for representation of position in physical 3D space.
Definition: geo_vectors.h:180
ValidHandle< PROD > getValidHandle(InputTag const &tag) const
Energy deposition in the active material (lite version).
contains information for a single step in the detector simulation
range_type< T > Iterate() const
Definition: Iterable.h:121
Float_t e
Definition: plot.C:35
art framework interface to geometry description
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
G4InfoReducer(fhicl::ParameterSet const &p)