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 **************************************************************************/
19 ///////////////////////////////////////////////////////////////////////////
20 // Add general description //
29 ///////////////////////////////////////////////////////////////////////////
37 #include <AliCFContainer.h>
38 #include <AliCFGridSparse.h>
40 #include "AliDielectronSignalBase.h"
41 #include "AliDielectronSignalFunc.h"
43 #include "AliDielectronSpectrum.h"
45 ClassImp(AliDielectronSpectrum)
47 AliDielectronSpectrum::AliDielectronSpectrum() :
54 fStepSignificance(kFALSE),
57 fStepMassWidth(kFALSE),
63 fOwnerSpectrum(kTRUE),
69 fCurrentPositions(0x0)
72 // Default Constructor
74 fSignalMethods.SetOwner(kFALSE);
77 //______________________________________________
78 AliDielectronSpectrum::AliDielectronSpectrum(const char* name, const char* title) :
85 fStepSignificance(kFALSE),
88 fStepMassWidth(kFALSE),
94 fOwnerSpectrum(kTRUE),
100 fCurrentPositions(0x0)
105 fSignalMethods.SetOwner(kFALSE);
108 //______________________________________________
109 AliDielectronSpectrum::~AliDielectronSpectrum()
112 // Default Destructor
115 if (fNbins) delete [] fNbins;
116 if (fVars) delete [] fVars;
117 if (fCFCorrMatrix) delete fCFCorrMatrix;
118 if ( fOwnerSpectrum && fCFSpectrum ) delete fCFSpectrum;
121 //______________________________________________
122 void AliDielectronSpectrum::Process()
125 // Extract signal and perform correction in the specified bins
130 AliError("Cannot perform signal extraction, no signal container set");
134 if (fSignalMethods.GetEntries()==0){
135 AliWarning("No Signal extraction method specified, using a default one");
136 AliDielectronSignalFunc *func=new AliDielectronSignalFunc("gaus+exp","Gauss for Signal and Exponential background");
137 func->SetDefaults(1);
138 fSignalMethods.Add(func);
139 fSignalMethods.SetOwner();
142 //setup configured variables
143 if (!SetupVariables()) return;
145 //create container for the spectrum
149 AliError("Could not create the Spectrum container");
153 //get efficiency map if correction container is available
154 if (fCFCorrection&&!fCFCorrMatrix){
155 CreateCorrectionMatrix();
158 //loop over all configured bins and extract the signal
159 fCurrentBins=new Int_t[fNvars];
160 fCurrentPositions=new Double_t[fNvars];
161 ExtractSignalInBins();
162 delete [] fCurrentBins;
163 delete [] fCurrentPositions;
164 if (fSignalMethods.IsOwner()) {
165 fSignalMethods.Delete();
166 fSignalMethods.SetOwner(kFALSE);
171 //______________________________________________
172 Bool_t AliDielectronSpectrum::SetupVariables()
175 // Setup the variables arrays
178 TObjArray *arr=fVariables.Tokenize(":");
179 fNvars=arr->GetEntries();
180 fVars=new Int_t[fNvars];
181 fNbins=new Int_t[fNvars];
183 for (Int_t iVar=0; iVar<fNvars; ++iVar){
184 fVars[iVar]=fCFSignal->GetVar(arr->UncheckedAt(iVar)->GetName());
185 if (fVars[iVar]==-1){
186 AliError(Form("Variable '%s' not found in Signal container!",arr->UncheckedAt(iVar)->GetName()));
195 fNbins[iVar]=fCFSignal->GetNBins(fVars[iVar]);
201 //______________________________________________
202 void AliDielectronSpectrum::CreateCFSpectrum()
205 // Create CF container for the spectrum
209 if (fStepSignal) nAddStep+=2;
210 if (fStepSignificance) ++nAddStep;
211 if (fStepSOB) ++nAddStep;
212 if (fStepMass) ++nAddStep;
213 if (fStepMassWidth) ++nAddStep;
215 Int_t nStep=nAddStep*(fSignalMethods.GetEntries());
216 if (fSignalMethods.GetEntries()>1) nStep+=nAddStep;
218 fCFSpectrum = new AliCFContainer(GetName(), GetTitle(), nStep, fNvars, fNbins);
220 // initialize the variables and their bin limits
221 for (Int_t iVar=0; iVar<fNvars; iVar++) {
222 fCFSpectrum->SetBinLimits(iVar, fCFSignal->GetBinLimits(fVars[iVar]));
223 fCFSpectrum->SetVarTitle(iVar, fCFSignal->GetVarTitle(fVars[iVar]));
228 for (Int_t iMethod=0; iMethod<fSignalMethods.GetEntries(); ++iMethod){
229 TString name(fSignalMethods.UncheckedAt(iMethod)->GetName());
231 fCFSpectrum->SetStepTitle(steps++,(name+" (Signal)").Data());
232 fCFSpectrum->SetStepTitle(steps++,(name+" (Corrected Signal)").Data());
234 if (fStepSignificance){
235 fCFSpectrum->SetStepTitle(steps++,(name+" (Significance)").Data());
238 fCFSpectrum->SetStepTitle(steps++,(name+" (S/B)").Data());
241 fCFSpectrum->SetStepTitle(steps++,(name+" (Mass)").Data());
244 fCFSpectrum->SetStepTitle(steps++,(name+" (Mass width)").Data());
248 if (fSignalMethods.GetEntries()>1){
249 fCFSpectrum->SetStepTitle(steps++,"Mean of methods");
250 fCFSpectrum->SetStepTitle(steps++,"Mean of methods (Corrected)");
254 AliError("Something went wrong in the step creation");
260 //______________________________________________
261 void AliDielectronSpectrum::CreateCorrectionMatrix()
264 // Get the correction matrix for the corresponding variables
267 if (!fCFCorrection) return;
269 TObjArray *arr=fVariables.Tokenize(":");
270 Int_t nvars=arr->GetEntries();
271 Int_t *vars=new Int_t[nvars];
273 for (Int_t iVar=0; iVar<fNvars; ++iVar){
274 vars[iVar]=fCFCorrection->GetVar(arr->UncheckedAt(iVar)->GetName());
276 AliError(Form("Variable '%s' not found in Correction container!",arr->UncheckedAt(iVar)->GetName()));
284 fCFCorrMatrix =fCFCorrection->GetGrid(fCorrNom)->Project(nvars,vars,0,0);
285 AliCFGridSparse *hnDeNom=fCFCorrection->GetGrid(fCorrDenom)->Project(nvars,vars,0,0);
286 fCFCorrMatrix->Divide(hnDeNom);
290 //______________________________________________
291 void AliDielectronSpectrum::ExtractSignalInBins(Int_t variable)
294 // recursively loop over bins and extract signal
297 Int_t varPairType=fCFSignal->GetVar("PairType");
298 Int_t varMass=fCFSignal->GetVar("M");
300 for (Int_t ibin=0; ibin<fNbins[variable]; ++ibin){
302 fCFSignal->GetGrid(fSignalStep)->GetGrid()->GetAxis(fVars[variable])->SetRange(bin,bin);
303 fCurrentBins[variable]=bin;
304 fCurrentPositions[variable]=fCFSignal->GetGrid(fSignalStep)->GetBinCenter(fVars[variable],bin);
306 if (variable != fNvars-1) ExtractSignalInBins(variable+1);
308 TObjArray arrPairTypes(10);
309 arrPairTypes.SetOwner();
311 for (Int_t itype=0; itype<3; ++itype){
313 fCFSignal->SetRangeUser(varPairType,itype,itype,fSignalStep);
314 TH1 *h=fCFSignal->Project(varMass,fSignalStep);
316 arrPairTypes.AddAt(h,itype);
318 AliInfo(Form("Processing bin: %d (%.2f)",ibin, fCurrentPositions[variable]));
319 //loop over all signal extraction methods and retrieve signals
320 for (Int_t iMethod=0; iMethod<fSignalMethods.GetEntries(); ++iMethod){
321 AliDielectronSignalBase *signalMethod=(AliDielectronSignalBase*)fSignalMethods.At(iMethod);
322 signalMethod->Process(&arrPairTypes);
324 TCanvas *c=(TCanvas*)gROOT->GetListOfCanvases()->FindObject("SpectrumVisualDebug");
325 if (!c) c=new TCanvas("SpectrumVisualDebug","SpectrumVisualDebug");
328 for (Int_t ivar=0; ivar<fNvars; ++ivar) binsProc+=Form("_%02d",fCurrentBins[ivar]);
329 signalMethod->Draw("stat");
330 binsProc.Append(".png");
331 binsProc.Prepend("SpectrumVisualDebug");
333 c->Print(binsProc.Data());
335 const TVectorD &val=signalMethod->GetValues();
336 const TVectorD &err=signalMethod->GetErrors();
338 //Fill sparse containers
342 fCFSpectrum->GetGrid(step)->SetElement(fCurrentBins,val(0));
343 fCFSpectrum->GetGrid(step)->SetElementError(fCurrentBins,err(0));
348 Float_t corrFactor = fCFCorrMatrix->GetElement(fCurrentPositions);
349 Float_t corrError = fCFCorrMatrix->GetElementError(fCurrentPositions);
351 Float_t value=val(0)*corrFactor;
352 fCFSpectrum->GetGrid(step)->SetElement(fCurrentBins,value);
353 Float_t error=TMath::Sqrt( (err(0)/val(0))*(err(0)/val(0)) +
354 (corrError/corrFactor)*(corrError/corrFactor)
356 fCFSpectrum->GetGrid(step)->SetElementError(fCurrentBins,error);
357 // printf("corrFactor: %f+-%f\n",value,error);
362 if (fStepSignificance) {
363 fCFSpectrum->GetGrid(step)->SetElement(fCurrentBins,val(2));
364 fCFSpectrum->GetGrid(step)->SetElementError(fCurrentBins,err(2));
369 fCFSpectrum->GetGrid(step)->SetElement(fCurrentBins,val(3));
370 fCFSpectrum->GetGrid(step)->SetElementError(fCurrentBins,err(3));
375 fCFSpectrum->GetGrid(step)->SetElement(fCurrentBins,val(4));
376 fCFSpectrum->GetGrid(step)->SetElementError(fCurrentBins,err(4));
380 if (fStepMassWidth) {
381 fCFSpectrum->GetGrid(step)->SetElement(fCurrentBins,val(5));
382 fCFSpectrum->GetGrid(step)->SetElementError(fCurrentBins,err(5));
387 arrPairTypes.Delete();