FairRoot/PandaRoot
PndEmcFWEndcapTimebasedWaveforms.cxx
Go to the documentation of this file.
1 //----------------------------------------------------------------------
2 // Author List:
3 // Philippp Mahlberg
4 //----------------------------------------------------------------------
5 //
6 //
7 #include <PndPersistencyTask.h>
9 
10 #include "FairRun.h"
11 #include "PndEmcWaveform.h"
12 #include "PndEmcWaveformData.h"
13 #include "PndEmcWaveformBuffer.h"
19 #include "PndEmcHit.h"
20 #include "PndEmcFittedPulseshape.h"
21 #include "PndEmcMapper.h"
22 #include "PndEmcStructure.h"
23 #include "PndEmcFWEndcapDigiPar.h"
24 #include "PndEmcGeoPar.h"
25 #include "PndEmcDataTypes.h"
26 
27 #include "FairRootManager.h"
28 #include "FairRunAna.h"
29 #include "FairRuntimeDb.h"
30 #include "FairLink.h"
31 
32 #include "TStopwatch.h"
33 #include "TROOT.h"
34 #include "TRandom.h"
35 #include "TClonesArray.h"
36 
37 #include <iostream>
38 #include <cassert>
39 
40 using std::cout;
41 using std::cerr;
42 using std::endl;
43 using std::fstream;
44 
45 
47  PndPersistencyTask("PndEmcFWEndcapTimebasedWaveforms", verbose),
48  fHitArray(NULL), fWaveformBuffer(NULL), fStoreDataClass(kFALSE), fActivateBuffering(kFALSE), fDigiPar(NULL), fGeoPar(NULL), fUse_photon_statistic(kFALSE), fNPhotoElectronsPerMeV(0), fExcessNoiseFactor(0.), fExternalSimulator(NULL), fAPD_LOWHIGH(NULL)
49 {
50  SetPersistency(storewaves);
51 }
52 
53 //--------------
54 // Destructor --
55 //--------------
57 {
58 }
59 
60 
71 {
72  // Get RootManager
73  FairRootManager* ioman = FairRootManager::Instance();
74  if (!ioman) {
75  cout << "-E- PndEmcFWEndcapTimebasedWaveforms::Init: "
76  << "RootManager not instantiated!" << endl;
77  return kFATAL;
78  }
79 
80  // Get input array
81  fHitArray = (TClonesArray*) ioman->GetObject("EmcHit");
82  if (!fHitArray) {
83  cout << "-W- PndEmcFWEndcapTimebasedWaveforms::Init: "
84  << "No EmcHit array!" << endl;
85  return kERROR;
86  }
87 
88  // Create and activiate output Buffer....choose between PndEmcWaveform and PndEmcMultiWaveform
89  #ifndef MULTI
90  fWaveformBuffer = new PndEmcWaveformBuffer("EmcWaveform", "PndEmcWaveform", "Emc", GetPersistency());
91  #else
92  fWaveformBuffer = new PndEmcWaveformBuffer("EmcWaveform", "PndEmcMultiWaveform", "Emc", GetPersistency());
93  #endif
94 
95  fWaveformBuffer = (PndEmcWaveformBuffer*) ioman ->RegisterWriteoutBuffer("EmcTimebasedWaveform", fWaveformBuffer);
96  fWaveformBuffer->ActivateBuffering(fActivateBuffering);
97 
98  if (fStoreDataClass) {
99  fWaveformBuffer->StoreWaveformData("EmcWaveformData", "Emc", GetPersistency());
100  }
101 
102 
103  if(!fDigiPar) {
104  cout << "-E- PndEmcFWEndcapTimebasedWaveforms::Init: "
105  << "no DigiPar containter found" << endl;
106  return kERROR;
107  }
108 
110 
112  //rear surface of FWEndcap crystal: 676 mm^2
115  } else {
117  fExcessNoiseFactor = 1;
118  }
119 
122 
123  const Double_t tBefore = fDigiPar->GetTimeBeforeHit();
124  const Double_t tAfter = fDigiPar->GetTimeAfterHit();
125  const Double_t cutoff=fDigiPar->GetWfCutOffEnergy(); //GeV //0.001
126  const Double_t activeTimeIncrement=10; //ns //50
127  const Double_t sampleRate = fDigiPar->GetSampleRate(); //ns^-1 <-> GHz //0.08
128  const Int_t bits = fDigiPar->GetNBits(); //1 //14
129 
130  const Double_t tau = fDigiPar->GetPulseshapeTau(); //ns //68.7
131  const Double_t N = fDigiPar->GetPulseshapeN(); //N //1.667
132 
133  const Double_t energyRange_HIGH = fDigiPar->GetEnergyRangeHigh(); //GeV //1
134  const Double_t energyRange_LOW = fDigiPar->GetEnergyRangeLow(); //GeV //15
135  const Double_t noiseWidth_HIGH = fDigiPar->GetNoiseWidthLow(); //GeV //0.0023
136  const Double_t noiseWidth_LOW = fDigiPar->GetNoiseWidthHigh(); //GeV //0.0035
137 
138  PndEmcAbsPulseshape* fPulseshape = new PndEmcFittedPulseshape(tau, N);
139  fAPD_LOWHIGH = new PndEmcMultiWaveformSimulator(sampleRate, fPulseshape, 2);
140 
141  fAPD_LOWHIGH->Init(tBefore, tAfter, cutoff, activeTimeIncrement);
142 
145  fAPD_LOWHIGH->AddModifier(new PndEmcWaveformDigitizer(bits, energyRange_HIGH, fAPD_LOWHIGH->GetTotalScale(0)), 0);
146  fAPD_LOWHIGH->AddModifier(new PndEmcWaveformDigitizer(bits, energyRange_LOW, fAPD_LOWHIGH->GetTotalScale(1)), 1);
147 
148 
149  return kSUCCESS;
150 }
151 
152 
163 {
164  FairRootManager* ioman = FairRootManager::Instance();
165 
166  TStopwatch timer;
167  if (fVerbose>0){
168  timer.Start();
169  }
170 
171  // Variable declaration
172  PndEmcHit* theHit = NULL;
173 
174  // Loop over PndEmcHits to add them to correspondent waveforms
175  Int_t nHits = fHitArray->GetEntriesFast();
176  if (fVerbose>2) {
177  cout<< "PndEmcFWEndcapTimebasedWaveforms:: Hit array contains " << nHits << " hits" <<endl;
178  }
179 
180  for (Int_t iHit=0; iHit<nHits; iHit++) {
181 
182  theHit = dynamic_cast<PndEmcHit*>(fHitArray->At(iHit));
183 
184  if(theHit->GetModule() > 5 ) continue; //tackles invalid PndEmcHit inforamtion (valid module number = seq 1 5
185 
186  // select wf Simulator..
187  // TODO Add realistic description for other emc modules and make simulator choice module dependent
188  // switch(theHit->GetModule() {
189  // case 1: wfSimulator = ...
190  // case 2: wfSimulator = ...
191  // case 3: wfSimulator = ...
192  // case 4: wfSimulator = ...
193  // case 5: wfSimulator = ...
194  // default: continue;
195  // }
196  PndEmcAbsWaveformSimulator* wfSimulator = NULL;
197 
198  if(fExternalSimulator) {
199  wfSimulator = fExternalSimulator;
200  } else {
201  wfSimulator = fAPD_LOWHIGH;
202  };
203 
204  Double_t energy = theHit->GetEnergy();
205 
207  Double_t crystalPhotonsMeV = 1.0e3 * energy * fNPhotoElectronsPerMeV;
208  Double_t photonStatFactor = gRandom->Gaus(1,sqrt(fExcessNoiseFactor/crystalPhotonsMeV));
209  energy *=photonStatFactor;
210  }
211 
212  //Double_t eventTime = ioman->GetEventTime(); //[R.K. 01/2017] unused variable?
213 
214  // construct corresponding waveform data Object
215  PndEmcWaveformData wfData(theHit->GetDetectorID(), wfSimulator);
216 
217  //register hit...timebased framework uses ns, whereas emc deals with seconds as time unit
218  FairLink linkToHit(-1, ioman->GetEntryNr(), "EmcHit", iHit, 1.0);
219  // std::cout << "-I- PndEmcFWEndcapTimebasedWaveforms::Exec eventTIme: " << ioman->GetEventTime() << " hit Time: " << theHit->GetTime()*1.0e9 << std::endl;
220  wfData.AddHit(linkToHit, ioman->GetEventTime() + theHit->GetTime()*1.0e9, theHit->GetEnergy());
221 
222  fWaveformBuffer->FillNewData(&wfData);
223 
224  if (fVerbose>1){
225  timer.Stop();
226  Double_t rtime = timer.RealTime();
227  Double_t ctime = timer.CpuTime();
228  cout << "PndEmcFWEndcapTimebasedWaveforms, Real time " << rtime << " s, CPU time " << ctime << " s" << endl;
229  }
230  }
231 }
232 
234 {
235  // Get run and runtime database
236  FairRun* run = FairRun::Instance();
237  if ( ! run ) Fatal("SetParContainers", "No analysis run");
238 
239  FairRuntimeDb* db = run->GetRuntimeDb();
240  if ( ! db ) Fatal("SetParContainers", "No runtime database");
241 
242  // Get Emc geometry parameter container
243  fGeoPar = (PndEmcGeoPar*) db->getContainer("PndEmcGeoPar");
244 
245  // Get Emc digitisation parameter container
246  fDigiPar = dynamic_cast<PndEmcFWEndcapDigiPar*>(db->getContainer("PndEmcFWEndcapDigiPar"));
247 }
248 
int fVerbose
Definition: poormantracks.C:24
Int_t run
Definition: autocutx.C:47
virtual Double_t GetTotalScale(Int_t wfIndex)
Return scale after all modifiers.
virtual void StoreWaveformData(TString branchName, TString folderName, bool persistance)
friend F32vec4 sqrt(const F32vec4 &a)
Definition: P4_F32vec4.h:29
#define verbose
Taks to create waveforms from hits.
void SetPersistency(Bool_t val=kTRUE)
Simulator to create PndEmcMultiWaveform.
PndEmcFWEndcapDigiPar * fDigiPar
Digitisation parameter container.
void InitEmcMapper()
virtual void AddModifier(PndEmcAbsWaveformModifier *wfModifier, Int_t wfIndex)
Add a modifier (PndEmcAbsWaveformModifier)
Abstract base class for waveform simulator.
parameter set for the FWEndcap variant of waveform simulation
int nHits
Definition: RiemannTest.C:16
Double_t
virtual Double_t GetEnergy() const
Definition: PndEmcHit.h:54
TStopwatch timer
Definition: hit_dirc.C:51
Experimentally derived Pulseshape.
virtual void Init(Double_t samplingBeforeFirstPulse, Double_t samplingAfterLastPulse, Double_t cutoff, Double_t activeTimeIncrement)
Init the simulator.
virtual void Exec(Option_t *opt)
Runs the task.
Double_t ctime
Definition: hit_dirc.C:114
virtual Double_t GetTime() const
Definition: PndEmcHit.h:55
represents the deposited energy of one emc crystal from simulation
Definition: PndEmcHit.h:26
pulseshape interface
buffer for waveforms, used by PndEmcFWEndcapTimebasedWaveforms
ClassImp(PndAnaContFact)
virtual void FillNewData(PndEmcWaveformData *)
represents a simulated waveform in an emc crystal, used by PndEmcFWEndcapTimebasedWaveforms ...
PndEmcFWEndcapTimebasedWaveforms(Int_t verbose=0, Bool_t storewaves=kFALSE)
static PndEmcStructure * Instance()
Double_t rtime
Definition: hit_dirc.C:113
PndEmcGeoPar * fGeoPar
Geometry parameter container.
Short_t GetModule() const
Definition: PndEmcHit.h:58
waveform modifier to add noise to waveform
Double_t energy
Definition: plot_dirc.C:15