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 52 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 55 of file BSEmcExtractDigisFromWaveforms.h.

56  : PndPersistencyTask("BSEmcExtractDigisFromWaveforms"), fDetectorName(t_detectorname)
57  {
58  SetPersistency(t_storedigis);
59  }
void SetPersistency(Bool_t val=kTRUE)

◆ ~BSEmcExtractDigisFromWaveforms()

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

Definition at line 62 of file BSEmcExtractDigisFromWaveforms.h.

63  {
64  if (fPSA != nullptr) {
65  delete fPSA;
66  fPSA = nullptr;
67  }
68  }

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 140 of file BSEmcExtractDigisFromWaveforms.h.

141  {
142  fDigiArray.Reset();
143  // fDigiArray->Delete();
144  TStopwatch timer;
145  timer.Start();
146 
147  Double_t energy = NAN;
148  Double_t digi_time = NAN;
149  Int_t nDeposits = 0;
150  Int_t detId = 0;
151  Int_t nWaveforms = fWaveformArray->GetEntriesFast();
152  BSEmcWaveform *theWaveform = nullptr;
153 
154  for (Int_t iWaveform = 0; iWaveform < nWaveforms; iWaveform++) {
155 
156  theWaveform = (BSEmcWaveform *)fWaveformArray->At(iWaveform);
157  detId = theWaveform->GetDetectorId();
158 
159  nDeposits = fPSA->Process(theWaveform);
160 
161  for (Int_t iDeposit = 0; iDeposit < nDeposits; ++iDeposit) {
162  fPSA->GetHit(iDeposit, energy, digi_time);
163 
164  // if (energy > fEnergyDigiThreshold) {
165  Double_t timestamp = GetTimeStamp(theWaveform, digi_time);
166  BSEmcDigi *myDigi = fDigiArray.CreateCopy(BSEmcDigi(detId, energy, timestamp - FairRootManager::Instance()->GetEventTime()));
167  // BSEmcDigi *myDigi = new ((*fDigiArray)[fDigiArray->GetEntriesFast()]) BSEmcDigi(detId, energy, timestamp);
168  myDigi->SetGainType(GetGainType(theWaveform, iDeposit));
169  myDigi->ResetLinks();
170  myDigi->AddLinks(theWaveform->GetLinksWithType(FairRootManager::Instance()->GetBranchId(fMCDepositBranchName)));
171  FairMultiLinkedData mcdeplinks = myDigi->GetLinksWithType(FairRootManager::Instance()->GetBranchId(fMCDepositBranchName));
172  for (const FairLink &link : mcdeplinks.GetLinks()) {
173  LOG(debug) << link;
174  }
175  LOG(debug) << "BSEmcExtractDigisFromWaveforms for " << fDetectorName << " created Digi(detId: " << detId << ", energy: " << energy << ", timestamp: " << timestamp
176  << ") and has " << myDigi->GetLinksWithType(FairRootManager::Instance()->GetBranchId(fMCDepositBranchName)).GetNLinks() << " links to EmcMCDeposits";
177  // }
178  }
179  }
180 
181  timer.Stop();
182  Double_t rtime = timer.RealTime();
183  Double_t ctime = timer.CpuTime();
184  LOG(debug) << "BSEmcExtractDigisFromWaveforms, Real time " << rtime << " s, CPU time " << ctime << " s";
185  }
represents a simulated waveform in an emc crystal
Definition: BSEmcWaveform.h:75
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:96
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:59
long GetDetectorId() const
Definition: BSEmcWaveform.h:84
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 211 of file BSEmcExtractDigisFromWaveforms.h.

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

212  {
213  Double_t sampleRate = t_waveform->GetSampleRate();
214 
215  t_digi_time /= sampleRate;
216  t_digi_time *= 1e9; // ns
217  return t_waveform->GetTimeStamp() + t_digi_time;
218  }
Double_t GetSampleRate() const
Definition: BSEmcWaveform.h:99

◆ 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 80 of file BSEmcExtractDigisFromWaveforms.h.

81  {
82 
83  LOG(debug) << "BSEmcExtractDigisFromWaveforms<ParSet>::Init";
85  if (fWaveformBranchName == "") {
87  }
88  if (fDigiBranchName == "") {
90  }
91  // Get RootManager
92  FairRootManager *ioman = FairRootManager::Instance();
93  if (ioman == nullptr) {
94  LOG(error) << "BSEmcExtractDigisFromWaveforms<ParSet>::Init: "
95  << "RootManager not instantiated!";
96  return kFATAL;
97  }
99  if (ioman->CheckBranch(fDigiBranchName) == 0) {
100  ioman->Register(fDigiBranchName, "BSEmcDigi", "EMC", GetPersistency());
101  }
102  fDigiArray.SetTCA(dynamic_cast<TClonesArray *>(ioman->GetObject(fDigiBranchName)));
103 
104  LOG(debug) << "BSEmcExtractDigisFromWaveforms<ParSet>::Init: Registered " << fDigiBranchName;
105  // Get input array
106  fWaveformArray = (TClonesArray *)ioman->GetObject(fWaveformBranchName);
107  if (fWaveformArray == nullptr) {
108  // check if EmcWaveform contains MultiWaveforms
109  fWaveformArray = (TClonesArray *)ioman->GetObject(fWaveformBranchName);
110  if ((fWaveformArray == nullptr) || (!fWaveformArray->GetClass()->InheritsFrom("BSEmcMultiWaveform"))) {
111  LOG(error) << "BSEmcExtractDigisFromWaveforms<ParSet>::Init: "
112  << "No BSEmcWaveform array containing multi waveforms!";
113  return kFATAL;
114  }
115  }
116 
117  DefinePSA();
118  if (fPSA == nullptr) {
119  LOG(error) << "No PSA was defined. Aborting!";
120  return kFATAL;
121  }
122 
123  fEnergyDigiThreshold = fDigiPar->GetEnergyDigiThreshold();
124 
125  LOG(debug) << "BSEmcExtractDigisFromWaveforms: Intialization successfull";
126  return kSUCCESS;
127  }
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 192 of file BSEmcExtractDigisFromWaveforms.h.

192 { fDigiBranchName = t_digiBranchName; }

◆ SetParContainers()

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

Get parameter containers

Definition at line 197 of file BSEmcExtractDigisFromWaveforms.h.

198  {
199  // Get run and runtime database
200  FairRun *run = FairRun::Instance();
201  if (run == nullptr) {
202  Fatal("SetParContainers", "No analysis run");
203  }
204  FairRuntimeDb *db = run->GetRuntimeDb();
205  if (db == nullptr) {
206  Fatal("SetParContainers", "No runtime database");
207  }
208  // Get Emc digitisation parameter container
209  fDigiPar = dynamic_cast<ParSet *>(db->getContainer(ParSet::fgParameterName.c_str()));
210  }
ParSet * fDigiPar
Timebased Digitisation parameter container.

◆ SetStorageOfData()

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

Definition at line 187 of file BSEmcExtractDigisFromWaveforms.h.

188  {
189  SetPersistency(t_val);
190  return;
191  }
void SetPersistency(Bool_t val=kTRUE)

◆ SetWaveformBranchName()

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

Definition at line 193 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: