FairRoot/PandaRoot
dedx_p_chain.C
Go to the documentation of this file.
1 // THIS MACRO FILLS DEDX / p HISTOS
2 // ifile = 0 1 2 3 4 = e mu pi k p
3 
4 
5 int dedx_p_chain(int ifile = 0){
6  gROOT->LoadMacro("$VMCWORKDIR/gconfig/rootlogon.C");
7  rootlogon();//basic libraries
8 
9 
10  TString directory[5] = {"production/e/", "production/mu/", "production/pi/", "production/k/", "production/p/"};
11  TString directory2[5] = {"production2/e/", "production2/mu/", "production2/pi/", "production2/k/", "production2/p/"};
12 
13  TString simname = "points_sttcombi.root";
14  TString diginame = "digi_sttcombi.root";
15  TString reconame = "reco_sttcombi.root";
16 
17  TH2F *hdedx_p_e = new TH2F("hdedx_p_e", "hdedx_p_e", 100, 0., 1.5, 100, 0., 30);
18  TH2F *hdedx_p_mu = new TH2F("hdedx_p_mu", "hdedx_p_mu", 100, 0., 1.5, 100, 0., 30);
19  TH2F *hdedx_p_pi = new TH2F("hdedx_p_pi", "hdedx_p_pi", 100, 0., 1.5, 100, 0., 30);
20  TH2F *hdedx_p_k = new TH2F("hdedx_p_k", "hdedx_p_k", 100, 0., 1.5, 100, 0., 30);
21  TH2F *hdedx_p_p = new TH2F("hdedx_p_p", "hdedx_p_p", 100, 0., 1.5, 100, 0., 30);
22 
23  hdedx_p_e->SetMarkerColor(2); // red
24  hdedx_p_mu->SetMarkerColor(4); // blue
25  hdedx_p_pi->SetMarkerColor(3); // green
26  hdedx_p_k->SetMarkerColor(6); // fuchsia
27  hdedx_p_p->SetMarkerColor(1); // black
28 
29  // pointers
30  TChain *chainsim = NULL, *chaindigi = NULL, *chainreco = NULL, *chaingen = NULL;
31 
32  TClonesArray *mctrackarray = NULL, *mcpointarray = NULL, *hitarray = NULL, *recotrackarray = NULL, *gentrackarray = NULL;
33  PndMCTrack *mctrk = NULL;
34  PndTrackCand *ctrk = NULL;
35  PndTrack *gtrk = NULL;
36  PndSttPoint *mcpoint = NULL;
37  PndSttHit *hit = NULL;
38  PndTrackCandHit candhit;
39 
40  TString sn = directory[ifile] + simname;
41  TString dn = directory[ifile] + diginame;
42  TString rn = directory[ifile] + reconame;
43 
44  TString sn2 = directory2[ifile] + simname;
45  TString dn2 = directory2[ifile] + diginame;
46  TString rn2 = directory2[ifile] + reconame;
47 
48  cout << "******************" << endl;
49  cout << sn << " " << sn2 << " " << endl;
50  cout << dn << " " << dn2 << " " << endl;
51  cout << rn << " " << rn2 << " " << endl;
52 
53 
54 
55  // MC
56  chainsim = new TChain("pndsim");
57  chainsim->Add(sn);
58  chainsim->Add(sn2);
59 // chainsim->Add(sn3);
60  mcpointarray = new TClonesArray("PndSttPoint");
61  chainsim->SetBranchAddress("STTPoint",&mcpointarray);
62  mctrackarray = new TClonesArray("PndMCTrack");
63  chainsim->SetBranchAddress("MCTrack",&mctrackarray);
64 
65  // digi
66  chaindigi = new TChain("pndsim");
67  chaindigi->Add(dn);
68  chaindigi->Add(dn2);
69 // chaindigi->Add(dn3);
70  hitarray = new TClonesArray("PndSttHit");
71  chaindigi->SetBranchAddress("STTHit",&hitarray);
72 
73  // reco
74  chainreco = new TChain("pndsim");
75  chainreco->Add(rn);
76  chainreco->Add(rn2);
77 // chainreco->Add(rn3);
78  gentrackarray = new TClonesArray("PndTrack");
79  chainreco->SetBranchAddress("SttMvdGenTrack",&gentrackarray);
80  recotrackarray = new TClonesArray("PndTrackCand");
81  chainreco->SetBranchAddress("SttMvdTrackCand",&recotrackarray);
82 
83  for(int evt = 0; evt < 20000; evt++) {
84 
85  chainsim->GetEntry(evt);
86  chaindigi->GetEntry(evt);
87  chainreco->GetEntry(evt);
88 
89  if(evt%500 == 0) cout << evt << endl;
90 
91  TVector3 momentum;
92 
93  // loop on reco tracks
94  for(int itrk = 0; itrk < gentrackarray->GetEntriesFast(); itrk++) {
95 
96  // get the genit track
97  gtrk = (PndTrack*) gentrackarray->At(itrk);
98  if(!gtrk) continue;
99 
100  // get the track candidate
101  ctrk = (PndTrackCand*) recotrackarray->At(gtrk->GetRefIndex());
102  if(!ctrk) continue;
103 
104  int mcIndex = ctrk->getMcTrackId();
105 
106 
107  // GET ONLY PRIMARY TRACKS!!! // CHECK
108  if(mcIndex != 0) continue;
109 
110  // CUT ON KALMAN FLAG // CHECK
111  if(gtrk->GetFlag() < 0) continue;
112 
113  // track momentum ON FIRST PLANE (CHECK: it has
114  // to be backprop, but indeed the PndTrack does
115  // not contain the backprop momentum)
116  momentum = gtrk->GetParamFirst().GetMomentum();
117 
118  // CHECK CUT on momentum
119  if(momentum.Mag() > 1.2) continue;
120 
121  std::vector<double> dedx;
122 
123  // loop on track hits
124  for(int ihit = 0; ihit < ctrk->GetNHits(); ihit++) {
125  PndTrackCandHit candhit = ctrk->GetSortedHit(ihit);
126  Int_t hitid = candhit.GetHitId();
127  hit = (PndSttHit*) hitarray->At(hitid);
128  if(!hit) continue;
129 
130  // dE/dx calculation ==================
131  Double_t tuberadius = 0.5; // CHECK 0.5 cm
132  Double_t distance = 2 * sqrt(tuberadius * tuberadius - hit->GetIsochrone() * hit->GetIsochrone()); // cm
133  Double_t coslam = momentum.Perp() / momentum.Mag();
134  distance = distance / coslam;
135  double de_dx = 0;
136  if (distance != 0) de_dx = hit->GetDepCharge()/(1000000 * distance); // in arbitrary units
137  // de/dx
138  dedx.push_back(de_dx);
139  // ====================================
140 
141  }
142 
143  // from MIN to MAX
144  std::sort(dedx.begin(), dedx.end());
145 
146 
147  // truncated mean
148  Double_t perc = 0.70; // CHECK
149 
150  //truncated mean
151  Double_t sum = 0;
152  Int_t lastpnt = int(floor(dedx.size() * perc));
153 
154 
155  for(int ihit = 0; ihit < lastpnt; ihit++) sum += dedx[ihit];
156 
157  // CHECK CUT on n of hits (> 5 already truncated)
158  if(lastpnt > 5 && dedx.size() > 0) {
159  // if(lastpnt > 12) { // CHECK
160 
161  double mean = sum/(Double_t) lastpnt;
162 
163  switch(ifile) {
164  case 0:
165  hdedx_p_e->Fill(momentum.Mag(), mean); break;
166  case 1:
167  hdedx_p_mu->Fill(momentum.Mag(), mean); break;
168  case 2:
169  hdedx_p_pi->Fill(momentum.Mag(), mean); break;
170  case 3:
171  hdedx_p_k->Fill(momentum.Mag(), mean); break;
172  case 4:
173  hdedx_p_p->Fill(momentum.Mag(), mean);
174  }
175  }
176  }
177  }
178 
179  TFile output("dedx_out.root", "UPDATE");
180  switch(ifile) {
181  case 0:
182  hdedx_p_e->Write(); break;
183  case 1:
184  hdedx_p_mu->Write(); break;
185  case 2:
186  hdedx_p_pi->Write(); break;
187  case 3:
188  hdedx_p_k->Write(); break;
189  case 4:
190  hdedx_p_p->Write();
191  }
192  output.Write();
193  output.Close();
194 
195  return 0;
196 }
197 
int getMcTrackId() const
Definition: PndTrackCand.h:60
friend F32vec4 sqrt(const F32vec4 &a)
Definition: P4_F32vec4.h:29
PndTrackCandHit GetSortedHit(UInt_t i)
Definition: PndTrackCand.h:54
Int_t GetFlag() const
Definition: PndTrack.h:33
int evt
Definition: checkhelixhit.C:36
FairParRootFileIo * output
Definition: sim_emc_apd.C:120
int dedx_p_chain(int ifile=0)
Definition: dedx_p_chain.C:5
Double_t GetIsochrone() const
Definition: PndSttHit.h:62
Double_t
Double_t GetDepCharge() const
Definition: PndSttHit.h:65
int hit(Int_t nEvents=0, TString inFile="sim.root", TString parFile="par.root", TString inDigi="digi.root", TString outFile="hit.root", Int_t timeBased=0)
Definition: hit.C:1
UInt_t GetNHits() const
Definition: PndTrackCand.h:59
Double_t mean[nsteps]
Definition: dedx_bands.C:65
Int_t GetRefIndex() const
Definition: PndTrack.h:36
TString directory
Int_t GetHitId() const
FairTrackParP GetParamFirst()
Definition: PndTrack.h:49