FairRoot/PandaRoot
checkdedx_helixhit.C
Go to the documentation of this file.
1 {
2  gROOT->Reset();
3  #include <vector>
4  TStopwatch timer;
5  timer.Start();
6 // gROOT->LoadMacro("$VMCWORKDIR/gconfig/rootlogon.C");
7 // rootlogon();
8 
9  // MCpoints
10  TFile filerun("testrun.root");
11  TTree *treemc = (TTree*) filerun.Get("pndsim");
12  TClonesArray *pnt = new TClonesArray("PndSttPoint");
13  treemc->SetBranchAddress("STTPoint",&pnt);
14  TClonesArray *mctrack = new TClonesArray("PndMCTrack");
15  treemc->SetBranchAddress("MCTrack",&mctrack);
16 
17  // Hits
18  TFile filedigi("testdigi.root");
19  TTree *treedigi = (TTree*) filedigi.Get("pndsim");
20  TClonesArray *digi = new TClonesArray("PndSttHit");
21  treedigi->SetBranchAddress("STTHit",&digi);
22 
23  // HelixHits
24  TFile filehelix("testreco.root");
25  TTree *treereco = (TTree*) filehelix.Get("pndsim");
26  TClonesArray *hh = new TClonesArray("PndSttHelixHit");
27  treereco->SetBranchAddress("SttHelixHit",&hh);
28 
29  // Helix Tracks
30  TClonesArray *track = new TClonesArray("PndSttTrack");
31  treereco->SetBranchAddress("STTTrack",&track);
32  TClonesArray *matchtrack = new TClonesArray("PndSttTrackMatch");
33  treereco->SetBranchAddress("STTTrackMatch",&matchtrack);
34 
35  TCanvas *c = new TCanvas("c", "c", 0, 0, 600, 600);
36  c->Divide(1,2);
37  TH1F *samplenum = new TH1F("samplenum","number of sampling",50,0.,50.);
38  TH2F *hdedxvsp = new TH2F("hdedxvsp","dedx vs p",100,0.,1.5, 100,0.,40.);
39 
40  TCanvas *c1 = new TCanvas("c1", "c1", 0, 0, 600, 600);
41  c1->Divide(2,2);
42  TH2F *hdedxvsp_p = new TH2F("hdedxvsp_p","dedx vs p for p",100,0.,1.5, 100,0.,40.);
43  TH2F *hdedxvsp_pi = new TH2F("hdedxvsp_pi","dedx vs p for #pi",100,0.,1.5, 100,0.,40.);
44  TH2F *hdedxvsp_e = new TH2F("hdedxvsp_e","dedx vs p for e",100,0.,1.5, 100,0.,40.);
45  TH2F *hdedxvsp_k = new TH2F("hdedxvsp_k","dedx vs p for K",100,0.,1.5, 100,0.,40.);
46  TH2F *hdedxvsp_mu = new TH2F("hdedxvsp_mu","dedx vs p for #mu",100,0.,1.5, 100,0.,40.);
47 
48  TCanvas *c2 = new TCanvas("c2", "c2", 0, 0, 600, 600);
49  TH2F *hdedxvsp_reco = new TH2F("hdedxvsp_reco","dedx vs reco p",100,0.,1.5, 100,0.,40.);
50 
51  cout << treereco->GetEntriesFast() << " events" << endl;
52 
53  // loop on evts
54  for(Int_t evt = 0; evt < treereco->GetEntriesFast(); evt++) {
55  if(evt%100 == 0) cout << evt << endl;
56 
57  treemc->GetEntry(evt);
58  treedigi->GetEntry(evt);
59  treereco->GetEntry(evt);
60 
61  // tracks loop
62  for (Int_t k = 0; k < track->GetEntriesFast(); k++) {
63 
64  PndSttTrack *stttrack = (PndSttTrack*) track->At(k);
65  if(!stttrack) continue;
66  PndSttTrackMatch *mtrack = (PndSttTrackMatch *) matchtrack->At(k);
67  if(!mtrack) continue;
68  PndMCTrack *MCtrack = (PndMCTrack*) mctrack->At(mtrack->GetMCTrackID());
69  if(!MCtrack) continue;
70  Int_t PDGcode = MCtrack->GetPdgCode();
71 
72  Double_t d0 = stttrack->GetDist();
73  Double_t phi0 = stttrack->GetPhi();
74  Double_t R = stttrack->GetRad();
75  Double_t z0 = stttrack->GetZ();
76  Double_t tanl = stttrack->GetTanL();
77  Double_t h = -(Int_t) stttrack->GetCharge();
78  Double_t ptran = 0.003 * 2 * R;
79 
80  Double_t plong = ptran * tanl;
81  Double_t ptot = sqrt(plong*plong + ptran*ptran);
82 
83  Double_t x0 = (d0 + R) * cos(phi0);
84  Double_t y0 = (d0 + R) * sin(phi0);
85 
86  Int_t hitcounter = stttrack->GetNofHelixHits();
87  std::vector<double> dedxvec;
88  dedxvec.clear();
89  TVector3 momentum = MCtrack->GetMomentum();
90  Int_t losthit = 0;
91  for (Int_t j = 0; j < hitcounter; j++) {
92  Int_t iHHit = stttrack->GetHelixHitIndex(j);
93  PndSttHelixHit *helixhit = (PndSttHelixHit*) hh->At(iHHit);
94  if(!helixhit) continue;
95 
96  Int_t hitindex = helixhit->GetHitIndex();
97 // PndSttHit* hit = (PndSttHit*) digi->At(hitindex);
98 // PndSttPoint *point = (PndSttPoint*) pnt->At(hit->GetRefIndex());
99 
100  if(helixhit->GetdEdx() != 0) dedxvec.push_back(helixhit->GetdEdx());
101  else losthit++;
102  }
103 
104  hitcounter -= losthit;
105 
106  if(hitcounter > 0) {
107  // truncated mean
108  Double_t perc = 0.60;
109  // sort
110  std::sort(dedxvec.begin(), dedxvec.end());
111 
112  //truncated mean
113  Double_t sum = 0;
114  Int_t endnum = floor(hitcounter * perc);
115 
116 
117  for(Int_t m = 0; m < endnum; m++) sum += dedxvec[m];
118  Double_t tmean;
119  if(endnum > 0) {
120  tmean = sum/(Double_t) endnum;
121  hdedxvsp->Fill(momentum->Mag(), tmean);
122  hdedxvsp_reco->Fill(ptot, tmean);
123 
124  samplenum->Fill(hitcounter);
125 
126  if(abs(PDGcode) == 11) { hdedxvsp_e->Fill(momentum->Mag(), tmean);}
127  else if(abs(PDGcode) == 13) { hdedxvsp_mu->Fill(momentum->Mag(), tmean);}
128  else if(abs(PDGcode) == 211) { hdedxvsp_pi->Fill(momentum->Mag(), tmean);}
129  else if(abs(PDGcode) == 321) { hdedxvsp_k->Fill(momentum->Mag(), tmean); }
130  else if(abs(PDGcode) == 2212){ hdedxvsp_p->Fill(momentum->Mag(), tmean);}
131 
132  }
133  }
134  }
135  }
136 
137  c->cd(1);
138  hdedxvsp->Draw();
139  c->cd(2);
140  samplenum->Draw();
141 
142  c1->cd(1);
143  hdedxvsp_e->SetMarkerColor(2); // red = electron
144  hdedxvsp_e->Draw();
145  c1->cd(2);
146  hdedxvsp_k->SetMarkerColor(3); // green = kaon
147  hdedxvsp_k->Draw();
148  c1->cd(3);
149  hdedxvsp_pi->SetMarkerColor(4); // blue = pion
150  hdedxvsp_mu->SetMarkerColor(7); // light blue = muon
151  hdedxvsp_pi->Draw();
152  hdedxvsp_mu->Draw("SAME");
153  c1->cd(4);
154  hdedxvsp_p->SetMarkerColor(5); // yellow = proton
155  hdedxvsp_p->Draw();
156 
157  c2->cd();
158  hdedxvsp_reco->Draw();
159 
160  TFile *out_dedx = new TFile("out_dedx_helixhit.root", "RECREATE");
161  hdedxvsp->Write();
162  hdedxvsp_e->Write();
163  hdedxvsp_mu->Write();
164  hdedxvsp_pi->Write();
165  hdedxvsp_k->Write();
166  hdedxvsp_p->Write();
167  hdedxvsp_reco->Write();
168  samplenum->Write();
169  out_dedx->Write();
170  out_dedx->Close();
171 
172 
173 
174 }
TTree * treemc
Double_t tanl
Definition: checkhelixhit.C:63
TH2F * hdedxvsp_k
Double_t z0
Definition: checkhelixhit.C:62
TH1F * samplenum
Double_t x0
Definition: checkhelixhit.C:70
friend F32vec4 cos(const F32vec4 &a)
Definition: P4_F32vec4.h:112
Double_t GetTanL()
Definition: PndSttTrack.h:60
Int_t GetHitIndex()
TH2F * hdedxvsp_reco
TClonesArray * digi
TCanvas * c
TH2F * hdedxvsp_mu
TH2F * hdedxvsp_e
Int_t GetNofHelixHits() const
Definition: PndSttTrack.h:48
Double_t GetZ()
Definition: PndSttTrack.h:61
__m128 m
Definition: P4_F32vec4.h:28
friend F32vec4 sqrt(const F32vec4 &a)
Definition: P4_F32vec4.h:29
Int_t GetPdgCode() const
Definition: PndMCTrack.h:73
friend F32vec4 sin(const F32vec4 &a)
Definition: P4_F32vec4.h:111
TStopwatch timer
TClonesArray * pnt
Double_t ptot
Definition: checkhelixhit.C:68
TVector3 GetMomentum() const
Definition: PndMCTrack.h:78
TFile * out_dedx
int evt
Definition: checkhelixhit.C:36
TClonesArray * track
TH2F * hdedxvsp_pi
Double_t GetDist()
Definition: PndSttTrack.h:57
Double_t d0
Definition: checkhelixhit.C:59
Double_t GetRad()
Definition: PndSttTrack.h:59
Double_t GetPhi()
Definition: PndSttTrack.h:58
Double_t
Double_t phi0
Definition: checkhelixhit.C:60
TTree * treedigi
TTree * treereco
Double_t y0
Definition: checkhelixhit.C:71
TFile filedigi("testdigi.root")
TH2F * hdedxvsp
Int_t GetCharge()
Definition: PndSttTrack.h:63
Double_t ptran
Definition: checkhelixhit.C:65
TClonesArray * mctrack
TFile filerun("testrun.root")
TH2F * hdedxvsp_p
Int_t GetHelixHitIndex(Int_t iHit) const
Definition: PndSttTrack.h:49
TCanvas * c1
Double_t GetdEdx() const
TFile filehelix("testreco.root")
TClonesArray * hh
TCanvas * c2
TClonesArray * matchtrack
Double_t R
Definition: checkhelixhit.C:61
Double_t plong
Definition: checkhelixhit.C:67