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

129  {
130  fDigiArray.Reset();
131  // fDigiArray->Delete();
132  TStopwatch timer;
133  timer.Start();
134 
135  Double_t energy = NAN;
136  Double_t digi_time = NAN;
137  Int_t nDeposits = 0;
138  Int_t detId = 0;
139  Int_t nWaveforms = fWaveformArray->GetEntriesFast();
140  BSEmcWaveform *theWaveform = nullptr;
141 
142  for (Int_t iWaveform = 0; iWaveform < nWaveforms; iWaveform++) {
143 
144  theWaveform = (BSEmcWaveform *)fWaveformArray->At(iWaveform);
145  detId = theWaveform->GetDetectorId();
146 
147  nDeposits = fPSA->Process(theWaveform);
148 
149  for (Int_t iDeposit = 0; iDeposit < nDeposits; ++iDeposit) {
150  fPSA->GetHit(iDeposit, energy, digi_time);
151 
152  // if (energy > fEnergyDigiThreshold) {
153  Double_t timestamp = GetTimeStamp(theWaveform, digi_time);
154  BSEmcDigi *myDigi = fDigiArray.CreateCopy(BSEmcDigi(detId, energy, timestamp - FairRootManager::Instance()->GetEventTime()));
155  // BSEmcDigi *myDigi = new ((*fDigiArray)[fDigiArray->GetEntriesFast()]) BSEmcDigi(detId, energy, timestamp);
156  myDigi->SetGainType(GetGainType(theWaveform, iDeposit));
157  myDigi->ResetLinks();
158  myDigi->AddLinks(theWaveform->GetLinksWithType(FairRootManager::Instance()->GetBranchId(fMCDepositBranchName)));
159  FairMultiLinkedData mcdeplinks = myDigi->GetLinksWithType(FairRootManager::Instance()->GetBranchId(fMCDepositBranchName));
160  for (const FairLink &link : mcdeplinks.GetLinks()) {
161  LOG(debug) << link;
162  }
163  LOG(debug) << "BSEmcExtractDigisFromWaveforms for " << fDetectorName << " created Digi(detId: " << detId << ", energy: " << energy << ", timestamp: " << timestamp
164  << ") and has " << myDigi->GetLinksWithType(FairRootManager::Instance()->GetBranchId(fMCDepositBranchName)).GetNLinks() << " links to EmcMCDeposits";
165  // }
166  }
167  }
168 
169  timer.Stop();
170  Double_t rtime = timer.RealTime();
171  Double_t ctime = timer.CpuTime();
172  LOG(debug) << "BSEmcExtractDigisFromWaveforms, Real time " << rtime << " s, CPU time " << ctime << " s";
173  }
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 199 of file BSEmcExtractDigisFromWaveforms.h.

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

200  {
201  Double_t sampleRate = t_waveform->GetSampleRate();
202 
203  t_digi_time /= sampleRate;
204  t_digi_time *= 1e9; // ns
205  return t_waveform->GetTimeStamp() + t_digi_time;
206  }
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  if (ioman->CheckBranch(fDigiBranchName) == 0) {
88  ioman->Register(fDigiBranchName, "BSEmcDigi", "EMC", GetPersistency());
89  }
90  fDigiArray.SetTCA(dynamic_cast<TClonesArray *>(ioman->GetObject(fDigiBranchName)));
91 
92  LOG(debug) << "BSEmcExtractDigisFromWaveforms<ParSet>::Init: Registered " << fDigiBranchName;
93  // Get input array
94  fWaveformArray = (TClonesArray *)ioman->GetObject(fWaveformBranchName);
95  if (fWaveformArray == nullptr) {
96  // check if EmcWaveform contains MultiWaveforms
97  fWaveformArray = (TClonesArray *)ioman->GetObject(fWaveformBranchName);
98  if ((fWaveformArray == nullptr) || (!fWaveformArray->GetClass()->InheritsFrom("BSEmcMultiWaveform"))) {
99  LOG(error) << "BSEmcExtractDigisFromWaveforms<ParSet>::Init: "
100  << "No BSEmcWaveform array containing multi waveforms!";
101  return kFATAL;
102  }
103  }
104 
105  DefinePSA();
106  if (fPSA == nullptr) {
107  LOG(error) << "No PSA was defined. Aborting!";
108  return kFATAL;
109  }
110 
111  fEnergyDigiThreshold = fDigiPar->GetEnergyDigiThreshold();
112 
113  LOG(debug) << "BSEmcExtractDigisFromWaveforms: Intialization successfull";
114  return kSUCCESS;
115  }
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 180 of file BSEmcExtractDigisFromWaveforms.h.

180 { fDigiBranchName = t_digiBranchName; }

◆ SetParContainers()

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

Get parameter containers

Definition at line 185 of file BSEmcExtractDigisFromWaveforms.h.

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

◆ SetStorageOfData()

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

Definition at line 175 of file BSEmcExtractDigisFromWaveforms.h.

176  {
177  SetPersistency(t_val);
178  return;
179  }
void SetPersistency(Bool_t val=kTRUE)

◆ SetWaveformBranchName()

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

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