PandaRoot
PndEmcAbsWaveformSimulator.h
Go to the documentation of this file.
1 #pragma once
2 
3 #ifndef PNDEMCABSWAVEFORMSIMULATOR_H_
4 #define PNDEMCABSWAVEFORMSIMULATOR_H_
5 
6 #include "TObject.h"
7 #include "TMath.h"
8 #include "TList.h"
10 
11 class TClonesArray;
12 class PndEmcWaveform;
13 class PndEmcWaveformData;
14 
15 #include "TROOT.h"
16 #include "TClonesArray.h"
17 
24 class PndEmcAbsWaveformSimulator : public TObject {
25  public:
29  virtual PndEmcWaveform *Simulate(PndEmcWaveformData *wfData, TClonesArray *arrayToStore = nullptr) { return CallModifiers(MakeWaveform(wfData, arrayToStore)); }
30 
32  virtual PndEmcWaveform *SimulateSinglePulse(Double_t hitEnergy, Double_t hitTime, TClonesArray *arrayToStore = nullptr, Int_t detId = -1, Int_t trackId = -1, Int_t hitIndex = -1)
33  {
34  return CallModifiers(MakeSingleWaveform(hitEnergy, hitTime, arrayToStore, detId, trackId, hitIndex));
35  }
36 
40  virtual PndEmcWaveform *Get1GevWaveform() = 0;
41 
45  virtual void GetAbsoluteTimeInterval(PndEmcWaveformData *wfData, Double_t &startTime, Double_t &activeTime) = 0; // in ns
46 
50  virtual Double_t GetTimeBeforeFirstHit(PndEmcWaveformData *) { return 0; } // in ns // wfData //[R.K.03/2017] unused variable(s)
51 
53  virtual Double_t GetScale() = 0;
54 
56  virtual Double_t GetTotalScale()
57  {
58  Double_t totalScale = GetScale();
59 
60  TIter iterModifiers(&fListOfWaveformModifiers);
61  while (PndEmcAbsWaveformModifier *wfmod = (PndEmcAbsWaveformModifier *)iterModifiers()) {
62  totalScale *= wfmod->GetScale();
63  }
64 
65  return totalScale;
66  }
67 
68  virtual Double_t GetSampleRate() { return fSampleRate; }
69 
70  virtual void AddModifier(PndEmcAbsWaveformModifier *wfModifier) { fListOfWaveformModifiers.Add(wfModifier); }
71 
72  protected:
74  PndEmcAbsWaveformSimulator(Double_t sampleRate) : fSampleRate(sampleRate){};
75 
76  virtual PndEmcWaveform *MakeWaveform(PndEmcWaveformData *wfData, TClonesArray *arrayToStore = nullptr) = 0;
77  virtual PndEmcWaveform *
78  MakeSingleWaveform(Double_t hitEnergy, Double_t hitTime, TClonesArray *arrayToStore = nullptr, Int_t detId = -1, Int_t trackId = -1, Int_t hitIndex = -1) = 0;
79 
80  /* sync adc clock with absolute time */
81  inline void SyncWithADCClock(Double_t &time) { time = TMath::Floor(time * fSampleRate) / fSampleRate; };
82 
84  {
85  TIter iterModifiers(&fListOfWaveformModifiers);
86  while (PndEmcAbsWaveformModifier *wfmod = (PndEmcAbsWaveformModifier *)iterModifiers()) {
87  wfmod->Modify(wf);
88  }
89  return wf;
90  }
91 
93  Double_t fSampleRate;
94 
96 };
97 
98 #endif
interface for waveform modifiers
virtual Double_t GetTimeBeforeFirstHit(PndEmcWaveformData *)
virtual void AddModifier(PndEmcAbsWaveformModifier *wfModifier)
virtual PndEmcWaveform * MakeSingleWaveform(Double_t hitEnergy, Double_t hitTime, TClonesArray *arrayToStore=nullptr, Int_t detId=-1, Int_t trackId=-1, Int_t hitIndex=-1)=0
virtual PndEmcWaveform * Get1GevWaveform()=0
Double_t fSampleRate
sampling rate of SADC. In 1/ns
ClassDef(PndEmcAbsWaveformSimulator, 3)
Abstract base class for waveform simulator.
virtual PndEmcWaveform * MakeWaveform(PndEmcWaveformData *wfData, TClonesArray *arrayToStore=nullptr)=0
virtual void GetAbsoluteTimeInterval(PndEmcWaveformData *wfData, Double_t &startTime, Double_t &activeTime)=0
represents a simulated waveform in an emc crystal
virtual PndEmcWaveform * Simulate(PndEmcWaveformData *wfData, TClonesArray *arrayToStore=nullptr)
virtual PndEmcWaveform * SimulateSinglePulse(Double_t hitEnergy, Double_t hitTime, TClonesArray *arrayToStore=nullptr, Int_t detId=-1, Int_t trackId=-1, Int_t hitIndex=-1)
represents a simulated waveform in an emc crystal, used by PndEmcFWEndcapTimebasedWaveforms ...
virtual PndEmcWaveform * CallModifiers(PndEmcWaveform *wf)
PndEmcAbsWaveformSimulator(Double_t sampleRate)
virtual Double_t GetScale()=0