FairRoot/PandaRoot
PndSciTDigiTask.cxx
Go to the documentation of this file.
1 // -------------------------------------------------------------------------
2 // PndSciTDigiTask source file
3 //
4 // created by D. Steinschaden
5 // last update 06.2015
6 // -------------------------------------------------------------------------
7 
8 #include "PndSciTDigiTask.h"
9 #include "PndSciTHit.h"
10 #include "PndSciTPoint.h"
11 #include "PndSciTHitSorterTask.h"
12 
13 #include "FairRootManager.h"
14 #include "FairRunAna.h"
15 #include "FairRuntimeDb.h"
16 #include "FairGeoVector.h"
17 #include "FairEventHeader.h"
18 
19 #include "TVector3.h"
20 #include "TGeoBBox.h"
21 #include "TClonesArray.h"
22 #include "TGeoManager.h"
23 
24 #include <cmath>
25 
26 // ----- Default constructor -------------------------------------------
28  PndPersistencyTask("PndSciT Hit Producer")
29 {
30  fInBranchName = "SciTPoint";
31  fOutBranchName = "SciTHit";
32  fSortedOutBranchName = "SciTSortedHit";
33 
34  fTimeOrderedDigi = kFALSE;
35  fActivateBuffering = kTRUE;
36  SetPersistency(kTRUE);
37 
38  fGeoH = NULL;
39 
40  fdt = 0.075; //auto time resolution 0.075 ns
41  fDeadtime = 1000.0; // Tile dead time after a hit in ns
42  fPileupTime = 10.0; // Time of possible Pile up after a Hit in ns
43 
44 }
45 // -------------------------------------------------------------------------
46 
47 // ----- Default constructor -------------------------------------------
49  PndPersistencyTask("Ideal PndSciT Hit Producer")
50 {
51  fInBranchName = "SciTPoint";
52  fOutBranchName = "SciTHit";
53  fSortedOutBranchName = "SciTSortedHit";
54 
55  fTimeOrderedDigi = kFALSE;
56  fActivateBuffering = kTRUE;
57  SetPersistency(kTRUE);
58 
59  fGeoH = NULL;
60 
61  fdt = dt;
62  fDeadtime = deadtime;
63  fPileupTime = 10.0;
64 }
65 // -------------------------------------------------------------------------
66 
67 // ----- Destructor ----------------------------------------------------
69 {
70 }
71 
72 // ----- Public method Init --------------------------------------------
73 InitStatus PndSciTDigiTask::Init()
74 {
75  // Get RootManager
76  FairRootManager* ioman = FairRootManager::Instance();
77 
78  if ( ! ioman )
79  {
80  std::cout << "-E- PndSciTDigiTask::Init: "
81  << "RootManager not instantiated!" << std::endl;
82  return kFATAL;
83  }
84 
85  // Get input array
86  fPointArray = (TClonesArray*) ioman->GetObject(fInBranchName);
87 
88  if ( ! fPointArray )
89  {
90  std::cout << "-W- PndSciTDigiTask::Init: "
91  << "No SciTPoint array!" << std::endl;
92  return kERROR;
93  }
94  //eventbased
95  // Create and register output array
96  //fHitArray = ioman->Register(OutBranchName, ClassName, FolderName, kTRUE);
97  //fHitArray = ioman->Register("SciTHit", "PndSciTHit", "SciT", kTRUE);
98 
99  //time and event based simulation:
100  // fDataBuffer = new PndSciTHitWriteoutBuffer(fOutBranchName, fFolderName", fPersistance);
102  fDataBuffer = (PndSciTHitWriteoutBuffer*)ioman->RegisterWriteoutBuffer(fOutBranchName, fDataBuffer);
103  fDataBuffer->ActivateBuffering(fActivateBuffering);// Buffering always activated to handle the Pile up in Event and Time based Version
104 
105  std::cout << "-I- PndSciTDigiTask: Intialisation successfull" << std::endl;
106  return kSUCCESS;
107 }
108 // -------------------------------------------------------------------------
109 
111 
112  fTimeOrderedDigi = kTRUE;
113  this->Add(new PndSciTHitSorterTask(2000, 1, fOutBranchName, fSortedOutBranchName, "SciT"));
114 }
115 
116 
117 
118 
119 // ----------------------------------------------------------------------------
121 {
122  // Get Base Container
123  // FairRun* ana = FairRun::Instance();
124  //FairRuntimeDb* rtdb=ana->GetRuntimeDb();
125 
126  if ( fGeoH == NULL ){
127  std::cout << "ScitTil fGeoH is loading" << std::endl;
129  }
130  else std::cout << "ScitTil fGeoH is already defind but shouldn't" << std::endl;
131  if ( fGeoH == NULL ){
132  std::cout << "ScitTil fGeoH was loaded but is still NULL" << std::endl;
133  }
135 
136  return;
137 }
138 
139 
140 // ----- Public method Exec --------------------------------------------
141 void PndSciTDigiTask::Exec(Option_t*)
142 {
143  // Reset output array
144  if ( ! fHitArray )
145  Fatal("Exec", "No HitArray");
146 
147  //fHitArray->Clear();
148 
149  // Declare some variables
150 
151  PndSciTPoint *point = NULL;
152 
153  Double_t nBC408 = 1.58;
154 
155 
156  Int_t detectorID; // Detector ID /shortID
157  TString detectorName;
158  Double_t mcTime,eventTime,hitTime,detectingTime;
159  Double_t sipm1 , sipm2, dSiPm;
160 
161  TVector3 zeroVector(0,0,0);
162 
163  TVector3 detectorPosition;
164  TVector3 mcPosition;
165  Double_t xSiPm1, xSiPm2;
166  TVector3 hitPosition;
167  Double_t hitXPosition;
168  TVector3 sensorDim; // Sensor dimension always in half the lenghts in root!
169  TVector3 dHitPosition;
170 
171  //calculate invariant values outside of a loop:
172 
173  dSiPm = sqrt(2) * fdt; // time resolution of a single (row of) SiPm
174  Double_t cBC408 = 299792458.0/nBC408*(100/(1.0e9)); // Light in BC408 Scintillator in [cm/ns]
175 
176  // Loop over SciTPoints
177  Int_t
178  nPoints = fPointArray->GetEntriesFast();
179 
180  for (Int_t iPoint = 0; iPoint < nPoints; iPoint++)
181  {
182  point = (PndSciTPoint*) fPointArray->At(iPoint);
183  if (fVerbose>0) std::cout << " Ideal Hit Producer -Point-: " << point << std::endl;
184  if ( ! point)
185  continue;
186 
187  // Detector ID
188  detectorID = point->GetDetectorID();
189  detectorName = point->GetDetName();
190 
191  point->Position(mcPosition);
192  mcPosition = fGeoH->MasterToLocalShortId(mcPosition, detectorID);
193 
194  sensorDim = fGeoH->GetSensorDimensionsShortId(detectorID);
195 
196  xSiPm1=sensorDim(0)+mcPosition(0);
197  xSiPm2=sensorDim(0)-mcPosition(0);
198 
199  // produce realistic timestamp
200 
201  mcTime = point->GetTime();//Get MCTime
202  eventTime = FairRootManager::Instance()->GetEventTime();
203  hitTime = mcTime + eventTime;
204 
205  sipm1 = hitTime + xSiPm1/cBC408;
206  sipm2 = hitTime + xSiPm2/cBC408;
207 
208  smear(sipm1,dSiPm);// smear with fdt to creat realistic Time
209  smear(sipm2,dSiPm);// smear with fdt to creat realistic Time
210 
211  detectingTime = (sipm1+sipm2)/2.0-sensorDim(0)/cBC408;
212 
213  // HitPosition in the middle of the sensor = Detector Position
214 
215  detectorPosition = fGeoH->LocalToMasterShortId(zeroVector, detectorID);
216 
217  hitXPosition = (sipm1-sipm2)/2*cBC408;
218  if (hitXPosition > sensorDim(0)){
219  hitXPosition = sensorDim(0);
220  }
221  else if (hitXPosition < -sensorDim(0)){
222  hitXPosition = -sensorDim(0);
223  }
224  hitPosition.SetXYZ(hitXPosition,0.,0.);
225 
226  hitPosition = fGeoH->LocalToMasterShortId(hitPosition, detectorID);
227 
228  // sensor Dimensions equivalent to the potential error of the hitPosition in the center of the Tile. Attention,in real its no Gaussian shaped distribution but an rectangual!!
229 
230  dHitPosition =(1/sqrt(12))*2*sensorDim; //without x position by time difference
231 
232  dHitPosition.SetX(fdt*cBC408);
233 
234 
235 
236  // Create new hit
237  // new ((*fHitArray)[iPoint]) PndSciTHit(detectorID, detectorName,
238  // time+FairRootManager::Instance()->GetEventTime(), fdt,
239  // hitPosition,dHitPosition,
240  // iPoint,
241  // point->GetEnergyLoss());
242 
243  PndSciTHit *tempHit = new PndSciTHit(detectorID, detectorName,
244  detectingTime, fdt,
245  sipm1, dSiPm, sipm2, dSiPm,
246  hitPosition,dHitPosition,
247  iPoint,
248  point->GetEnergyLoss());
249  if (fTimeOrderedDigi){
250  tempHit->ResetLinks();
251  FairEventHeader* evtHeader = (FairEventHeader*)FairRootManager::Instance()->GetObject("EventHeader.");
252  tempHit->AddLink(FairLink(evtHeader->GetInputFileId(), FairRootManager::Instance()->GetEntryNr(), fInBranchName, iPoint));
253 
254  tempHit->AddLink(FairLink(-1, FairRootManager::Instance()->GetEntryNr(), "EventHeader.", -1));
255  }
256 
257  fDataBuffer->FillNewData(tempHit,
258  hitTime,
259  hitTime+fDeadtime);
260 
261  delete tempHit;
262 
263  } // Loop over MCPoints
264 
265  //fHitArray->Sort();
266  // Event summary
267  if (fVerbose>1) std::cout << "-I- PndSciTDigiTask: " << nPoints << " SciTPoints, "
268  << nPoints << " Hits created." << std::endl;
269 
270  //---------- Write Out ALL Data after every Event in EventBased Version only -------
271 
272  if (fTimeOrderedDigi==kFALSE && fActivateBuffering==kTRUE) fDataBuffer->WriteOutAllData();
273 
274 
275 }
276 // -------------------------------------------------------------------------
277 
278 
280 {
282 
283  Double_t t = time;
284  //std::cout<<" time "<<time<<std::endl;
285  Double_t sigt;
286 
287  sigt=gRandom->Gaus(0,dt);
288  t += sigt;
289  time = t;
290  return;
291 }
292 
293 
mychain Add("run.root")
virtual void Exec(Option_t *opt)
int fVerbose
Definition: poormantracks.C:24
PndGeoHandling * fGeoH
friend F32vec4 sqrt(const F32vec4 &a)
Definition: P4_F32vec4.h:29
TClonesArray * fPointArray
virtual void SetParContainers()
virtual InitStatus Init()
void SetPersistency(Bool_t val=kTRUE)
TClonesArray * fHitArray
TVector3 GetSensorDimensionsShortId(Int_t shortId)
Double_t
Bool_t fActivateBuffering
static PndGeoHandling * Instance()
PndSciTHitWriteoutBuffer * fDataBuffer
void smear(Double_t &time, Double_t &dt)
TVector3 MasterToLocalShortId(const TVector3 &master, const Int_t &shortId)
TString fOutBranchName
ClassImp(PndAnaContFact)
TVector3 LocalToMasterShortId(const TVector3 &local, const Int_t &shortId)
TTree * t
Definition: bump_analys.C:13
virtual void SetParContainers()
Double_t fPileupTime
Bool_t fTimeOrderedDigi
set to kTRUE to use the time ordering of the output data.
TString GetDetName() const
Definition: PndSciTPoint.h:53
TString fSortedOutBranchName
PndSdsMCPoint * point
Definition: anaLmdCluster.C:72