SupernovaMCClusters_module.cc
Go to the documentation of this file.
1 ////////////////////////////////////////////////////////////////////////
2 // \brief
3 // \author Justin Vasel <justin.vasel@gmail.com>
4 // \date April 2020
5 ////////////////////////////////////////////////////////////////////////
6 
7 // Framework includes
8 // #include "art/Framework/Core/EDAnalyzer.h"
15 #include "fhiclcpp/ParameterSet.h"
16 
17 // ROOT includes
18 #include "TFile.h"
19 #include "TTree.h"
20 
21 // NOvA includes
22 #include "MCCheater/BackTracker.h"
23 #include "RawData/RawTrigger.h"
24 #include "RecoBase/CellHit.h"
25 #include "Simulation/Particle.h"
26 
27 
28 namespace sn {
29  class SupernovaMCCluster;
30  enum ProcessID {
31  kNone=-1,
32  kUnknown=0,
37  };
38 }
39 
41 public:
42  explicit SupernovaMCCluster(fhicl::ParameterSet const & p);
43 
44  SupernovaMCCluster(SupernovaMCCluster const &) = delete;
48 
49  void GetDaughters(sim::ParticleNavigator pNav, const sim::Particle* p, std::vector<sim::Particle>& dVec);
52 
53  void produce(art::Event& e);
54  void beginJob() override;
55 
56 private:
57  std::string fRawDataLabel; ///< Module label for RawData products
58  std::string fCellHitLabel; ///< Module label for CellHit product
59  bool fVerbose; ///< Enable/disable verbose output
60 
61  unsigned int fEvt; ///< Event record number
62  float fTimeSinceFileStart; ///< Time since start of first event record in file, in ms
63 
64  int fInteractionId; ///< Unique ID for each interaction
65  int fInteractionSubId; ///< Unique ID for each sub-interaction
66  int fInteractionType; ///< 1=Iverse Beta Decay (IBD), 2=Elastic Scattering (ES)
67  float fInteractionEnergy; ///< Interaction incoming neutrino energy, in MeV
68 
69  std::map<int, std::pair<int, int>> mapTrackIDInteraction; ///< (Track ID, (Interaction ID, Sub-interaction ID))
70  std::map<int, std::pair<int, float>> mapInteractionIDInfo; ///< (Interaction ID, (Interaction type, Interaction energy in MeV))
71  std::map<std::pair<int, int>, std::vector<art::Ptr<rb::CellHit>>> mapInteractionToHits; ///< ((Interaction ID, Sub-interaction ID), Cell HIts)
72 
73  int fClusterNHits; ///< Number of hits in cluster
74  float fClusterMeanTFile; ///< Mean cluster time relative to start of file
75  float fClusterMeanTEvent; ///< Mean cluster time relative to start of event
76  float fClusterMeV; ///< Reconstructed cluster energy
77  int fClusterNViews; ///< Number of view in cluster (1 or 2)
78  float fClusterMeanX; ///< Mean cluster X
79  float fClusterMeanY; ///< Mean cluster Y
80  float fClusterMeanZ; ///< Mean cluster Z
81 
83 };
84 
85 
86 //...........................................................................
88  fRawDataLabel(p.get<std::string>("RawDataLabel")),
89  fCellHitLabel(p.get<std::string>("CellHitLabel")),
90  fVerbose(p.get<bool>("Verbose")),
92  fInteractionId(0),
96  fClusterNHits(0),
99  fClusterMeV(0),
100  fClusterNViews(0),
101  fClusterMeanX(0),
102  fClusterMeanY(0),
103  fClusterMeanZ(0)
104 {
106  produces<std::vector<rb::Cluster>>();
107 }
108 
109 
110 // ..........................................................................
111 void sn::SupernovaMCCluster::GetDaughters(sim::ParticleNavigator pNav, const sim::Particle* p, std::vector<sim::Particle>& dVec)
112 {
113  for (int dId=0; dId<p->NumberDaughters(); ++dId) {
115  if (dIter == pNav.end()) continue;
116 
117  const sim::Particle* d = dIter->second;
118  this->GetDaughters(pNav, d, dVec);
119  dVec.push_back(*d);
120  }
121 
122  return;
123 }
124 
125 
126 //...........................................................................
128 {
129  int nPrimaries = pNav.NumberOfPrimaries();
130  for (int idxPrimary=0; idxPrimary<nPrimaries; ++idxPrimary) {
131 
132  if (fVerbose)
133  std::cout << std::setw(6) << "[" << idxPrimary << "] " << std::setw(10) << pNav.Primary(idxPrimary+0)->PdgCode() << " " << std::setw(12) << pNav.Primary(idxPrimary+0)->E()*1e3 << " MeV";
134 
135  // Neutrinos have PID = [e=+-12, μ=+-14, τ=+-16]
136  bool kIsPrimaryNeutrino = std::abs(pNav.Primary(idxPrimary+0)->PdgCode()) == 12 ||
137  std::abs(pNav.Primary(idxPrimary+0)->PdgCode()) == 14 ||
138  std::abs(pNav.Primary(idxPrimary+0)->PdgCode()) == 16;
139 
140  // Continue the loop if no neutrino at this position
141  if (!kIsPrimaryNeutrino) {
142  if (fVerbose) std::cout << std::endl;
143  continue;
144  }
145 
146  // Basic bookkeeping for interactions
147  int OFFSET = 0;
148  ++fInteractionId;
149  int interactionSubId = 0;
150 
151 
152  // CHECK FOR THE IBD EVENT PATTERN:
153  // (1) -12 nuebar
154  // (2) 1221 proton
155  // (3) -11 positron
156  // (4) 2112 neutron
157  bool kIsInverseBetaDecay = pNav.Primary(idxPrimary+0)->PdgCode() == -12 &&
158  pNav.Primary(idxPrimary+1)->PdgCode() == 2212 &&
159  pNav.Primary(idxPrimary+2)->PdgCode() == -11 &&
160  pNav.Primary(idxPrimary+3)->PdgCode() == 2112;
161 
162  if (kIsInverseBetaDecay) {
163  OFFSET = 3;
164 
165  if (fVerbose) std::cout << " <----- Inverse Beta Decay BEGIN" << std::endl;
166 
167  // To store daughter particles
168  std::vector<sim::Particle> daughters_ebar;
169  std::vector<sim::Particle> daughters_n;
170 
171  // An IBD interaction will be composed of two sub-interactions related to:
172  // (1) positron and its daughters
173  // (2) neutron and its daughters
174 
175  // Get the positron & any daugthers: sub-interaction (1)
176  interactionSubId = 1;
177  const sim::Particle* positron = pNav.Primary(idxPrimary+2);
178  this->mapTrackIDInteraction[positron->TrackId()] = std::make_pair(fInteractionId, interactionSubId);
179  this->GetDaughters(pNav, positron, daughters_ebar);
180  for (const sim::Particle daughter : daughters_ebar ) {
181  this->mapTrackIDInteraction[daughter.TrackId()] = std::make_pair(fInteractionId, interactionSubId);
182  }
183 
184  // Get the neutron primary & any daugthers: sub-interaction (2)
185  interactionSubId = 2;
186  const sim::Particle* neutron = pNav.Primary(idxPrimary+3);
187  this->mapTrackIDInteraction[neutron->TrackId()] = std::make_pair(fInteractionId, interactionSubId);
188  this->GetDaughters(pNav, neutron, daughters_n);
189  for (const sim::Particle daughter : daughters_n ) {
190  this->mapTrackIDInteraction[daughter.TrackId()] = std::make_pair(fInteractionId, interactionSubId);
191  }
192 
193  // Get the incident neutrino and its energy (convert GeV->MeV)
194  const sim::Particle* neutrino = pNav.Primary(idxPrimary);
195  float neutrinoEnergy = neutrino->E() * 1e3;
196 
197  // Save info about this process type (IBD) and neutrino energy (process types: 1=IBD, 2=ES)
198  this->mapInteractionIDInfo[fInteractionId] = std::make_pair<int, float>(1, (float)neutrinoEnergy);
199 
200  // Print Interaction Details:
201  if (fVerbose) {
202  std::cout << std::setw(6) << "[" << idxPrimary+1 << "] " << std::setw(10) << pNav.Primary(idxPrimary+1)->PdgCode() << " " << std::setw(12) << pNav.Primary(idxPrimary+1)->E()*1e3 << " MeV" << std::endl;
203  std::cout << std::setw(6) << "[" << idxPrimary+2 << "] " << std::setw(10) << pNav.Primary(idxPrimary+2)->PdgCode() << " " << std::setw(12) << pNav.Primary(idxPrimary+2)->E()*1e3 << " MeV" << std::endl;
204  std::cout << std::setw(6) << "[" << idxPrimary+3 << "] " << std::setw(10) << pNav.Primary(idxPrimary+3)->PdgCode() << " " << std::setw(12) << pNav.Primary(idxPrimary+3)->E()*1e3 << " MeV" << " <----- Inverse Beta Decay END";
205  }
206  }
207 
208 
209  // CHECK FOR THE ATOMIC ES EVENT PATTERN:
210  // (1) xx neutrino (incoming)
211  // (2) 11 electron (incoming)
212  // (3) 11 electron (outgoing)
213  // (4) xx neutrino (outgoing)
214  // (5) yy nucleus (incoming)
215  // (6) yy nucleus (outgoing)
216  bool kIsElasticScatteringAtomic = kIsPrimaryNeutrino &&
217  pNav.Primary(idxPrimary+1)->PdgCode() == 11 &&
218  pNav.Primary(idxPrimary+2)->PdgCode() == 11 &&
219  pNav.Primary(idxPrimary+3)->PdgCode() == pNav.Primary(idxPrimary+0)->PdgCode() &&
220  pNav.Primary(idxPrimary+4)->PdgCode() > 1000 &&
221  pNav.Primary(idxPrimary+5)->PdgCode() > 1000;
222 
223  if (kIsElasticScatteringAtomic) {
224  OFFSET = 5;
225 
226  if (fVerbose) std::cout << " <----- Elastic Scattering Atom BEGIN" << std::endl;
227 
228  // To store daughter particles
229  std::vector<sim::Particle> daughters_e;
230 
231  // An ES interaction will be composed of one sub-interactions related to:
232  // (1) outgoing electron and its daughters
233 
234  // Get the electron & any daugthers: sub-interaction 1
235  interactionSubId = 1;
236  const sim::Particle* electron = pNav.Primary(idxPrimary+2);
237  this->mapTrackIDInteraction[electron->TrackId()] = std::make_pair(fInteractionId, interactionSubId);
238  this->GetDaughters(pNav, electron, daughters_e);
239  for (const sim::Particle daughter : daughters_e ) {
240  this->mapTrackIDInteraction[daughter.TrackId()] = std::make_pair(fInteractionId, interactionSubId);
241  }
242 
243  // Get the incident neutrino and its energy (convert GeV->MeV)
244  const sim::Particle* neutrino = pNav.Primary(idxPrimary);
245  float neutrinoEnergy = neutrino->E() * 1e3;
246 
247  // Save info about this process type (IBD) and neutrino energy (process types: 1=IBD, 2=ES)
248  this->mapInteractionIDInfo[fInteractionId] = std::make_pair<int, float>(2, (float)neutrinoEnergy);
249 
250  // Print Interaction Details:
251  if (fVerbose) {
252  std::cout << std::setw(6) << "[" << idxPrimary+1 << "] " << std::setw(10) << pNav.Primary(idxPrimary+1)->PdgCode() << " " << std::setw(12) << pNav.Primary(idxPrimary+1)->E()*1e3 << " MeV" << std::endl;
253  std::cout << std::setw(6) << "[" << idxPrimary+2 << "] " << std::setw(10) << pNav.Primary(idxPrimary+2)->PdgCode() << " " << std::setw(12) << pNav.Primary(idxPrimary+2)->E()*1e3 << " MeV" << std::endl;
254  std::cout << std::setw(6) << "[" << idxPrimary+3 << "] " << std::setw(10) << pNav.Primary(idxPrimary+3)->PdgCode() << " " << std::setw(12) << pNav.Primary(idxPrimary+3)->E()*1e3 << " MeV" << std::endl;
255  std::cout << std::setw(6) << "[" << idxPrimary+4 << "] " << std::setw(10) << pNav.Primary(idxPrimary+4)->PdgCode() << " " << std::setw(12) << pNav.Primary(idxPrimary+4)->E()*1e3 << " MeV" << std::endl;
256  std::cout << std::setw(6) << "[" << idxPrimary+5 << "] " << std::setw(10) << pNav.Primary(idxPrimary+5)->PdgCode() << " " << std::setw(12) << pNav.Primary(idxPrimary+5)->E()*1e3 << " MeV" << " <----- Elastic Scattering Atom END";
257  }
258  }
259 
260 
261  // CHECK FOR THE FREE ES EVENT PATTERN:
262  // (1) xx neutrino (incoming)
263  // (2) 11 electron (incoming)
264  // (3) xx neutrino (outgoing)
265  // (4) 11 electron (outgoing)
266  bool kIsElasticScatteringFree = kIsPrimaryNeutrino &&
267  pNav.Primary(idxPrimary+1)->PdgCode() == 11 &&
268  pNav.Primary(idxPrimary+2)->PdgCode() == pNav.Primary(idxPrimary+0)->PdgCode() &&
269  pNav.Primary(idxPrimary+3)->PdgCode() == 11;
270 
271  if (kIsElasticScatteringFree) {
272  OFFSET = 3;
273 
274  if (fVerbose) std::cout << " <----- Elastic Scattering Free BEGIN" << std::endl;
275 
276  // To store daughter particles
277  std::vector<sim::Particle> daughters_e;
278 
279  // An ES interaction will be composed of one sub-interactions related to:
280  // (1) outgoing electron and its daughters
281 
282  // Get the electron & any daugthers: sub-interaction 1
283  interactionSubId = 1;
284  const sim::Particle* electron = pNav.Primary(idxPrimary+3);
285  this->mapTrackIDInteraction[electron->TrackId()] = std::make_pair(fInteractionId, interactionSubId);
286  this->GetDaughters(pNav, electron, daughters_e);
287  for (const sim::Particle daughter : daughters_e ) {
288  this->mapTrackIDInteraction[daughter.TrackId()] = std::make_pair(fInteractionId, interactionSubId);
289  }
290 
291  // Get the incident neutrino and its energy (convert GeV->MeV)
292  const sim::Particle* neutrino = pNav.Primary(idxPrimary);
293  float neutrinoEnergy = neutrino->E() * 1e3;
294 
295  // Save info about this process type (IBD) and neutrino energy (process types: 1=IBD, 2=ES)
296  this->mapInteractionIDInfo[fInteractionId] = std::make_pair<int, float>(2, (float)neutrinoEnergy);
297 
298  // Print Interaction Details:
299  if (fVerbose) {
300  std::cout << std::setw(6) << "[" << idxPrimary+1 << "] " << std::setw(10) << pNav.Primary(idxPrimary+1)->PdgCode() << " " << std::setw(12) << pNav.Primary(idxPrimary+1)->E()*1e3 << " MeV" << std::endl;
301  std::cout << std::setw(6) << "[" << idxPrimary+2 << "] " << std::setw(10) << pNav.Primary(idxPrimary+2)->PdgCode() << " " << std::setw(12) << pNav.Primary(idxPrimary+2)->E()*1e3 << " MeV" << std::endl;
302  std::cout << std::setw(6) << "[" << idxPrimary+3 << "] " << std::setw(10) << pNav.Primary(idxPrimary+3)->PdgCode() << " " << std::setw(12) << pNav.Primary(idxPrimary+3)->E()*1e3 << " MeV" << " <----- Elastic Scattering Free END";
303  }
304  }
305 
306  // Advance the counter to the end of the current interaction
307  idxPrimary += OFFSET;
308  if (fVerbose) std::cout << std::endl;
309  }
310 
311  return;
312 }
313 
314 //...........................................................................
316 {
317  for (art::Ptr<rb::CellHit> hit : hits) {
318  if (!hit->IsMC()) continue;
319 
320  // Get the particle that contributed the most to the hit
321  std::vector<cheat::TrackIDE> trackIDEs = bt->HitToTrackIDE(*hit);
322  cheat::TrackIDE trackIDE = trackIDEs.at(0);
323  const sim::Particle* particle = bt->TrackIDToParticle(trackIDE.trackID);
324 
325  // Get the interaction associated with this particle
326  int interactionId = this->mapTrackIDInteraction[particle->TrackId()].first;
327  int interactionSubId = this->mapTrackIDInteraction[particle->TrackId()].second;
328  if (interactionId == 0 || interactionSubId == 0) continue;
329 
330  // Add the hit to the list of hits associated with this interaction
331  std::vector<art::Ptr<rb::CellHit>> vecHits = this->mapInteractionToHits[std::make_pair(interactionId, interactionSubId)];
332  vecHits.push_back(hit);
333  this->mapInteractionToHits[std::make_pair(interactionId, interactionSubId)] = vecHits;
334  }
335 }
336 
337 
338 //...........................................................................
340 {
341  std::unique_ptr<std::vector<rb::Cluster>> product_clusters(new std::vector<rb::Cluster>);
342 
343  fEvt = e.id().event();
344 
347 
348  /* Get the cell hits from event */
350  e.getByLabel(fCellHitLabel, hitsHdl);
351  std::vector<art::Ptr<rb::CellHit>> hits;
352  art::fill_ptr_vector(hits, hitsHdl);
353 
354  // Build Interaction-TrackID and Interaction-Hits maps
355  mapTrackIDInteraction.clear();
356  mapInteractionToHits.clear();
357 
358  this->BuildInteractionTrackIDMap(pNav);
359  this->BuildInteractionHitMap(bt, hits);
360 
361 
362  for (auto it = this->mapInteractionToHits.begin(); it != this->mapInteractionToHits.end(); ++it) {
363  if ((it->second).size() == 0) continue;
364 
365  fInteractionId = it->first.first;
366  fInteractionSubId = it->first.second;
367 
370 
371  rb::Cluster* intCluster = new rb::Cluster();
372  for (art::Ptr<rb::CellHit> h : it->second) {
373  intCluster->Add(h);
374  }
375 
376  if (intCluster->NCell()>0) {
377  product_clusters->push_back(*intCluster);
378  fClusterNHits = intCluster->NCell();
379  fClusterMeanTFile = intCluster->MeanTNS() * 1e-9 + fTimeSinceFileStart;
380  fClusterMeanTEvent = intCluster->MeanTNS() * 1e-9;
381  fClusterMeV = intCluster->TotalGeV() * 1e3;
382  fClusterNViews = (intCluster->NXCell()>0 && intCluster->NYCell()>0) ? 2 : 1;
383  fClusterMeanX = intCluster->MeanX();
384  fClusterMeanY = intCluster->MeanY();
385  fClusterMeanZ = intCluster->MeanZ();
386  fTreeParticles->Fill();
387  }
388  }
389 
390  if (fVerbose) {
391  std::cout << "Number of sim particles: " << this->mapTrackIDInteraction.size() << std::endl;
392  std::cout << "Number of interactions w/ hits: " << this->mapInteractionToHits.size() << std::endl;
393  std::cout << "Number of clusters: " << product_clusters->size() << std::endl;
394  std::cout << "----" << std::endl;
395  }
396 
397  e.put(std::move(product_clusters));
398 
399  /* Increment time */
401  e.getByLabel(fRawDataLabel, hdlTrigger);
402  const rawdata::RawTrigger rawTrigger = hdlTrigger->at(0);
403  fTimeSinceFileStart += (float)rawTrigger.fTriggerRange_TriggerLength * 500e-9;
404 
405  return;
406 }
407 
408 
409 //...........................................................................
411 {
412  /* Build TTree */
414 
415  fTreeParticles = tfs->make<TTree>("Clusters", "Clusters");
416  fTreeParticles->Branch("Event", &fEvt);
417  fTreeParticles->Branch("InteractionId", &fInteractionId);
418  fTreeParticles->Branch("InteractionSubId", &fInteractionSubId);
419  fTreeParticles->Branch("InteractionType", &fInteractionType);
420  fTreeParticles->Branch("InteractionEnergy", &fInteractionEnergy);
421  fTreeParticles->Branch("cluster_hits", &fClusterNHits);
422  fTreeParticles->Branch("cluster_meanT_file", &fClusterMeanTFile);
423  fTreeParticles->Branch("cluster_meanT_event", &fClusterMeanTEvent);
424  fTreeParticles->Branch("cluster_sumMeV", &fClusterMeV);
425  fTreeParticles->Branch("cluster_nviews", &fClusterNViews);
426  fTreeParticles->Branch("cluster_meanX", &fClusterMeanX);
427  fTreeParticles->Branch("cluster_meanY", &fClusterMeanY);
428  fTreeParticles->Branch("cluster_meanZ", &fClusterMeanZ);
429 
430  return;
431 }
432 
433 
double E(const int i=0) const
Definition: MCParticle.h:232
back track the reconstruction to the simulation
int PdgCode() const
Definition: MCParticle.h:211
unsigned int NCell(geo::View_t view) const
Number of cells in view view.
Definition: Cluster.cxx:134
int fInteractionSubId
Unique ID for each sub-interaction.
int fClusterNViews
Number of view in cluster (1 or 2)
set< int >::iterator it
std::vector< TrackIDE > HitToTrackIDE(const rb::CellHit &hit, bool useBirksE=false) const
Convenience function. HitsToTrackIDE but for a single hit.
const sim::ParticleNavigator & ParticleNavigator() const
Get a reference to the ParticleNavigator.
Definition: BackTracker.h:744
const char * p
Definition: xmltok.h:285
std::map< int, std::pair< int, int > > mapTrackIDInteraction
(Track ID, (Interaction ID, Sub-interaction ID))
list_type::const_iterator const_iterator
SupernovaMCCluster(fhicl::ParameterSet const &p)
std::string fRawDataLabel
Module label for RawData products.
A collection of associated CellHits.
Definition: Cluster.h:47
double MeanZ(rb::AveragingScheme scheme=kDefaultScheme) const
Definition: Cluster.h:233
void GetDaughters(sim::ParticleNavigator pNav, const sim::Particle *p, std::vector< sim::Particle > &dVec)
std::map< std::pair< int, int >, std::vector< art::Ptr< rb::CellHit > > > mapInteractionToHits
((Interaction ID, Sub-interaction ID), Cell HIts)
void BuildInteractionTrackIDMap(sim::ParticleNavigator pNav)
std::pair< Spectrum *, CheatDecomp * > make_pair(SpectrumLoaderBase &loader_data, SpectrumLoaderBase &loader_mc, HistAxis *axis, Cut *cut, const SystShifts &shift, const Var &wei)
Definition: DataMCLoad.C:336
DEFINE_ART_MODULE(TestTMapFile)
float fInteractionEnergy
Interaction incoming neutrino energy, in MeV.
Track type is none of the below.
float abs(float number)
Definition: d0nt_math.hpp:39
int NumberDaughters() const
Definition: MCParticle.h:216
int TrackId() const
Definition: MCParticle.h:209
int Daughter(const int i) const
Definition: MCParticle.cxx:112
virtual void Add(const art::Ptr< rb::CellHit > &cell, double weight=1)
Definition: Cluster.cxx:84
double MeanX(rb::AveragingScheme scheme=kDefaultScheme) const
Definition: Cluster.h:231
int fClusterNHits
Number of hits in cluster.
ProductID put(std::unique_ptr< PROD > &&product)
Definition: Event.h:102
bool fVerbose
Enable/disable verbose output.
void hits()
Definition: readHits.C:15
int trackID
Geant4 supplied trackID.
Definition: BackTracker.h:40
double MeanY(rb::AveragingScheme scheme=kDefaultScheme) const
Definition: Cluster.h:232
const sim::Particle * Primary(const int) const
int fInteractionType
1=Iverse Beta Decay (IBD), 2=Elastic Scattering (ES)
float fClusterMeanTEvent
Mean cluster time relative to start of event.
float fClusterMeanX
Mean cluster X.
std::string fCellHitLabel
Module label for CellHit product.
Float_t d
Definition: plot.C:236
std::map< int, std::pair< int, float > > mapInteractionIDInfo
(Interaction ID, (Interaction type, Interaction energy in MeV))
void BuildInteractionHitMap(art::ServiceHandle< cheat::BackTracker > bt, std::vector< art::Ptr< rb::CellHit >> hits)
Remove hits from hot and cold channels.
float fTimeSinceFileStart
Time since start of first event record in file, in ms.
SupernovaMCCluster & operator=(SupernovaMCCluster const &)=delete
const sim::Particle * TrackIDToParticle(int const &id) const
Returns a pointer to the sim::Particle object corresponding to the given TrackID. ...
OStream cout
Definition: OStream.cxx:6
unsigned int NYCell() const
Number of cells in the y-view.
Definition: Cluster.h:108
EventNumber_t event() const
Definition: EventID.h:116
T * make(ARGS...args) const
float fClusterMeV
Reconstructed cluster energy.
bool getByLabel(std::string const &label, std::string const &productInstanceName, Handle< PROD > &result) const
Definition: DataViewImpl.h:344
Definition: structs.h:12
unsigned int NXCell() const
Number of cells in the x-view.
Definition: Cluster.h:106
double MeanTNS(rb::AveragingScheme scheme=kDefaultScheme) const
Definition: Cluster.cxx:554
float fClusterMeanZ
Mean cluster Z.
int fInteractionId
Unique ID for each interaction.
double TotalGeV(EEnergyCalcScheme escheme=kRecomputeEnergy) const
Simple sum of the estimated GeV of all the hits.
Definition: Cluster.cxx:378
float fClusterMeanY
Mean cluster Y.
uint32_t fTriggerRange_TriggerLength
Definition: RawTrigger.h:40
unsigned int fEvt
Event record number.
float fClusterMeanTFile
Mean cluster time relative to start of file.
void fill_ptr_vector(std::vector< Ptr< T >> &ptrs, H const &h)
Definition: Ptr.h:464
Float_t e
Definition: plot.C:35
iterator find(const key_type &key)
EventID id() const
Definition: Event.h:56
enum BeamMode string