]> git.uio.no Git - u/mrichter/AliRoot.git/blob - ITS/macrosSDD/PlotOutputQAtrainSDD.C
remove unnecessary return
[u/mrichter/AliRoot.git] / ITS / macrosSDD / PlotOutputQAtrainSDD.C
1 #if !defined(__CINT__) || defined(__MAKECINT__)
2 #include <TH1F.h>
3 #include <TH2F.h>
4 #include <TF1.h>
5 #include <TPad.h>
6 #include <TGraphErrors.h>
7 #include <TROOT.h>
8 #include <TFile.h>
9 #include <TTree.h>
10 #include <TGrid.h>
11 #include <TGridResult.h>
12 #include <TMath.h>
13 #include <TCanvas.h>
14 #include <TStyle.h>
15 #include <TLatex.h>
16 #include "AliITSgeomTGeo.h"
17 #endif
18
19 Double_t LangausFun(Double_t *x, Double_t *par);
20
21
22 void PlotOutputQAtrainSDD(TString option="local", 
23                           TString fileName="QAresults.root", 
24                           Int_t nRun=0,
25                           Int_t year=2010, 
26                           TString period="LHC10e"){
27
28   gStyle->SetOptStat(0);
29   //  gStyle->SetOptTitle(0);
30   TFile *f;
31   TString path;
32
33   if(option.Contains("local")){
34     f=new TFile(fileName.Data());
35   }else{
36     TGrid::Connect("alien:");
37     path=Form("/alice/data/%d/%s/%09d/ESDs/",year,period.Data(),nRun);
38     if(!gGrid||!gGrid->IsConnected()) {
39       printf("gGrid not found! exit macro\n");
40       return;
41     }
42     TGridResult *gr = gGrid->Query(path,fileName);
43     Int_t nFiles = gr->GetEntries();
44     if (nFiles < 1){
45       printf("QA file for run %d not found\n",nRun);
46       return;
47     }
48     printf("================>%d files found\n", nFiles);
49     Int_t theFile=0;
50     Int_t maxVer=0;
51     if (nFiles > 1){
52       for (Int_t iFil = 0; iFil <nFiles ; iFil++) { 
53         fileName=Form("%s",gr->GetKey(iFil,"turl"));
54         TString cutFilename=fileName.ReplaceAll("/QAresults.root","");
55         Int_t last=cutFilename.Sizeof()-3;
56         cutFilename.Remove(0,last);
57         Int_t qaver=atoi(cutFilename.Data());
58         if(qaver>maxVer){
59           maxVer=qaver;
60           theFile=iFil;
61         }
62       }
63     }
64     fileName=Form("%s",gr->GetKey(theFile,"turl"));
65     f=TFile::Open(fileName.Data());
66   }
67
68   TDirectoryFile* df=(TDirectoryFile*)f->Get("SDD_Performance");
69   if(!df){
70     printf("SDD_Performance MISSING -> Exit\n");
71     return;
72   }
73   TList* l=(TList*)df->Get("coutputRP");
74   if(!df){
75     printf("coutputRP TList MISSING -> Exit\n");
76     return;
77   }
78
79   TH1F* hcllay=(TH1F*)l->FindObject("hCluInLay");
80   TH1F* hapmod=(TH1F*)l->FindObject("hAllPmod");
81   TH1F* hgpmod=(TH1F*)l->FindObject("hGoodPmod");
82   TH1F* hmpmod=(TH1F*)l->FindObject("hMissPmod");
83   TH1F* hbrmod=(TH1F*)l->FindObject("hBadRegmod");
84   TH1F* hskmod=(TH1F*)l->FindObject("hSkippedmod");
85   TH1F* hoamod=(TH1F*)l->FindObject("hOutAccmod");
86   TH1F* hnrmod=(TH1F*)l->FindObject("hNoRefitmod");
87
88   //  TH1F* hapxl=(TH1F*)l->FindObject("hAllPxloc");
89   TH1F* hgpxl=(TH1F*)l->FindObject("hGoodPxloc");
90   TH1F* hmpxl=(TH1F*)l->FindObject("hMissPxloc");
91   TH1F* hbrxl=(TH1F*)l->FindObject("hBadRegxloc");
92   //  TH1F* hapzl=(TH1F*)l->FindObject("hAllPzloc");
93   TH1F* hgpzl=(TH1F*)l->FindObject("hGoodPzloc");
94   TH1F* hmpzl=(TH1F*)l->FindObject("hMissPzloc");
95   TH1F* hbrzl=(TH1F*)l->FindObject("hBadRegzloc");
96
97   TH2F* hClSizAn=(TH2F*)l->FindObject("hCluSizAn");
98   TH2F* hClSizTb=(TH2F*)l->FindObject("hCluSizTb");
99
100   TH2F* hdedx3=(TH2F*)l->FindObject("hdEdxL3VsP");
101   TH2F* hdedx4=(TH2F*)l->FindObject("hdEdxL4VsP");
102   TH2F* hdedxmod=(TH2F*)l->FindObject("hdEdxVsMod");
103   
104
105   TH1F* hmodR=(TH1F*)l->FindObject("hRPMod");
106   TH1F* hmodT=(TH1F*)l->FindObject("hTPMod");
107   TH1F* hgamod=(TH1F*)l->FindObject("hGAMod");
108
109   TH2F* h2dmodR3=new TH2F("h2dmodR3","Rec Points, Layer 3",6,0.5,6.5,14,0.5,14.5);
110   TH2F* h2dmodR4=new TH2F("h2dmodR4","Rec Points, Layer 4",8,0.5,8.5,22,0.5,22.5);
111   TH2F* h2dmodT3=new TH2F("h2dmodT3","Track Points, Layer 3",6,0.5,6.5,14,0.5,14.5);
112   TH2F* h2dmodT4=new TH2F("h2dmodT4","Track Points, Layer 4",8,0.5,8.5,22,0.5,22.5);
113   TH2F* h2dmodR3N=new TH2F("h2dmodR3N","Rec Points/GoodAnode/Event, Layer 3",6,0.5,6.5,14,0.5,14.5);
114   TH2F* h2dmodR4N=new TH2F("h2dmodR4N","Rec Points/GoodAnode/Event, Layer 4",8,0.5,8.5,22,0.5,22.5);
115   TH2F* h2dmodT3N=new TH2F("h2dmodT3N","Track Points/GoodAnode/Event, Layer 3",6,0.5,6.5,14,0.5,14.5);
116   TH2F* h2dmodT4N=new TH2F("h2dmodT4N","Track Points/GoodAnode/Event, Layer 4",8,0.5,8.5,22,0.5,22.5);
117   TH1F* hmodRN=new TH1F("hmodRN","Normalized Rec Points per Module",260,239.5,499.5);
118   TH1F* hmodTN=new TH1F("hmodTN","Normalized Track Points per Module",260,239.5,499.5);
119
120   TH1F* hev=(TH1F*)l->FindObject("hNEvents");
121   Int_t nTotEvents=hev->GetBinContent(2);
122   Int_t nTrigEvents=hev->GetBinContent(3);
123   Int_t nEvents=nTotEvents;
124   printf("---- Statistics ----\n");
125   printf("Number of Events = %d\n",nTotEvents);
126   if(nTrigEvents>0){ 
127     printf("Number of Triggered Events = %d\n",nTrigEvents);
128     nEvents=nTrigEvents;
129   }else{
130     printf("No request on the trigger done whenrunning the task\n");
131   }
132   Int_t bestMod=0;
133   for(Int_t iMod=0; iMod<260;iMod++){
134     Int_t gda=(Int_t)hgamod->GetBinContent(iMod+1);
135     if(gda>bestMod) bestMod=gda;
136   }
137   Int_t nChunks=1;
138   if(bestMod>512){
139     nChunks=(Int_t)(bestMod/512.+0.5);
140   }
141   printf("Chunks merged = %d\n",nChunks);
142   hgamod->Scale(1./nChunks);
143   TCanvas* cgan=new TCanvas("cgan","Good Anodes");
144   cgan->SetTickx();
145   cgan->SetTicky();
146   hgamod->SetMarkerStyle(20);
147   hgamod->SetMarkerSize(0.6);
148   hgamod->SetMinimum(-10.);
149   hgamod->Draw("P");
150   hgamod->GetXaxis()->SetTitle("SDD Module Id");
151   hgamod->GetYaxis()->SetTitle("Number of good anodes");
152   cgan->Update();
153
154   printf("---- Modules with > 2%% of bad anodes ----\n");
155   for(Int_t iMod=0; iMod<260; iMod++){
156     Int_t idMod=iMod+240;
157     Float_t rps=hmodR->GetBinContent(iMod+1);
158     Float_t tps=hmodT->GetBinContent(iMod+1);
159     Float_t ga=hgamod->GetBinContent(iMod+1);
160     if(ga<500){
161       printf("Module %d - Good Anodes = %d\n",idMod,(Int_t)ga);
162     }
163     Float_t rpsN=0.;
164     Float_t tpsN=0.;
165     Float_t erpsN=0.;
166     Float_t etpsN=0.;
167     if(ga>0){
168       rpsN=rps/ga/(Float_t)nEvents;
169       tpsN=tps/ga/(Float_t)nEvents;
170       erpsN=TMath::Sqrt(rps)/ga/(Float_t)nEvents;
171       etpsN=TMath::Sqrt(tps)/ga/(Float_t)nEvents;
172     }
173     hmodRN->SetBinContent(iMod+1,rpsN);
174     hmodTN->SetBinContent(iMod+1,tpsN);
175     hmodRN->SetBinError(iMod+1,erpsN);
176     hmodTN->SetBinError(iMod+1,etpsN);
177     Int_t iLay,iLad,iDet;
178     AliITSgeomTGeo::GetModuleId(idMod,iLay,iLad,iDet);
179     if(iLay==3){
180       h2dmodR3->SetBinContent(iDet,iLad,rps);
181       h2dmodT3->SetBinContent(iDet,iLad,tps);
182       h2dmodR3N->SetBinContent(iDet,iLad,rpsN);
183       h2dmodT3N->SetBinContent(iDet,iLad,tpsN);
184     }
185     else if(iLay==4){
186       h2dmodR4->SetBinContent(iDet,iLad,rps);
187       h2dmodT4->SetBinContent(iDet,iLad,tps);
188       h2dmodR4N->SetBinContent(iDet,iLad,rpsN);
189       h2dmodT4N->SetBinContent(iDet,iLad,tpsN);
190     }
191   }
192
193   gStyle->SetPalette(1);
194
195   if(hmodR->GetEntries()>0){
196     TCanvas* cmodR=new TCanvas("cmodR","RecPoint Occup",1200,1200);
197     cmodR->Divide(2,3);
198     cmodR->cd(1);
199     gPad->SetLeftMargin(0.14);
200     hmodR->Draw();
201     hmodR->GetXaxis()->SetTitle("SDD Module Id");
202     hmodR->GetYaxis()->SetTitle("RecPoints");
203     hmodR->GetYaxis()->SetTitleOffset(1.55);
204     cmodR->cd(2);
205     gPad->SetLeftMargin(0.14);
206     hmodRN->Draw("E");
207     hmodRN->GetXaxis()->SetTitle("SDD Module Id");
208     hmodRN->GetYaxis()->SetTitle("RecPoints/GoodAnode/Event");
209     hmodRN->GetYaxis()->SetTitleOffset(1.55);
210     cmodR->cd(3);
211     gPad->SetLeftMargin(0.14);
212     h2dmodR3->Draw("colz");
213     h2dmodR3->GetXaxis()->SetTitle("Detector");
214     h2dmodR3->GetYaxis()->SetTitle("Ladder");
215     cmodR->cd(4);
216     gPad->SetLeftMargin(0.14);
217     h2dmodR3N->Draw("colz");
218     h2dmodR3N->GetXaxis()->SetTitle("Detector");
219     h2dmodR3N->GetYaxis()->SetTitle("Ladder");
220     cmodR->cd(5);
221     gPad->SetLeftMargin(0.14);
222     h2dmodR4->Draw("colz");
223     h2dmodR4->GetXaxis()->SetTitle("Detector");
224     h2dmodR4->GetYaxis()->SetTitle("Ladder");
225     cmodR->cd(6);
226     gPad->SetLeftMargin(0.14);
227     gPad->SetLeftMargin(0.14);
228     h2dmodR4N->Draw("colz");
229     h2dmodR4N->GetXaxis()->SetTitle("Detector");
230     h2dmodR4N->GetYaxis()->SetTitle("Ladder");
231     cmodR->Update();
232   }
233     
234   TCanvas* cmodT=new TCanvas("cmodT","TrackPoint Occup",1200,1200);
235   cmodT->Divide(2,3);
236   cmodT->cd(1);
237   hmodT->Draw();
238   hmodT->GetXaxis()->SetTitle("SDD Module Id");
239   hmodT->GetYaxis()->SetTitle("TrackPoints");
240   hmodT->GetYaxis()->SetTitleOffset(1.4);
241   cmodT->cd(2);
242   gPad->SetLeftMargin(0.14);
243   hmodTN->Draw("E");
244   hmodTN->GetXaxis()->SetTitle("SDD Module Id");
245   hmodTN->GetYaxis()->SetTitle("TrackPoints");
246   hmodTN->GetYaxis()->SetTitleOffset(1.4);
247   cmodT->cd(3);
248   gPad->SetLeftMargin(0.14);
249   h2dmodT3->Draw("colz");
250   h2dmodT3->GetXaxis()->SetTitle("Detector");
251   h2dmodT3->GetYaxis()->SetTitle("Ladder");
252   cmodT->cd(4);
253   gPad->SetLeftMargin(0.14);
254   h2dmodT3N->Draw("colz");
255   h2dmodT3N->GetXaxis()->SetTitle("Detector");
256   h2dmodT3N->GetYaxis()->SetTitle("Ladder");  
257   cmodT->cd(5);
258   gPad->SetLeftMargin(0.14);
259   h2dmodT4->Draw("colz");
260   h2dmodT4->GetXaxis()->SetTitle("Detector");
261   h2dmodT4->GetYaxis()->SetTitle("Ladder");
262   cmodT->cd(6);
263   gPad->SetLeftMargin(0.14);
264   h2dmodT4N->Draw("colz");
265   h2dmodT4N->GetXaxis()->SetTitle("Detector");
266   h2dmodT4N->GetYaxis()->SetTitle("Ladder");
267   cmodT->Update();
268
269   TH1F* htplad3=(TH1F*)l->FindObject("hTPLad3");
270   TH1F* htplad4=(TH1F*)l->FindObject("hTPLad4");
271   TH1F* hgalad3=(TH1F*)l->FindObject("hGALad3");
272   TH1F* hgalad4=(TH1F*)l->FindObject("hGALad4");
273   TH1F* hnormOcc3=new TH1F("hnormOcc3","",14,-0.5,13.5);
274   TH1F* hnormOcc4=new TH1F("hnormOcc4","",22,-0.5,21.5);
275   Bool_t tpok=kFALSE;
276   for(Int_t ilad=0;ilad<14;ilad++){ 
277     Float_t occ=0.;
278     Float_t eocc=0.;
279     Int_t gd3=hgalad3->GetBinContent(ilad+1);
280     if(gd3>0){
281       occ=(Float_t)htplad3->GetBinContent(ilad+1)/(Float_t)gd3/(Float_t)nEvents;
282       eocc=TMath::Sqrt((Float_t)htplad3->GetBinContent(ilad+1))/(Float_t)gd3/(Float_t)nEvents;
283     }
284     hnormOcc3->SetBinContent(ilad+1,occ);
285     hnormOcc3->SetBinError(ilad+1,eocc);
286   }
287   for(Int_t ilad=0;ilad<22;ilad++){ 
288     Float_t occ=0.;
289     Float_t eocc=0.;
290     Int_t gd4=hgalad4->GetBinContent(ilad+1);
291     if(gd4>0){
292       occ=(Float_t)htplad4->GetBinContent(ilad+1)/(Float_t)gd4/(Float_t)nEvents;
293       eocc=TMath::Sqrt((Float_t)htplad4->GetBinContent(ilad+1))/(Float_t)gd4/(Float_t)nEvents;
294     }
295     hnormOcc4->SetBinContent(ilad+1,occ);
296     hnormOcc4->SetBinError(ilad+1,eocc);
297   }
298
299  
300   if(tpok){
301     TCanvas* cn0=new TCanvas("cn0","Normalized Ladder Occupancy",1400,600);
302     cn0->Divide(2,1);
303     cn0->cd(1);
304     gPad->SetLeftMargin(0.14);
305     hnormOcc3->Draw();
306     hnormOcc3->GetXaxis()->SetTitle("Ladder number (layer 3)");
307     hnormOcc3->GetYaxis()->SetTitle("TrackPoints/GoodAnodes/Events");
308     hnormOcc3->GetYaxis()->SetTitleOffset(1.35);
309     cn0->cd(2);
310     gPad->SetLeftMargin(0.14);
311     hnormOcc4->Draw();
312     hnormOcc4->GetXaxis()->SetTitle("Ladder number (layer 4)");
313     hnormOcc4->GetYaxis()->SetTitle("TrackPoints/GoodAnode/Events");
314     hnormOcc4->GetYaxis()->SetTitleOffset(1.35);
315     cn0->Update();
316   }
317   if(hcllay){
318     Double_t norm=hcllay->GetBinContent(1);
319     hcllay->Scale(1./norm);
320     hcllay->SetTitle("");
321     hcllay->GetXaxis()->SetRange(2,7);
322     hcllay->SetMinimum(0.);
323     hcllay->SetMaximum(1.1);
324     hcllay->SetMarkerStyle(23);
325     TCanvas* ceffL=new TCanvas("ceffL","PointPerLayer",1000,600);
326     ceffL->SetGridy();
327     hcllay->Draw();
328     hcllay->GetXaxis()->SetTitle("Layer");
329     hcllay->GetYaxis()->SetTitle("Fraction of tracks with point in layer");
330     ceffL->Update();
331   }
332
333   hgpmod->SetTitle("");
334   TCanvas* ceff0=new TCanvas("ceff0","ModuleIndexInfo",1000,600);
335   hgpmod->Draw();
336   hgpmod->GetXaxis()->SetTitle("SDD Module Id");
337   hgpmod->GetYaxis()->SetTitle("Number of tracks");
338   hmpmod->SetLineColor(2);
339   hmpmod->SetMarkerColor(2);
340   hmpmod->SetMarkerStyle(22);
341   hmpmod->SetMarkerSize(0.5);
342   hmpmod->Draw("psame");
343   hbrmod->SetLineColor(kGreen+1);
344   hbrmod->SetMarkerColor(kGreen+1);
345   hbrmod->SetMarkerStyle(20);
346   hbrmod->SetMarkerSize(0.5);
347   hbrmod->Draw("same");
348   hskmod->SetLineColor(kYellow);
349   hskmod->Draw("same");
350   hoamod->SetLineColor(4);
351   hoamod->Draw("same");
352   hnrmod->SetLineColor(6);
353   hnrmod->Draw("same");
354   TLatex* t1=new TLatex(0.7,0.85,"Good Point");
355   t1->SetNDC();
356   t1->SetTextColor(1);
357   t1->Draw();
358   TLatex* t2=new TLatex(0.7,0.8,"Missing Point");
359   t2->SetNDC();
360   t2->SetTextColor(2);
361   t2->Draw();
362   TLatex* t3=new TLatex(0.7,0.75,"Bad Region");
363   t3->SetNDC();
364   t3->SetTextColor(kGreen+1);
365   t3->Draw();
366   ceff0->Update();
367
368   TH1F* heff=new TH1F("heff","",260,239.5,499.5);
369   for(Int_t imod=0; imod<260;imod++){
370     Float_t numer=hgpmod->GetBinContent(imod+1)+hbrmod->GetBinContent(imod+1)+hoamod->GetBinContent(imod+1)+hnrmod->GetBinContent(imod+1);
371     Float_t denom=hapmod->GetBinContent(imod+1);
372     Float_t eff=0.;
373     Float_t erreff=0.;
374     if(denom>0){
375       eff=numer/denom;
376       erreff=TMath::Sqrt(eff*(1-eff)/denom);
377     }
378     heff->SetBinContent(imod+1,eff);
379     heff->SetBinError(imod+1,erreff);
380   }
381
382   printf("---- Modules with efficiency < 90%% ----\n");
383   TCanvas* ceff1=new TCanvas("ceff1","Efficiency",1000,600);
384   heff->Draw();
385   heff->GetXaxis()->SetTitle("SDD Module Id");
386   heff->GetYaxis()->SetTitle("Fraction of tracks with point in good region");
387   for(Int_t ibin=1; ibin<=heff->GetNbinsX(); ibin++){
388     Float_t e=heff->GetBinContent(ibin);
389     if(e<0.9){
390       Int_t iMod=(Int_t)heff->GetBinCenter(ibin);
391       Int_t lay,lad,det;
392       AliITSgeomTGeo::GetModuleId(iMod,lay,lad,det);
393       printf("Module %d - Layer %d Ladder %2d Det %d  -   Eff. %.3f\n",iMod,lay,lad,det,heff->GetBinContent(ibin));
394     }
395   }
396   ceff1->Update();
397
398   if(hgpxl){
399     hgpxl->SetTitle("");
400     hgpzl->SetTitle("");
401     TCanvas* ceff2=new TCanvas("ceff2","LocalCoord",1000,600);
402     ceff2->Divide(2,1);
403     ceff2->cd(1);
404     hgpxl->Draw();
405     hgpxl->GetXaxis()->SetTitle("Xlocal (cm)");
406     hgpxl->GetYaxis()->SetTitle("Number of tracks");
407     hmpxl->SetLineColor(2);
408     hmpxl->SetMarkerColor(2);
409     hmpxl->SetMarkerStyle(22);
410     hmpxl->SetMarkerSize(0.5);
411     hmpxl->Draw("psame");
412     hbrxl->SetLineColor(kGreen+1);
413     hbrxl->SetMarkerColor(kGreen+1);
414     hbrxl->SetMarkerStyle(20);
415     hbrxl->SetMarkerSize(0.5);
416     hbrxl->Draw("same");
417     t1->Draw();
418     t2->Draw();
419     t3->Draw();
420     ceff2->cd(2);
421     hgpzl->Draw();
422     hgpzl->GetXaxis()->SetTitle("Zlocal (cm)");
423     hgpzl->GetYaxis()->SetTitle("Number of tracks");
424     hmpzl->SetLineColor(2);
425     hmpzl->SetMarkerColor(2);
426     hmpzl->SetMarkerStyle(22);
427     hmpzl->SetMarkerSize(0.5);
428     hmpzl->Draw("psame");
429     hbrzl->SetLineColor(kGreen+1);
430     hbrzl->SetMarkerColor(kGreen+1);
431     hbrzl->SetMarkerStyle(20);
432     hbrzl->SetMarkerSize(0.5);
433     hbrzl->Draw("same");
434     t1->Draw();
435     t2->Draw();
436     t3->Draw();
437     ceff2->Update();
438   }
439
440
441   if(hClSizAn && hClSizTb){
442     TCanvas* ccs=new TCanvas("ccs","Cluster Size",1200,600);
443     ccs->Divide(2,1);
444     ccs->cd(1);
445     gPad->SetLogz();
446     gPad->SetRightMargin(0.12);
447     hClSizAn->Draw("colz");
448     hClSizAn->GetXaxis()->SetTitle("Drift Time (ns)");
449     hClSizAn->GetYaxis()->SetTitle("Cluster Size - Anodes");
450     ccs->cd(2);
451     gPad->SetLogz();
452     gPad->SetRightMargin(0.12);
453     hClSizTb->Draw("colz");
454     hClSizTb->GetXaxis()->SetTitle("Drift Time (ns)");
455     hClSizTb->GetYaxis()->SetTitle("Cluster Size - Time Bins");
456     ccs->Update();
457   }
458
459   TH1F* htimR=(TH1F*)l->FindObject("hDrTimRP");
460   TH1F* htimT=(TH1F*)l->FindObject("hDrTimTPAll");
461   TH1F* htimTe=(TH1F*)l->FindObject("hDrTimTPExtra");
462   TH1F* htimTne=(TH1F*)l->FindObject("hDrTimTPNoExtra");
463   htimR->Rebin(4);
464   htimT->Rebin(4);
465   htimTe->Rebin(4);
466   htimTne->Rebin(4);
467   htimR->SetLineWidth(2);
468   htimT->SetLineWidth(2);
469   htimTe->SetLineWidth(2);
470   htimTne->SetLineWidth(2);
471
472   TCanvas* ctim=new TCanvas("ctim","DriftTime",1400,600);
473   ctim->Divide(2,1);
474   ctim->cd(1);
475   htimR->Draw(); 
476   htimR->GetYaxis()->SetTitleOffset(1.2);
477   htimR->GetXaxis()->SetTitle("Drift Time (ns)");
478   htimR->GetYaxis()->SetTitle("RecPoints");
479   ctim->cd(2);
480   htimT->Draw();
481   htimTe->SetLineColor(2);
482   htimTe->Draw("same");
483   htimTne->SetLineColor(4);
484   htimTne->Draw("same");
485   htimT->GetXaxis()->SetTitle("Drift Time (ns)");
486   htimT->GetYaxis()->SetTitle("TrackPoints");
487   htimT->GetYaxis()->SetTitleOffset(1.2);
488   TLatex* ta=new TLatex(0.5,0.85,"All Clusters");
489   ta->SetNDC();
490   ta->SetTextColor(1);
491   ta->Draw();
492   TLatex* te=new TLatex(0.5,0.8,"Extra Clusters");
493   te->SetNDC();
494   te->SetTextColor(2);
495   te->Draw();
496   TLatex* tn=new TLatex(0.5,0.75,"Non-Extra Clusters");
497   tn->SetNDC();
498   tn->SetTextColor(4);
499   tn->Draw();
500   ctim->Update();
501
502   TCanvas* cdedx=new TCanvas("cdedx","dedx",1400,600);
503   cdedx->Divide(3,1);
504   cdedx->cd(1);
505   gPad->SetLogz();
506   hdedx3->Draw("col");
507   hdedx3->GetXaxis()->SetTitle("P (GeV/c)");
508   hdedx3->GetYaxis()->SetTitle("dE/dx (keV/300 #mum) Layer 3");
509   hdedx3->GetYaxis()->SetTitleOffset(1.25);
510   cdedx->cd(2);
511   gPad->SetLogz();
512   hdedx4->Draw("col");
513   hdedx4->GetXaxis()->SetTitle("P (GeV/c)");
514   hdedx4->GetYaxis()->SetTitle("dE/dx (keV/300 #mum) Layer 4");
515   hdedx4->GetYaxis()->SetTitleOffset(1.25);
516   cdedx->cd(3);
517   gPad->SetLogz();
518   hdedxmod->Draw("col"); 
519   hdedxmod->GetXaxis()->SetTitle("SDD Module Id");
520   hdedxmod->GetYaxis()->SetTitle("dE/dx (keV/300 #mum)");
521   hdedxmod->GetYaxis()->SetTitleOffset(1.25);
522   cdedx->Update();
523
524   printf("---- dE/dx vs.DriftTime ----\n");
525   TCanvas* csig=new TCanvas("csig","dedx vs. DriftTime",1000,700);
526   csig->Divide(4,2);
527   TH1F* hSigTim[8];
528   TGraphErrors* gmpv=new TGraphErrors(0);
529   TGraphErrors* gsigg=new TGraphErrors(0);
530   TGraphErrors* gsigl=new TGraphErrors(0);
531   gmpv->SetTitle("");
532   gsigg->SetTitle("");
533   gsigl->SetTitle("");
534   Int_t iPoint=0;
535   TF1 *lfun = new TF1("LangausFun",LangausFun,50.,300.,4);
536   for(Int_t it=0; it<8; it++){
537     hSigTim[it]=(TH1F*)l->FindObject(Form("hSigTimeInt%d",it));
538     csig->cd(it+1);
539     hSigTim[it]->Draw();
540     if(hSigTim[it]->GetEntries()>200){
541       lfun->SetLineWidth(2);
542       lfun->SetParameter(0,5.);
543       lfun->SetParameter(1,80.);
544       lfun->SetParameter(2,hSigTim[it]->GetEntries()/10.);
545       lfun->SetParameter(3,10.);
546       lfun->SetParLimits(3,0.,20);
547
548       hSigTim[it]->Fit("LangausFun","QLR");
549       hSigTim[it]->GetXaxis()->SetTitle(Form("dE/dx, time interval %d",it+1));
550       hSigTim[it]->GetYaxis()->SetTitle("Events");
551       Float_t mpv=lfun->GetParameter(1);
552       Float_t empv=lfun->GetParError(1);
553       Float_t sig=lfun->GetParameter(3);
554       Float_t esig=lfun->GetParError(3);
555       Float_t sigl=lfun->GetParameter(0);
556       Float_t esigl=lfun->GetParError(0);
557       gmpv->SetPoint(iPoint,(Float_t)it,mpv);
558       gmpv->SetPointError(iPoint,0.,empv);
559       gsigg->SetPoint(iPoint,(Float_t)it,sig);
560       gsigg->SetPointError(iPoint,0.,esig);
561       gsigl->SetPoint(iPoint,(Float_t)it,sigl);
562       gsigl->SetPointError(iPoint,0.,esigl);
563       ++iPoint;
564       gPad->Update();
565       printf("Bin %d - MPV=%.3f  \t SigmaLandau=%.3f  \t SigmaGaus=%.3f\n",it,mpv,sigl,sig);
566     }
567   }
568
569   TCanvas* cpars=new TCanvas("cpars","Params",800,900);
570   cpars->Divide(1,3,0.01,0.);
571   cpars->cd(1);
572   gPad->SetLeftMargin(0.14);
573   gPad->SetFrameLineWidth(2);
574   gPad->SetTickx();
575   gPad->SetTicky();
576   gmpv->SetMarkerStyle(20);
577   //  gmpv->SetMinimum(0);
578   //  gmpv->SetMaximum(120);
579   gmpv->GetXaxis()->SetLimits(-0.2,6.8);
580   gmpv->Draw("AP");
581   //  gmpv->GetXaxis()->SetTitle("Drift Time interval number");
582   gmpv->GetYaxis()->SetTitle("Landau MPV (keV)");
583   gmpv->GetXaxis()->SetTitleSize(0.05);
584   gmpv->GetYaxis()->SetTitleSize(0.05);
585   gmpv->GetYaxis()->SetTitleOffset(1.2);
586   cpars->cd(2);
587   gPad->SetLeftMargin(0.14);
588   gPad->SetFrameLineWidth(2);
589   gPad->SetTickx();
590   gPad->SetTicky();
591   gsigl->SetMarkerStyle(20);
592   gsigl->GetXaxis()->SetLimits(-0.2,6.8);
593   gsigl->Draw("AP");
594   //  gsigl->GetXaxis()->SetTitle("Drift Time interval number");
595   gsigl->GetYaxis()->SetTitle("#sigma_{Landau} (keV)");
596   gsigl->GetXaxis()->SetTitleSize(0.05);
597   gsigl->GetYaxis()->SetTitleSize(0.05);
598   gsigl->GetYaxis()->SetTitleOffset(1.2);
599   cpars->cd(3);
600   gPad->SetLeftMargin(0.14);
601   gPad->SetFrameLineWidth(2);
602   gPad->SetTickx();
603   gPad->SetTicky();
604   gsigg->SetMarkerStyle(20);
605   gsigg->GetXaxis()->SetLimits(-0.2,6.8);
606   gsigg->Draw("AP");
607   gsigg->GetXaxis()->SetTitle("Drift Time interval number");
608   gsigg->GetYaxis()->SetTitle("#sigma_{Gauss} (keV)");
609   gsigg->GetXaxis()->SetTitleSize(0.05);
610   gsigg->GetYaxis()->SetTitleSize(0.05);
611   gsigg->GetYaxis()->SetTitleOffset(1.2);
612   cpars->Update();
613
614 }
615
616
617 Double_t LangausFun(Double_t *x, Double_t *par) {
618
619   //Fit parameters:
620   //par[0]=Width (scale) parameter of Landau density
621   //par[1]=Most Probable (MP, location) parameter of Landau density
622   //par[2]=Total area (integral -inf to inf, normalization constant)
623   //par[3]=Width (sigma) of convoluted Gaussian function
624   //
625   //In the Landau distribution (represented by the CERNLIB approximation), 
626   //the maximum is located at x=-0.22278298 with the location parameter=0.
627   //This shift is corrected within this function, so that the actual
628   //maximum is identical to the MP parameter.
629
630   // Numeric constants
631   Double_t invsq2pi = 0.3989422804014;   // (2 pi)^(-1/2)
632   Double_t mpshift  = -0.22278298;       // Landau maximum location
633
634   // Control constants
635   Double_t np = 100.0;      // number of convolution steps
636   Double_t sc =   5.0;      // convolution extends to +-sc Gaussian sigmas
637
638   // Variables
639   Double_t xx;
640   Double_t mpc;
641   Double_t fland;
642   Double_t sum = 0.0;
643   Double_t xlow,xupp;
644   Double_t step;
645   Double_t i;
646
647
648   // MP shift correction
649   mpc = par[1] - mpshift * par[0]; 
650
651   // Range of convolution integral
652   xlow = x[0] - sc * par[3];
653   xupp = x[0] + sc * par[3];
654
655   step = (xupp-xlow) / np;
656
657   // Convolution integral of Landau and Gaussian by sum
658   for(i=1.0; i<=np/2; i++) {
659     xx = xlow + (i-.5) * step;
660     fland = TMath::Landau(xx,mpc,par[0]) / par[0];
661     sum += fland * TMath::Gaus(x[0],xx,par[3]);
662
663     xx = xupp - (i-.5) * step;
664     fland = TMath::Landau(xx,mpc,par[0]) / par[0];
665     sum += fland * TMath::Gaus(x[0],xx,par[3]);
666   }
667
668   return (par[2] * step * sum * invsq2pi / par[3]);
669 }
670