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"
33 #include "TObjArray.h"
35 ClassImp(AliAnalysisMuMuSpectra)
37 //______________________________________________________________________________
38 AliAnalysisMuMuSpectra::AliAnalysisMuMuSpectra(const char* name, const char* title) :
47 //______________________________________________________________________________
48 AliAnalysisMuMuSpectra::AliAnalysisMuMuSpectra(const AliAnalysisMuMuSpectra& rhs)
49 : TNamed(rhs.GetName(),rhs.GetTitle()),
58 fBinning = new AliAnalysisMuMuBinning(*rhs.fBinning);
61 TIter next(rhs.fBins);
62 AliAnalysisMuMuResult* bin;
64 while ( ( bin = static_cast<AliAnalysisMuMuResult*>(next()) ) )
68 fBins = new TObjArray;
69 fBins->SetOwner(kTRUE);
77 //______________________________________________________________________________
78 AliAnalysisMuMuSpectra&
79 AliAnalysisMuMuSpectra::operator=(const AliAnalysisMuMuSpectra& rhs)
81 // assignment operator
83 if (this==&rhs) return *this;
92 fBinning = new AliAnalysisMuMuBinning(*rhs.fBinning);
95 TIter next(rhs.fBins);
96 AliAnalysisMuMuResult* bin;
98 while ( ( bin = static_cast<AliAnalysisMuMuResult*>(next()) ) )
102 fBins = new TObjArray;
103 fBins->SetOwner(kTRUE);
108 fWeight = rhs.Weight();
113 //______________________________________________________________________________
114 AliAnalysisMuMuSpectra::~AliAnalysisMuMuSpectra()
121 //______________________________________________________________________________
122 Bool_t AliAnalysisMuMuSpectra::AdoptResult(const AliAnalysisMuMuBinning::Range& bin,
123 AliAnalysisMuMuResult* result)
125 // adopt (i.e. we are becoming the owner) a result for a given bin
128 AliError("Cannot adopt a null result");
134 fBinning = new AliAnalysisMuMuBinning;
135 fBins = new TObjArray;
136 fBins->SetOwner(kTRUE);
138 fBinning->AddBin(bin); // Add a bin to the spectra
140 Int_t sizeBeforeAdd = fBins->GetEntriesFast();
141 fBins->Add(result); // Add the result to the recently added bin
142 Int_t sizeAfterAdd = fBins->GetEntriesFast();
143 if ( sizeBeforeAdd >= sizeAfterAdd )
145 AliError(Form("Error adopting result %s to spectra %s",result->GetName(),GetName()));
151 //______________________________________________________________________________
152 Bool_t AliAnalysisMuMuSpectra::Correct(const AliAnalysisMuMuSpectra& accEff, const char* particle, const char* subResultName)
154 /// Correct this spectra by acceff one
157 AliError("Cannot correct an empty spectra !");
161 // check we have the same binning first
162 AliAnalysisMuMuBinning* accEffBins = accEff.Binning();
164 if ( !fBinning->IsEqual(accEffBins) )
166 AliError("Cannot correct with a spectra which does not have the same binning");
170 TObjArray* particles = fBinning->CreateWhatArray();
171 TObjArray* types = fBinning->CreateQuantityArray();
173 // FIXME : cross-check what happens here with a binning containing
174 // centralities, etc...
176 if (particles->GetEntries()!=1 || types->GetEntries()!=1 )
183 TObjArray* bins = accEff.BinContentArray();
186 for ( Int_t i = 0; i < bins->GetEntries(); ++i )
188 AliAnalysisMuMuJpsiResult* thisResult = static_cast<AliAnalysisMuMuJpsiResult*>(fBins->At(i));
189 AliAnalysisMuMuJpsiResult* accResult = static_cast<AliAnalysisMuMuJpsiResult*>(bins->At(i));
190 // AliInfoClass(Form("i=%d",i ));
191 // StdoutToAliInfoClass(thisResult->Print("full");
192 // std::cout << "----" << std::endl;
193 // accResult->Print("full"));
195 thisResult->Correct(*accResult,particle,subResultName);
203 //______________________________________________________________________________
204 AliAnalysisMuMuResult*
205 AliAnalysisMuMuSpectra::GetResultForBin(const AliAnalysisMuMuBinning::Range& bin) const
207 /// Get result for a given bin
208 /// Warning: this requires a loop on bins
210 if ( IsEmpty() ) return 0x0;
212 TObjArray* bins = fBinning->CreateBinObjArray();
216 StdoutToAliDebug(1,std::cout << "searching for "; bin.Print());
218 for ( Int_t i = 0; i <= bins->GetLast() && j < 0 ; ++i )
220 AliAnalysisMuMuBinning::Range* b = static_cast<AliAnalysisMuMuBinning::Range*>(bins->At(i));
222 StdoutToAliDebug(1,b->Print(););
234 return static_cast<AliAnalysisMuMuResult*>(fBins->At(j));
238 StdoutToAliDebug(1,std::cout << "Could not find result for bin:" << std::endl; bin.Print(););
243 //______________________________________________________________________________
244 AliAnalysisMuMuResult*
245 AliAnalysisMuMuSpectra::GetResultForBin(const char* binName) const
247 /// Get result for a given bin
248 /// Warning: this requires a loop on bins
250 if ( IsEmpty() ) return 0x0;
252 TObjArray* bins = fBinning->CreateBinObjArray();
256 AliDebug(1,Form("searching for bin %s",binName));
258 for ( Int_t i = 0; i <= bins->GetLast() && j < 0 ; ++i )
260 AliAnalysisMuMuBinning::Range* b = static_cast<AliAnalysisMuMuBinning::Range*>(bins->At(i));
262 if ( b->AsString() == binName )
272 return static_cast<AliAnalysisMuMuResult*>(fBins->At(j));
276 AliDebug(1,Form("Could not find result for bin %s",binName));
281 //______________________________________________________________________________
282 Bool_t AliAnalysisMuMuSpectra::HasValue(const char* what) const
284 // whether or not our result(s) has a given property
285 if ( IsEmpty() ) return kFALSE;
287 AliAnalysisMuMuResult* r = static_cast<AliAnalysisMuMuResult*>(fBins->First());
289 return r->HasValue(what);
292 //______________________________________________________________________________
293 Bool_t AliAnalysisMuMuSpectra::IsEmpty() const
295 // whether this spectra is empty or not
296 return ( fBins==0x0 || fBins->GetEntries()<=0 );
299 //______________________________________________________________________________
300 Long64_t AliAnalysisMuMuSpectra::Merge(TCollection* list)
304 // Merge a list of AliAnalysisMuMuSpectra objects with this
305 // Returns the number of merged objects (including this).
309 if (list->IsEmpty()) return 1;
317 // for each bin must do a list of results, and merge that list
319 TObjArray* bins = fBinning->CreateBinObjArray();
321 AliAnalysisMuMuBinning::Range* bin;
325 while ( ( bin = static_cast<AliAnalysisMuMuBinning::Range*>(nextBin()) ) )
331 while ( ( currObj = next() ) )
333 AliAnalysisMuMuSpectra* spectra = static_cast<AliAnalysisMuMuSpectra*>(currObj);
337 binningList.Add(spectra->Binning());
339 if ( !fBinning->IsEqual(spectra->Binning()) || spectra->BinContentArray()->GetLast() != BinContentArray()->GetLast() )
341 AliError("Cannot merge spectra with different binning");
347 binList.Add(spectra->GetResultForBin(*bin));
352 AliAnalysisMuMuResult* r = static_cast<AliAnalysisMuMuResult*>(GetResultForBin(*bin));
362 //_____________________________________________________________________________
363 TH1* AliAnalysisMuMuSpectra::Plot(const char* what, const char* subresult, Bool_t divideByBinWidth) const
365 // Convert the spectra into an histogram
368 TString swhatT(what);
371 Double_t* bins = fBinning->CreateBinArray();
372 Double_t* binsX = fBinning->CreateBinArrayX();
373 Double_t* binsY = fBinning->CreateBinArrayY();
375 Int_t nbinsX = fBinning->GetNBinsX();
376 Int_t nbinsY = fBinning->GetNBinsY();
378 TObjArray* binArray = fBinning->CreateBinObjArray();
382 AliDebug(1,Form("nbins=%d nresults=%d",binArray->GetEntries(),fBins->GetEntries()));
384 for ( Int_t j = 0; j < TMath::Min(binArray->GetEntries(),fBins->GetEntries()); ++j )
386 AliAnalysisMuMuJpsiResult* r = static_cast<AliAnalysisMuMuJpsiResult*>(fBins->At(j));
388 if ( strlen(subresult) > 0 && r->SubResults() )
390 TString sub(subresult);
391 r = static_cast<AliAnalysisMuMuJpsiResult*>(r->SubResult(sub.Data()));
395 const AliAnalysisMuMuBinning::Range& b = r->Bin();
401 h = new TH2F(r->GetName(),r->GetName(),nbinsX,binsX,nbinsY,binsY);
405 Double_t z = r->GetValue(swhatT.Data());
406 Double_t zerr = r->GetErrorStat(swhatT.Data());
408 if ( swhat.Contains("AccEff",TString::kIgnoreCase) )
410 if ( z < 0. || z > 5.)
417 if ( divideByBinWidth && b.WidthX()>0 )
419 z /= (b.WidthX()*b.WidthY());
420 zerr /= (b.WidthX()*b.WidthY());
424 std::cout << b.AsString();
425 r->PrintValue(swhat.Data(),"",z,zerr);
427 Int_t x = j/nbinsY + 1;
428 Int_t y = (j % nbinsY) + 1;
430 std::cout << "x=" << x << ";" << "y=" << y << std::endl;
432 h->SetBinContent(x,y,z);
433 h->SetBinError(x,y,zerr);
441 h = new TH1F(r->GetName(),r->GetName(),binArray->GetEntries(),bins);
445 Double_t y = r->GetValue(swhatT.Data());
446 Double_t yerr = r->GetErrorStat(swhatT.Data());
448 if ( divideByBinWidth && b.WidthX()>0 )
451 yerr /= (b.WidthX());
454 if (!TMath::Finite(y)) y = 0.0;
455 if (!TMath::Finite(yerr)) yerr = 0.0;
457 std::cout << b.AsString();
458 r->PrintValue(swhat.Data(),"",y,yerr);
460 h->SetBinContent(j+1,y);
461 h->SetBinError(j+1,yerr);
474 //______________________________________________________________________________
475 void AliAnalysisMuMuSpectra::Print(Option_t* opt) const
482 Int_t nmax = sopt.Atoi();
483 if ( nmax <= 0 ) nmax = fBins->GetEntries();
484 for ( Int_t i = 0; i < nmax; ++i )
486 AliAnalysisMuMuResult* r = static_cast<AliAnalysisMuMuResult*>(fBins->At(i));
487 if (r) r->Print(opt);
492 //______________________________________________________________________________
493 void AliAnalysisMuMuSpectra::Scale(Double_t value)
495 // scale all bins by value
498 AliAnalysisMuMuResult* r;
500 while ( ( r = static_cast<AliAnalysisMuMuResult*>(next()) ) )
506 //______________________________________________________________________________
507 void AliAnalysisMuMuSpectra::SetWeight(Double_t w)
509 // Set the weight of this spectra
512 AliAnalysisMuMuResult* r;
514 while ( ( r = static_cast<AliAnalysisMuMuResult*>(next()) ) )
516 r->SetWeight(Weight());