PandaRoot
BSEmcMCDepositToTimebasedWaveforms< ParSet > Class Template Referenceabstract

Taks to create waveforms from deposits. More...

#include <BSEmcMCDepositToTimebasedWaveforms.h>

Inheritance diagram for BSEmcMCDepositToTimebasedWaveforms< ParSet >:
PndPersistencyTask

Public Member Functions

 BSEmcMCDepositToTimebasedWaveforms (const std::string &t_detectorname, Bool_t t_storewaves=kTRUE)
 
virtual ~BSEmcMCDepositToTimebasedWaveforms ()
 
virtual InitStatus Init ()
 Init Task. More...
 
virtual void Exec (Option_t *)
 Runs the task. More...
 
void RunTimebased (Bool_t t_timebased=kTRUE)
 
void SetSimulator (BSEmcAbsWaveformSimulator *t_simulator)
 
void SetStorageOfData (Bool_t t_storeWaves=kTRUE)
 
void StoreDataClass (Bool_t t_storeData=kTRUE)
 Method to specify whether waveforms are stored or not. More...
 
void SetWaveformBranchName (const TString &t_branchName)
 
void SetWaveformDataBranchName (const TString &t_branchName)
 
void SetPhotonStatisticParName (const std::string &t_photonStatParName)
 
void SetWaveformGenParName (const std::string &t_waveformGenParName)
 
- 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 void SetupSimulator ()=0
 
 ClassDef (BSEmcMCDepositToTimebasedWaveforms, 2)
 

Protected Attributes

TString fDetectorName {""}
 
TString fMCDepositBranchName {""}
 
TString fWaveformBranchName {""}
 
TString fWaveformDataBranchName {""}
 
PndTCAConstContainer< BSEmcMCDepositfMCDepositArray {}
 
BSEmcWaveformBufferfWaveformBuffer {nullptr}
 
Bool_t fStoreDataClass {kFALSE}
 
Bool_t fActivateBuffering {kFALSE}
 
std::string fPhotonStatisticParName {""}
 
BSEmcDigiParfPhotonStatisticPar {nullptr}
 
std::string fWaveformGenParName {""}
 
ParSet * fDigiPar {nullptr}
 Digitisation parameter container. More...
 
Bool_t fUse_photon_statistic {kFALSE}
 
Double_t fNPhotoElectronsPerMeV {0}
 
Double_t fExcessNoiseFactor {0}
 
Double_t fOverlapTime {0}
 
BSEmcAbsWaveformSimulatorfSimulator {nullptr}
 

Detailed Description

template<class ParSet>
class BSEmcMCDepositToTimebasedWaveforms< ParSet >

Taks to create waveforms from deposits.

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

Author
Dima Melnichuk - adaption for PANDA
Philipp Mahlberg mahlb.nosp@m.erg@.nosp@m.hiskp.nosp@m..uni.nosp@m.-bonn.nosp@m..de - integration in timebased simulation concept

Definition at line 49 of file BSEmcMCDepositToTimebasedWaveforms.h.

Constructor & Destructor Documentation

◆ BSEmcMCDepositToTimebasedWaveforms()

template<class ParSet>
BSEmcMCDepositToTimebasedWaveforms< ParSet >::BSEmcMCDepositToTimebasedWaveforms ( const std::string &  t_detectorname,
Bool_t  t_storewaves = kTRUE 
)
inline

Definition at line 52 of file BSEmcMCDepositToTimebasedWaveforms.h.

53  : PndPersistencyTask("BSEmcMCDepositToTimebasedWaveforms"), fDetectorName(t_detectorname)
54  {
55  SetPersistency(t_storewaves);
56  }
void SetPersistency(Bool_t val=kTRUE)

◆ ~BSEmcMCDepositToTimebasedWaveforms()

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

Definition at line 59 of file BSEmcMCDepositToTimebasedWaveforms.h.

59 {};

Member Function Documentation

◆ ClassDef()

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

◆ Exec()

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

Runs the task.

Uses the waveform simulator (BSEmcAbsWaveformSimulator) to generate a waveform from the deposit and fill the buffer (BSEmcWaveformBuffer).

Parameters
optunused
Returns
void

Definition at line 137 of file BSEmcMCDepositToTimebasedWaveforms.h.

138  {
139  LOG(debug) << "BSEmcMCDepositToTimebasedWaveforms<ParSet> " << fDetectorName << " Exec() ";
140  FairRootManager *ioman = FairRootManager::Instance();
141 
142  TStopwatch timer;
143  timer.Start();
144 
145  const BSEmcMCDeposit *theDeposit = nullptr;
146 
147  Int_t nDeposits = fMCDepositArray.GetSize();
148  LOG(debug) << "BSEmcMCDepositToTimebasedWaveforms<ParSet> " << fDetectorName << " Deposit array contains " << nDeposits << " deposits";
149 
150  for (Int_t iDeposit = 0; iDeposit < nDeposits; iDeposit++) {
151 
152  theDeposit = fMCDepositArray.GetConstElementPtr(iDeposit);
153  Double_t energy = theDeposit->GetEnergy();
154  if (energy == 0) {
155  continue;
156  }
157  LOG(debug3) << "deposit energy : " << energy;
158  if (fUse_photon_statistic) {
159  Double_t crystalPhotonsMeV = 1.0e3 * energy * fNPhotoElectronsPerMeV;
160  Double_t photonStatFactor = gRandom->Gaus(1, sqrt(fExcessNoiseFactor / crystalPhotonsMeV));
161  LOG(debug3) << "photonStatFactor: " << photonStatFactor;
162  energy *= photonStatFactor;
163  LOG(debug3) << "energy now: " << energy;
164  // energy *= 1e3;
165  LOG(debug3) << "energy now in MeV: " << energy;
166  }
167  // construct corresponding waveform data Object
168  BSEmcWaveformData wfData(theDeposit->GetDetectorID(), fSimulator);
170  // register deposit...timebased framework uses ns, whereas emc deals with seconds as time unit
171  FairLink linkToDeposit(-1, ioman->GetEntryNr(), fMCDepositBranchName, iDeposit, 1.0);
172  if (fActivateBuffering) {
173  wfData.AddDeposit(linkToDeposit, ioman->GetEventTime() + theDeposit->GetTime() * 1.0e9, energy);
174  } else {
175  wfData.AddDeposit(linkToDeposit, theDeposit->GetTime() * 1.0e9, energy);
176  }
177  LOG(debug) << "BSEmcMCDepositToTimebasedWaveforms " << fDetectorName << " adding deposit with event time " << ioman->GetEventTime()
178  << " and deposit time: " << theDeposit->GetTime() * 1.0e9 << " and energy: " << energy;
179  fWaveformBuffer->FillNewData(&wfData);
180  }
181  timer.Stop();
182  Double_t rtime = timer.RealTime();
183  Double_t ctime = timer.CpuTime();
184  LOG(debug) << "BSEmcMCDepositToTimebasedWaveforms, Real time " << rtime << " s, CPU time " << ctime << " s";
185  }
virtual T const * GetConstElementPtr(Int_t t_index) const
Get the Element object at t_index.
Int_t GetDetectorID() const
friend F32vec4 sqrt(const F32vec4 &a)
Definition: P4_F32vec4.h:28
represents the deposited energy of one emc crystal from simulation
virtual ssize_t GetSize() const final
Get the number of elements.
virtual void FillNewData(BSEmcWaveformData *)
virtual Double_t GetTime() const
represents a simulated waveform in an emc crystal, used by BSEmcFwEndcapTimebasedWaveforms ...
PndTCAConstContainer< BSEmcMCDeposit > fMCDepositArray
virtual Double_t GetEnergy() const
void SetOverlapTime(const Double_t t_overlap)

◆ Init()

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

Init Task.

Prepares the TClonesArray of BSEmcMCDeposit for reading and BSEmcMultiWaveform for writing. Also reads the EMC parameters.

Returns
InitStatus
Return values
kSUCCESSsuccess

Definition at line 71 of file BSEmcMCDepositToTimebasedWaveforms.h.

72  {
73 
75  if (fWaveformBranchName == "") {
77  }
78  if (fWaveformDataBranchName == "") {
80  }
81 
82  if (fSimulator == nullptr) {
83  LOG(debug) << "BSEmcMCDepositToTimebasedWaveforms for " << fMCDepositBranchName << " has no Simulator set. Calling SetupSimulator!";
86  }
87  if (fSimulator == nullptr) {
88  LOG(error) << "BSEmcMCDepositToTimebasedWaveforms for " << fMCDepositBranchName << " has no Simulator set. Aborting!";
89  exit(-1);
90  }
91 
92  // Get RootManager
93  FairRootManager *ioman = FairRootManager::Instance();
94  if (ioman == nullptr) {
95  LOG(error) << "BSEmcMCDepositToTimebasedWaveforms<ParSet>::Init: "
96  << "RootManager not instantiated!";
97  return kFATAL;
98  }
100  fMCDepositArray.SetTCA(dynamic_cast<TClonesArray *>(ioman->GetObject(fMCDepositBranchName)));
101  // Create and activiate output Buffer....choose between BSEmcWaveform and BSEmcMultiWaveform
102  fWaveformBuffer = new BSEmcWaveformBuffer(fWaveformBranchName, "BSEmcMultiWaveform", "Emc", GetPersistency());
103  LOG(debug) << "Using BSEmcMultiWaveform in WaveformBuffer.";
104 
105  fWaveformBuffer = (BSEmcWaveformBuffer *)ioman->RegisterWriteoutBuffer(fWaveformBranchName, fWaveformBuffer);
106  fWaveformBuffer->ActivateBuffering(fActivateBuffering);
107 
108  if (fStoreDataClass) {
110  }
111 
113 
114  if (fUse_photon_statistic) {
115  LOG(debug) << "BSEmcMCDepositToTimebasedWaveforms: " << fDetectorName << " using photon statistic";
119  } else {
121  fExcessNoiseFactor = 1;
122  }
124  LOG(debug) << "BSEmcMCDepositToTimebasedWaveforms::Init() for " << fMCDepositBranchName << " done.";
125  return kSUCCESS;
126  }
Int_t GetUseDigiEffectiveSmearingMode() const
Definition: BSEmcDigiPar.h:31
const std::string fgMultiWaveformBranchName
void SetTCA(TClonesArray *t_tca)
Set the TClonesArray address.
Double_t GetRearCrystalSurfaceArea() const
Definition: BSEmcDigiPar.h:38
virtual void StoreWaveformData(TString t_branchName, TString t_folderName, Bool_t t_persistance)
Double_t GetOverlapTime() const
Definition: BSEmcDigiPar.h:41
void SetMCDepositBranchName(const TString &t_branchname)
buffer for waveforms, used by BSEmcFwEndcapTimebasedWaveforms
const std::string fgWaveformDataBranchName
Double_t GetQuantumEfficiency() const
Definition: BSEmcDigiPar.h:35
Double_t GetSensitiveArea() const
Definition: BSEmcDigiPar.h:34
void SetBranchName(const TString &t_branchname)
Set the Branch Name.
PndTCAConstContainer< BSEmcMCDeposit > fMCDepositArray
const std::string fgMCDepositBranchName
Double_t GetDetectedPhotonsPerMeV() const
Definition: BSEmcDigiPar.h:33
Double_t GetExcessNoiseFactor() const
Definition: BSEmcDigiPar.h:36

◆ RunTimebased()

template<class ParSet>
void BSEmcMCDepositToTimebasedWaveforms< ParSet >::RunTimebased ( Bool_t  t_timebased = kTRUE)
inline

◆ SetParContainers()

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

Get parameter containers

Definition at line 199 of file BSEmcMCDepositToTimebasedWaveforms.h.

200  {
201  // Get run and runtime database
202  FairRun *run = FairRun::Instance();
203  if (run == nullptr) {
204  Fatal("SetParContainers", "No analysis run");
205  }
206  FairRuntimeDb *db = run->GetRuntimeDb();
207  if (db == nullptr) {
208  Fatal("SetParContainers", "No runtime database");
209  }
210  // Get Emc digitisation parameter container
211  if (fWaveformGenParName == "") {
212  fWaveformGenParName = ParSet::fgParameterName;
213  }
214  fDigiPar = dynamic_cast<ParSet *>(db->getContainer(fWaveformGenParName.c_str()));
215 
216  if (fPhotonStatisticParName == "") {
218  }
219  fPhotonStatisticPar = dynamic_cast<BSEmcDigiPar *>(db->getContainer(fPhotonStatisticParName.c_str()));
220  }
static const std::string fgParameterName
Definition: BSEmcDigiPar.h:26
ParSet * fDigiPar
Digitisation parameter container.
Container for runtime parameters that are required for the transformation from BSEmcMCDeposits to BSE...
Definition: BSEmcDigiPar.h:24

◆ SetPhotonStatisticParName()

template<class ParSet>
void BSEmcMCDepositToTimebasedWaveforms< ParSet >::SetPhotonStatisticParName ( const std::string &  t_photonStatParName)
inline

Definition at line 194 of file BSEmcMCDepositToTimebasedWaveforms.h.

◆ SetSimulator()

template<class ParSet>
void BSEmcMCDepositToTimebasedWaveforms< ParSet >::SetSimulator ( BSEmcAbsWaveformSimulator t_simulator)
inline

Definition at line 188 of file BSEmcMCDepositToTimebasedWaveforms.h.

188 { fSimulator = t_simulator; }

◆ SetStorageOfData()

template<class ParSet>
void BSEmcMCDepositToTimebasedWaveforms< ParSet >::SetStorageOfData ( Bool_t  t_storeWaves = kTRUE)
inline

Definition at line 189 of file BSEmcMCDepositToTimebasedWaveforms.h.

189 { SetPersistency(t_storeWaves); };
void SetPersistency(Bool_t val=kTRUE)

◆ SetupSimulator()

◆ SetWaveformBranchName()

template<class ParSet>
void BSEmcMCDepositToTimebasedWaveforms< ParSet >::SetWaveformBranchName ( const TString &  t_branchName)
inline

◆ SetWaveformDataBranchName()

template<class ParSet>
void BSEmcMCDepositToTimebasedWaveforms< ParSet >::SetWaveformDataBranchName ( const TString &  t_branchName)
inline

◆ SetWaveformGenParName()

template<class ParSet>
void BSEmcMCDepositToTimebasedWaveforms< ParSet >::SetWaveformGenParName ( const std::string &  t_waveformGenParName)
inline

Definition at line 195 of file BSEmcMCDepositToTimebasedWaveforms.h.

195 { fWaveformGenParName = t_waveformGenParName; }

◆ StoreDataClass()

template<class ParSet>
void BSEmcMCDepositToTimebasedWaveforms< ParSet >::StoreDataClass ( Bool_t  t_storeData = kTRUE)
inline

Method to specify whether waveforms are stored or not.

Definition at line 190 of file BSEmcMCDepositToTimebasedWaveforms.h.

Member Data Documentation

◆ fActivateBuffering

◆ fDetectorName

◆ fDigiPar

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

Digitisation parameter container.

Definition at line 238 of file BSEmcMCDepositToTimebasedWaveforms.h.

Referenced by BSEmcMCDepositToTimebasedWaveforms< BSEmcBwEndcapDigiPar >::SetParContainers().

◆ fExcessNoiseFactor

◆ fMCDepositArray

◆ fMCDepositBranchName

◆ fNPhotoElectronsPerMeV

◆ fOverlapTime

◆ fPhotonStatisticPar

◆ fPhotonStatisticParName

◆ fSimulator

◆ fStoreDataClass

◆ fUse_photon_statistic

◆ fWaveformBranchName

◆ fWaveformBuffer

template<class ParSet>
BSEmcWaveformBuffer* BSEmcMCDepositToTimebasedWaveforms< ParSet >::fWaveformBuffer {nullptr}
protected

◆ fWaveformDataBranchName

◆ fWaveformGenParName


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