PandaRoot
BSEmcExtractDigisFromWaveforms.h
Go to the documentation of this file.
1 //#pragma once
2 
3 #ifndef BSEMCEXTRACTDIGISFROMWAVEFORMS_HH
4 #define BSEMCEXTRACTDIGISFROMWAVEFORMS_HH
5 
6 #include <PndPersistencyTask.h>
7 #include <iostream>
8 #include <string>
9 #include <utility>
10 #include <vector>
11 
12 #include "TClonesArray.h"
13 #include "TStopwatch.h"
14 
15 #include "FairLogger.h"
16 #include "FairRootManager.h"
17 #include "FairRunAna.h"
18 #include "FairRuntimeDb.h"
19 
20 #include "PndTCAOutputContainer.h"
21 
22 #include "BSEmcAbsPSA.h"
23 #include "BSEmcDigi.h"
24 #include "BSEmcDigiPar.h"
25 #include "BSEmcMCHit.h"
26 #include "BSEmcMultiWaveform.h"
27 #include "BSEmcWaveformData.h"
28 
29 #include "math.h"
30 
39 template <class ParSet>
41  public:
42  // Constructors
43  BSEmcExtractDigisFromWaveforms(const std::string &t_detectorname = "Barrel", Bool_t t_storedigis = kTRUE)
44  : PndPersistencyTask("BSEmcExtractDigisFromWaveforms"), fDetectorName(t_detectorname)
45  {
46  SetPersistency(t_storedigis);
47  }
48 
49  // Destructor
51  {
52  if (fPSA != nullptr) {
53  delete fPSA;
54  fPSA = nullptr;
55  }
56  }
57 
68  virtual InitStatus Init()
69  {
70 
71  LOG(debug) << "BSEmcExtractDigisFromWaveforms<ParSet>::Init";
73  if (fWaveformBranchName == "") {
75  }
76  if (fDigiBranchName == "") {
78  }
79  // Get RootManager
80  FairRootManager *ioman = FairRootManager::Instance();
81  if (ioman == nullptr) {
82  LOG(error) << "BSEmcExtractDigisFromWaveforms<ParSet>::Init: "
83  << "RootManager not instantiated!";
84  return kFATAL;
85  }
87 
88  LOG(debug) << "BSEmcExtractDigisFromWaveforms<ParSet>::Init: Registered " << fDigiBranchName;
89  // Get input array
90  fWaveformArray = (TClonesArray *)ioman->GetObject(fWaveformBranchName);
91  if (fWaveformArray == nullptr) {
92  // check if EmcWaveform contains MultiWaveforms
93  fWaveformArray = (TClonesArray *)ioman->GetObject(fWaveformBranchName);
94  if ((fWaveformArray == nullptr) || (!fWaveformArray->GetClass()->InheritsFrom("BSEmcMultiWaveform"))) {
95  LOG(error) << "BSEmcExtractDigisFromWaveforms<ParSet>::Init: "
96  << "No BSEmcWaveform array containing multi waveforms!";
97  return kFATAL;
98  }
99  }
100 
101  DefinePSA();
102  if (fPSA == nullptr) {
103  LOG(error) << "No PSA was defined. Aborting!";
104  return kFATAL;
105  }
106 
107  fEnergyDigiThreshold = fDigiPar->GetEnergyDigiThreshold();
108 
109  LOG(debug) << "BSEmcExtractDigisFromWaveforms: Intialization successfull";
110  return kSUCCESS;
111  }
112 
124  virtual void Exec(Option_t * /*unused*/)
125  {
126  fDigiArray.Reset();
127  // fDigiArray->Delete();
128  TStopwatch timer;
129  timer.Start();
130 
131  Double_t energy = NAN;
132  Double_t digi_time = NAN;
133  Int_t nHits = 0;
134  Int_t detId = 0;
135  Int_t nWaveforms = fWaveformArray->GetEntriesFast();
136  BSEmcWaveform *theWaveform = nullptr;
137 
138  for (Int_t iWaveform = 0; iWaveform < nWaveforms; iWaveform++) {
139 
140  theWaveform = (BSEmcWaveform *)fWaveformArray->At(iWaveform);
141  detId = theWaveform->GetDetectorId();
142 
143  nHits = fPSA->Process(theWaveform);
144 
145  for (Int_t iHit = 0; iHit < nHits; ++iHit) {
146  fPSA->GetHit(iHit, energy, digi_time);
147 
148  // if (energy > fEnergyDigiThreshold) {
149  Double_t timestamp = GetTimeStamp(theWaveform, digi_time);
150  BSEmcDigi *myDigi = fDigiArray.CreateCopy(BSEmcDigi(detId, energy, timestamp));
151  // BSEmcDigi *myDigi = new ((*fDigiArray)[fDigiArray->GetEntriesFast()]) BSEmcDigi(detId, energy, timestamp);
152  myDigi->SetGainType(GetGainType(theWaveform, iHit));
153  myDigi->ResetLinks();
154  myDigi->AddLinks(theWaveform->GetLinksWithType(FairRootManager::Instance()->GetBranchId(fHitBranchName)));
155  FairMultiLinkedData mchitlinks = myDigi->GetLinksWithType(FairRootManager::Instance()->GetBranchId(fHitBranchName));
156  for (const FairLink &link : mchitlinks.GetLinks()) {
157  LOG(debug) << link;
158  }
159  LOG(debug) << "BSEmcExtractDigisFromWaveforms for " << fDetectorName << " created Digi(detId: " << detId << ", energy: " << energy << ", timestamp: " << timestamp
160  << ") and has " << myDigi->GetLinksWithType(FairRootManager::Instance()->GetBranchId(fHitBranchName)).GetNLinks() << " links to EmcMCHits";
161  // }
162  }
163  }
164 
165  timer.Stop();
166  Double_t rtime = timer.RealTime();
167  Double_t ctime = timer.CpuTime();
168  LOG(debug) << "BSEmcExtractDigisFromWaveforms, Real time " << rtime << " s, CPU time " << ctime << " s";
169  }
170 
171  void SetStorageOfData(Bool_t t_val)
172  {
173  SetPersistency(t_val);
174  return;
175  }
176  void SetDigiBranchName(const TString &t_digiBranchName) { fDigiBranchName = t_digiBranchName; }
177  void SetWaveformBranchName(const TString &t_digiBranchName) { fWaveformBranchName = t_digiBranchName; }
178 
179  protected:
181  virtual void SetParContainers()
182  {
183  // Get run and runtime database
184  FairRun *run = FairRun::Instance();
185  if (run == nullptr) {
186  Fatal("SetParContainers", "No analysis run");
187  }
188  FairRuntimeDb *db = run->GetRuntimeDb();
189  if (db == nullptr) {
190  Fatal("SetParContainers", "No runtime database");
191  }
192  // Get Emc digitisation parameter container
193  fDigiPar = dynamic_cast<ParSet *>(db->getContainer(ParSet::fgParameterName.c_str()));
194  }
195  virtual Double_t GetTimeStamp(BSEmcWaveform *t_waveform, Double_t t_digi_time) const
196  {
197  Double_t sampleRate = t_waveform->GetSampleRate();
198 
199  t_digi_time /= sampleRate;
200  t_digi_time *= 1e9; // ns
201  return t_waveform->GetTimeStamp() + t_digi_time;
202  }
203 
204  virtual BSEmcDigi::eGAIN GetGainType(BSEmcWaveform *t_waveform, Int_t t_hit) const = 0;
205  virtual void DefinePSA() = 0;
206 
207  protected:
208  const std::string fDetectorName{""};
209  TString fHitBranchName{""};
211  // PndTCAInputContainer<BSEmcWaveform> fWaveformArray;
213  TClonesArray *fWaveformArray{nullptr};
214  // TClonesArray *fDigiArray{nullptr};
215  TString fDigiBranchName{""};
216  TString fWaveformBranchName{""};
217  Double_t fEnergyDigiThreshold{0};
218 
219  BSEmcAbsPSA *fPSA{nullptr};
220 
221  ParSet *fDigiPar{nullptr};
223 };
224 
225 #endif /*BSEMCEXTRACTDIGISFROMWAVEFORMS_HH*/
virtual Bool_t Init(const TString &t_branchname) final
Register the data t_branchname in form of TClonesArray * with the FairRootManager.
Baseclass for pulseshapeanalysis ( featureextraction )
Definition: BSEmcAbsPSA.h:26
void SetWaveformBranchName(const TString &t_digiBranchName)
represents a simulated waveform in an emc crystal
Definition: BSEmcWaveform.h:63
const std::string fgMultiWaveformBranchName
BSEmcExtractDigisFromWaveforms(const std::string &t_detectorname="Barrel", Bool_t t_storedigis=kTRUE)
virtual Double_t GetTimeStamp(BSEmcWaveform *t_waveform, Double_t t_digi_time) const
virtual void GetHit(Int_t t_i, Double_t &t_energy, Double_t &t_time)=0
Get energy and time of hit.
virtual BSEmcDigi::eGAIN GetGainType(BSEmcWaveform *t_waveform, Int_t t_hit) const =0
void SetGainType(eGAIN t_type)
Definition: BSEmcDigi.h:84
virtual InitStatus Init()
Init Task.
void SetPersistency(Bool_t val=kTRUE)
virtual Int_t Process(const BSEmcWaveform *t_waveform)=0
Find Hits in Waveform.
virtual T * CreateCopy(const T &t_element)
Create a copy of t_element in the TClonesArray and return a pointer to it.
Task to create digis from waveforms.
virtual void Reset() final
Delete all elements.
represents the reconstructed hit of one emc crystal
Definition: BSEmcDigi.h:47
void SetDigiBranchName(const TString &t_digiBranchName)
PndTCAOutputContainer< BSEmcDigi > fDigiArray
long GetDetectorId() const
Definition: BSEmcWaveform.h:72
ParSet * fDigiPar
Timebased Digitisation parameter container.
Input and Output Container implementation of PndOutputContainerI using an underlying TClonesArray...
const std::string fgMCHitBranchName
ClassDef(BSEmcExtractDigisFromWaveforms, 1)
const std::string fgDigiBranchName
Double_t GetSampleRate() const
Definition: BSEmcWaveform.h:87
virtual void Exec(Option_t *)
Runs the task.