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 ///////////////////////////////////////////////////////////////////////////
17 // Dielectron Histogram framework helper //
31 ///////////////////////////////////////////////////////////////////////////
33 #include <TObjArray.h>
40 #include <TObjString.h>
47 #include "AliDielectron.h"
48 #include "AliDielectronHFhelper.h"
49 #include "AliDielectronHF.h"
51 //ClassImp(AliDielectronHFhelper)
53 //const char* AliDielectronHFhelper::fCutVars[AliDielectronHFhelper::kMaxCuts] = {"","","","","","","","","",""};
55 //________________________________________________________________
56 AliDielectronHFhelper::AliDielectronHFhelper(const char* filename, const char* container) :
64 // get HF container(s) from file 'filename'
66 SetHFArray(filename, container);
70 //________________________________________________________________
71 AliDielectronHFhelper::~AliDielectronHFhelper()
76 if(fArrPairType) delete fArrPairType;
77 if(fCutVars) delete fCutVars;
81 //________________________________________________________________
82 void AliDielectronHFhelper::SetHFArray(const char* filename, const char* container)
85 // get HF containers from file
88 TFile *f = TFile::Open(filename);
90 TList *l=f->GetListOfKeys();
93 while ( (k=static_cast<TKey*>(nextKey())) ){
95 TObject *o=k->ReadObj();
96 if (o->IsA()==TList::Class()){
98 TList *tlist=(TList*)o;
102 while ((obj = next())) {
103 TString objname(obj->GetName());
105 if( objname.Contains(Form("%s_HF",container)) && obj->IsA()==TObjArray::Class()) {
106 fArrPairType = new TObjArray( *(dynamic_cast<TObjArray*>(obj)) );
107 //fArrPairType->Print();
115 //________________________________________________________________
116 void AliDielectronHFhelper::SetRangeUser(const char *varname, Double_t min, Double_t max, Bool_t leg)
119 // Set range from variable name
121 // Int_t size=sizeof(fCutVars)/sizeof(const char*);
123 Int_t size=fCutLowLimits.GetNrows();
125 // check if cut is already set
126 for(Int_t icut=0; icut<size; icut++) {
127 TString cutName = fCutVars->At(icut)->GetName();
128 if(!cutName.CompareTo(Form("%s%s",(leg?"Leg":""),varname))) {
129 UnsetRangeUser(varname,leg);
130 SetRangeUser(varname, min, max, leg);
135 if(size>=kMaxCuts) return;
139 fCutVars = new TObjArray();
140 fCutVars->SetOwner();
142 fCutLowLimits.ResizeTo(size+1);
143 fCutUpLimits.ResizeTo(size+1);
146 TObjString *str = new TObjString(Form("%s%s",(leg?"Leg":""),varname));
148 fCutLowLimits(size) = min;
149 fCutUpLimits(size) = max;
150 AliWarning(Form(" %s [%.2f,%.2f]",fCutVars->At(size)->GetName(),fCutLowLimits(size),fCutUpLimits(size)));
153 //________________________________________________________________
154 void AliDielectronHFhelper::SetRangeUser(AliDielectronVarManager::ValueTypes type, Double_t min, Double_t max, Bool_t leg)
157 // Set range from AliDielectronVarManager
159 SetRangeUser(AliDielectronVarManager::GetValueName(type), min, max, leg);
162 //________________________________________________________________
163 void AliDielectronHFhelper::UnsetRangeUser(const char *varname, Bool_t leg)
166 // unset range from variable name
168 Int_t size=fCutLowLimits.GetNrows();
173 // find cut and build new vectors w/o it
175 for(Int_t icut=0; icut<size; icut++) {
177 TString cutName = fCutVars->At(icut)->GetName();
178 if(!cutName.CompareTo(Form("%s%s",(leg?"Leg":""),varname))) {
179 fCutVars->AddAt(0x0,icut);
184 newlow.ResizeTo(ientries+1);
185 newup.ResizeTo(ientries+1);
186 newlow(ientries) = fCutLowLimits(icut);
187 newup(ientries) = fCutUpLimits(icut);
192 // adapt new arrays/vectors
193 fCutVars->Compress();
195 fCutLowLimits.ResizeTo(ientries);
196 fCutUpLimits.ResizeTo(ientries);
197 for(Int_t icut=0; icut<ientries; icut++) {
198 fCutLowLimits(icut) = newlow(icut);
199 fCutUpLimits(icut) = newup(icut);
205 //________________________________________________________________
206 void AliDielectronHFhelper::UnsetRangeUser(AliDielectronVarManager::ValueTypes type, Bool_t leg)
209 // Unset range from AliDielectronVarManager
211 UnsetRangeUser(AliDielectronVarManager::GetValueName(type), leg);
214 //________________________________________________________________
215 TObjArray* AliDielectronHFhelper::CollectHistos()
218 // collect histograms for all kind of pair types or sources
221 TObjArray *collection = new TObjArray(AliDielectron::kEv1PMRot+1);
223 TObjArray *histArr = (TObjArray*) fArrPairType->Clone("tmpArr");
224 histArr->SetOwner(kTRUE);
226 // loop over max. available pair types
227 for(Int_t i=0; i<AliDielectron::kEv1PMRot+1; i++) {
229 collection->AddAt(GetHistogram(AliDielectron::PairClassName(i),histArr), i);
233 // clean up the clone
242 //________________________________________________________________
243 TH1F* AliDielectronHFhelper::GetHistogram(const char *step, TObjArray *histArr)
246 // main function to recieve a single histogram
247 // TODO: check memory
249 AliDebug(1,Form(" Step %s selected",step));
251 TObjArray *histos= 0x0;
254 histos = (TObjArray*) fArrPairType->FindObject(step)->Clone("tmpArr");
257 histos = (TObjArray*) histArr->FindObject(step);
260 if(histos) hist = FindHistograms(histos);
265 //________________________________________________________________
266 TH1F* AliDielectronHFhelper::FindHistograms(TObjArray *histos)
269 // exclude histograms
273 // TString title = histos->At(0)->GetTitle();
274 // TObjArray* vars = title.Tokenize(":");
275 // AliDebug(1,Form(" number of cuts/vars: %d/%d",fCutLowLimits.GetNrows(),vars->GetEntriesFast()));
277 // check for missing cuts
280 // loop over all cuts
281 for(Int_t icut=0; icut<fCutLowLimits.GetNrows(); icut++) {
283 Bool_t bFndBin = kFALSE; // exact bin found
284 const char *cutvar = fCutVars->At(icut)->GetName();
285 Double_t min = fCutLowLimits(icut);
286 Double_t max = fCutUpLimits(icut);
287 AliDebug(5,Form(" Cut %d: %s [%.2f,%.2f]",icut,cutvar,min,max));
289 // loop over all histograms
290 for(Int_t i=0; i<histos->GetEntriesFast(); i++) {
292 // continue if already empty
293 if(!histos->At(i)) continue;
295 // collect binning from histo title
296 TString title = histos->At(i)->GetTitle();
297 if(title.IsNull()) continue;
298 AliDebug(10,Form(" histo title: %s",title.Data()));
300 TObjArray *vars = title.Tokenize(":");
301 for(Int_t ivar=0; ivar<vars->GetEntriesFast(); ivar++) {
302 TString binvar = vars->At(ivar)->GetName();
303 AliDebug(10,Form(" Check ivar %d binvar %s",ivar,binvar.Data()));
305 // check for cuts and ranges by the user
306 if(binvar.Contains(cutvar)) {
307 TObjArray *limits = binvar.Tokenize("#");
309 Double_t binmin = atof(limits->At(1)->GetName());
310 Double_t binmax = atof(limits->At(2)->GetName());
311 AliDebug(10,Form(" bin %s var %s [%.2f,%.2f]",binvar.Data(),limits->At(0)->GetName(),binmin,binmax));
313 // remove histogram from array
314 if(binmin < min || binmax < min || binmin > max || binmax > max ) {
315 AliDebug(10,Form(" removed, out of range min %.2f,%.2f max %.2f,%.2f",binmin,min,binmax,max));
316 histos->AddAt(0x0,i);
318 if(bFndBin && !(binmin == min && binmax == max)) {
319 histos->AddAt(0x0,i);
320 AliDebug(10,Form(" removed, within range min %.2f,%.2f max %.2f,%.2f",binmin,min,binmax,max));
323 if(limits) delete limits;
325 // do we have found an exact bin
326 if(binmin==min && binmax==max) bFndBin=kTRUE;
332 if(vars) delete vars;
338 // compress the array by removing all empty histos
340 AliDebug(1,Form(" Compression: %d histograms left",histos->GetEntriesFast()));
343 TH1F* hist = MergeHistos(histos);
344 if(hist) AliDebug(1,Form(" Merging: %e histogram entries",hist->GetEntries()));
348 //________________________________________________________________
349 TH1F* AliDielectronHFhelper::MergeHistos(TObjArray *arr)
352 // merge histos to one single histogram
355 if(arr->GetEntriesFast()<1) { AliError(" No more histosgrams left!"); return 0x0; }
357 TH1F *final=(TH1F*) arr->At(0)->Clone();
358 if(!final) return 0x0;
361 final->SetTitle(""); //TODO: change in future
362 for(Int_t i=0; i<arr->GetEntriesFast(); i++) {
363 final->Add((TH1F*)arr->At(i));
370 //________________________________________________________________
371 void AliDielectronHFhelper::CheckCuts(TObjArray *arr)
374 // Compare histo binning and cut variables. Add necessary cuts (largest limits)
378 // build array with bin variable, minimum and maximum bin values
379 TString titleFIRST = arr->First()->GetTitle();
380 TString titleLAST = arr->Last()->GetTitle();
381 TObjArray* binvarsF = titleFIRST.Tokenize(":#");
382 TObjArray* binvarsL = titleLAST.Tokenize(":#");
383 Double_t binmin[kMaxCuts]= {0.0};
384 Double_t binmax[kMaxCuts]= {0.0};
385 for(Int_t ivar=0; ivar<binvarsF->GetEntriesFast(); ivar++) {
387 TString elementF=binvarsF->At(ivar)->GetName();
388 TString elementL=binvarsL->At(ivar)->GetName();
389 AliDebug(1,Form(" binvar %d: %s,%s",ivar,elementF.Data(),elementL.Data()));
392 case 0: continue; break;
393 case 1: binmin[(int)ivar/3]=atof(elementF.Data()); break;
394 case 2: binmax[(int)ivar/3]=atof(elementL.Data()); break;
397 binvarsF->AddAt(0x0,ivar);
399 binvarsF->Compress();
401 // loop over all vars and cuts, check for missing stuff
402 for(Int_t ivar=0; ivar<binvarsF->GetEntriesFast(); ivar++) {
404 TString binvar=binvarsF->At(ivar)->GetName();
405 Bool_t selected=kFALSE;
407 AliDebug(1,Form(" check cuts %d %s [%.2f,%.2f]",ivar,binvar.Data(),binmin[ivar],binmax[ivar]));
408 // loop over all cuts and check for missing stuff
409 for(Int_t icut=0; icut<fCutLowLimits.GetNrows(); icut++) {
410 if(binvar.Contains(fCutVars->At(icut)->GetName())) { selected=kTRUE; break; }
414 // add missing cut with max limits
416 AliWarning(Form(" Bin variable %s not covered. Add cut!",binvar.Data()));
417 Bool_t leg = binvar.BeginsWith("Leg");
418 if(leg) binvar.Remove(0,3);
419 SetRangeUser(binvar.Data(),binmin[ivar],binmax[ivar], leg);
425 if(binvarsF) delete binvarsF;
426 if(binvarsL) delete binvarsL;
429 //________________________________________________________________
430 void AliDielectronHFhelper::Print(const Option_t* /*option*/) const
434 // Print out object contents
436 AliInfo(Form(" Container: %s",fArrPairType->GetName()));
438 // pairtypes, steps and sources
439 AliInfo(Form(" Number of filled steps: %d",fArrPairType->GetEntries()));
440 for(Int_t istep=0; istep<fArrPairType->GetEntriesFast(); istep++) {
441 if(fArrPairType->At(istep))
442 AliInfo(Form(" step %d: %s",istep,fArrPairType->At(istep)->GetName()));
445 AliInfo(Form(" Number of histograms: %d",((TObjArray*)fArrPairType->At(0))->GetEntriesFast()));
447 TString title = ((TObjArray*)fArrPairType->At(0))->First()->GetTitle();
448 TObjArray* binvars = title.Tokenize(":");
449 AliInfo(Form(" Number of variables: %d",binvars->GetEntriesFast()));
451 TObjArray* binvars2 = title.Tokenize(":#");
452 for(Int_t ivar=0; ivar<binvars2->GetEntriesFast(); ivar++) {
454 AliInfo(Form(" variable %.0f: %s",((Double_t)ivar)/3+1,binvars2->At(ivar)->GetName()));
459 //________________________________________________________________
460 void AliDielectronHFhelper::PrintCuts()
464 // Print out object contents
467 // loop over all cuts
468 AliInfo(" Selected cuts:");
469 for(Int_t icut=0; icut<fCutLowLimits.GetNrows(); icut++)
470 AliInfo(Form(" %d: %s [%.2f,%.2f]",icut,fCutVars->At(icut)->GetName(),fCutLowLimits(icut),fCutUpLimits(icut)));