1 #if !defined(__CINT__) || defined(__MAKECINT__)
6 #include <TGraphErrors.h>
11 #include <TGridResult.h>
16 #include "AliITSgeomTGeo.h"
19 Double_t LangausFun(Double_t *x, Double_t *par);
22 void PlotOutputQAtrainSDD(TString option="local",
24 TString period="LHC11a",
26 TString fileName="QAresults.root"){
28 gStyle->SetOptStat(0);
29 // gStyle->SetOptTitle(0);
33 if(period.Contains("LHC10")) year=2010;
34 else if(period.Contains("LHC09")) year=2009;
36 if(option.Contains("local")){
37 f=new TFile(fileName.Data());
38 printf("Opened file %s\n",f->GetName());
40 TGrid::Connect("alien:");
41 path=Form("/alice/data/%d/%s/%09d/ESDs/",year,period.Data(),nRun);
42 printf("search in path %s\n",path.Data());
43 if(!gGrid||!gGrid->IsConnected()) {
44 printf("gGrid not found! exit macro\n");
47 TGridResult *gr = gGrid->Query(path,fileName);
48 Int_t nFiles = gr->GetEntries();
50 printf("QA file for run %d not found\n",nRun);
53 printf("================>%d files found\n", nFiles);
54 if(qaTrain.Length()>0){
56 for (Int_t iFil = 0; iFil <nFiles ; iFil++) {
57 fileName=Form("%s",gr->GetKey(iFil,"turl"));
58 TString isMerged=fileName;
59 isMerged.Remove(isMerged.Sizeof()-16);
60 isMerged.Remove(0,isMerged.Sizeof()-5);
61 if(!isMerged.Contains("QA")) continue;
62 if(fileName.Contains(qaTrain.Data())){
68 printf(" File from %s train not found\n",qaTrain.Data());
75 for (Int_t iFil = 0; iFil <nFiles ; iFil++) {
76 fileName=Form("%s",gr->GetKey(iFil,"turl"));
77 TString isMerged=fileName;
78 isMerged.Remove(isMerged.Sizeof()-16);
79 isMerged.Remove(0,isMerged.Sizeof()-5);
80 if(!isMerged.Contains("QA")) continue;
81 TString cutFilename=fileName.ReplaceAll("/QAresults.root","");
82 Int_t last=cutFilename.Sizeof()-3;
83 cutFilename.Remove(0,last);
84 Int_t qaver=atoi(cutFilename.Data());
91 fileName=Form("%s",gr->GetKey(theFile,"turl"));
93 f=TFile::Open(fileName.Data());
96 TDirectoryFile* df=(TDirectoryFile*)f->Get("SDD_Performance");
98 printf("SDD_Performance MISSING -> Exit\n");
101 TList* l=(TList*)df->Get("coutputRP");
103 printf("coutputRP TList MISSING -> Exit\n");
107 TH1F* hcllay=(TH1F*)l->FindObject("hCluInLay");
108 TH1F* hapmod=(TH1F*)l->FindObject("hAllPmod");
109 TH1F* hgpmod=(TH1F*)l->FindObject("hGoodPmod");
110 TH1F* hmpmod=(TH1F*)l->FindObject("hMissPmod");
111 TH1F* hbrmod=(TH1F*)l->FindObject("hBadRegmod");
112 TH1F* hskmod=(TH1F*)l->FindObject("hSkippedmod");
113 TH1F* hoamod=(TH1F*)l->FindObject("hOutAccmod");
114 TH1F* hnrmod=(TH1F*)l->FindObject("hNoRefitmod");
116 // TH1F* hapxl=(TH1F*)l->FindObject("hAllPxloc");
117 TH1F* hgpxl=(TH1F*)l->FindObject("hGoodPxloc");
118 TH1F* hmpxl=(TH1F*)l->FindObject("hMissPxloc");
119 TH1F* hbrxl=(TH1F*)l->FindObject("hBadRegxloc");
120 // TH1F* hapzl=(TH1F*)l->FindObject("hAllPzloc");
121 TH1F* hgpzl=(TH1F*)l->FindObject("hGoodPzloc");
122 TH1F* hmpzl=(TH1F*)l->FindObject("hMissPzloc");
123 TH1F* hbrzl=(TH1F*)l->FindObject("hBadRegzloc");
125 TH2F* hClSizAn=(TH2F*)l->FindObject("hCluSizAn");
126 TH2F* hClSizTb=(TH2F*)l->FindObject("hCluSizTb");
128 TH2F* hdedx3=(TH2F*)l->FindObject("hdEdxL3VsP");
129 TH2F* hdedx4=(TH2F*)l->FindObject("hdEdxL4VsP");
130 TH2F* hdedxmod=(TH2F*)l->FindObject("hdEdxVsMod");
133 TH1F* hmodR=(TH1F*)l->FindObject("hRPMod");
134 TH1F* hmodT=(TH1F*)l->FindObject("hTPMod");
135 TH1F* hgamod=(TH1F*)l->FindObject("hGAMod");
137 TH2F* h2dmodR3=new TH2F("h2dmodR3","Rec Points, Layer 3",6,0.5,6.5,14,0.5,14.5);
138 TH2F* h2dmodR4=new TH2F("h2dmodR4","Rec Points, Layer 4",8,0.5,8.5,22,0.5,22.5);
139 TH2F* h2dmodT3=new TH2F("h2dmodT3","Track Points, Layer 3",6,0.5,6.5,14,0.5,14.5);
140 TH2F* h2dmodT4=new TH2F("h2dmodT4","Track Points, Layer 4",8,0.5,8.5,22,0.5,22.5);
141 TH2F* h2dmodR3N=new TH2F("h2dmodR3N","Rec Points/GoodAnode/Event, Layer 3",6,0.5,6.5,14,0.5,14.5);
142 TH2F* h2dmodR4N=new TH2F("h2dmodR4N","Rec Points/GoodAnode/Event, Layer 4",8,0.5,8.5,22,0.5,22.5);
143 TH2F* h2dmodT3N=new TH2F("h2dmodT3N","Track Points/GoodAnode/Event, Layer 3",6,0.5,6.5,14,0.5,14.5);
144 TH2F* h2dmodT4N=new TH2F("h2dmodT4N","Track Points/GoodAnode/Event, Layer 4",8,0.5,8.5,22,0.5,22.5);
145 TH1F* hmodRN=new TH1F("hmodRN","Normalized Rec Points per Module",260,239.5,499.5);
146 TH1F* hmodTN=new TH1F("hmodTN","Normalized Track Points per Module",260,239.5,499.5);
148 TH1F* hev=(TH1F*)l->FindObject("hNEvents");
149 Int_t nTotEvents=hev->GetBinContent(2);
150 Int_t nTrigEvents=hev->GetBinContent(3);
151 Int_t nEvents=nTotEvents;
152 printf("---- Statistics ----\n");
153 printf("Number of Events = %d\n",nTotEvents);
155 printf("Number of Triggered Events = %d\n",nTrigEvents);
158 printf("No request on the trigger done when running the task\n");
161 for(Int_t iMod=0; iMod<260;iMod++){
162 Int_t gda=(Int_t)hgamod->GetBinContent(iMod+1);
163 if(gda>bestMod) bestMod=gda;
167 nChunks=(Int_t)(bestMod/512.+0.5);
169 printf("Chunks merged = %d\n",nChunks);
170 hgamod->Scale(1./nChunks);
171 TCanvas* cgan=new TCanvas("cgan","Good Anodes");
174 hgamod->SetMarkerStyle(20);
175 hgamod->SetMarkerSize(0.6);
176 hgamod->SetMinimum(-10.);
178 hgamod->GetXaxis()->SetTitle("SDD Module Id");
179 hgamod->GetYaxis()->SetTitle("Number of good anodes");
182 printf("---- Modules with > 2%% of bad anodes ----\n");
183 for(Int_t iMod=0; iMod<260; iMod++){
184 Int_t idMod=iMod+240;
185 Float_t rps=hmodR->GetBinContent(iMod+1);
186 Float_t tps=hmodT->GetBinContent(iMod+1);
187 Float_t ga=hgamod->GetBinContent(iMod+1);
189 printf("Module %d - Good Anodes = %d\n",idMod,(Int_t)ga);
195 if(ga>0 && nEvents>0){
196 rpsN=rps/ga/(Float_t)nEvents;
197 tpsN=tps/ga/(Float_t)nEvents;
198 erpsN=TMath::Sqrt(rps)/ga/(Float_t)nEvents;
199 etpsN=TMath::Sqrt(tps)/ga/(Float_t)nEvents;
201 hmodRN->SetBinContent(iMod+1,rpsN);
202 hmodTN->SetBinContent(iMod+1,tpsN);
203 hmodRN->SetBinError(iMod+1,erpsN);
204 hmodTN->SetBinError(iMod+1,etpsN);
205 Int_t iLay,iLad,iDet;
206 AliITSgeomTGeo::GetModuleId(idMod,iLay,iLad,iDet);
208 h2dmodR3->SetBinContent(iDet,iLad,rps);
209 h2dmodT3->SetBinContent(iDet,iLad,tps);
210 h2dmodR3N->SetBinContent(iDet,iLad,rpsN);
211 h2dmodT3N->SetBinContent(iDet,iLad,tpsN);
214 h2dmodR4->SetBinContent(iDet,iLad,rps);
215 h2dmodT4->SetBinContent(iDet,iLad,tps);
216 h2dmodR4N->SetBinContent(iDet,iLad,rpsN);
217 h2dmodT4N->SetBinContent(iDet,iLad,tpsN);
220 if(nEvents<1) return;
222 gStyle->SetPalette(1);
224 if(hmodR->GetEntries()>0){
225 TCanvas* cmodR=new TCanvas("cmodR","RecPoint Occup",1200,1200);
228 gPad->SetLeftMargin(0.14);
230 hmodR->GetXaxis()->SetTitle("SDD Module Id");
231 hmodR->GetYaxis()->SetTitle("RecPoints");
232 hmodR->GetYaxis()->SetTitleOffset(1.55);
234 gPad->SetLeftMargin(0.14);
236 hmodRN->GetXaxis()->SetTitle("SDD Module Id");
237 hmodRN->GetYaxis()->SetTitle("RecPoints/GoodAnode/Event");
238 hmodRN->GetYaxis()->SetTitleOffset(1.55);
240 gPad->SetLeftMargin(0.14);
241 h2dmodR3->Draw("colz");
242 h2dmodR3->GetXaxis()->SetTitle("Detector");
243 h2dmodR3->GetYaxis()->SetTitle("Ladder");
245 gPad->SetLeftMargin(0.14);
246 h2dmodR3N->Draw("colz");
247 h2dmodR3N->GetXaxis()->SetTitle("Detector");
248 h2dmodR3N->GetYaxis()->SetTitle("Ladder");
250 gPad->SetLeftMargin(0.14);
251 h2dmodR4->Draw("colz");
252 h2dmodR4->GetXaxis()->SetTitle("Detector");
253 h2dmodR4->GetYaxis()->SetTitle("Ladder");
255 gPad->SetLeftMargin(0.14);
256 gPad->SetLeftMargin(0.14);
257 h2dmodR4N->Draw("colz");
258 h2dmodR4N->GetXaxis()->SetTitle("Detector");
259 h2dmodR4N->GetYaxis()->SetTitle("Ladder");
264 if(hmodT->GetEntries()>0){
265 TCanvas* cmodT=new TCanvas("cmodT","TrackPoint Occup",1200,1200);
269 hmodT->GetXaxis()->SetTitle("SDD Module Id");
270 hmodT->GetYaxis()->SetTitle("TrackPoints");
271 hmodT->GetYaxis()->SetTitleOffset(1.4);
273 gPad->SetLeftMargin(0.14);
275 hmodTN->GetXaxis()->SetTitle("SDD Module Id");
276 hmodTN->GetYaxis()->SetTitle("TrackPoints");
277 hmodTN->GetYaxis()->SetTitleOffset(1.4);
279 gPad->SetLeftMargin(0.14);
280 h2dmodT3->Draw("colz");
281 h2dmodT3->GetXaxis()->SetTitle("Detector");
282 h2dmodT3->GetYaxis()->SetTitle("Ladder");
284 gPad->SetLeftMargin(0.14);
285 h2dmodT3N->Draw("colz");
286 h2dmodT3N->GetXaxis()->SetTitle("Detector");
287 h2dmodT3N->GetYaxis()->SetTitle("Ladder");
289 gPad->SetLeftMargin(0.14);
290 h2dmodT4->Draw("colz");
291 h2dmodT4->GetXaxis()->SetTitle("Detector");
292 h2dmodT4->GetYaxis()->SetTitle("Ladder");
294 gPad->SetLeftMargin(0.14);
295 h2dmodT4N->Draw("colz");
296 h2dmodT4N->GetXaxis()->SetTitle("Detector");
297 h2dmodT4N->GetYaxis()->SetTitle("Ladder");
301 TH1F* htplad3=(TH1F*)l->FindObject("hTPLad3");
302 TH1F* htplad4=(TH1F*)l->FindObject("hTPLad4");
303 TH1F* hgalad3=(TH1F*)l->FindObject("hGALad3");
304 TH1F* hgalad4=(TH1F*)l->FindObject("hGALad4");
305 TH1F* hnormOcc3=new TH1F("hnormOcc3","",14,-0.5,13.5);
306 TH1F* hnormOcc4=new TH1F("hnormOcc4","",22,-0.5,21.5);
308 for(Int_t ilad=0;ilad<14;ilad++){
311 Int_t gd3=hgalad3->GetBinContent(ilad+1);
313 occ=(Float_t)htplad3->GetBinContent(ilad+1)/(Float_t)gd3/(Float_t)nEvents;
314 eocc=TMath::Sqrt((Float_t)htplad3->GetBinContent(ilad+1))/(Float_t)gd3/(Float_t)nEvents;
316 hnormOcc3->SetBinContent(ilad+1,occ);
317 hnormOcc3->SetBinError(ilad+1,eocc);
319 for(Int_t ilad=0;ilad<22;ilad++){
322 Int_t gd4=hgalad4->GetBinContent(ilad+1);
324 occ=(Float_t)htplad4->GetBinContent(ilad+1)/(Float_t)gd4/(Float_t)nEvents;
325 eocc=TMath::Sqrt((Float_t)htplad4->GetBinContent(ilad+1))/(Float_t)gd4/(Float_t)nEvents;
327 hnormOcc4->SetBinContent(ilad+1,occ);
328 hnormOcc4->SetBinError(ilad+1,eocc);
333 TCanvas* cn0=new TCanvas("cn0","Normalized Ladder Occupancy",1400,600);
336 gPad->SetLeftMargin(0.14);
338 hnormOcc3->GetXaxis()->SetTitle("Ladder number (layer 3)");
339 hnormOcc3->GetYaxis()->SetTitle("TrackPoints/GoodAnodes/Events");
340 hnormOcc3->GetYaxis()->SetTitleOffset(1.35);
342 gPad->SetLeftMargin(0.14);
344 hnormOcc4->GetXaxis()->SetTitle("Ladder number (layer 4)");
345 hnormOcc4->GetYaxis()->SetTitle("TrackPoints/GoodAnode/Events");
346 hnormOcc4->GetYaxis()->SetTitleOffset(1.35);
351 Double_t norm=hcllay->GetBinContent(1);
353 hcllay->Scale(1./norm);
354 hcllay->SetTitle("");
355 hcllay->GetXaxis()->SetRange(2,7);
356 hcllay->SetMinimum(0.);
357 hcllay->SetMaximum(1.1);
358 hcllay->SetMarkerStyle(23);
359 TCanvas* ceffL=new TCanvas("ceffL","PointPerLayer",1000,600);
362 hcllay->GetXaxis()->SetTitle("Layer");
363 hcllay->GetYaxis()->SetTitle("Fraction of tracks with point in layer");
368 hgpmod->SetTitle("");
369 TCanvas* ceff0=new TCanvas("ceff0","ModuleIndexInfo",1000,600);
371 hgpmod->GetXaxis()->SetTitle("SDD Module Id");
372 hgpmod->GetYaxis()->SetTitle("Number of tracks");
373 hmpmod->SetLineColor(2);
374 hmpmod->SetMarkerColor(2);
375 hmpmod->SetMarkerStyle(22);
376 hmpmod->SetMarkerSize(0.5);
377 hmpmod->Draw("psame");
378 hbrmod->SetLineColor(kGreen+1);
379 hbrmod->SetMarkerColor(kGreen+1);
380 hbrmod->SetMarkerStyle(20);
381 hbrmod->SetMarkerSize(0.5);
382 hbrmod->Draw("same");
383 hskmod->SetLineColor(kYellow);
384 hskmod->Draw("same");
385 hoamod->SetLineColor(4);
386 hoamod->Draw("same");
387 hnrmod->SetLineColor(6);
388 hnrmod->Draw("same");
389 TLatex* t1=new TLatex(0.7,0.85,"Good Point");
393 TLatex* t2=new TLatex(0.7,0.8,"Missing Point");
397 TLatex* t3=new TLatex(0.7,0.75,"Bad Region");
399 t3->SetTextColor(kGreen+1);
403 TH1F* heff=new TH1F("heff","",260,239.5,499.5);
404 for(Int_t imod=0; imod<260;imod++){
405 Float_t numer=hgpmod->GetBinContent(imod+1)+hbrmod->GetBinContent(imod+1)+hoamod->GetBinContent(imod+1)+hnrmod->GetBinContent(imod+1);
406 Float_t denom=hapmod->GetBinContent(imod+1);
411 erreff=TMath::Sqrt(eff*(1-eff)/denom);
413 heff->SetBinContent(imod+1,eff);
414 heff->SetBinError(imod+1,erreff);
417 printf("---- Modules with efficiency < 90%% ----\n");
418 TCanvas* ceff1=new TCanvas("ceff1","Efficiency",1000,600);
420 heff->GetXaxis()->SetTitle("SDD Module Id");
421 heff->GetYaxis()->SetTitle("Fraction of tracks with point in good region");
422 for(Int_t ibin=1; ibin<=heff->GetNbinsX(); ibin++){
423 Float_t e=heff->GetBinContent(ibin);
425 Int_t iMod=(Int_t)heff->GetBinCenter(ibin);
427 AliITSgeomTGeo::GetModuleId(iMod,lay,lad,det);
428 printf("Module %d - Layer %d Ladder %2d Det %d - Eff. %.3f\n",iMod,lay,lad,det,heff->GetBinContent(ibin));
436 TCanvas* ceff2=new TCanvas("ceff2","LocalCoord",1000,600);
440 hgpxl->GetXaxis()->SetTitle("Xlocal (cm)");
441 hgpxl->GetYaxis()->SetTitle("Number of tracks");
442 hmpxl->SetLineColor(2);
443 hmpxl->SetMarkerColor(2);
444 hmpxl->SetMarkerStyle(22);
445 hmpxl->SetMarkerSize(0.5);
446 hmpxl->Draw("psame");
447 hbrxl->SetLineColor(kGreen+1);
448 hbrxl->SetMarkerColor(kGreen+1);
449 hbrxl->SetMarkerStyle(20);
450 hbrxl->SetMarkerSize(0.5);
457 hgpzl->GetXaxis()->SetTitle("Zlocal (cm)");
458 hgpzl->GetYaxis()->SetTitle("Number of tracks");
459 hmpzl->SetLineColor(2);
460 hmpzl->SetMarkerColor(2);
461 hmpzl->SetMarkerStyle(22);
462 hmpzl->SetMarkerSize(0.5);
463 hmpzl->Draw("psame");
464 hbrzl->SetLineColor(kGreen+1);
465 hbrzl->SetMarkerColor(kGreen+1);
466 hbrzl->SetMarkerStyle(20);
467 hbrzl->SetMarkerSize(0.5);
476 if(hClSizAn && hClSizTb){
477 TCanvas* ccs=new TCanvas("ccs","Cluster Size",1200,600);
481 gPad->SetRightMargin(0.12);
482 hClSizAn->Draw("colz");
483 hClSizAn->GetXaxis()->SetTitle("Drift Time (ns)");
484 hClSizAn->GetYaxis()->SetTitle("Cluster Size - Anodes");
487 gPad->SetRightMargin(0.12);
488 hClSizTb->Draw("colz");
489 hClSizTb->GetXaxis()->SetTitle("Drift Time (ns)");
490 hClSizTb->GetYaxis()->SetTitle("Cluster Size - Time Bins");
494 TH1F* htimR=(TH1F*)l->FindObject("hDrTimRP");
495 TH1F* htimT=(TH1F*)l->FindObject("hDrTimTPAll");
496 TH1F* htimTe=(TH1F*)l->FindObject("hDrTimTPExtra");
497 TH1F* htimTne=(TH1F*)l->FindObject("hDrTimTPNoExtra");
502 htimR->SetLineWidth(2);
503 htimT->SetLineWidth(2);
504 htimTe->SetLineWidth(2);
505 htimTne->SetLineWidth(2);
507 TCanvas* ctim=new TCanvas("ctim","DriftTime",1400,600);
511 htimR->GetYaxis()->SetTitleOffset(1.2);
512 htimR->GetXaxis()->SetTitle("Drift Time (ns)");
513 htimR->GetYaxis()->SetTitle("RecPoints");
516 htimTe->SetLineColor(2);
517 htimTe->Draw("same");
518 htimTne->SetLineColor(4);
519 htimTne->Draw("same");
520 htimT->GetXaxis()->SetTitle("Drift Time (ns)");
521 htimT->GetYaxis()->SetTitle("TrackPoints");
522 htimT->GetYaxis()->SetTitleOffset(1.2);
523 TLatex* ta=new TLatex(0.5,0.85,"All Clusters");
527 TLatex* te=new TLatex(0.5,0.8,"Extra Clusters");
531 TLatex* tn=new TLatex(0.5,0.75,"Non-Extra Clusters");
537 TCanvas* cdedx=new TCanvas("cdedx","dedx",1400,600);
542 hdedx3->GetXaxis()->SetTitle("P (GeV/c)");
543 hdedx3->GetYaxis()->SetTitle("dE/dx (keV/300 #mum) Layer 3");
544 hdedx3->GetYaxis()->SetTitleOffset(1.25);
548 hdedx4->GetXaxis()->SetTitle("P (GeV/c)");
549 hdedx4->GetYaxis()->SetTitle("dE/dx (keV/300 #mum) Layer 4");
550 hdedx4->GetYaxis()->SetTitleOffset(1.25);
553 hdedxmod->Draw("col");
554 hdedxmod->GetXaxis()->SetTitle("SDD Module Id");
555 hdedxmod->GetYaxis()->SetTitle("dE/dx (keV/300 #mum)");
556 hdedxmod->GetYaxis()->SetTitleOffset(1.25);
559 printf("---- dE/dx vs.DriftTime ----\n");
560 TCanvas* csig=new TCanvas("csig","dedx vs. DriftTime",1000,700);
563 TGraphErrors* gmpv=new TGraphErrors(0);
564 TGraphErrors* gsigg=new TGraphErrors(0);
565 TGraphErrors* gsigl=new TGraphErrors(0);
570 TF1 *lfun = new TF1("LangausFun",LangausFun,50.,300.,4);
571 for(Int_t it=0; it<8; it++){
572 hSigTim[it]=(TH1F*)l->FindObject(Form("hSigTimeInt%d",it));
575 if(hSigTim[it]->GetEntries()>200){
576 lfun->SetLineWidth(2);
577 lfun->SetParameter(0,5.);
578 lfun->SetParameter(1,80.);
579 lfun->SetParameter(2,hSigTim[it]->GetEntries()/10.);
580 lfun->SetParameter(3,10.);
581 lfun->SetParLimits(3,0.,20);
583 hSigTim[it]->Fit("LangausFun","QLR");
584 hSigTim[it]->GetXaxis()->SetTitle(Form("dE/dx, time interval %d",it+1));
585 hSigTim[it]->GetYaxis()->SetTitle("Events");
586 Float_t mpv=lfun->GetParameter(1);
587 Float_t empv=lfun->GetParError(1);
588 Float_t sig=lfun->GetParameter(3);
589 Float_t esig=lfun->GetParError(3);
590 Float_t sigl=lfun->GetParameter(0);
591 Float_t esigl=lfun->GetParError(0);
592 gmpv->SetPoint(iPoint,(Float_t)it,mpv);
593 gmpv->SetPointError(iPoint,0.,empv);
594 gsigg->SetPoint(iPoint,(Float_t)it,sig);
595 gsigg->SetPointError(iPoint,0.,esig);
596 gsigl->SetPoint(iPoint,(Float_t)it,sigl);
597 gsigl->SetPointError(iPoint,0.,esigl);
600 printf("Bin %d - MPV=%.3f \t SigmaLandau=%.3f \t SigmaGaus=%.3f\n",it,mpv,sigl,sig);
604 TCanvas* cpars=new TCanvas("cpars","Params",800,900);
605 cpars->Divide(1,3,0.01,0.);
607 gPad->SetLeftMargin(0.14);
608 gPad->SetFrameLineWidth(2);
611 gmpv->SetMarkerStyle(20);
612 // gmpv->SetMinimum(0);
613 // gmpv->SetMaximum(120);
614 gmpv->GetXaxis()->SetLimits(-0.2,6.8);
616 // gmpv->GetXaxis()->SetTitle("Drift Time interval number");
617 gmpv->GetYaxis()->SetTitle("Landau MPV (keV)");
618 gmpv->GetXaxis()->SetTitleSize(0.05);
619 gmpv->GetYaxis()->SetTitleSize(0.05);
620 gmpv->GetYaxis()->SetTitleOffset(1.2);
622 gPad->SetLeftMargin(0.14);
623 gPad->SetFrameLineWidth(2);
626 gsigl->SetMarkerStyle(20);
627 gsigl->GetXaxis()->SetLimits(-0.2,6.8);
629 // gsigl->GetXaxis()->SetTitle("Drift Time interval number");
630 gsigl->GetYaxis()->SetTitle("#sigma_{Landau} (keV)");
631 gsigl->GetXaxis()->SetTitleSize(0.05);
632 gsigl->GetYaxis()->SetTitleSize(0.05);
633 gsigl->GetYaxis()->SetTitleOffset(1.2);
635 gPad->SetLeftMargin(0.14);
636 gPad->SetFrameLineWidth(2);
639 gsigg->SetMarkerStyle(20);
640 gsigg->GetXaxis()->SetLimits(-0.2,6.8);
642 gsigg->GetXaxis()->SetTitle("Drift Time interval number");
643 gsigg->GetYaxis()->SetTitle("#sigma_{Gauss} (keV)");
644 gsigg->GetXaxis()->SetTitleSize(0.05);
645 gsigg->GetYaxis()->SetTitleSize(0.05);
646 gsigg->GetYaxis()->SetTitleOffset(1.2);
652 Double_t LangausFun(Double_t *x, Double_t *par) {
655 //par[0]=Width (scale) parameter of Landau density
656 //par[1]=Most Probable (MP, location) parameter of Landau density
657 //par[2]=Total area (integral -inf to inf, normalization constant)
658 //par[3]=Width (sigma) of convoluted Gaussian function
660 //In the Landau distribution (represented by the CERNLIB approximation),
661 //the maximum is located at x=-0.22278298 with the location parameter=0.
662 //This shift is corrected within this function, so that the actual
663 //maximum is identical to the MP parameter.
666 Double_t invsq2pi = 0.3989422804014; // (2 pi)^(-1/2)
667 Double_t mpshift = -0.22278298; // Landau maximum location
670 Double_t np = 100.0; // number of convolution steps
671 Double_t sc = 5.0; // convolution extends to +-sc Gaussian sigmas
683 // MP shift correction
684 mpc = par[1] - mpshift * par[0];
686 // Range of convolution integral
687 xlow = x[0] - sc * par[3];
688 xupp = x[0] + sc * par[3];
690 step = (xupp-xlow) / np;
692 // Convolution integral of Landau and Gaussian by sum
693 for(i=1.0; i<=np/2; i++) {
694 xx = xlow + (i-.5) * step;
695 fland = TMath::Landau(xx,mpc,par[0]) / par[0];
696 sum += fland * TMath::Gaus(x[0],xx,par[3]);
698 xx = xupp - (i-.5) * step;
699 fland = TMath::Landau(xx,mpc,par[0]) / par[0];
700 sum += fland * TMath::Gaus(x[0],xx,par[3]);
703 return (par[2] * step * sum * invsq2pi / par[3]);