PandaRoot
BSEmcExtractDigisFromWaveforms< ParSet > Class Template Referenceabstract

Task to create digis from waveforms. More...

#include <BSEmcExtractDigisFromWaveforms.h>

Inheritance diagram for BSEmcExtractDigisFromWaveforms< ParSet >:
PndPersistencyTask

Public Member Functions

 BSEmcExtractDigisFromWaveforms (const std::string &t_detectorname="Barrel", Bool_t t_storedigis=kTRUE)
 
virtual ~BSEmcExtractDigisFromWaveforms ()
 
virtual InitStatus Init ()
 Init Task. More...
 
virtual void Exec (Option_t *)
 Runs the task. More...
 
void SetStorageOfData (Bool_t t_val)
 
void SetDigiBranchName (const TString &t_digiBranchName)
 
void SetWaveformBranchName (const TString &t_digiBranchName)
 
- Public Member Functions inherited from PndPersistencyTask
 PndPersistencyTask ()
 
 PndPersistencyTask (const char *name, Int_t iVerbose=1)
 
virtual ~PndPersistencyTask ()
 
void SetPersistency (Bool_t val=kTRUE)
 
Bool_t GetPersistency ()
 

Protected Member Functions

virtual void SetParContainers ()
 
virtual Double_t GetTimeStamp (BSEmcWaveform *t_waveform, Double_t t_digi_time) const
 
virtual BSEmcDigi::eGAIN GetGainType (BSEmcWaveform *t_waveform, Int_t t_dep) const =0
 
virtual void DefinePSA ()=0
 
 ClassDef (BSEmcExtractDigisFromWaveforms, 1)
 

Protected Attributes

const std::string fDetectorName {""}
 
TString fMCDepositBranchName {""}
 
PndTCAMutableContainer< BSEmcDigifDigiArray {"Emc", kTRUE}
 
TClonesArray * fWaveformArray {nullptr}
 
TString fDigiBranchName {""}
 
TString fWaveformBranchName {""}
 
Double_t fEnergyDigiThreshold {0}
 
BSEmcAbsPSAfPSA {nullptr}
 
ParSet * fDigiPar {nullptr}
 Timebased Digitisation parameter container. More...
 

Detailed Description

template<class ParSet>
class BSEmcExtractDigisFromWaveforms< ParSet >

Task to create digis from waveforms.

This is an alternative to BSEmcWaveformToDigi, which despite its name could be used for all the EMC, not just FwEndcap.

Author
Ph. Mahlberg mahlb.nosp@m.erg@.nosp@m.hiskp.nosp@m..uni.nosp@m.-bonn.nosp@m..de

Definition at line 40 of file BSEmcExtractDigisFromWaveforms.h.

Constructor & Destructor Documentation

◆ BSEmcExtractDigisFromWaveforms()

template<class ParSet>
BSEmcExtractDigisFromWaveforms< ParSet >::BSEmcExtractDigisFromWaveforms ( const std::string &  t_detectorname = "Barrel",
Bool_t  t_storedigis = kTRUE 
)
inline

Definition at line 43 of file BSEmcExtractDigisFromWaveforms.h.

44  : PndPersistencyTask("BSEmcExtractDigisFromWaveforms"), fDetectorName(t_detectorname)
45  {
46  SetPersistency(t_storedigis);
47  }
void SetPersistency(Bool_t val=kTRUE)

◆ ~BSEmcExtractDigisFromWaveforms()

template<class ParSet>
virtual BSEmcExtractDigisFromWaveforms< ParSet >::~BSEmcExtractDigisFromWaveforms ( )
inlinevirtual

Definition at line 50 of file BSEmcExtractDigisFromWaveforms.h.

51  {
52  if (fPSA != nullptr) {
53  delete fPSA;
54  fPSA = nullptr;
55  }
56  }

Member Function Documentation

◆ ClassDef()

template<class ParSet>
BSEmcExtractDigisFromWaveforms< ParSet >::ClassDef ( BSEmcExtractDigisFromWaveforms< ParSet >  ,
 
)
protected

◆ DefinePSA()

◆ Exec()

template<class ParSet>
virtual void BSEmcExtractDigisFromWaveforms< ParSet >::Exec ( Option_t *  )
inlinevirtual

Runs the task.

The task loops over the waveforms and uses the pulse shape analyser (BSEmcAbsPSA) to extract signal height and timing. If the energy is above the threshold (fEnergyDigiThreshold), a BSEmcDigi is created.

Parameters
optunused
Returns
void

Definition at line 125 of file BSEmcExtractDigisFromWaveforms.h.

126  {
127  fDigiArray.Reset();
128  // fDigiArray->Delete();
129  TStopwatch timer;
130  timer.Start();
131 
132  Double_t energy = NAN;
133  Double_t digi_time = NAN;
134  Int_t nDeposits = 0;
135  Int_t detId = 0;
136  Int_t nWaveforms = fWaveformArray->GetEntriesFast();
137  BSEmcWaveform *theWaveform = nullptr;
138 
139  for (Int_t iWaveform = 0; iWaveform < nWaveforms; iWaveform++) {
140 
141  theWaveform = (BSEmcWaveform *)fWaveformArray->At(iWaveform);
142  detId = theWaveform->GetDetectorId();
143 
144  nDeposits = fPSA->Process(theWaveform);
145 
146  for (Int_t iDeposit = 0; iDeposit < nDeposits; ++iDeposit) {
147  fPSA->GetHit(iDeposit, energy, digi_time);
148 
149  // if (energy > fEnergyDigiThreshold) {
150  Double_t timestamp = GetTimeStamp(theWaveform, digi_time);
151  BSEmcDigi *myDigi = fDigiArray.CreateCopy(BSEmcDigi(detId, energy, timestamp));
152  // BSEmcDigi *myDigi = new ((*fDigiArray)[fDigiArray->GetEntriesFast()]) BSEmcDigi(detId, energy, timestamp);
153  myDigi->SetGainType(GetGainType(theWaveform, iDeposit));
154  myDigi->ResetLinks();
155  myDigi->AddLinks(theWaveform->GetLinksWithType(FairRootManager::Instance()->GetBranchId(fMCDepositBranchName)));
156  FairMultiLinkedData mcdeplinks = myDigi->GetLinksWithType(FairRootManager::Instance()->GetBranchId(fMCDepositBranchName));
157  for (const FairLink &link : mcdeplinks.GetLinks()) {
158  LOG(debug) << link;
159  }
160  LOG(debug) << "BSEmcExtractDigisFromWaveforms for " << fDetectorName << " created Digi(detId: " << detId << ", energy: " << energy << ", timestamp: " << timestamp
161  << ") and has " << myDigi->GetLinksWithType(FairRootManager::Instance()->GetBranchId(fMCDepositBranchName)).GetNLinks() << " links to EmcMCDeposits";
162  // }
163  }
164  }
165 
166  timer.Stop();
167  Double_t rtime = timer.RealTime();
168  Double_t ctime = timer.CpuTime();
169  LOG(debug) << "BSEmcExtractDigisFromWaveforms, Real time " << rtime << " s, CPU time " << ctime << " s";
170  }
represents a simulated waveform in an emc crystal
Definition: BSEmcWaveform.h:63
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.
void SetGainType(eGAIN t_type)
Definition: BSEmcDigi.h:84
virtual Int_t Process(const BSEmcWaveform *t_waveform)=0
Find Hits in Waveform.
virtual void Reset() final
Delete all elements.
PndTCAMutableContainer< BSEmcDigi > fDigiArray
represents the reconstructed hit of one emc crystal
Definition: BSEmcDigi.h:47
long GetDetectorId() const
Definition: BSEmcWaveform.h:72
virtual T * CreateCopy(const T &t_element)
Create a copy of t_element in the TClonesArray and return a pointer to it.
virtual BSEmcDigi::eGAIN GetGainType(BSEmcWaveform *t_waveform, Int_t t_dep) const =0

◆ GetGainType()

template<class ParSet>
virtual BSEmcDigi::eGAIN BSEmcExtractDigisFromWaveforms< ParSet >::GetGainType ( BSEmcWaveform t_waveform,
Int_t  t_dep 
) const
protectedpure virtual

◆ GetTimeStamp()

template<class ParSet>
virtual Double_t BSEmcExtractDigisFromWaveforms< ParSet >::GetTimeStamp ( BSEmcWaveform t_waveform,
Double_t  t_digi_time 
) const
inlineprotectedvirtual

Reimplemented in BSEmcBwEndcapDigi.

Definition at line 196 of file BSEmcExtractDigisFromWaveforms.h.

Referenced by BSEmcExtractDigisFromWaveforms< BSEmcFwEndcapDigiPar >::Exec().

197  {
198  Double_t sampleRate = t_waveform->GetSampleRate();
199 
200  t_digi_time /= sampleRate;
201  t_digi_time *= 1e9; // ns
202  return t_waveform->GetTimeStamp() + t_digi_time;
203  }
Double_t GetSampleRate() const
Definition: BSEmcWaveform.h:87

◆ Init()

template<class ParSet>
virtual InitStatus BSEmcExtractDigisFromWaveforms< ParSet >::Init ( )
inlinevirtual

Init Task.

Prepares the TClonesArray of BSEmcMultiWaveform for reading and BSEmcDigi for writing. Also reads the EMC parameters and prepares the pulseshapes (BSEmcAbsPulseshape) and pulse shape analyser (BSEmcAbsPSA)

Returns
InitStatus
Return values
kSUCCESSsuccess

Definition at line 68 of file BSEmcExtractDigisFromWaveforms.h.

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  fDigiArray.SetTCA(dynamic_cast<TClonesArray *>(ioman->GetObject(fDigiBranchName)));
88 
89  LOG(debug) << "BSEmcExtractDigisFromWaveforms<ParSet>::Init: Registered " << fDigiBranchName;
90  // Get input array
91  fWaveformArray = (TClonesArray *)ioman->GetObject(fWaveformBranchName);
92  if (fWaveformArray == nullptr) {
93  // check if EmcWaveform contains MultiWaveforms
94  fWaveformArray = (TClonesArray *)ioman->GetObject(fWaveformBranchName);
95  if ((fWaveformArray == nullptr) || (!fWaveformArray->GetClass()->InheritsFrom("BSEmcMultiWaveform"))) {
96  LOG(error) << "BSEmcExtractDigisFromWaveforms<ParSet>::Init: "
97  << "No BSEmcWaveform array containing multi waveforms!";
98  return kFATAL;
99  }
100  }
101 
102  DefinePSA();
103  if (fPSA == nullptr) {
104  LOG(error) << "No PSA was defined. Aborting!";
105  return kFATAL;
106  }
107 
108  fEnergyDigiThreshold = fDigiPar->GetEnergyDigiThreshold();
109 
110  LOG(debug) << "BSEmcExtractDigisFromWaveforms: Intialization successfull";
111  return kSUCCESS;
112  }
const std::string fgMultiWaveformBranchName
void SetTCA(TClonesArray *t_tca)
Set the TClonesArray address.
PndTCAMutableContainer< BSEmcDigi > fDigiArray
void SetBranchName(const TString &t_branchname)
Set the Branch Name.
ParSet * fDigiPar
Timebased Digitisation parameter container.
const std::string fgDigiBranchName
const std::string fgMCDepositBranchName

◆ SetDigiBranchName()

template<class ParSet>
void BSEmcExtractDigisFromWaveforms< ParSet >::SetDigiBranchName ( const TString &  t_digiBranchName)
inline

Definition at line 177 of file BSEmcExtractDigisFromWaveforms.h.

177 { fDigiBranchName = t_digiBranchName; }

◆ SetParContainers()

template<class ParSet>
virtual void BSEmcExtractDigisFromWaveforms< ParSet >::SetParContainers ( )
inlineprotectedvirtual

Get parameter containers

Definition at line 182 of file BSEmcExtractDigisFromWaveforms.h.

183  {
184  // Get run and runtime database
185  FairRun *run = FairRun::Instance();
186  if (run == nullptr) {
187  Fatal("SetParContainers", "No analysis run");
188  }
189  FairRuntimeDb *db = run->GetRuntimeDb();
190  if (db == nullptr) {
191  Fatal("SetParContainers", "No runtime database");
192  }
193  // Get Emc digitisation parameter container
194  fDigiPar = dynamic_cast<ParSet *>(db->getContainer(ParSet::fgParameterName.c_str()));
195  }
ParSet * fDigiPar
Timebased Digitisation parameter container.

◆ SetStorageOfData()

template<class ParSet>
void BSEmcExtractDigisFromWaveforms< ParSet >::SetStorageOfData ( Bool_t  t_val)
inline

Definition at line 172 of file BSEmcExtractDigisFromWaveforms.h.

173  {
174  SetPersistency(t_val);
175  return;
176  }
void SetPersistency(Bool_t val=kTRUE)

◆ SetWaveformBranchName()

template<class ParSet>
void BSEmcExtractDigisFromWaveforms< ParSet >::SetWaveformBranchName ( const TString &  t_digiBranchName)
inline

Definition at line 178 of file BSEmcExtractDigisFromWaveforms.h.

Member Data Documentation

◆ fDetectorName

template<class ParSet>
const std::string BSEmcExtractDigisFromWaveforms< ParSet >::fDetectorName {""}
protected

◆ fDigiArray

template<class ParSet>
PndTCAMutableContainer<BSEmcDigi> BSEmcExtractDigisFromWaveforms< ParSet >::fDigiArray {"Emc", kTRUE}
protected

◆ fDigiBranchName

◆ fDigiPar

template<class ParSet>
ParSet* BSEmcExtractDigisFromWaveforms< ParSet >::fDigiPar {nullptr}
protected

◆ fEnergyDigiThreshold

template<class ParSet>
Double_t BSEmcExtractDigisFromWaveforms< ParSet >::fEnergyDigiThreshold {0}
protected

◆ fMCDepositBranchName

template<class ParSet>
TString BSEmcExtractDigisFromWaveforms< ParSet >::fMCDepositBranchName {""}
protected

◆ fPSA

◆ fWaveformArray

template<class ParSet>
TClonesArray* BSEmcExtractDigisFromWaveforms< ParSet >::fWaveformArray {nullptr}
protected

◆ fWaveformBranchName


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