FairRoot/PandaRoot
PndEmcWaveformToCalibratedDigi.cxx
Go to the documentation of this file.
1 //----------------------------------------------------------------------
2 // File and Version Information:
3 // $Id: //
4 // Description:
5 // Class PndEmcWaveformToCalibratedDigi. Module to take the ADC waveforms and produces digi.
6 //
7 // Software developed for the BaBar Detector at the SLAC B-Factory.
8 // Adapted for the PANDA experiment at GSI
9 //
10 // Author List:
11 // Phil Strother Original Author
12 // Dima Melnichuk - adaption for PANDA
13 // Copyright Information:
14 // Copyright (C) 1996 Imperial College
15 //
16 //----------------------------------------------------------------------
17 
19 
20 #include "PndEmcWaveform.h"
21 #include "PndEmcDigi.h"
22 #include "PndEmcDigiPar.h"
23 #include "PndEmcRecoPar.h"
24 #include "PndEmcAsicPulseshape.h"
25 #include "PndEmcPSAParabolic.h"
28 
29 #include "FairRootManager.h"
30 #include "FairRunAna.h"
31 #include "FairRuntimeDb.h"
32 
33 #include "TClonesArray.h"
34 #include "TStopwatch.h"
35 
36 #include <iostream>
37 #include <fstream>
38 //#include <map>
39 
40 using std::cout;
41 using std::endl;
42 using std::fstream;
43 
45 {
47  fDigiPosMethod="depth";// "surface" or "depth"
49  SetPersistency(storedigis);
51  //fPndEmcDigiPositionDepth=6.2;
52 }
53 
54 //--------------
55 // Destructor --
56 //--------------
57 
59 {
60 }
61 
62 
64 {
65  // Get RootManager
66  FairRootManager* ioman = FairRootManager::Instance();
67  if ( ! ioman )
68  {
69  cout << "-E- PndEmcWaveformToCalibratedDigi::Init: "
70  << "RootManager not instantiated!" << endl;
71  return kFATAL;
72  }
73 
74  // Get input array
75  fWaveformArray = (TClonesArray*) ioman->GetObject("EmcWaveform");
76  if ( ! fWaveformArray ) {
77  cout << "-W- PndEmcWaveformToCalibratedDigi::Init: "
78  << "No PndEmcWaveform array!" << endl;
79  return kERROR;
80  }
81 
82  // Create and register output array
83  fDigiArray = new TClonesArray("PndEmcDigi");
84 
85  ioman->Register("EmcDigi","Emc",fDigiArray, GetPersistency());
98 
99  cout<<"fEmcDigiPositionDepthPWO: "<<fEmcDigiPositionDepthPWO<<endl;
100  cout<<"fEmcDigiPositionDepthShashlyk: "<<fEmcDigiPositionDepthShashlyk<<endl;
101 
102  if (!fDigiPosMethod.CompareTo("surface"))
103  {
105  }
106  else if (!fDigiPosMethod.CompareTo("depth"))
107  {
110  }
111  else
112  {
113  cout << "-W- PndEmcWaveformToCalibratedDigi::Init: "
114  << "Unknown digi position method!" << endl;
115  return kERROR;
116  }
117 
120 
121 
122  // Pulse shape analysis algorithm.
123  // Simple parabolic fit.
124  //psaAlgorithm = new PndEmcPSAParabolic();
125 
126  // Matched digital filter
127  // Parameters of the filter are hardcoded at the moment
128  // For different pulseshape in barrel and endcaps different filters should be implemented
129  std::vector<Double_t> params;
130  params.push_back(30); // width
131  params.push_back(fSampleRate); // Sample rate
133 
134 // std::vector<Double_t> params2;
135 // params2.push_back(30); // width
136 // params2.push_back(fSampleRate_PMT); // Sample rate
138 
139  // Determine normalisation constant for PndEmcWaveform
140  PndEmcWaveform *tmpwaveform=new PndEmcWaveform(0,101010001, fNumber_of_samples_in_waveform);
141  PndEmcWaveform *tmpwaveform2=new PndEmcWaveform(0,101010001, fNumber_of_samples_in_waveform_pmt);
142 
143  PndEmcHit *gevHit=new PndEmcHit();
144  gevHit->SetEnergy(1.0);
145  gevHit->SetTime(0.);
146  tmpwaveform->UpdateWaveform(gevHit, 0, false, 1., 0., fSampleRate, fPulseshape);
147  tmpwaveform2->UpdateWaveform(gevHit, 0, false, 1., 0., fSampleRate_PMT, fPulseshape_pmt);
148  Double_t tmpPeakPosition;
149  Double_t tmpPeakPosition2;
150  psaAlgorithm->Process(tmpwaveform,fWfNormalisation,tmpPeakPosition);
151  psaAlgorithm_pmt->Process(tmpwaveform2,fWfNormalisation_pmt,tmpPeakPosition2);
152 
155 
156  if(fCalibrationFileName !="")
158 
159  cout << "-I- PndEmcWaveformToCalibratedDigi: Read "<< fCalibrationMap.size() << " Calibration Entries" << endl;
160 
161  cout << "-I- PndEmcWaveformToCalibratedDigi: Intialization successfull" << endl;
162 
163  return kSUCCESS;
164 }
165 
167 {
168  TStopwatch timer;
169  if (fVerbose>2){
170  timer.Start();
171  }
172 // Reset output array
173  if ( ! fDigiArray ) Fatal("Exec", "No Digi Array");
174  fDigiArray->Delete();
175  Double_t peakPosition;
177  Double_t digi_time;
178  Int_t i_digi=0; //index of digi in TClonesArray
179  Int_t hitIndex;
180  Int_t nHits;
181  Int_t detId;
182  Int_t trackId;
183  //Int_t module; //[R.K. 03/2017] unused variable?
184  Int_t nWaveforms = fWaveformArray->GetEntriesFast();
185  //cout<<"PndEmcWaveformToCalibratedDigi: "<<nWaveforms<<" waveforms to convert"<<endl;
186  for (Int_t iWaveform=0; iWaveform<nWaveforms; iWaveform++) {
187  PndEmcWaveform* theWaveform = (PndEmcWaveform*) fWaveformArray->At(iWaveform);
188  hitIndex=theWaveform->GetHitIndex();
189  detId=theWaveform->GetDetectorId();
190  trackId=theWaveform->GetTrackId();
191  //module=theWaveform->GetModule(); //[R.K. 03/2017] unused variable?
192  // Determine waveform maximum and its position
193 /* if(module==5){
194  psaAlgorithm_pmt->Process(theWaveform,energy,peakPosition);
195  energy/=fWfNormalisation_pmt;
196  digi_time=peakPosition/fSampleRate_PMT;
197 
198  }
199  else{
200  psaAlgorithm->Process(theWaveform,energy,peakPosition);
201  energy/=fWfNormalisation;
202  digi_time=peakPosition/fSampleRate;
203  }
204  */
205  nHits = psaAlgorithm_proto192->Process(theWaveform);
206  for(Int_t i = 0; i< nHits; i++){
207  psaAlgorithm_proto192->GetHit(i,energy,peakPosition);
209  digi_time = peakPosition/fSampleRate * 1E9; //units for timestamp are ns
210  std::map<Int_t,Double_t>::iterator it;
211  it = fCalibrationMap.find(detId);
212  if(it!=fCalibrationMap.end()){
213  // std::cout << "found calibration value for hitindex " << hitIndex << std::endl;
214  energy/=it->second;
215  }
216  // std::cout << "energy: " << energy << " threshold: "<< fEnergyDigiThreshold << endl;
217  // std::cout << "creating digi for detid: " << detId << "hitindex: " << hitIndex <<std::endl;
218  if (energy>fEnergyDigiThreshold)
219  {
220  // std::cout << "energy: " << energy << endl;
221  PndEmcDigi* myDigi = new((*fDigiArray)[i_digi]) PndEmcDigi(trackId,detId, energy, digi_time, hitIndex);
222  myDigi->AddLink(FairLink("EmcWaveform", iWaveform));
223  i_digi++;
224 
225  }
226  }
227  }
228  if (fVerbose>2){
229  timer.Stop();
230  Double_t rtime = timer.RealTime();
231  Double_t ctime = timer.CpuTime();
232  cout << "PndEmcWaveformToCalibratedDigi, Real time " << rtime << " s, CPU time " << ctime << " s" << endl;
233  }
234 
235 }
236 
238 
239  // Get run and runtime database
240  FairRun* run = FairRun::Instance();
241  if ( ! run ) Fatal("SetParContainers", "No analysis run");
242 
243  FairRuntimeDb* db = run->GetRuntimeDb();
244  if ( ! db ) Fatal("SetParContainers", "No runtime database");
245 
246  // Get Emc digitisation parameter container
247  fDigiPar = (PndEmcDigiPar*) db->getContainer("PndEmcDigiPar");
248 
249  // Get Emc reconstruction parameter container
250  fRecoPar = (PndEmcRecoPar*) db->getContainer("PndEmcRecoPar");
251 
252 }
253 
255 {
256  SetPersistency(val);
257  return;
258 }
259 
261  std::ifstream in(fCalibrationFileName,std::ifstream::in);
262 // in.open(fCalibrationFileName);
263  if (!in.good()) {
264  std::cerr << "Cannot open calibration file!" << endl;
265  return;
266  }
267 
268  char buf[255];
269  while (in.getline(buf, 255)) {
270  TString tmp = buf;
271  TObjArray *tokens = tmp.Tokenize(" \t;");
272  if(tokens->GetEntries()<2){
273  continue;
274  }
275  tmp=tokens->UncheckedAt(0)->GetName();
276  TString tmp2 = tokens->UncheckedAt(1)->GetName();
277  if(tmp.IsDigit() && tmp2.IsFloat()){
278  fCalibrationMap.insert(std::pair<Int_t,Double_t>(tmp.Atoi(),tmp2.Atof()));
279 
280  }
281  }
282 }
283 
284 
Double_t GetEmcDigiPositionDepthShashlyk()
Definition: PndEmcRecoPar.h:25
Double_t GetSampleRate()
Definition: PndEmcDigiPar.h:39
Double_t GetPMT_Shaping_diff_time()
Definition: PndEmcDigiPar.h:33
static void selectDigiPositionMethod(PositionMethod, double positionDepthPWO=0., double positionDepthShahslyk=0., double rescaleFactor=1.)
Definition: PndEmcDigi.cxx:153
Int_t run
Definition: autocutx.C:47
Int_t GetNumber_of_samples_in_waveform()
Definition: PndEmcDigiPar.h:44
Pulseshape analysis for ADC waveforms.
represents the reconstructed hit of one emc crystal
Definition: PndEmcDigi.h:40
Int_t i
Definition: run_full.C:25
Double_t val[nBoxes][nFEBox]
Definition: createCalib.C:11
#define verbose
virtual Int_t Process(const PndEmcWaveform *waveform)=0
Find Hits in Waveform.
Double_t GetCrystal_time_constant()
Definition: PndEmcDigiPar.h:36
Int_t GetHitIndex() const
void SetPersistency(Bool_t val=kTRUE)
Pulseshape analysis for ADC waveforms.
virtual void GetHit(Int_t i, Double_t &energy, Double_t &time)=0
Get energy and time of hit.
Double_t GetASIC_Shaping_int_time()
Definition: PndEmcDigiPar.h:31
Pulseshape from an CRRC-Shaper.
Double_t GetEnergyDigiThreshold()
Definition: PndEmcDigiPar.h:42
int nHits
Definition: RiemannTest.C:16
Pulseshape from an APFEL ASIC preamplifier shaper.
Double_t
int GetTrackId() const
TStopwatch timer
Definition: hit_dirc.C:51
PndEmcWaveformToCalibratedDigi(Int_t verbose=0, Bool_t storedigis=kTRUE)
parameter set of Emc digitisation
Definition: PndEmcDigiPar.h:12
void UpdateWaveform(PndEmcHit *hit, Double_t pePerMeV, Bool_t usePhotonStatistic, Double_t excessNoiseFactor, Double_t firstADCBinTime, Double_t sampleRate, PndEmcAbsPulseshape *pulseshape, Double_t=0)
virtual void SetEnergy(Double32_t energy)
Definition: PndEmcHit.h:50
long GetDetectorId() const
represents a simulated waveform in an emc crystal
Double_t ctime
Definition: hit_dirc.C:114
represents the deposited energy of one emc crystal from simulation
Definition: PndEmcHit.h:26
Pulseshape analysis for ADC waveforms.
ClassImp(PndAnaContFact)
Double_t GetSampleRate_PMT()
Definition: PndEmcDigiPar.h:40
Double_t rtime
Definition: hit_dirc.C:113
virtual void SetTime(Double32_t time)
Definition: PndEmcHit.h:51
Double_t GetShashlyk_time_constant()
Definition: PndEmcDigiPar.h:37
Int_t GetNumber_of_samples_in_waveform_pmt()
Definition: PndEmcDigiPar.h:45
Double_t GetPMT_Shaping_int_time()
Definition: PndEmcDigiPar.h:32
Parameter set for Emc Reco.
Definition: PndEmcRecoPar.h:12
Module to take the hit list for the calorimeter and make ADC waveforms from them. ...
Double_t energy
Definition: plot_dirc.C:15
Double_t GetEmcDigiPositionDepthPWO()
Definition: PndEmcRecoPar.h:24