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",
25 TString recoPass="pass2_with_SDD",
27 TString fileName="QAresults.root"){
29 gStyle->SetOptStat(0);
30 // gStyle->SetOptTitle(0);
34 if(period.Contains("LHC10")) year=2010;
35 else if(period.Contains("LHC09")) year=2009;
37 if(option.Contains("local")){
38 f=new TFile(fileName.Data());
39 printf("Opened file %s\n",f->GetName());
41 TGrid::Connect("alien:");
42 path=Form("/alice/data/%d/%s/%09d/ESDs/%s",year,period.Data(),nRun,recoPass.Data());
43 printf("search in path %s\n",path.Data());
44 if(!gGrid||!gGrid->IsConnected()) {
45 printf("gGrid not found! exit macro\n");
48 TGridResult *gr = gGrid->Query(path,fileName);
49 Int_t nFiles = gr->GetEntries();
51 printf("QA file for run %d not found\n",nRun);
54 printf("================>%d files found\n", nFiles);
55 if(qaTrain.Length()>0){
57 for (Int_t iFil = 0; iFil <nFiles ; iFil++) {
58 fileName=Form("%s",gr->GetKey(iFil,"turl"));
59 TString isMerged=fileName;
60 isMerged.Remove(isMerged.Sizeof()-16);
61 isMerged.Remove(0,isMerged.Sizeof()-5);
62 if(!isMerged.Contains("QA")) continue;
63 if(fileName.Contains(qaTrain.Data())){
69 printf(" File from %s train not found\n",qaTrain.Data());
76 for (Int_t iFil = 0; iFil <nFiles ; iFil++) {
77 fileName=Form("%s",gr->GetKey(iFil,"turl"));
78 TString isMerged=fileName;
79 isMerged.Remove(isMerged.Sizeof()-16);
80 isMerged.Remove(0,isMerged.Sizeof()-5);
81 if(!isMerged.Contains("QA")) continue;
82 TString cutFilename=fileName.ReplaceAll("/QAresults.root","");
83 Int_t last=cutFilename.Sizeof()-3;
84 cutFilename.Remove(0,last);
85 Int_t qaver=atoi(cutFilename.Data());
92 fileName=Form("%s",gr->GetKey(theFile,"turl"));
94 f=TFile::Open(fileName.Data());
97 TDirectoryFile* df=(TDirectoryFile*)f->Get("SDD_Performance");
99 printf("SDD_Performance MISSING -> Exit\n");
102 TList* l=(TList*)df->Get("coutputRP");
104 printf("coutputRP TList MISSING -> Exit\n");
108 TH1F* hcllay=(TH1F*)l->FindObject("hCluInLay");
109 TH1F* hapmod=(TH1F*)l->FindObject("hAllPmod");
110 TH1F* hgpmod=(TH1F*)l->FindObject("hGoodPmod");
111 TH1F* hmpmod=(TH1F*)l->FindObject("hMissPmod");
112 TH1F* hbrmod=(TH1F*)l->FindObject("hBadRegmod");
113 TH1F* hskmod=(TH1F*)l->FindObject("hSkippedmod");
114 TH1F* hoamod=(TH1F*)l->FindObject("hOutAccmod");
115 TH1F* hnrmod=(TH1F*)l->FindObject("hNoRefitmod");
117 // TH1F* hapxl=(TH1F*)l->FindObject("hAllPxloc");
118 TH1F* hgpxl=(TH1F*)l->FindObject("hGoodPxloc");
119 TH1F* hmpxl=(TH1F*)l->FindObject("hMissPxloc");
120 TH1F* hbrxl=(TH1F*)l->FindObject("hBadRegxloc");
121 // TH1F* hapzl=(TH1F*)l->FindObject("hAllPzloc");
122 TH1F* hgpzl=(TH1F*)l->FindObject("hGoodPzloc");
123 TH1F* hmpzl=(TH1F*)l->FindObject("hMissPzloc");
124 TH1F* hbrzl=(TH1F*)l->FindObject("hBadRegzloc");
126 TH2F* hClSizAn=(TH2F*)l->FindObject("hCluSizAn");
127 TH2F* hClSizTb=(TH2F*)l->FindObject("hCluSizTb");
129 TH2F* hdedx3=(TH2F*)l->FindObject("hdEdxL3VsP");
130 TH2F* hdedx4=(TH2F*)l->FindObject("hdEdxL4VsP");
131 TH2F* hdedxmod=(TH2F*)l->FindObject("hdEdxVsMod");
134 TH1F* hmodR=(TH1F*)l->FindObject("hRPMod");
135 TH1F* hmodT=(TH1F*)l->FindObject("hTPMod");
136 TH1F* hgamod=(TH1F*)l->FindObject("hGAMod");
138 TH2F* h2dmodR3=new TH2F("h2dmodR3","Rec Points, Layer 3",6,0.5,6.5,14,0.5,14.5);
139 TH2F* h2dmodR4=new TH2F("h2dmodR4","Rec Points, Layer 4",8,0.5,8.5,22,0.5,22.5);
140 TH2F* h2dmodT3=new TH2F("h2dmodT3","Track Points, Layer 3",6,0.5,6.5,14,0.5,14.5);
141 TH2F* h2dmodT4=new TH2F("h2dmodT4","Track Points, Layer 4",8,0.5,8.5,22,0.5,22.5);
142 TH2F* h2dmodR3N=new TH2F("h2dmodR3N","Rec Points/GoodAnode/Event, Layer 3",6,0.5,6.5,14,0.5,14.5);
143 TH2F* h2dmodR4N=new TH2F("h2dmodR4N","Rec Points/GoodAnode/Event, Layer 4",8,0.5,8.5,22,0.5,22.5);
144 TH2F* h2dmodT3N=new TH2F("h2dmodT3N","Track Points/GoodAnode/Event, Layer 3",6,0.5,6.5,14,0.5,14.5);
145 TH2F* h2dmodT4N=new TH2F("h2dmodT4N","Track Points/GoodAnode/Event, Layer 4",8,0.5,8.5,22,0.5,22.5);
146 TH1F* hmodRN=new TH1F("hmodRN","Normalized Rec Points per Module",260,239.5,499.5);
147 TH1F* hmodTN=new TH1F("hmodTN","Normalized Track Points per Module",260,239.5,499.5);
149 TH1F* hev=(TH1F*)l->FindObject("hNEvents");
150 Int_t nTotEvents=hev->GetBinContent(2);
151 Int_t nTrigEvents=hev->GetBinContent(3);
152 Int_t nEvents=nTotEvents;
153 printf("---- Statistics ----\n");
154 printf("Number of Events = %d\n",nTotEvents);
156 printf("Number of Triggered Events = %d\n",nTrigEvents);
159 printf("No request on the trigger done when running the task\n");
162 for(Int_t iMod=0; iMod<260;iMod++){
163 Int_t gda=(Int_t)hgamod->GetBinContent(iMod+1);
164 if(gda>bestMod) bestMod=gda;
168 nChunks=(Int_t)(bestMod/512.+0.5);
170 printf("Chunks merged = %d\n",nChunks);
171 hgamod->Scale(1./nChunks);
172 TCanvas* cgan=new TCanvas("cgan","Good Anodes");
175 hgamod->SetMarkerStyle(20);
176 hgamod->SetMarkerSize(0.6);
177 hgamod->SetMinimum(-10.);
179 hgamod->GetXaxis()->SetTitle("SDD Module Id");
180 hgamod->GetYaxis()->SetTitle("Number of good anodes");
183 printf("---- Modules with > 2%% of bad anodes ----\n");
184 for(Int_t iMod=0; iMod<260; iMod++){
185 Int_t idMod=iMod+240;
186 Float_t rps=hmodR->GetBinContent(iMod+1);
187 Float_t tps=hmodT->GetBinContent(iMod+1);
188 Float_t ga=hgamod->GetBinContent(iMod+1);
190 printf("Module %d - Good Anodes = %d\n",idMod,(Int_t)ga);
196 if(ga>0 && nEvents>0){
197 rpsN=rps/ga/(Float_t)nEvents;
198 tpsN=tps/ga/(Float_t)nEvents;
199 erpsN=TMath::Sqrt(rps)/ga/(Float_t)nEvents;
200 etpsN=TMath::Sqrt(tps)/ga/(Float_t)nEvents;
202 hmodRN->SetBinContent(iMod+1,rpsN);
203 hmodTN->SetBinContent(iMod+1,tpsN);
204 hmodRN->SetBinError(iMod+1,erpsN);
205 hmodTN->SetBinError(iMod+1,etpsN);
206 Int_t iLay,iLad,iDet;
207 AliITSgeomTGeo::GetModuleId(idMod,iLay,iLad,iDet);
209 h2dmodR3->SetBinContent(iDet,iLad,rps);
210 h2dmodT3->SetBinContent(iDet,iLad,tps);
211 h2dmodR3N->SetBinContent(iDet,iLad,rpsN);
212 h2dmodT3N->SetBinContent(iDet,iLad,tpsN);
215 h2dmodR4->SetBinContent(iDet,iLad,rps);
216 h2dmodT4->SetBinContent(iDet,iLad,tps);
217 h2dmodR4N->SetBinContent(iDet,iLad,rpsN);
218 h2dmodT4N->SetBinContent(iDet,iLad,tpsN);
221 if(nEvents<1) return;
223 gStyle->SetPalette(1);
225 if(hmodR->GetEntries()>0){
226 TCanvas* cmodR=new TCanvas("cmodR","RecPoint Occup",1200,1200);
229 gPad->SetLeftMargin(0.14);
231 hmodR->GetXaxis()->SetTitle("SDD Module Id");
232 hmodR->GetYaxis()->SetTitle("RecPoints");
233 hmodR->GetYaxis()->SetTitleOffset(1.55);
235 gPad->SetLeftMargin(0.14);
237 hmodRN->GetXaxis()->SetTitle("SDD Module Id");
238 hmodRN->GetYaxis()->SetTitle("RecPoints/GoodAnode/Event");
239 hmodRN->GetYaxis()->SetTitleOffset(1.55);
241 gPad->SetLeftMargin(0.14);
242 h2dmodR3->Draw("colz");
243 h2dmodR3->GetXaxis()->SetTitle("Detector");
244 h2dmodR3->GetYaxis()->SetTitle("Ladder");
246 gPad->SetLeftMargin(0.14);
247 h2dmodR3N->Draw("colz");
248 h2dmodR3N->GetXaxis()->SetTitle("Detector");
249 h2dmodR3N->GetYaxis()->SetTitle("Ladder");
251 gPad->SetLeftMargin(0.14);
252 h2dmodR4->Draw("colz");
253 h2dmodR4->GetXaxis()->SetTitle("Detector");
254 h2dmodR4->GetYaxis()->SetTitle("Ladder");
256 gPad->SetLeftMargin(0.14);
257 gPad->SetLeftMargin(0.14);
258 h2dmodR4N->Draw("colz");
259 h2dmodR4N->GetXaxis()->SetTitle("Detector");
260 h2dmodR4N->GetYaxis()->SetTitle("Ladder");
265 if(hmodT->GetEntries()>0){
266 TCanvas* cmodT=new TCanvas("cmodT","TrackPoint Occup",1200,1200);
270 hmodT->GetXaxis()->SetTitle("SDD Module Id");
271 hmodT->GetYaxis()->SetTitle("TrackPoints");
272 hmodT->GetYaxis()->SetTitleOffset(1.4);
274 gPad->SetLeftMargin(0.14);
276 hmodTN->GetXaxis()->SetTitle("SDD Module Id");
277 hmodTN->GetYaxis()->SetTitle("TrackPoints");
278 hmodTN->GetYaxis()->SetTitleOffset(1.4);
280 gPad->SetLeftMargin(0.14);
281 h2dmodT3->Draw("colz");
282 h2dmodT3->GetXaxis()->SetTitle("Detector");
283 h2dmodT3->GetYaxis()->SetTitle("Ladder");
285 gPad->SetLeftMargin(0.14);
286 h2dmodT3N->Draw("colz");
287 h2dmodT3N->GetXaxis()->SetTitle("Detector");
288 h2dmodT3N->GetYaxis()->SetTitle("Ladder");
290 gPad->SetLeftMargin(0.14);
291 h2dmodT4->Draw("colz");
292 h2dmodT4->GetXaxis()->SetTitle("Detector");
293 h2dmodT4->GetYaxis()->SetTitle("Ladder");
295 gPad->SetLeftMargin(0.14);
296 h2dmodT4N->Draw("colz");
297 h2dmodT4N->GetXaxis()->SetTitle("Detector");
298 h2dmodT4N->GetYaxis()->SetTitle("Ladder");
302 TH1F* htplad3=(TH1F*)l->FindObject("hTPLad3");
303 TH1F* htplad4=(TH1F*)l->FindObject("hTPLad4");
304 TH1F* hgalad3=(TH1F*)l->FindObject("hGALad3");
305 TH1F* hgalad4=(TH1F*)l->FindObject("hGALad4");
306 TH1F* hnormOcc3=new TH1F("hnormOcc3","",14,-0.5,13.5);
307 TH1F* hnormOcc4=new TH1F("hnormOcc4","",22,-0.5,21.5);
309 for(Int_t ilad=0;ilad<14;ilad++){
312 Int_t gd3=hgalad3->GetBinContent(ilad+1);
314 occ=(Float_t)htplad3->GetBinContent(ilad+1)/(Float_t)gd3/(Float_t)nEvents;
315 eocc=TMath::Sqrt((Float_t)htplad3->GetBinContent(ilad+1))/(Float_t)gd3/(Float_t)nEvents;
317 hnormOcc3->SetBinContent(ilad+1,occ);
318 hnormOcc3->SetBinError(ilad+1,eocc);
320 for(Int_t ilad=0;ilad<22;ilad++){
323 Int_t gd4=hgalad4->GetBinContent(ilad+1);
325 occ=(Float_t)htplad4->GetBinContent(ilad+1)/(Float_t)gd4/(Float_t)nEvents;
326 eocc=TMath::Sqrt((Float_t)htplad4->GetBinContent(ilad+1))/(Float_t)gd4/(Float_t)nEvents;
328 hnormOcc4->SetBinContent(ilad+1,occ);
329 hnormOcc4->SetBinError(ilad+1,eocc);
334 TCanvas* cn0=new TCanvas("cn0","Normalized Ladder Occupancy",1400,600);
337 gPad->SetLeftMargin(0.14);
339 hnormOcc3->GetXaxis()->SetTitle("Ladder number (layer 3)");
340 hnormOcc3->GetYaxis()->SetTitle("TrackPoints/GoodAnodes/Events");
341 hnormOcc3->GetYaxis()->SetTitleOffset(1.35);
343 gPad->SetLeftMargin(0.14);
345 hnormOcc4->GetXaxis()->SetTitle("Ladder number (layer 4)");
346 hnormOcc4->GetYaxis()->SetTitle("TrackPoints/GoodAnode/Events");
347 hnormOcc4->GetYaxis()->SetTitleOffset(1.35);
352 Double_t norm=hcllay->GetBinContent(1);
354 hcllay->Scale(1./norm);
355 hcllay->SetTitle("");
356 hcllay->GetXaxis()->SetRange(2,7);
357 hcllay->SetMinimum(0.);
358 hcllay->SetMaximum(1.1);
359 hcllay->SetMarkerStyle(23);
360 TCanvas* ceffL=new TCanvas("ceffL","PointPerLayer",1000,600);
363 hcllay->GetXaxis()->SetTitle("Layer");
364 hcllay->GetYaxis()->SetTitle("Fraction of tracks with point in layer");
369 hgpmod->SetTitle("");
370 TCanvas* ceff0=new TCanvas("ceff0","ModuleIndexInfo",1000,600);
372 hgpmod->GetXaxis()->SetTitle("SDD Module Id");
373 hgpmod->GetYaxis()->SetTitle("Number of tracks");
374 hmpmod->SetLineColor(2);
375 hmpmod->SetMarkerColor(2);
376 hmpmod->SetMarkerStyle(22);
377 hmpmod->SetMarkerSize(0.5);
378 hmpmod->Draw("psame");
379 hbrmod->SetLineColor(kGreen+1);
380 hbrmod->SetMarkerColor(kGreen+1);
381 hbrmod->SetMarkerStyle(20);
382 hbrmod->SetMarkerSize(0.5);
383 hbrmod->Draw("same");
384 hskmod->SetLineColor(kYellow);
385 hskmod->Draw("same");
386 hoamod->SetLineColor(4);
387 hoamod->Draw("same");
388 hnrmod->SetLineColor(6);
389 hnrmod->Draw("same");
390 TLatex* t1=new TLatex(0.7,0.85,"Good Point");
394 TLatex* t2=new TLatex(0.7,0.8,"Missing Point");
398 TLatex* t3=new TLatex(0.7,0.75,"Bad Region");
400 t3->SetTextColor(kGreen+1);
404 TH1F* heff=new TH1F("heff","",260,239.5,499.5);
405 TH1F* hfracskip=new TH1F("hfracskip","",260,239.5,499.5);
407 for(Int_t imod=0; imod<260;imod++){
408 Float_t numer=hgpmod->GetBinContent(imod+1)+hbrmod->GetBinContent(imod+1)+hoamod->GetBinContent(imod+1)+hnrmod->GetBinContent(imod+1);
409 Float_t denom=hapmod->GetBinContent(imod+1)-hskmod->GetBinContent(imod+1);
414 erreff=TMath::Sqrt(eff*(1-eff)/denom);
416 heff->SetBinContent(imod+1,eff);
417 heff->SetBinError(imod+1,erreff);
418 Float_t numer2=hskmod->GetBinContent(imod+1);
419 Float_t denom2=hapmod->GetBinContent(imod+1);
424 efrac=TMath::Sqrt(frac*(1-frac)/denom2);
426 hfracskip->SetBinContent(imod+1,frac);
427 hfracskip->SetBinError(imod+1,efrac);
431 printf("---- Modules with efficiency < 90%% ----\n");
432 TCanvas* ceff1=new TCanvas("ceff1","Efficiency",1000,1000);
436 heff->GetXaxis()->SetTitle("SDD Module Id");
437 heff->GetYaxis()->SetTitle("Fraction of tracks with point in good region");
438 for(Int_t ibin=1; ibin<=heff->GetNbinsX(); ibin++){
439 Float_t e=heff->GetBinContent(ibin);
441 Int_t iMod=(Int_t)heff->GetBinCenter(ibin);
443 AliITSgeomTGeo::GetModuleId(iMod,lay,lad,det);
444 printf("Module %d - Layer %d Ladder %2d Det %d - Eff. %.3f\n",iMod,lay,lad,det,heff->GetBinContent(ibin));
449 hfracskip->GetXaxis()->SetTitle("SDD Module Id");
450 hfracskip->GetYaxis()->SetTitle("Fraction of tracks with skipped SDD");
456 TCanvas* ceff2=new TCanvas("ceff2","LocalCoord",1000,600);
460 hgpxl->GetXaxis()->SetTitle("Xlocal (cm)");
461 hgpxl->GetYaxis()->SetTitle("Number of tracks");
462 hmpxl->SetLineColor(2);
463 hmpxl->SetMarkerColor(2);
464 hmpxl->SetMarkerStyle(22);
465 hmpxl->SetMarkerSize(0.5);
466 hmpxl->Draw("psame");
467 hbrxl->SetLineColor(kGreen+1);
468 hbrxl->SetMarkerColor(kGreen+1);
469 hbrxl->SetMarkerStyle(20);
470 hbrxl->SetMarkerSize(0.5);
477 hgpzl->GetXaxis()->SetTitle("Zlocal (cm)");
478 hgpzl->GetYaxis()->SetTitle("Number of tracks");
479 hmpzl->SetLineColor(2);
480 hmpzl->SetMarkerColor(2);
481 hmpzl->SetMarkerStyle(22);
482 hmpzl->SetMarkerSize(0.5);
483 hmpzl->Draw("psame");
484 hbrzl->SetLineColor(kGreen+1);
485 hbrzl->SetMarkerColor(kGreen+1);
486 hbrzl->SetMarkerStyle(20);
487 hbrzl->SetMarkerSize(0.5);
496 if(hClSizAn && hClSizTb){
497 TCanvas* ccs=new TCanvas("ccs","Cluster Size",1200,600);
501 gPad->SetRightMargin(0.12);
502 hClSizAn->Draw("colz");
503 hClSizAn->GetXaxis()->SetTitle("Drift Time (ns)");
504 hClSizAn->GetYaxis()->SetTitle("Cluster Size - Anodes");
507 gPad->SetRightMargin(0.12);
508 hClSizTb->Draw("colz");
509 hClSizTb->GetXaxis()->SetTitle("Drift Time (ns)");
510 hClSizTb->GetYaxis()->SetTitle("Cluster Size - Time Bins");
514 TH1F* htimR=(TH1F*)l->FindObject("hDrTimRP");
515 TH1F* htimT=(TH1F*)l->FindObject("hDrTimTPAll");
516 TH1F* htimTe=(TH1F*)l->FindObject("hDrTimTPExtra");
517 TH1F* htimTne=(TH1F*)l->FindObject("hDrTimTPNoExtra");
522 htimR->SetLineWidth(2);
523 htimT->SetLineWidth(2);
524 htimTe->SetLineWidth(2);
525 htimTne->SetLineWidth(2);
527 TCanvas* ctim=new TCanvas("ctim","DriftTime",1400,600);
531 htimR->GetYaxis()->SetTitleOffset(1.2);
532 htimR->GetXaxis()->SetTitle("Drift Time (ns)");
533 htimR->GetYaxis()->SetTitle("RecPoints");
536 htimTe->SetLineColor(2);
537 htimTe->Draw("same");
538 htimTne->SetLineColor(4);
539 htimTne->Draw("same");
540 htimT->GetXaxis()->SetTitle("Drift Time (ns)");
541 htimT->GetYaxis()->SetTitle("TrackPoints");
542 htimT->GetYaxis()->SetTitleOffset(1.2);
543 TLatex* ta=new TLatex(0.5,0.85,"All Clusters");
547 TLatex* te=new TLatex(0.5,0.8,"Extra Clusters");
551 TLatex* tn=new TLatex(0.5,0.75,"Non-Extra Clusters");
557 TCanvas* cdedx=new TCanvas("cdedx","dedx",1400,600);
562 hdedx3->GetXaxis()->SetTitle("P (GeV/c)");
563 hdedx3->GetYaxis()->SetTitle("dE/dx (keV/300 #mum) Layer 3");
564 hdedx3->GetYaxis()->SetTitleOffset(1.25);
568 hdedx4->GetXaxis()->SetTitle("P (GeV/c)");
569 hdedx4->GetYaxis()->SetTitle("dE/dx (keV/300 #mum) Layer 4");
570 hdedx4->GetYaxis()->SetTitleOffset(1.25);
573 hdedxmod->Draw("col");
574 hdedxmod->GetXaxis()->SetTitle("SDD Module Id");
575 hdedxmod->GetYaxis()->SetTitle("dE/dx (keV/300 #mum)");
576 hdedxmod->GetYaxis()->SetTitleOffset(1.25);
579 printf("---- dE/dx vs.DriftTime ----\n");
580 TCanvas* csig=new TCanvas("csig","dedx vs. DriftTime",1000,700);
583 TGraphErrors* gmpv=new TGraphErrors(0);
584 TGraphErrors* gsigg=new TGraphErrors(0);
585 TGraphErrors* gsigl=new TGraphErrors(0);
590 TF1 *lfun = new TF1("LangausFun",LangausFun,50.,300.,4);
591 for(Int_t it=0; it<8; it++){
592 hSigTim[it]=(TH1F*)l->FindObject(Form("hSigTimeInt%d",it));
595 if(hSigTim[it]->GetEntries()>200){
596 lfun->SetLineWidth(2);
597 lfun->SetParameter(0,5.);
598 lfun->SetParameter(1,80.);
599 lfun->SetParameter(2,hSigTim[it]->GetEntries()/10.);
600 lfun->SetParameter(3,10.);
601 lfun->SetParLimits(3,0.,20);
603 hSigTim[it]->Fit("LangausFun","QLR");
604 hSigTim[it]->GetXaxis()->SetTitle(Form("dE/dx, time interval %d",it+1));
605 hSigTim[it]->GetYaxis()->SetTitle("Events");
606 Float_t mpv=lfun->GetParameter(1);
607 Float_t empv=lfun->GetParError(1);
608 Float_t sig=lfun->GetParameter(3);
609 Float_t esig=lfun->GetParError(3);
610 Float_t sigl=lfun->GetParameter(0);
611 Float_t esigl=lfun->GetParError(0);
612 gmpv->SetPoint(iPoint,(Float_t)it,mpv);
613 gmpv->SetPointError(iPoint,0.,empv);
614 gsigg->SetPoint(iPoint,(Float_t)it,sig);
615 gsigg->SetPointError(iPoint,0.,esig);
616 gsigl->SetPoint(iPoint,(Float_t)it,sigl);
617 gsigl->SetPointError(iPoint,0.,esigl);
620 printf("Bin %d - MPV=%.3f \t SigmaLandau=%.3f \t SigmaGaus=%.3f\n",it,mpv,sigl,sig);
624 TCanvas* cpars=new TCanvas("cpars","Params",800,900);
625 cpars->Divide(1,3,0.01,0.);
627 gPad->SetLeftMargin(0.14);
628 gPad->SetFrameLineWidth(2);
631 gmpv->SetMarkerStyle(20);
632 // gmpv->SetMinimum(0);
633 // gmpv->SetMaximum(120);
634 gmpv->GetXaxis()->SetLimits(-0.2,6.8);
636 // gmpv->GetXaxis()->SetTitle("Drift Time interval number");
637 gmpv->GetYaxis()->SetTitle("Landau MPV (keV)");
638 gmpv->GetXaxis()->SetTitleSize(0.05);
639 gmpv->GetYaxis()->SetTitleSize(0.05);
640 gmpv->GetYaxis()->SetTitleOffset(1.2);
642 gPad->SetLeftMargin(0.14);
643 gPad->SetFrameLineWidth(2);
646 gsigl->SetMarkerStyle(20);
647 gsigl->GetXaxis()->SetLimits(-0.2,6.8);
649 // gsigl->GetXaxis()->SetTitle("Drift Time interval number");
650 gsigl->GetYaxis()->SetTitle("#sigma_{Landau} (keV)");
651 gsigl->GetXaxis()->SetTitleSize(0.05);
652 gsigl->GetYaxis()->SetTitleSize(0.05);
653 gsigl->GetYaxis()->SetTitleOffset(1.2);
655 gPad->SetLeftMargin(0.14);
656 gPad->SetFrameLineWidth(2);
659 gsigg->SetMarkerStyle(20);
660 gsigg->GetXaxis()->SetLimits(-0.2,6.8);
662 gsigg->GetXaxis()->SetTitle("Drift Time interval number");
663 gsigg->GetYaxis()->SetTitle("#sigma_{Gauss} (keV)");
664 gsigg->GetXaxis()->SetTitleSize(0.05);
665 gsigg->GetYaxis()->SetTitleSize(0.05);
666 gsigg->GetYaxis()->SetTitleOffset(1.2);
672 Double_t LangausFun(Double_t *x, Double_t *par) {
675 //par[0]=Width (scale) parameter of Landau density
676 //par[1]=Most Probable (MP, location) parameter of Landau density
677 //par[2]=Total area (integral -inf to inf, normalization constant)
678 //par[3]=Width (sigma) of convoluted Gaussian function
680 //In the Landau distribution (represented by the CERNLIB approximation),
681 //the maximum is located at x=-0.22278298 with the location parameter=0.
682 //This shift is corrected within this function, so that the actual
683 //maximum is identical to the MP parameter.
686 Double_t invsq2pi = 0.3989422804014; // (2 pi)^(-1/2)
687 Double_t mpshift = -0.22278298; // Landau maximum location
690 Double_t np = 100.0; // number of convolution steps
691 Double_t sc = 5.0; // convolution extends to +-sc Gaussian sigmas
703 // MP shift correction
704 mpc = par[1] - mpshift * par[0];
706 // Range of convolution integral
707 xlow = x[0] - sc * par[3];
708 xupp = x[0] + sc * par[3];
710 step = (xupp-xlow) / np;
712 // Convolution integral of Landau and Gaussian by sum
713 for(i=1.0; i<=np/2; i++) {
714 xx = xlow + (i-.5) * step;
715 fland = TMath::Landau(xx,mpc,par[0]) / par[0];
716 sum += fland * TMath::Gaus(x[0],xx,par[3]);
718 xx = xupp - (i-.5) * step;
719 fland = TMath::Landau(xx,mpc,par[0]) / par[0];
720 sum += fland * TMath::Gaus(x[0],xx,par[3]);
723 return (par[2] * step * sum * invsq2pi / par[3]);