FairRoot/PandaRoot
PndDrcTimeDigiTask.cxx
Go to the documentation of this file.
1 // -------------------------------------------------------------------------
2 // ----- PndDrcTimeDigiTask source file -----
3 // ----- HARPHOOL KUMAWAT h.kumawat@gsi.de -----
4 // ----- -----
5 // -------------------------------------------------------------------------
6 #include <fstream>
7 #include <iostream>
8 #include <map>
9 #include "stdio.h"
10 
11 #include "TGeoManager.h"
12 
13 #include "FairRootManager.h"
15 #include "PndDrcTimeDigiTask.h"
16 #include "PndDrcDigi.h"
17 #include "PndDrcPDPoint.h"
18 #include "PndDrcBarPoint.h"
19 #include "PndMCTrack.h"
20 #include "FairHit.h"
21 
22 #include "FairRunAna.h"
23 #include "FairRuntimeDb.h"
24 #include "FairGeoVector.h"
25 #include "FairGeoNode.h"
26 #include "FairGeoVolume.h"
27 
28 #include "TVector3.h"
29 #include "TRandom.h"
30 #include "TString.h"
31 #include "TGeoBBox.h"
32 #include "TCanvas.h"
33 
34 #include "FairBaseParSet.h"
35 #include "FairGeoTransform.h"
36 
37 #include "PndGeoDrcPar.h"
38 
39 using std::endl;
40 using std::cout;
41 
42 // ----- Default constructor -------------------------------------------
44 :PndPersistencyTask("PndDrcTimeDigiTask")
45 {
46  fGeo = new PndGeoDrc();
47  fGeoH = NULL;
48  SetParameters();
49  fisDetEff= kTRUE;
50  fisPixel= kTRUE;
51  fChargeSharing=kTRUE;
52  fTimeSmearing= kTRUE;
53 
54  fPDPointArray = NULL;
55  fTimeOrderedDigi =kFALSE;// kTRUE;
56  fDrcDigiArray = NULL;
57  fDrcTimeDigiArray = NULL;
58  Reset();
59 }
60 // -------------------------------------------------------------------------
61 
62 // ----- Standard constructor with verbosity level -------------------------------------------
63 
65  :PndPersistencyTask("PndDrcTimeDigiTask",verbose)
66 {
67  fVerbose = verbose;
68  fDetType= 1;
69  fisDetEff= kTRUE;
70  fisPixel= kTRUE;
71  fGeo = new PndGeoDrc();
72  fGeoH = NULL;
73  SetParameters();
74 
75  fPDPointArray = NULL;
76  fTimeOrderedDigi=kFALSE;//kTRUE;
77  fDrcDigiArray = NULL;
78  fDrcTimeDigiArray = NULL;
79  Reset();
80 }
81 // -------------------------------------------------------------------------
82 
83 
84 // ----- Destructor ----------------------------------------------------
86 {
87  if (fGeo) delete fGeo;
88  if ( fDrcDigiArray ) {
89  fDrcDigiArray->Delete();
90  delete fDrcDigiArray;
91  }
92  Reset();
93 
94 }
95 
96 // ----- Initialization -----------------------------------------------
97 // -------------------------------------------------------------------------
99 {
100  cout << " ---------- INITIALIZATION ------------" << endl;
101  nevents = 0;
102 
103  // Get RootManager
104  FairRootManager* ioman = FairRootManager::Instance();
105 if ( ! ioman ) {
106  cout << "-E- PndDrcTimeDigiTask::Init: "
107  << "RootManager not instantiated!" << endl;
108  return kFATAL;
109  }
110 
111  // PndGeoHandling
112  if ( fGeoH == NULL )
114 
116  if(fVerbose>1) Info("SetParContainers","done.");
117 
118  // Get input array
119  fMCArray = (TClonesArray*) ioman->GetObject("MCTrack");
120  if ( ! fMCArray ) {
121  cout << "-W- PndDrcRecoLookupMap::Init: "
122  << "No MCTrack array!" << endl;
123  return kERROR;
124  }
125 
126  // Get input array
127  fBarPointArray = (TClonesArray*) ioman->GetObject("DrcBarPoint");
128  if ( ! fBarPointArray ) {
129  cout << "-W- PndDrcTimeDigiTask::Init: "
130  << "No DrcBarPoint array!" << endl;
131  return kERROR;
132  }
133 
134  // Get Photon point array
135  fPDPointArray = (TClonesArray*) ioman->GetObject("DrcPDPoint");
136  if ( ! fPDPointArray ) {
137  cout << "-W- PndDrcAna::Init: "
138  << "No DrcPDPoint array!" << endl;
139  return kERROR;
140  }
141  fDrcDigiArray = new TClonesArray("PndDrcDigi");
142  ioman->Register("DrcDigiNormal","Drc",fDrcDigiArray, kFALSE);
143 
144  // Create and register output array
145  fDrcTimeDigiArray = new PndDrcDigiWriteoutBuffer("DrcDigi","PndDrc", GetPersistency());
146  fDrcTimeDigiArray = (PndDrcDigiWriteoutBuffer*)ioman->RegisterWriteoutBuffer("DrcDigi", fDrcTimeDigiArray);
147  fDrcTimeDigiArray->ActivateBuffering(fTimeOrderedDigi);
148 
149  cout << "-I- PndDrcTimeDigiTask: Intialization successfull" << endl;
150 
151  return kSUCCESS;
152 }
153 // ----- Execution of Task ---------------------------------------------
154 void PndDrcTimeDigiTask::Exec(Option_t*) // ion //[R.K.03/2017] unused variable(s)
155 {
156  fTimeMap.clear();
157  Reset();
158  fDrcDigiArray->Delete();
159  nevents++;
160  fPileup=0;
161  //Int_t PDHIT = fPDPointArray->GetEntriesFast(); //[R.K. 01/2017] unused variable?
162 // if (fVerbose > 0) if(nevents%10==0)
163 // cout<<"event time "<<FairRootManager::Instance()->GetEventTime()<<endl;
164  // Reset output array
166 
167  if (fVerbose > 1) {
168  cout <<" Number of Photon MC Points in Photon Detector Plane : "<<fPDPointArray->GetEntries()<<endl;
169  }
170 
171  //Loop over PndDrcPDPoints
172  if (fVerbose == 0) cout<<"-I- PndDrcTimeDigiTask: PD points "<< fPDPointArray->GetEntriesFast() <<endl;
173  for(Int_t k=0; k < fPDPointArray->GetEntriesFast(); k++) {
174 
175  fPpt = (PndDrcPDPoint*)fPDPointArray->At(k);
176 
177  Int_t trID= fPpt->GetTrackID();
178  if(trID<0) continue;
179  fMCtrk = (PndMCTrack*)fMCArray->At(trID);
180  Int_t trMrID= fMCtrk->GetMotherID();
181  fMrIdPho = trMrID;
183 
184  PndMCTrack* fMCtrk1 = (PndMCTrack*)fMCArray->At(trMrID);
185  fPdg = fMCtrk1->GetPdgCode();
186  fMrId = fMCtrk1->GetMotherID();
187  //Int_t NbouncesX, NbouncesY; //[R.K. 01/2017] unused variable?
188  //Double_t angleX, angleY; //[R.K. 01/2017] unused variable?
189  Int_t BarId=-1;
190  fTrackId= trID;
191  fTrackMom.SetXYZ(fMCtrk1->GetMomentum().X(),fMCtrk1->GetMomentum().Y(),fMCtrk1->GetMomentum().Z());
192  if(fPpt->GetBarPointID()!=-1){
194  BarId = fBarPoint->GetDetectorID();
197  // start vertex of the photon
198  TVector3 StartVertex = fMCtrk->GetStartVertex();
199  fTrackIniVertex = StartVertex;
200  // initial direction of the photon in the bar coord system
201  TVector3 PphoInitBar = fGeoH->MasterToLocalShortId(fMCtrk->GetMomentum(), BarId)- fGeoH->MasterToLocalShortId(TVector3(0.,0.,0.),BarId); // vector
202  }
203 
204 
205 
206  //Double_t PPx= fPpt->GetPx(); //[R.K. 01/2017] unused variable?
207  //Double_t PPy= fPpt->GetPy(); //[R.K. 01/2017] unused variable?
208  //Double_t PPz= fPpt->GetPz(); //[R.K. 01/2017] unused variable?
209 
210  //Double_t etot = sqrt(PPx*PPx + PPy*PPy +PPz*PPz);// in GeV //[R.K. 01/2017] unused variable?
211  //Double_t lambda=197.0*2.0*fpi/(etot*1.0E9);//wavelength of photon in nm //[R.K. 01/2017] unused variable?
212 
213  //####################################
214  // transport efficiency
215  if(BarId != -1){
216  fDetection=1;
217  }
218 
219  if(fDetection==1){
220 
221  // transform to local sensor system... (mc point has the ID not the path to the volume)
222  TVector3 PptPosition;
223  fPpt->Position(PptPosition);
224  TVector3 posL = fGeoH->MasterToLocalShortId(PptPosition,fPpt->GetDetectorID()); // point
225  TVector3 sensorDim = GetSensorDimensions(fPpt->GetDetectorID());
226 
227  //usually sensors have origin in the middle, let's move it to the left lower corner:
228  TVector3 posLshifted = posL + sensorDim;
229 
230  // calculate the number of the fired pixel
231  Int_t Ncol = (Int_t)TMath::Floor(posLshifted.X()/fPixelStep);
232  Int_t Nrow = (Int_t)TMath::Floor(posLshifted.Y()/fPixelStep);
233  Int_t NpixelLocal = Ncol + Nrow * fNpix;
234 
235  fDetectorID = fPpt->GetDetectorID() * 100 + NpixelLocal;;
236  Int_t mcpId = fPpt->GetMcpId();
237 
238  Int_t sensorId = mcpId * 100 + NpixelLocal;
239 
240  // time is smeared and digitized = has granularity
241  fTime=(Int_t)(fPpt->GetTime()/fTimeGranularity)*fTimeGranularity;
242 
244  fEventTime = FairRootManager::Instance()->GetEventTime();
245  if(fTimeSmearing == kTRUE) Smear(fTime,fSigmat);
246 
247  ActivatePixel(fDetectorID, sensorId, fTime, k, 0);
248 
249  if(fChargeSharing == kTRUE){
250  // find fired pixels:
251  Double_t distance = 999.;
252  TVector3 corner;
253  TVector3 point;
254 
255  // left pixel
256  distance = posLshifted.X() - TMath::Floor(posLshifted.X()/fPixelStep)*fPixelStep; //[cm]
257  if(exp(- distance/fPixelSigma) > gRandom->Uniform(0.,1.) && exp(- distance/fPixelSigma) > fThreshold){
258  if((Ncol-1) >= 0){
259  ActivatePixel(fDetectorID, mcpId * 100 +Ncol-1+Nrow*fNpix, fTime, k, 1);
260  }
261  }
262  // right pixel
263  distance = TMath::Ceil(posLshifted.X()/fPixelStep)*fPixelStep - posLshifted.X();
264  if(exp(- distance/fPixelSigma) > gRandom->Uniform(0.,1.) && exp(- distance/fPixelSigma) > fThreshold){
265  if(Ncol+1 < fNpix){
266  ActivatePixel(fDetectorID, mcpId * 100 +Ncol+1+Nrow*fNpix, fTime, k, 1);
267  }
268  }
269  // lower pixel
270  distance = posLshifted.Y() - TMath::Floor(posLshifted.Y()/fPixelStep)*fPixelStep;
271  if(exp(- distance/fPixelSigma) > gRandom->Uniform(0.,1.) && exp(- distance/fPixelSigma) > fThreshold){
272  if(Nrow-1 >= 0){
273  ActivatePixel(fDetectorID, mcpId * 100 +Ncol+(Nrow-1)*fNpix, fTime, k, 1);
274  }
275  }
276  // upper pixel
277  distance = TMath::Ceil(posLshifted.Y()/fPixelStep)*fPixelStep - posLshifted.Y();
278  if(exp(- distance/fPixelSigma) > gRandom->Uniform(0.,1.) && exp(- distance/fPixelSigma) > fThreshold){
279  if(Nrow+1 < fNpix){
280  ActivatePixel(fDetectorID, mcpId * 100 +Ncol+(Nrow+1)*fNpix, fTime, k, 1);
281  }
282  }
283 
284  point.SetXYZ(posLshifted.X(),posLshifted.Y(),0.);
285 
286  // upper left pixel
287  corner.SetXYZ(TMath::Floor(posLshifted.X()/fPixelStep)*fPixelStep,
288  TMath::Ceil(posLshifted.Y()/fPixelStep)*fPixelStep,0.);
289  distance = (point-corner).Mag();
290  if(exp(-distance/fPixelSigma) > gRandom->Uniform(0.,1.) && exp(- distance/fPixelSigma) > fThreshold){
291  if(Ncol-1 >= 0 && Nrow+1 < fNpix){
292  ActivatePixel(fDetectorID, mcpId * 100 +Ncol-1+(Nrow+1)*fNpix, fTime, k, 1);
293 
294  }
295  }
296 
297  // bottom left pixel
298  corner.SetXYZ(TMath::Floor(posLshifted.X()/fPixelStep)*fPixelStep,
299  TMath::Floor(posLshifted.Y()/fPixelStep)*fPixelStep,0.);
300  distance = (point-corner).Mag();
301  if(exp(-distance/fPixelSigma) > gRandom->Uniform(0.,1.) && exp(- distance/fPixelSigma) > fThreshold){
302  if(Ncol-1 >= 0 && Nrow-1 >= 0){
303  ActivatePixel(fDetectorID, mcpId * 100 +Ncol-1+(Nrow-1)*fNpix, fTime, k, 1);
304  }
305  }
306 
307  // bottom right pixel
308  corner.SetXYZ(TMath::Ceil(posLshifted.X()/fPixelStep)*fPixelStep,
309  TMath::Floor(posLshifted.Y()/fPixelStep)*fPixelStep,0.);
310  distance = (point-corner).Mag();
311  if(exp(-distance/fPixelSigma) > gRandom->Uniform(0.,1.) && exp(- distance/fPixelSigma) > fThreshold){
312  if(Ncol+1 < fNpix && Nrow-1 >= 0){
313  ActivatePixel(fDetectorID, mcpId * 100 +Ncol+1+(Nrow-1)*fNpix, fTime, k, 1);
314  }
315  }
316 
317  // upper right pixel
318  corner.SetXYZ(TMath::Ceil(posLshifted.X()/fPixelStep)*fPixelStep,
319  TMath::Ceil(posLshifted.Y()/fPixelStep)*fPixelStep,0.);
320  distance = (point-corner).Mag();
321  if(exp(-distance/fPixelSigma) > gRandom->Uniform(0.,1.) && exp(- distance/fPixelSigma) > fThreshold){
322  if(Ncol+1 < fNpix && Nrow+1 < fNpix){
323  ActivatePixel(fDetectorID, mcpId * 100 +Ncol+1+(Nrow+1)*fNpix, fTime, k, 1);
324  }
325  }
326  } // if charge sharing true
327  } // if detection
328  }
329 }
330 
331 // ----- Private method ActivatePixel -------------------------------
332 void PndDrcTimeDigiTask::ActivatePixel(Int_t detectorId, Int_t sensorId, Double_t signalTime, Int_t k, Int_t csflag) {
333  // in case when the same pixel was fired by two different photons this function takes care of which hits from that pixel to write
334  if ( fPixelMap.find(sensorId) == fPixelMap.end() )
335  {
336  // pixel not yet active, create new digi
337 
338  PndDrcDigi* Digi = new PndDrcDigi(k, detectorId, sensorId, 0., fTimeOfFlight, csflag, 0.);
339  Digi->SetTimeStamp(signalTime);
340  Digi->SetTimeStampError(fSigmat/TMath::Sqrt(fSigmat));
341  Digi->SetBarID(fBarId);
342  Digi->SetBoxID(fBoxId);
343  Digi->SetTrackID(fTrackId);
345  Digi->SetMotherID(fMrId);
346  Digi->SetMotherIDPho(fMrIdPho);
347  Digi->SetPdgCode(fPdg);
348  Digi->SetTrackMom(fTrackMom);
349  Digi->SetTimeAtBar(fTimeAtBar);
350  Digi->SetEvtTim(signalTime);
351  Digi->SetEventTim(fEventTime);
352  Digi->SetEventNo(nevents);
353  fDrcTimeDigiArray->FillNewData(Digi, signalTime, signalTime + fActiveTime);
354  fPixelMap[sensorId] = fNDigis;
355  fTimeMap[sensorId] = signalTime;
356  fNDigis++;
357  Digi->SetLink(FairLink("PndDrcPDPoint", k));
358  }
359  else {
360  //Int_t iDigi = fPixelMap[sensorId]; //[R.K. 01/2017] unused variable?
361 
362  if(fabs(fTimeMap.find(sensorId)->second-signalTime)<5.0){
363  fPileup++;
364 }
365  {
366  PndDrcDigi* digi = new PndDrcDigi(k, detectorId, sensorId, 0., fTimeOfFlight, csflag, 0.);
367  digi->SetTimeStamp(signalTime);
368  digi->SetTimeStampError(fSigmat/TMath::Sqrt(fSigmat));
369  digi->SetBarID(fBarId);
370  digi->SetBoxID(fBoxId);
371  digi->SetTrackID(fTrackId);
373  digi->SetMotherID(fMrId);
374  digi->SetMotherIDPho(fMrIdPho);
375  digi->SetPdgCode(fPdg);
376  digi->SetTrackMom(fTrackMom);
377  digi->SetTimeAtBar(fTimeAtBar);
378  digi->SetEvtTim(signalTime);
379  digi->SetEventTim(fEventTime);
380  digi->SetEventNo(nevents);
381  fDrcTimeDigiArray->FillNewData(digi, signalTime, signalTime + fActiveTime);
382  fPixelMap[sensorId] = fNDigis;
383  fTimeMap[sensorId] = signalTime;
384  fNDigis++;
385  fPileup=0.0;
386  }
387  }
388 }
389 
390 //----------------------------------------------------------------------------------------------
392 
393  TVector3 hit;
394  hit.SetXYZ(xx,yy,0.);
395  Double_t startPhi = hit.Phi()/fpi*180.; // [degrees]
396  if(startPhi < 0.){startPhi = 360. + hit.Phi()*180./fpi;}
397 
398  Double_t PhiRot = 0.; //[degrees]
399  if(startPhi >= 0. && startPhi < 90.){
400  PhiRot = TMath::Floor(startPhi/fdphi) *fdphi + fdphi/2.;
401  }
402  if(startPhi >= 90. && startPhi < 270.){
403  PhiRot = 90. + fpipehAngle + TMath::Floor((startPhi-90.-fpipehAngle)/fdphi) *fdphi + fdphi/2.;
404  }
405  if(startPhi >= 270. && startPhi < 360.){
406  PhiRot = 270. + fpipehAngle + TMath::Floor((startPhi-270.-fpipehAngle)/fdphi) *fdphi + fdphi/2.;
407  }
408  //cout<<"-I- FindPhiRot: PhiRot = "<<PhiRot<<endl;
409  return PhiRot; // degrees
410 }
411 
412 //----------------------------------------------------------------------------------------------------------
414  Double_t m=99.;
415  Double_t n=TMath::Floor(x0/a);
416  m = n;
417  if(print){std::cout<<"n = "<<n<<", NN = "<<*NN<<", x0 = "<<x0<<", a = "<<a<<std::endl;}
418  Double_t x1 = x0 - n*a;
419  if(x0 < 0.){x1 = x0 - (n+1)*a;}
420  if(print){std::cout<<"xy = "<< x1<<std::endl;}
421  Double_t xK = 0.;
422  if((m/2. - TMath::Floor(m/2.)) == 0.) { // 4etnoe
423  if(print){std::cout<<"odd==0"<<std::endl;}
424  if(x0 >= 0. && x1 + xEn <= a){xK = x1 + xEn;}
425  if(x0 >= 0. && x1 + xEn > a){xK = 2*a - x1 - xEn; n = 1. + n;}
426  if(x0 < 0. && x1 + xEn >= 0.){xK = a - (x1 + xEn); n = -1. -n;}
427  if(x0 < 0. && x1 + xEn < 0.) {xK = a + x1 + xEn; n = -n;}
428  if(print){std::cout<<"xK = "<< xK<<", n = "<<n<<std::endl;}
429 
430  }
431 
432  if((m/2. - TMath::Floor(m/2.)) != 0.) { // ne4etnoe
433  if(print){std::cout<<"even!=0"<<std::endl;}
434  if(x0 >= 0. && x1 + xEn <= a){xK = a - (x1 + xEn);}
435  if(x0 >= 0. && x1 + xEn > a){xK = x1 + xEn - a; n = 1. + n;}
436  if(x0 < 0. && x1 + xEn >= 0.){xK = x1 + xEn; n = -1. -n;}
437  if(x0 < 0. && x1 + xEn < 0.) {xK = - (x1 + xEn); n = -n;}
438  if(print){std::cout<<"xK = "<< xK<<", n = "<<n<<std::endl;}
439 
440  }
441 
442  *NN = n;
443  return xK;
444 }
445 
446 
447 // ----- Add Photon Detector Hit to HitCollection --------------------------------------
448 
449 PndDrcDigi* PndDrcTimeDigiTask::AddDrcDigi(Int_t index, Int_t iDetectorId, Double_t charge, Double_t time, Int_t csflag)
450 {
451  TClonesArray& clrefPD = *fDigis;
452  Int_t size = clrefPD.GetEntriesFast();
453  return new(clrefPD[size]) PndDrcDigi(index, iDetectorId, iDetectorId, charge, time, csflag, 0.);
454 }
455 
456 //-------------------------------------------------------------------------------
458 {
459  if (fDetType == 1){
460 
462  flambda_min = 300.;
463  flambda_max = 700.;
464  flambda_step = 400.;
465 
466  fDetEfficiency[0] = 1.;
467  fDetEfficiency[1] = 1.;
468  }
469  else {
470  cout << "ERROR: photocathode type not specified" << endl;
471 
472  flambda_min = 300.;
473  flambda_max = 700.;
474  flambda_step = 400.;
475 
476  fDetEfficiency[0] = 0.;
477  }
478 }
479 
480 
481 //------------------------------------------------------------------------------------
482 
484 
485  // refraction index of fused silica as a function of wavelength
486  Double_t par0 = 0.696;
487  Double_t par1 = 0.068;
488  Double_t par2 = 0.407;
489  Double_t par3 = 0.116;
490  Double_t par4 = 0.897;
491  Double_t par5 = 9.896;
492 
493  return sqrt(1.+
494  (par0*x*x/(x*x-par1*par1))+
495  (par2*x*x/(x*x-par3*par3))+
496  (par4*x*x/(x*x-par5*par5)));
497 }
498 
500  // reflection probability according to the scalar theory (PhD Thesis R.Hohler)
501  Double_t par0 = fRoughness;
502  return 1. - pow(4.*3.14159*cos(y)*par0*FuncD1(x)/x,2);
503 }
504 
505 //--------------------------------------------------------------
507  gGeoManager->cd(fGeoH->GetPath(sensorID));
508  TGeoVolume* actVolume = gGeoManager->GetCurrentVolume();
509  TGeoBBox* actBox = (TGeoBBox*)(actVolume->GetShape());
510  TVector3 result(actBox->GetDX(),actBox->GetDY(),actBox->GetDZ());
511  return result;
512 }
513 
514 //-------------Set Parameter------------------------------------
516  fDetType=1; // Detector Type =1
517  nRefrac=fGeo->nEV();//1.467; //Refractive index of SOB
518 // fSigmat=0.1; //Time Resolution is 100 ps ############################
519  fCollectionEff=0.65;//Collection Efficiency
520  fPackingFraction=0.80;//Packing Efficiency
521  fRoughness = 0.001; // 10 A
522  fTimeGranularity = 0.001;// [ns] = 98 ps granularity of the time signal
523 
524  // basic DIRC parameters:
525  fpi = TMath::Pi();
526  fzup = fGeo->barBoxZUp();
527  fzdown = fGeo->barBoxZDown();
528  fradius = fGeo->radius(); //radius in the middle of the bar = 50.cm
529  fhthick = fGeo->barHalfThick(); //half thickness of the bars=1.7/2 cm
531  fbbGap = fGeo->BBoxGap();
532  fbbnum = fGeo->BBoxNum();
533  fbarnum = fGeo->barNum();
534  fphi0 = (180.-2.*fpipehAngle)/fbbnum + fpipehAngle;
535  fdphi = (180.-2.*fpipehAngle)/fbbnum*2.;
536  flside = fGeo->Lside();
537  fbarwidth = fGeo->BarWidth();
540  fNpix = fGeo->Npixels();
541 
543  fPixelStep = fMcpActiveArea/fNpix; //fPixelSize + 0.5*fPixelGap;
544 
546  fDeadTime = fGeo->DeadTime();
547 
548  fThreshold = 0.20; //threshold to detect charge shared hits
549 }
550 //-------------Smear Time------------------------------------
552  Double_t EvtTime = FairRootManager::Instance()->GetEventTime();
553  time += EvtTime + gRandom->Gaus(0,sigt);
554 }
555 
556 // ----- Private method Reset ------------------------------------------
558  fNDigis = 0;
559  fPixelMap.clear();
560  if ( fDrcDigiArray ) fDrcDigiArray->Clear();
561 }
562 
563 // -------------------------------------------------------------------------
564 
565 // ----- Finish Task ---------------------------------------------------
567 {
568  if ( fDrcDigiArray ) fDrcDigiArray->Clear();
569  cout << "-I- PndDrcTimeDigiTask: Finish" << endl;
570  }
571 // -------------------------------------------------------------------------
572 
573 
Double_t x0
Definition: checkhelixhit.C:70
Double_t nEV()
Definition: PndGeoDrc.h:76
Double_t SigmaCharge()
Definition: PndGeoDrc.h:178
friend F32vec4 cos(const F32vec4 &a)
Definition: P4_F32vec4.h:112
TClonesArray * digi
virtual void Exec(Option_t *option)
friend F32vec4 exp(const F32vec4 &a)
Definition: P4_F32vec4.h:109
Double_t BBoxNum()
Definition: PndGeoDrc.h:136
void SetTimeAtBar(Double_t TimeAtBar)
Definition: PndDrcDigi.cxx:46
__m128 m
Definition: P4_F32vec4.h:28
Int_t GetMcpId() const
Definition: PndDrcPDPoint.h:57
TClonesArray * fMCArray
Int_t GetBarId() const
friend F32vec4 sqrt(const F32vec4 &a)
Definition: P4_F32vec4.h:29
Double_t Lside()
Definition: PndGeoDrc.h:184
std::map< Int_t, Int_t > fPixelMap
static T Sqrt(const T &x)
Definition: PndCAMath.h:37
Int_t GetPdgCode() const
Definition: PndMCTrack.h:73
Int_t GetDetectorID() const
Definition: PndDrcPDPoint.h:55
#define verbose
std::map< Int_t, Double_t > fTimeMap
virtual void SetParContainers()
Double_t BarWidth()
Definition: PndGeoDrc.h:100
Double_t DeadTime()
Definition: PndGeoDrc.h:181
int n
void SetEventNo(Double_t EventNo)
Definition: PndDrcDigi.cxx:58
TVector3 GetMomentum() const
Definition: PndMCTrack.h:78
PndDrcDigiWriteoutBuffer * fDrcTimeDigiArray
TClonesArray * fBarPointArray
void Smear(Double_t &time, Double_t sigt)
Double_t BBoxGap()
Definition: PndGeoDrc.h:130
PndGeoDrc * fGeo
Basic geometry data of barrel DRC.
TGeoManager * gGeoManager
Double_t barBoxZDown()
Definition: PndGeoDrc.h:104
TString GetPath(Int_t shortID)
for a given shortID the path is returned
TClonesArray * fDrcDigiArray
Double_t FindPhiRot(Double_t, Double_t)
Double_t FindOutPoint(Double_t, Double_t, Double_t, Double_t *, Bool_t)
Double_t PipehAngle()
Definition: PndGeoDrc.h:139
Int_t GetBarPointID() const
Definition: PndDrcPDPoint.h:56
void SetBarID(Int_t BarID)
Definition: PndDrcDigi.cxx:22
TVector3 corner
Int_t a
Definition: anaLmdDigi.C:126
Double_t barBoxZUp()
Definition: PndGeoDrc.h:108
PndDrcDigi * AddDrcDigi(Int_t index, Int_t iDetectorId, Double_t charge, Double_t TimeStamp, Int_t csflag)
Int_t GetBoxId() const
void SetBoxID(Int_t BoxID)
Definition: PndDrcDigi.cxx:25
Double_t
PndDrcBarPoint * fBarPoint
void SetMotherID(Int_t MrID)
Definition: PndDrcDigi.cxx:34
Double_t McpActiveArea()
Definition: PndGeoDrc.h:166
void SetTrackMom(TVector3 TrackMom)
Definition: PndDrcDigi.cxx:40
PndGeoHandling * fGeoH
void SetTrackID(Int_t TrackID)
Definition: PndDrcDigi.cxx:28
friend F32vec4 fabs(const F32vec4 &a)
Definition: P4_F32vec4.h:47
TVector3 GetSensorDimensions(Int_t sensorID)
virtual InitStatus Init()
void SetEvtTim(Double_t EvtTim)
Definition: PndDrcDigi.cxx:49
static PndGeoHandling * Instance()
TVector3 MasterToLocalShortId(const TVector3 &master, const Int_t &shortId)
void SetTrackIniVertex(TVector3 TrackIniVertex)
Definition: PndDrcDigi.cxx:31
TClonesArray * fPDPointArray
void SetVerbose(Int_t v)
Double_t fDetEfficiency[800]
Double_t barHalfThick()
Definition: PndGeoDrc.h:96
Double_t FuncD3(Double_t x, Double_t y)
Double_t x
Double_t FuncD1(Double_t x)
ClassImp(PndAnaContFact)
PndDrcPDPoint * fPpt
PndSdsMCPoint * hit
Definition: anasim.C:70
Double_t y
TVector3 GetStartVertex() const
Definition: PndMCTrack.h:76
Int_t Npixels()
Definition: PndGeoDrc.h:172
Double_t par1[3]
Definition: reco_analys2.C:51
void ActivatePixel(Int_t DetectorId, Int_t sensorId, Double_t signalTime, Int_t k, Int_t csflag)
Int_t GetMotherID() const
Definition: PndMCTrack.h:74
void SetPdgCode(Int_t Pdg)
Definition: PndDrcDigi.cxx:37
Double_t Pi
void SetEventTim(Double_t EventTim)
Definition: PndDrcDigi.cxx:52
Double_t barNum()
Definition: PndGeoDrc.h:124
Double_t GetStartTime() const
Definition: PndMCTrack.h:77
Double_t PixelSize()
Definition: PndGeoDrc.h:175
Double_t radius()
Definition: PndGeoDrc.h:92
void SetMotherIDPho(Int_t MrIDPho)
Definition: PndDrcDigi.cxx:43
PndSdsMCPoint * point
Definition: anaLmdCluster.C:72