2 /*************************************************************************
3 * Copyright(c) 1998-2009, ALICE Experiment at CERN, All rights reserved. *
5 * Author: The ALICE Off-line Project. *
6 * Contributors are mentioned in the code where appropriate. *
8 * Permission to use, copy, modify and distribute this software and its *
9 * documentation strictly for non-commercial purposes is hereby granted *
10 * without fee, provided that the above copyright notice appears in all *
11 * copies and that both the copyright notice and this permission notice *
12 * appear in the supporting documentation. The authors make no claims *
13 * about the suitability of this software for any purpose. It is *
14 * provided "as is" without express or implied warranty. *
15 **************************************************************************/
17 ///////////////////////////////////////////////////////////////////////////
18 // Add general description //
27 ///////////////////////////////////////////////////////////////////////////
35 #include <AliCFContainer.h>
36 #include <AliCFGridSparse.h>
38 #include "AliDielectronSignalBase.h"
39 #include "AliDielectronSignalFunc.h"
41 #include "AliDielectronSpectrum.h"
43 ClassImp(AliDielectronSpectrum)
45 AliDielectronSpectrum::AliDielectronSpectrum() :
52 fStepSignificance(kFALSE),
55 fStepMassWidth(kFALSE),
61 fOwnerSpectrum(kTRUE),
67 fCurrentPositions(0x0)
70 // Default Constructor
72 fSignalMethods.SetOwner(kFALSE);
75 //______________________________________________
76 AliDielectronSpectrum::AliDielectronSpectrum(const char* name, const char* title) :
83 fStepSignificance(kFALSE),
86 fStepMassWidth(kFALSE),
92 fOwnerSpectrum(kTRUE),
98 fCurrentPositions(0x0)
103 fSignalMethods.SetOwner(kFALSE);
106 //______________________________________________
107 AliDielectronSpectrum::~AliDielectronSpectrum()
110 // Default Destructor
113 if (fNbins) delete [] fNbins;
114 if (fVars) delete [] fVars;
115 if (fCFCorrMatrix) delete fCFCorrMatrix;
116 if ( fOwnerSpectrum && fCFSpectrum ) delete fCFSpectrum;
119 //______________________________________________
120 void AliDielectronSpectrum::Process()
123 // Extract signal and perform correction in the specified bins
128 AliError("Cannot perform signal extraction, no signal container set");
132 if (fSignalMethods.GetEntries()==0){
133 AliWarning("No Signal extraction method specified, using a default one");
134 AliDielectronSignalFunc *func=new AliDielectronSignalFunc("gaus+exp","Gauss for Signal and Exponential background");
135 func->SetDefaults(1);
136 fSignalMethods.Add(func);
137 fSignalMethods.SetOwner();
140 //setup configured variables
141 if (!SetupVariables()) return;
143 //create container for the spectrum
147 AliError("Could not create the Spectrum container");
151 //get efficiency map if correction container is available
152 if (fCFCorrection&&!fCFCorrMatrix){
153 CreateCorrectionMatrix();
156 //loop over all configured bins and extract the signal
157 fCurrentBins=new Int_t[fNvars];
158 fCurrentPositions=new Double_t[fNvars];
159 ExtractSignalInBins();
160 delete [] fCurrentBins;
161 delete [] fCurrentPositions;
162 if (fSignalMethods.IsOwner()) {
163 fSignalMethods.Delete();
164 fSignalMethods.SetOwner(kFALSE);
169 //______________________________________________
170 Bool_t AliDielectronSpectrum::SetupVariables()
173 // Setup the variables arrays
176 TObjArray *arr=fVariables.Tokenize(":");
177 fNvars=arr->GetEntries();
178 fVars=new Int_t[fNvars];
179 fNbins=new Int_t[fNvars];
181 for (Int_t iVar=0; iVar<fNvars; ++iVar){
182 fVars[iVar]=fCFSignal->GetVar(arr->UncheckedAt(iVar)->GetName());
183 if (fVars[iVar]==-1){
184 AliError(Form("Variable '%s' not found in Signal container!",arr->UncheckedAt(iVar)->GetName()));
193 fNbins[iVar]=fCFSignal->GetNBins(fVars[iVar]);
199 //______________________________________________
200 void AliDielectronSpectrum::CreateCFSpectrum()
203 // Create CF container for the spectrum
207 if (fStepSignal) nAddStep+=2;
208 if (fStepSignificance) ++nAddStep;
209 if (fStepSOB) ++nAddStep;
210 if (fStepMass) ++nAddStep;
211 if (fStepMassWidth) ++nAddStep;
213 Int_t nStep=nAddStep*(fSignalMethods.GetEntries());
214 if (fSignalMethods.GetEntries()>1) nStep+=nAddStep;
216 fCFSpectrum = new AliCFContainer(GetName(), GetTitle(), nStep, fNvars, fNbins);
218 // initialize the variables and their bin limits
219 for (Int_t iVar=0; iVar<fNvars; iVar++) {
220 fCFSpectrum->SetBinLimits(iVar, fCFSignal->GetBinLimits(fVars[iVar]));
221 fCFSpectrum->SetVarTitle(iVar, fCFSignal->GetVarTitle(fVars[iVar]));
226 for (Int_t iMethod=0; iMethod<fSignalMethods.GetEntries(); ++iMethod){
227 TString name(fSignalMethods.UncheckedAt(iMethod)->GetName());
229 fCFSpectrum->SetStepTitle(steps++,(name+" (Signal)").Data());
230 fCFSpectrum->SetStepTitle(steps++,(name+" (Corrected Signal)").Data());
232 if (fStepSignificance){
233 fCFSpectrum->SetStepTitle(steps++,(name+" (Significance)").Data());
236 fCFSpectrum->SetStepTitle(steps++,(name+" (S/B)").Data());
239 fCFSpectrum->SetStepTitle(steps++,(name+" (Mass)").Data());
242 fCFSpectrum->SetStepTitle(steps++,(name+" (Mass width)").Data());
246 if (fSignalMethods.GetEntries()>1){
247 fCFSpectrum->SetStepTitle(steps++,"Mean of methods");
248 fCFSpectrum->SetStepTitle(steps++,"Mean of methods (Corrected)");
252 AliError("Something went wrong in the step creation");
258 //______________________________________________
259 void AliDielectronSpectrum::CreateCorrectionMatrix()
262 // Get the correction matrix for the corresponding variables
265 if (!fCFCorrection) return;
267 TObjArray *arr=fVariables.Tokenize(":");
268 Int_t nvars=arr->GetEntries();
269 Int_t *vars=new Int_t[nvars];
271 for (Int_t iVar=0; iVar<fNvars; ++iVar){
272 vars[iVar]=fCFCorrection->GetVar(arr->UncheckedAt(iVar)->GetName());
274 AliError(Form("Variable '%s' not found in Correction container!",arr->UncheckedAt(iVar)->GetName()));
282 fCFCorrMatrix =fCFCorrection->GetGrid(fCorrNom)->Project(nvars,vars,0,0);
283 AliCFGridSparse *hnDeNom=fCFCorrection->GetGrid(fCorrDenom)->Project(nvars,vars,0,0);
284 fCFCorrMatrix->Divide(hnDeNom);
288 //______________________________________________
289 void AliDielectronSpectrum::ExtractSignalInBins(Int_t variable)
292 // recursively loop over bins and extract signal
295 Int_t varPairType=fCFSignal->GetVar("PairType");
296 Int_t varMass=fCFSignal->GetVar("M");
298 for (Int_t ibin=0; ibin<fNbins[variable]; ++ibin){
300 fCFSignal->GetGrid(fSignalStep)->GetGrid()->GetAxis(fVars[variable])->SetRange(bin,bin);
301 fCurrentBins[variable]=bin;
302 fCurrentPositions[variable]=fCFSignal->GetGrid(fSignalStep)->GetBinCenter(fVars[variable],bin);
304 if (variable != fNvars-1) ExtractSignalInBins(variable+1);
306 TObjArray arrPairTypes(10);
307 arrPairTypes.SetOwner();
309 for (Int_t itype=0; itype<3; ++itype){
311 fCFSignal->SetRangeUser(varPairType,itype,itype,fSignalStep);
312 TH1 *h=fCFSignal->Project(varMass,fSignalStep);
314 arrPairTypes.AddAt(h,itype);
316 AliInfo(Form("Processing bin: %d (%.2f)",ibin, fCurrentPositions[variable]));
317 //loop over all signal extraction methods and retrieve signals
318 for (Int_t iMethod=0; iMethod<fSignalMethods.GetEntries(); ++iMethod){
319 AliDielectronSignalBase *signalMethod=(AliDielectronSignalBase*)fSignalMethods.At(iMethod);
320 signalMethod->Process(&arrPairTypes);
322 TCanvas *c=(TCanvas*)gROOT->GetListOfCanvases()->FindObject("SpectrumVisualDebug");
323 if (!c) c=new TCanvas("SpectrumVisualDebug","SpectrumVisualDebug");
326 for (Int_t ivar=0; ivar<fNvars; ++ivar) binsProc+=Form("_%02d",fCurrentBins[ivar]);
327 signalMethod->Draw("stat");
328 binsProc.Append(".png");
329 binsProc.Prepend("SpectrumVisualDebug");
331 c->Print(binsProc.Data());
333 const TVectorD &val=signalMethod->GetValues();
334 const TVectorD &err=signalMethod->GetErrors();
336 //Fill sparse containers
340 fCFSpectrum->GetGrid(step)->SetElement(fCurrentBins,val(0));
341 fCFSpectrum->GetGrid(step)->SetElementError(fCurrentBins,err(0));
346 Float_t corrFactor = fCFCorrMatrix->GetElement(fCurrentPositions);
347 Float_t corrError = fCFCorrMatrix->GetElementError(fCurrentPositions);
349 Float_t value=val(0)*corrFactor;
350 fCFSpectrum->GetGrid(step)->SetElement(fCurrentBins,value);
351 Float_t error=TMath::Sqrt( (err(0)/val(0))*(err(0)/val(0)) +
352 (corrError/corrFactor)*(corrError/corrFactor)
354 fCFSpectrum->GetGrid(step)->SetElementError(fCurrentBins,error);
355 // printf("corrFactor: %f+-%f\n",value,error);
360 if (fStepSignificance) {
361 fCFSpectrum->GetGrid(step)->SetElement(fCurrentBins,val(2));
362 fCFSpectrum->GetGrid(step)->SetElementError(fCurrentBins,err(2));
367 fCFSpectrum->GetGrid(step)->SetElement(fCurrentBins,val(3));
368 fCFSpectrum->GetGrid(step)->SetElementError(fCurrentBins,err(3));
373 fCFSpectrum->GetGrid(step)->SetElement(fCurrentBins,val(4));
374 fCFSpectrum->GetGrid(step)->SetElementError(fCurrentBins,err(4));
378 if (fStepMassWidth) {
379 fCFSpectrum->GetGrid(step)->SetElement(fCurrentBins,val(5));
380 fCFSpectrum->GetGrid(step)->SetElementError(fCurrentBins,err(5));
385 arrPairTypes.Delete();