LArSoft  v10_06_00
Liquid Argon Software toolkit - https://larsoft.org/
sim::MergeSimSourcesUtility Class Reference

#include "MergeSimSources.h"

Public Member Functions

 MergeSimSourcesUtility (std::vector< int > const &)
 
void Reset ()
 
void MergeMCParticles (std::vector< simb::MCParticle > &, const std::vector< simb::MCParticle > &, size_t)
 
void MergeSimChannels (std::vector< sim::SimChannel > &, const std::vector< sim::SimChannel > &, size_t, bool)
 
void MergeAuxDetSimChannels (std::vector< sim::AuxDetSimChannel > &, const std::vector< sim::AuxDetSimChannel > &, size_t)
 
void MergeSimPhotons (std::vector< sim::SimPhotons > &, const std::vector< sim::SimPhotons > &)
 
void MergeSimPhotonsLite (std::vector< sim::SimPhotonsLite > &, const std::vector< sim::SimPhotonsLite > &)
 
void MergeSimEnergyDeposits (std::vector< sim::SimEnergyDeposit > &, const std::vector< sim::SimEnergyDeposit > &, size_t) const
 
void MergeAuxDetHits (std::vector< sim::AuxDetHit > &, const std::vector< sim::AuxDetHit > &, size_t) const
 
void MergeParticleAncestryMaps (std::vector< sim::ParticleAncestryMap > &, const sim::ParticleAncestryMap &, size_t) const
 
const std::vector< std::vector< size_t > > & GetMCParticleListMap ()
 

Private Member Functions

void UpdateG4TrackIDRange (std::pair< int, int >, size_t)
 

Static Private Member Functions

static sim::SimEnergyDeposit offsetSimEnergyDepositTrackID (sim::SimEnergyDeposit const &, int)
 
static sim::AuxDetHit offsetAuxDetHitTrackID (sim::AuxDetHit const &, int)
 
static sim::ParticleAncestryMap offsetParticleAncestryMapTrackID (sim::ParticleAncestryMap const &, int)
 

Private Attributes

std::vector< int > fG4TrackIDOffsets
 
std::vector< std::pair< int, int > > fG4TrackIDRanges
 
std::vector< std::vector< size_t > > fMCParticleListMap
 

Detailed Description

Definition at line 29 of file MergeSimSources.h.

Constructor & Destructor Documentation

sim::MergeSimSourcesUtility::MergeSimSourcesUtility ( std::vector< int > const &  )

Title: MergeSimSources Utility Class Author: Wes Ketchum (wketc.nosp@m.hum@.nosp@m.lanl..nosp@m.gov)

Description: Class that merges different simulation sources together to created a combined sim list. Typically just merges vectors/maps/etc together. But, if anything as a G4 trackID, applies a user-defined offset to those IDs.

Definition at line 18 of file MergeSimSources.cxx.

References Reset().

19  : fG4TrackIDOffsets(offsets)
20 {
21  Reset();
22 }
std::vector< int > fG4TrackIDOffsets

Member Function Documentation

const std::vector<std::vector<size_t> >& sim::MergeSimSourcesUtility::GetMCParticleListMap ( )
inline

Definition at line 66 of file MergeSimSources.h.

References fMCParticleListMap.

66 { return fMCParticleListMap; }
std::vector< std::vector< size_t > > fMCParticleListMap
void sim::MergeSimSourcesUtility::MergeAuxDetHits ( std::vector< sim::AuxDetHit > &  ,
const std::vector< sim::AuxDetHit > &  ,
size_t   
) const

Definition at line 191 of file MergeSimSources.cxx.

References util::begin(), util::end(), fG4TrackIDOffsets, and offsetAuxDetHitTrackID().

194 {
195 
196  int const offset = fG4TrackIDOffsets.at(source_index);
197  auto const offsetAuxDetHitID = [offset](sim::AuxDetHit const& adh) {
199  };
200 
201  dest.reserve(dest.size() + src.size());
202  std::transform(begin(src), end(src), back_inserter(dest), offsetAuxDetHitID);
203 }
decltype(auto) constexpr end(T &&obj)
ADL-aware version of std::end.
Definition: StdUtils.h:77
std::vector< int > fG4TrackIDOffsets
static sim::AuxDetHit offsetAuxDetHitTrackID(sim::AuxDetHit const &, int)
decltype(auto) constexpr begin(T &&obj)
ADL-aware version of std::begin.
Definition: StdUtils.h:69
void sim::MergeSimSourcesUtility::MergeAuxDetSimChannels ( std::vector< sim::AuxDetSimChannel > &  merged_vector,
const std::vector< sim::AuxDetSimChannel > &  input_vector,
size_t  source_index 
)

Definition at line 96 of file MergeSimSources.cxx.

References util::abs(), fG4TrackIDOffsets, and UpdateG4TrackIDRange().

100 {
101  if (source_index >= fG4TrackIDOffsets.size())
102  std::runtime_error("ERROR in MergeSimSourcesUtility: Source index out of range!");
103 
104  merged_vector.reserve(merged_vector.size() + input_vector.size());
105 
106  std::pair<int, int> range_trackID(std::numeric_limits<int>::max(),
107  std::numeric_limits<int>::min());
108 
109  for (auto const& simchannel : input_vector) {
111  std::find(merged_vector.begin(), merged_vector.end(), simchannel);
112 
113  if (it == merged_vector.end()) {
114  merged_vector.emplace_back(simchannel.AuxDetID(), simchannel.AuxDetSensitiveID());
115  it = merged_vector.end() - 1;
116  }
117 
118  // re-make the AuxDetSimChannel with both pairs of AuxDetIDEs
119  int offset = fG4TrackIDOffsets[source_index];
120  std::vector<sim::AuxDetIDE> all_ides = it->AuxDetIDEs();
121  for (const sim::AuxDetIDE& ide : simchannel.AuxDetIDEs()) {
122  all_ides.emplace_back(ide, offset);
123 
124  auto tid = std::abs(ide.trackID) + offset;
125 
126  if (tid < range_trackID.first) range_trackID.first = tid;
127  if (tid > range_trackID.second) range_trackID.second = tid;
128  }
129 
130  *it = sim::AuxDetSimChannel(
131  simchannel.AuxDetID(), std::move(all_ides), simchannel.AuxDetSensitiveID());
132  }
133 
134  UpdateG4TrackIDRange(range_trackID, source_index);
135 }
intermediate_table::iterator iterator
void UpdateG4TrackIDRange(std::pair< int, int >, size_t)
constexpr auto abs(T v)
Returns the absolute value of the argument.
Collection of particles crossing one auxiliary detector cell.
std::vector< int > fG4TrackIDOffsets
MC truth information to make RawDigits and do back tracking.
void sim::MergeSimSourcesUtility::MergeMCParticles ( std::vector< simb::MCParticle > &  merged_vector,
const std::vector< simb::MCParticle > &  input_vector,
size_t  source_index 
)

Definition at line 34 of file MergeSimSources.cxx.

References util::abs(), fG4TrackIDOffsets, fMCParticleListMap, and UpdateG4TrackIDRange().

38 {
39 
40  if (source_index >= fG4TrackIDOffsets.size())
41  std::runtime_error("ERROR in MergeSimSourcesUtility: Source index out of range!");
42 
43  fMCParticleListMap[source_index].resize(input_vector.size());
44  merged_vector.reserve(merged_vector.size() + input_vector.size());
45 
46  std::pair<int, int> range_trackID(std::numeric_limits<int>::max(),
47  std::numeric_limits<int>::min());
48 
49  for (size_t i_p = 0; i_p < input_vector.size(); i_p++) {
50  merged_vector.emplace_back(input_vector[i_p], fG4TrackIDOffsets[source_index]);
51 
52  fMCParticleListMap[source_index][i_p] = merged_vector.size() - 1;
53 
54  if (std::abs(merged_vector.back().TrackId()) < range_trackID.first)
55  range_trackID.first = std::abs(merged_vector.back().TrackId());
56  if (std::abs(merged_vector.back().TrackId()) > range_trackID.second)
57  range_trackID.second = std::abs(merged_vector.back().TrackId());
58  }
59 
60  UpdateG4TrackIDRange(range_trackID, source_index);
61 }
void UpdateG4TrackIDRange(std::pair< int, int >, size_t)
constexpr auto abs(T v)
Returns the absolute value of the argument.
std::vector< int > fG4TrackIDOffsets
std::vector< std::vector< size_t > > fMCParticleListMap
void sim::MergeSimSourcesUtility::MergeParticleAncestryMaps ( std::vector< sim::ParticleAncestryMap > &  ,
const sim::ParticleAncestryMap ,
size_t   
) const

Definition at line 205 of file MergeSimSources.cxx.

References fG4TrackIDOffsets, and offsetParticleAncestryMapTrackID().

209 {
210  const int offset = fG4TrackIDOffsets.at(source_index);
211 
212  dest.reserve(dest.size() + 1);
213  dest.push_back(offsetParticleAncestryMapTrackID(src, offset));
214 }
static sim::ParticleAncestryMap offsetParticleAncestryMapTrackID(sim::ParticleAncestryMap const &, int)
std::vector< int > fG4TrackIDOffsets
void sim::MergeSimSourcesUtility::MergeSimChannels ( std::vector< sim::SimChannel > &  merged_vector,
const std::vector< sim::SimChannel > &  input_vector,
size_t  source_index,
bool  skip_trackIDs 
)

Definition at line 63 of file MergeSimSources.cxx.

References util::abs(), fG4TrackIDOffsets, and UpdateG4TrackIDRange().

67 {
68  if (source_index >= fG4TrackIDOffsets.size())
69  std::runtime_error("ERROR in MergeSimSourcesUtility: Source index out of range!");
70 
71  merged_vector.reserve(merged_vector.size() + input_vector.size());
72 
73  std::pair<int, int> range_trackID(std::numeric_limits<int>::max(),
74  std::numeric_limits<int>::min());
75 
76  for (auto const& simchannel : input_vector) {
78  std::find(merged_vector.begin(), merged_vector.end(), simchannel);
79 
80  if (it == merged_vector.end()) {
81  merged_vector.emplace_back(simchannel.Channel());
82  it = merged_vector.end() - 1;
83  }
84 
85  std::pair<int, int> thisrange =
86  it->MergeSimChannel(simchannel, fG4TrackIDOffsets[source_index]);
87  if (std::abs(thisrange.first) < std::abs(range_trackID.first))
88  range_trackID.first = std::abs(thisrange.first);
89  if (std::abs(thisrange.second) > std::abs(range_trackID.second))
90  range_trackID.second = std::abs(thisrange.second);
91  }
92 
93  if (!skip_trackIDs) UpdateG4TrackIDRange(range_trackID, source_index);
94 }
intermediate_table::iterator iterator
void UpdateG4TrackIDRange(std::pair< int, int >, size_t)
constexpr auto abs(T v)
Returns the absolute value of the argument.
std::vector< int > fG4TrackIDOffsets
void sim::MergeSimSourcesUtility::MergeSimEnergyDeposits ( std::vector< sim::SimEnergyDeposit > &  ,
const std::vector< sim::SimEnergyDeposit > &  ,
size_t   
) const

Definition at line 176 of file MergeSimSources.cxx.

References util::begin(), edep, util::end(), fG4TrackIDOffsets, and offsetSimEnergyDepositTrackID().

180 {
181 
182  int const offset = fG4TrackIDOffsets.at(source_index);
183  auto const offsetEDepID = [offset](sim::SimEnergyDeposit const& edep) {
185  };
186 
187  dest.reserve(dest.size() + src.size());
188  std::transform(begin(src), end(src), back_inserter(dest), offsetEDepID);
189 }
static sim::SimEnergyDeposit offsetSimEnergyDepositTrackID(sim::SimEnergyDeposit const &, int)
decltype(auto) constexpr end(T &&obj)
ADL-aware version of std::end.
Definition: StdUtils.h:77
std::vector< int > fG4TrackIDOffsets
Double_t edep
Definition: macro.C:13
Energy deposition in the active material.
decltype(auto) constexpr begin(T &&obj)
ADL-aware version of std::begin.
Definition: StdUtils.h:69
void sim::MergeSimSourcesUtility::MergeSimPhotons ( std::vector< sim::SimPhotons > &  merged_vector,
const std::vector< sim::SimPhotons > &  input_vector 
)

Definition at line 137 of file MergeSimSources.cxx.

139 {
140 
141  merged_vector.reserve(merged_vector.size() + input_vector.size());
142 
143  for (auto const& simphotons : input_vector) {
145  std::find(merged_vector.begin(), merged_vector.end(), simphotons);
146 
147  if (it == merged_vector.end()) {
148  merged_vector.emplace_back(simphotons.OpChannel());
149  it = merged_vector.end() - 1;
150  }
151 
152  *it += simphotons;
153  }
154 }
intermediate_table::iterator iterator
void sim::MergeSimSourcesUtility::MergeSimPhotonsLite ( std::vector< sim::SimPhotonsLite > &  merged_vector,
const std::vector< sim::SimPhotonsLite > &  input_vector 
)

Definition at line 156 of file MergeSimSources.cxx.

159 {
160 
161  merged_vector.reserve(merged_vector.size() + input_vector.size());
162 
163  for (auto const& simphotons : input_vector) {
165  std::find(merged_vector.begin(), merged_vector.end(), simphotons);
166 
167  if (it == merged_vector.end()) {
168  merged_vector.emplace_back(simphotons.OpChannel);
169  it = merged_vector.end() - 1;
170  }
171 
172  *it += simphotons;
173  }
174 }
intermediate_table::iterator iterator
sim::AuxDetHit sim::MergeSimSourcesUtility::offsetAuxDetHitTrackID ( sim::AuxDetHit const &  adh,
int  offset 
)
staticprivate

Definition at line 272 of file MergeSimSources.cxx.

References sim::AuxDetHit::GetEnergyDeposited(), sim::AuxDetHit::GetEntryT(), sim::AuxDetHit::GetEntryX(), sim::AuxDetHit::GetEntryY(), sim::AuxDetHit::GetEntryZ(), sim::AuxDetHit::GetExitMomentumX(), sim::AuxDetHit::GetExitMomentumY(), sim::AuxDetHit::GetExitMomentumZ(), sim::AuxDetHit::GetExitT(), sim::AuxDetHit::GetExitX(), sim::AuxDetHit::GetExitY(), sim::AuxDetHit::GetExitZ(), sim::AuxDetHit::GetID(), and sim::AuxDetHit::GetTrackID().

Referenced by MergeAuxDetHits().

274 {
275 
276  auto tid = (adh.GetTrackID() >= 0) ? (adh.GetTrackID() + offset) : (adh.GetTrackID() - offset);
277 
278  return sim::AuxDetHit{
279  adh.GetID(), // copy number
280  tid, // g4 track id
281  adh.GetEnergyDeposited(),
282  adh.GetEntryX(),
283  adh.GetEntryY(),
284  adh.GetEntryZ(),
285  adh.GetEntryT(),
286  adh.GetExitX(),
287  adh.GetExitY(),
288  adh.GetExitZ(),
289  adh.GetExitT(),
290  adh.GetExitMomentumX(),
291  adh.GetExitMomentumY(),
292  adh.GetExitMomentumZ(),
293  };
294 } // sim::MergeSimSourcesUtility::offsetAuxDetHitTrackID()
unsigned int GetID() const
Definition: AuxDetHit.h:123
sim::ParticleAncestryMap sim::MergeSimSourcesUtility::offsetParticleAncestryMapTrackID ( sim::ParticleAncestryMap const &  pam,
int  offset 
)
staticprivate

Definition at line 296 of file MergeSimSources.cxx.

References sim::ParticleAncestryMap::GetMap().

Referenced by MergeParticleAncestryMaps().

299 {
300  std::map<int, std::set<int>> newMap;
301 
302  for (auto const& [ancestor, descendants] : pam.GetMap()) {
303  const int newAnc = (ancestor >= 0) ? ancestor + offset : ancestor - offset;
304 
305  for (auto const& descendant : descendants) {
306  const int newDesc = (descendant >= 0) ? descendant + offset : descendant - offset;
307  newMap[newAnc].insert(newDesc);
308  }
309  }
310 
311  return sim::ParticleAncestryMap(newMap);
312 }
sim::SimEnergyDeposit sim::MergeSimSourcesUtility::offsetSimEnergyDepositTrackID ( sim::SimEnergyDeposit const &  edep,
int  offset 
)
staticprivate

Definition at line 248 of file MergeSimSources.cxx.

References sim::SimEnergyDeposit::End(), sim::SimEnergyDeposit::Energy(), sim::SimEnergyDeposit::NumElectrons(), sim::SimEnergyDeposit::NumPhotons(), sim::SimEnergyDeposit::OrigTrackID(), sim::SimEnergyDeposit::PdgCode(), sim::SimEnergyDeposit::ScintYieldRatio(), sim::SimEnergyDeposit::Start(), sim::SimEnergyDeposit::T0(), sim::SimEnergyDeposit::T1(), and sim::SimEnergyDeposit::TrackID().

Referenced by MergeSimEnergyDeposits().

251 {
252 
253  auto tid = (edep.TrackID() >= 0) ? (edep.TrackID() + offset) : (edep.TrackID() - offset);
254  auto orig_tid =
255  (edep.OrigTrackID() >= 0) ? (edep.OrigTrackID() + offset) : (edep.OrigTrackID() - offset);
256 
257  return sim::SimEnergyDeposit{
258  edep.NumPhotons(), // np
259  edep.NumElectrons(), // ne
260  edep.ScintYieldRatio(), // sy
261  edep.Energy(), // e
262  edep.Start(), // start
263  edep.End(), // end
264  edep.T0(), // t0
265  edep.T1(), // t1
266  tid, // id
267  edep.PdgCode(), // pdg
268  orig_tid // orig id
269  };
270 } // sim::MergeSimSourcesUtility::offsetTrackID()
Double_t edep
Definition: macro.C:13
Energy deposition in the active material.
void sim::MergeSimSourcesUtility::Reset ( )

Definition at line 24 of file MergeSimSources.cxx.

References fG4TrackIDOffsets, fG4TrackIDRanges, and fMCParticleListMap.

Referenced by MergeSimSourcesUtility().

25 {
26  fG4TrackIDRanges.clear();
27  fG4TrackIDRanges.resize(
28  fG4TrackIDOffsets.size(),
29  std::make_pair(std::numeric_limits<int>::max(), std::numeric_limits<int>::min()));
30  fMCParticleListMap.clear();
31  fMCParticleListMap.resize(fG4TrackIDOffsets.size(), std::vector<size_t>());
32 }
std::vector< std::pair< int, int > > fG4TrackIDRanges
std::vector< int > fG4TrackIDOffsets
std::vector< std::vector< size_t > > fMCParticleListMap
void sim::MergeSimSourcesUtility::UpdateG4TrackIDRange ( std::pair< int, int >  newrange,
size_t  source_index 
)
private

Definition at line 216 of file MergeSimSources.cxx.

References fG4TrackIDOffsets, and fG4TrackIDRanges.

Referenced by MergeAuxDetSimChannels(), MergeMCParticles(), and MergeSimChannels().

218 {
219  if (source_index >= fG4TrackIDOffsets.size())
220  std::runtime_error("ERROR in MergeSimSourcesUtility: Source index out of range!");
221 
222  if (newrange.first >= fG4TrackIDRanges[source_index].first &&
223  newrange.second <= fG4TrackIDRanges[source_index].second)
224  return;
225 
226  for (size_t i = 0; i < fG4TrackIDRanges.size(); i++) {
227  if (i == source_index) continue;
228 
229  if ((newrange.first >= fG4TrackIDRanges[i].first &&
230  newrange.first <= fG4TrackIDRanges[i].second) ||
231  (newrange.second >= fG4TrackIDRanges[i].first &&
232  newrange.second <= fG4TrackIDRanges[i].second)) {
233  std::stringstream ss;
234  ss << "ERROR in MergeSimSourcesUtility: Source trackIDs overlap!"
235  << "\n\t" << i << "\t" << fG4TrackIDRanges[i].first << " " << fG4TrackIDRanges[i].second
236  << "\n\t"
237  << "n\t" << newrange.first << " " << newrange.second;
238  throw std::runtime_error(ss.str());
239  }
240  }
241 
242  if (newrange.first < fG4TrackIDRanges[source_index].first)
243  fG4TrackIDRanges[source_index].first = newrange.first;
244  if (newrange.second > fG4TrackIDRanges[source_index].second)
245  fG4TrackIDRanges[source_index].second = newrange.second;
246 }
std::vector< std::pair< int, int > > fG4TrackIDRanges
std::vector< int > fG4TrackIDOffsets

Member Data Documentation

std::vector<int> sim::MergeSimSourcesUtility::fG4TrackIDOffsets
private
std::vector<std::pair<int, int> > sim::MergeSimSourcesUtility::fG4TrackIDRanges
private

Definition at line 70 of file MergeSimSources.h.

Referenced by Reset(), and UpdateG4TrackIDRange().

std::vector<std::vector<size_t> > sim::MergeSimSourcesUtility::fMCParticleListMap
private

Definition at line 72 of file MergeSimSources.h.

Referenced by GetMCParticleListMap(), MergeMCParticles(), and Reset().


The documentation for this class was generated from the following files: