FairRoot/PandaRoot
PndDrcReco.cxx
Go to the documentation of this file.
1 // -----------------------------------------
2 // PndDrcReco.cxx
3 //
4 // Created on: 04.03.2016
5 // Author: R.Dzhygadlo at gsi.de
6 // -----------------------------------------
7 
8 #include "PndDrcReco.h"
9 
10 #include "FairRootManager.h"
11 #include "PndMCTrack.h"
12 #include "PndDrcPDPoint.h"
13 #include "PndDrcHit.h"
14 #include "PndDrcPDHit.h"
15 #include "PndDrcLutNode.h"
16 
17 #include "PndGeoHandling.h"
18 #include "TSystem.h"
19 
20 #include <TLine.h>
21 
22 #include "TStyle.h"
23 #include "TCanvas.h"
24 
25 using std::cout;
26 using std::endl;
27 
28 // ----- Default constructor -------------------------------------------
29 PndDrcReco::PndDrcReco() : FairTask("PndDrcReco"){
30 }
31 
33  :FairTask("PndDrcReco",verbose),fVerbose(verbose),fOutFile(outFile),fLutFile(lutFile),fPdfFile(pdfFile){
34  fR1=r1;
35  fR2=r2;
36 }
37 
38 // ----- Initialization ------------------------------------------------
39 InitStatus PndDrcReco::Init(){
40  cout << " ---------- INITIALIZATION ------------" << endl;
41  nevents = -1;
42  // Get RootManager
43  FairRootManager* ioman = FairRootManager::Instance();
44  if ( ! ioman ) {
45  cout << "-E- PndDrcReco::Init: " << "RootManager not instantiated!" << endl;
46  return kFATAL;
47  }
48 
49  // Get input array
50  fMCArray = (TClonesArray*) ioman->GetObject("MCTrack");
51  if ( ! fMCArray ) {
52  cout << "-W- PndDrcReco::Init: " << "No MCTrack array!" << endl;
53  return kERROR;
54  }
55 
56  // Get bar points array
57  fBarPointArray = (TClonesArray*) ioman->GetObject("DrcBarPoint");
58  if ( ! fBarPointArray ) {
59  cout << "-W- PndDrcReco::Init: " << "No DrcBarPoint array!" << endl;
60  return kERROR;
61  }
62 
63  // Get ev points array
64  fEVPointArray = (TClonesArray*) ioman->GetObject("DrcEVPoint");
65  if ( ! fEVPointArray ) {
66  cout << "-W- PndDrcReco::Init: " << "No DrcEVPoint array!" << endl;
67  return kERROR;
68  }
69 
70  // Get Photon point array
71  fPDPointArray = (TClonesArray*) ioman->GetObject("DrcPDPoint");
72  if ( ! fPDPointArray ) {
73  cout << "-W- PndDrcReco::Init: " << "No DrcPDPoint array!" << endl;
74  return kERROR;
75  }
76 
77  // Get hits array
78  fPDHitArray = (TClonesArray*) ioman->GetObject("DrcPDHit");
79  if ( ! fPDHitArray ) {
80  cout << "-W- PndDrcReco::Init: " << "No DrcPDHit array!" << endl;
81  return kERROR;
82  }
83 
85  name.Remove(0,name.Last('/')+1);
86  sscanf(name, "lut_e%d_b%d_l%d", &fEvType,&fRadType,&fLensType);
87 
88  fFile = new TFile(fLutFile);
89  fTree=(TTree *) fFile->Get("dircsim") ;
90  for(Int_t l=0; l<5; l++){
91  fLut[l] = new TClonesArray("PndDrcLutNode");
92  fTree->SetBranchAddress(Form("LUT%d",l),&fLut[l]);
93  }
94  fTree->GetEntry(0);
95 
96 
97  //corrections lut
98  const Int_t maxpoints(150);
99  Double_t meanc2[maxpoints],spr2[maxpoints],meanc3[maxpoints],spr3[maxpoints];
100  name = fLutFile;
101  name.Remove(name.Last('/')+1);
102 
103  Long_t id,size,flags,modtime;
104  if(!gSystem->GetPathInfo((name+"corrlut.root").Data(),&id,&size,&flags,&modtime)){
105  TFile *fc = new TFile(name+"corrlut.root");
106  TTree *tc = (TTree*)fc->Get("corrlut");
107  tc->SetBranchAddress("meanc2",&meanc2);
108  tc->SetBranchAddress("meanc3",&meanc3);
109  tc->SetBranchAddress("spr2",&spr2);
110  tc->SetBranchAddress("spr3",&spr3);
111 
112  for (Int_t i = 0; i < tc->GetEntriesFast(); i++) {
113  tc->GetEvent(i);
114  for(Int_t j=0; j<145; j++){
115  c_mean[2][i+1][j]=meanc2[j];
116  c_mean[3][i+1][j]=meanc3[j];
117  c_spr[2][i+1][j]=spr2[j];
118  c_spr[3][i+1][j]=spr3[j];
119  }
120  }
121  fc->Close();
122  }
123 
124 
125  for(Int_t p=0; p<5; p++){
126  for(Int_t m=0; m<40; m++){
127  for(Int_t t=0; t<120; t++){
128  for(Int_t i=0; i<1100; i++){
129  fhPdf[p][m][t][i] = NULL;
130  }
131  }
132  }
133  }
134 
135  if(!gSystem->GetPathInfo(fPdfFile.Data(),&id,&size,&flags,&modtime)){
136  TFile fpdf(fPdfFile);
137  TIter nextkey(fpdf.GetListOfKeys());
138  TKey *key;
139  while ((key = (TKey*)nextkey())) {
140  TH1F *fun = (TH1F*)key->ReadObj();
141  Int_t p,m,t,i;
142  sscanf(fun->GetName(), "pdf_%d_%d_%d_%d", &p,&m,&t,&i);
143  fhPdf[p][m][t][i]=fun;
144  fhPdf[p][m][t][i]->SetDirectory(0);
145  }
146  fpdf.Close();
147  }
148 
149  // //nph lut
150  // name = fLutFile;
151  // name.Remove(name.Last('/')+1);
152  // TFile fn_r(name+"nph.root");
153  // TIter nextkey(fn_r.GetListOfKeys());
154  // TKey *key;
155 
156  // while ((key = (TKey*)nextkey())) {
157  // TF1 *fun = (TF1*)key->ReadObj();
158  // Int_t i,m,t;
159  // sscanf(fun->GetName(), "%d_%d_%d", &i,&m,&t);
160  // fhNphArr[i][m][t]=fun;
161  // }
162  // fn_r.Close();
163 
164  //Double_t mom(0), theta(0),phi(0), trr(0), nph(0),
165  //par1(0), par2(0), par3(0), par4(0), par5(0), par6(0), test1(0), test2(0), test3(0),separation(0); //[R.K. 01/2017] unused variable?
166 
167  if(fOutFile.Contains("reco")) fOutFile.ReplaceAll("reco","rt_reco");
168  else fOutFile.ReplaceAll(".root","t.root");
169  fFileOut = new TFile(fOutFile,"recreate");
170  fTreeOut = new TTree("barreldirc","SPR");
171 
172  fTreeOut->Branch("fMom",&fMom,"fMom/D");
173  fTreeOut->Branch("fTheta",&fTheta,"fTheta/D");
174  fTreeOut->Branch("fPhi",&fPhi,"fPhi/D");
175  fTreeOut->Branch("fPidTrue", &fPidTrue,"fPidTrue/I");
176  fTreeOut->Branch("fPidDist", &fPidDist,"fPidDist/I");
177 
178  fTreeOut->Branch("fMissId", &fMissId,"fMissId[5]/D");
179  fTreeOut->Branch("fEfficiency", &fEfficiency,"fEfficiency[5]/D");
180 
181  fTreeOut->Branch("fPidLike", &fPidLike,"fPidLike[2]/I");
182  fTreeOut->Branch("fLikelihood",&fLikelihood,"fLikelihood[2]/D");
183  fTreeOut->Branch("fSeparation",&fSeparation,"fSeparation[2]/D");
184  fTreeOut->Branch("fSpr", &fSpr,"fSpr[5]/D");
185  fTreeOut->Branch("fNph", &fNph,"fNph[5]/D");
186  fTreeOut->Branch("fCangle",&fCangle,"fCangle[5]/D");
187  fTreeOut->Branch("fR1",&fR1,"fR1/D");
188  fTreeOut->Branch("fR2",&fR2,"fR2/D");
189 
190  fFile->cd();
191 
192  fGeo = new PndGeoDrc();
194  Double_t barwidth = fGeo->BarWidth();
195  if(fRadType==3) barwidth = 5.41333;
196  fBarPhi = 2*atan(((barwidth + fGeo->barhGap())/2.)/fGeo->radius())*180/TMath::Pi();
197  fDphi = 2.*(180. - 2*fPipehAngle)/(Double_t)fGeo->BBoxNum();
198 
199  fHist = new TH1F("cherenkov_angle_hist",";#theta_{c} [rad];entries [#]", 100,0.6,0.9);
200  fFit = new TF1("fgaus","[0]*exp(-0.5*((x-[1])/[2])*(x-[1])/[2]) + x*[3]+ [4]",0.35,0.85);
201  fSpect = new TSpectrum(10);
202 
203  fNx = TVector3(1,0,0);
204  fNy = TVector3(0,1,0);
205  fCriticalAngle = asin(1.00028/fGeo->nQuartz());
206 
207  Int_t pdg[]={11,13,211,321,2212};
208  Double_t mass[] = {0.000511,0.1056584,0.139570,0.49368,0.9382723};
209 
210 
211  gStyle->SetOptStat(1);
212  gStyle->SetOptTitle(1);
213 
214  for(Int_t i=0; i<5; i++){
215  fParticleArray[pdg[i]]=i;
216  fPdg[i]=pdg[i];
217  fMass[i]=mass[i];
218  fHits[i]=0;
219  fEvents[i]=0;
220  fEventsEff[i]=0;
221  fEventsMis[i]=0;
222  fMissId[i]=0;
223  fEfficiency[i]=0;
224  fAngle[i] = 0;
225  fFunc[i] = new TF1(Form("f_%d",i),"gaus(0)",0.4,0.9);
226 
227  fFunc[i]->SetParameter(0,1);
228  fFunc[i]->SetParameter(2,0.01);
229 
230  if(i==2) fFunc[i]->SetParameter(2,0.0095);
231  if(i==3) fFunc[i]->SetParameter(2,0.0095); //95
232 
233  fhLk1[i] = new TH1F(Form("fhLk1_%d",i), ";ln L(K) - ln L(#pi);entries [#]",150,-400,400);
234  fhLk2[i] = new TH1F(Form("fhLk2_%d",i), ";ln L(K) - ln L(#pi);entries [#]",150,-400,400);
235  fhTang[i] = new TH1F(Form("cherenkov_angle_hist_%d",i),";#theta_{c} [rad];entries [#]", 100,0.4,0.9);
236  fhTang[i]->SetMinimum(0);
237  fhDiff[i] = new TH1F(Form("fhDiff_%d",i),";t_{lut} - t_{daq} [ns];entries [#]",200,-10,10);
238  fhTime[i] = new TH1F(Form("fhTime_%d",i),";time [ns];entries [#]",200,0,100);
239  fhNph[i] = new TH1F(Form("fhNph_%d",i),";detected photons [#];entries [#]",150,0,150);
240 
241  fhTang[i]->SetStats(0);
242  }
243  fCanvasList = new TList();
244 
245  fMethod=1;
246 
247  cout << "-I- PndDrcReco: Intialization successfull" << endl;
248  return kSUCCESS;
249 }
250 
251 TH1F *hEnergy = new TH1F("hEnergy",";p [eV];entries [#]",200,0,10);
252 TH1F *hPathAll = new TH1F("hPathAll",";pathid [#];entries [#]",30,0,30);
253 TH1F *hPath = new TH1F("hPath",";pathid [#];entries [#]",30,0,30);
254 TH2F *hSD = new TH2F("hSD",";#theta_{c} [rad];t_{lut} - t_{daq} [ns]",200,0.8,0.85,200,-2,2);
255 
256 // ----- Execution of Task ---------------------------------------------
257 void PndDrcReco::Exec(Option_t*){
258  nevents++;
259 
260  Int_t nHits = fPDHitArray->GetEntriesFast();
261  if(fVerbose>1) std::cout<<"Event # "<< nevents<<" has "<<nHits<<" hits."<< std::endl;
262  else if(fVerbose==1 && nevents%100==0) std::cout<<"Event # "<< nevents<<" has "<<nHits<<" hits."<< std::endl;
263 
264  for(Int_t itrack=0; itrack<fMCArray->GetEntriesFast(); itrack++){
265  fMCTrack = (PndMCTrack*)fMCArray->At(itrack);
266  if( fMCTrack->GetMotherID() != -1) continue;
267  fMcTrackId = itrack;
268 
269  Int_t mcBoxId(-1), barId; //mcBarId, //[R.K.03/2017] unused variable
270  for(int i=0; i<fBarPointArray->GetEntriesFast(); i++){
272  if(itrack == fBarPoint->GetTrackID()){
273  mcBoxId = fBarPoint->GetBoxId();
274  break;
275  }
276  }
277  if(mcBoxId==-1) continue;
278 
279  fBarPoint->Momentum(fMomInBar);
280  fBarPoint->Position(fPosInBar);
281  fTimeInBar = fBarPoint->GetTime();
283  fBarPoint->GetBarId(); //mcBarId = //[R.K.03/2017] unused variable
284 
285  //tracking smearing
286  TVector3 zz = fMomInBar;
287  fMomInBar.SetTheta(fRandom.Gaus(fMomInBar.Theta(),0.002));
288  fMomInBar.Rotate(fRandom.Uniform(2*TMath::Pi()), zz);
289 
290  fMom=fMomInBar.Mag();
291  fTheta=fMCTrack->GetMomentum().Theta()*180/TMath::Pi();
292  //fPhi=fMomInBar.Phi()*180/TMath::Pi();
293  fPhi=fMCTrack->GetMomentum().Phi()*180/TMath::Pi();
294 
295  if(fMom>2.5 && nevents==1 && itrack==0){
296  fhLk1[2] = new TH1F("fhLk1_2", ";ln L(K) - ln L(#pi);entries [#]",150,-100,100);
297  fhLk1[3] = new TH1F("fhLk1_3", ";ln L(K) - ln L(#pi);entries [#]",150,-100,100);
298  }
299  if(fMom>1.5 && nevents==1 && itrack==0){
300  fhLk2[2] = new TH1F("fhLk2_2", ";ln L(K) - ln L(#pi);entries [#]",150,-100,100);
301  fhLk2[3] = new TH1F("fhLk2_3", ";ln L(K) - ln L(#pi);entries [#]",150,-100,100);
302  }
303 
304  Double_t boxPhi;
305  DetermineBarId(boxPhi, barId);
306  fMomInBar.RotateZ(-boxPhi/180.*TMath::Pi());
307 
308  DetermineCherenkov(mcBoxId, barId);
309  }
310 }
311 
312 //Double_t ggg;
313 Int_t gg_pathid=0;
314 void PndDrcReco::DetermineCherenkov(Int_t , Int_t barId){ // boxId //[R.K.03/2017] unused variable(s)
315 
316  for(Int_t i=0; i<5; i++) {
317  fLk1[i]=0;
318  fLk2[i]=0;
319  fHitsE[i]=0;
320  fAngle[i] = acos(sqrt(fMom*fMom + fMass[i]*fMass[i])/fMom/1.473) + 0.00; //1.4738 = 370 = 3.35
321  fFunc[i]->SetParameter(1,fAngle[i]);
322  Int_t momid=fMom*10+0.5;
323  Int_t thetaid=fTheta+0.5;
324  //fFnph[i]=fhNphArr[i][momid][thetaid];
325 
326  // std::cout<< momid<<" "<<thetaid <<" "<< c_spr[2][momid][thetaid] <<" "<<c_spr[3][momid][thetaid] <<std::endl;
327 
328  if(c_spr[i][momid][thetaid]>0.003 && c_spr[i][momid][thetaid] < 0.1) fFunc[i]->SetParameter(2,c_spr[i][momid][thetaid]);
329  }
330 
331  //ggg=fRandom.Gaus(0,0.003);
332  for(Int_t h=0; h<fPDHitArray->GetEntriesFast(); h++) {
333  fPDHit = (PndDrcPDHit*)fPDHitArray->At(h);
334 
335  Int_t sensorId = fPDHit->GetSensorId();
337 
338  Int_t pointID = fPDHit->GetLink(1).GetIndex();
339  //Int_t eventID = fPDHit->GetLink(1).GetEntry(); //[R.K. 01/2017] unused variable?
340 
341  fPDPoint = (PndDrcPDPoint*)fPDPointArray->At(pointID);
343 
344  if(fPDPoint->GetTrackID()<1) continue;
345  fMCTrack =(PndMCTrack*)fMCArray->At(fPDPoint->GetTrackID());
346  if(fMcTrackId!=fMCTrack->GetMotherID()) continue;
347 
348  //Double_t en = 1.2398/(fMCTrack->GetMomentum().Mag()*1E6); //[R.K. 01/2017] unused variable?
349  hEnergy->Fill(fMCTrack->GetMomentum().Mag()*1E9);
350 
351  //if(fBarPoint->GetBoxId() != boxId || fBarPoint->GetBarId() != barId) continue;
352 
353  Int_t nev=0;
354  TVector3 vec;
355  gg_pathid=0;
356  for(int i=0; i<fEVPointArray->GetEntriesFast(); i++){
358  if(fPDPoint->GetTrackID() == fEVPoint->GetTrackID()){
359  nev++;
360  vec = fEVPoint->GetNormal();
361  gg_pathid += (vec.X()+vec.Y()*10 + vec.Z()*100)*1000*nev;
362  }
363  }
364 
365  if(fMethod==0 || fMethod==5) LookUpTable(barId,sensorId);
366  if(fMethod==1 || fMethod==5) TimeImaging(sensorId);
367  }
368 
369  Int_t pid=fParticleArray[fPidTrue];
370 
371  // std::cout<<"HHHHHHHHHH "<<fLk1[2];
372  // fLk1[2]+=fHitsE[pid]*TMath::Log(fFnph[2]->Eval(fHitsE[pid]));
373  // fLk1[3]+=fHitsE[pid]*TMath::Log(fFnph[3]->Eval(fHitsE[pid]));
374  // std::cout<<" --- "<<fLk1[2] <<std::endl;
375 
376  fLikelihood[0] = fLk1[3]-fLk1[2];
377  fLikelihood[1] = fLk2[3]-fLk2[2];
378 
379  if(fMethod==0 || fMethod==5) {
380  fhLk1[pid]->Fill(fLikelihood[0]);
381  fHits[pid]+=fHitsE[pid];
382  fhNph[pid]->Fill(fHitsE[pid]);
383  std::cout<<"method 0 LK = "<< fLikelihood[0] <<std::endl;
384  }
385  if(fMethod==1 || fMethod==5){
386  fhLk2[pid]->Fill(fLikelihood[1]);
387  fHits[pid]+= fPDHitArray->GetEntriesFast();
388  fhNph[pid]->Fill(fPDHitArray->GetEntriesFast());
389  std::cout<<"method 1 LK = "<< fLikelihood[1] << " "<< fPidTrue<<std::endl;
390  }
391 
392  if(fLikelihood[0]>0) {
393  if(fPidTrue==321) fEventsEff[3]++;
394  else fEventsMis[3]++;
395  }else{
396  if(fPidTrue==211) fEventsEff[2]++;
397  else fEventsMis[2]++;
398  }
399  fEvents[pid]++;
400 
401  if(false){// && fLk1[2] > fLk1[3]){
402  TCanvas* c = new TCanvas("c","c",0,0,800,600);
403  fHist->Scale(1/fHist->GetMaximum());
404  fHist->SetTitle(Form("%d",fPidTrue));
405  fHist->Draw();
406 
407  fFunc[2]->SetLineColor(kBlue);
408  fFunc[2]->Draw("same");
409  fFunc[3]->SetLineColor(kRed);
410  fFunc[3]->Draw("same");
411 
412  TLine *line = new TLine(0,0,0,1000);
413  line->SetX1(fAngle[2]);
414  line->SetX2(fAngle[2]);
415  line->SetY1(gPad->GetUymin());
416  line->SetY2(fHist->GetMaximum()*1.05);
417  line->SetLineColor(kBlue);
418  line->Draw();
419 
420  TLine *line1 = new TLine(0,0,0,1000);
421  line1->SetX1(fAngle[3]);
422  line1->SetX2(fAngle[3]);
423  line1->SetY1(gPad->GetUymin());
424  line1->SetY2(fHist->GetMaximum()*1.05);
425  line1->SetLineColor(kRed);
426  line1->Draw();
427 
428  c->Modified();
429  c->Update();
430  c->WaitPrimitive();
431  }
432 
433  fHist->Reset();
434 }
435 
436 void PndDrcReco::LookUpTable(Int_t barId, Int_t sensorId){
437  TVector3 dird, dir;
438  Double_t evtime, luttime, luttheta, tangle, noise(0.3);
439  Int_t pid=fParticleArray[fPidTrue];
440 
441  if(fMCTrack->GetMomentum().Z()>0) fReflected = kTRUE;
442  else fReflected = kFALSE;
443 
444  fLenz = fPosInBar.Z()+119;
445  if(fReflected) fLenz = 2*240 - fLenz;
446 
447  PndDrcLutNode *node = (PndDrcLutNode*) fLut[barId]->At(sensorId);
448  Int_t size = node->Entries();
449 
450  Bool_t isGood(false);
451  for(int i=0; i<size; i++){
452  dird = node->GetEntry(i);
453  evtime = node->GetTime(i);
454 
455  hPathAll->Fill(node->GetPathId(i));
456  if((Int_t)gg_pathid != (Int_t)node->GetPath(i)){
457  //continue;
458  }else{
459  hPath->Fill(node->GetPathId(i));
460  }
461 
462  for(int u=0; u<4; u++){
463  if(u == 0) dir = dird;
464  if(u == 1) dir.SetXYZ(-dird.X(), dird.Y(), dird.Z());
465  if(u == 2) dir.SetXYZ( dird.X(),-dird.Y(), dird.Z());
466  if(u == 3) dir.SetXYZ(-dird.X(),-dird.Y(), dird.Z());
467  if(fReflected) dir.SetXYZ( dir.X(), dir.Y(),-dir.Z());
468 
469  if(dir.Angle(fNx) < fCriticalAngle || dir.Angle(fNy) < fCriticalAngle) continue;
470 
471  luttheta = dir.Theta();
472  if(luttheta > TMath::Pi()/2.) luttheta = TMath::Pi()-luttheta;
473  luttime = fLenz/cos(luttheta)/19.8 + evtime;
474 
475  Double_t tdiff=luttime -fTimeHit;
476 
477  tangle = fMomInBar.Angle(dir);
478 
479  // tangle += 0.002*tdiff;
480 
481  // //mean shift correction
482  // if(fPidTrue==211) tangle += shiftPi[(Int_t)(fTheta+0.2-22)];
483  // if(fPidTrue==321) tangle += shiftK[(Int_t)(fTheta+0.2-22)];
484 
485  Int_t momid=fMom*10+0.5;
486  Int_t thetaid=fTheta+0.5;
487  if(fabs(c_mean[pid][momid][thetaid])<0.008) tangle += c_mean[pid][momid][thetaid];
488  //tangle += 0.5*(c_mean[2][momid][thetaid]+c_mean[3][momid][thetaid]);
489 
490  // if(tangle<fAngle[3]-0.04 || tangle>fAngle[2]+0.04) continue;
491  if(tangle < 0.4 || tangle > 0.9) continue;
492 
493  fhTime[pid]->Fill(fTimeHit);
494  fhDiff[pid]->Fill(tdiff);
495 
496  if(fabs(tdiff)>1.0) continue;
497 
498  if(fabs(tangle-fAngle[pid])<0.1) isGood=true;
499  // if(tangle > 0.75 && tangle < 0.85) isGood=true;
500 
501  hSD->Fill(tangle,tdiff);
502 
503  fLk1[2] += TMath::Log((fFunc[2]->Eval(tangle)+noise)); // 211
504  fLk1[3] += TMath::Log((fFunc[3]->Eval(tangle)+noise)); // 321
505 
506 
507  fhTang[pid]->Fill(tangle);
508  fHist->Fill(tangle);
509  }
510  }
511  if(isGood) fHitsE[pid]++;
512 }
513 
514 void PndDrcReco::TimeImaging(Int_t sensorId){
515  Double_t noise = 1e-3;
516  Int_t momid=fMom*10+0.5;
517  Int_t thetaid=fTheta+0.5;
518  Int_t pid=fParticleArray[fPidTrue];
519 
520  fhTime[pid]->Fill(fTimeHit);
521  if(fhPdf[2][momid][thetaid][sensorId] && fhPdf[3][momid][thetaid][sensorId]){
522  // TCanvas* c = new TCanvas("c","c",0,0,800,600);
523  // fhPdf[2][momid][thetaid][sensorId]->Draw();
524  // fhPdf[3][momid][thetaid][sensorId]->Draw("same");
525  // c->Update();
526  // c->WaitPrimitive();
527  fLk2[2] += TMath::Log(fhPdf[2][momid][thetaid][sensorId]->GetBinContent(fhPdf[2][momid][thetaid][sensorId]->FindBin(fTimeHit))+noise);
528  fLk2[3] += TMath::Log(fhPdf[3][momid][thetaid][sensorId]->GetBinContent(fhPdf[3][momid][thetaid][sensorId]->FindBin(fTimeHit))+noise);
529 
530  }
531 }
532 
533 void PndDrcReco::DetermineBarId(Double_t &boxPhi, Int_t &barId){
534  Double_t startPhi = fPosInBar.Phi()/TMath::Pi()*180;
535  if(startPhi < 0) startPhi = 360 + startPhi;
536  if(startPhi >= 0 && startPhi < 90) boxPhi = TMath::Floor(startPhi/fDphi) *fDphi + fDphi/2.;
537  if(startPhi >= 90 && startPhi < 270) boxPhi = 90 + fPipehAngle + TMath::Floor((startPhi-90-fPipehAngle)/fDphi) *fDphi + fDphi/2.;
538  if(startPhi >= 270 && startPhi < 360) boxPhi = 270 + fPipehAngle + TMath::Floor((startPhi-270-fPipehAngle)/fDphi) *fDphi + fDphi/2.;
539 
540  if(fRadType==5) barId = (int) (2.5 + (boxPhi-startPhi)/fBarPhi);
541  if(fRadType==4) barId = (int) (2 + (boxPhi-startPhi)/fBarPhi);
542  if(fRadType==3) barId = (int) (1.5 + (boxPhi-startPhi)/fBarPhi);
543  if(fRadType==2) barId = (int) (1 + (boxPhi-startPhi)/fBarPhi);
544  if(fRadType==1) barId = 0;
545  if(barId>4 || barId<0){
546  std::cout<<"Error in PndDrcReco: Bar Id is wrong. barId = "<< barId <<std::endl;
547  barId = -1;
548  }
549 }
550 
552  Double_t cherenkovreco = -1;
553 
554  if(fHist->Integral()>20 ){
555  TCanvas* c = new TCanvas("c","c",0,0,800,600);
556  Int_t nfound = fSpect->Search(fHist,1,"",0.6);
557  Float_t *xpeaks = (Float_t*)fSpect->GetPositionX();
558  if(nfound>0) cherenkovreco = xpeaks[0];
559  fFit->SetParameter(1,cherenkovreco); // peak
560  fFit->SetParameter(2,0.01); // width
561  fHist->Fit("fgaus","Q","",cherenkovreco-0.02,cherenkovreco+0.02);
562  cherenkovreco = fFit->GetParameter(1);
563  std::cout<<"sigma "<< fFit->GetParameter(2) <<std::endl;
564 
565  if(cherenkovreco<0 || cherenkovreco>1 ) cherenkovreco = 0;
566 
567  if(fVerbose>1){
568  fHist->Draw();
569  c->Modified();
570  c->Update();
571  c->WaitPrimitive();
572  // c->Print(Form("pic/animpid/animpid_%d.png",g_num++));
573  }
574  }
575  fHist->Reset();
576 
577  return cherenkovreco;
578 }
579 
581  Double_t tdiff, diff=100;
582  Int_t minid=0;
583  for(Int_t i=0; i<5; i++){
584  tdiff = fabs(cangle - acos(sqrt(mom*mom + fMass[i]*fMass[i])/mom/1.46907)); //1.46907 - fused silica
585  if(tdiff<diff){
586  diff = tdiff;
587  minid = i;
588  }
589  }
590  return fPdg[minid];
591 }
592 
593 void PndDrcReco::CanvasAdd(TString name,Int_t w, Int_t h){
594  fCanvasList->Add(new TCanvas(name,name,0,0,w,h));
595 }
596 
598  gROOT->SetBatch(1);
599  TIter next(fCanvasList);
600  TCanvas *c=0;
601  gSystem->mkdir(path,kTRUE);
602  while((c = (TCanvas*) next())){
603  TString name = c->GetName();
604  TCanvas *cc = new TCanvas(name+"exp","cExport",0,0,800,400);
605  cc = (TCanvas*) c->DrawClone();
606  cc->SetCanvasSize(800,400);
607  cc->SetBottomMargin(0.12);
608  TIter nexth(cc->GetListOfPrimitives());
609  TObject *obj;
610  while((obj = nexth())){
611  if(obj->InheritsFrom("TH1")){
612  TH1F *hh = (TH1F*)obj;
613  hh->GetXaxis()->SetTitleSize(0.06);
614  hh->GetYaxis()->SetTitleSize(0.06);
615 
616  hh->GetXaxis()->SetLabelSize(0.05);
617  hh->GetYaxis()->SetLabelSize(0.05);
618 
619  hh->GetXaxis()->SetTitleOffset(0.85);
620  hh->GetYaxis()->SetTitleOffset(0.85);
621  }
622  }
623  cc->Modified();
624  cc->Update();
625  TString uid("");
626  if(fOutFile.Contains("/")){
627  TString tname = fOutFile;
628  path= tname.Remove(fOutFile.Last('/')) + "/";
629  tname = fOutFile;
630  uid=tname.Remove(0,fOutFile.Last('/')+1);
631  }
632  cc->Print(path+uid+name+".png");
633  }
634  gROOT->SetBatch(0);
635 }
636 
637 // ----- Finish Task ---------------------------------------------------
639 
640  Double_t step_mom=0.1; //[0,4]
641  Double_t step_theta=1; //[22,140]
642  Double_t step_phi=0.4; //[0,22]
643 
644  Int_t id_mom = fMom/step_mom+0.1;
645  Int_t id_theta = fTheta/step_theta+0.2;
646  Int_t id_phi = fPhi/step_phi+0.2;
647  TString strrun=Form("_%d_%d_%d",id_mom,id_theta,id_phi);
648 
649  CanvasAdd("hLikelihood"+strrun);
650  TF1 *ff;
651  Double_t m1,m2,s1,s2;
652 
653  if(fMethod==0){
654  if(fhLk1[2]->Integral()>10){
655  fhLk1[2]->Fit("gaus","S");
656  ff = fhLk1[2]->GetFunction("gaus");
657  m1=ff->GetParameter(1);
658  s1=ff->GetParameter(2);
659  }
660  if(fhLk1[3]->Integral()>10){
661  fhLk1[3]->Fit("gaus","S");
662  ff = fhLk1[3]->GetFunction("gaus");
663  m2=ff->GetParameter(1);
664  s2=ff->GetParameter(2);
665  }
666 
667  fSeparation[0] = (fabs(m2-m1))/(0.5*(s1+s2));
668  std::cout<<"separation1 "<< fSeparation[0] <<std::endl;
669 
670  fhLk1[2]->SetTitle(Form("S = %2.2f",fSeparation[0]));
671  fhLk1[2]->SetLineColor(4);
672  fhLk1[3]->SetLineColor(2);
673  fhLk1[2]->Draw();
674  fhLk1[3]->Draw("same");
675 
676  CanvasAdd("hDiff"+strrun);
677  fhDiff[2]->SetLineColor(4);
678  fhDiff[2]->Draw();
679  fhDiff[3]->SetLineColor(2);
680  fhDiff[3]->Draw("same");
681 
682  CanvasAdd("hPathAll"+strrun);
683  hPathAll->Draw();
684  hPath->SetLineColor(2);
685  hPath->Draw("same");
686 
687  CanvasAdd("hAngle"+strrun);
688  for(Int_t i=2; i<4; i++){
689  fFit->SetParameter(1,fAngle[i]); // peak
690  fFit->SetParameter(2,0.01); // width
691  if(fhTang[i]->Integral()>10){
692  fhTang[i]->Fit("fgaus","Q","",fAngle[i]-0.05,fAngle[i]+0.05);
693  fhTang[i]->Fit("fgaus","QM","",fAngle[i]-0.05,fAngle[i]+0.05);
694  fSpr[i]=fFit->GetParameter(2);
695  fCangle[i]=fFit->GetParameter(1);
696  }
697  }
698  fhTang[2]->SetTitle(Form("#theta_{C} = %2.3f #sigma = %2.4f #theta_{C} = %2.3f #sigma = %2.4f",fCangle[3],fSpr[3],fCangle[2],fSpr[2]));
699 
700  fhTang[2]->SetLineColor(4);
701  fhTang[2]->Draw();
702 
703  fhTang[3]->SetLineColor(2);
704  fhTang[3]->Draw("same");
705 
706  TLine *line = new TLine(0,0,0,1000);
707  line->SetX1(fAngle[2]);
708  line->SetX2(fAngle[2]);
709  line->SetY1(gPad->GetUymin());
710  line->SetY2(fhTang[2]->GetMaximum()*1.05);
711  line->SetLineColor(kBlue);
712  line->Draw();
713 
714  TLine *line1 = new TLine(0,0,0,1000);
715  line1->SetX1(fAngle[3]);
716  line1->SetX2(fAngle[3]);
717  line1->SetY1(gPad->GetUymin());
718  line1->SetY2(fhTang[2]->GetMaximum()*1.05);
719  line1->SetLineColor(kRed);
720  line1->Draw();
721 
722  CanvasAdd("hSD"+strrun);
723  hSD->Draw("colz");
724  }
725 
726  if(fMethod==1){
727  if(fhLk2[2]->Integral()>10){
728  fhLk2[2]->Fit("gaus","S");
729  ff = fhLk2[2]->GetFunction("gaus");
730  m1=ff->GetParameter(1);
731  s1=ff->GetParameter(2);
732  }
733  if(fhLk2[3]->Integral()>10){
734  fhLk2[3]->Fit("gaus","S");
735  ff = fhLk2[3]->GetFunction("gaus");
736  m2=ff->GetParameter(1);
737  s2=ff->GetParameter(2);
738  }
739 
740  fSeparation[1] = (fabs(m2-m1))/(0.5*(s1+s2));
741  std::cout<<"separation2 "<< fSeparation[1] <<std::endl;
742 
743  fhLk2[2]->SetTitle(Form("S = %2.2f",fSeparation[1]));
744  fhLk2[2]->SetLineColor(4);
745  fhLk2[3]->SetLineColor(2);
746  fhLk2[2]->Draw();
747  fhLk2[3]->Draw("same");
748  }
749 
750  CanvasAdd("hTime"+strrun);
751  fhTime[2]->SetLineColor(4);
752  fhTime[2]->Draw();
753  fhTime[3]->SetLineColor(2);
754  fhTime[3]->Draw("same");
755 
756  // nph pdf
757  // TFile fn("nph_"+strrun+".root","recreate");
758  // CanvasAdd("hNph"+strrun);
759  // for(Int_t i=2; i<4; i++){
760  // if(fhNph[i]->Integral()>10){
761  // fhNph[i]->Fit("gaus","Q");
762  // fFnph[i]=fhNph[i]->GetFunction("gaus");
763  // // fFnph[i]->SetParameter(0,1);
764  // fFnph[i]->SetName(Form("%d_%d_%d",i,id_mom,id_theta));
765  // fFnph[i]->Write();
766  // }
767  // }
768  // fn.Close();
769 
770  fhNph[2]->SetLineColor(4);
771  fhNph[2]->Draw();
772  fhNph[3]->SetLineColor(2);
773  fhNph[3]->Draw("same");
774 
775  CanvasAdd("hEnergy"+strrun);
776  hEnergy->Draw();
777 
778  for(Int_t l=0; l<5; l++) fLut[l]->Clear();
779  for(Int_t i=0; i<5; i++){
780  if(fEvents[i]<1) continue;
781  fNph[i]=fHits[i]/(Double_t)fEvents[i];
784  }
785 
786  std::cout<<"N pi "<<fNph[2] << " N K " <<fNph[3] <<std::endl;
787  std::cout<<"Eff_K "<< fEfficiency[3] << " Mis_K "<<fMissId[3] <<std::endl;
788  std::cout<<"Eff_pi "<< fEfficiency[2] << " Mis_pi "<<fMissId[2] <<std::endl;
789 
790  fFileOut->cd();
791  fhTang[2]->Write();
792  fhTang[3]->Write();
793  fTreeOut->Fill();
794  fTreeOut->Write();
795  fFileOut->Write();
796 
797  CanvasSave(Form("data/reco/%d/",id_mom));
798 
799  cout << "-I- PndDrcReco: Finish" << endl;
800 }
801 
Int_t fMethod
Definition: PndDrcReco.h:103
friend F32vec4 acos(const F32vec4 &a)
Definition: P4_F32vec4.h:113
TH1F * fhTime[5]
Definition: PndDrcReco.h:119
Int_t FindPdg(Double_t mom, Double_t cangle)
Definition: PndDrcReco.cxx:580
TTree * fTree
Definition: PndDrcReco.h:79
Double_t fPdg[5]
Definition: PndDrcReco.h:111
PndDrcEVPoint * fEVPoint
Definition: PndDrcReco.h:84
Int_t GetPdgCode() const
int fVerbose
Definition: poormantracks.C:24
friend F32vec4 cos(const F32vec4 &a)
Definition: P4_F32vec4.h:112
Double_t fCangle[5]
Definition: PndDrcReco.h:122
virtual InitStatus Init()
Definition: PndDrcReco.cxx:39
PndDrcBarPoint * fBarPoint
Definition: PndDrcReco.h:83
TH1F * fhNph[5]
Definition: PndDrcReco.h:119
Int_t GetPathId(Int_t entry)
Definition: PndDrcLutNode.h:40
PndDrcPDPoint * fPDPoint
Definition: PndDrcReco.h:85
Double_t c_spr[5][50][150]
Definition: PndDrcReco.h:132
TVector3 fMomInBar
Definition: PndDrcReco.h:104
TClonesArray * fPDHitArray
Definition: PndDrcReco.h:73
TClonesArray * fLut[5]
Definition: PndDrcReco.h:74
Int_t fVerbose
Definition: PndDrcReco.h:93
Double_t fMissId[5]
Definition: PndDrcReco.h:123
Int_t gg_pathid
Definition: PndDrcReco.cxx:313
Double_t fPipehAngle
Definition: PndDrcReco.h:66
Double_t BBoxNum()
Definition: PndGeoDrc.h:136
void CanvasSave(TString path="data/reco")
Definition: PndDrcReco.cxx:597
Int_t i
Definition: run_full.C:25
Double_t fNph[5]
Definition: PndDrcReco.h:122
__m128 m
Definition: P4_F32vec4.h:28
Int_t GetSensorId()
Definition: PndDrcPDHit.h:59
Double_t fR1
Definition: PndDrcReco.h:127
TTree * fTreeOut
Definition: PndDrcReco.h:80
TH2F * hSD
Definition: PndDrcReco.cxx:254
TFile * fFileOut
Definition: PndDrcReco.h:78
Double_t fCriticalAngle
Definition: PndDrcReco.h:109
Int_t GetBarId() const
friend F32vec4 sqrt(const F32vec4 &a)
Definition: P4_F32vec4.h:29
TString outFile
Definition: hit_dirc.C:17
TF1 * fFunc[5]
Definition: PndDrcReco.h:114
#define verbose
Double_t fDphi
Definition: PndDrcReco.h:66
TVector3 fPosInBar
Definition: PndDrcReco.h:105
Double_t BarWidth()
Definition: PndGeoDrc.h:100
int pid()
TVector3 fNy
Definition: PndDrcReco.h:126
Double_t FindPeak()
Definition: PndDrcReco.cxx:551
TVector3 GetMomentum() const
Definition: PndMCTrack.h:78
Int_t fHitsE[5]
Definition: PndDrcReco.h:125
void DetermineBarId(Double_t &boxPhi, Int_t &barId)
Definition: PndDrcReco.cxx:533
Double_t fMom
Definition: PndDrcReco.h:122
Double_t mom
Definition: plot_dirc.C:14
TClonesArray * fBarPointArray
Definition: PndDrcReco.h:69
double r1
TH1F * hPathAll
Definition: PndDrcReco.cxx:252
TString fLutFile
Definition: PndDrcReco.h:96
void DetermineCherenkov(Int_t boxId, Int_t barId)
Definition: PndDrcReco.cxx:314
Double_t GetPath(Int_t entry)
Definition: PndDrcLutNode.h:41
Double_t fSpr[5]
Definition: PndDrcReco.h:122
Int_t fParticleArray[3000]
Definition: PndDrcReco.h:103
Int_t fEventsMis[5]
Definition: PndDrcReco.h:125
Double_t p
Definition: anasim.C:58
virtual Double_t GetTime()
Definition: PndDrcPDHit.h:55
cout<< "blue = Monte Carlo "<< endl;cout<< "red = Helix Hit "<< endl;cout<< "green = Center Of Tubes "<< endl;for(Int_t k=0;k< track->GetEntriesFast();k++){PndSttTrack *stttrack=(PndSttTrack *) track-> At(k)
Definition: checkhelixhit.C:56
TString fOutFile
Definition: run_full.C:10
Double_t PipehAngle()
Definition: PndGeoDrc.h:139
Int_t GetBarPointID() const
Definition: PndDrcPDPoint.h:56
int uid(int lev, int lrun, int lmode)
Definition: autocutx.C:122
TString m2(TString pts, TString exts="e px py pz")
Definition: invexp.C:117
Double_t fPhi
Definition: PndDrcReco.h:122
TH1F * fhPdf[5][40][120][1100]
Definition: PndDrcReco.h:120
int nHits
Definition: RiemannTest.C:16
Int_t fPidDist
Definition: PndDrcReco.h:124
Int_t GetBoxId() const
Double_t
TClonesArray * fMCArray
Definition: PndDrcReco.h:68
Double_t fTimeInBar
Definition: PndDrcReco.h:106
TFile * fFile
Definition: PndDrcReco.h:77
TH1F * fhLk1[5]
Definition: PndDrcReco.h:119
Double_t fLenz
Definition: PndDrcReco.h:108
Double_t fLk2[5]
Definition: PndDrcReco.h:117
Double_t c_mean[5][50][150]
Definition: PndDrcReco.h:132
Double_t fSeparation[2]
Definition: PndDrcReco.h:122
void LookUpTable(Int_t barId, Int_t sensorId)
Definition: PndDrcReco.cxx:436
virtual void Exec(Option_t *option)
Definition: PndDrcReco.cxx:257
Int_t nevents
Definition: PndDrcReco.h:94
Double_t fLikelihood[2]
Definition: PndDrcReco.h:122
Double_t nQuartz()
Definition: PndGeoDrc.h:70
Double_t fTimeHit
Definition: PndDrcReco.h:107
TF1 * fFit
Definition: PndDrcReco.h:100
PndGeoDrc * fGeo
Definition: PndDrcReco.h:65
TRandom fRandom
Definition: PndDrcReco.h:128
friend F32vec4 fabs(const F32vec4 &a)
Definition: P4_F32vec4.h:47
PndMCTrack * fMCTrack
Definition: PndDrcReco.h:82
TVector3 GetNormal()
Definition: PndDrcEVPoint.h:49
void CanvasAdd(TString name="c", Int_t w=800, Int_t h=400)
Definition: PndDrcReco.cxx:593
TVector3 GetEntry(Int_t entry)
Definition: PndDrcLutNode.h:39
TString name
virtual void Finish()
Definition: PndDrcReco.cxx:638
Double_t barhGap()
Definition: PndGeoDrc.h:112
Int_t fPidLike[2]
Definition: PndDrcReco.h:124
Int_t fEvType
Definition: PndDrcReco.h:98
TH1F * fhLk2[5]
Definition: PndDrcReco.h:119
TSpectrum * fSpect
Definition: PndDrcReco.h:101
Double_t GetTime(Int_t entry)
Definition: PndDrcLutNode.h:42
TString fPdfFile
Definition: PndDrcReco.h:97
TString fOutFile
Definition: PndDrcReco.h:95
TH1F * fhDiff[5]
Definition: PndDrcReco.h:119
TList * fCanvasList
Definition: PndDrcReco.h:130
Int_t Entries()
Definition: PndDrcLutNode.h:36
Double_t fLk1[5]
Definition: PndDrcReco.h:116
static T Log(const T &x)
Definition: PndCAMath.h:40
Int_t fLensType
Definition: PndDrcReco.h:98
Int_t fRadType
Definition: PndDrcReco.h:98
ClassImp(PndAnaContFact)
PndDrcPDHit * fPDHit
Definition: PndDrcReco.h:87
TH1F * hEnergy
Definition: PndDrcReco.cxx:251
Bool_t fReflected
Definition: PndDrcReco.h:110
TClonesArray * fPDPointArray
Definition: PndDrcReco.h:71
Int_t fHits[5]
Definition: PndDrcReco.h:125
TTree * t
Definition: bump_analys.C:13
TH1F * hPath
Definition: PndDrcReco.cxx:253
Double_t fBarPhi
Definition: PndDrcReco.h:66
Double_t fMass[5]
Definition: PndDrcReco.h:112
Double_t fAngle[5]
Definition: PndDrcReco.h:113
TClonesArray * hh
Int_t fPidTrue
Definition: PndDrcReco.h:124
Int_t GetMotherID() const
Definition: PndMCTrack.h:74
static int next[96]
Definition: ranlxd.cxx:374
TVector3 fNx
Definition: PndDrcReco.h:126
Double_t fTheta
Definition: PndDrcReco.h:122
Double_t Pi
PndAnaPidSelector *& obj
Int_t fEvents[5]
Definition: PndDrcReco.h:125
Double_t fEfficiency[5]
Definition: PndDrcReco.h:123
double noise
TClonesArray * fEVPointArray
Definition: PndDrcReco.h:70
Int_t fMcTrackId
Definition: PndDrcReco.h:124
Int_t fEventsEff[5]
Definition: PndDrcReco.h:125
dble_vec_t vec[12]
Definition: ranlxd.cxx:380
void TimeImaging(Int_t sensorId)
Definition: PndDrcReco.cxx:514
Double_t fR2
Definition: PndDrcReco.h:127
double r2
Double_t radius()
Definition: PndGeoDrc.h:92
TH1F * fHist
Definition: PndDrcReco.h:99
TH1F * fhTang[5]
Definition: PndDrcReco.h:119