1 /**************************************************************************
2 * Copyright(c) 1998-1999, 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 **************************************************************************/
17 // AliAnalysisMuMuSpectra : a class to encapsulate results from MuMu analysis
19 // Spectra can be merged and converted into histograms
21 // author: L. Aphecetche (Subatech)
24 #include "AliAnalysisMuMuSpectra.h"
27 #include "AliAnalysisMuMuBinning.h"
28 #include "AliAnalysisMuMuJpsiResult.h"
29 #include "Riostream.h"
32 #include "TObjArray.h"
34 ClassImp(AliAnalysisMuMuSpectra)
36 //______________________________________________________________________________
37 AliAnalysisMuMuSpectra::AliAnalysisMuMuSpectra(const char* name, const char* title) :
46 //______________________________________________________________________________
47 AliAnalysisMuMuSpectra::AliAnalysisMuMuSpectra(const AliAnalysisMuMuSpectra& rhs)
48 : TNamed(rhs.GetName(),rhs.GetTitle()),
57 fBinning = new AliAnalysisMuMuBinning(*rhs.fBinning);
60 TIter next(rhs.fBins);
61 AliAnalysisMuMuResult* bin;
63 while ( ( bin = static_cast<AliAnalysisMuMuResult*>(next()) ) )
67 fBins = new TObjArray;
68 fBins->SetOwner(kTRUE);
76 //______________________________________________________________________________
77 AliAnalysisMuMuSpectra&
78 AliAnalysisMuMuSpectra::operator=(const AliAnalysisMuMuSpectra& rhs)
80 // assignment operator
82 if (this==&rhs) return *this;
91 fBinning = new AliAnalysisMuMuBinning(*rhs.fBinning);
94 TIter next(rhs.fBins);
95 AliAnalysisMuMuResult* bin;
97 while ( ( bin = static_cast<AliAnalysisMuMuResult*>(next()) ) )
101 fBins = new TObjArray;
102 fBins->SetOwner(kTRUE);
107 fWeight = rhs.Weight();
112 //______________________________________________________________________________
113 AliAnalysisMuMuSpectra::~AliAnalysisMuMuSpectra()
120 //______________________________________________________________________________
121 void AliAnalysisMuMuSpectra::AdoptResult(const AliAnalysisMuMuBinning::Range& bin,
122 AliAnalysisMuMuResult* result)
124 // adopt (i.e. we are becoming the owner) a result for a given bin
127 fBinning = new AliAnalysisMuMuBinning;
128 fBins = new TObjArray;
129 fBins->SetOwner(kTRUE);
131 fBinning->AddBin(bin);
135 //______________________________________________________________________________
136 Bool_t AliAnalysisMuMuSpectra::Correct(const AliAnalysisMuMuSpectra& accEff, const char* particle, const char* subResultName)
138 /// Correct this spectra by acceff one
141 AliError("Cannot correct an empty spectra !");
145 // check we have the same binning first
146 AliAnalysisMuMuBinning* accEffBins = accEff.Binning();
148 if ( !fBinning->IsEqual(accEffBins) )
150 AliError("Cannot correct with a spectra which does not have the same binning");
154 TObjArray* particles = fBinning->CreateWhatArray();
155 TObjArray* types = fBinning->CreateQuantityArray();
157 if (particles->GetEntries()!=1 || types->GetEntries()!=1 )
164 TObjArray* bins = accEff.BinContentArray();
167 for ( Int_t i = 0; i < bins->GetEntries(); ++i )
169 AliAnalysisMuMuJpsiResult* thisResult = static_cast<AliAnalysisMuMuJpsiResult*>(fBins->At(i));
170 AliAnalysisMuMuJpsiResult* accResult = static_cast<AliAnalysisMuMuJpsiResult*>(bins->At(i));
171 // AliInfoClass(Form("i=%d",i ));
172 // StdoutToAliInfoClass(thisResult->Print("full");
173 // std::cout << "----" << std::endl;
174 // accResult->Print("full"));
176 thisResult->Correct(*accResult,particle,subResultName);
184 //______________________________________________________________________________
185 AliAnalysisMuMuResult*
186 AliAnalysisMuMuSpectra::GetResultForBin(const AliAnalysisMuMuBinning::Range& bin) const
188 /// Get result for a given bin
189 /// Warning: this requires a loop on bins
191 if ( IsEmpty() ) return 0x0;
193 TObjArray* bins = fBinning->CreateBinObjArray();
197 StdoutToAliDebug(1,std::cout << "searching for "; bin.Print());
199 for ( Int_t i = 0; i <= bins->GetLast() && j < 0 ; ++i )
201 AliAnalysisMuMuBinning::Range* b = static_cast<AliAnalysisMuMuBinning::Range*>(bins->At(i));
203 StdoutToAliDebug(1,b->Print(););
215 return static_cast<AliAnalysisMuMuResult*>(fBins->At(j));
219 StdoutToAliDebug(1,std::cout << "Could not find result for bin:" << std::endl; bin.Print(););
224 //______________________________________________________________________________
225 Bool_t AliAnalysisMuMuSpectra::HasValue(const char* what) const
227 // whether or not our result(s) has a given property
228 if ( IsEmpty() ) return kFALSE;
230 AliAnalysisMuMuResult* r = static_cast<AliAnalysisMuMuResult*>(fBins->First());
232 return r->HasValue(what);
235 //______________________________________________________________________________
236 Bool_t AliAnalysisMuMuSpectra::IsEmpty() const
238 // whether this spectra is empty or not
239 return ( fBins==0x0 || fBins->GetEntries()<=0 );
242 //______________________________________________________________________________
243 Long64_t AliAnalysisMuMuSpectra::Merge(TCollection* list)
247 // Merge a list of AliAnalysisMuMuSpectra objects with this
248 // Returns the number of merged objects (including this).
252 if (list->IsEmpty()) return 1;
260 // for each bin must do a list of results, and merge that list
262 TObjArray* bins = fBinning->CreateBinObjArray();
264 AliAnalysisMuMuBinning::Range* bin;
268 while ( ( bin = static_cast<AliAnalysisMuMuBinning::Range*>(nextBin()) ) )
274 while ( ( currObj = next() ) )
276 AliAnalysisMuMuSpectra* spectra = static_cast<AliAnalysisMuMuSpectra*>(currObj);
280 binningList.Add(spectra->Binning());
282 if ( !fBinning->IsEqual(spectra->Binning()) || spectra->BinContentArray()->GetLast() != BinContentArray()->GetLast() )
284 AliError("Cannot merge spectra with different binning");
290 binList.Add(spectra->GetResultForBin(*bin));
295 AliAnalysisMuMuResult* r = static_cast<AliAnalysisMuMuResult*>(GetResultForBin(*bin));
305 //_____________________________________________________________________________
306 TH1* AliAnalysisMuMuSpectra::Plot(const char* what, const char* subresult, Bool_t divideByBinWidth) const
308 // Convert the spectra into an histogram
313 Double_t* bins = fBinning->CreateBinArray();
315 TObjArray* binArray = fBinning->CreateBinObjArray();
319 AliDebug(1,Form("nbins=%d nresults=%d",binArray->GetEntries(),fBins->GetEntries()));
321 for ( Int_t j = 0; j < TMath::Min(binArray->GetEntries(),fBins->GetEntries()); ++j )
323 AliAnalysisMuMuJpsiResult* r = static_cast<AliAnalysisMuMuJpsiResult*>(fBins->At(j));
325 if ( strlen(subresult) > 0 && r->SubResults() )
327 TString sub(subresult);
329 r = static_cast<AliAnalysisMuMuJpsiResult*>(r->SubResult(sub.Data()));
333 const AliAnalysisMuMuBinning::Range& b = r->Bin();
337 h = new TH1F(r->GetName(),r->GetName(),binArray->GetEntries(),bins);
341 Double_t y = r->GetValue(what);
342 Double_t yerr = r->GetErrorStat(what);
344 if ( divideByBinWidth && b.WidthX()>0 )
347 yerr /= (b.WidthX());
350 if (!TMath::Finite(y)) y = 0.0;
351 if (!TMath::Finite(yerr)) yerr = 0.0;
353 std::cout << b.AsString();
354 r->PrintValue(swhat.Data(),"",y,yerr);
356 h->SetBinContent(j+1,y);
357 h->SetBinError(j+1,yerr);
368 //______________________________________________________________________________
369 void AliAnalysisMuMuSpectra::Print(Option_t* opt) const
376 Int_t nmax = sopt.Atoi();
377 if ( nmax <= 0 ) nmax = fBins->GetEntries();
378 for ( Int_t i = 0; i < nmax; ++i )
380 AliAnalysisMuMuResult* r = static_cast<AliAnalysisMuMuResult*>(fBins->At(i));
381 if (r) r->Print(opt);
386 //______________________________________________________________________________
387 void AliAnalysisMuMuSpectra::Scale(Double_t value)
389 // scale all bins by value
392 AliAnalysisMuMuResult* r;
394 while ( ( r = static_cast<AliAnalysisMuMuResult*>(next()) ) )
400 //______________________________________________________________________________
401 void AliAnalysisMuMuSpectra::SetWeight(Double_t w)
403 // Set the weight of this spectra
406 AliAnalysisMuMuResult* r;
408 while ( ( r = static_cast<AliAnalysisMuMuResult*>(next()) ) )
410 r->SetWeight(Weight());