FairRoot/PandaRoot
PndRichHitFinder.cxx
Go to the documentation of this file.
1 // -------------------------------------------------------------------------
2 // ----- PndRichHitFinder source file -----
3 // ----- created 06 Apr 2017 -----
4 // -------------------------------------------------------------------------
5 
6 
7 #include "TClonesArray.h"
8 #include "TArrayD.h"
9 #include "TGeoManager.h"
10 
11 #include "FairRootManager.h"
12 #include "PndRichHitFinder.h"
13 #include "FairRun.h"
14 #include "FairRuntimeDb.h"
15 #include "FairGeoNode.h"
16 #include "FairGeoVector.h"
17 #include "FairRunAna.h"
18 #include "FairEventHeader.h"
19 
20 //#include "PndRichDigi.h"
21 
22 #include "PndDetectorList.h"
23 
24 // ----- Default constructor -------------------------------------------
26 PndPersistencyTask("RichHitFinder", 1)
27 {
28  SetPersistency(kTRUE);
29  fPixelHits = 0;
30  fEventNr = 0;
31  fPixelFactor = 1;
32  fHitNumber = 0;
33 
34  if(fVerbose>0) Info("PndRichHitFinder","RICH Hit Finder created, Parameters will be taken from RTDB");
35  fGeoH=NULL;
36  fGeo = new PndRichGeo();
37  fDigiArray = NULL;
38  fPdHitArray = NULL;
39  fMCEventHeader = NULL;
40  fStopFunctor = NULL;
41 
42  fInd = 0;
43  fTimeGate = 1;
44  fTimeStep = 0.5; //ns
45  fIBuffer = 0;
46  fIBufferPrev = 1;
47  fBufferStartTime.resize(2);
48  fBufferStartTime.at(0) = 0;
49  fBufferStartTime.at(1) = 0;
50  fHitsBuffer.resize(2);
51  fHitsBuffer.at(0).resize(1000);
52  fHitsBuffer.at(1).resize(1000);
53  fBufferNumHits.resize(2);
54  fBufferNumHits.at(0) = 0;
55  fBufferNumHits.at(1) = 0;
56  fThreshold = 5;
57  petime = -1;
58 
59 // fPixelSize = fGeo->PixelSize(); //pixel size;
60 // fNpix = fGeo->Npixels(); //pixel columns
61 // fMcpActiveArea = fGeo->McpActiveArea();
62 // fPixelGap = (fMcpActiveArea - (Double_t)fNpix*fPixelSize) / ((Double_t)fNpix - 1.);
63 // fPixelStep = fMcpActiveArea/fNpix;//fPixelSize + 0.5*fPixelGap;
64 
65 }
66 // -------------------------------------------------------------------------
67 
69  PndPersistencyTask("RichHitFinder", iVerbose)
70 {
71  SetPersistency(kTRUE);
72  fPixelHits = 0;
73  fEventNr = 0;
74  fPixelFactor = 1;
75  fGeoH = NULL;
76  fGeo = new PndRichGeo();
77  fDigiPixelMCInfo = kFALSE;
78  if(fVerbose>0) Info("PndRichHitFinder","RichHitFinder created, Parameters will be taken from RTDB");
79 
80  fDigiArray = NULL;
81  fPdHitArray = NULL;
82  fMCEventHeader = NULL;
83  fStopFunctor = NULL;
84 
85  fInd = 0;
86  fTimeGate = 1;
87  fTimeStep = 0.5; //ns
88  fIBuffer = 0;
89  fIBufferPrev = 1;
90  fBufferStartTime.resize(2);
91  fBufferStartTime.at(0) = 0;
92  fBufferStartTime.at(1) = 0;
93  fHitsBuffer.resize(2);
94  fHitsBuffer.at(0).resize(1000);
95  fHitsBuffer.at(1).resize(1000);
96  fBufferNumHits.resize(2);
97  fBufferNumHits.at(0) = 0;
98  fBufferNumHits.at(1) = 0;
99  fThreshold = 5;
100  petime = -1;
101 
102 // fPixelSize = fGeo->PixelSize(); //pixel size;
103 // fNpix = fGeo->Npixels(); //pixel rows in one FE
104 // fMcpActiveArea = fGeo->McpActiveArea();
105 // fPixelGap = (fMcpActiveArea - (Double_t)fNpix*fPixelSize) / ((Double_t)fNpix - 1.);
106 // fPixelStep = fPixelSize + 0.5*fPixelGap;
107 }
108 
110 PndPersistencyTask(name, iVerbose)
111 {
112  SetPersistency(kTRUE);
113  fPixelHits = 0;
114  fEventNr = 0;
115  fPixelFactor = 1;
116  fGeoH = NULL;
117  fGeo = new PndRichGeo();
118  fDigiPixelMCInfo = kFALSE;
119  if(fVerbose>0) Info("PndRichHitFinder","%s created, Parameters will be taken from RTDB",name);
120 
121  fDigiArray = NULL;
122  fPdHitArray = NULL;
123  fMCEventHeader = NULL;
124 
125  fTimeStep = 0.5; //ns
126  fIBuffer = 0;
127  fHitsBuffer.resize(2);
128  fHitsBuffer.at(0).resize(1000);
129  fHitsBuffer.at(1).resize(1000);
130  petime = -1;
131 
132 // fPixelSize = fGeo->PixelSize(); //pixel size;
133 // fNpix = fGeo->Npixels(); //pixel rows in one FE
134 // fMcpActiveArea = fGeo->McpActiveArea();
135 // fPixelGap = (fMcpActiveArea - (Double_t)fNpix*fPixelSize) / ((Double_t)fNpix - 1.);
136 // fPixelStep = fPixelSize + 0.5*fPixelGap;
137 }
138 
139 
140 // ----- Destructor ----------------------------------------------------
142  if (fGeo) delete fGeo;
143  if (fGeoH) delete fGeoH;
144 }
145 // -------------------------------------------------------------------------
146 
147 // ----- Initialization of Parameter Containers -------------------------
149  if ( fGeoH == NULL ) fGeoH = PndGeoHandling::Instance();
152  if(fVerbose>1) Info("SetParContainers","done.");
153  return;
154 }
155 
158  return kSUCCESS;
159 }
160 
161 // ----- Public method Init --------------------------------------------
163  //FairRun* ana = FairRun::Instance(); //[R.K. 01/2017] unused variable?
164  FairRootManager* ioman = FairRootManager::Instance();
165  if ( ! ioman )
166  {
167  std::cout << "-E- PndRichHitFinder::Init: "
168  << "RootManager not instantiated!" << std::endl;
169  return kFATAL;
170  }
171 
172  std::cout << "FairRunAna::Instance()->IsTimeStamp() = " << FairRunAna::Instance()->IsTimeStamp() << std::endl;
173  if (FairRunAna::Instance()->IsTimeStamp())
174  fInBranchName = "RichDigiSorted";
175  else
176  fInBranchName = "RichDigi";
177  // Get input array
178  fDigiArray = (TClonesArray*) ioman->GetObject(fInBranchName);
179  if ( ! fDigiArray )
180  {
181  std::cout << "-W- PndRichHitFinder::Init: "
182  << "No RichDigi array!" << std::endl;
183  return kERROR;
184  }
185 
186  // Create and register output array
187  fPdHitArray = new TClonesArray("PndRichPDHit");
188  ioman->Register("RichPDHit", "Rich", fPdHitArray, GetPersistency());
189 
190  fGapFunctor = new TimeGap();
191  fStopFunctor = new StopTime();
192  return kSUCCESS;
193 }
194 
195 // ----- Public method Exec --------------------------------------------
196 void PndRichHitFinder::Exec(Option_t*){
197 
198  if(fVerbose>3) Info("Exec","Start");
199  if (!fPdHitArray) Fatal("Exec", "No PdHitArray");
200  fPdHitArray->Clear();
201 
202  Double_t etime = FairRootManager::Instance()->GetEventTime();
203  if (FairRunAna::Instance()->IsTimeStamp()){
204  //fDigiArray = FairRootManager::Instance()->GetData(fInBranchName, fStopFunctor, etime, fStopFunctor, etime+100);
205  fDigiArray = FairRootManager::Instance()->GetData(fInBranchName, fGapFunctor, 10);
206 
207  Int_t nDigis = fDigiArray->GetEntriesFast();
208  std::cout << "nDigis = " << nDigis << " " << FairRunAna::Instance()->IsTimeStamp() << std::endl;
209  if (nDigis>0)
210  {
211  Double_t timef = ((PndRichDigi*)fDigiArray->At(0))->GetTime();
212  Double_t timel = ((PndRichDigi*)fDigiArray->At(nDigis-1))->GetTime();
215  if ((Int_t)fHitsBuffer.at(fIBuffer).size()<fBufferNumHits.at(fIBuffer))
217  for(Int_t i=0; i<fBufferNumHits.at(fIBuffer);i++)fHitsBuffer.at(fIBuffer).at(i)=0;
218  for (Int_t iDigi = 0; iDigi < nDigis; iDigi++)
219  {
220  Double_t hitTime = ((PndRichDigi*)fDigiArray->At(iDigi))->GetTime();
221  Int_t ind = (hitTime-fBufferStartTime.at(fIBuffer))/fTimeStep;
222  if (hitTime>fBufferStartTime.at(fIBuffer))
223  {
224  fHitsBuffer.at(fIBuffer).at(ind)++;
225  }
226  else
227  {
228  ind += fBufferNumHits.at(fIBufferPrev)-1;
229  fHitsBuffer.at(fIBufferPrev).at(ind)++;
230  }
231  }
232  Int_t nbr = fBufferNumHits.at(fIBuffer);
233  Int_t nbrp = fBufferNumHits.at(fIBufferPrev);
234  Int_t im = nbr + nbrp - 3*fTimeGate;
235  Int_t imax_;
236  Int_t nhitsmax = 0;
237  std::vector< Int_t > nmax;
238  std::vector< Int_t > imax;
239  std::vector< Int_t > istart;
240  std::vector< Int_t > istop;
241  Int_t nhitsprev = 0;
242  Int_t ilast;
243  // for(Int_t i = fInd; i<im; i++)
244  // {
245  // std::cout << i << " " << (i<nbrp) << " "
246  // << ( i<nbrp ?
247  // fHitsBuffer.at(fIBufferPrev).at(i) :
248  // fHitsBuffer.at(fIBuffer).at(i-nbrp) ) << std::endl;
249  // }
250  for(Int_t i = fInd; i<im; i++)
251  {
252  Int_t nhits = 0;
253  for(Int_t j = i-fTimeGate; j<=i+fTimeGate; j++)
254  if (j>=0) nhits += j<nbrp ?
255  fHitsBuffer.at(fIBufferPrev).at(j) :
256  fHitsBuffer.at(fIBuffer).at(j-nbrp);
257  // std::cout << i << " " << (i<nbrp) << " "
258  // << ( i<nbrp ?
259  // fHitsBuffer.at(fIBufferPrev).at(i) :
260  // fHitsBuffer.at(fIBuffer).at(i-nbrp) ) << " " << nhits << " " << nhitsmax;
261  if ((nhits>fThreshold)&&(nhitsprev<=fThreshold)) istart.push_back(i);
262  if ((nhits>fThreshold)&&(nhits>nhitsmax))
263  {
264  nhitsmax = nhits;
265  imax_ = i;
266  }
267  // std::cout << std::endl;
268  if ((nhits<=fThreshold)&&(nhitsprev>fThreshold))
269  {
270  nmax.push_back(nhitsmax);
271  imax.push_back(imax_);
272  istop.push_back(i-1);
274  std::cout << "peak = " << imax.size() << " " << imax_ << " " << nhitsmax << " "
275  << istop.back() << " " << istart.back() << " " << t << std::endl;
276  nhitsmax = 0;
277  imax_ = -1;
278  }
279  if (nhits<5) ilast = i;
280  nhitsprev = nhits;
281  }
282  fInd = ilast - nbrp;
283 
284  if(fVerbose>1) std::cout<<"-I- PndRichHitFinder: Event # "<< fEventNr<<" has "<<nDigis<<" digis."<< std::endl;
285  else if(fVerbose==1 && fEventNr%1000==0) std::cout<<"-I- PndRichHitFinder: Event # "<< fEventNr<<" has "<<nDigis<<" digis."<< std::endl;
286  std::cout<<"-I- PndRichHitFinder: Event # "<< fEventNr<<" has "<<nDigis<<" digis. "
287  << FairRunAna::Instance()->IsTimeStamp() << " " << etime << " "
288  << timel-timef << " " << etime << " " << timef << " " << timel << " " << petime << std::endl;
289 
290  std::cout << "buffer: " << fIBuffer << " " << fBufferNumHits.at(fIBuffer) << " " <<
291  fBufferStartTime.at(fIBuffer) << std::endl;
292 
293  Int_t detID = 0;//, mcpID = 0, pixelID = 0;
294  TVector3 HitPosGlobal, HitPosLocal, dPosHit;
295  Double_t hitTime = 0.;
296  fHitNumber += nDigis;
297 
298  for (Int_t iDigi = 0; iDigi < nDigis; iDigi++){
299  fDigi = (PndRichDigi*) fDigiArray->At(iDigi);
300  detID = -999;//fDigi->GetDetectorId();
301  // pixelID = detID - 100*(Int_t)TMath::Floor((Double_t)detID/100.);
302  // mcpID = detID/100;
303  hitTime = fDigi->GetTime();
304  Int_t sensorId = -999;
305 
306  // the pixel number shows local coordinates of the hit:
307 // HitPosLocal.SetXYZ(fPixelStep*((Double_t)(pixelID % fNpix) - (Double_t)(fNpix/2) + 0.5),
308 // fPixelStep*(TMath::Floor(((Double_t)pixelID)/((Double_t)fNpix)) - (Double_t)(fNpix/2) + 0.5), 0.);
309 // Int_t sensorId = fDigi->GetSensorId()/fPixelFactor;
310 // if(fPixelFactor==2) { //double pixels
311 // sensorId++;
312 // if(fDigi->GetSensorId()%2) HitPosLocal.SetX(HitPosLocal.X()+fPixelSize/2.);
313 // else HitPosLocal.SetX(HitPosLocal.X()-fPixelSize/2.);
314 // }
315 
316  // local coordinates of the hit on the MCP are translated into global ones as the following:
317 // HitPosGlobal = fGeoH->LocalToMasterShortId(HitPosLocal, mcpID);
318 // dPosHit.SetXYZ(fPixelSize/2., fPixelSize/2., 0.);
319 // if(fPixelFactor==2) dPosHit.SetXYZ(fPixelSize, fPixelSize/2., 0.);
320 
321 
322  if(fDigi->GetTimeStamp()!=etime+hitTime) hitTime = fDigi->GetTimeStamp() - etime;
323  PndRichPDHit pdhit = PndRichPDHit(iDigi, detID, sensorId , HitPosGlobal, dPosHit, hitTime, 0.);
324  // pdhit.SetPdgCode(fDigi->GetPdgCode());
325  pdhit.SetTimeStamp(fDigi->GetTimeStamp());
326  // pdhit.SetTimeAtBar(fDigi->GetTimeAtBar());
327  pdhit.SetLink(fDigi->GetLink(0)); // MCTrack
328  pdhit.AddLink(fDigi->GetLink(1)); // RichPDPoint
329  pdhit.AddLink(FairLink(-1,fEventNr, "RichDigi", iDigi));
330  //((FairMultiLinkedData)pdhit).Print(); std::cout<<std::endl;
331  new((*fPdHitArray)[fPdHitArray->GetEntriesFast()]) PndRichPDHit(pdhit);
332  }
333  // switch between buffers
335  fIBuffer = fIBuffer ? 0 : 1;
336  fBufferStartTime.at(fIBuffer) = stopTime;
337  petime = etime;
338  }
339  }
340  else
341  {
342  Int_t nDigis = fDigiArray->GetEntriesFast();
343  for (Int_t iDigi = 0; iDigi < nDigis; iDigi++){
344  fDigi = (PndRichDigi*) fDigiArray->At(iDigi);
345  Int_t detID = -999;
346  Int_t sensorId = fDigi->GetSensorId();
347  Double_t hitTime = fDigi->GetTime();
348  TVector3 pos = fDigi->GetPosition();
349  TVector3 dpos(0,0,0);
350  PndRichPDHit pdhit = PndRichPDHit(iDigi, detID, sensorId , pos, dpos, hitTime, 0.);
351  new((*fPdHitArray)[fPdHitArray->GetEntriesFast()]) PndRichPDHit(pdhit);
352  }
353  std::cout << "Event = " << fEventNr << " nDigis = " << nDigis << " " << FairRunAna::Instance()->IsTimeStamp() << std::endl;
354  }
355 
356  fEventNr++;
357  if(fVerbose>3) Info("Exec","Loop MC points");
358 
359  fPdHitArray->Sort();
360  fDigiArray->Delete();
361 
362 }
363 
364 
365 // -------------------------------------------------------------------------
367 {
368  FinishEvents();
369 }
370 
371 // -------------------------------------------------------------------------
373 {
374  std::cout << "-I- PndRichHitFinder: Total number of hits is " << fHitNumber << std::endl;
375 }
376 
TVector3 pos
int fVerbose
Definition: poormantracks.C:24
ClassImp(PndRichHitFinder)
Int_t i
Definition: run_full.C:25
virtual void FinishTask()
virtual void SetParContainers()
PndGeoHandling * fGeoH
virtual InitStatus ReInit()
BinaryFunctor * fGapFunctor
std::vector< std::vector< Double_t > > fHitsBuffer
void SetPersistency(Bool_t val=kTRUE)
PndRichDigi * fDigi
FairMCEventHeader * fMCEventHeader
std::vector< Double_t > fBufferStartTime
TVector3 GetPosition() const
Definition: PndRichDigi.h:74
BinaryFunctor * fStopFunctor
virtual void Exec(Option_t *opt)
virtual InitStatus Init()
Double_t
std::vector< Int_t > fBufferNumHits
static PndGeoHandling * Instance()
TString name
void SetVerbose(Int_t v)
Int_t GetSensorId() const
Definition: PndRichDigi.h:75
PndRichGeo * fGeo
TClonesArray * fPdHitArray
Int_t iVerbose
TTree * t
Definition: bump_analys.C:13
TClonesArray * fDigiArray
virtual Double_t GetTime()
Definition: PndRichDigi.h:71
virtual void SetParContainers()
virtual void FinishEvent()