FairRoot/PandaRoot
PndMdtDigitization.cxx
Go to the documentation of this file.
1 // -------------------------------------------------------------------------
2 // ----- PndMdtDigitization source file -----
3 // ----- author: Jifeng Hu, hu@to.infn.it
4 // -------------------------------------------------------------------------
5 
6 #include "PndMdtDigitization.h"
7 #include "PndMdtWaveform.h"
8 #include "PndMdtDigi.h"
9 #include "FairRootManager.h"
10 #include "FairRun.h"
11 #include "FairRunAna.h"
12 #include "FairRuntimeDb.h"
13 #include "TClonesArray.h"
14 #include "TVector3.h"
15 #include "TRandom.h"
16 #include <iostream>
17 #include "PndMdtIGeometry.h"
18 #include "FairEventHeader.h"
19 
20 using std::map;
21 using std::cout;
22 using std::endl;
23 
24 // ----- Default constructor -------------------------------------------
26  PndPersistencyTask(" MDT Digitization"), fTimeOrderedDigi(kFALSE)
27 {
28  SetVerbose(verbose);
29  SetPersistency(store);
30 }
31 // -------------------------------------------------------------------------
32 
33 // ----- Destructor ----------------------------------------------------
35 // -------------------------------------------------------------------------
36 
37 
38 
39 // ----- Public method Init --------------------------------------------
41 
42 
43  //FairRun* sim = FairRun::Instance(); //[R.K. 01/2017] unused variable?
44  //FairRuntimeDb* rtdb=sim->GetRuntimeDb(); //[R.K. 01/2017] unused variable?
45 
46  // Get RootManager
47  FairRootManager* ioman = FairRootManager::Instance();
48  if ( ! ioman ) {
49  cout << "-E- PndMdtDigitization::Init: "
50  << "RootManager not instantiated!" << endl;
51  return kFATAL;
52  }
53 
54  // Get input array
55  fWaveformArray = (TClonesArray*) ioman->GetObject("MdtWaveform");
56  if ( ! fWaveformArray ) {
57  cout << "-W- PndMdtDigitization::Init: "
58  << "No MdtWaveform array!" << endl;
59  return kERROR;
60  }
61 
62  if(fTimeOrderedDigi){
63  fDigiArray = ioman->Register("MdtDigi","PndMdtDigi","Mdt", GetPersistency());
64  }else{
65  // Create and register output array
66  fDigiBoxArray = ioman->Register("MdtDigiBox","PndMdtDigi","Mdt", GetPersistency());
67  fDigiStripArray = ioman->Register("MdtDigiStrip","PndMdtDigi","Mdt", GetPersistency());
68  }
69 
70  fWireNoiseSigma = 0.05;
71  fStripNoiseSigma = 0.01;
72  fSamplingInterval = 10.;//nano seconds
73 
75  fGeoIF->SetVerbose(3);
76  fGeoIF->AddSensor("MDT");
77  fGeoIF->AddSensor("GasCell");
78  Bool_t fGoodGeo = fGeoIF->Init();
79 
82  cout << "-I- PndMdtDigitization: Intialization "<<(fGoodGeo ? "successful." : "failed.") << endl;
83 
84  return fGoodGeo ? kSUCCESS : kERROR;
85 }
86 // -------------------------------------------------------------------------
87 
88 
89 
90 // ----- Public method Exec --------------------------------------------
91 void PndMdtDigitization::Exec(Option_t*)
92 {
94  exec_t();
95  else
96  exec_e();
97 }
99 {
100  // Reset output array
101  fDigiBoxArray->Delete();
102  fDigiStripArray->Delete();
103  Int_t evtNo = FairRunAna::Instance()->GetEventHeader()->GetMCEntryNumber();
104 
105  Int_t nWaveform = fWaveformArray->GetEntriesFast();
106  PndMdtWaveform* theWf(0);
107  Double_t fTimeStamp;
108  Double_t fAmplitude;
109 
110  for (Int_t iW=0; iW<nWaveform; iW++) {
111  theWf = (PndMdtWaveform*) fWaveformArray->At(iW);
112  if(theWf->IsWire()){
113  ++HowManyWireWf;
114  if(Digitize(theWf, fTimeStamp, fAmplitude, kTRUE)){
115  TVector3 fPos;
116  fGeoIF->GetTubeCenter(theWf->GetDetectorID(), fPos);
117  PndMdtDigi* aDigi = AddDigiBox(theWf->GetDetectorID(), fPos, evtNo);
118  aDigi->SetTimeStamp(theWf->GetTimeStamp() + fTimeStamp);
119  ++HowManyWireDigi;
120  }
121  }else{
122  ++HowManyStripWf;
123  if(Digitize(theWf, fTimeStamp, fAmplitude, kFALSE)){
124  TVector3 fPos;
125  fGeoIF->GetStripCenter(theWf->GetDetectorID(), fPos);
126  PndMdtDigi* aDigi = AddDigiStrip(theWf->GetDetectorID(), fPos, evtNo);
127  aDigi->SetTimeStamp(theWf->GetTimeStamp() + fTimeStamp);
129  }
130  }
131  }
132 
133 }
135 {
136  // Reset output array
137  fDigiArray->Delete();
138  Int_t evtNo = FairRunAna::Instance()->GetEventHeader()->GetMCEntryNumber();
139 
140  Int_t nWaveform = fWaveformArray->GetEntriesFast();
141  PndMdtWaveform* theWf(0);
142  Double_t fTimeStamp;
143  Double_t fAmplitude;
144 
145 
146  // cout<<"event no "<<evtNo<<", load in "<<nWaveform<<endl;
147  for (Int_t iW=0; iW<nWaveform; iW++) {
148  theWf = (PndMdtWaveform*) fWaveformArray->At(iW);
149  //theWf->print();
150  if(theWf->IsWire()){
151  ++HowManyWireWf;
152  if(Digitize(theWf, fTimeStamp, fAmplitude, kTRUE)){
153  TVector3 fPos;
154  fGeoIF->GetTubeCenter(theWf->GetDetectorID(), fPos);
155  PndMdtDigi* aDigi = AddDigi(theWf->GetDetectorID(), fPos, evtNo);
156  aDigi->SetTimeStamp(theWf->GetTimeStamp() + fTimeStamp);
157  ++HowManyWireDigi;
158  }
159  }else{
160  ++HowManyStripWf;
161  if(Digitize(theWf, fTimeStamp, fAmplitude, kFALSE)){
162  TVector3 fPos;
163  fGeoIF->GetStripCenter(theWf->GetDetectorID(), fPos);
164  PndMdtDigi* aDigi = AddDigi(theWf->GetDetectorID(), fPos, evtNo);
165  aDigi->SetTimeStamp(theWf->GetTimeStamp() + fTimeStamp);
167  }
168  }
169  }
170 
171 }
172 // -------------------------------------------------------------------------
173 
174 
175 // ----- Private method AddDigi --------------------------------------------
176 PndMdtDigi* PndMdtDigitization::AddDigiBox(Int_t detID, TVector3& pos, Int_t evtNo)
177 {
178  // It fills the PndMdtDigi category
179  TClonesArray& clref = *fDigiBoxArray;
180  Int_t size = clref.GetEntriesFast();
181  return new(clref[size]) PndMdtDigi(detID, pos, evtNo);
182 }
183 // ----
184 
185 
186 // ----- Private method AddDigi --------------------------------------------
187 PndMdtDigi* PndMdtDigitization::AddDigiStrip(Int_t detID, TVector3& pos, Int_t evtNo)
188 {
189  // It fills the PndMdtDigi category
190 
191  TClonesArray& clref = *fDigiStripArray;
192  Int_t size = clref.GetEntriesFast();
193  return new(clref[size]) PndMdtDigi(detID, pos, evtNo);
194 }
195 PndMdtDigi* PndMdtDigitization::AddDigi(Int_t detID, TVector3& pos, Int_t evtNo)
196 {
197  // It fills the PndMdtDigi category
198 
199  TClonesArray& clref = *fDigiArray;
200  Int_t size = clref.GetEntriesFast();
201  return new(clref[size]) PndMdtDigi(detID, pos, evtNo);
202 }
203 
204 // --- threshold digitization ---
206 {
207  time = -1;
208  amp = -9999;
209  Double_t fPeak = 0.;
210  Bool_t NotFound = kTRUE;
211  //Double_t fNoiseSigma; //[R.K. 01/2017] unused variable?
212  Double_t fThreshold(1e9);
213  if(isWire) fThreshold = 5.*fWireNoiseSigma;
214  else fThreshold = 5.*fStripNoiseSigma;
215 
216  const std::vector<Double_t>& fSignalData = theWf->GetSignal();
217  for(size_t is=0; is < fSignalData.size(); ++ is){
218  if(TMath::Abs(fSignalData[is]) > TMath::Abs(fPeak)) fPeak = fSignalData[is];
219  if(TMath::Abs(fSignalData[is]) > fThreshold && NotFound) {
220  time = is*fSamplingInterval;//nano seconds
221  NotFound = kFALSE;
222  }
223  }
224  amp = fPeak;
225  return time > 0;
226 }
227 
228 // ----
230 {
231  if(fTimeOrderedDigi){
232  Int_t nWaveform = fWaveformArray->GetEntriesFast();
233  if(fVerbose>0){
234  std::cout<<"PndMdtDigitization::FinishTask, fWaveformArray size #"<<nWaveform<<std::endl;
235  }
236  Exec("");
237  }
238 
239  std::cout<<"==================================================="<<std::endl;
240  std::cout<<"PndMdtDigitization::FinishTask"<<std::endl;
241  std::cout<<"***************************************************"<<std::endl;
242  std::cout<<"Read waveforms#"<<(HowManyWireWf+HowManyStripWf)<<endl;
243  std::cout<<"Produce digis#"<<(HowManyWireDigi+HowManyStripDigi)<<endl;
244  std::cout<<"\twire digis# "<<HowManyWireDigi<<" from "<<HowManyWireWf<<" waveforms."<<std::endl;
245  std::cout<<"\tstrip digis# "<<HowManyStripDigi<<" from "<<HowManyStripWf<<" waveforms."<<std::endl;
246  std::cout<<"***************************************************"<<std::endl;
247 }
248 
249 
TVector3 pos
int fVerbose
Definition: poormantracks.C:24
PndMdtDigi * AddDigiStrip(Int_t detID, TVector3 &pos, Int_t)
Int_t GetDetectorID() const
PndTransMap * map
Definition: sim_emc_apd.C:99
#define verbose
PndMdtDigi * AddDigi(Int_t detID, TVector3 &pos, Int_t evtNo)
const std::vector< Double_t > & GetSignal() const
void SetPersistency(Bool_t val=kTRUE)
PndMdtDigi * AddDigiBox(Int_t detID, TVector3 &pos, Int_t)
static T Abs(const T &x)
Definition: PndCAMath.h:39
Double_t
void AddSensor(TString _v)
vector< FitStore > store(3000)
static int is
Definition: ranlxd.cxx:374
void SetVerbose(Int_t _v)
virtual InitStatus Init()
static PndMdtIGeometry * Instance()
Bool_t GetStripCenter(Int_t iDetId, TVector3 &pos) const
virtual void Exec(Option_t *opt)
Bool_t Digitize(PndMdtWaveform *theWf, Double_t &time, Double_t &amp, Bool_t isWire)
PndMdtDigitization(Int_t verbose=0, Bool_t store=kTRUE)
ClassImp(PndAnaContFact)
drchit SetVerbose(iVerbose)
TClonesArray * fDigiStripArray
TClonesArray * fDigiBoxArray
TClonesArray * fDigiArray
Bool_t GetTubeCenter(Int_t iDetId, TVector3 &pos) const
PndMdtIGeometry * fGeoIF
Bool_t IsWire() const
TClonesArray * fWaveformArray