]>
Commit | Line | Data |
---|---|---|
c0172f82 | 1 | /* |
7212f8c3 | 2 | Macro to study the space charge fluctuations. |
3 | 3 functions using the ToyMC + analytical fomula to describe given MC results | |
4 | ||
5 | function to histogram space charge using the raw data ana anlyzing them | |
6 | To use given function - CPU conusming therefore batch farms used | |
7 | See $ALICE_ROOT/TPC/Upgrade/macros/spaceChargeFluctuation.sh macro to see example to run the code | |
8 | ||
9 | ||
10 | ||
11 | .x $HOME/NimStyle.C | |
ae4cea45 | 12 | .x $HOME/rootlogon.C |
c0172f82 | 13 | .L $ALICE_ROOT/TPC/Upgrade/macros/spaceChargeFluctuation.C+ |
7212f8c3 | 14 | |
2ff913b6 | 15 | |
c0172f82 | 16 | |
17 | */ | |
18 | #include "TMath.h" | |
19 | #include "TRandom.h" | |
20 | #include "TTreeStream.h" | |
21 | #include "TVectorD.h" | |
22 | #include "TCanvas.h" | |
23 | #include "TStopwatch.h" | |
24 | #include "AliTPCParam.h" | |
25 | #include "AliTPCcalibDB.h" | |
26 | #include "AliTPCAltroMapping.h" | |
27 | #include "AliAltroRawStream.h" | |
28 | #include "AliSysInfo.h" | |
29 | #include "AliTPCRawStreamV3.h" | |
30 | #include "AliCDBManager.h" | |
31 | #include "TGeoGlobalMagField.h" | |
32 | #include "AliMagF.h" | |
33 | #include "AliRawReaderRoot.h" | |
34 | #include "AliRawReader.h" | |
35 | #include "TH3.h" | |
36 | #include "TH2.h" | |
76dbc35e | 37 | #include "AliTPCCalPad.h" |
38 | #include "AliTPCCalROC.h" | |
39 | #include "TChain.h" | |
40 | #include "AliXRDPROOFtoolkit.h" | |
41 | #include "TLegend.h" | |
42 | #include "TCut.h" | |
0eff8c53 | 43 | #include "TGraphErrors.h" |
44 | #include "TStatToolkit.h" | |
c0172f82 | 45 | |
ae4cea45 | 46 | #include "AliDCSSensor.h" |
47 | #include "AliCDBEntry.h" | |
48 | #include "AliDCSSensorArray.h" | |
7212f8c3 | 49 | #include "TStyle.h" |
50 | #include "AliTPCSpaceCharge3D.h" | |
4b955de3 | 51 | #include "AliExternalTrackParam.h" |
633a08cb | 52 | #include "AliTrackerBase.h" |
53 | #include "TDatabasePDG.h" | |
511fd208 | 54 | #include "TROOT.h" |
4b955de3 | 55 | // |
56 | // constants | |
57 | // | |
58 | Double_t omegaTau=0.325; | |
7212f8c3 | 59 | // |
60 | // Function declaration | |
61 | // | |
62 | // TOY MC | |
63 | void spaceChargeFluctuationToyMC(Int_t nframes, Double_t interactionRate); | |
64 | void spaceChargeFluctuationToyDraw(); | |
65 | void spaceChargeFluctuationToyDrawSummary(); | |
c0172f82 | 66 | |
7212f8c3 | 67 | // |
68 | // RAW data analysis | |
69 | // | |
76dbc35e | 70 | TH1 * GenerateMapRawIons(Int_t useGain,const char *fileName="raw.root", const char *outputName="histo.root", Int_t maxEvents=25); |
0eff8c53 | 71 | void DoMerge(); |
7212f8c3 | 72 | void AnalyzeMaps1D(); // make nice plots |
73 | void MakeFluctuationStudy3D(Int_t nhistos, Int_t nevents, Int_t niter); | |
74 | TH3D * NormalizeHistoQ(TH3D * hisInput, Bool_t normEpsilon); | |
4b955de3 | 75 | // |
7212f8c3 | 76 | TH3D * PermutationHistoZ(TH3D * hisInput, Double_t deltaZ); |
77 | TH3D * PermutationHistoPhi(TH3D * hisInput, Double_t deltaPhi); | |
4b955de3 | 78 | TH3D * PermutationHistoLocalPhi(TH3D * hisInput, Int_t deltaPhi); |
79 | void MakeSpaceChargeFluctuationScan(Double_t scale, Int_t nfiles, Int_t sign); | |
7212f8c3 | 80 | void DrawFluctuationdeltaZ(Int_t stat=0, Double_t norm=10000); |
81 | void DrawFluctuationSector(Int_t stat=0, Double_t norm=10000); | |
5a998ace | 82 | void MakeLocalDistortionPlotsGlobalFitPolDrift(Float_t xmin, Float_t xmax); |
83 | void MakeLocalDistortionPlots(Int_t npoints=20000, Int_t npointsZ=10000); | |
84 | ||
c0172f82 | 85 | |
4b955de3 | 86 | void spaceChargeFluctuation(Int_t mode=0, Float_t arg0=0, Float_t arg1=0, Float_t arg2=0){ |
c0172f82 | 87 | // |
7212f8c3 | 88 | // function called from the shell script |
c0172f82 | 89 | // |
7212f8c3 | 90 | gRandom->SetSeed(0); |
76dbc35e | 91 | if (mode==0) GenerateMapRawIons(arg0); |
0eff8c53 | 92 | if (mode==1) DoMerge(); |
7212f8c3 | 93 | if (mode==2) spaceChargeFluctuationToyMC(arg0,arg1); |
94 | if (mode==3) MakeFluctuationStudy3D(10000, arg0, arg1); | |
4b955de3 | 95 | if (mode==4) MakeSpaceChargeFluctuationScan(arg0,arg1,arg2); // param: scale, nfiles, sign Bz |
7212f8c3 | 96 | if (mode==5) { |
97 | DrawFluctuationdeltaZ(arg0,arg1); | |
98 | DrawFluctuationSector(arg0,arg1); | |
99 | } | |
5a998ace | 100 | if (mode==6) { |
101 | MakeLocalDistortionPlotsGlobalFitPolDrift(arg0,arg1); | |
102 | } | |
103 | if (mode==7) { | |
104 | MakeLocalDistortionPlots(arg0,arg1); | |
105 | ||
106 | } | |
c0172f82 | 107 | } |
06ab15a8 | 108 | |
109 | ||
110 | Double_t RndmdNchdY(Double_t s){ | |
111 | // | |
112 | // dNch/deta - last 2 points inventeted (to find it somewhere ?) | |
113 | // | |
114 | // http://arxiv.org/pdf/1012.1657v2.pdf - table 1. ALICE PbPb | |
115 | // Scaled according s^0.15 | |
116 | // http://arxiv.org/pdf/1210.3615v2.pdf | |
117 | // This we can cite. | |
118 | // Usage example:: | |
119 | /* | |
120 | TH1F his550("his550","his550",1000,0,3000) | |
121 | for (Int_t i=0; i<300000; i++) his550->Fill(RndmdNchdY(5.5)); | |
122 | his550->Draw(); | |
123 | TF1 f1("f1","[0]*x^(-(0.00001+abs([1])))",1,2000) | |
124 | f1.SetParameters(1,-1) | |
125 | his550->Fit("f1","","",10,3000); | |
126 | TH1F his276("his276","his276",1000,0,3000) | |
2ff913b6 | 127 | for (Int_t i=0; i<300000; i++) his276->Fill(RndmdNchdY(2.76)); |
06ab15a8 | 128 | his276->Draw(); |
129 | ||
130 | */ | |
131 | static TSpline3 * spline276=0; | |
2ff913b6 | 132 | const Double_t sref=2.76; // reference s |
133 | ||
06ab15a8 | 134 | if (!spline276){ |
2ff913b6 | 135 | // Refence multiplicities for 2.76 TeV |
06ab15a8 | 136 | // multplicity from archive except of the last point was set to 0 |
2ff913b6 | 137 | // |
138 | const Double_t mult[20]={1601, 1294, 966, 649, 426, 261, 149, 76, 35, 0.001}; | |
139 | const Double_t cent[20]={2.5, 7.5, 15, 25, 35, 45, 55, 65, 75, 100.}; | |
06ab15a8 | 140 | TGraphErrors * gr = new TGraphErrors(10,cent,mult); |
141 | spline276 = new TSpline3("spline276",gr); | |
142 | } | |
2ff913b6 | 143 | Double_t norm = TMath::Power((s*s)/(sref*sref),0.15); |
06ab15a8 | 144 | spline276->Eval(gRandom->Rndm()*100.); |
145 | return spline276->Eval(gRandom->Rndm()*100.)*norm; | |
146 | } | |
147 | ||
148 | ||
149 | ||
150 | ||
151 | ||
4b955de3 | 152 | void pileUpToyMC(Int_t nframes){ |
153 | // | |
154 | // | |
155 | // | |
156 | /* | |
157 | Int)t nframes=1000; | |
158 | */ | |
159 | TTreeSRedirector *pcstream = new TTreeSRedirector("pileup.root","recreate"); | |
4b955de3 | 160 | Double_t central = 2350; |
161 | Double_t pmean=5; | |
162 | TVectorD vectorT(nframes); | |
163 | // | |
164 | for (Int_t irate=1; irate<10; irate++){ | |
165 | printf("rate\t%d\n",irate); | |
166 | for (Int_t iframe=0; iframe<nframes; iframe++){ | |
167 | if (iframe%100000==0)printf("iframe=%d\n",iframe); | |
168 | Int_t ntracksAll=0; | |
169 | Int_t nevents=gRandom->Poisson(irate); | |
170 | Int_t ntracks=0; // to be taken from the MB primary distribution | |
171 | Bool_t hasCentral=0; | |
172 | for (Int_t ievent=0; ievent<nevents; ievent++){ | |
06ab15a8 | 173 | ntracks=RndmdNchdY(5.5); |
4b955de3 | 174 | ntracksAll+=ntracks; |
175 | if (ntracks>central) hasCentral = kTRUE; | |
176 | } | |
177 | (*pcstream)<<"pileupFrame"<< | |
178 | "rate="<<irate<< | |
179 | "nevents="<<nevents<< | |
180 | "ntracks="<<ntracks<< | |
181 | "ntracksAll="<<ntracksAll<< | |
182 | "hasCentral"<<hasCentral<< | |
183 | "\n"; | |
184 | vectorT[iframe]=ntracksAll; | |
185 | } | |
186 | Double_t mean = TMath::Mean(nframes, vectorT.GetMatrixArray()); | |
187 | Double_t rms = TMath::RMS(nframes, vectorT.GetMatrixArray()); | |
188 | Double_t median = TMath::Median(nframes, vectorT.GetMatrixArray()); | |
189 | Double_t ord90 = TMath::KOrdStat(nframes,vectorT.GetMatrixArray() , Int_t(nframes*0.90)); | |
190 | Double_t ord95 = TMath::KOrdStat(nframes,vectorT.GetMatrixArray() , Int_t(nframes*0.95)); | |
191 | Double_t ord99 = TMath::KOrdStat(nframes,vectorT.GetMatrixArray() , Int_t(nframes*0.99)); | |
192 | Double_t ord999 = TMath::KOrdStat(nframes,vectorT.GetMatrixArray() , Int_t(nframes*0.999)); | |
193 | Double_t ord9999 = TMath::KOrdStat(nframes,vectorT.GetMatrixArray() , Int_t(nframes*0.9999)); | |
194 | (*pcstream)<<"pileup"<< | |
195 | "rate="<<irate<< | |
196 | "mean="<<mean<< | |
197 | "rms="<<rms<< | |
198 | "median="<<median<< | |
199 | "ord90="<<ord90<< | |
200 | "ord95="<<ord95<< | |
201 | "ord99="<<ord99<< | |
202 | "ord999="<<ord999<< | |
203 | "ord9999="<<ord9999<< | |
204 | "\n"; | |
205 | } | |
206 | delete pcstream; | |
207 | // Draw | |
208 | pcstream = new TTreeSRedirector("pileup.root","update"); | |
209 | TTree * treeStat = (TTree*)(pcstream->GetFile()->Get("pileup")); | |
210 | TTree * treeFrame = (TTree*)(pcstream->GetFile()->Get("pileupFrame")); | |
211 | Int_t mentries = treeStat->Draw("ord999","1","goff"); | |
212 | Double_t maximum = TMath::MaxElement(mentries, treeStat->GetV1()); | |
213 | const char * names[6]={"mean","median","ord90","ord95","ord99","ord999"}; | |
214 | const char * titles[6]={"Mean","Median","90 %","95 %","99 %","99.9 %"}; | |
215 | const Int_t mcolors[6]={1,2,3,4,6,7}; | |
216 | // | |
217 | // | |
218 | TF1 * f1 = new TF1("f1","[0]*x+[1]*sqrt(x)"); | |
219 | Double_t par0=0; | |
220 | // | |
221 | TCanvas * canvasMult = new TCanvas("canvasCumul","canvasCumul"); | |
222 | canvasMult->SetLeftMargin(0.13); | |
223 | TLegend * legend= new TLegend(0.14,0.6,0.45,0.89, "Effective dN_{ch}/d#eta"); | |
224 | TGraphErrors *graphs[6]={0}; | |
225 | for (Int_t igr=0; igr<6; igr++){ | |
226 | graphs[igr] = TStatToolkit::MakeGraphErrors(treeStat,Form("%s:rate",names[igr]),"1",21+(igr%5),mcolors[igr],0); | |
227 | graphs[igr]->SetMinimum(0); | |
228 | graphs[igr]->GetYaxis()->SetTitleOffset(1.3); | |
229 | graphs[igr]->SetMaximum(maximum*1.1); | |
230 | graphs[igr]->GetXaxis()->SetTitle("<N_{ev}>"); | |
231 | graphs[igr]->GetYaxis()->SetTitle("dN_{ch}/d#eta"); | |
232 | TF1 * f2 = new TF1("f2","[0]*x+[1]*sqrt(x)"); | |
233 | f2->SetLineColor(mcolors[igr]); | |
234 | f2->SetLineWidth(0.5); | |
235 | if (igr>0) f2->FixParameter(0,par0); | |
236 | graphs[igr]->Fit(f2,"",""); | |
237 | if (igr==0) par0=f2->GetParameter(0); | |
238 | if (igr==0) graphs[igr]->Draw("ap"); | |
239 | graphs[igr]->Draw("p"); | |
240 | legend->AddEntry(graphs[igr], titles[igr],"p"); | |
241 | } | |
242 | legend->SetBorderSize(0); | |
243 | legend->Draw(); | |
244 | ||
245 | canvasMult->SaveAs("effectiveMult.pdf"); | |
246 | canvasMult->SaveAs("effectiveMult.png"); | |
247 | gStyle->SetOptStat(0); | |
248 | TH2F * hisMult = new TH2F("ntracksNevent","ntracksnevents",9,1,10,100,0,2*maximum); | |
249 | { | |
250 | treeFrame->Draw("ntracksAll:rate>>ntracksNevent","","colz"); | |
251 | hisMult->GetXaxis()->SetTitle("<N_{ev}>"); | |
252 | hisMult->GetYaxis()->SetTitle("dN_{ch}/d#eta"); | |
253 | hisMult->GetYaxis()->SetTitleOffset(1.3); | |
254 | hisMult->Draw("colz"); | |
255 | } | |
256 | canvasMult->SaveAs("effectiveMultColz.pdf"); | |
257 | canvasMult->SaveAs("effectiveMultColz.png"); | |
258 | // | |
259 | // | |
260 | // | |
261 | TH2F * hisMult5 = new TH2F("ntracksNevent5","ntracksnEvents5",9,1,10,100,0,maximum); | |
262 | { | |
263 | treeFrame->Draw("ntracksAll:nevents>>ntracksNevent5","abs(rate-5)<0.5","colz"); | |
264 | hisMult5->GetXaxis()->SetTitle("N_{ev}"); | |
265 | hisMult5->GetYaxis()->SetTitle("dN_{ch}/d#eta"); | |
266 | hisMult5->GetYaxis()->SetTitleOffset(1.3); | |
267 | hisMult5->Draw("colz"); | |
268 | } | |
269 | canvasMult->SaveAs("effectiveMultF5.pdf"); | |
270 | canvasMult->SaveAs("effectiveMultF5.png"); | |
2ff913b6 | 271 | |
272 | { | |
273 | gStyle->SetOptFit(1); | |
274 | gStyle->SetOptStat(1); | |
275 | gStyle->SetOptTitle(1); | |
276 | TCanvas * canvasMultH = new TCanvas("canvasCumulH","canvasCumulH",700,700); | |
277 | canvasMultH->Divide(1,2); | |
278 | canvasMultH->cd(1); | |
279 | TH1F his550("his550","his550",1000,0,3000); | |
280 | TH1F his276("his276","his276",1000,0,3000); | |
281 | for (Int_t i=0; i<300000; i++) his550.Fill(RndmdNchdY(5.5)); | |
282 | for (Int_t i=0; i<300000; i++) his276.Fill(RndmdNchdY(2.76)); | |
283 | TF1 f1("f1","[0]*x^(-(0.00001+abs([1])))",1,2000); | |
284 | f1.SetParameters(1,-1); | |
285 | his550.GetXaxis()->SetTitle("dN_{ch}/d#eta"); | |
286 | his276.GetXaxis()->SetTitle("dN_{ch}/d#eta"); | |
287 | his550.Fit("f1","","",10,3000); | |
288 | his276.Fit("f1","","",10,3000); | |
289 | canvasMultH->cd(1)->SetLogx(1); | |
290 | canvasMultH->cd(1)->SetLogy(1); | |
291 | his550.Draw(); | |
292 | canvasMultH->cd(2)->SetLogx(1); | |
293 | canvasMultH->cd(2)->SetLogy(1); | |
294 | his276.Draw(""); | |
295 | canvasMultH->SaveAs("dNchdEta.pdf"); | |
296 | } | |
4b955de3 | 297 | delete pcstream; |
298 | } | |
c0172f82 | 299 | |
7212f8c3 | 300 | void spaceChargeFluctuationToyMC(Int_t nframes, Double_t interactionRate){ |
c0172f82 | 301 | // |
7212f8c3 | 302 | // Toy MC to generate space charge fluctuation, to estimate the fluctuation of the integral space charge in part of the |
303 | // TPC | |
304 | // Parameters: | |
305 | // nframes - number of frames to simulate | |
306 | // 1. Make a toy simulation part for given setup | |
307 | // 2. Make a summary plots for given setups - see function spaceChargeFluctuationToyMCDraw() | |
c0172f82 | 308 | // |
309 | TTreeSRedirector *pcstream = new TTreeSRedirector("spaceChargeFluctuation.root","recreate"); | |
4e715689 | 310 | Double_t driftTime=0.1; |
4e715689 | 311 | Double_t eventMean=interactionRate*driftTime; |
312 | Double_t trackMean=500; | |
313 | Double_t FPOT=1.0, EEND=3000; | |
314 | Double_t EEXPO=0.8567; | |
315 | const Double_t XEXPO=-EEXPO+1, YEXPO=1/XEXPO; | |
c0172f82 | 316 | |
317 | for (Int_t iframe=0; iframe<nframes; iframe++){ | |
4e715689 | 318 | printf("iframe=%d\n",iframe); |
c0172f82 | 319 | Int_t nevents=gRandom->Poisson(interactionRate*driftTime); |
320 | Int_t ntracksAll=0; | |
4e715689 | 321 | TVectorD vecTracksPhi180(180); |
322 | TVectorD vecTracksPhi36(36); | |
323 | TVectorD vecEPhi180(180); | |
324 | TVectorD vecEPhi36(36); | |
325 | Double_t dESum=0; | |
c0172f82 | 326 | for (Int_t ievent=0; ievent<nevents; ievent++){ |
4e715689 | 327 | Int_t ntracks=gRandom->Exp(trackMean); // to be taken from the MB primary distribution |
328 | Float_t RAN = gRandom->Rndm(); | |
329 | ntracks=TMath::Power((TMath::Power(FPOT,XEXPO)*(1-RAN)+TMath::Power(EEND,XEXPO)*RAN),YEXPO)/2.; | |
c0172f82 | 330 | ntracksAll+=ntracks; |
4e715689 | 331 | for (Int_t itrack=0; itrack<ntracks; itrack++){ |
332 | Double_t phi = gRandom->Rndm(); | |
333 | vecTracksPhi180(Int_t(phi*180))+=1; | |
334 | vecTracksPhi36(Int_t(phi*36)) +=1; | |
335 | // simplified MC to get track length including loopers | |
336 | Double_t theta= gRandom->Rndm(); | |
337 | Double_t pt = gRandom->Exp(0.5)+0.05; | |
338 | Double_t crv = TMath::Abs(5*kB2C/pt); //GetC(b); // bz*kB2C/pt; | |
339 | Double_t deltaPhi=0; | |
340 | if (TMath::Abs(2*crv*(245-85)/2.) <1.) deltaPhi=TMath::ASin(crv*(245-85)/2.); | |
341 | else | |
342 | deltaPhi=TMath::Pi(); | |
343 | Double_t dE=deltaPhi/crv; | |
344 | Double_t xloop=1; | |
345 | if (1./crv<250) { | |
346 | xloop = TMath::Min(1./(TMath::Abs(theta)+0.0001),10.); | |
347 | if (xloop<1) xloop=1; | |
348 | } | |
349 | dESum+=xloop*dE; | |
350 | if (itrack==0) (*pcstream)<<"track"<< | |
351 | "pt="<<pt<< | |
352 | "crv="<<crv<< | |
353 | "theta="<<theta<< | |
354 | "dE="<<dE<< | |
355 | "xloop="<<xloop<< | |
356 | "\n"; | |
357 | ||
358 | vecEPhi180(Int_t(phi*180)) +=dE*xloop; | |
359 | vecEPhi36(Int_t(phi*36)) +=dE*xloop; | |
c0172f82 | 360 | } |
4e715689 | 361 | (*pcstream)<<"event"<< |
362 | "ntracks="<<ntracks<< | |
363 | "nevents="<<nevents<< | |
364 | "\n"; | |
c0172f82 | 365 | } |
366 | (*pcstream)<<"ntracks"<< | |
7212f8c3 | 367 | "rate="<<interactionRate<< // interaction rate |
368 | "eventMean="<<eventMean<< // mean number of events per frame | |
369 | "trackMean="<<trackMean<< // assumed mean of the tracks per event | |
370 | // | |
4e715689 | 371 | "nevents="<<nevents<< // number of events withing time frame |
372 | "ntracksAll="<<ntracksAll<< // number of tracks within time frame | |
373 | "dESum="<<dESum<< // sum of the energy loss | |
374 | "vecTracksPhi36.="<<&vecTracksPhi36<< // number of tracks in phi bin (36 bins) within time frame | |
375 | "vecTracksPhi180.="<<&vecTracksPhi180<< // number of tracks in phi bin (180 bins) within time frame | |
376 | "vecEPhi36.="<<&vecEPhi36<< // number of tracks in phi bin (36 bins) within time frame | |
377 | "vecEPhi180.="<<&vecEPhi180<< // number of tracks in phi bin (180 bins) within time frame | |
c0172f82 | 378 | "\n"; |
379 | } | |
380 | delete pcstream; | |
7212f8c3 | 381 | spaceChargeFluctuationToyDraw(); |
382 | } | |
383 | ||
384 | ||
385 | void spaceChargeFluctuationToyDraw(){ | |
4e715689 | 386 | // |
387 | // Toy MC to simulate the space charge integral fluctuation | |
7212f8c3 | 388 | // Draw function for given setup |
389 | // for MC generation part see : void spaceChargeFluctuationToyMC | |
390 | TTreeSRedirector *pcstream = new TTreeSRedirector("spaceChargeFluctuation.root","update"); | |
391 | TFile * f = pcstream->GetFile(); | |
4e715689 | 392 | TTree * treeStat = (TTree*)f->Get("ntracks"); |
393 | TTree * treedE = (TTree*)f->Get("track"); | |
394 | TTree * treeEv = (TTree*)f->Get("event"); | |
7212f8c3 | 395 | |
4e715689 | 396 | Int_t nentries=treedE->Draw("dE*xloop","1","",1000000); |
7212f8c3 | 397 | |
4e715689 | 398 | Double_t meandE=TMath::Mean(nentries,treedE->GetV1()); |
399 | Double_t rmsdE=TMath::RMS(nentries,treedE->GetV1()); | |
400 | treeStat->SetAlias("meandE",Form("(%f+0)",meandE)); | |
401 | treeStat->SetAlias("rmsdE",Form("(%f+0)",rmsdE)); | |
402 | nentries=treeEv->Draw("ntracks","1","",1000000); | |
403 | Double_t meanT=TMath::Mean(nentries,treeEv->GetV1()); | |
404 | Double_t rmsT=TMath::RMS(nentries,treeEv->GetV1()); | |
405 | treeStat->SetAlias("tracksMean",Form("(%f+0)",meanT)); | |
406 | treeStat->SetAlias("tracksRMS",Form("(%f+0)",rmsT)); | |
7212f8c3 | 407 | nentries = treeStat->Draw("eventMean","",""); |
408 | Double_t meanEvents =TMath::Mean(nentries,treeStat->GetV1()); | |
409 | treeStat->SetMarkerStyle(21); | |
410 | treeStat->SetMarkerSize(0.4); | |
4e715689 | 411 | // |
7212f8c3 | 412 | const Int_t kColors[6]={1,2,3,4,6,7}; |
413 | const Int_t kStyle[6]={20,21,24,25,24,25}; | |
414 | const char * htitles[6]={"Events","Tracks","Tracks #phi region (1/180)","Q #phi region (1/180)", "Tracks #phi region (1/36)","Q #phi region (1/36)"}; | |
415 | const char * hnames[6]={"Events","Tracks","TracksPhi180","QPhi180", "TracksPhi36","QPhi36"}; | |
416 | ||
417 | TH1* hisFluc[6]={0}; | |
418 | TH1* hisPull[6]={0}; | |
419 | TVectorD *vecFitFluc[6]={0}; | |
420 | TVectorD *vecFitFlucPull[6]={0}; | |
421 | // | |
422 | // histograms | |
423 | // | |
424 | treeStat->Draw("nevents/eventMean>>hisEv(100,0.85,1.15)",""); | |
425 | hisFluc[0]=(TH1*)treeStat->GetHistogram()->Clone(); | |
426 | treeStat->Draw("ntracksAll/(eventMean*tracksMean)>>hisTrackAll(100,0.85,1.1)","","same"); | |
427 | hisFluc[1]=(TH1*)treeStat->GetHistogram()->Clone(); | |
428 | treeStat->Draw("vecTracksPhi180.fElements/(eventMean*tracksMean/180)>>hisTrackSector(100,0.85,1.1)","1/180","same"); | |
429 | hisFluc[2]=(TH1*)treeStat->GetHistogram()->Clone(); | |
430 | treeStat->Draw("vecEPhi180.fElements/(eventMean*tracksMean*meandE/180)>>hisdESector(100,0.85,1.1)","1/180","same"); | |
431 | hisFluc[3]=(TH1*)treeStat->GetHistogram()->Clone(); | |
432 | treeStat->Draw("vecTracksPhi36.fElements/(eventMean*tracksMean/36)>>hisTrackSector36(100,0.85,1.1)","1/36","same"); | |
433 | hisFluc[4]=(TH1*)treeStat->GetHistogram()->Clone(); | |
434 | treeStat->Draw("vecEPhi36.fElements/(eventMean*tracksMean*meandE/36)>>hisdESector36(100,0.85,1.1)","1/36","same"); | |
435 | hisFluc[5]=(TH1*)treeStat->GetHistogram()->Clone(); | |
436 | // | |
437 | // pulls | |
4e715689 | 438 | // |
7212f8c3 | 439 | treeStat->Draw("((nevents/eventMean)-1)/sqrt(1/eventMean)>>pullEvent(100,-6,6)","","err"); //tracks All pull |
440 | hisPull[0]=(TH1*)treeStat->GetHistogram()->Clone(); | |
441 | treeStat->Draw("(ntracksAll/(eventMean*tracksMean)-1)/sqrt(1/eventMean+(tracksRMS/tracksMean)**2/eventMean)>>pullTrackAll(100,-6,6)","","err"); //tracks All pull | |
442 | hisPull[1]=(TH1*)treeStat->GetHistogram()->Clone(); | |
443 | treeStat->Draw("(vecTracksPhi180.fElements/(eventMean*tracksMean/180.)-1)/sqrt(1/eventMean+(tracksRMS/tracksMean)**2/eventMean+180/(tracksMean*eventMean))>>pullTrack180(100,-6,6)","1/180","errsame"); //tracks spread | |
444 | hisPull[2]=(TH1*)treeStat->GetHistogram()->Clone(); | |
445 | treeStat->Draw("(vecEPhi180.fElements/(eventMean*tracksMean*meandE/180)-1)/sqrt(1/eventMean+(tracksRMS/tracksMean)**2/eventMean+180/(tracksMean*eventMean)+180*(rmsdE/meandE)**2/(eventMean*tracksMean))>>hisPulldE180(100,-6,6)","1/180","errsame"); //dE spread | |
446 | hisPull[3]=(TH1*)treeStat->GetHistogram()->Clone(); | |
447 | treeStat->Draw("(vecTracksPhi36.fElements/(eventMean*tracksMean/36.)-1)/sqrt(1/eventMean+(tracksRMS/tracksMean)**2/eventMean+36/(tracksMean*eventMean))>>pullTrack36(100,-6,6)","1/36","errsame"); //tracks spread | |
448 | hisPull[4]=(TH1*)treeStat->GetHistogram()->Clone(); | |
449 | treeStat->Draw("(vecEPhi36.fElements/(eventMean*tracksMean*meandE/36)-1)/sqrt(1/eventMean+(tracksRMS/tracksMean)**2/eventMean+36/(tracksMean*eventMean)+36*(rmsdE/meandE)**2/(eventMean*tracksMean))>>hisPulldE36(100,-6,6)","1/36","errsame"); //dE spread | |
450 | hisPull[5]=(TH1*)treeStat->GetHistogram()->Clone(); | |
4e715689 | 451 | // |
7212f8c3 | 452 | |
453 | for (Int_t ihis=0; ihis<6; ihis++) { | |
454 | vecFitFluc[ihis] = new TVectorD(3); | |
455 | vecFitFlucPull[ihis] = new TVectorD(3); | |
456 | TF1 * fg = new TF1(Form("fg%d",ihis),"gaus"); | |
457 | fg->SetLineWidth(0.5); | |
458 | fg->SetLineColor(kColors[ihis]); | |
459 | hisFluc[ihis]->Fit(fg,"",""); | |
460 | fg->GetParameters( vecFitFluc[ihis]->GetMatrixArray()); | |
461 | hisPull[ihis]->Fit(fg,"",""); | |
462 | fg->GetParameters( vecFitFlucPull[ihis]->GetMatrixArray()); | |
463 | hisFluc[ihis]->SetName(Form("Fluctuation%s",hnames[ihis])); | |
464 | hisFluc[ihis]->SetTitle(Form("Fluctuation%s",htitles[ihis])); | |
465 | hisPull[ihis]->SetName(Form("Pull%s",hnames[ihis])); | |
466 | hisPull[ihis]->SetTitle(Form("Pull%s",htitles[ihis])); | |
467 | } | |
468 | ||
469 | gStyle->SetOptStat(0); | |
470 | TCanvas * canvasQFluc= new TCanvas("SpaceChargeFluc","SpaceChargeFluc",600,700); | |
471 | canvasQFluc->Divide(1,2); | |
472 | canvasQFluc->cd(1); | |
473 | TLegend * legendFluc = new TLegend(0.11,0.55,0.45,0.89,"Relative fluctuation"); | |
474 | TLegend * legendPull = new TLegend(0.11,0.55,0.45,0.89,"Fluctuation pulls"); | |
475 | for (Int_t ihis=0; ihis<6; ihis++){ | |
476 | hisFluc[ihis]->SetMarkerStyle(kStyle[ihis]); | |
477 | hisFluc[ihis]->SetMarkerColor(kColors[ihis]); | |
478 | hisFluc[ihis]->SetMarkerSize(0.8); | |
479 | if (ihis==0) hisFluc[ihis]->Draw("err"); | |
480 | hisFluc[ihis]->Draw("errsame"); | |
481 | legendFluc->AddEntry(hisFluc[ihis],htitles[ihis]); | |
482 | } | |
483 | legendFluc->Draw(); | |
484 | ||
485 | canvasQFluc->cd(2); | |
486 | for (Int_t ihis=0; ihis<6; ihis++){ | |
487 | hisPull[ihis]->SetMarkerStyle(kStyle[ihis]); | |
488 | hisPull[ihis]->SetMarkerColor(kColors[ihis]); | |
489 | hisPull[ihis]->SetMarkerSize(0.8); | |
490 | if (ihis==0) hisPull[ihis]->Draw("err"); | |
491 | hisPull[ihis]->Draw("errsame"); | |
492 | legendPull->AddEntry(hisPull[ihis],htitles[ihis]); | |
493 | } | |
494 | legendPull->Draw(); | |
4e715689 | 495 | // |
7212f8c3 | 496 | for (Int_t ihis=0; ihis<6; ihis++){ |
497 | hisFluc[ihis]->Write(); | |
498 | hisPull[ihis]->Write(); | |
499 | } | |
500 | (*pcstream)<<"summary"<< // summary information for given setup | |
501 | "meanEvents="<<meanEvents<< // mean number of events in the frame | |
502 | "meandE="<<meandE<< // mean "energy loss" of track | |
503 | "rmsdE="<<rmsdE<< // rms | |
504 | "meanT="<<meanT<< // mean number of tracks per MB event | |
505 | "rmsT="<<rmsT<< // rms of onumber of tracks | |
506 | // // fit of the relative fluctuation | |
507 | "vflucE.="<<vecFitFluc[0]<< // in events | |
508 | "vflucEP.="<<vecFitFlucPull[0]<< // in events pull | |
509 | "vflucTr.="<<vecFitFluc[1]<< // in tracks | |
510 | "vflucTrP.="<<vecFitFlucPull[1]<< | |
511 | // | |
512 | "vflucTr180.="<<vecFitFluc[2]<< | |
513 | "vflucTr180P.="<<vecFitFlucPull[2]<< | |
514 | "vflucE180.="<<vecFitFluc[3]<< | |
515 | "vflucE180P.="<<vecFitFlucPull[3]<< | |
516 | // | |
517 | "vflucTr36.="<<vecFitFluc[4]<< | |
518 | "vflucTr36P.="<<vecFitFlucPull[4]<< | |
519 | "vflucE36.="<<vecFitFluc[5]<< | |
520 | "vflucE36P.="<<vecFitFlucPull[5]<< | |
521 | "\n"; | |
522 | canvasQFluc->SaveAs("CanvasFluctuation.pdf"); | |
523 | canvasQFluc->SaveAs("CanvasFluctuation.png"); | |
524 | delete pcstream; | |
c0172f82 | 525 | |
4e715689 | 526 | } |
7212f8c3 | 527 | |
528 | void spaceChargeFluctuationToyDrawSummary(){ | |
4e715689 | 529 | // |
7212f8c3 | 530 | // make a summary information plots using several runs with differnt mean IR setting |
531 | // Input: | |
532 | // space.list - list of root files produced by spaceChargeFluctuationToyDraw | |
533 | // Output: | |
534 | // canvas saved in current directory | |
4e715689 | 535 | // |
7212f8c3 | 536 | TChain * chain = AliXRDPROOFtoolkit::MakeChain("space.list","summary",0,100); |
537 | chain->SetMarkerStyle(21); | |
538 | const Int_t kColors[6]={1,2,3,4,6,7}; | |
539 | const Int_t kStyle[6]={20,21,24,25,24,25}; | |
540 | const char * htitles[6]={"Events","Tracks","Tracks #phi region (1/180)","Q #phi region (1/180)", "Tracks #phi region (1/36)","Q #phi region (1/36)"}; | |
541 | // const char * hnames[6]={"Events","Tracks","TracksPhi180","QPhi180", "TracksPhi36","QPhi36"}; | |
542 | // | |
543 | Double_t meanT,rmsT=0; | |
544 | Double_t meandE,rmsdE=0; | |
545 | Int_t entries = chain->Draw("meanT:rmsT:meandE:rmsdE","1","goff"); | |
546 | meanT =TMath::Mean(entries, chain->GetV1()); | |
547 | rmsT =TMath::Mean(entries, chain->GetV2()); | |
548 | meandE =TMath::Mean(entries, chain->GetV3()); | |
549 | rmsdE =TMath::Mean(entries, chain->GetV4()); | |
550 | // | |
551 | // | |
552 | // | |
553 | TGraphErrors * graphs[6]={0}; | |
554 | TF1 * functions[6]={0}; | |
555 | ||
556 | graphs[5]=TStatToolkit::MakeGraphErrors(chain,"vflucE36.fElements[2]:meanEvents:0.025*vflucE36.fElements[2]","1",kStyle[5],kColors[5],1); | |
557 | graphs[4]=TStatToolkit::MakeGraphErrors(chain,"vflucTr36.fElements[2]:meanEvents:0.025*vflucTr36.fElements[2]","1",kStyle[4],kColors[4],1); | |
558 | graphs[3]=TStatToolkit::MakeGraphErrors(chain,"vflucE180.fElements[2]:meanEvents:0.025*vflucE180.fElements[2]","1",kStyle[3],kColors[3],1); | |
559 | graphs[2]=TStatToolkit::MakeGraphErrors(chain,"vflucTr180.fElements[2]:meanEvents:0.025*vflucTr180.fElements[2]","1",kStyle[2],kColors[2],1); | |
560 | graphs[1]=TStatToolkit::MakeGraphErrors(chain,"vflucTr.fElements[2]:meanEvents:0.025*vflucTr.fElements[2]","1",kStyle[1],kColors[1],1); | |
561 | graphs[0]=TStatToolkit::MakeGraphErrors(chain,"vflucE.fElements[2]:meanEvents:0.025*vflucE.fElements[2]","1",kStyle[0],kColors[0],1); | |
562 | ||
563 | functions[5]=new TF1("fe","sqrt(1+[0]**2+[1]/[2]+[1]*[3]**2/[2])/sqrt(x)",2000,200000); | |
564 | functions[5]->SetParameters(rmsT/meanT,36.,meanT,rmsdE/meandE); | |
565 | functions[4]=new TF1("fe","sqrt(1+[0]**2+[1]/[2])/sqrt(x)",2000,200000); | |
566 | functions[4]->SetParameters(rmsT/meanT,36.,meanT,0); | |
567 | functions[3]=new TF1("fe","sqrt(1+[0]**2+[1]/[2]+[1]*[3]**2/[2])/sqrt(x)",2000,200000); | |
568 | functions[3]->SetParameters(rmsT/meanT,180.,meanT,rmsdE/meandE); | |
569 | functions[2]=new TF1("fe","sqrt(1+[0]**2+[1]/[2])/sqrt(x)",2000,200000); | |
570 | functions[2]->SetParameters(rmsT/meanT,180.,meanT,0); | |
571 | functions[1]=new TF1("fe","sqrt(1+[0]**2)/sqrt(x)",2000,200000); | |
572 | functions[1]->SetParameters(rmsT/meanT,0); | |
573 | functions[0]=new TF1("fe","sqrt(1)/sqrt(x)",2000,200000); | |
574 | ||
575 | ||
576 | TCanvas *canvasF= new TCanvas("fluc","fluc",600,500); | |
577 | // TLegend *legend = new TLegend(0.5,0.65,0.89,0.89,"Relative fluctuation #sigma=#sqrt{1+#frac{#sigma_{T}^{2}}{#mu_{T}^{2}}}"); | |
578 | TLegend *legendF = new TLegend(0.45,0.5,0.89,0.89,"Relative fluctuation of charge"); | |
579 | for (Int_t ihis=0; ihis<4; ihis++){ | |
580 | graphs[ihis]->SetMinimum(0.00); | |
581 | graphs[ihis]->SetMaximum(0.05); | |
582 | if (ihis==0) graphs[ihis]->Draw("ap"); | |
583 | graphs[ihis]->GetXaxis()->SetTitle("events"); | |
584 | graphs[ihis]->GetXaxis()->SetNdivisions(507); | |
585 | graphs[ihis]->GetYaxis()->SetTitle("#frac{#sigma}{#mu}"); | |
586 | graphs[ihis]->Draw("p"); | |
587 | legendF->AddEntry(graphs[ihis],htitles[ihis],"p"); | |
588 | if (functions[ihis]){ | |
589 | functions[ihis]->SetLineColor(kColors[ihis]); | |
590 | functions[ihis]->SetLineWidth(0.5); | |
591 | functions[ihis]->Draw("same"); | |
592 | } | |
593 | } | |
594 | legendF->Draw(); | |
595 | canvasF->SaveAs("spaceChargeFlucScan.pdf"); | |
596 | canvasF->SaveAs("spaceChargeFlucScan.png"); | |
597 | ||
598 | TCanvas *canvasF36= new TCanvas("fluc36","fluc36",600,500); | |
599 | // TLegend *legend = new TLegend(0.5,0.65,0.89,0.89,"Relative fluctuation #sigma=#sqrt{1+#frac{#sigma_{T}^{2}}{#mu_{T}^{2}}}"); | |
600 | TLegend *legendF36 = new TLegend(0.45,0.5,0.89,0.89,"Relative fluctuation of charge"); | |
601 | for (Int_t ihis=0; ihis<6; ihis++){ | |
602 | if (ihis==2 || ihis==3) continue; | |
603 | graphs[ihis]->SetMinimum(0.00); | |
604 | graphs[ihis]->SetMaximum(0.05); | |
605 | if (ihis==0) graphs[ihis]->Draw("ap"); | |
606 | graphs[ihis]->GetXaxis()->SetTitle("events"); | |
607 | graphs[ihis]->GetXaxis()->SetNdivisions(507); | |
608 | graphs[ihis]->GetYaxis()->SetTitle("#frac{#sigma}{#mu}"); | |
609 | graphs[ihis]->Draw("p"); | |
610 | legendF36->AddEntry(graphs[ihis],htitles[ihis],"p"); | |
611 | if (functions[ihis]){ | |
612 | functions[ihis]->SetLineColor(kColors[ihis]); | |
613 | functions[ihis]->SetLineWidth(0.5); | |
614 | functions[ihis]->Draw("same"); | |
615 | } | |
616 | } | |
617 | legendF36->Draw(); | |
618 | canvasF36->SaveAs("spaceChargeFlucScan36.pdf"); | |
619 | canvasF36->SaveAs("spaceChargeFlucScan36.png"); | |
620 | ||
621 | ||
622 | } | |
623 | ||
624 | ||
625 | ||
626 | void FitMultiplicity(const char * fname="mult_dist_pbpb.root"){ | |
627 | // | |
628 | // Fit multiplicity distribution using as a power law in limited range | |
629 | // const char * fname="mult_dist_pbpb.root" | |
630 | TFile *fmult=TFile::Open(fname); | |
4e715689 | 631 | TF1 f1("f1","[0]*(x+abs([2]))**(-abs([1]))",1,3000); |
632 | TH1* his = (TH1*) fmult->Get("mult_dist_PbPb_normalizedbywidth"); | |
633 | f1.SetParameters(his->GetEntries(),1,1); | |
634 | his->Fit(&f1,"","",2,3000); | |
635 | ||
636 | Double_t FPOT=1.0, EEND=3000, EEXPO= TMath::Abs(f1.GetParameter(1)); | |
637 | EEXPO=0.8567; | |
638 | const Double_t XEXPO=-EEXPO+1, YEXPO=1/XEXPO; | |
639 | TH1F *hisr= new TH1F("aaa","aaa",4000,0,4000); | |
640 | for (Int_t i=0; i<400000; i++){ | |
641 | Float_t RAN = gRandom->Rndm(); | |
642 | hisr->Fill(TMath::Power((TMath::Power(FPOT,XEXPO)*(1-RAN)+TMath::Power(EEND,XEXPO)*RAN),YEXPO)); | |
643 | } | |
4e715689 | 644 | } |
c0172f82 | 645 | |
c0172f82 | 646 | |
647 | ||
648 | ||
76dbc35e | 649 | TH1 * GenerateMapRawIons(Int_t useGainMap, const char *fileName, const char *outputName, Int_t maxEvents){ |
c0172f82 | 650 | // |
651 | // Generate 3D maps of the space charge for the rad data maps | |
652 | // different threshold considered | |
653 | // Paramaters: | |
0eff8c53 | 654 | // useGainMap - switch usage of the gain map |
c0172f82 | 655 | // fileName - name of input raw file |
656 | // outputName - name of output file with the space charge histograms | |
657 | // maxEvents - grouping of the events | |
658 | // | |
659 | // | |
7212f8c3 | 660 | gRandom->SetSeed(0); //set initial seed to be independent for different jobs |
661 | ||
c0172f82 | 662 | TTreeSRedirector * pcstream = new TTreeSRedirector(outputName, "recreate"); |
663 | const char * ocdbpath =gSystem->Getenv("OCDB_PATH") ? gSystem->Getenv("OCDB_PATH"):"local://$ALICE_ROOT/OCDB/"; | |
664 | AliCDBManager * man = AliCDBManager::Instance(); | |
665 | man->SetDefaultStorage(ocdbpath); | |
666 | man->SetRun(0); | |
667 | TGeoGlobalMagField::Instance()->SetField(new AliMagF("Maps","Maps", -1., -1., AliMagF::k5kG, AliMagF::kBeamTypepp, 2.76/2.)); | |
668 | AliTPCAltroMapping** mapping =AliTPCcalibDB::Instance()->GetMapping(); | |
669 | AliTPCParam * param = AliTPCcalibDB::Instance()->GetParameters(); | |
76dbc35e | 670 | AliTPCCalPad * gain = AliTPCcalibDB::Instance()->GetDedxGainFactor(); |
671 | AliTPCCalPad * noise = AliTPCcalibDB::Instance()->GetPadNoise(); | |
672 | ||
c0172f82 | 673 | TStopwatch timer; |
674 | timer.Start(); | |
675 | // arrays of space charges - different elements corresponds to different threshold to accumulate charge | |
76dbc35e | 676 | TH1D * hisQ1D[3]={0}; |
76dbc35e | 677 | TH1D * hisQ1DROC[3]={0}; |
7212f8c3 | 678 | TH2D * hisQ2DRPhi[3]={0}; |
679 | TH2D * hisQ2DRZ[3]={0}; | |
680 | TH2D * hisQ2DRPhiROC[3]={0}; | |
681 | TH2D * hisQ2DRZROC[3]={0}; | |
682 | TH3D * hisQ3D[3]={0}; // 3D maps space charge from drift volume | |
683 | TH3D * hisQ3DROC[3]={0}; // 3D maps space charge from ROC | |
684 | ||
5c70ec78 | 685 | Int_t nbinsRow=param->GetNRowLow()+param->GetNRowUp(); |
686 | Double_t *xbins = new Double_t[nbinsRow+1]; | |
687 | xbins[0]=param->GetPadRowRadiiLow(0)-1; //underflow bin | |
688 | for (Int_t ibin=0; ibin<param->GetNRowLow();ibin++) xbins[1+ibin]=param->GetPadRowRadiiLow(ibin); | |
689 | for (Int_t ibin=0; ibin<param->GetNRowUp();ibin++) xbins[1+ibin+param->GetNRowLow()]=param->GetPadRowRadiiUp(ibin); | |
c0172f82 | 690 | // |
691 | for (Int_t ith=0; ith<3; ith++){ | |
692 | char chname[100]; | |
7212f8c3 | 693 | // 1D |
694 | snprintf(chname,100,"hisQ1D_Th%d",2*ith+2); | |
695 | hisQ1D[ith] = new TH1D(chname,chname, param->GetNRow(0)+param->GetNRow(36) ,0, param->GetNRow(0)+param->GetNRow(36) ); | |
696 | snprintf(chname,100,"hisQ1DROC_Th%d",2*ith+2); | |
697 | hisQ1DROC[ith] = new TH1D(chname,chname, param->GetNRow(0)+param->GetNRow(36) ,0, param->GetNRow(0)+param->GetNRow(36) ); | |
698 | // 3D | |
c0172f82 | 699 | snprintf(chname,100,"hisQ3D_Th%d",2*ith+2); |
7212f8c3 | 700 | hisQ3D[ith] = new TH3D(chname, chname,360, 0,TMath::TwoPi(),param->GetNRow(0)+param->GetNRow(36) ,0, param->GetNRow(0)+param->GetNRow(36) ,125,-250,250); |
701 | snprintf(chname,100,"hisQ3DROC_Th%d",2*ith+2); | |
702 | hisQ3DROC[ith] = new TH3D(chname, chname,360, 0,TMath::TwoPi(),param->GetNRow(0)+param->GetNRow(36) ,0, param->GetNRow(0)+param->GetNRow(36) ,125,-250,250); | |
703 | // 2D | |
704 | snprintf(chname,100,"hisQ2DRPhi_Th%d",2*ith+2); | |
705 | hisQ2DRPhi[ith] = new TH2D(chname,chname,180, 0,2*TMath::TwoPi(), param->GetNRow(0)+param->GetNRow(36) ,0, param->GetNRow(0)+param->GetNRow(36) ); | |
76dbc35e | 706 | snprintf(chname,100,"hisQ2DRZ_Th%d",2*ith+2); |
76dbc35e | 707 | hisQ2DRZ[ith] = new TH2D(chname,chname, param->GetNRow(0)+param->GetNRow(36) ,0, param->GetNRow(0)+param->GetNRow(36), 125,-250,250); |
c0172f82 | 708 | // |
7212f8c3 | 709 | snprintf(chname,100,"hisQ2DRPhiROC_Th%d",2*ith+2); |
710 | hisQ2DRPhiROC[ith] = new TH2D(chname,chname,180, 0,2*TMath::TwoPi(), param->GetNRow(0)+param->GetNRow(36) ,0, param->GetNRow(0)+param->GetNRow(36) ); | |
76dbc35e | 711 | snprintf(chname,100,"hisQ2DRZROC_Th%d",2*ith+2); |
712 | hisQ2DRZROC[ith] = new TH2D(chname,chname,param->GetNRow(0)+param->GetNRow(36) ,0, param->GetNRow(0)+param->GetNRow(36), 125,-250,250); | |
7212f8c3 | 713 | // |
5c70ec78 | 714 | hisQ1D[ith]->GetXaxis()->Set(nbinsRow,xbins); |
5c70ec78 | 715 | hisQ1DROC[ith]->GetXaxis()->Set(nbinsRow,xbins); |
7212f8c3 | 716 | hisQ3D[ith]->GetYaxis()->Set(nbinsRow,xbins); |
5c70ec78 | 717 | hisQ3DROC[ith]->GetYaxis()->Set(nbinsRow,xbins); |
c0172f82 | 718 | // |
7212f8c3 | 719 | hisQ2DRPhi[ith]->GetYaxis()->Set(nbinsRow,xbins); |
720 | hisQ2DRZ[ith]->GetXaxis()->Set(nbinsRow,xbins); | |
721 | hisQ2DRPhiROC[ith]->GetYaxis()->Set(nbinsRow,xbins); | |
722 | hisQ2DRZROC[ith]->GetXaxis()->Set(nbinsRow,xbins); | |
723 | // | |
c0172f82 | 724 | hisQ1D[ith]->SetDirectory(0); |
7212f8c3 | 725 | hisQ1DROC[ith]->SetDirectory(0); |
726 | hisQ3D[ith]->SetDirectory(0); | |
c0172f82 | 727 | hisQ3DROC[ith]->SetDirectory(0); |
7212f8c3 | 728 | // |
729 | hisQ2DRPhi[ith]->SetDirectory(0); | |
730 | hisQ2DRZ[ith]->SetDirectory(0); | |
76dbc35e | 731 | hisQ2DRZROC[ith]->SetDirectory(0); |
7212f8c3 | 732 | hisQ2DRPhiROC[ith]->SetDirectory(0); |
c0172f82 | 733 | } |
734 | // | |
735 | // | |
736 | AliRawReader *reader = new AliRawReaderRoot(fileName); | |
737 | reader->Reset(); | |
738 | AliAltroRawStream* stream = new AliAltroRawStream(reader); | |
739 | stream->SelectRawData("TPC"); | |
740 | Int_t evtnr=0; | |
741 | Int_t chunkNr=0; | |
742 | // | |
743 | ||
744 | while (reader->NextEvent()) { | |
0eff8c53 | 745 | Double_t shiftZ= gRandom->Rndm()*250.; |
c0172f82 | 746 | // |
747 | if(evtnr>=maxEvents) { | |
748 | chunkNr++; | |
c0172f82 | 749 | pcstream->GetFile()->mkdir(Form("Chunk%d",chunkNr)); |
750 | pcstream->GetFile()->cd(Form("Chunk%d",chunkNr)); | |
751 | for (Int_t ith=0; ith<3; ith++){ | |
752 | hisQ1D[ith]->Write(Form("His1DDrift_%d",ith)); | |
7212f8c3 | 753 | hisQ2DRPhi[ith]->Write(Form("His2DRPhiDrift_%d",ith)); |
754 | hisQ2DRZ[ith]->Write(Form("His2DRZDrift_%d",ith)); | |
c0172f82 | 755 | hisQ3D[ith]->Write(Form("His3DDrift_%d",ith)); |
756 | hisQ1DROC[ith]->Write(Form("His1DROC_%d",ith)); | |
7212f8c3 | 757 | hisQ2DRPhiROC[ith]->Write(Form("His2DRPhiROC_%d",ith)); |
76dbc35e | 758 | hisQ2DRZROC[ith]->Write(Form("His2DRZROC_%d",ith)); |
c0172f82 | 759 | hisQ3DROC[ith]->Write(Form("His3DROC_%d",ith)); |
5c70ec78 | 760 | (*pcstream)<<"histo"<< |
76dbc35e | 761 | "events="<<evtnr<< |
762 | "useGain="<<useGainMap<< | |
5c70ec78 | 763 | Form("hist1D_%d.=",ith*2+2)<<hisQ1D[ith]<< |
7212f8c3 | 764 | Form("hist2DRPhi_%d.=",ith*2+2)<<hisQ2DRPhi[ith]<< |
76dbc35e | 765 | Form("hist2DRZ_%d.=",ith*2+2)<<hisQ2DRZ[ith]<< |
766 | Form("hist3D_%d.=",ith*2+2)<<hisQ3D[ith]<< | |
5c70ec78 | 767 | Form("hist1DROC_%d.=",ith*2+2)<<hisQ1DROC[ith]<< |
7212f8c3 | 768 | Form("hist2DRPhiROC_%d.=",ith*2+2)<<hisQ2DRPhiROC[ith]<< |
76dbc35e | 769 | Form("hist2DRZROC_%d.=",ith*2+2)<<hisQ2DRZROC[ith]<< |
770 | Form("hist3DROC_%d.=",ith*2+2)<<hisQ3DROC[ith]; | |
5c70ec78 | 771 | } |
772 | (*pcstream)<<"histo"<<"\n"; | |
773 | for (Int_t ith=0; ith<3; ith++){ | |
c0172f82 | 774 | hisQ1D[ith]->Reset(); |
7212f8c3 | 775 | hisQ2DRPhi[ith]->Reset(); |
76dbc35e | 776 | hisQ2DRZ[ith]->Reset(); |
c0172f82 | 777 | hisQ3D[ith]->Reset(); |
778 | hisQ1DROC[ith]->Reset(); | |
7212f8c3 | 779 | hisQ2DRPhiROC[ith]->Reset(); |
76dbc35e | 780 | hisQ2DRZROC[ith]->Reset(); |
c0172f82 | 781 | hisQ3DROC[ith]->Reset(); |
782 | } | |
76dbc35e | 783 | evtnr=0; |
c0172f82 | 784 | } |
785 | cout<<"Chunk=\t"<<chunkNr<<"\tEvt=\t"<<evtnr<<endl; | |
786 | evtnr++; | |
787 | AliSysInfo::AddStamp(Form("Event%d",evtnr),evtnr); | |
788 | AliTPCRawStreamV3 input(reader,(AliAltroMapping**)mapping); | |
789 | // | |
790 | while (input.NextDDL()){ | |
76dbc35e | 791 | Int_t sector = input.GetSector(); |
792 | AliTPCCalROC * gainROC =gain->GetCalROC(sector); | |
793 | AliTPCCalROC * noiseROC =noise->GetCalROC(sector); | |
c0172f82 | 794 | while ( input.NextChannel() ) { |
795 | Int_t row = input.GetRow(); | |
c0172f82 | 796 | Int_t pad = input.GetPad(); |
797 | Int_t nPads = param->GetNPads(sector,row); | |
798 | Double_t localX = param->GetPadRowRadii(sector,row); | |
7212f8c3 | 799 | Double_t localY = (pad-nPads/2)*param->GetPadPitchWidth(sector); |
c0172f82 | 800 | Double_t localPhi= TMath::ATan2(localY,localX); |
801 | Double_t phi = TMath::Pi()*((sector%18)+0.5)/9+localPhi; | |
c0172f82 | 802 | Double_t padLength=param->GetPadPitchLength(sector,row); |
76dbc35e | 803 | Double_t gainPad = gainROC->GetValue(row,pad); |
804 | Double_t noisePad = noiseROC->GetValue(row,pad); | |
c0172f82 | 805 | // |
806 | while ( input.NextBunch() ){ | |
807 | Int_t startTbin = (Int_t)input.GetStartTimeBin(); | |
808 | Int_t bunchlength = (Int_t)input.GetBunchLength(); | |
809 | const UShort_t *sig = input.GetSignals(); | |
810 | Int_t aboveTh[3]={0}; | |
811 | for (Int_t i=0; i<bunchlength; i++){ | |
76dbc35e | 812 | if (sig[i]<4*noisePad) continue; |
c0172f82 | 813 | for (Int_t ith=0; ith<3; ith++){ |
814 | if (sig[i]>(ith*2)+2) aboveTh[ith]++; | |
815 | } | |
816 | } | |
817 | for (Int_t ith=0; ith<3; ith++){ | |
818 | if (aboveTh[ith%3]>1){ | |
819 | for (Int_t i=0; i<bunchlength; i++){ | |
820 | // | |
821 | // normalization | |
822 | // | |
76dbc35e | 823 | Double_t zIonDrift =(param->GetZLength()-startTbin*param->GetZWidth()); |
c0172f82 | 824 | zIonDrift+=shiftZ; |
76dbc35e | 825 | Double_t signal=sig[i]; |
826 | if (useGainMap) signal/=gainPad; | |
7212f8c3 | 827 | Double_t shiftPhi = ((sector%36)<18) ? 0: TMath::TwoPi(); |
c0172f82 | 828 | if (TMath::Abs(zIonDrift)<param->GetZLength()){ |
829 | if ((sector%36)>=18) zIonDrift*=-1; // c side has opposite sign | |
76dbc35e | 830 | if (sector%36<18) hisQ1D[ith]->Fill(localX, signal/padLength); |
7212f8c3 | 831 | hisQ2DRPhi[ith]->Fill(phi+shiftPhi,localX, signal/padLength); |
76dbc35e | 832 | hisQ2DRZ[ith]->Fill(localX, zIonDrift, signal/padLength); |
833 | hisQ3D[ith]->Fill(phi,localX,zIonDrift,signal/padLength); | |
c0172f82 | 834 | } |
835 | // | |
836 | Double_t zIonROC = ((sector%36)<18)? shiftZ: -shiftZ; // z position of the "ion disc" - A side C side opposite sign | |
76dbc35e | 837 | if (sector%36<18) hisQ1DROC[ith]->Fill(localX, signal/padLength); |
7212f8c3 | 838 | hisQ2DRPhiROC[ith]->Fill(phi+shiftPhi,localX, signal/padLength); |
76dbc35e | 839 | hisQ2DRZROC[ith]->Fill(localX, zIonROC, signal/padLength); |
840 | hisQ3DROC[ith]->Fill(phi,localX,zIonROC,signal/padLength); | |
c0172f82 | 841 | } |
842 | } | |
843 | } | |
844 | } | |
845 | } | |
846 | } | |
847 | } | |
848 | timer.Print(); | |
849 | delete pcstream; | |
850 | return 0; | |
851 | } | |
76dbc35e | 852 | |
853 | ||
7212f8c3 | 854 | void DoMerge(){ |
76dbc35e | 855 | // |
7212f8c3 | 856 | // Merge results to the tree |
76dbc35e | 857 | // |
7212f8c3 | 858 | TFile * fhisto = new TFile("histo.root","recreate"); |
859 | TTree * tree = 0; | |
860 | TChain *chain = AliXRDPROOFtoolkit::MakeChainRandom("histo.list","histo",0,100,1); | |
861 | chain->SetBranchStatus("hist3DROC_6*",kFALSE); | |
862 | chain->SetBranchStatus("hist3DROC_4*",kFALSE); | |
863 | tree = chain->CopyTree("1"); | |
864 | tree->Write("histo"); | |
865 | delete fhisto; | |
866 | } | |
867 | ||
868 | ||
869 | ||
870 | ||
871 | void AnalyzeMaps1D(){ | |
76dbc35e | 872 | // |
7212f8c3 | 873 | // Analyze space charge maps stored as s hitograms in trees |
76dbc35e | 874 | // |
7212f8c3 | 875 | TFile * fhisto = new TFile("histo.root"); |
876 | TTree * tree = (TTree*)fhisto->Get("histo"); | |
76dbc35e | 877 | // |
878 | TH1 *his1Th[3]={0,0,0}; | |
879 | TF1 *fq1DStep= new TF1("fq1DStep","([0]+[1]*(x>134))/x**min(abs([2]),3)",85,245); | |
880 | fq1DStep->SetParameters(1,-0.5,1); | |
881 | tree->Draw("hist1DROC_2.fArray:hist1D_2.fXaxis.fXbins.fArray>>his(40,85,245)","","prof"); | |
882 | tree->GetHistogram()->Fit(fq1DStep); | |
883 | // normalize step between the IROC-OROC | |
884 | tree->SetAlias("normQ",Form("(1+%f*(hist1D_2.fXaxis.fXbins.fArray>136))",fq1DStep->GetParameter(1)/fq1DStep->GetParameter(0))); | |
885 | // | |
886 | { | |
887 | Int_t entries= tree->Draw("hist1DROC_2.fArray/(events*normQ)","1","goff"); | |
888 | Double_t median=TMath::Median(entries,tree->GetV1()); | |
889 | TCut cut10Median = Form("hist1DROC_2.fArray/(events*normQ)<%f",10*median); | |
890 | // | |
891 | tree->Draw("hist1DROC_2.fArray/(events*normQ):hist1D_2.fXaxis.fXbins.fArray>>his1Th0(40,86,245)",cut10Median+"","prof"); | |
892 | his1Th[0] = tree->GetHistogram(); | |
893 | tree->Draw("hist1DROC_4.fArray/(events*normQ):hist1D_2.fXaxis.fXbins.fArray>>his1Th1(40,86,245)",cut10Median+"","prof"); | |
894 | his1Th[1] = tree->GetHistogram(); | |
895 | tree->Draw("hist1DROC_6.fArray/(events*normQ):hist1D_2.fXaxis.fXbins.fArray>>his1Th2(40,86,245)",cut10Median+"","prof"); | |
896 | his1Th[2]=tree->GetHistogram(); | |
897 | } | |
898 | // | |
899 | TCanvas *canvasR = new TCanvas("canvasR","canvasR",600,500); | |
900 | canvasR->cd(); | |
901 | for (Int_t i=0; i<3; i++){ | |
902 | his1Th[i]->SetMarkerStyle(21); | |
903 | his1Th[i]->SetMarkerColor(i+2); | |
904 | fq1DStep->SetLineColor(i+2); | |
905 | his1Th[i]->Fit(fq1DStep,"",""); | |
906 | his1Th[i]->GetXaxis()->SetTitle("r (cm)"); | |
907 | his1Th[i]->GetYaxis()->SetTitle("#frac{N_{el}}{N_{ev}}(ADC/cm)"); | |
908 | } | |
909 | TLegend * legend = new TLegend(0.11,0.11,0.7,0.39,"1D space Charge map (ROC part) (z,phi integrated)"); | |
910 | for (Int_t i=0; i<3; i++){ | |
911 | his1Th[i]->SetMinimum(0);fq1DStep->SetLineColor(i+2); | |
912 | his1Th[i]->Fit(fq1DStep,"qnr","qnr"); | |
913 | if (i==0) his1Th[i]->Draw(""); | |
914 | his1Th[i]->Draw("same"); | |
915 | legend->AddEntry(his1Th[i],Form("Thr=%d Slope=%2.2f",2*i+2,fq1DStep->GetParameter(2))); | |
916 | } | |
917 | legend->Draw(); | |
7212f8c3 | 918 | canvasR->SaveAs("spaceCharge1d.png"); |
919 | canvasR->SaveAs("spaceCharge1d.eps"); | |
76dbc35e | 920 | // |
921 | // | |
922 | // | |
923 | } | |
0eff8c53 | 924 | void MakeFluctuationStudy3D(Int_t nhistos, Int_t nevents, Int_t niter){ |
925 | // | |
926 | // | |
927 | // | |
0eff8c53 | 928 | // |
7212f8c3 | 929 | // Input: |
930 | // nhistos - maximal number of histograms to be used for sum | |
931 | // nevents - number of events to make a fluctuation studies | |
932 | // niter - number of itterations | |
933 | // Algortihm: | |
0eff8c53 | 934 | // 1. Make a summary integral 3D/2D/1D maps |
935 | // 2. Create several maps with niter events - Poisson flucturation in n | |
936 | // 3. Store results 3D maps in the tree (and also as histogram) current and mean | |
7212f8c3 | 937 | // |
938 | ||
939 | TFile * fhisto = TFile::Open("histo.root"); | |
76dbc35e | 940 | TTree * tree = (TTree*)fhisto->Get("histo"); |
0eff8c53 | 941 | tree->SetCacheSize(10000000000); |
76dbc35e | 942 | |
7212f8c3 | 943 | TTreeSRedirector * pcstream = new TTreeSRedirector("fluctuation.root", "update"); |
944 | ||
945 | ||
76dbc35e | 946 | TH1D * his1DROC=0, * his1DROCSum=0, * his1DROCN=0; |
947 | TH1D * his1DDrift=0, * his1DDriftSum=0, * his1DDriftN=0 ; | |
7212f8c3 | 948 | TH2D * his2DRPhiROC=0, * his2DRPhiROCSum=0, * his2DRPhiROCN=0; |
0eff8c53 | 949 | TH2D * his2DRZROC=0, * his2DRZROCSum=0, * his2DRZROCN=0; |
7212f8c3 | 950 | TH2D * his2DRPhiDrift=0, * his2DRPhiDriftSum=0, * his2DRPhiDriftN=0; |
0eff8c53 | 951 | TH2D * his2DRZDrift=0, * his2DRZDriftSum=0, * his2DRZDriftN=0; |
76dbc35e | 952 | TH3D * his3DROC=0, * his3DROCSum=0, * his3DROCN=0; |
953 | TH3D * his3DDrift=0, * his3DDriftSum=0, * his3DDriftN=0; | |
954 | // | |
0eff8c53 | 955 | if (nhistos<0 || nhistos> tree->GetEntries()) nhistos = tree->GetEntries(); |
956 | Int_t eventsPerChunk=0; | |
76dbc35e | 957 | tree->SetBranchAddress("hist1D_2.",&his1DDrift); |
958 | tree->SetBranchAddress("hist1DROC_2.",&his1DROC); | |
7212f8c3 | 959 | tree->SetBranchAddress("hist2DRPhi_2.",&his2DRPhiDrift); |
0eff8c53 | 960 | tree->SetBranchAddress("hist2DRZ_2.",&his2DRZDrift); |
7212f8c3 | 961 | tree->SetBranchAddress("hist2DRPhiROC_2.",&his2DRPhiROC); |
76dbc35e | 962 | tree->SetBranchAddress("hist3D_2.",&his3DDrift); |
963 | tree->SetBranchAddress("hist3DROC_2.",&his3DROC); | |
0eff8c53 | 964 | tree->SetBranchAddress("hist2DRZROC_2.",&his2DRZROC); |
965 | tree->SetBranchAddress("events",&eventsPerChunk); | |
966 | // | |
967 | // 1. Make a summary integral 3D/2D/1D maps | |
76dbc35e | 968 | // |
0eff8c53 | 969 | Int_t neventsAll=0; |
76dbc35e | 970 | for (Int_t i=0; i<nhistos; i++){ |
971 | tree->GetEntry(i); | |
972 | if (i%25==0) printf("%d\n",i); | |
973 | if (his1DROCSum==0) his1DROCSum=new TH1D(*his1DROC); | |
974 | if (his1DDriftSum==0) his1DDriftSum=new TH1D(*his1DDrift); | |
7212f8c3 | 975 | if (his2DRPhiROCSum==0) his2DRPhiROCSum=new TH2D(*his2DRPhiROC); |
0eff8c53 | 976 | if (his2DRZROCSum==0) his2DRZROCSum=new TH2D(*his2DRZROC); |
7212f8c3 | 977 | if (his2DRPhiDriftSum==0) his2DRPhiDriftSum=new TH2D(*his2DRPhiDrift); |
0eff8c53 | 978 | if (his2DRZDriftSum==0) his2DRZDriftSum=new TH2D(*his2DRZDrift); |
76dbc35e | 979 | if (his3DROCSum==0) his3DROCSum=new TH3D(*his3DROC); |
980 | if (his3DDriftSum==0) his3DDriftSum=new TH3D(*his3DDrift); | |
981 | his1DROCSum->Add(his1DROC); | |
982 | his1DDriftSum->Add(his1DDrift); | |
7212f8c3 | 983 | his2DRPhiROCSum->Add(his2DRPhiROC); |
0eff8c53 | 984 | his2DRZROCSum->Add(his2DRZROC); |
7212f8c3 | 985 | his2DRPhiDriftSum->Add(his2DRPhiDrift); |
0eff8c53 | 986 | his2DRZDriftSum->Add(his2DRZDrift); |
76dbc35e | 987 | his3DROCSum->Add(his3DROC); |
988 | his3DDriftSum->Add(his3DDrift); | |
0eff8c53 | 989 | neventsAll+=eventsPerChunk; |
76dbc35e | 990 | } |
991 | // | |
0eff8c53 | 992 | // 2. Create several maps with niter events - Poisson flucturation in n |
993 | // | |
994 | for (Int_t iter=0; iter<niter; iter++){ | |
995 | printf("Itteration=\t%d\n",iter); | |
0eff8c53 | 996 | Int_t nchunks=gRandom->Poisson(nevents)/eventsPerChunk; // chunks with n typically 25 events |
997 | for (Int_t i=0; i<nchunks; i++){ | |
0eff8c53 | 998 | tree->GetEntry(gRandom->Rndm()*nhistos); |
999 | if (i%10==0) printf("%d\t%d\n",iter, i); | |
1000 | if (his1DROCN==0) his1DROCN=new TH1D(*his1DROC); | |
1001 | if (his1DDriftN==0) his1DDriftN=new TH1D(*his1DDrift); | |
7212f8c3 | 1002 | if (his2DRPhiROCN==0) his2DRPhiROCN=new TH2D(*his2DRPhiROC); |
1003 | if (his2DRPhiDriftN==0) his2DRPhiDriftN=new TH2D(*his2DRPhiDrift); | |
0eff8c53 | 1004 | if (his2DRZROCN==0) his2DRZROCN=new TH2D(*his2DRZROC); |
1005 | if (his2DRZDriftN==0) his2DRZDriftN=new TH2D(*his2DRZDrift); | |
1006 | if (his3DROCN==0) his3DROCN=new TH3D(*his3DROC); | |
1007 | if (his3DDriftN==0) his3DDriftN=new TH3D(*his3DDrift); | |
1008 | his1DROCN->Add(his1DROC); | |
1009 | his1DDriftN->Add(his1DDrift); | |
7212f8c3 | 1010 | his2DRPhiROCN->Add(his2DRPhiROC); |
0eff8c53 | 1011 | his2DRZDriftN->Add(his2DRZDrift); |
1012 | his2DRZROCN->Add(his2DRZROC); | |
7212f8c3 | 1013 | his2DRPhiDriftN->Add(his2DRPhiDrift); |
0eff8c53 | 1014 | his3DROCN->Add(his3DROC); |
1015 | his3DDriftN->Add(his3DDrift); | |
1016 | } | |
1017 | // | |
1018 | // 3. Store results 3D maps in the tree (and also as histogram) current and mea | |
1019 | // | |
1020 | Int_t eventsUsed= nchunks*eventsPerChunk; | |
1021 | (*pcstream)<<"fluctuation"<< | |
1022 | "neventsAll="<<neventsAll<< // total number of event to define mean | |
1023 | "nmean="<<nevents<< // mean number of events used | |
1024 | "eventsUsed="<<eventsUsed<< // number of chunks used for one fluct. study | |
1025 | // | |
1026 | // 1,2,3D histogram per group and total | |
1027 | "his1DROCN.="<<his1DROCN<< | |
1028 | "his1DROCSum.="<<his1DROCSum<< | |
1029 | "his1DDriftN.="<<his1DDriftN<< | |
1030 | "his1DDriftSum.="<<his1DDriftSum<< | |
7212f8c3 | 1031 | "his2DRPhiROCN.="<<his2DRPhiROCN<< |
1032 | "his2DRPhiROCSum.="<<his2DRPhiROCSum<< | |
1033 | "his2DRPhiDriftN.="<<his2DRPhiDriftN<< | |
1034 | "his2DRPhiDriftSum.="<<his2DRPhiDriftSum<< | |
0eff8c53 | 1035 | "his2DRZROCN.="<<his2DRZROCN<< |
1036 | "his2DRZROCSum.="<<his2DRZROCSum<< | |
1037 | "his2DRZDriftN.="<<his2DRZDriftN<< | |
1038 | "his2DRZDriftSum.="<<his2DRZDriftSum<< | |
1039 | "his3DROCN.="<<his3DROCN<< | |
1040 | "his3DROCSum.="<<his3DROCSum<< | |
1041 | "his3DDriftN.="<<his3DDriftN<< | |
1042 | "his3DDriftSum.="<<his3DDriftSum<< | |
1043 | "\n"; | |
1044 | pcstream->GetFile()->mkdir(Form("Fluc%d",iter)); | |
1045 | pcstream->GetFile()->cd(Form("Fluc%d",iter)); | |
4e715689 | 1046 | // |
7212f8c3 | 1047 | his2DRPhiROCN->Write("his2DRPhiROCN"); |
0eff8c53 | 1048 | his2DRZROCN->Write("his2DRZROCN"); |
4e715689 | 1049 | // |
7212f8c3 | 1050 | his2DRPhiROCSum->Write("his2DRPhiROCSum"); |
0eff8c53 | 1051 | his2DRZROCSum->Write("his2DRZROCSum"); |
4e715689 | 1052 | // |
7212f8c3 | 1053 | his2DRPhiDriftN->Write("his2DRPhiDriftN"); |
0eff8c53 | 1054 | his2DRZDriftN->Write("his2DRZDriftN"); |
4e715689 | 1055 | // |
7212f8c3 | 1056 | his2DRPhiDriftSum->Write("his2DRPhiDriftSum"); |
0eff8c53 | 1057 | his2DRZDriftSum->Write("his2DRZDriftSum"); |
1058 | // | |
1059 | his3DROCN->Write("his3DROCN"); | |
1060 | his3DROCSum->Write("his3DROCSum"); | |
1061 | his3DDriftN->Write("his3DDriftN"); | |
1062 | his3DDriftSum->Write("his3DDriftSum"); | |
1063 | ||
1064 | his1DROCN->Reset(); | |
1065 | his1DDriftN->Reset(); | |
7212f8c3 | 1066 | his2DRPhiROCN->Reset(); |
0eff8c53 | 1067 | his2DRZDriftN->Reset(); |
1068 | his2DRZROCN->Reset(); | |
7212f8c3 | 1069 | his2DRPhiDriftN->Reset(); |
0eff8c53 | 1070 | his3DROCN->Reset(); |
1071 | his3DDriftN->Reset(); | |
76dbc35e | 1072 | } |
0eff8c53 | 1073 | |
1074 | delete pcstream; | |
76dbc35e | 1075 | } |
1076 | ||
1077 | ||
1078 | void DrawDCARPhiTrendTime(){ | |
1079 | // | |
0eff8c53 | 1080 | // Macros to draw the DCA correlation with the luminosity (estimated from the occupancy) |
76dbc35e | 1081 | // |
0eff8c53 | 1082 | // A side and c side 0 differnt behaviour - |
1083 | // A side - space charge effect | |
1084 | // C side - space charge effect+ FC charging: | |
1085 | // Variables to query from the QA/calibration DB - tree: | |
1086 | // QA.TPC.CPass1.dcar_posA_0 -dca rphi in cm - offset | |
1087 | // Calib.TPC.occQA.Sum() - luminosity is estimated using the mean occupancy per run | |
1088 | // | |
76dbc35e | 1089 | TFile *fdb = TFile::Open("outAll.root"); |
0eff8c53 | 1090 | if (!fdb) fdb = TFile::Open("http://www-alice.gsi.de/TPC/CPassMonitor/outAll.root"); |
76dbc35e | 1091 | TTree * tree = (TTree*)fdb->Get("joinAll"); |
1092 | tree->SetCacheSize(100000000); | |
1093 | tree->SetMarkerStyle(25); | |
1094 | ||
1095 | //QA.TPC.CPass1.dcar_posA_0 QA.TPC.CPass1.dcar_posA_0_Err QA.TPC.CPass1.meanMult Calib.TPC.occQA. DAQ.L3_magnetCurrent | |
1096 | ||
1097 | TGraphErrors * grA = TStatToolkit::MakeGraphErrors(tree,"QA.TPC.CPass1.dcar_posA_0:Calib.TPC.occQA.Sum()*sign(DAQ.L3_magnetCurrent):2*QA.TPC.CPass1.dcar_posA_0_Err","run>190000&&QA.TPC.CPass1.status==1",25,2,0.5); | |
1098 | TGraphErrors * grC = TStatToolkit::MakeGraphErrors(tree,"QA.TPC.CPass1.dcar_posC_0:Calib.TPC.occQA.Sum()*sign(DAQ.L3_magnetCurrent):2*QA.TPC.CPass1.dcar_posC_0_Err","run>190000&&QA.TPC.CPass1.status==1",25,4,0.5); | |
1099 | Double_t mean,rms; | |
1100 | TStatToolkit::EvaluateUni(grA->GetN(),grA->GetY(), mean,rms,grA->GetN()*0.8); | |
1101 | grA->SetMinimum(mean-5*rms); | |
1102 | grA->SetMaximum(mean+3*rms); | |
1103 | ||
1104 | ||
1105 | grA->GetXaxis()->SetTitle("occ*sign(bz)"); | |
1106 | grA->GetYaxis()->SetTitle("#Delta_{r#phi} (cm)"); | |
1107 | grA->Draw("ap"); | |
1108 | grC->Draw("p"); | |
1109 | TLegend* legend = new TLegend(0.11,0.11,0.5,0.3,"DCA_{rphi} as function of IR (2013)" ); | |
1110 | legend->AddEntry(grA,"A side","p"); | |
1111 | legend->AddEntry(grC,"C side","p"); | |
1112 | legend->Draw(); | |
76dbc35e | 1113 | } |
1114 | ||
1115 | ||
1116 | ||
1117 | void DrawOpenGate(){ | |
1118 | // | |
0eff8c53 | 1119 | // Make nice plot to demonstrate the space charge effect in run with the open gating grid |
1120 | // For the moment the inmput is harwired - the CPass0 calibration data used | |
1121 | // Make nice drawing (with axis labels): | |
1122 | // To fix (longer term) | |
1123 | // the distortion map to be recalculated - using gaussian fit (currently we use mean) | |
1124 | // the histogram should be extended | |
76dbc35e | 1125 | TFile f("/hera/alice/alien/alice/data/2013/LHC13g/000197470/cpass0/OCDB/root_archive.zip#meanITSVertex.root"); |
1126 | TFile fref("/hera/alice/alien/alice/data/2013/LHC13g/000197584/cpass0/OCDB/root_archive.zip#meanITSVertex.root"); | |
1127 | // | |
1128 | TTree * treeTOFdy=(TTree*)f.Get("TOFdy"); | |
1129 | TTree * treeTOFdyRef=(TTree*)fref.Get("TOFdy"); | |
1130 | treeTOFdy->AddFriend(treeTOFdyRef,"R"); | |
1131 | treeTOFdy->SetMarkerStyle(25); | |
1132 | TTree * treeITSdy=(TTree*)f.Get("ITSdy"); | |
1133 | TTree * treeITSdyRef=(TTree*)fref.Get("ITSdy"); | |
1134 | treeITSdy->AddFriend(treeITSdyRef,"R"); | |
1135 | treeITSdy->SetMarkerStyle(25); | |
1136 | TTree * treeVertexdy=(TTree*)f.Get("Vertexdy"); | |
1137 | TTree * treeVertexdyRef=(TTree*)fref.Get("Vertexdy"); | |
1138 | treeVertexdy->AddFriend(treeVertexdyRef,"R"); | |
1139 | treeVertexdy->SetMarkerStyle(25); | |
0eff8c53 | 1140 | |
1141 | // treeITSdy->Draw("mean-R.mean:sector:abs(theta)","entries>50&&abs(snp)<0.1&&theta<0","colz") | |
76dbc35e | 1142 | |
0eff8c53 | 1143 | treeITSdy->Draw("mean-R.mean:sector:abs(theta)","entries>50&&abs(snp)<0.1&&theta>0","colz"); |
c634db45 | 1144 | } |
1145 | ||
0eff8c53 | 1146 | |
ae4cea45 | 1147 | void DrawCurrent(const char * ocdb="/cvmfs/alice.gsi.de/alice/data/2013/OCDB/TPC/Calib/HighVoltage", Int_t run0=100000, Int_t run1=110000){ |
c634db45 | 1148 | // |
1149 | // | |
1150 | /* | |
1151 | const char * ocdb="/cvmfs/alice.gsi.de/alice/data/2013/OCDB/TPC/Calib/HighVoltage"; | |
1152 | Int_t run0=197460; | |
1153 | Int_t run1=197480; | |
1154 | */ | |
1155 | const Int_t knpoints=100000; | |
1156 | TVectorD vecTime(knpoints); | |
1157 | TVectorD vecI(knpoints); | |
1158 | Int_t npoints=0; | |
1159 | for (Int_t irun=run0; irun<run1; irun++){ | |
1160 | TFile * f = TFile::Open(Form("%s/Run%d_%d_v1_s0.root",ocdb,irun,irun)); | |
1161 | if (!f) continue; | |
1162 | AliCDBEntry * entry = (AliCDBEntry *)f->Get("AliCDBEntry"); | |
1163 | if (!entry) continue; | |
1164 | AliDCSSensorArray * array = (AliDCSSensorArray *)entry->GetObject(); | |
1165 | if (!array) continue; | |
1166 | AliDCSSensor * sensor = array->GetSensor("TPC_VHV_D_I_MON"); | |
1167 | //sensor->Draw(Form("%d",irun)); | |
1168 | TGraph *graph = sensor->GetGraph(); | |
1169 | for (Int_t ipoint=0; ipoint<graph->GetN(); ipoint++){ | |
1170 | vecTime[npoints]=sensor->GetStartTime()+graph->GetX()[ipoint]*3600; | |
1171 | vecI[npoints]=graph->GetY()[ipoint]; | |
1172 | npoints++; | |
1173 | } | |
1174 | } | |
1175 | TGraph * graph = new TGraph(npoints, vecTime.GetMatrixArray(), vecI.GetMatrixArray()); | |
1176 | graph->Draw("alp"); | |
1177 | ||
76dbc35e | 1178 | |
1179 | } | |
4e715689 | 1180 | |
1181 | ||
4b955de3 | 1182 | void MakeSpaceChargeFluctuationScan(Double_t scale, Int_t nfilesMerge, Int_t sign){ |
7212f8c3 | 1183 | // |
7212f8c3 | 1184 | // |
1185 | // Input: | |
633a08cb | 1186 | // scale - scaling of the space charge (defaul 1 corrsponds to the epsilon ~ 5) |
7212f8c3 | 1187 | // nfilesMerge - amount of chunks to merge |
1188 | // - =0 all chunks used | |
1189 | // <0 subset form full statistic | |
633a08cb | 1190 | // >0 subset from the limited (1000 mean) statistic |
1191 | // Output" | |
1192 | // For given SC setups the distortion on the space point and track level characterezed | |
1193 | // SpaceChargeFluc%d_%d.root - space point distortion maps | |
1194 | // SpaceChargeTrackFluc%d%d.root - tracks distortion caused by space point distortion | |
1195 | // | |
1196 | ||
4b955de3 | 1197 | // Make fluctuation scan: |
1198 | // 1.) Shift of z disk - to show which granularity in time needed | |
1199 | // 2.) Shift in sector - to show influence of the gass gain and epsilon | |
1200 | // 3.) Smearing in phi - to define phi granularity needed | |
633a08cb | 1201 | // 4.) Rebin z - commented out (not delete it for the moment) |
1202 | // 5.) Rebin phi - commented out | |
4b955de3 | 1203 | |
1204 | ||
1205 | // | |
1206 | // Some constant definition | |
1207 | // | |
1208 | Int_t nitteration=100; // number of itteration in the lookup | |
1209 | Int_t fullNorm =10000; // normalization fro the full statistic | |
5a998ace | 1210 | gROOT->ProcessLine(".x $ALICE_ROOT/TPC/Upgrade/macros/ConfigOCDB.C\(1\)"); |
4b955de3 | 1211 | // |
1212 | // Init magnetic field and OCDB | |
1213 | // | |
1214 | ||
1215 | Double_t bsign= sign; | |
1216 | if (bsign>1) bsign=-1; | |
2ff913b6 | 1217 | const Int_t nTracks=2000; |
4b955de3 | 1218 | const char *ocdb="local://$ALICE_ROOT/OCDB/"; |
1219 | AliCDBManager::Instance()->SetDefaultStorage(ocdb); | |
1220 | AliCDBManager::Instance()->SetRun(0); | |
1221 | TGeoGlobalMagField::Instance()->SetField(new AliMagF("Maps","Maps", bsign, bsign, AliMagF::k5kG)); | |
1222 | // | |
1223 | ||
1224 | ||
1225 | TTreeSRedirector *pcstream = new TTreeSRedirector(Form("SpaceChargeFluc%d_%d.root",nfilesMerge,sign),"recreate"); | |
1226 | TTreeSRedirector *pcstreamTrack = new TTreeSRedirector(Form("SpaceChargeTrackFluc%d_%d.root",nfilesMerge,sign),"recreate"); | |
7212f8c3 | 1227 | TH1D *his1DROCN=0, *his1DROCSum=0; |
1228 | TH2D *his2DRPhiROCN=0, *his2DRPhiROCSum=0, *his2DRZROCN=0, *his2DRZROCSum=0; | |
1229 | TH3D *his3DROCN=0, *his3DROCSum=0; | |
1230 | TH1D *his1DROCNC=0, *his1DROCSumC=0; | |
1231 | TH2D *his2DRPhiROCNC=0, *his2DRPhiROCSumC=0, *his2DRZROCNC=0, *his2DRZROCSumC=0; | |
1232 | TH3D *his3DROCNC=0, *his3DROCSumC=0; | |
1233 | TH1 * histos[8]={his1DROCN, his1DROCSum, his2DRPhiROCN, his2DRPhiROCSum, his2DRZROCN, his2DRZROCSum, his3DROCN, his3DROCSum}; | |
1234 | Int_t neventsAll=0, neventsAllC=0; | |
1235 | Int_t neventsChunk=0, neventsChunkC=0; | |
1236 | const Double_t ePerADC = 500.; | |
1237 | const Double_t fgke0 = 8.854187817e-12; | |
1238 | // | |
1239 | // | |
1240 | // | |
1241 | const char *inputFile="fluctuation.root"; | |
1242 | TObjArray * fileList = (gSystem->GetFromPipe("cat fluctuation.list")).Tokenize("\n"); | |
1243 | if (fileList->GetEntries()==0) fileList->AddLast(new TObjString(inputFile)); | |
1244 | Int_t nfiles = fileList->GetEntries(); | |
1245 | Int_t indexPer[1000]; | |
1246 | Double_t numbersPer[10000]; | |
1247 | for (Int_t i=0; i<nfiles; i++) numbersPer[i]=gRandom->Rndm(); | |
1248 | TMath::Sort(nfiles, numbersPer,indexPer); | |
1249 | ||
1250 | for (Int_t ifile=0; ifile<nfiles; ifile++){ | |
1251 | if (nfilesMerge>0 && ifile>=nfilesMerge) continue; // merge only limited amount if specified by argument | |
1252 | TFile *fhistos = TFile::Open(fileList->At(indexPer[ifile])->GetName()); | |
1253 | if (!fhistos) continue; | |
1254 | TTree * treeHis = (TTree*)fhistos->Get("fluctuation"); | |
1255 | if (!treeHis) { printf("file %s does not exist or tree does not exist\n",fileList->At(ifile)->GetName()); continue;} | |
1256 | Int_t nchunks=treeHis->GetEntries(); | |
1257 | Int_t chunk=nchunks*gRandom->Rndm(); | |
1258 | treeHis->SetBranchAddress("his1DROCN.",&his1DROCNC); | |
1259 | treeHis->SetBranchAddress("his1DROCSum.",&his1DROCSumC); | |
1260 | treeHis->SetBranchAddress("his2DRPhiROCN.",&his2DRPhiROCNC); | |
1261 | treeHis->SetBranchAddress("his2DRPhiROCSum.",&his2DRPhiROCSumC); | |
1262 | treeHis->SetBranchAddress("his2DRZROCN.",&his2DRZROCNC); | |
1263 | treeHis->SetBranchAddress("his2DRZROCSum.",&his2DRZROCSumC); | |
1264 | treeHis->SetBranchAddress("his3DROCN.",&his3DROCNC); | |
1265 | treeHis->SetBranchAddress("his3DROCSum.",&his3DROCSumC); | |
1266 | treeHis->SetBranchAddress("neventsAll",&neventsAllC); | |
1267 | treeHis->SetBranchAddress("eventsUsed",&neventsChunkC); | |
1268 | treeHis->GetEntry(chunk); | |
1269 | neventsAll+=neventsAllC; | |
1270 | neventsChunk+=neventsChunkC; | |
1271 | // | |
1272 | TH1 * histosC[8]={ his1DROCNC, his1DROCSumC, his2DRPhiROCNC, his2DRPhiROCSumC, his2DRZROCNC, his2DRZROCSumC, his3DROCNC, his3DROCSumC}; | |
1273 | if (ifile==0) for (Int_t ihis=0; ihis<8; ihis++) histos[ihis] = (TH1*)(histosC[ihis]->Clone()); | |
1274 | if (ifile>0) { | |
1275 | for (Int_t ihis=0; ihis<8; ihis++) histos[ihis]->Add(histosC[ihis]); | |
1276 | } | |
1277 | } | |
1278 | his1DROCN=(TH1D*)histos[0]; his1DROCSum=(TH1D*)histos[1]; | |
1279 | his2DRPhiROCN=(TH2D*)histos[2]; his2DRPhiROCSum=(TH2D*)histos[3]; his2DRZROCN=(TH2D*)histos[4]; his2DRZROCSum=(TH2D*)histos[5]; | |
1280 | his3DROCN=(TH3D*)histos[6]; his3DROCSum=(TH3D*)histos[7]; | |
1281 | // | |
1282 | // Select input histogram | |
1283 | // | |
1284 | TH3D * hisInput= his3DROCSum; | |
1285 | Int_t neventsCorr=0; // number of events used for the correction studies | |
1286 | if (nfilesMerge>0){ | |
1287 | neventsCorr=neventsChunk; | |
1288 | hisInput=his3DROCN; | |
1289 | }else{ | |
1290 | neventsCorr=neventsAll; | |
1291 | hisInput=his3DROCSum; | |
4b955de3 | 1292 | hisInput->Scale(Double_t(fullNorm)/Double_t(neventsAll)); |
7212f8c3 | 1293 | } |
1294 | ||
1295 | TObjArray *distortionArray = new TObjArray; | |
4b955de3 | 1296 | TObjArray *histoArray = new TObjArray; |
7212f8c3 | 1297 | // |
1298 | // Make a reference - ideal distortion/correction | |
1299 | // | |
1300 | TH3D * his3DReference = NormalizeHistoQ(hisInput,kFALSE); // q normalized to the Q/m^3 | |
1301 | his3DReference->Scale(scale*0.000001/fgke0); //scale back to the C/cm^3/epsilon0 | |
1302 | AliTPCSpaceCharge3D *spaceChargeRef = new AliTPCSpaceCharge3D; | |
4b955de3 | 1303 | spaceChargeRef->SetOmegaTauT1T2(omegaTau*bsign,1,1); // Ne CO2 |
7212f8c3 | 1304 | spaceChargeRef->SetInputSpaceCharge(his3DReference, his2DRPhiROCSum,his2DRPhiROCSum,1); |
1305 | spaceChargeRef->InitSpaceCharge3DPoisson(129, 129, 144,nitteration); | |
7212f8c3 | 1306 | spaceChargeRef->AddVisualCorrection(spaceChargeRef,1); |
1307 | spaceChargeRef->SetName("DistRef"); | |
4b955de3 | 1308 | his3DReference->SetName("hisDistRef"); |
7212f8c3 | 1309 | distortionArray->AddLast(spaceChargeRef); |
4b955de3 | 1310 | histoArray->AddLast(his3DReference); |
1311 | // | |
1312 | // Draw histos | |
1313 | TCanvas * canvasSC = new TCanvas("canvasSCDefault","canvasSCdefault",500,400); | |
1314 | canvasSC->SetRightMargin(0.12); | |
1315 | gStyle->SetTitleOffset(0.8,"z"); | |
1316 | canvasSC->SetRightMargin(0.13); | |
1317 | spaceChargeRef->CreateHistoDRPhiinXY(10,250,250)->Draw("colz"); | |
1318 | canvasSC->SaveAs(Form("canvasCreateHistoDRPhiinXY_Z10_%d_%d.pdf",nfilesMerge,sign)); | |
1319 | spaceChargeRef->CreateHistoDRinXY(10,250,250)->Draw("colz"); | |
1320 | canvasSC->SaveAs(Form("canvasCreateHistoDRinXY_Z10_%d_%d.pdf",nfilesMerge,sign)); | |
1321 | spaceChargeRef->CreateHistoSCinZR(0.05,250,250)->Draw("colz"); | |
1322 | canvasSC->SaveAs(Form("canvasCreateHistoSCinZR_Phi005_%d_%d.pdf",nfilesMerge,sign)); | |
1323 | spaceChargeRef->CreateHistoSCinXY(10.,250,250)->Draw("colz"); | |
1324 | canvasSC->SaveAs(Form("canvasCreateHistoSCinRPhi_Z10_%d_%d.pdf",nfilesMerge,sign)); | |
1325 | ||
1326 | ||
7212f8c3 | 1327 | // |
1328 | // Make Z scan corrections | |
1329 | // | |
511fd208 | 1330 | if (1){ |
4b955de3 | 1331 | for (Int_t ihis=1; ihis<=9; ihis+=2){ |
1332 | TH3 *his3DZ = PermutationHistoZ(his3DReference,16*(ihis)); | |
7212f8c3 | 1333 | AliTPCSpaceCharge3D *spaceChargeZ = new AliTPCSpaceCharge3D; |
4b955de3 | 1334 | spaceChargeZ->SetOmegaTauT1T2(omegaTau*bsign,1,1); // Ne CO2 |
7212f8c3 | 1335 | spaceChargeZ->SetInputSpaceCharge(his3DZ, his2DRPhiROCSum,his2DRPhiROCSum,1); |
1336 | spaceChargeZ->InitSpaceCharge3DPoisson(129, 129, 144,nitteration); | |
1337 | spaceChargeZ->CreateHistoDRPhiinXY(10,250,250)->Draw("colz"); | |
1338 | spaceChargeZ->AddVisualCorrection(spaceChargeZ,100+ihis); | |
4b955de3 | 1339 | spaceChargeZ->SetName(Form("DistZ_%d", 16*(ihis))); |
1340 | his3DZ->SetName(Form("HisDistZ_%d", 16*(ihis))); | |
7212f8c3 | 1341 | distortionArray->AddLast(spaceChargeZ); |
4b955de3 | 1342 | histoArray->AddLast(his3DZ); |
7212f8c3 | 1343 | } |
1344 | // | |
1345 | // Make Sector scan corrections | |
1346 | // | |
1347 | for (Int_t ihis=1; ihis<=9; ihis+=2){ | |
1348 | TH3 *his3DSector = PermutationHistoPhi(his3DReference,TMath::Pi()*(ihis)/9.); | |
1349 | AliTPCSpaceCharge3D *spaceChargeSector = new AliTPCSpaceCharge3D; | |
4b955de3 | 1350 | spaceChargeSector->SetOmegaTauT1T2(omegaTau*bsign,1,1); // Ne CO2 |
7212f8c3 | 1351 | spaceChargeSector->SetInputSpaceCharge(his3DSector, his2DRPhiROCSum,his2DRPhiROCSum,1); |
1352 | spaceChargeSector->InitSpaceCharge3DPoisson(129, 129, 144,nitteration); | |
1353 | spaceChargeSector->CreateHistoDRPhiinXY(10,250,250)->Draw("colz"); | |
1354 | spaceChargeSector->AddVisualCorrection(spaceChargeSector,200+ihis); | |
1355 | spaceChargeSector->SetName(Form("DistSector_%d", ihis)); | |
4b955de3 | 1356 | his3DSector->SetName(Form("DistSector_%d", ihis)); |
7212f8c3 | 1357 | distortionArray->AddLast(spaceChargeSector); |
4b955de3 | 1358 | histoArray->AddLast(his3DSector); |
1359 | } | |
7212f8c3 | 1360 | // |
4b955de3 | 1361 | // Make Local phi scan smear corrections |
1362 | // | |
1363 | for (Int_t ihis=1; ihis<=8; ihis++){ | |
1364 | TH3 *his3DSector = PermutationHistoLocalPhi(his3DReference,ihis); | |
1365 | AliTPCSpaceCharge3D *spaceChargeSector = new AliTPCSpaceCharge3D; | |
1366 | spaceChargeSector->SetOmegaTauT1T2(omegaTau*bsign,1,1); // Ne CO2 | |
1367 | spaceChargeSector->SetInputSpaceCharge(his3DSector, his2DRPhiROCSum,his2DRPhiROCSum,1); | |
1368 | spaceChargeSector->InitSpaceCharge3DPoisson(129, 129, 144,nitteration); | |
1369 | spaceChargeSector->CreateHistoDRPhiinXY(10,250,250)->Draw("colz"); | |
1370 | spaceChargeSector->AddVisualCorrection(spaceChargeSector,300+ihis); | |
1371 | spaceChargeSector->SetName(Form("DistPhi_%d", ihis)); | |
1372 | his3DSector->SetName(Form("HisDistPhi_%d", ihis)); | |
1373 | distortionArray->AddLast(spaceChargeSector); | |
1374 | histoArray->AddLast(his3DSector); | |
1375 | } | |
1376 | // // | |
1377 | // // Rebin Z | |
1378 | // // | |
1379 | // for (Int_t ihis=2; ihis<=8; ihis+=2){ | |
1380 | // TH3 *his3DSector = his3DReference->RebinZ(ihis,Form("RebinZ_%d",ihis)); | |
1381 | // AliTPCSpaceCharge3D *spaceChargeSector = new AliTPCSpaceCharge3D; | |
1382 | // spaceChargeSector->SetOmegaTauT1T2(omegaTau*bsign,1,1); // Ne CO2 | |
1383 | // spaceChargeSector->SetInputSpaceCharge(his3DSector, his2DRPhiROCSum,his2DRPhiROCSum,1); | |
1384 | // spaceChargeSector->InitSpaceCharge3DPoisson(129, 129, 144,nitteration); | |
1385 | // spaceChargeSector->CreateHistoDRPhiinXY(10,250,250)->Draw("colz"); | |
1386 | // spaceChargeSector->AddVisualCorrection(spaceChargeSector,300+ihis); | |
1387 | // spaceChargeSector->SetName(Form("RebinZ_%d", ihis)); | |
1388 | // his3DSector->SetName(Form("RebinZ_%d", ihis)); | |
1389 | // distortionArray->AddLast(spaceChargeSector); | |
1390 | // histoArray->AddLast(his3DSector); | |
1391 | // } | |
1392 | // // | |
1393 | // // Rebin Phi | |
1394 | // // | |
1395 | // for (Int_t ihis=2; ihis<=5; ihis++){ | |
1396 | // TH3 *his3DSector = his3DReference->RebinZ(ihis,Form("RebinPhi_%d",ihis)); | |
1397 | // AliTPCSpaceCharge3D *spaceChargeSector = new AliTPCSpaceCharge3D; | |
1398 | // spaceChargeSector->SetOmegaTauT1T2(omegaTau*bsign,1,1); // Ne CO2 | |
1399 | // spaceChargeSector->SetInputSpaceCharge(his3DSector, his2DRPhiROCSum,his2DRPhiROCSum,1); | |
1400 | // spaceChargeSector->InitSpaceCharge3DPoisson(129, 129, 144,nitteration); | |
1401 | // spaceChargeSector->CreateHistoDRPhiinXY(10,250,250)->Draw("colz"); | |
1402 | // spaceChargeSector->AddVisualCorrection(spaceChargeSector,300+ihis); | |
1403 | // spaceChargeSector->SetName(Form("RebinZ_%d", ihis)); | |
1404 | // his3DSector->SetName(Form("RebinZ_%d", ihis)); | |
1405 | // distortionArray->AddLast(spaceChargeSector); | |
1406 | // histoArray->AddLast(his3DSector); | |
1407 | // } | |
1408 | } | |
7212f8c3 | 1409 | // |
4b955de3 | 1410 | // Space points scan |
7212f8c3 | 1411 | // |
1412 | Int_t nx = his3DROCN->GetXaxis()->GetNbins(); | |
1413 | Int_t ny = his3DROCN->GetYaxis()->GetNbins(); | |
1414 | Int_t nz = his3DROCN->GetZaxis()->GetNbins(); | |
1415 | Int_t nbins=nx*ny*nz; | |
1416 | TVectorF vx(nbins), vy(nbins), vz(nbins), vq(nbins), vqall(nbins); | |
1417 | // | |
1418 | // charge in the ROC | |
1419 | // for open gate data only fraction of ions enter to drift volume | |
1420 | // | |
1421 | const Int_t kbins=1000; | |
4b955de3 | 1422 | Double_t deltaR[kbins], deltaZ[kbins],deltaRPhi[kbins], deltaQ[kbins]; |
7212f8c3 | 1423 | Int_t ndist = distortionArray->GetEntries(); |
1424 | for (Int_t ix=1; ix<=nx; ix+=2){ // phi bin loop | |
1425 | for (Int_t iy=1; iy<=ny; iy+=2){ // r bin loop | |
1426 | Double_t phi= his3DROCN->GetXaxis()->GetBinCenter(ix); | |
1427 | Double_t r = his3DROCN->GetYaxis()->GetBinCenter(iy); | |
1428 | Double_t x = r*TMath::Cos(phi); | |
1429 | Double_t y = r*TMath::Sin(phi); | |
1430 | // | |
1431 | for (Int_t iz=1; iz<=nz; iz++){ // z bin loop | |
1432 | Double_t z = his3DROCN->GetZaxis()->GetBinCenter(iz); | |
1433 | Double_t qN= his3DROCN->GetBinContent(ix,iy,iz); | |
1434 | Double_t qSum= his3DROCSum->GetBinContent(ix,iy,iz); | |
1435 | // Double_t dV in cm = dphi * r * dz in cm**3 | |
1436 | Double_t dV= (his3DROCN->GetXaxis()->GetBinWidth(ix)*r)*his3DROCN->GetZaxis()->GetBinWidth(iz); | |
1437 | Double_t norm= 1e6*ePerADC*TMath::Qe()/dV; //normalization factor to the Q/m^3 inside of the ROC; | |
1438 | (*pcstream)<<"hisDump"<< | |
1439 | "neventsAll="<<neventsAll<< // total number of events used for the Q reference | |
1440 | "nfiles="<<nfiles<< // number of files to define properties | |
1441 | "nfilesMerge="<<nfilesMerge<< // number of files to define propertiesneventsCorr | |
1442 | "neventsCorr="<<neventsCorr<< // number of events used to define the corection | |
4b955de3 | 1443 | "fullNorm="<<fullNorm<< // in case full statistic used this is the normalization coeficient |
7212f8c3 | 1444 | |
1445 | "ix="<<ix<< | |
1446 | "iy="<<iy<< | |
1447 | "iz="<<iz<< | |
1448 | // x,y,z | |
1449 | "x="<<x<< | |
1450 | "y="<<y<< | |
1451 | "z="<<z<< | |
1452 | // phi,r,z | |
1453 | "phi="<<phi<< | |
1454 | "r="<<r<< | |
1455 | "z="<<z<< | |
1456 | "norm="<<norm<< | |
1457 | "qN="<<qN<< | |
1458 | "qSum="<<qSum; | |
1459 | for (Int_t idist=0; idist<ndist; idist++){ | |
1460 | AliTPCCorrection * corr = (AliTPCCorrection *)distortionArray->At(idist); | |
4b955de3 | 1461 | TH3 * his = (TH3*)histoArray->At(idist); |
7212f8c3 | 1462 | Double_t phi0= TMath::ATan2(y,x); |
1463 | Int_t nsector=(z>=0) ? 0:18; | |
1464 | Float_t distPoint[3]={x,y,z}; | |
1465 | corr->CorrectPoint(distPoint, nsector); | |
1466 | Double_t r0=TMath::Sqrt(x*x+y*y); | |
1467 | Double_t r1=TMath::Sqrt(distPoint[0]*distPoint[0]+distPoint[1]*distPoint[1]); | |
1468 | Double_t phi1=TMath::ATan2(distPoint[1],distPoint[0]); | |
1469 | deltaR[idist] = r1-r0; | |
1470 | deltaRPhi[idist] = (phi1-phi0)*r0; | |
1471 | deltaZ[idist] = distPoint[2]-z; | |
4b955de3 | 1472 | deltaQ[idist] = his->GetBinContent(ix,iy,iz); |
7212f8c3 | 1473 | // |
1474 | (*pcstream)<<"hisDump"<< //correct point - input point | |
4b955de3 | 1475 | Form("%sQ=",corr->GetName())<<deltaQ[idist]<< |
7212f8c3 | 1476 | Form("%sDR=",corr->GetName())<<deltaR[idist]<< |
1477 | Form("%sDRPhi=",corr->GetName())<<deltaRPhi[idist]<< | |
1478 | Form("%sDZ=",corr->GetName())<<deltaZ[idist]; | |
1479 | } | |
1480 | (*pcstream)<<"hisDump"<< | |
1481 | "\n"; | |
1482 | } | |
1483 | } | |
1484 | } | |
5a998ace | 1485 | pcstream->GetFile()->cd(); |
1486 | for (Int_t idist=0; idist<ndist; idist++){ | |
1487 | AliTPCCorrection * corr = (AliTPCCorrection *)distortionArray->At(idist); | |
1488 | corr->Write(corr->GetName()); | |
1489 | } | |
7212f8c3 | 1490 | delete pcstream; |
4b955de3 | 1491 | // |
1492 | // generate track distortions | |
1493 | // | |
633a08cb | 1494 | const Double_t xITSlayer[7]={2.2, 2.8 ,3.6 , 20, 22,41,43 }; // ITS layers R poition (http://arxiv.org/pdf/1304.1306v3.pdf) |
1495 | const Double_t resITSlayer[7]={0.0004, 0.0004 ,0.0004 , 0.0004, 0.0004, 0.0004, 0.0004 }; // ITS layers R poition (http://arxiv.org/pdf/1304.1306v3.pdf - pixel scenario) | |
1496 | const Double_t kMaxSnp = 0.85; | |
1497 | const Double_t kMass = TDatabasePDG::Instance()->GetParticle("pi+")->Mass(); | |
4b955de3 | 1498 | if (nTracks>0){ |
1499 | for(Int_t nt=1; nt<=nTracks; nt++){ | |
1500 | gRandom->SetSeed(nt); | |
1501 | TObjArray trackArray(10000); | |
1502 | Double_t phi = gRandom->Uniform(0.0, 2*TMath::Pi()); | |
1503 | Double_t eta = gRandom->Uniform(-1, 1); | |
1504 | Double_t pt = 1/(gRandom->Rndm()*5+0.00001); // momentum for f1 | |
1505 | Short_t psign=1; | |
1506 | if(gRandom->Rndm() < 0.5){ | |
1507 | psign =1; | |
1508 | }else{ | |
1509 | psign=-1; | |
1510 | } | |
1511 | Double_t theta = 2*TMath::ATan(TMath::Exp(-eta))-TMath::Pi()/2.; | |
1512 | Double_t pxyz[3]; | |
1513 | pxyz[0]=pt*TMath::Cos(phi); | |
1514 | pxyz[1]=pt*TMath::Sin(phi); | |
1515 | pxyz[2]=pt*TMath::Tan(theta); | |
1516 | Double_t vertex[3]={0,0,0}; | |
1517 | Double_t cv[21]={0}; | |
1518 | AliExternalTrackParam *t= new AliExternalTrackParam(vertex, pxyz, cv, psign); | |
1519 | Double_t refX0=85.; | |
1520 | Double_t refX1=1.; | |
1521 | Int_t dir=-1; | |
1522 | (*pcstreamTrack)<<"trackFit"<< | |
5e4083cf | 1523 | "bsign="<<bsign<< |
4b955de3 | 1524 | "neventsAll="<<neventsAll<< // total number of events used for the Q reference |
1525 | "nfiles="<<nfiles<< // number of files to define properties | |
1526 | "nfilesMerge="<<nfilesMerge<< // number of files to define propertiesneventsCorr | |
1527 | "neventsCorr="<<neventsCorr<< // number of events used to define the corection | |
1528 | "fullNorm="<<fullNorm<< // in case full statistic used this is the normalization coeficient | |
633a08cb | 1529 | "itrack="<<nt<< // |
1530 | "input.="<<t; // | |
5e4083cf | 1531 | |
1532 | Bool_t isOK0=kTRUE; | |
1533 | Bool_t isOK1=kTRUE; | |
1534 | Bool_t itsOK=kTRUE; | |
1535 | Bool_t itsUpdateOK=kTRUE; | |
1536 | ||
4b955de3 | 1537 | for (Int_t idist=0; idist<ndist; idist++){ |
1538 | AliTPCCorrection * corr = (AliTPCCorrection *)distortionArray->At(idist); | |
633a08cb | 1539 | // 0. TPC only information at the entrance |
1540 | // 1. TPC only information close to vertex ( refX=1 cm) | |
1541 | // 2. TPC constrained information close to the primary vertex | |
1542 | // 3. TPC +ITS | |
4b955de3 | 1543 | AliExternalTrackParam *ot0= new AliExternalTrackParam(vertex, pxyz, cv, psign); |
1544 | AliExternalTrackParam *ot1= new AliExternalTrackParam(vertex, pxyz, cv, psign); | |
1545 | AliExternalTrackParam *td0 = corr->FitDistortedTrack(*ot0, refX0, dir, 0); | |
1546 | AliExternalTrackParam *td1 = corr->FitDistortedTrack(*ot1, refX1, dir, 0); | |
f0085660 | 1547 | if (td0==0) { // if fit fail use dummy values |
1548 | ot0= new AliExternalTrackParam(vertex, pxyz, cv, psign); | |
1549 | td0= new AliExternalTrackParam(vertex, pxyz, cv, psign); | |
5e4083cf | 1550 | printf("Propagation0 failed: track\t%d\tdistortion\t%d\n",nt,idist); |
1551 | isOK0=kFALSE; | |
f0085660 | 1552 | } |
1553 | if (td1==0) { | |
1554 | ot1= new AliExternalTrackParam(vertex, pxyz, cv, psign); | |
1555 | td1= new AliExternalTrackParam(vertex, pxyz, cv, psign); | |
5e4083cf | 1556 | printf("Propagation1 failed: track\t%d\tdistortion\t%d\n",nt,idist); |
1557 | isOK1=kFALSE; | |
f0085660 | 1558 | } |
5e4083cf | 1559 | // 2. TPC constrained emulation |
633a08cb | 1560 | AliExternalTrackParam *tdConstrained = new AliExternalTrackParam(*td1); |
1561 | tdConstrained->Rotate(ot1->GetAlpha()); | |
1562 | tdConstrained->PropagateTo(ot1->GetX(), AliTrackerBase::GetBz()); | |
1563 | Double_t pointPos[2]={ot1->GetY(),ot1->GetZ()}; // local y and local z of point | |
1564 | Double_t pointCov[3]={0.0001,0,0.0001}; // | |
1565 | tdConstrained->Update(pointPos,pointCov); | |
1566 | // 3. TPC+ITS constrained umulation | |
1567 | AliExternalTrackParam *tdITS = new AliExternalTrackParam(*td0); | |
1568 | AliExternalTrackParam *tdITSOrig = new AliExternalTrackParam(*ot0); | |
633a08cb | 1569 | // |
5e4083cf | 1570 | if ( isOK0 && isOK1 ) { |
1571 | for (Int_t ilayer=6; ilayer>=0; ilayer--){ | |
1572 | if (!AliTrackerBase::PropagateTrackTo(tdITSOrig,xITSlayer[ilayer],kMass,5.,kTRUE,kMaxSnp)) itsOK=kFALSE; | |
1573 | if (!AliTrackerBase::PropagateTrackTo(tdITS,xITSlayer[ilayer],kMass,5.,kTRUE,kMaxSnp)) { | |
1574 | itsOK=kFALSE; | |
1575 | printf("PropagationITS failed: track\t%d\tdistortion\t%d\t%d\n",nt,idist,ilayer); | |
1576 | } | |
1577 | // | |
1578 | tdITS->Rotate(tdITSOrig->GetAlpha()); | |
1579 | if (tdITS->PropagateTo(tdITSOrig->GetX(), AliTrackerBase::GetBz())){ | |
1580 | Double_t itspointPos[2]={tdITSOrig->GetY(),tdITSOrig->GetZ()}; // local y and local z of point | |
1581 | Double_t itspointCov[3]={resITSlayer[ilayer]*resITSlayer[ilayer],0,resITSlayer[ilayer]*resITSlayer[ilayer]}; | |
1582 | if (!tdITS->Update(itspointPos,itspointCov)){ | |
1583 | itsUpdateOK=kFALSE; | |
1584 | } | |
1585 | } | |
1586 | } | |
1587 | }else{ | |
1588 | itsOK=kFALSE; | |
633a08cb | 1589 | } |
1590 | // | |
4b955de3 | 1591 | trackArray.AddLast(td0); |
1592 | trackArray.AddLast(td1); | |
633a08cb | 1593 | trackArray.AddLast(tdConstrained); |
1594 | trackArray.AddLast(tdITS); | |
1595 | trackArray.AddLast(tdITSOrig); | |
1596 | // | |
4b955de3 | 1597 | trackArray.AddLast(ot0); |
1598 | trackArray.AddLast(ot1); | |
633a08cb | 1599 | char name0[100], name1[1000], nameITS[1000]; |
1600 | char oname0[100], oname1[1000], onameConstrained[1000], onameITS[1000]; | |
4b955de3 | 1601 | snprintf(name0, 100, "T_%s_0.=",corr->GetName()); |
1602 | snprintf(name1, 100, "T_%s_1.=",corr->GetName()); | |
1603 | snprintf(oname0, 100, "OT_%s_0.=",corr->GetName()); | |
f0085660 | 1604 | snprintf(oname1, 100, "OT_%s_1.=",corr->GetName()); |
633a08cb | 1605 | snprintf(onameConstrained, 100, "OConst_%s_1.=",corr->GetName()); |
1606 | // | |
1607 | snprintf(nameITS, 100, "TPCITS_%s_1.=",corr->GetName()); | |
1608 | snprintf(onameITS, 100, "OTPCITS_%s_1.=",corr->GetName()); | |
4b955de3 | 1609 | (*pcstreamTrack)<<"trackFit"<< |
633a08cb | 1610 | name0<<td0<< // distorted TPC track only at the refX=85 |
1611 | name1<<td1<< // distorted TPC track only at the refX=1 | |
1612 | onameConstrained<<tdConstrained<< // distorted TPC constrained track only at the refX=1 | |
1613 | // | |
1614 | onameITS<<tdITSOrig<< // original TPC+ITS track | |
1615 | nameITS<<tdITS<< // distorted TPC+ (indistrted)ITS track fit | |
1616 | // | |
1617 | oname0<<ot0<< // original track at the entrance refX=85 | |
1618 | oname1<<ot1; // original track at the refX=1 cm (to be used for TPC only and also for the constrained | |
1619 | ||
4b955de3 | 1620 | } |
5e4083cf | 1621 | (*pcstreamTrack)<<"trackFit"<< |
1622 | "isOK0="<<isOK0<< // propagation good at the inner field cage | |
1623 | "isOK1="<<isOK1<< // god at 1 cm (close to vertex) | |
1624 | "itsOK="<<itsOK<< // | |
1625 | "itsUpdateOK="<<itsOK<< // | |
1626 | "\n"; | |
4b955de3 | 1627 | } |
1628 | } | |
1629 | delete pcstreamTrack; | |
7212f8c3 | 1630 | return; |
1631 | ||
1632 | } | |
1633 | ||
1634 | ||
1635 | void MakePlotPoisson3D(const char *inputfile="fluctuation.root", const char *outputfile="SpaceCharge.root", Int_t event=0){ | |
4e715689 | 1636 | // |
7212f8c3 | 1637 | // draw "standard" plot to show radial and theta dependence of the space charge distortion |
4e715689 | 1638 | // |
7212f8c3 | 1639 | // const char *inputfile="fluctuation.root"; const char *outputfile="SpaceCharge.root"; Int_t event=0 |
4e715689 | 1640 | // |
1641 | TFile *fhistos = TFile::Open(inputfile); | |
7212f8c3 | 1642 | TH2D *his2DRPhiROCN=0, *his2DRPhiROCSum=0, *his2DRZROCN=0, *his2DRZROCSum=0; |
1643 | TH1D *his1DROCN=0, *his1DROCSum=0; | |
1644 | TH3D *his3DROCN=0, *his3DROCSum=0; | |
1645 | const Double_t ePerADC = 500.; | |
1646 | const Double_t fgke0 = 8.854187817e-12; | |
4e715689 | 1647 | TTree * treeHis = (TTree*)fhistos->Get("fluctuation"); |
7212f8c3 | 1648 | treeHis->SetBranchAddress("his1DROCN.",&his1DROCN); |
1649 | treeHis->SetBranchAddress("his1DROCSum.",&his1DROCSum); | |
1650 | treeHis->SetBranchAddress("his2DRPhiROCN.",&his2DRPhiROCN); | |
1651 | treeHis->SetBranchAddress("his2DRPhiROCSum.",&his2DRPhiROCSum); | |
4e715689 | 1652 | treeHis->SetBranchAddress("his2DRZROCN.",&his2DRZROCN); |
1653 | treeHis->SetBranchAddress("his2DRZROCSum.",&his2DRZROCSum); | |
7212f8c3 | 1654 | treeHis->SetBranchAddress("his3DROCN.",&his3DROCN); |
1655 | treeHis->SetBranchAddress("his3DROCSum.",&his3DROCSum); | |
4e715689 | 1656 | treeHis->GetEntry(event); |
7212f8c3 | 1657 | |
1658 | his3DROCSum->Scale(ePerADC*TMath::Qe()/fgke0); | |
1659 | ||
1660 | AliTPCSpaceCharge3D *spaceChargeOrig = new AliTPCSpaceCharge3D; | |
1661 | spaceChargeOrig->SetOmegaTauT1T2(0.0,1,1); // Ne CO2 | |
1662 | spaceChargeOrig->SetInputSpaceCharge(his3DROCSum, his2DRPhiROCSum,his2DRPhiROCSum,10*ePerADC*TMath::Qe()); | |
1663 | spaceChargeOrig->InitSpaceCharge3DPoisson(129, 129, 144,100); | |
1664 | spaceChargeOrig->CreateHistoDRPhiinXY(10,250,250)->Draw("colz"); | |
1665 | spaceChargeOrig->AddVisualCorrection(spaceChargeOrig,1); | |
4e715689 | 1666 | // |
4b955de3 | 1667 | //AliTPCSpaceCharge3D *spaceChargeRef= spaceChargeOrig; |
1668 | ||
1669 | ||
7212f8c3 | 1670 | |
4e715689 | 1671 | // |
7212f8c3 | 1672 | Int_t nfuns=5; |
1673 | Double_t dmax=0.75, dmin=-0.75; | |
1674 | Double_t phiRange=18; | |
1675 | TCanvas *canvasDistortionP3D = new TCanvas("canvasdistortionP3D","canvasdistortionP3D",1000,700); | |
1676 | canvasDistortionP3D->SetGrid(1,1); | |
1677 | canvasDistortionP3D->Divide(1,2); | |
1678 | canvasDistortionP3D->cd(1)->SetGrid(1,1); | |
1679 | TLegend * legendR= new TLegend(0.11,0.11,0.45,0.35,"R scan (#Theta=0.1)"); | |
1680 | for (Int_t ifun1=0; ifun1<=nfuns; ifun1++){ | |
1681 | Double_t rfun= 85.+ifun1*(245.-85.)/nfuns; | |
1682 | TF1 *pf1 = new TF1("f1",Form("AliTPCCorrection::GetCorrSector(x,%f,0.1,1,1)",rfun),0,phiRange); | |
1683 | pf1->SetMinimum(dmin); | |
1684 | pf1->SetMaximum(dmax); | |
1685 | pf1->SetNpx(360); | |
1686 | pf1->SetLineColor(1+ifun1); | |
1687 | pf1->SetLineWidth(2); | |
1688 | pf1->GetXaxis()->SetTitle("sector"); | |
1689 | pf1->GetXaxis()->SetNdivisions(530); | |
1690 | pf1->GetYaxis()->SetTitle("#Delta_{r#phi} (cm)"); | |
1691 | if (ifun1==0) pf1->Draw(); | |
1692 | pf1->Draw("same"); | |
1693 | legendR->AddEntry(pf1,Form("r=%1.0f",rfun)); | |
1694 | } | |
1695 | legendR->Draw(); | |
4e715689 | 1696 | // |
7212f8c3 | 1697 | canvasDistortionP3D->cd(2)->SetGrid(1,1); |
1698 | TLegend * legendTheta= new TLegend(0.11,0.11,0.45,0.35,"#Theta scan (r=125 cm)"); | |
1699 | for (Int_t ifun1=0; ifun1<=nfuns; ifun1++){ | |
1700 | Double_t tfun= 0.1+ifun1*(0.8)/nfuns; | |
1701 | TF1 *pf1 = new TF1("f1",Form("AliTPCCorrection::GetCorrSector(x,125,%f,1,1)",tfun),0,phiRange); | |
1702 | pf1->SetMinimum(dmin); | |
1703 | pf1->SetMaximum(dmax); | |
1704 | pf1->SetNpx(360); | |
1705 | pf1->SetLineColor(1+ifun1); | |
1706 | pf1->SetLineWidth(2); | |
1707 | pf1->GetXaxis()->SetTitle("sector"); | |
1708 | pf1->GetYaxis()->SetTitle("#Delta_{r#phi} (cm)"); | |
1709 | pf1->GetXaxis()->SetNdivisions(530); | |
1710 | if (ifun1==0) pf1->Draw(); | |
1711 | pf1->Draw("same"); | |
1712 | legendTheta->AddEntry(pf1,Form("#Theta=%1.2f",tfun)); | |
1713 | } | |
1714 | legendTheta->Draw(); | |
4e715689 | 1715 | |
7212f8c3 | 1716 | } |
1717 | ||
1718 | TH3D * NormalizeHistoQ(TH3D * hisInput, Bool_t normEpsilon){ | |
1719 | // | |
1720 | // Renormalize the histogram to the Q/m^3 | |
1721 | // Input: | |
1722 | // hisInput - input 3D histogram | |
1723 | // normEpsilon - flag - normalize to epsilon0 | |
1724 | // | |
1725 | const Double_t ePerADC = 500.; | |
1726 | const Double_t fgkEpsilon0 = 8.854187817e-12; | |
1727 | TH3D * hisOutput= new TH3D(*hisInput); | |
1728 | Int_t nx = hisInput->GetXaxis()->GetNbins(); | |
1729 | Int_t ny = hisInput->GetYaxis()->GetNbins(); | |
1730 | Int_t nz = hisInput->GetZaxis()->GetNbins(); | |
1731 | for (Int_t ix=1; ix<=nx; ix++){ | |
1732 | for (Int_t iy=1; iy<=ny; iy++){ | |
1733 | for (Int_t iz=1; iz<=nz; iz++){ | |
1734 | // Double_t z = hisInput->GetZaxis()->GetBinCenter(iz); | |
1735 | Double_t deltaRPhi = hisInput->GetXaxis()->GetBinWidth(ix)* hisInput->GetYaxis()->GetBinCenter(iy); | |
1736 | Double_t deltaR= hisInput->GetYaxis()->GetBinWidth(iy); | |
1737 | Double_t deltaZ= hisInput->GetYaxis()->GetBinWidth(iz); | |
1738 | Double_t volume= (deltaRPhi*deltaR*deltaZ)/1000000.; | |
1739 | Double_t q = hisInput->GetBinContent(ix,iy,iz)* ePerADC*TMath::Qe(); // Q in coulombs | |
1740 | Double_t rho = q/volume; // rpho - density in Q/m^3 | |
1741 | if (normEpsilon) rho/=fgkEpsilon0; | |
1742 | hisOutput->SetBinContent(ix,iy,iz,rho); | |
4e715689 | 1743 | } |
1744 | } | |
1745 | } | |
7212f8c3 | 1746 | return hisOutput; |
1747 | } | |
1748 | ||
1749 | ||
1750 | ||
1751 | TH3D * PermutationHistoZ(TH3D * hisInput, Double_t deltaZ){ | |
1752 | // | |
1753 | // Used to estimate the effect of the imperfection of the lookup tables as function of update frequency | |
4e715689 | 1754 | // |
7212f8c3 | 1755 | // Permute/rotate the conten of the histogram in z direction |
1756 | // Reshufle/shift content - Keeping the integral the same | |
1757 | // Parameters: | |
1758 | // hisInput - input 3D histogram (phi,r,z) | |
1759 | // deltaZ - deltaZ -shift of the space charge | |
1760 | Double_t zmax=250; | |
1761 | TH3D * hisOutput= new TH3D(*hisInput); | |
1762 | Int_t nx = hisInput->GetXaxis()->GetNbins(); | |
1763 | Int_t ny = hisInput->GetYaxis()->GetNbins(); | |
1764 | Int_t nz = hisInput->GetZaxis()->GetNbins(); | |
4e715689 | 1765 | // |
7212f8c3 | 1766 | // |
1767 | for (Int_t ix=1; ix<=nx; ix++){ | |
1768 | for (Int_t iy=1; iy<=ny; iy++){ | |
1769 | for (Int_t iz=1; iz<=nz; iz++){ | |
1770 | Double_t zold = hisInput->GetZaxis()->GetBinCenter(iz); | |
1771 | Double_t z=zold; | |
1772 | if (z>0){ | |
1773 | z+=deltaZ; | |
1774 | if (z<0) z+=zmax; | |
1775 | if (z>zmax) z-=zmax; | |
1776 | }else{ | |
1777 | z-=deltaZ; | |
1778 | if (z>0) z-=zmax; | |
1779 | if (z<-zmax) z+=zmax; } | |
1780 | Double_t kz= hisInput->GetZaxis()->FindBin(z); | |
1781 | Double_t content = hisInput->GetBinContent(ix,iy,iz); | |
1782 | hisOutput->SetBinContent(ix,iy,kz,content); | |
4e715689 | 1783 | } |
1784 | } | |
1785 | } | |
7212f8c3 | 1786 | return hisOutput; |
1787 | } | |
1788 | ||
4b955de3 | 1789 | |
1790 | ||
1791 | ||
7212f8c3 | 1792 | TH3D * PermutationHistoPhi(TH3D * hisInput, Double_t deltaPhi){ |
1793 | // | |
1794 | // Used to estimate the effect of the imperfection of the lookup tables as function of update frequency | |
1795 | // | |
1796 | // Permute/rotate the conten of the histogram in phi | |
1797 | // Reshufle/shift content - Keeping the integral the same | |
1798 | // Parameters: | |
1799 | // hisInput - input 3D histogram (phi,r,z) | |
1800 | // deltaPhi - deltaPhi -shift of the space charge | |
1801 | TH3D * hisOutput= new TH3D(*hisInput); | |
1802 | Int_t nx = hisInput->GetXaxis()->GetNbins(); | |
1803 | Int_t ny = hisInput->GetYaxis()->GetNbins(); | |
1804 | Int_t nz = hisInput->GetZaxis()->GetNbins(); | |
4e715689 | 1805 | // |
4e715689 | 1806 | // |
7212f8c3 | 1807 | for (Int_t iy=1; iy<=ny; iy++){ |
1808 | for (Int_t iz=1; iz<=nz; iz++){ | |
1809 | for (Int_t ix=1; ix<=nx; ix++){ | |
1810 | Double_t phiOld = hisInput->GetXaxis()->GetBinCenter(ix); | |
1811 | Double_t phi=phiOld; | |
1812 | phi+=deltaPhi; | |
1813 | if (phi<0) phi+=TMath::TwoPi(); | |
1814 | if (phi>TMath::TwoPi()) phi-=TMath::TwoPi(); | |
1815 | Double_t kx= hisInput->GetXaxis()->FindBin(phi); | |
1816 | Double_t content = hisInput->GetBinContent(ix,iy,iz); | |
1817 | hisOutput->SetBinContent(kx,iy,iz,content); | |
1818 | } | |
4e715689 | 1819 | } |
1820 | } | |
7212f8c3 | 1821 | return hisOutput; |
1822 | } | |
4e715689 | 1823 | |
7212f8c3 | 1824 | |
4b955de3 | 1825 | TH3D * PermutationHistoLocalPhi(TH3D * hisInput, Int_t deltaPhi){ |
7212f8c3 | 1826 | // |
1827 | // Used to estimate the effect of the imperfection of the lookup tables as function of update frequency | |
4b955de3 | 1828 | // Use moving average of the content instead of the content |
7212f8c3 | 1829 | // |
7212f8c3 | 1830 | // Parameters: |
1831 | // hisInput - input 3D histogram (phi,r,z) | |
4b955de3 | 1832 | // deltaPhi - moving average width |
7212f8c3 | 1833 | TH3D * hisOutput= new TH3D(*hisInput); |
1834 | Int_t nx = hisInput->GetXaxis()->GetNbins(); | |
1835 | Int_t ny = hisInput->GetYaxis()->GetNbins(); | |
1836 | Int_t nz = hisInput->GetZaxis()->GetNbins(); | |
4b955de3 | 1837 | Int_t binSector=nx/18; |
7212f8c3 | 1838 | // |
1839 | // | |
1840 | for (Int_t iy=1; iy<=ny; iy++){ | |
1841 | for (Int_t iz=1; iz<=nz; iz++){ | |
1842 | for (Int_t ix=1; ix<=nx; ix++){ | |
4b955de3 | 1843 | Double_t sumRo=0,sumW=0; |
1844 | for (Int_t idx=-deltaPhi; idx<=deltaPhi; idx++){ | |
1845 | Int_t index=ix+idx; | |
1846 | if (index<1) index+=nx+1; // underflow and overflow bins | |
1847 | if (index>nx) index-=nx+1; | |
1848 | Double_t content = hisInput->GetBinContent(index,iy,iz); | |
1849 | sumRo+=content; | |
1850 | sumW++; | |
1851 | } | |
1852 | Double_t meanCont= sumRo/sumW; | |
1853 | hisOutput->SetBinContent(ix,iy,iz,meanCont); | |
1854 | //printf("%d\t%f\n",ix,hisInput->GetBinContent(ix,iy,iz)/(hisInput->GetBinContent(ix,iy,iz)+meanCont)); | |
1855 | } | |
7212f8c3 | 1856 | } |
1857 | } | |
1858 | return hisOutput; | |
4e715689 | 1859 | } |
1860 | ||
1861 | ||
4e715689 | 1862 | |
7212f8c3 | 1863 | void ScanIterrationPrecision(TH3 * hisInput, Int_t offset){ |
1864 | // | |
1865 | // | |
1866 | // | |
1867 | for (Int_t iter=0; iter<=7; iter++){ | |
1868 | Int_t niter= 50.*TMath::Power(1.5,iter); | |
1869 | AliTPCSpaceCharge3D *spaceChargeOrig = new AliTPCSpaceCharge3D; | |
1870 | spaceChargeOrig->SetOmegaTauT1T2(0.0,1,1); // Ne CO2 | |
1871 | spaceChargeOrig->SetInputSpaceCharge(hisInput,0,0,1); | |
1872 | spaceChargeOrig->InitSpaceCharge3DPoisson(129, 129, 144,niter); | |
1873 | spaceChargeOrig->CreateHistoDRPhiinXY(10,250,250)->Draw("colz"); | |
1874 | spaceChargeOrig->AddVisualCorrection(spaceChargeOrig,offset+iter+1); | |
1875 | } | |
1876 | } | |
1877 | ||
1878 | ||
1879 | void DrawFluctuationSector(Int_t stat, Double_t norm){ | |
4e715689 | 1880 | // |
7212f8c3 | 1881 | // Draw correction - correction at rotated sector |
1882 | // The same set of events used | |
1883 | // Int_t stat=0; Double_t norm=10000; | |
4b955de3 | 1884 | // |
1885 | // Notes: | |
1886 | // 1. (something wrong for the setup 2 pileups -problem with data 24.07 | |
1887 | // | |
1888 | // | |
7212f8c3 | 1889 | TFile *f0= TFile::Open(Form("SpaceChargeFluc%d.root",stat)); |
1890 | TTree * tree0 = (TTree*)f0->Get("hisDump"); | |
1891 | tree0->SetCacheSize(1000000000); | |
1892 | tree0->SetMarkerStyle(25); | |
1893 | TObjArray * fitArray=new TObjArray(3); | |
1894 | tree0->SetAlias("scNorm",Form("%f/neventsCorr",norm)); | |
4e715689 | 1895 | // |
7212f8c3 | 1896 | // Sector Scan |
1897 | // | |
1898 | TH2 * hisSectorScan[5]={0}; | |
1899 | TH1 * hisSectorScanSigma[5]={0}; | |
1900 | for (Int_t ihis=0; ihis<5; ihis++){ | |
1901 | tree0->Draw(Form("(DistRefDR-DistSector_%dDR)*scNorm:r>>hisSec%d(50,84,245,100,-1,1)",ihis*2+1,ihis*2+1),"abs(z)<90","colzgoff"); | |
1902 | hisSectorScan[ihis]=(TH2*)tree0->GetHistogram(); | |
1903 | hisSectorScan[ihis]->FitSlicesY(0,0,-1,0,"QNR",fitArray); | |
1904 | hisSectorScanSigma[ihis]=(TH1*)(fitArray->At(2)->Clone()); | |
1905 | hisSectorScanSigma[ihis]->SetMinimum(0); | |
1906 | hisSectorScanSigma[ihis]->SetMaximum(0.2); | |
1907 | } | |
1908 | gStyle->SetOptStat(0); | |
1909 | gStyle->SetOptTitle(1); | |
1910 | TCanvas * canvasFlucSectorScan=new TCanvas("canvasFlucSectorScan","canvasFlucSectorScan",750,700); | |
1911 | canvasFlucSectorScan->Divide(2,2,0,0); | |
1912 | gStyle->SetPadBorderMode(0); | |
1913 | for (Int_t ihis=0; ihis<4; ihis++){ | |
1914 | canvasFlucSectorScan->cd(ihis+1)->SetLogz(1); | |
1915 | hisSectorScan[ihis]->GetXaxis()->SetTitle("r (cm)"); | |
1916 | hisSectorScan[ihis]->GetYaxis()->SetTitle("#Delta_{R} (cm)"); | |
1917 | hisSectorScan[ihis]->Draw("colz"); | |
1918 | TLegend * legendSec=new TLegend(0.5,0.7,0.89,0.89); | |
1919 | legendSec->AddEntry(hisSectorScan[ihis],Form("Sector #Delta %d",(ihis*2+1))); | |
1920 | legendSec->Draw(); | |
1921 | } | |
1922 | canvasFlucSectorScan->SaveAs("canvasFlucSectorScan.pdf"); | |
1923 | canvasFlucSectorScan->SaveAs("canvasFlucSectorScan.png"); | |
4e715689 | 1924 | // |
7212f8c3 | 1925 | gStyle->SetOptTitle(0); |
1926 | TCanvas * canvasFlucSectorScanFit=new TCanvas("canvasFlucSectorScanFit","canvasFlucSectorScanFit",750,550); | |
1927 | TLegend * legendSector = new TLegend(0.50,0.55,0.89,0.89,"Space charge: corr(sec)-corr(sec-#Delta_{sec})"); | |
1928 | for (Int_t ihis=0; ihis<5; ihis++){ | |
1929 | hisSectorScanSigma[ihis]->GetXaxis()->SetTitle("r (cm)"); | |
1930 | hisSectorScanSigma[ihis]->GetYaxis()->SetTitle("#sigma(#Delta_{R}) (cm)"); | |
1931 | hisSectorScanSigma[ihis]->SetMarkerStyle(21+ihis%5); | |
1932 | hisSectorScanSigma[ihis]->SetMarkerColor(1+ihis%4); | |
1933 | if (ihis==0) hisSectorScanSigma[ihis]->Draw(""); | |
1934 | hisSectorScanSigma[ihis]->Draw("same"); | |
1935 | legendSector->AddEntry(hisSectorScanSigma[ihis],Form("#Delta %d",(ihis*2+1))); | |
1936 | } | |
1937 | legendSector->Draw(); | |
1938 | canvasFlucSectorScanFit->SaveAs("canvasFlucSectorScanFit.pdf"); | |
1939 | canvasFlucSectorScanFit->SaveAs("canvasFlucSectorScanFit.png"); | |
1940 | } | |
4e715689 | 1941 | |
1942 | ||
4e715689 | 1943 | |
7212f8c3 | 1944 | void DrawFluctuationdeltaZ(Int_t stat, Double_t norm){ |
1945 | // | |
1946 | // Draw correction - correction shifted z | |
1947 | // The same set of events used | |
1948 | //Int_t stat=0; Double_t norm=10000; | |
4b955de3 | 1949 | Int_t deltaZ=16.; |
7212f8c3 | 1950 | TFile *f0= TFile::Open(Form("SpaceChargeFluc%d.root",stat)); |
1951 | TTree * tree0 = 0; | |
1952 | if (f0) tree0 = (TTree*)f0->Get("hisDump"); | |
1953 | if (!tree0){ | |
4b955de3 | 1954 | tree0 = AliXRDPROOFtoolkit::MakeChainRandom("space.list","hisDump",0,10); |
7212f8c3 | 1955 | } |
1956 | tree0->SetCacheSize(1000000000); | |
1957 | tree0->SetMarkerStyle(25); | |
1958 | TObjArray * fitArray=new TObjArray(3); | |
1959 | tree0->SetAlias("scNorm",Form("%f/neventsCorr",norm)); | |
1960 | // | |
1961 | // DeltaZ Scan | |
1962 | // | |
1963 | TH2 * hisDeltaZScan[6]={0}; | |
1964 | TH1 * hisDeltaZScanSigma[6]={0}; | |
1965 | for (Int_t ihis=0; ihis<6; ihis++){ | |
4b955de3 | 1966 | tree0->Draw(Form("(DistRefDR-DistZ_%dDR)*scNorm:r>>hisZ%d(50,84,245,100,-1,1)",(ihis+1)*deltaZ,(ihis+1)*deltaZ),"abs(z/r)<1","colzgoff"); |
7212f8c3 | 1967 | hisDeltaZScan[ihis]=(TH2*)tree0->GetHistogram(); |
1968 | hisDeltaZScan[ihis]->FitSlicesY(0,0,-1,0,"QNR",fitArray); | |
1969 | hisDeltaZScanSigma[ihis]=(TH1*)(fitArray->At(2)->Clone()); | |
1970 | hisDeltaZScanSigma[ihis]->SetMinimum(0); | |
1971 | hisDeltaZScanSigma[ihis]->SetMaximum(0.2); | |
1972 | } | |
1973 | gStyle->SetOptStat(0); | |
1974 | gStyle->SetOptTitle(1); | |
1975 | TCanvas * canvasFlucDeltaZScan=new TCanvas("canvasFlucDeltaZScan","canvasFlucDeltaZScan",700,700); | |
1976 | canvasFlucDeltaZScan->Divide(3,2,0,0); | |
1977 | gStyle->SetPadBorderMode(0); | |
1978 | for (Int_t ihis=0; ihis<6; ihis++){ | |
1979 | canvasFlucDeltaZScan->cd(ihis+1)->SetLogz(1); | |
1980 | hisDeltaZScan[ihis]->GetXaxis()->SetTitle("r (cm)"); | |
1981 | hisDeltaZScan[ihis]->GetYaxis()->SetTitle("#Delta_{R} (cm)"); | |
1982 | hisDeltaZScan[ihis]->Draw("colz"); | |
1983 | TLegend * legendSec=new TLegend(0.5,0.7,0.89,0.89); | |
4b955de3 | 1984 | legendSec->AddEntry(hisDeltaZScan[ihis],Form("DeltaZ #Delta %d",(ihis+1)*deltaZ)); |
7212f8c3 | 1985 | legendSec->Draw(); |
1986 | } | |
1987 | canvasFlucDeltaZScan->SaveAs(Form("canvasFlucDeltaZScan%d.pdf",stat)); | |
1988 | canvasFlucDeltaZScan->SaveAs(Form("canvasFlucDeltaZScan%d.png",stat)); | |
1989 | ||
1990 | // | |
1991 | gStyle->SetOptTitle(0); | |
1992 | TCanvas * canvasFlucDeltaZScanFit=new TCanvas("canvasFlucDeltaZScanFit","canvasFlucDeltaZScanFit"); | |
1993 | TLegend * legendDeltaZ = new TLegend(0.50,0.55,0.89,0.89,"Space charge: corr(z_{ref})-corr(z_{ref}-#Delta_{z})"); | |
1994 | for (Int_t ihis=0; ihis<5; ihis++){ | |
1995 | hisDeltaZScanSigma[ihis]->GetXaxis()->SetTitle("r (cm)"); | |
1996 | hisDeltaZScanSigma[ihis]->GetYaxis()->SetTitle("#sigma(#Delta_{R}) (cm)"); | |
1997 | hisDeltaZScanSigma[ihis]->SetMarkerStyle(21+ihis%5); | |
1998 | hisDeltaZScanSigma[ihis]->SetMarkerColor(1+ihis%4); | |
1999 | if (ihis==0) hisDeltaZScanSigma[ihis]->Draw(""); | |
2000 | hisDeltaZScanSigma[ihis]->Draw("same"); | |
4b955de3 | 2001 | legendDeltaZ->AddEntry(hisDeltaZScanSigma[ihis],Form("#Delta %d (cm)",(ihis+1)*deltaZ)); |
7212f8c3 | 2002 | } |
2003 | legendDeltaZ->Draw(); | |
2004 | canvasFlucDeltaZScanFit->SaveAs(Form("canvasFlucDeltaZScanFit%d.pdf",stat)); | |
2005 | canvasFlucDeltaZScanFit->SaveAs(Form("canvasFlucDeltaZScanFit%d.png",stat)); | |
4e715689 | 2006 | |
7212f8c3 | 2007 | } |
4e715689 | 2008 | |
4e715689 | 2009 | |
7212f8c3 | 2010 | void DrawDefault(Int_t stat){ |
2011 | // | |
2012 | // Draw correction - correction shifted z | |
2013 | // The same set of events used | |
2014 | // Int_t stat=0 | |
2015 | TFile *f0= TFile::Open(Form("SpaceChargeFluc%d.root",stat)); | |
2016 | TTree * tree0 = (TTree*)f0->Get("hisDump"); | |
2017 | tree0->SetCacheSize(1000000000); | |
2018 | tree0->SetMarkerStyle(25); | |
2019 | tree0->SetMarkerSize(0.4); | |
4b955de3 | 2020 | // TObjArray * fitArray=new TObjArray(3); |
7212f8c3 | 2021 | tree0->Draw("10000*DistRefDR/neventsCorr:r:z/r","abs(z/r)<0.9&&z>0&&rndm>0.8","colz"); |
4b955de3 | 2022 | } |
2023 | ||
2024 | ||
2025 | ||
2026 | ||
2027 | void DrawTrackFluctuation(){ | |
2028 | // | |
2029 | // Function to make a fluctuation figures for differnt multiplicities of pileup space charge | |
2030 | // it is assumed that the text files | |
2031 | // | |
2032 | // | |
2033 | TObjArray arrayFit(3); | |
2034 | const char *inputList; | |
2035 | TH2F * hisCorrRef[5]={0}; | |
2036 | TH2F * hisCorrNo[5]={0}; | |
2037 | TH1 * hisCorrRefM[5], *hisCorrRefRMS[5]; | |
2038 | TH1 * hisCorrNoM[5], *hisCorrNoRMS[5]; | |
2039 | // | |
2040 | // 1. Load chains for different statistic | |
2041 | // | |
2042 | TCut cutOut="abs(T_DistRef_0.fX-OT_DistRef_0.fX)<0.1&&T_DistRef_0.fX>1&&abs(OT_DistRef_0.fP[4])<4"; | |
2043 | TCut cutOutF="abs(R.T_DistRef_0.fX-R.OT_DistRef_0.fX)<0.1&&R.T_DistRef_0.fX>1&&abs(R.OT_DistRef_0.fP[4])<4"; | |
2044 | TChain * chains[5]={0}; | |
5e4083cf | 2045 | TChain * chainR = AliXRDPROOFtoolkit::MakeChain("track0_1.list","trackFit",0,1000); // list of the reference data (full stat used) |
4b955de3 | 2046 | chainR->SetCacheSize(1000000000); |
5e4083cf | 2047 | for (Int_t ichain=0; ichain<5; ichain++){ // create the chain for given mulitplicity bin |
4b955de3 | 2048 | chains[ichain] = AliXRDPROOFtoolkit::MakeChain(Form("track%d_1.list",2*(ichain+1)),"trackFit",0,1000); |
2049 | chains[ichain]->AddFriend(chainR,"R"); | |
2050 | chains[ichain]->SetCacheSize(1000000000); | |
2051 | chains[ichain]->SetMarkerStyle(25); | |
2052 | chains[ichain]->SetMarkerSize(0.5); | |
2053 | chains[ichain]->SetAlias("meanNorm","(1+0.2*abs(neventsCorr/10000-1))"); // second order correction - renomalization of mean hardwired | |
2054 | // to be fitted? | |
2055 | } | |
2056 | // | |
2057 | // 2. fill histograms if not available in file | |
2058 | // | |
2059 | // | |
2060 | TFile *ftrackFluctuation = TFile::Open("trackFluctuation.root","update"); | |
2061 | for (Int_t ihis=0; ihis<5; ihis++){ | |
2062 | ftrackFluctuation->cd(); | |
2063 | hisCorrRef[ihis] = (TH2F*)(ftrackFluctuation->Get(Form("DeltaRPhiCorr%d",(ihis+1)*2000))); | |
2064 | hisCorrNo[ihis] = (TH2F*)(ftrackFluctuation->Get(Form("DeltaRPhi%d",(ihis+1)*2000))); | |
2065 | if (hisCorrRef[ihis]==0) { | |
2066 | chains[ihis]->Draw("(T_DistRef_0.fP[0]/meanNorm-neventsCorr*R.T_DistRef_0.fP[0]/10000):R.OT_DistRef_0.fP[4]>>his(10,-4,4,100,-0.25,0.25)",cutOut+cutOutF+"","colzgoff"); | |
2067 | hisCorrRef[ihis]=(TH2F*)(chains[ihis]->GetHistogram()->Clone()); | |
2068 | hisCorrRef[ihis]->SetName(Form("DeltaRPhiCorr%d",(ihis+1)*2000)); | |
2069 | hisCorrRef[ihis]->SetTitle(Form("Corrected #Delta r#phi - Pileup %d",(ihis+1)*2000)); | |
2070 | hisCorrRef[ihis]->GetXaxis()->SetTitle("1/p_{t} (1/GeV/c)"); | |
2071 | hisCorrRef[ihis]->GetYaxis()->SetTitle("#Delta_{r#phi} (cm)"); | |
2072 | hisCorrRef[ihis]->Write(); | |
2073 | // | |
2074 | chains[ihis]->Draw("(T_DistRef_0.fP[0]/meanNorm):R.OT_DistRef_0.fP[4]>>hisCorNo(10,-3,3,100,-4,4)",cutOut+cutOutF+"","colzgoff"); | |
2075 | hisCorrNo[ihis]=(TH2F*)(chains[ihis]->GetHistogram()->Clone()); | |
2076 | hisCorrNo[ihis]->SetName(Form("DeltaRPhi%d",(ihis+1)*2000)); | |
2077 | hisCorrNo[ihis]->SetTitle(Form("Delta r#phi = Pileup %d",(ihis+1)*2000)); | |
2078 | hisCorrNo[ihis]->GetXaxis()->SetTitle("1/p_{t} (1/GeV/c)"); | |
2079 | hisCorrNo[ihis]->GetYaxis()->SetTitle("#Delta_{r#phi} (cm)"); | |
2080 | hisCorrNo[ihis]->Write(); | |
2081 | } | |
2082 | } | |
2083 | ftrackFluctuation->Flush(); | |
2084 | // | |
2085 | // | |
2086 | // | |
2087 | for (Int_t ihis=0; ihis<5; ihis++){ | |
2088 | hisCorrRef[ihis]->FitSlicesY(0,0,-1,0,"QNR",&arrayFit); | |
2089 | hisCorrRefM[ihis] = (TH1*)arrayFit.At(1)->Clone(); | |
2090 | hisCorrRefRMS[ihis] = (TH1*)arrayFit.At(2)->Clone(); | |
2091 | hisCorrRefM[ihis]->GetXaxis()->SetTitle("1/p_{t} (1/GeV/c)"); | |
2092 | hisCorrRefM[ihis]->GetYaxis()->SetTitle("#Delta_{r#phi} (cm)"); | |
2093 | hisCorrRefM[ihis]->SetMarkerStyle(20); | |
2094 | hisCorrRefRMS[ihis]->SetMarkerStyle(21); | |
2095 | hisCorrRefM[ihis]->SetMarkerColor(1); | |
2096 | hisCorrRefRMS[ihis]->SetMarkerColor(2); | |
2097 | hisCorrNo[ihis]->FitSlicesY(0,0,-1,0,"QNR",&arrayFit); | |
2098 | hisCorrNoM[ihis] = (TH1*)arrayFit.At(1)->Clone(); | |
2099 | hisCorrNoRMS[ihis] = (TH1*)arrayFit.At(2)->Clone(); | |
2100 | } | |
4e715689 | 2101 | |
4b955de3 | 2102 | // |
2103 | TCanvas *canvasMean = new TCanvas("canvasCorrectionMean","canvasCorrectionMean",900,1000); | |
2104 | TCanvas *canvasMeanSummary = new TCanvas("canvasCorrectionMeanSummary","canvasCorrectionMeanSummary",700,600); | |
2105 | ||
2106 | canvasMean->Divide(3,5); | |
2107 | gStyle->SetOptStat(0); | |
2108 | for (Int_t ihis=0; ihis<5; ihis++){ | |
2109 | TLegend * legend = new TLegend(0.11,0.11,0.5,0.3,Form("Pile up %d",(ihis+1)*2000)); | |
2110 | canvasMean->cd(3*ihis+1); | |
2111 | hisCorrNo[ihis]->Draw("colz"); | |
2112 | canvasMean->cd(3*ihis+2); | |
2113 | hisCorrRef[ihis]->Draw("colz"); | |
2114 | canvasMean->cd(3*ihis+3); | |
2115 | hisCorrRefM[ihis]->SetMaximum(0.25); | |
2116 | hisCorrRefM[ihis]->SetMinimum(-0.25); | |
2117 | hisCorrRefM[ihis]->Draw(""); | |
2118 | hisCorrRefRMS[ihis]->Draw("same"); | |
2119 | legend->AddEntry(hisCorrRefM[ihis],"Mean"); | |
2120 | legend->AddEntry(hisCorrRefRMS[ihis],"RMS"); | |
2121 | legend->Draw(); | |
2122 | } | |
2123 | canvasMeanSummary->cd(); | |
2124 | TLegend * legendMeanSummary = new TLegend(0.5,0.6,0.89,0.89,"Space charge correction fluctuation in r#phi"); | |
2125 | for (Int_t ihis=4; ihis>=0; ihis--){ | |
2126 | hisCorrRefRMS[ihis]->SetMarkerColor(1+ihis); | |
2127 | hisCorrRefRMS[ihis]->SetMinimum(0); | |
2128 | hisCorrRefRMS[ihis]->GetYaxis()->SetTitle("#sigma_{r#phi} (cm)"); | |
2129 | if (ihis==4) hisCorrRefRMS[ihis]->Draw(""); | |
2130 | hisCorrRefRMS[ihis]->Draw("same"); | |
2131 | legendMeanSummary->AddEntry(hisCorrRefRMS[ihis],Form("%d pile-up events",(ihis+1)*2000)); | |
2132 | } | |
2133 | legendMeanSummary->Draw(); | |
4e715689 | 2134 | |
4b955de3 | 2135 | canvasMean->SaveAs("canvasCorrectionMean.pdf"); |
2136 | canvasMeanSummary->SaveAs("canvasCorrectionMeanSummary.pdf"); | |
2137 | //canvasMean->Write(); | |
2138 | //canvasMeanSummary->Write(); | |
2139 | ftrackFluctuation->Close(); | |
7212f8c3 | 2140 | } |
4b955de3 | 2141 | |
2142 | void DrawTrackFluctuationZ(){ | |
2143 | // | |
2144 | // Draw track fucutation dz | |
2145 | // | |
2146 | const Int_t kColors[6]={1,2,3,4,6,7}; | |
2147 | const Int_t kStyle[6]={20,21,24,25,24,25}; | |
2148 | TObjArray arrayFit(3); | |
2149 | TCut cutOut="abs(T_DistRef_0.fX-OT_DistRef_0.fX)<0.1&&T_DistRef_0.fX>1&&abs(OT_DistRef_0.fP[4])<4"; | |
2150 | TCut cutOutF="abs(R.T_DistRef_0.fX-R.OT_DistRef_0.fX)<0.1&&R.T_DistRef_0.fX>1&&abs(R.OT_DistRef_0.fP[4])<4"; | |
2151 | TChain * chains[5]={0}; | |
2152 | TChain * chainR = AliXRDPROOFtoolkit::MakeChain("track0_1.list","trackFit",0,1000); | |
2153 | chainR->SetCacheSize(1000000000); | |
2154 | for (Int_t ichain=0; ichain<5; ichain++){ | |
2155 | chains[ichain] = AliXRDPROOFtoolkit::MakeChain(Form("track%d_1.list",2*(ichain+1)),"trackFit",0,1000); | |
2156 | chains[ichain]->AddFriend(chainR,"R"); | |
2157 | chains[ichain]->SetCacheSize(1000000000); | |
2158 | chains[ichain]->SetMarkerStyle(25); | |
2159 | chains[ichain]->SetMarkerSize(0.5); | |
2160 | } | |
2161 | // | |
2162 | // 2.) Create 2D histo or read from files | |
2163 | // | |
2164 | TObjArray * arrayHisto = new TObjArray(25); | |
2165 | TFile *ftrackFluctuationZ = TFile::Open("trackFluctuationZ.root","update"); | |
2166 | for (Int_t ihis=0; ihis<5; ihis++){ | |
2167 | ftrackFluctuationZ->cd(); | |
2168 | for (Int_t idz=0; idz<5; idz++){ | |
2169 | Int_t z= 16+idz*32; | |
2170 | TH2 *his= (TH2*)ftrackFluctuationZ->Get(Form("TrackDz%d_PileUp%d",z, (ihis+1)*2000)); | |
2171 | if (!his){ | |
2172 | chains[ihis]->Draw(Form("T_DistZ_%d_0.fP[0]-T_DistRef_0.fP[0]:T_DistRef_0.fP[4]>>his(10,-4,4,100,-0.25,0.25)",z),cutOut+"","colz"); | |
2173 | his = (TH2*)(chains[ihis]->GetHistogram()->Clone()); | |
2174 | his->SetName(Form("TrackDz%d_PileUp%d",z, (ihis+1)*2000)); | |
2175 | his->Write(); | |
2176 | } | |
2177 | arrayHisto->AddAtAndExpand(his,ihis*5+idz); | |
2178 | } | |
2179 | } | |
2180 | ftrackFluctuationZ->Flush(); | |
2181 | ||
2182 | // | |
2183 | // 3.) Make fits | |
2184 | // | |
2185 | TCanvas *canvasDz = new TCanvas("canvasDz","canvasDz",800,800); | |
2186 | canvasDz->Divide(2,2,0,0); | |
2187 | for (Int_t ihis=3; ihis>=0; ihis--){ | |
2188 | canvasDz->cd(ihis+1)->SetTicks(3); | |
2189 | TLegend * legend = new TLegend(0.31,0.51, 0.95,0.95,Form("Distortion due time/z delay (Pileup=%d)", (ihis+1)*2000)); | |
2190 | legend->SetBorderSize(0); | |
2191 | for (Int_t idz=3; idz>=0; idz--){ | |
2192 | TH2 * his = (TH2*)arrayHisto->At(ihis*5+idz); | |
2193 | his->FitSlicesY(0,0,-1,0,"QNR",&arrayFit); | |
2194 | TH1 * hisRMS = (TH1*)arrayFit.At(2)->Clone(); | |
2195 | hisRMS->SetMaximum(0.12); | |
2196 | hisRMS->SetMinimum(0); | |
2197 | hisRMS->GetXaxis()->SetTitle("1/p_{t} (GeV/c)"); | |
2198 | hisRMS->GetYaxis()->SetTitle("#sigma_{r#phi}(cm)"); | |
2199 | hisRMS->SetMarkerStyle(kStyle[idz]); | |
2200 | hisRMS->SetMarkerColor(kColors[idz]); | |
2201 | if (idz==3) hisRMS->Draw(); | |
2202 | legend->AddEntry(hisRMS,Form("#Delta_{z}=%d (cm)",16+idz*32)); | |
2203 | hisRMS->Draw("same"); | |
2204 | } | |
2205 | legend->Draw(); | |
2206 | } | |
2207 | canvasDz->SaveAs("spaceChargeDeltaZScan.pdf"); | |
2208 | ||
2209 | } | |
2210 | ||
2211 | ||
2ff913b6 | 2212 | |
2213 | ||
2214 | ||
2215 | void DrawTrackFluctuationFrame(){ | |
2216 | // | |
2217 | // Function to make a fluctuation figures for differnt multiplicities of pileup space charge | |
2218 | // it is assumed that the text files | |
2219 | // | |
2220 | // | |
2221 | TObjArray arrayFit(3); | |
2222 | const char *inputList; | |
2223 | TH2F * hisCorrRef[10]={0}; | |
2224 | TH2F * hisCorrNo[10]={0}; | |
2225 | TH1 * hisCorrRefM[10], *hisCorrRefRMS[10]; | |
2226 | TH1 * hisCorrNoM[10], *hisCorrNoRMS[10]; | |
2227 | // | |
2228 | // 1. Load chains for different statistic | |
2229 | // | |
2230 | TCut cutOut="abs(T_DistRef_0.fX-OT_DistRef_0.fX)<0.1&&T_DistRef_0.fX>1&&abs(OT_DistRef_0.fP[4])<4"; | |
2231 | TCut cutOutF="abs(R.T_DistRef_0.fX-R.OT_DistRef_0.fX)<0.1&&R.T_DistRef_0.fX>1&&abs(R.OT_DistRef_0.fP[4])<4"; | |
2232 | TCut cutFit="Entry$%4==0"; //use only subset of data for fit | |
2233 | ||
2234 | TChain * chains[10]={0}; | |
2235 | TChain * chainR = AliXRDPROOFtoolkit::MakeChain("track0_1.list","trackFit",0,1000); | |
2236 | chainR->SetCacheSize(1000000000); | |
2237 | for (Int_t ichain=0; ichain<7; ichain++){ | |
2238 | chains[ichain] = AliXRDPROOFtoolkit::MakeChain(Form("track%d_1.list",2*(ichain+1)),"trackFit",0,1000); | |
2239 | chains[ichain]->AddFriend(chainR,"R"); | |
2240 | chains[ichain]->SetCacheSize(1000000000); | |
2241 | chains[ichain]->SetMarkerStyle(25); | |
2242 | chains[ichain]->SetMarkerSize(0.5); | |
2243 | chains[ichain]->SetAlias("meanNorm","(1+0.2*abs(neventsCorr/10000-1))"); // second order correction - renomalization of mean hardwired | |
2244 | chains[ichain]->SetAlias("dMean0","(neventsCorr*R.T_DistRef_0.fP[0]/10000)"); | |
2245 | chains[ichain]->SetAlias("dMeas0","T_DistRef_0.fP[0]"); | |
2246 | chains[ichain]->SetAlias("dMean1","(neventsCorr*R.T_DistRef_1.fP[0]/10000)"); | |
2247 | chains[ichain]->SetAlias("dMeas1","T_DistRef_1.fP[0]"); | |
2248 | for (Int_t ig=0; ig<10;ig++) chains[ichain]->SetAlias(Form("FR%d",ig),Form("(abs(Entry$-%d)<1000)",ig*2000+1000)); | |
2249 | } | |
2250 | // | |
2251 | // 2. Get or Create histogram (do fit per frame) | |
2252 | // | |
2253 | TStatToolkit toolkit; | |
2254 | Double_t chi2=0; | |
2255 | Int_t npoints=0; | |
2256 | TVectorD param; | |
2257 | TMatrixD covar; | |
2258 | TString fstringG=""; // global part | |
2259 | fstringG+="dMean0++"; | |
2260 | TVectorD vec0,vec1; | |
2261 | TString fstringF0=""; // global part | |
2262 | for (Int_t ig=0; ig<10;ig++) fstringF0+=Form("FR%d++",ig); | |
2263 | for (Int_t ig=0; ig<10;ig++) fstringF0+=Form("FR%d*dMean0++",ig); | |
2264 | TString fstringF1=""; // global part | |
2265 | for (Int_t ig=0; ig<10;ig++) fstringF1+=Form("FR%d++",ig); | |
2266 | for (Int_t ig=0; ig<10;ig++) fstringF1+=Form("FR%d*dMean0++",ig); | |
2267 | for (Int_t ig=0; ig<10;ig++) fstringF1+=Form("FR%d*dMean0*abs(T_DistRef_0.fP[3])++",ig); | |
2268 | for (Int_t ig=0; ig<10;ig++) fstringF1+=Form("FR%d*dMean0*(T_DistRef_0.fP[3]^2)++",ig); | |
2269 | ||
2270 | // | |
2271 | // | |
2272 | TH2F *hisA=0, *hisF0=0, *hisF1=0, *hisM=0; | |
2273 | TObjArray * arrayHisto = new TObjArray(200); | |
2274 | TFile *ftrackFit = TFile::Open("trackFluctuationFrame.root","update"); | |
2275 | for (Int_t ihis=0; ihis<7; ihis++){ | |
2276 | printf("\n\nProcessing frames\t%d\nnn",(ihis+1)*2000); | |
2277 | hisM = (TH2F*)ftrackFit->Get(Form("hisMean_%d",(ihis+1)*2000)); | |
2278 | hisA = (TH2F*)ftrackFit->Get(Form("hisAll_%d",(ihis+1)*2000)); | |
2279 | hisF0 = (TH2F*)ftrackFit->Get(Form("hisFrame0_%d",(ihis+1)*2000)); | |
2280 | hisF1 = (TH2F*)ftrackFit->Get(Form("hisFrame1_%d",(ihis+1)*2000)); | |
2281 | if (!hisA){ | |
2282 | ftrackFit->cd(); | |
2283 | TString * fitResultAll = TStatToolkit::FitPlane(chains[ihis],"dMeas0", fstringG.Data(),cutOut+cutOutF+cutFit, chi2,npoints,param,covar,-1,0, 40*2000, kFALSE); | |
2284 | chains[ihis]->SetAlias("fitAll",fitResultAll->Data()); | |
2285 | TString * fitResultF0 = TStatToolkit::FitPlane(chains[ihis],"dMeas0", fstringF0.Data(),cutOut+cutOutF+cutFit+"abs(dMeas0-fitAll)<0.3", chi2,npoints,vec0,covar,-1,0, 10*2000, kFALSE); | |
2286 | chains[ihis]->SetAlias("fitF0",fitResultF0->Data()); | |
2287 | TString * fitResultF1 = TStatToolkit::FitPlane(chains[ihis],"dMeas0", fstringF1.Data(),cutOut+cutOutF+cutFit+"abs(dMeas0-fitAll)<0.3", chi2,npoints,vec1,covar,-1,0, 10*2000, kFALSE); | |
2288 | chains[ihis]->SetAlias("fitF1",fitResultF1->Data()); | |
2289 | fitResultF0->Tokenize("++")->Print(); | |
2290 | chains[ihis]->Draw(Form("dMeas0-fitAll:T_DistRef_0.fP[4]>>hisAll_%d(20,-4,4,100,-0.25,0.25)",(ihis+1)*2000),cutOut+cutOutF,"colz",100000,0); | |
2291 | hisA = (TH2F*)chains[ihis]->GetHistogram(); | |
2292 | chains[ihis]->Draw(Form("dMeas0-fitF0:T_DistRef_0.fP[4]>>hisFrame0_%d(20,-4,4,100,-0.10,0.10)",(ihis+1)*2000),cutOut+cutOutF,"colz",20000,0); | |
2293 | hisF0 = (TH2F*)chains[ihis]->GetHistogram(); | |
2294 | chains[ihis]->Draw(Form("dMeas0-fitF1:T_DistRef_0.fP[4]>>hisFrame1_%d(20,-4,4,100,-0.10,0.10)",(ihis+1)*2000),cutOut+cutOutF,"colz",20000,0); | |
2295 | hisF1 = (TH2F*)chains[ihis]->GetHistogram(); | |
2296 | chains[ihis]->Draw(Form("dMeas0-dMean0:T_DistRef_0.fP[4]>>hisMean_%d(20,-4,4,100,-0.25,0.25)",(ihis+1)*2000),cutOut+cutOutF,"colz",100000,0); | |
2297 | hisM = (TH2F*)chains[ihis]->GetHistogram(); | |
2298 | hisM->Write(); hisA->Write();hisF0->Write(); hisF1->Write(); | |
2299 | ftrackFit->Flush(); | |
2300 | } | |
2301 | } | |
5e4083cf | 2302 | |
2ff913b6 | 2303 | for (Int_t ihis=0; ihis<7; ihis++){ |
2304 | printf("\n\nProcessing frames\t%d\nnn",(ihis+1)*2000); | |
2305 | hisM = (TH2F*)ftrackFit->Get(Form("hisMean_%d",(ihis+1)*2000)); | |
2306 | hisA = (TH2F*)ftrackFit->Get(Form("hisAll_%d",(ihis+1)*2000)); | |
2307 | hisF0 = (TH2F*)ftrackFit->Get(Form("hisFrame0_%d",(ihis+1)*2000)); | |
2308 | hisF1 = (TH2F*)ftrackFit->Get(Form("hisFrame1_%d",(ihis+1)*2000)); | |
2309 | arrayHisto->AddLast(hisA); | |
2310 | arrayHisto->AddLast(hisF0); | |
2311 | arrayHisto->AddLast(hisF1); | |
2312 | arrayHisto->AddLast(hisM); | |
2313 | } | |
2314 | delete ftrackFit; | |
2315 | // | |
2316 | // 3. Draw figures | |
2317 | // | |
2318 | gStyle->SetOptStat(0); | |
2319 | TCanvas *canvasFit = new TCanvas("canvasFitFrame","canvasFitframe",900,700); | |
2320 | canvasFit->Divide(3,2,0,0); | |
2321 | for (Int_t ihis=1; ihis<7; ihis++){ | |
2322 | // | |
2323 | canvasFit->cd(ihis); | |
2324 | char hname[10000]; | |
2325 | snprintf(hname,1000,"hisAll_%d",(ihis+1)*2000); | |
2326 | hisA = (TH2F*)arrayHisto->FindObject(hname); | |
2327 | snprintf(hname,1000,"hisFrame0_%d",(ihis+1)*2000); | |
2328 | hisF0 = (TH2F*)arrayHisto->FindObject(hname); | |
2329 | snprintf(hname,1000,"hisFrame1_%d",(ihis+1)*2000); | |
2330 | hisF1 = (TH2F*)arrayHisto->FindObject(hname); | |
2331 | snprintf(hname,1000,"hisMean_%d",(ihis+1)*2000); | |
2332 | hisM = (TH2F*)arrayHisto->FindObject(hname); | |
2333 | // | |
2334 | // | |
2335 | hisM->FitSlicesY(0,0,-1,0,"QNR",&arrayFit); | |
2336 | TH1 * hisRA= (TH1*)arrayFit.At(2)->Clone(); | |
2337 | hisF0->FitSlicesY(0,0,-1,0,"QNR",&arrayFit); | |
2338 | TH1 * hisRF0= (TH1*)arrayFit.At(2)->Clone(); | |
2339 | hisF1->FitSlicesY(0,0,-1,0,"QNR",&arrayFit); | |
2340 | TH1 * hisRF1= (TH1*)arrayFit.At(2)->Clone(); | |
2341 | // | |
2342 | hisRA->SetMarkerStyle(20); | |
2343 | hisRF0->SetMarkerStyle(21); | |
2344 | hisRF1->SetMarkerStyle(21); | |
2345 | hisRA->SetMarkerColor(1); | |
2346 | hisRF0->SetMarkerColor(4); | |
2347 | hisRF1->SetMarkerColor(2); | |
2348 | TF1 * f1a= new TF1("f1a","pol1"); | |
2349 | TF1 * f1f0= new TF1("f1a0","pol1"); | |
2350 | TF1 * f1f1= new TF1("f1a1","pol1"); | |
2351 | f1a->SetLineColor(1); | |
2352 | f1f0->SetLineColor(4); | |
2353 | f1f1->SetLineColor(2); | |
2354 | hisRA->Fit(f1a); | |
2355 | hisRF0->Fit(f1f0); | |
2356 | hisRF1->Fit(f1f1); | |
2357 | hisRF1->SetMinimum(0); | |
2358 | hisRF1->SetMaximum(0.05); | |
2359 | // hisRA->Draw(); | |
2360 | hisRF1->GetXaxis()->SetTitle("q/p_{T} (1/GeV)"); | |
2361 | hisRF1->GetYaxis()->SetTitle("#sigma_{r#phi} (cm)"); | |
2362 | hisRF1->Draw(""); | |
2363 | hisRF0->Draw("same"); | |
2364 | TLegend * legend = new TLegend(0.11,0.11,0.65,0.25, Form("Track residual r#phi distortion: N_{ion}=%d",(ihis+1)*2000)); | |
2365 | legend->AddEntry(hisRF0,"a_{0}+a_{1}#rho"); | |
2366 | legend->AddEntry(hisRF1,"a_{0}+(a_{1}+a_{2}z+a_{3}z^2)#rho"); | |
2367 | legend->SetBorderSize(0); | |
2368 | legend->Draw(); | |
2369 | } | |
2370 | // | |
2371 | canvasFit->SaveAs("canvasFrameFitRPhiVersion0.pdf"); | |
2372 | canvasFit->SaveAs("canvasFrameFitRPhiVersion0.png"); | |
2373 | // | |
2374 | } | |
5a998ace | 2375 | |
2376 | ||
2377 | ||
2378 | void MakeLocalDistortionPlotsGlobalFitPolDrift(Float_t xmin, Float_t xmax){ | |
2379 | // | |
2380 | // Make local distortion plots correcting using global z fits of order 0,2,4,6,8,10,12 | |
2381 | // Currently polynomial correction as an multiplicative factor of the mean distortion map used | |
2382 | // To be done - calculate numerical derivative of distortion maps | |
2383 | // corresponding the local change of densities - after TDR? | |
2384 | // | |
2385 | // As input: | |
2386 | // 1.) distortion file with the setup 10000 pileup events used | |
2387 | // 2.) mean distortion file | |
2388 | // distortions are fitted rescaling (z dependent) mean distortion file | |
2389 | // | |
2390 | TTreeSRedirector *pcstream = new TTreeSRedirector("localFit.root","update"); | |
2391 | TFile *fRef = TFile::Open("SpaceChargeFluc0_1.root"); | |
2392 | TFile *fCurrent = TFile::Open("SpaceChargeFluc10_1.root"); | |
2393 | TTree * treeRef = (TTree*)fRef->Get("hisDump"); | |
2394 | TTree * treeCurrent = (TTree*)fCurrent->Get("hisDump"); | |
2395 | treeCurrent->AddFriend(treeRef,"R"); | |
2396 | treeCurrent->SetAlias("refR","(neventsCorr*R.DistRefDR/10000)"); | |
2397 | treeCurrent->SetAlias("refRPhi","(neventsCorr*R.DistRefDRPhi/10000)"); | |
2398 | treeCurrent->SetCacheSize(1000000000); | |
2399 | treeCurrent->SetAlias("drift","1.-abs(z/250.)"); | |
2400 | TStatToolkit toolkit; | |
2401 | Double_t chi2=0; | |
2402 | Int_t npoints=0; | |
2403 | TVectorD param; | |
2404 | TMatrixD covar; | |
2405 | // | |
2406 | TCut cut="z>0"; | |
2407 | TString fstringG0="refR++"; // global part - for z dependence we should use the Chebischev | |
2408 | TString fstringG1="refR++"; // global part - for z dependence we should use the Chebischev | |
2409 | TString fstringG2="refR++"; // global part - for z dependence we should use the Chebischev | |
2410 | TString fstringG3="refR++"; // global part - for z dependence we should use the Chebischev | |
2411 | TString fstringG4="refR++"; // global part - for z dependence we should use the Chebischev | |
2412 | TString fstringG5="refR++"; // global part - for z dependence we should use the Chebischev | |
2413 | TString fstringG6="refR++"; // global part - for z dependence we should use the Chebischev | |
2414 | TString fstringG7="refR++"; // global part - for z dependence we should use the Chebischev | |
2415 | TString fstringG8="refR++"; // global part - for z dependence we should use the Chebischev | |
2416 | // | |
2417 | for (Int_t i=1; i<=1; i++) fstringG1+=TString::Format("refR*pow(drift,%d)++",i); | |
2418 | for (Int_t i=1; i<=2; i++) fstringG2+=TString::Format("refR*pow(drift,%d)++",i); | |
2419 | for (Int_t i=1; i<=3; i++) fstringG3+=TString::Format("refR*pow(drift,%d)++",i); | |
2420 | for (Int_t i=1; i<=4; i++) fstringG4+=TString::Format("refR*pow(drift,%d)++",i); | |
2421 | for (Int_t i=1; i<=5; i++) fstringG5+=TString::Format("refR*pow(drift,%d)++",i); | |
2422 | for (Int_t i=1; i<=6; i++) fstringG6+=TString::Format("refR*pow(drift,%d)++",i); | |
2423 | for (Int_t i=1; i<=7; i++) fstringG7+=TString::Format("refR*pow(drift,%d)++",i); | |
2424 | for (Int_t i=1; i<=8; i++) fstringG8+=TString::Format("refR*pow(drift,%d)++",i); | |
2425 | ||
2426 | ||
2427 | TString * fitResultG0 = TStatToolkit::FitPlane(treeCurrent,"DistRefDR-refR", fstringG0.Data(),cut+"Entry$%7==0", chi2,npoints,param,covar,-1,0,180000 , kFALSE); | |
2428 | TString * fitResultG1 = TStatToolkit::FitPlane(treeCurrent,"DistRefDR-refR", fstringG1.Data(),cut+"Entry$%7==0", chi2,npoints,param,covar,-1,0,180000 , kFALSE); | |
2429 | TString * fitResultG2 = TStatToolkit::FitPlane(treeCurrent,"DistRefDR-refR", fstringG2.Data(),cut+"Entry$%7==0", chi2,npoints,param,covar,-1,0,180000 , kFALSE); | |
2430 | TString * fitResultG3 = TStatToolkit::FitPlane(treeCurrent,"DistRefDR-refR", fstringG3.Data(),cut+"Entry$%7==0", chi2,npoints,param,covar,-1,0,180000 , kFALSE); | |
2431 | TString * fitResultG4 = TStatToolkit::FitPlane(treeCurrent,"DistRefDR-refR", fstringG4.Data(),cut+"Entry$%7==0", chi2,npoints,param,covar,-1,0,180000 , kFALSE); | |
2432 | TString * fitResultG5 = TStatToolkit::FitPlane(treeCurrent,"DistRefDR-refR", fstringG5.Data(),cut+"Entry$%7==0", chi2,npoints,param,covar,-1,0,180000 , kFALSE); | |
2433 | TString * fitResultG6 = TStatToolkit::FitPlane(treeCurrent,"DistRefDR-refR", fstringG6.Data(),cut+"Entry$%7==0", chi2,npoints,param,covar,-1,0,180000 , kFALSE); | |
2434 | TString * fitResultG7 = TStatToolkit::FitPlane(treeCurrent,"DistRefDR-refR", fstringG7.Data(),cut+"Entry$%7==0", chi2,npoints,param,covar,-1,0,180000 , kFALSE); | |
2435 | TString * fitResultG8 = TStatToolkit::FitPlane(treeCurrent,"DistRefDR-refR", fstringG8.Data(),cut+"Entry$%7==0", chi2,npoints,param,covar,-1,0,180000 , kFALSE); | |
2436 | // | |
2437 | treeCurrent->SetAlias("fitG0",fitResultG0->Data()); | |
2438 | treeCurrent->SetAlias("fitG1",fitResultG1->Data()); | |
2439 | treeCurrent->SetAlias("fitG2",fitResultG2->Data()); | |
2440 | treeCurrent->SetAlias("fitG3",fitResultG3->Data()); | |
2441 | treeCurrent->SetAlias("fitG4",fitResultG4->Data()); | |
2442 | treeCurrent->SetAlias("fitG5",fitResultG5->Data()); | |
2443 | treeCurrent->SetAlias("fitG6",fitResultG6->Data()); | |
2444 | treeCurrent->SetAlias("fitG7",fitResultG7->Data()); | |
2445 | treeCurrent->SetAlias("fitG8",fitResultG8->Data()); | |
2446 | treeCurrent->SetMarkerStyle(25); | |
2447 | treeCurrent->SetMarkerSize(0.2); | |
2448 | // | |
2449 | gStyle->SetOptFit(1); | |
2450 | gStyle->SetOptStat(0); | |
2451 | gStyle->SetOptTitle(1); | |
2452 | ||
2453 | TCut cutDrawGraph="z>0&&abs(z-30)<5&&abs(r-90)<10"; | |
2454 | TCut cutDrawHisto="z>0&&abs(z)<125&&abs(r-90)<10"; | |
2455 | TH1F *hisFull=new TH1F("hisFull","hisFull",100,xmin,xmax); | |
2456 | TH1F *hisG0=new TH1F("hisG0","hisG0",100,xmin,xmax); | |
2457 | TH1F *hisG1=new TH1F("hisG1","hisG1",100,xmin,xmax); | |
2458 | TH1F *hisG2=new TH1F("hisG2","hisG2",100,xmin,xmax); | |
2459 | TH1F *hisG3=new TH1F("hisG3","hisG3",100,xmin,xmax); | |
2460 | TH1F *hisG4=new TH1F("hisG4","hisG4",100,xmin,xmax); | |
2461 | TH1F *hisG5=new TH1F("hisG5","hisG5",100,xmin,xmax); | |
2462 | TH1F *hisG6=new TH1F("hisG6","hisG6",100,xmin,xmax); | |
2463 | TH1F *hisG7=new TH1F("hisG7","hisG7",100,xmin,xmax); | |
2464 | TH1F *hisG8=new TH1F("hisG8","hisG8",100,xmin,xmax); | |
2465 | TH1F * hisResG[10]={hisFull, hisG0, hisG1,hisG2, hisG3,hisG4, hisG5,hisG6, hisG7,hisG8}; | |
2466 | treeCurrent->Draw("DistRefDR-refR>>hisFull",cutDrawHisto,""); | |
2467 | for (Int_t ihis=0; ihis<9; ihis++){ | |
2468 | treeCurrent->Draw(TString::Format("DistRefDR-refR-fitG%d>>hisG%d",ihis,ihis),cutDrawHisto,""); | |
2469 | } | |
2470 | // | |
2471 | TF1 *fg = new TF1("fg","gaus"); | |
2472 | TVectorD vecP(10), vecRes(10), vecResE(10); | |
2473 | for (Int_t ihis=0; ihis<10; ihis++){ | |
2474 | hisResG[ihis]->Fit(fg); | |
2475 | vecP[ihis]=ihis-1; | |
2476 | vecRes[ihis]=fg->GetParameter(2); | |
2477 | vecResE[ihis]=fg->GetParError(2); | |
2478 | hisResG[ihis]->GetXaxis()->SetTitle("#Delta_{R} (cm)"); | |
2479 | pcstream->GetFile()->cd(); | |
2480 | hisResG[ihis]->Write(); | |
2481 | (*pcstream)<<"residuals"<< | |
2482 | TString::Format("diffHis%d.=",ihis)<<hisResG[ihis]; | |
2483 | } | |
2484 | TGraphErrors *gr = new TGraphErrors(10,vecP.GetMatrixArray(), vecRes.GetMatrixArray(),0, vecResE.GetMatrixArray()); | |
2485 | gr->SetMarkerStyle(25); | |
2486 | gr->Draw("alp"); | |
2487 | (*pcstream)<<"residuals"<< | |
2488 | "graph.="<<gr<< | |
2489 | "\n"; | |
2490 | ||
2491 | TCanvas *canvasRes = new TCanvas("canvasRes","canvasRes",900,900); | |
2492 | canvasRes->Divide(2,4); | |
2493 | TH2* htemp=0; | |
2494 | for (Int_t ihis=0; ihis<4; ihis++){ | |
2495 | canvasRes->cd(ihis*2+1); | |
2496 | if (ihis==0) { | |
2497 | treeCurrent->Draw("DistRefDR-refR:phi:r",cutDrawGraph,"colz"); | |
2498 | } | |
2499 | if (ihis>0) { | |
2500 | treeCurrent->Draw(TString::Format("DistRefDR-refR-fitG%d:phi:r",(ihis-1)*2),cutDrawGraph,"colz"); | |
2501 | } | |
2502 | htemp = (TH2F*)gPad->GetPrimitive("htemp"); | |
2503 | htemp->GetXaxis()->SetTitle("#phi"); | |
2504 | htemp->GetYaxis()->SetTitle("#Delta_{R} (cm)"); | |
2505 | htemp->GetZaxis()->SetTitle("r (cm)"); | |
2506 | // htemp->SetTitle("1/pT difference"); | |
2507 | //htemp->GetYaxis()->SetRangeUser(xmin,xmax); | |
2508 | canvasRes->cd(ihis*2+2); | |
2509 | if (ihis>0) hisResG[(ihis-1)*2+1]->Draw(); | |
2510 | if (ihis==0) hisResG[0]->Draw(); | |
2511 | } | |
2512 | delete pcstream; | |
2513 | ||
2514 | canvasRes->SaveAs("locaFluctuationR.pdf"); | |
2515 | canvasRes->SaveAs("locaFluctuationR.png"); | |
2516 | } | |
2517 | ||
2518 | void MakeLocalDistortionPlotsGlobalFitPolDriftSummary(Float_t xmin, Float_t xmax){ | |
2519 | // | |
2520 | // Make local distortion plots correcting using global z fits of order 0,2,4,6,8,10,12 | |
2521 | // Currently polynomial correction as an multiplicative factor of the mean distortion map used | |
2522 | // To be done - calculate numerical derivative of distortion maps | |
2523 | // corresponding the local change of densities - after TDR? | |
2524 | // | |
2525 | // As input: | |
2526 | // 1.) distortion file with the setup 10000 pileup events used | |
2527 | // 2.) mean distortion file | |
2528 | // distortions are fitted rescaling (z dependent) mean distortion file | |
2529 | // | |
2530 | gStyle->SetOptStat(0); | |
2531 | gStyle->SetOptFit(1); | |
2532 | gStyle->SetOptTitle(1); | |
2533 | TTreeSRedirector *pcstream = new TTreeSRedirector("localFit.root","update"); | |
2534 | TH1 *hisResG[10] = {0}; | |
2535 | hisResG[0]=(TH1*)(pcstream->GetFile()->Get("hisFull")); | |
2536 | TF1 *fg = new TF1("fg","gaus"); | |
2537 | TVectorD vecP(10), vecRes(10), vecResE(10); | |
2538 | for (Int_t ihis=0; ihis<10; ihis++){ | |
2539 | hisResG[ihis+1]=(TH1*)(pcstream->GetFile()->Get(TString::Format("hisG%d",ihis))); | |
2540 | hisResG[ihis]->Fit(fg); | |
2541 | vecP[ihis]=ihis-1; | |
2542 | vecRes[ihis]=fg->GetParameter(2); | |
2543 | vecResE[ihis]=fg->GetParError(2); | |
2544 | } | |
2545 | // | |
2546 | TCanvas *canvasRes = new TCanvas("canvasRes","canvasRes",800,800); | |
2547 | canvasRes->Divide(2,3,0,0); | |
2548 | for (Int_t ihis=0; ihis<6; ihis++){ | |
2549 | canvasRes->cd(ihis+1); | |
2550 | hisResG[ihis]->GetXaxis()->SetTitle("#Delta_{R} (cm)"); | |
2551 | hisResG[ihis]->Draw(); | |
2552 | } | |
2553 | canvasRes->SaveAs("fluctuationTableSummaryHist.pdf"); | |
2554 | canvasRes->SaveAs("fluctuationTableSummaryHist.png"); | |
2555 | ||
2556 | TCanvas *canvasFluctuationGraph = new TCanvas("canvasGraph","canvasGraph",600,500); | |
2557 | TGraphErrors *gr = new TGraphErrors(10,vecP.GetMatrixArray(), vecRes.GetMatrixArray(),0, vecResE.GetMatrixArray()); | |
2558 | gr->SetMarkerStyle(25); | |
2559 | gr->SetMinimum(0); | |
2560 | gr->GetXaxis()->SetTitle("#Fit parameters"); | |
2561 | gr->GetYaxis()->SetTitle("#sigma_{R} (cm)"); | |
2562 | gr->Draw("alp"); | |
2563 | // | |
2564 | canvasFluctuationGraph->SaveAs("canvasFluctuationGraphR.pdf"); | |
2565 | canvasFluctuationGraph->SaveAs("canvasFluctuationGraphR.png"); | |
2566 | ||
2567 | } | |
2568 | ||
2569 | ||
2570 | ||
2571 | void MakeLocalDistortionPlots(Int_t npoints, Int_t npointsZ){ | |
2572 | // | |
2573 | // | |
2574 | TTreeSRedirector *pcstream = new TTreeSRedirector("localBins.root","update"); | |
2575 | TFile *fCurrent = TFile::Open("SpaceChargeFluc10_1.root"); | |
2576 | TFile *fRef = TFile::Open("SpaceChargeFluc0_1.root"); | |
2577 | // | |
2578 | AliTPCSpaceCharge3D* distortion = ( AliTPCSpaceCharge3D*)fCurrent->Get("DistRef"); | |
2579 | AliTPCSpaceCharge3D* distortionRef = ( AliTPCSpaceCharge3D*)fRef->Get("DistRef"); | |
2580 | distortion->AddVisualCorrection(distortion,1); | |
2581 | distortionRef->AddVisualCorrection(distortionRef,2); | |
2582 | // | |
2583 | // | |
2584 | // | |
2585 | TVectorD normZR(125), normZRPhi(125), normZZ(125), normZPos(125); | |
2586 | TVectorD normZRChi2(125), normZRPhiChi2(125), normZZChi2(125); | |
2587 | // | |
2588 | for (Int_t iz =0; iz<125; iz++){ | |
2589 | Double_t z0 = -250+iz*4; | |
2590 | TLinearFitter fitterR(2,"pol1"); | |
2591 | TLinearFitter fitterRPhi(2,"pol1"); | |
2592 | TLinearFitter fitterZ(2,"pol1"); | |
2593 | Double_t xvalue[10]={0}; | |
2594 | //fitterR.AddPoint(xvalue,0,0.001/npointsZ); | |
2595 | //fitterRPhi.AddPoint(xvalue,0,0.000001/npointsZ); | |
2596 | //fitterZ.AddPoint(xvalue,0,0.001/npointsZ); | |
2597 | for (Int_t ipoint =0; ipoint<npointsZ; ipoint++){ | |
2598 | Double_t r0 = 85+gRandom->Rndm()*(245-85.); | |
2599 | Double_t phi0 = gRandom->Rndm()*TMath::TwoPi(); | |
2600 | // some problematic parts to be skipped - investigated later | |
2601 | if (TMath::Abs(distortion->GetCorrXYZ(r0*TMath::Cos(phi0), r0*TMath::Sin(phi0), z0,0,1))>50) continue; | |
2602 | if (TMath::Abs(distortion->GetCorrXYZ(r0*TMath::Cos(phi0), r0*TMath::Sin(phi0), z0,0,2))>50) continue; | |
2603 | if (TMath::Abs(distortion->GetCorrXYZ(r0*TMath::Cos(phi0), r0*TMath::Sin(phi0), z0,1,1))>20) continue; | |
2604 | if (TMath::Abs(distortion->GetCorrXYZ(r0*TMath::Cos(phi0), r0*TMath::Sin(phi0), z0,1,2))>20) continue; | |
2605 | if (TMath::Abs(distortion->GetCorrXYZ(r0*TMath::Cos(phi0), r0*TMath::Sin(phi0), z0,2,1))>50) continue; | |
2606 | if (TMath::Abs(distortion->GetCorrXYZ(r0*TMath::Cos(phi0), r0*TMath::Sin(phi0), z0,2,2))>50) continue; | |
2607 | // | |
2608 | // | |
2609 | xvalue[0]=distortion->GetCorrXYZ(r0*TMath::Cos(phi0), r0*TMath::Sin(phi0), z0,0,2); | |
2610 | fitterR.AddPoint(xvalue,distortion->GetCorrXYZ(r0*TMath::Cos(phi0), r0*TMath::Sin(phi0), z0,0,1)); | |
2611 | xvalue[0]=distortion->GetCorrXYZ(r0*TMath::Cos(phi0), r0*TMath::Sin(phi0), z0,1,2); | |
2612 | fitterRPhi.AddPoint(xvalue,distortion->GetCorrXYZ(r0*TMath::Cos(phi0), r0*TMath::Sin(phi0), z0,1,1)); | |
2613 | xvalue[0]=distortion->GetCorrXYZ(r0*TMath::Cos(phi0), r0*TMath::Sin(phi0), z0,2,2); | |
2614 | fitterZ.AddPoint(xvalue,distortion->GetCorrXYZ(r0*TMath::Cos(phi0), r0*TMath::Sin(phi0), z0,2,1)); | |
2615 | } | |
2616 | fitterR.Eval(); | |
2617 | fitterRPhi.Eval(); | |
2618 | fitterZ.Eval(); | |
2619 | normZR[iz]=fitterR.GetParameter(1); | |
2620 | normZRPhi[iz]=fitterRPhi.GetParameter(1); | |
2621 | normZZ[iz]=fitterZ.GetParameter(1); | |
2622 | normZRChi2[iz]=TMath::Sqrt(fitterR.GetChisquare()/fitterR.GetNpoints()); | |
2623 | normZRPhiChi2[iz]=TMath::Sqrt(fitterRPhi.GetChisquare()/fitterRPhi.GetNpoints()); | |
2624 | normZZChi2[iz]=TMath::Sqrt(fitterZ.GetChisquare()/fitterZ.GetNpoints()); | |
2625 | ||
2626 | normZPos[iz]=z0; | |
2627 | } | |
2628 | ||
2629 | { | |
2630 | (*pcstream)<<"meanNormZ"<< | |
2631 | "normZPos.="<<&normZPos<< | |
2632 | // | |
2633 | "normZR.="<<&normZR<< // mult. scaling to minimize R distortions | |
2634 | "normZRPhi.="<<&normZRPhi<< // mult. scaling | |
2635 | "normZZ.="<<&normZZ<< | |
2636 | // | |
2637 | "normZRChi2.="<<&normZRChi2<< // mult. scaling to minimize R distortions | |
2638 | "normZRPhiChi2.="<<&normZRPhiChi2<< // mult. scaling | |
2639 | "normZZChi2.="<<&normZZChi2<< | |
2640 | "\n"; | |
2641 | } | |
2642 | delete pcstream; | |
2643 | pcstream = new TTreeSRedirector("localBins.root","update"); | |
2644 | // | |
2645 | TTree * treeNormZ= (TTree*)pcstream->GetFile()->Get("meanNormZ"); | |
2646 | TGraphErrors * grZRfit= TStatToolkit::MakeGraphErrors( treeNormZ, "normZR.fElements:normZPos.fElements","",25,2,0.5); | |
2647 | TGraphErrors * grZRPhifit= TStatToolkit::MakeGraphErrors( treeNormZ, "normZRPhi.fElements:normZPos.fElements","",25,4,0.5); | |
2648 | grZRfit->Draw("alp"); | |
2649 | grZRPhifit->Draw("lp"); | |
2650 | ||
2651 | // | |
2652 | for (Int_t ipoint=0; ipoint<npoints; ipoint++){ | |
2653 | // | |
2654 | for (Int_t izNorm=0; izNorm<2; izNorm++){ | |
2655 | Double_t r0 = 85+gRandom->Rndm()*(245-85.); | |
2656 | Double_t z0 = gRandom->Rndm()*250; | |
2657 | Double_t phi0 = gRandom->Rndm()*TMath::TwoPi(); | |
2658 | Double_t fSector=18.*phi0/TMath::TwoPi(); | |
2659 | Double_t dSector=fSector-Int_t(fSector); | |
2660 | ||
2661 | ||
2662 | Int_t iz0 = TMath::Nint(125.*(z0+250.)/500.); | |
2663 | if (iz0<0) iz0=0; | |
2664 | if (iz0>=125) iz0=124; | |
2665 | Double_t rNorm=1,rphiNorm=1,zNorm=1; | |
2666 | if (izNorm==1){ | |
2667 | rNorm=normZR[iz0]; | |
2668 | rphiNorm=normZRPhi[iz0]; | |
2669 | zNorm=normZZ[iz0]; | |
2670 | } | |
2671 | ||
2672 | Double_t deltaR0 =distortion->GetCorrXYZ(r0*TMath::Cos(phi0), r0*TMath::Sin(phi0), z0,0,1); | |
2673 | Double_t deltaRPhi0=distortion->GetCorrXYZ(r0*TMath::Cos(phi0), r0*TMath::Sin(phi0), z0,1,1); | |
2674 | Double_t deltaZ0 =distortion->GetCorrXYZ(r0*TMath::Cos(phi0), r0*TMath::Sin(phi0), z0,2,1); | |
2675 | // | |
2676 | Double_t ddeltaR0 =distortion->GetCorrXYZ(r0*TMath::Cos(phi0), r0*TMath::Sin(phi0), z0,0,1)-rNorm*distortion->GetCorrXYZ(r0*TMath::Cos(phi0), r0*TMath::Sin(phi0), z0,0,2); | |
2677 | Double_t ddeltaRPhi0=distortion->GetCorrXYZ(r0*TMath::Cos(phi0), r0*TMath::Sin(phi0), z0,1,1)-rphiNorm*distortion->GetCorrXYZ(r0*TMath::Cos(phi0), r0*TMath::Sin(phi0), z0,1,2); | |
2678 | Double_t ddeltaZ0 =distortion->GetCorrXYZ(r0*TMath::Cos(phi0), r0*TMath::Sin(phi0), z0,2,1)-zNorm*distortion->GetCorrXYZ(r0*TMath::Cos(phi0), r0*TMath::Sin(phi0), z0,2,2); | |
2679 | // | |
2680 | // | |
2681 | TVectorD vecDMeanRPhi(20), vecDMeanR(20), vecDMeanZ(20), vecDPhi(20); | |
2682 | for (Int_t ideltaBin=0; ideltaBin<20; ideltaBin++){ | |
2683 | Double_t deltaPhi=ideltaBin*TMath::TwoPi()/360.; | |
2684 | vecDPhi[ideltaBin]=deltaPhi; | |
2685 | vecDMeanRPhi[ideltaBin]=0; | |
2686 | vecDMeanR[ideltaBin]=0; | |
2687 | vecDMeanZ[ideltaBin]=0; | |
2688 | ||
2689 | for (Int_t i=-2; i<=2; i++){ | |
2690 | vecDMeanR[ideltaBin]+=0.2*(distortion->GetCorrXYZ(r0*TMath::Cos(phi0+deltaPhi*i), r0*TMath::Sin(phi0+deltaPhi*i), z0,0,1)-rNorm*distortion->GetCorrXYZ(r0*TMath::Cos(phi0+deltaPhi*i), r0*TMath::Sin(phi0+deltaPhi*i), z0,0,2)); | |
2691 | vecDMeanRPhi[ideltaBin]+=0.2*(distortion->GetCorrXYZ(r0*TMath::Cos(phi0+deltaPhi*i), r0*TMath::Sin(phi0+deltaPhi*i), z0,1,1)-rphiNorm*distortion->GetCorrXYZ(r0*TMath::Cos(phi0+deltaPhi*i), r0*TMath::Sin(phi0+deltaPhi*i), z0,1,2)); | |
2692 | vecDMeanZ[ideltaBin]+=0.2*(distortion->GetCorrXYZ(r0*TMath::Cos(phi0+deltaPhi*i), r0*TMath::Sin(phi0+deltaPhi*i), z0,2,1)-zNorm*distortion->GetCorrXYZ(r0*TMath::Cos(phi0+deltaPhi*i), r0*TMath::Sin(phi0+deltaPhi*i), z0,2,2)); | |
2693 | } | |
2694 | } | |
2695 | (*pcstream)<<"meanDistortion"<< | |
2696 | "izNorm="<<izNorm<< // z normalizatio flag | |
2697 | "fSector="<<fSector<< // sector position | |
2698 | "dSector="<<dSector<< // distance to the sector boundary | |
2699 | // | |
2700 | "r0="<<r0<< | |
2701 | "z0="<<z0<< | |
2702 | "phi0="<<phi0<< | |
2703 | // | |
2704 | "rNorm="<<rNorm<< | |
2705 | "rphiNorm="<<rphiNorm<< | |
2706 | "zNorm="<<zNorm<< | |
2707 | // | |
2708 | "deltaR0="<<deltaR0<< | |
2709 | "deltaZ0="<<deltaZ0<< | |
2710 | "deltaRPhi0="<<deltaRPhi0<< | |
2711 | // | |
2712 | "ddeltaR0="<<ddeltaR0<< | |
2713 | "ddeltaZ0="<<ddeltaZ0<< | |
2714 | "ddeltaRPhi0="<<ddeltaRPhi0<< | |
2715 | // | |
2716 | "vecDMeanRPhi.="<<&vecDMeanRPhi<< | |
2717 | "vecDMeanR.="<<&vecDMeanR<< | |
2718 | "vecDMeanZ.="<<&vecDMeanZ<< | |
2719 | "vecDPhi.="<<&vecDPhi<< | |
2720 | "\n"; | |
2721 | } | |
2722 | } | |
2723 | delete pcstream; | |
2724 | pcstream = new TTreeSRedirector("localBins.root","update"); | |
2725 | /* | |
2726 | meanDistortion->Draw("vecDMeanR.fElements-ddeltaR0:vecDPhi.fElements","izNorm==1&&abs(phi0-pi)>0.2&&abs(ddeltaRPhi0)<10","") | |
2727 | ||
2728 | */ | |
2729 | } | |
2730 | ||
2731 | ||
2732 | void DrawLocalDistortionPlots(){ | |
2733 | // | |
2734 | // Draw summary residuals plots after applying z dependent q normalization. | |
2735 | // Plots used for the TPC TDR and internal note | |
2736 | // | |
2737 | // Two input trees are used: | |
2738 | // meanNormZ - here we store the result of the q ze dependent fits for Radial, RPhi and Z distortions | |
2739 | // meanDistortion - phi averaged residual distortion before and after applying q(z) dependent correction | |
2740 | // | |
2741 | // It is assumed that the correction table for randomly selected pile-up setup | |
2742 | // can be approximated rescaling the mean correction table. | |
2743 | // Rescaling coeficients are fitted separatelly in 125 z bins | |
2744 | // | |
2745 | ||
2746 | TTreeSRedirector *pcstream = new TTreeSRedirector("localBins.root","update"); | |
2747 | TTree * meanNormZ = (TTree*) pcstream->GetFile()->Get("meanNormZ"); | |
2748 | TTree * meanDistortion = (TTree*) pcstream->GetFile()->Get("meanDistortion"); | |
2749 | meanNormZ->SetMarkerStyle(25); meanNormZ->SetMarkerSize(0.5); | |
2750 | Int_t colors[5]={1,2,3,4,6}; | |
2751 | Int_t markers[5]={21,20,23,24,25}; | |
2752 | TH2 * his2D; | |
2753 | TObjArray arrFit(3); | |
2754 | // | |
2755 | // 1. Z dependence of the normalization is smooth function - about 10 bins to represent | |
2756 | // | |
2757 | TGraphErrors *graphZRnorm[100]= {0}; | |
2758 | TGraphErrors *graphZRRPhinorm[100]= {0}; | |
2759 | TCanvas * canvasRFit = new TCanvas("canvasRFit","canvasRFit",600,500); | |
2760 | TLegend * legendRFit = new TLegend(0.12,0.12,0.88,0.4,"Q normalization fit. #DeltaR=c(z)#DeltaR_{ref}"); | |
2761 | legendRFit->SetBorderSize(0); | |
2762 | for (Int_t igraph=0; igraph<5; igraph++){ | |
2763 | Int_t color = colors[igraph]; | |
2764 | Int_t marker = markers[igraph]; | |
2765 | Int_t event=gRandom->Rndm()*meanNormZ->GetEntries(); | |
2766 | graphZRnorm[igraph] = TStatToolkit::MakeGraphErrors( meanNormZ, "normZR.fElements:normZPos.fElements",TString::Format("Entry$==%d&&abs(normZPos.fElements)<220",event),marker,color,0.7); | |
2767 | graphZRnorm[igraph]->SetTitle(TString::Format("Pile-up setup=%d",igraph)); | |
2768 | graphZRnorm[igraph]->SetMinimum(0.60); | |
2769 | graphZRnorm[igraph]->SetMaximum(1.2); | |
2770 | graphZRnorm[igraph]->GetXaxis()->SetTitle("z (cm)"); | |
2771 | graphZRnorm[igraph]->GetYaxis()->SetTitle("c(z)"); | |
2772 | if (igraph==0) graphZRnorm[igraph]->Draw("alp"); | |
2773 | graphZRnorm[igraph]->Draw("lp"); | |
2774 | legendRFit->AddEntry( graphZRnorm[igraph],TString::Format("Pile-up setup=%d",event),"p"); | |
2775 | } | |
2776 | legendRFit->Draw(); | |
2777 | canvasRFit->SaveAs("canvasZRFit5Random.pdf"); // ~/hera/alice/miranov/SpaceCharge/Fluctuations/PbPbWithGain/dirmergeAll/dEpsilon20/canvasZRRPhiFit5Random.png | |
2778 | canvasRFit->SaveAs("canvasZRFit5Random.png"); | |
2779 | // | |
2780 | // 2. | |
2781 | // | |
2782 | TCanvas * canvasRRPhiFit = new TCanvas("canvasRRPhiFit","canvasRRPhiFit",600,500); | |
2783 | TLegend * legendRRPhiFit = new TLegend(0.12,0.12,0.88,0.4,"Q normalization fit. #DeltaR=c_{R}(z)#DeltaR_{ref} #DeltaR#phi=c_{R#phi}(z)#Delta_{R#phi}_{ref}"); | |
2784 | legendRRPhiFit->SetBorderSize(0); | |
2785 | for (Int_t igraph=0; igraph<5; igraph++){ | |
2786 | Int_t color = colors[igraph]; | |
2787 | Int_t marker = markers[igraph]; | |
2788 | Int_t event=gRandom->Rndm()*meanNormZ->GetEntries(); | |
2789 | graphZRRPhinorm[igraph] = TStatToolkit::MakeGraphErrors( meanNormZ, "normZR.fElements:normZRPhi.fElements",TString::Format("Entry$==%d&&abs(normZPos.fElements)<220",event),marker,color,0.7); | |
2790 | graphZRRPhinorm[igraph]->GetXaxis()->SetLimits(0.6,1.2); | |
2791 | graphZRRPhinorm[igraph]->SetTitle(TString::Format("Pile-up setup=%d",igraph)); | |
2792 | graphZRRPhinorm[igraph]->SetMinimum(0.6); | |
2793 | graphZRRPhinorm[igraph]->SetMaximum(1.2); | |
2794 | graphZRRPhinorm[igraph]->GetXaxis()->SetTitle("c_{R#phi}"); | |
2795 | graphZRRPhinorm[igraph]->GetYaxis()->SetTitle("c_{R}"); | |
2796 | if (igraph==0) graphZRRPhinorm[igraph]->Draw("alp"); | |
2797 | graphZRRPhinorm[igraph]->Draw("lp"); | |
2798 | legendRRPhiFit->AddEntry( graphZRRPhinorm[igraph],TString::Format("Pile-up setup=%d",event),"p"); | |
2799 | } | |
2800 | legendRRPhiFit->Draw(); | |
2801 | canvasRRPhiFit->SaveAs("canvasZRRPhiFit5Random.pdf"); // ~/hera/alice/miranov/SpaceCharge/Fluctuations/PbPbWithGain/dirmergeAll/dEpsilon20/canvasZRRPhiFit5Random.png | |
2802 | canvasRRPhiFit->SaveAs("canvasZRRPhiFit5Random.png"); | |
2803 | // | |
2804 | ||
2805 | // | |
2806 | // 3. Residual distortion after z dependent q distortion | |
2807 | // | |
2808 | gStyle->SetOptStat(0); | |
2809 | TH1D * hisRRes, *hisRRphiRes=0; | |
2810 | meanDistortion->Draw("ddeltaRPhi0:r0>>hisdRPhi0(40,85,245,100,-0.25,0.25)","abs(z0)<85.&&izNorm==1","colz"); | |
2811 | his2D = (TH2D*)meanDistortion->GetHistogram(); | |
2812 | his2D->FitSlicesY(0,0,-1,0,"QNR",&arrFit); | |
2813 | hisRRphiRes=(TH1D*)arrFit.At(2)->Clone(); | |
2814 | meanDistortion->Draw("ddeltaR0:r0>>hisdR(40,85,245,100,-0.25,0.25)","abs(z0)<85.&&izNorm==1","colz"); | |
2815 | his2D = (TH2D*)meanDistortion->GetHistogram(); | |
2816 | his2D->FitSlicesY(0,0,-1,0,"QNR",&arrFit); | |
2817 | hisRRes=(TH1D*)arrFit.At(2)->Clone(); | |
2818 | hisRRphiRes->SetMarkerStyle(25); | |
2819 | hisRRes->SetMarkerStyle(21); | |
2820 | hisRRphiRes->SetMarkerColor(2); | |
2821 | hisRRes->SetMarkerColor(4); | |
2822 | ||
2823 | hisRRes->GetXaxis()->SetTitle("R (cm)"); | |
2824 | hisRRes->GetYaxis()->SetTitle("#sigma_{res} (cm)"); | |
2825 | hisRRes->SetMinimum(0); | |
2826 | TCanvas * canvasResidualsFit = new TCanvas("canvasResidualsFit","canvasResidualsFit",600,500); | |
2827 | TLegend * legendRRPhiFitSigma = new TLegend(0.2,0.6,0.88,0.88,"Distortion residuals. RMS(#Delta-c(z)#Delta_{ref}) (|z|<85)"); | |
2828 | legendRRPhiFit->SetBorderSize(0); | |
2829 | hisRRes->Draw(""); | |
2830 | hisRRphiRes->Draw("same"); | |
2831 | legendRRPhiFitSigma->AddEntry(hisRRes,"Radial"); | |
2832 | legendRRPhiFitSigma->AddEntry(hisRRphiRes,"R#phi"); | |
2833 | legendRRPhiFitSigma->Draw(); | |
2834 | canvasResidualsFit->SaveAs("canvasResidualsFit.pdf"); //~/hera/alice/miranov/SpaceCharge/Fluctuations/PbPbWithGain/dirmergeAll/dEpsilon20/canvasResidualsFit.png | |
2835 | canvasResidualsFit->SaveAs("canvasResidualsFit.png"); | |
2836 | // | |
2837 | // 4. Residual distortion after z dependent q distortion - local phi average | |
2838 | // | |
2839 | TH1D * hisRResPhi, *hisRRphiResPhi=0; | |
2840 | meanDistortion->Draw("ddeltaR0-vecDMeanR.fElements:vecDPhi.fElements>>hisRResPhi(18,0.0,0.32,100,-0.3,0.3)","abs(z0)<85.&&izNorm==1&&r0<120","colz",100000); | |
2841 | his2D = (TH2D*)meanDistortion->GetHistogram()->Clone(); | |
2842 | his2D->FitSlicesY(0,0,-1,0,"QNR",&arrFit); | |
2843 | hisRResPhi=(TH1D*)arrFit.At(2)->Clone(); | |
2844 | // | |
2845 | meanDistortion->Draw("ddeltaRPhi0-vecDMeanRPhi.fElements:vecDPhi.fElements>>hisRRphResPhi(18,0.0,0.32,100,-0.3,0.3)","abs(z0)<85.&&izNorm==1","colz",100000); | |
2846 | his2D = (TH2D*)meanDistortion->GetHistogram()->Clone(); | |
2847 | his2D->FitSlicesY(0,0,-1,0,"QNR",&arrFit); | |
2848 | hisRRphiResPhi=(TH1D*)arrFit.At(2)->Clone(); | |
2849 | // | |
2850 | hisRRphiResPhi->SetMarkerStyle(25); | |
2851 | hisRResPhi->SetMarkerStyle(21); | |
2852 | hisRRphiResPhi->SetMarkerColor(2); | |
2853 | hisRResPhi->SetMarkerColor(4); | |
2854 | hisRResPhi->GetXaxis()->SetTitle("#Delta#phi bin width"); | |
2855 | hisRResPhi->GetYaxis()->SetTitle("#sigma_{res} (cm)"); | |
2856 | hisRResPhi->SetMinimum(0); | |
2857 | hisRResPhi->SetMaximum(1.5*hisRResPhi->GetMaximum()); | |
2858 | gStyle->SetOptStat(0); | |
2859 | TCanvas * canvasResidualsFitPhi = new TCanvas("canvasResidualsFitPhi","canvasResidualsFitPhi",600,500); | |
2860 | TLegend * legendRRPhiFitSigmaPhi = new TLegend(0.2,0.6,0.88,0.88,"Distortion residuals-mean in bin. RMS((#Delta-c(z)#Delta_{ref})) (|z|<85)"); | |
2861 | { | |
2862 | hisRResPhi->Draw(""); | |
2863 | hisRRphiResPhi->Draw("same"); | |
2864 | legendRRPhiFitSigmaPhi->AddEntry(hisRResPhi,"Radial"); | |
2865 | legendRRPhiFitSigmaPhi->SetBorderSize(0); | |
2866 | legendRRPhiFitSigmaPhi->AddEntry(hisRRphiResPhi,"R#phi"); | |
2867 | legendRRPhiFitSigmaPhi->Draw(); | |
2868 | } | |
2869 | ||
2870 | canvasResidualsFitPhi->SaveAs("canvasResidualsFitPhi.pdf"); //~/hera/alice/miranov/SpaceCharge/Fluctuations/PbPbWithGain/dirmergeAll/dEpsilon20/canvasResidualsFit.png | |
2871 | canvasResidualsFitPhi->SaveAs("canvasResidualsFitPhi.png"); | |
2872 | ||
2873 | ||
2874 | } | |
2875 | ||
2876 |