]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWG3/dielectron/AliDielectronSignalExt.cxx
75b6aefdb411ba974cac1758dea155ca35e04ef1
[u/mrichter/AliRoot.git] / PWG3 / dielectron / AliDielectronSignalExt.cxx
1 /*************************************************************************
2 * Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
3 *                                                                        *
4 * Author: The ALICE Off-line Project.                                    *
5 * Contributors are mentioned in the code where appropriate.              *
6 *                                                                        *
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 **************************************************************************/
15
16 ///////////////////////////////////////////////////////////////////////////
17 //                                                                       //
18 //                      Dielectron SignalExt                             //
19 //                                                                       //
20 /*
21 Dielectron signal extraction class using functions as input.
22
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
25 can be used.
26
27 */
28 //                                                                       //
29 ///////////////////////////////////////////////////////////////////////////
30 #include <TF1.h>
31 #include <TH1.h>
32 #include <TH2F.h>
33 #include <TLatex.h>
34 #include <TLegend.h>
35 #include <TCanvas.h>
36 #include <TMath.h>
37 #include <TString.h>
38 #include <TLine.h>
39
40 #include <AliLog.h>
41
42 #include "AliDielectronSignalExt.h"
43
44 ClassImp(AliDielectronSignalExt)
45
46 AliDielectronSignalExt::AliDielectronSignalExt() :
47   AliDielectronSignalBase()
48 {
49   //
50   // Default Constructor
51   //
52 }
53
54 //______________________________________________
55 AliDielectronSignalExt::AliDielectronSignalExt(const char* name, const char* title) :
56   AliDielectronSignalBase(name, title)
57 {
58   //
59   // Named Constructor
60   //
61 }
62
63 //______________________________________________
64 AliDielectronSignalExt::~AliDielectronSignalExt()
65 {
66   //
67   // Default Destructor
68   //
69 }
70
71 //______________________________________________
72 void AliDielectronSignalExt::Process(TObjArray* const arrhist)
73 {
74   // 
75   // signal subtraction. support like-sign subtraction and event mixing method
76   //
77   switch ( fMethod ){
78     case kLikeSign :
79       ProcessLS(arrhist);    // process like-sign subtraction method
80       break;
81
82     case kEventMixing : 
83       ProcessEM(arrhist);    // process event mixing method
84       break;
85
86     default :
87       AliWarning("Subtraction method not supported. Please check SetMethod() function.");
88   }
89 }
90
91 //______________________________________________
92 void AliDielectronSignalExt::ProcessLS(TObjArray* const arrhist)
93 {
94   //
95   // signal subtraction 
96   //
97   fHistDataPP = (TH1F*)(arrhist->At(0))->Clone("histPP");  // ++    SE
98   fHistDataPM = (TH1F*)(arrhist->At(1))->Clone("histPM");  // +-    SE
99   fHistDataMM = (TH1F*)(arrhist->At(2))->Clone("histMM");  // --    SE   
100   fHistDataPP->Sumw2();
101   fHistDataPM->Sumw2();
102   fHistDataMM->Sumw2();
103   
104   // rebin the histograms
105   if (fRebin>1) { 
106     fHistDataPP->Rebin(fRebin);
107     fHistDataPM->Rebin(fRebin);
108     fHistDataMM->Rebin(fRebin);
109   }       
110
111   fHistSignal = new TH1F("HistSignal", "Like-Sign substracted signal", 
112                          fHistDataPM->GetXaxis()->GetNbins(),
113                          fHistDataPM->GetXaxis()->GetXmin(), fHistDataPM->GetXaxis()->GetXmax());
114   fHistBackground = new TH1F("HistBackground", "Like-sign contribution", 
115                              fHistDataPM->GetXaxis()->GetNbins(),
116                              fHistDataPM->GetXaxis()->GetXmin(), fHistDataPM->GetXaxis()->GetXmax());
117
118   // fill out background and subtracted histogram
119   for(Int_t ibin=1; ibin<=fHistDataPM->GetXaxis()->GetNbins(); ibin++) {
120     Float_t pm = fHistDataPM->GetBinContent(ibin);
121     Float_t pp = fHistDataPP->GetBinContent(ibin);
122     Float_t mm = fHistDataMM->GetBinContent(ibin);
123     Float_t epm = fHistDataPM->GetBinError(ibin);
124
125     Float_t background = 2*TMath::Sqrt(pp*mm);
126     Float_t ebackground = TMath::Sqrt(mm+pp);
127     Float_t signal = pm - background;
128     Float_t error = TMath::Sqrt(epm*epm+mm+pp);
129
130     fHistSignal->SetBinContent(ibin, signal);
131     fHistSignal->SetBinError(ibin, error);
132     fHistBackground->SetBinContent(ibin, background);
133     fHistBackground->SetBinError(ibin, ebackground);
134   }
135   // signal
136   fValues(0) = fHistSignal->IntegralAndError(fHistSignal->FindBin(fIntMin),
137                                              fHistSignal->FindBin(fIntMax), fErrors(0));
138   // background
139   fValues(1) = fHistBackground->IntegralAndError(fHistBackground->FindBin(fIntMin),
140                                                   fHistBackground->FindBin(fIntMax), 
141                                                   fErrors(1));
142   // S/B and significance
143   SetSignificanceAndSOB();
144
145   fProcessed = kTRUE;
146 }
147
148 //______________________________________________
149 void AliDielectronSignalExt::ProcessEM(TObjArray* const arrhist)
150 {
151   //
152   // event mixing. not implemented yet.
153   //
154   printf("event mixing method is not implemented yet. Like-sign method will be used.\n");
155   ProcessLS(arrhist);
156 }
157
158 //______________________________________________
159 void AliDielectronSignalExt::Draw(const Option_t* option)
160 {
161   //
162   // Draw the fitted function
163   //
164   TString drawOpt(option); 
165   drawOpt.ToLower();   
166
167   Float_t minY = 0.001;
168   Float_t maxY = 1.2*fHistDataPM->GetMaximum();
169   Float_t minX = 1.001*fHistDataPM->GetXaxis()->GetXmin();
170   Float_t maxX = 0.999*fHistDataPM->GetXaxis()->GetXmax();
171   Int_t binSize = Int_t(1000*fHistDataPM->GetBinWidth(1));   // in MeV
172   Float_t minMinY = fHistSignal->GetMinimum();
173
174   TCanvas *cSub = new TCanvas("cSub","signal, background subtracted",1400,1000);
175   cSub->SetLeftMargin(0.15);
176   cSub->SetRightMargin(0.0);
177   cSub->SetTopMargin(0.002);
178   cSub->SetBottomMargin(0.0);
179   cSub->Divide(2,2,0.,0.);
180   cSub->Draw();
181
182   TVirtualPad* pad = cSub->cd(1);
183   pad->SetLeftMargin(0.15);
184   pad->SetRightMargin(0.0);
185   pad->SetTopMargin(0.005);
186   pad->SetBottomMargin(0.0);
187   TH2F *range1=new TH2F("range1","",10,minX,maxX,10,minY,maxY);
188   range1->SetStats(kFALSE);
189   range1->GetYaxis()->SetTitle(Form("entries [counts per %d MeV bin]", binSize));
190   range1->GetYaxis()->CenterTitle();
191   range1->GetYaxis()->SetLabelSize(0.05);
192   range1->GetYaxis()->SetTitleSize(0.06);
193   range1->GetYaxis()->SetTitleOffset(0.8);
194   range1->Draw();
195   fHistDataPM->SetLineColor(1);
196   fHistDataPM->SetLineWidth(2);
197   //  fHistDataPM->SetMarkerStyle(21);
198   fHistDataPM->Draw("Psame");
199   TLatex *latex = new TLatex();
200   latex->SetNDC();
201   latex->SetTextSize(0.05);
202   latex->DrawLatex(0.2, 0.95, "Background un-substracted");
203   TLine line;
204   line.SetLineWidth(1);
205   line.SetLineStyle(2);
206   line.DrawLine(fIntMin, minY, fIntMin, maxY);
207   line.DrawLine(fIntMax, minY, fIntMax, maxY);
208
209   pad = cSub->cd(2);
210   pad->SetLeftMargin(0.);
211   pad->SetRightMargin(0.005);
212   pad->SetTopMargin(0.005);
213   pad->SetBottomMargin(0.0);
214   TH2F *range2=new TH2F("range2","",10,minX,maxX,10,minY,maxY);
215   range2->SetStats(kFALSE);
216   range2->Draw();
217   fHistBackground->SetLineColor(4);
218   fHistBackground->SetLineWidth(2);
219   //  fHistBackground->SetMarkerColor(4);
220   //  fHistBackground->SetMarkerStyle(6);
221   fHistBackground->Draw("Psame");
222   latex->DrawLatex(0.05, 0.95, "Like-sign background");
223   line.DrawLine(fIntMin, minY, fIntMin, maxY);
224   line.DrawLine(fIntMax, minY, fIntMax, maxY);
225   TLegend *legend = new TLegend(0.65, 0.70, 0.98, 0.98);
226   legend->SetFillColor(0);
227   legend->SetMargin(0.15);
228   legend->AddEntry(fHistDataPM, "N_{+-}", "l");
229   legend->AddEntry(fHistDataPP, "N_{++}", "l");
230   legend->AddEntry(fHistDataMM, "N_{--}", "l");
231   legend->AddEntry(fHistSignal, "N_{+-} - 2 #sqrt{N_{++} #times N_{--}}", "l");
232   legend->AddEntry(fHistBackground, "2 #sqrt{N_{++} #times N_{--}}", "l");
233   legend->Draw();
234
235   
236   pad = cSub->cd(3);
237   pad->SetLeftMargin(0.15);
238   pad->SetRightMargin(0.0);
239   pad->SetTopMargin(0.0);
240   pad->SetBottomMargin(0.15);
241   TH2F *range3=new TH2F("range3","",10,minX,maxX,10,minMinY,maxY);
242   range3->SetStats(kFALSE);
243   range3->GetYaxis()->SetTitle(Form("entries [counts per %d MeV bin]", binSize));
244   range3->GetYaxis()->CenterTitle();
245   range3->GetYaxis()->SetLabelSize(0.05);
246   range3->GetYaxis()->SetTitleSize(0.06);
247   range3->GetYaxis()->SetTitleOffset(0.8);
248   range3->GetXaxis()->SetTitle("inv. mass [GeV/c^{2}]");
249   range3->GetXaxis()->CenterTitle();
250   range3->GetXaxis()->SetLabelSize(0.05);
251   range3->GetXaxis()->SetTitleSize(0.06);
252   range3->GetXaxis()->SetTitleOffset(1.0);
253   range3->Draw();
254   fHistDataPM->Draw("Psame");
255   fHistDataPP->SetLineWidth(2);
256   fHistDataPP->SetLineColor(6);
257   fHistDataMM->SetLineWidth(2);
258   fHistDataMM->SetLineColor(8);
259   fHistDataPP->Draw("Psame");
260   fHistDataMM->Draw("Psame");
261   line.DrawLine(minX, 0.,maxX, 0.);
262   line.DrawLine(fIntMin, minMinY, fIntMin, maxY);
263   line.DrawLine(fIntMax, minMinY, fIntMax, maxY);
264
265   pad = cSub->cd(4);
266   pad->SetLeftMargin(0.0);
267   pad->SetRightMargin(0.005);
268   pad->SetTopMargin(0.0);
269   pad->SetBottomMargin(0.15);
270   TH2F *range4=new TH2F("range4","",10,minX,maxX,10,minMinY,maxY);
271   range4->SetStats(kFALSE);
272   range4->GetXaxis()->SetTitle("inv. mass [GeV/c^{2}]");
273   range4->GetXaxis()->CenterTitle();
274   range4->GetXaxis()->SetLabelSize(0.05);
275   range4->GetXaxis()->SetTitleSize(0.06);
276   range4->GetXaxis()->SetTitleOffset(1.0);
277   range4->Draw();
278   fHistSignal->SetLineWidth(2);
279   fHistSignal->SetLineColor(2);
280   fHistSignal->Draw("Psame");
281   latex->DrawLatex(0.05, 0.95, "Like-sign background substracted");
282   if(fProcessed) DrawStats(0.05, 0.6, 0.5, 0.9);
283   line.DrawLine(minX, 0.,maxX, 0.);
284   line.DrawLine(fIntMin, minMinY, fIntMin, maxY);
285   line.DrawLine(fIntMax, minMinY, fIntMax, maxY);
286 }
287