1 /*************************************************************************
2 * Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
16 ///////////////////////////////////////////////////////////////////////////
18 // Dielectron SignalExt //
21 Dielectron signal extraction class using functions as input.
23 A function to describe the signal as well as one to describe the background
24 has to be deployed by the user. Alternatively on of the default implementaions
29 ///////////////////////////////////////////////////////////////////////////
42 #include "AliDielectronSignalExt.h"
44 ClassImp(AliDielectronSignalExt)
46 AliDielectronSignalExt::AliDielectronSignalExt() :
47 AliDielectronSignalBase()
50 // Default Constructor
54 //______________________________________________
55 AliDielectronSignalExt::AliDielectronSignalExt(const char* name, const char* title) :
56 AliDielectronSignalBase(name, title)
63 //______________________________________________
64 AliDielectronSignalExt::~AliDielectronSignalExt()
71 //______________________________________________
72 void AliDielectronSignalExt::Process(TObjArray* const arrhist)
75 // signal subtraction. support like-sign subtraction and event mixing method
79 case kLikeSignArithm :
80 ProcessLS(arrhist); // process like-sign subtraction method
84 ProcessEM(arrhist); // process event mixing method
88 ProcessRotation(arrhist);
92 AliWarning("Subtraction method not supported. Please check SetMethod() function.");
96 //______________________________________________
97 void AliDielectronSignalExt::ProcessLS(TObjArray* const arrhist)
100 // signal subtraction
102 fHistDataPP = (TH1*)(arrhist->At(0))->Clone("histPP"); // ++ SE
103 fHistDataPM = (TH1*)(arrhist->At(1))->Clone("histPM"); // +- SE
104 fHistDataMM = (TH1*)(arrhist->At(2))->Clone("histMM"); // -- SE
105 fHistDataPP->Sumw2();
106 fHistDataPM->Sumw2();
107 fHistDataMM->Sumw2();
108 fHistDataPP->SetDirectory(0);
109 fHistDataPM->SetDirectory(0);
110 fHistDataMM->SetDirectory(0);
112 // rebin the histograms
114 fHistDataPP->Rebin(fRebin);
115 fHistDataPM->Rebin(fRebin);
116 fHistDataMM->Rebin(fRebin);
119 fHistSignal = new TH1D("HistSignal", "Like-Sign substracted signal",
120 fHistDataPM->GetXaxis()->GetNbins(),
121 fHistDataPM->GetXaxis()->GetXmin(), fHistDataPM->GetXaxis()->GetXmax());
122 fHistSignal->SetDirectory(0);
123 fHistBackground = new TH1D("HistBackground", "Like-sign contribution",
124 fHistDataPM->GetXaxis()->GetNbins(),
125 fHistDataPM->GetXaxis()->GetXmin(), fHistDataPM->GetXaxis()->GetXmax());
126 fHistBackground->SetDirectory(0);
128 // fill out background and subtracted histogram
129 for(Int_t ibin=1; ibin<=fHistDataPM->GetXaxis()->GetNbins(); ibin++) {
130 Float_t pm = fHistDataPM->GetBinContent(ibin);
131 Float_t pp = fHistDataPP->GetBinContent(ibin);
132 Float_t mm = fHistDataMM->GetBinContent(ibin);
133 Float_t epm = fHistDataPM->GetBinError(ibin);
135 Float_t background = 2*TMath::Sqrt(pp*mm);
136 Float_t ebackground = TMath::Sqrt(mm+pp);
137 if (fMethod==kLikeSignArithm){
138 //Arithmetic mean instead of geometric
140 ebackground=TMath::Sqrt(pp+mm);
141 if (TMath::Abs(ebackground)<1e-30) ebackground=1;
143 // Float_t signal = pm - background;
144 // Float_t error = TMath::Sqrt(epm*epm+mm+pp);
146 fHistSignal->SetBinContent(ibin, pm);
147 fHistSignal->SetBinError(ibin, epm);
148 fHistBackground->SetBinContent(ibin, background);
149 fHistBackground->SetBinError(ibin, ebackground);
151 //scale histograms to match integral between fScaleMin and fScaleMax
152 if (fScaleMax>fScaleMin) fScaleFactor=ScaleHistograms(fHistDataPM,fHistBackground,fScaleMin,fScaleMax);
155 fHistSignal->Add(fHistBackground,-1);
158 fValues(0) = fHistSignal->IntegralAndError(fHistSignal->FindBin(fIntMin),
159 fHistSignal->FindBin(fIntMax), fErrors(0));
161 fValues(1) = fHistBackground->IntegralAndError(fHistBackground->FindBin(fIntMin),
162 fHistBackground->FindBin(fIntMax),
164 // S/B and significance
165 SetSignificanceAndSOB();
170 //______________________________________________
171 void AliDielectronSignalExt::ProcessEM(TObjArray* const arrhist)
174 // event mixing. not implemented yet.
176 printf("event mixing method is not implemented yet. Like-sign method will be used.\n");
180 //______________________________________________
181 void AliDielectronSignalExt::ProcessRotation(TObjArray* const arrhist)
184 // signal subtraction
186 fHistDataPM = (TH1*)(arrhist->At(1))->Clone("histPM"); // +- SE
188 AliError("Unlike sign histogram not available. Cannot extract the signal.");
191 fHistDataPM->Sumw2();
193 fHistBackground=(TH1*)arrhist->At(10)->Clone("histRotation");
194 if (!fHistBackground){
195 AliError("Histgram from rotation not available. Cannot extract the signal.");
201 //scale histograms to match integral between fScaleMin and fScaleMax
202 if (fScaleMax>fScaleMin) fScaleFactor=ScaleHistograms(fHistDataPM,fHistBackground,fScaleMin,fScaleMax);
204 fHistSignal=(TH1*)fHistDataPM->Clone("histSignal");
205 fHistSignal->Add(fHistBackground,-1.);
208 fValues(0) = fHistSignal->IntegralAndError(fHistSignal->FindBin(fIntMin),
209 fHistSignal->FindBin(fIntMax), fErrors(0));
211 fValues(1) = fHistBackground->IntegralAndError(fHistBackground->FindBin(fIntMin),
212 fHistBackground->FindBin(fIntMax),
214 // S/B and significance
215 SetSignificanceAndSOB();
221 //______________________________________________
222 void AliDielectronSignalExt::Draw(const Option_t* option)
225 // Draw the fitted function
227 TString drawOpt(option);
230 Float_t minY = 0.001;
231 Float_t maxY = 1.2*fHistDataPM->GetMaximum();
232 Float_t minX = 1.001*fHistDataPM->GetXaxis()->GetXmin();
233 Float_t maxX = 0.999*fHistDataPM->GetXaxis()->GetXmax();
234 Int_t binSize = Int_t(1000*fHistDataPM->GetBinWidth(1)); // in MeV
235 Float_t minMinY = fHistSignal->GetMinimum();
237 TCanvas *cSub = new TCanvas(Form("%s", fName.Data()),Form("%s", fTitle.Data()),1400,1000);
238 cSub->SetLeftMargin(0.15);
239 cSub->SetRightMargin(0.0);
240 cSub->SetTopMargin(0.002);
241 cSub->SetBottomMargin(0.0);
242 cSub->Divide(2,2,0.,0.);
245 TVirtualPad* pad = cSub->cd(1);
246 pad->SetLeftMargin(0.15);
247 pad->SetRightMargin(0.0);
248 pad->SetTopMargin(0.005);
249 pad->SetBottomMargin(0.0);
250 TH2F *range1=new TH2F("range1","",10,minX,maxX,10,minY,maxY);
251 range1->SetStats(kFALSE);
252 range1->GetYaxis()->SetTitle(Form("entries [counts per %d MeV bin]", binSize));
253 range1->GetYaxis()->CenterTitle();
254 range1->GetYaxis()->SetLabelSize(0.05);
255 range1->GetYaxis()->SetTitleSize(0.06);
256 range1->GetYaxis()->SetTitleOffset(0.8);
258 fHistDataPM->SetLineColor(1);
259 fHistDataPM->SetLineWidth(2);
260 // fHistDataPM->SetMarkerStyle(21);
261 fHistDataPM->Draw("Psame");
262 TLatex *latex = new TLatex();
264 latex->SetTextSize(0.05);
265 latex->DrawLatex(0.2, 0.95, "Background un-substracted");
267 line.SetLineWidth(1);
268 line.SetLineStyle(2);
269 line.DrawLine(fIntMin, minY, fIntMin, maxY);
270 line.DrawLine(fIntMax, minY, fIntMax, maxY);
273 pad->SetLeftMargin(0.);
274 pad->SetRightMargin(0.005);
275 pad->SetTopMargin(0.005);
276 pad->SetBottomMargin(0.0);
277 TH2F *range2=new TH2F("range2","",10,minX,maxX,10,minY,maxY);
278 range2->SetStats(kFALSE);
280 fHistBackground->SetLineColor(4);
281 fHistBackground->SetLineWidth(2);
282 // fHistBackground->SetMarkerColor(4);
283 // fHistBackground->SetMarkerStyle(6);
284 fHistBackground->Draw("Psame");
285 latex->DrawLatex(0.05, 0.95, "Like-sign background");
286 line.DrawLine(fIntMin, minY, fIntMin, maxY);
287 line.DrawLine(fIntMax, minY, fIntMax, maxY);
288 TLegend *legend = new TLegend(0.65, 0.70, 0.98, 0.98);
289 legend->SetFillColor(0);
290 legend->SetMargin(0.15);
291 legend->AddEntry(fHistDataPM, "N_{+-}", "l");
292 legend->AddEntry(fHistDataPP, "N_{++}", "l");
293 legend->AddEntry(fHistDataMM, "N_{--}", "l");
294 legend->AddEntry(fHistSignal, "N_{+-} - 2 #sqrt{N_{++} #times N_{--}}", "l");
295 legend->AddEntry(fHistBackground, "2 #sqrt{N_{++} #times N_{--}}", "l");
300 pad->SetLeftMargin(0.15);
301 pad->SetRightMargin(0.0);
302 pad->SetTopMargin(0.0);
303 pad->SetBottomMargin(0.15);
304 TH2F *range3=new TH2F("range3","",10,minX,maxX,10,minMinY,maxY);
305 range3->SetStats(kFALSE);
306 range3->GetYaxis()->SetTitle(Form("entries [counts per %d MeV bin]", binSize));
307 range3->GetYaxis()->CenterTitle();
308 range3->GetYaxis()->SetLabelSize(0.05);
309 range3->GetYaxis()->SetTitleSize(0.06);
310 range3->GetYaxis()->SetTitleOffset(0.8);
311 range3->GetXaxis()->SetTitle("inv. mass [GeV/c^{2}]");
312 range3->GetXaxis()->CenterTitle();
313 range3->GetXaxis()->SetLabelSize(0.05);
314 range3->GetXaxis()->SetTitleSize(0.06);
315 range3->GetXaxis()->SetTitleOffset(1.0);
317 fHistDataPM->Draw("Psame");
318 fHistDataPP->SetLineWidth(2);
319 fHistDataPP->SetLineColor(6);
320 fHistDataMM->SetLineWidth(2);
321 fHistDataMM->SetLineColor(8);
322 fHistDataPP->Draw("Psame");
323 fHistDataMM->Draw("Psame");
324 line.DrawLine(minX, 0.,maxX, 0.);
325 line.DrawLine(fIntMin, minMinY, fIntMin, maxY);
326 line.DrawLine(fIntMax, minMinY, fIntMax, maxY);
329 pad->SetLeftMargin(0.0);
330 pad->SetRightMargin(0.005);
331 pad->SetTopMargin(0.0);
332 pad->SetBottomMargin(0.15);
333 TH2F *range4=new TH2F("range4","",10,minX,maxX,10,minMinY,maxY);
334 range4->SetStats(kFALSE);
335 range4->GetXaxis()->SetTitle("inv. mass [GeV/c^{2}]");
336 range4->GetXaxis()->CenterTitle();
337 range4->GetXaxis()->SetLabelSize(0.05);
338 range4->GetXaxis()->SetTitleSize(0.06);
339 range4->GetXaxis()->SetTitleOffset(1.0);
341 fHistSignal->SetLineWidth(2);
342 fHistSignal->SetLineColor(2);
343 fHistSignal->Draw("Psame");
344 latex->DrawLatex(0.05, 0.95, "Like-sign background substracted");
345 if(fProcessed) DrawStats(0.05, 0.6, 0.5, 0.9);
346 line.DrawLine(minX, 0.,maxX, 0.);
347 line.DrawLine(fIntMin, minMinY, fIntMin, maxY);
348 line.DrawLine(fIntMax, minMinY, fIntMax, maxY);
350 cSub->SaveAs(Form("%s_summary.png", fName.Data()));