13 #include <TProfile2D.h>
14 #include <TGraphErrors.h>
15 #include <TTreeStream.h>
19 .L $ALICE_ROOT/TPC/Upgrade/macros/AnaDelta.C+g
23 TVectorD* MakeLogBinning(Int_t nbinsX, Double_t xmin, Double_t xmax);
24 TVectorD* MakeLinBinning(Int_t nbinsX, Double_t xmin, Double_t xmax);
25 TVectorD* MakeArbitraryBinning(const char* bins);
27 void DumpHn(THn *hn, TTreeSRedirector &stream);
29 void AnaDelta(TString file, TString outDir=".")
37 TTreeSRedirector stream(Form("%s/deltas.root",outDir.Data()));
41 THn *hn=(THn*)f.Get("hn");
49 void AnaDeltaTree(TString file, TString outFile="deltas_tree.root")
53 TTree *t = (TTree*)f.Get("delta");
54 Float_t soneOverPt=0.;
66 t->SetBranchAddress("soneOverPt" , &soneOverPt);
67 t->SetBranchAddress("r" , &radius);
68 t->SetBranchAddress("trackPhi" , &trackPhi);
69 t->SetBranchAddress("trackY" , &trackY);
70 t->SetBranchAddress("trackZ" , &trackZ);
71 t->SetBranchAddress("resRphi" , &resRphi);
72 t->SetBranchAddress("trackRes" , &trackRes);
73 t->SetBranchAddress("pointY" , &pointY);
74 t->SetBranchAddress("pointZ" , &pointZ);
75 t->SetBranchAddress("npTRD" , &npTRD);
76 t->SetBranchAddress("event" , &event);
79 TVectorD *vR = MakeLinBinning(10,86.,250.);
80 TVectorD *vPhi = MakeLinBinning(18*8,0.,2*TMath::Pi());
81 TVectorD *vZ = MakeLinBinning(50,-250.,250.);
84 Int_t bins[nbins] = {vR->GetNrows()-1, vPhi->GetNrows()-1, vZ->GetNrows()-1, 80};
85 // Int_t bins[nbins] = {16, 18*5, 50, 80};
86 Double_t xmin[nbins] = {86. , 0., -250., -2.};
87 Double_t xmax[nbins] = {250., 2*TMath::Pi(), 250., 2.};
88 THnF *hn = new THnF("hn", "hn", nbins, bins, xmin, xmax);
90 hn->GetAxis(0)->Set(vR ->GetNrows()-1, vR ->GetMatrixArray());
91 hn->GetAxis(1)->Set(vPhi->GetNrows()-1, vPhi->GetMatrixArray());
92 hn->GetAxis(2)->Set(vZ ->GetNrows()-1, vZ ->GetMatrixArray());
95 for (Int_t iev=0; iev<t->GetEntries(); ++iev) {
100 if (npTRD<2) continue;
101 Double_t pt=1./TMath::Abs(soneOverPt);
102 if (pt<0.8) continue;
104 Float_t resRphiRandom = resRphi*trackRes;
105 Float_t deviation = trackY+resRphiRandom-pointY;
107 Double_t xx[4]={radius, trackPhi, trackZ ,deviation};
111 // do fits and fill tree
112 TTreeSRedirector stream(outFile.Data());
117 stream.GetFile()->cd();
127 void AnaDeltaTree2(TString file/*, TString outDir="."*/)
130 // NOTE: not finished
134 TTree *t = (TTree*)f.Get("delta");
135 Float_t soneOverPt=0.;
147 t->SetBranchAddress("soneOverPt" , &soneOverPt);
148 t->SetBranchAddress("r" , &radius);
149 t->SetBranchAddress("trackPhi" , &trackPhi);
150 t->SetBranchAddress("trackY" , &trackY);
151 t->SetBranchAddress("trackZ" , &trackZ);
152 t->SetBranchAddress("resRphi" , &resRphi);
153 t->SetBranchAddress("trackRes" , &trackRes);
154 t->SetBranchAddress("pointY" , &pointY);
155 t->SetBranchAddress("pointZ" , &pointZ);
156 t->SetBranchAddress("npTRD" , &npTRD);
157 t->SetBranchAddress("event" , &event);
160 TVectorD *vZ = MakeLinBinning(50,-250.,250.);
161 TVectorD *vPhi = MakeLinBinning(18*8,0.,TMath::Pi());
162 TVectorD *vR = MakeLinBinning(16,86.,250.);
164 TObjArray arrZ(vZ->GetNrows()-1);
167 for (Int_t iev=0; iev<t->GetEntries(); ++iev) {
172 if (npTRD<2) continue;
174 Float_t resRphiRandom=resRphi*trackRes;
176 Int_t binZ = TMath::BinarySearch(vZ->GetNrows(),vZ->GetMatrixArray(),(Double_t)trackZ);
177 Int_t binPhi = TMath::BinarySearch(vPhi->GetNrows(),vPhi->GetMatrixArray(),(Double_t)trackPhi);
178 Int_t binR = TMath::BinarySearch(vR->GetNrows(),vR->GetMatrixArray(),(Double_t)radius);
181 if (binPhi<0) binPhi=0;
184 TObjArray *arrPhi=(TObjArray*)arrZ.UncheckedAt(binZ);
186 arrPhi=new TObjArray(vPhi->GetNrows()-1);
187 arrZ.AddAt(arrPhi,binZ);
190 TObjArray *arrR=(TObjArray*)arrPhi->UncheckedAt(binPhi);
192 arrR=new TObjArray(vR->GetNrows()-1);
193 arrPhi->AddAt(arrR,binPhi);
196 TH1S *h = (TH1S*)arrR->UncheckedAt(binR);
198 h = new TH1S(Form("h_%02d_%02d_%d02",binZ, binPhi, binR),
199 Form("z,phi,r: %02d,%02d,%d02; #Delta r#phi (cm)",binZ, binPhi, binR),
201 arrR->AddAt(h, binR);
204 h->Fill(trackY+resRphiRandom-pointY);
207 // do fits and fill tree
211 void DumpHn(THn *hn, TTreeSRedirector &stream)
213 TAxis *ar = hn->GetAxis(0);
214 TAxis *aphi = hn->GetAxis(1);
215 TAxis *az = hn->GetAxis(2);
218 for (Int_t iz=0; iz<az->GetNbins(); ++iz) {
219 az->SetRange(iz+1,iz+1);
221 arrFits.SetName(Form("z_%02d",iz));
224 for (Int_t ir=0; ir<ar->GetNbins(); ++ir) {
225 ar->SetRange(ir+1,ir+1);
226 for (Int_t iphi=0; iphi<aphi->GetNbins(); ++iphi) {
227 aphi->SetRange(iphi+1,iphi+1);
229 TH1 *hProj = hn->Projection(3);
230 if (hProj->GetEntries()<1) {
235 TF1 fg("fg","gaus",-2,2);
236 Double_t cr = ar->GetBinCenter(ir+1);
237 Double_t cphi = aphi->GetBinCenter(iphi+1);
238 Double_t cz = az->GetBinCenter(iz+1);
239 hProj->SetNameTitle(Form("h_%02d_%02d_%d02",iz+1, iphi+1, ir+1),
240 Form("z,phi,r: %02d,%02d,%d02 (%.2f, %.2f, %.2f)",iz+1,iphi+1,ir+1, cr, cphi, cz )
242 hProj->Fit(&fg,"QR");
245 Double_t mean = fg.GetParameter(1);
246 Double_t meanErr = fg.GetParError(1);
247 Double_t sigma = fg.GetParameter(2);
248 Double_t sigmaErr = fg.GetParError(2);
249 Int_t entries = hProj->GetEntries();
250 Double_t chi2ndf = fg.GetChisquare()/fg.GetNDF();
260 "meanErr=" << meanErr <<
262 "sigmaErr=" << sigmaErr <<
263 "entries=" << entries <<
264 "chi2ndf=" << chi2ndf <<
268 stream.GetFile()->cd();
269 arrFits.Write(0x0,TObject::kSingleKey);
275 //______________________________________________________________________________
276 TVectorD* MakeLogBinning(Int_t nbinsX, Double_t xmin, Double_t xmax)
279 // Make logarithmic binning
280 // the user has to delete the array afterwards!!!
284 if (xmin<1e-20 || xmax<1e-20){
285 printf("For Log binning xmin and xmax must be > 1e-20. Using linear binning instead!");
286 return MakeLinBinning(nbinsX, xmin, xmax);
293 TVectorD *binLim=new TVectorD(nbinsX+1);
296 Double_t expMax=TMath::Log(last/first);
297 for (Int_t i=0; i<nbinsX+1; ++i){
298 (*binLim)[i]=first*TMath::Exp(expMax/nbinsX*(Double_t)i);
303 //______________________________________________________________________________
304 TVectorD* MakeLinBinning(Int_t nbinsX, Double_t xmin, Double_t xmax)
307 // Make linear binning
308 // the user has to delete the array afterwards!!!
315 TVectorD *binLim=new TVectorD(nbinsX+1);
318 Double_t binWidth=(last-first)/nbinsX;
319 for (Int_t i=0; i<nbinsX+1; ++i){
320 (*binLim)[i]=first+binWidth*(Double_t)i;
325 //_____________________________________________________________________________
326 TVectorD* MakeArbitraryBinning(const char* bins)
329 // Make arbitrary binning, bins separated by a ','
331 TString limits(bins);
332 if (limits.IsNull()){
333 printf("Bin Limit string is empty, cannot add the variable");
337 TObjArray *arr=limits.Tokenize(",");
338 Int_t nLimits=arr->GetEntries();
340 printf("Need at leas 2 bin limits, cannot add the variable");
345 TVectorD *binLimits=new TVectorD(nLimits);
346 for (Int_t iLim=0; iLim<nLimits; ++iLim){
347 (*binLimits)[iLim]=(static_cast<TObjString*>(arr->At(iLim)))->GetString().Atof();
354 void PlotFromTree(TTree *d, TString outDir=".")
356 TCanvas *c=new TCanvas;
357 gStyle->SetOptStat(0);
358 d->SetMarkerStyle(20);
361 TProfile2D pRZ("pRZ",";z (cm); r(cm)",50,-250,250,10,85,250);
362 d->Draw("entries:cr:cz>>pRZ","","profcolz");
363 pRZ.GetZaxis()->UnZoom();
364 c->SaveAs(Form("%s/entries_average.png",outDir.Data()));
365 d->Draw("entries:cr:cz>>pRZ","iphi==2","profcolz");
366 c->SaveAs(Form("%s/entries_onePhi.png",outDir.Data()));
368 pRZ.SetMaximum(0.04);
369 d->Draw("meanErr:cr:cz>>pRZ","","profcolz");
370 c->SaveAs(Form("%s/meanErr_average.png",outDir.Data()));
371 d->Draw("meanErr:cr:cz>>pRZ","iphi==2","profcolz");
372 c->SaveAs(Form("%s/meanErr_onePhi.png",outDir.Data()));
375 d->Draw("mean:cphi:cr","iz==25","colz");
376 c->SaveAs(Form("%s/mean_oneZ_phi_allR.png",outDir.Data()));
377 d->Draw("mean:meanErr:cphi","iz==25&&ir==2","goff");
378 TGraphErrors *grmean_phi=new TGraphErrors(d->GetSelectedRows(),d->GetV3(),d->GetV1(),0,d->GetV2());
379 grmean_phi->SetTitle(";#varphi;#LT#Delta r#varphi#GT");
380 grmean_phi->SetMarkerStyle(20);
381 grmean_phi->SetMarkerSize(1);
382 grmean_phi->Draw("ap");
383 c->SaveAs(Form("%s/mean_oneZ_phi_oneR.png",outDir.Data()));
385 d->Draw("mean:cr:cphi","iz==25","colz");
386 c->SaveAs(Form("%s/mean_oneZ_r_allPhi.png",outDir.Data()));
388 d->Draw("mean:meanErr:cr","iz==25&&iphi==2","goff");
389 TGraphErrors *grmean_r=new TGraphErrors(d->GetSelectedRows(),d->GetV3(),d->GetV1(),0,d->GetV2());
390 grmean_r->SetTitle(";r (cm);#LT#Delta r#varphi#GT");
391 grmean_r->SetMarkerStyle(20);
392 grmean_r->SetMarkerSize(1);
393 grmean_r->Draw("ap");
394 c->SaveAs(Form("%s/mean_oneZ_r_onePhi.png",outDir.Data()));
397 d->Draw("meanErr:cphi:cr","iz==25","colz");
398 c->SaveAs(Form("%s/meanErr_oneZ_phi_allR.png",outDir.Data()));
399 d->Draw("meanErr:cphi","iz==25&&ir==2");
400 c->SaveAs(Form("%s/meanErr_oneZ_phi_oneR.png",outDir.Data()));
402 d->Draw("meanErr:cr:cphi","iz==25","colz");
403 c->SaveAs(Form("%s/meanErr_oneZ_r_allPhi.png",outDir.Data()));
405 d->Draw("meanErr:cr","iz==25&&iphi==2");
406 c->SaveAs(Form("%s/meanErr_oneZ_r_onePhi.png",outDir.Data()));