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_hit) const =0
 
virtual void DefinePSA ()=0
 
 ClassDef (BSEmcExtractDigisFromWaveforms, 1)
 

Protected Attributes

const std::string fDetectorName {""}
 
TString fHitBranchName {""}
 
PndTCAOutputContainer< 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 124 of file BSEmcExtractDigisFromWaveforms.h.

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  }
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.
virtual BSEmcDigi::eGAIN GetGainType(BSEmcWaveform *t_waveform, Int_t t_hit) const =0
void SetGainType(eGAIN t_type)
Definition: BSEmcDigi.h:84
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.
virtual void Reset() final
Delete all elements.
represents the reconstructed hit of one emc crystal
Definition: BSEmcDigi.h:47
PndTCAOutputContainer< BSEmcDigi > fDigiArray
long GetDetectorId() const
Definition: BSEmcWaveform.h:72

◆ GetGainType()

template<class ParSet>
virtual BSEmcDigi::eGAIN BSEmcExtractDigisFromWaveforms< ParSet >::GetGainType ( BSEmcWaveform t_waveform,
Int_t  t_hit 
) 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 195 of file BSEmcExtractDigisFromWaveforms.h.

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

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  }
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 
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  }
virtual Bool_t Init(const TString &t_branchname) final
Register the data t_branchname in form of TClonesArray * with the FairRootManager.
const std::string fgMultiWaveformBranchName
PndTCAOutputContainer< BSEmcDigi > fDigiArray
ParSet * fDigiPar
Timebased Digitisation parameter container.
const std::string fgMCHitBranchName
const std::string fgDigiBranchName

◆ SetDigiBranchName()

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

Definition at line 176 of file BSEmcExtractDigisFromWaveforms.h.

176 { fDigiBranchName = t_digiBranchName; }

◆ SetParContainers()

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

Get parameter containers

Definition at line 181 of file BSEmcExtractDigisFromWaveforms.h.

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  }
ParSet * fDigiPar
Timebased Digitisation parameter container.

◆ SetStorageOfData()

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

Definition at line 171 of file BSEmcExtractDigisFromWaveforms.h.

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

◆ SetWaveformBranchName()

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

Definition at line 177 of file BSEmcExtractDigisFromWaveforms.h.

Member Data Documentation

◆ fDetectorName

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

◆ fDigiArray

template<class ParSet>
PndTCAOutputContainer<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

◆ fHitBranchName

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

◆ fPSA

◆ fWaveformArray

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

◆ fWaveformBranchName


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