ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/


// AliAnalysisMuMuSpectra : a class to encapsulate results from MuMu analysis
//
// Spectra can be merged and converted into histograms
//
// author: L. Aphecetche (Subatech)
//

#include "AliAnalysisMuMuSpectra.h"

#include "AliLog.h"
#include "AliAnalysisMuMuBinning.h"
#include "AliAnalysisMuMuJpsiResult.h"
#include "Riostream.h"
#include "TH1.h"
#include "TH2.h"
#include "TList.h"
#include "TObjArray.h"

ClassImp(AliAnalysisMuMuSpectra)

//______________________________________________________________________________
AliAnalysisMuMuSpectra::AliAnalysisMuMuSpectra(const char* name, const char* title) :
TNamed(name,title),
fBinning(0x0),
fBins(0x0),
fWeight(1.0)
{
  // default ctor
}

//______________________________________________________________________________
AliAnalysisMuMuSpectra::AliAnalysisMuMuSpectra(const AliAnalysisMuMuSpectra& rhs)
: TNamed(rhs.GetName(),rhs.GetTitle()),
fBinning(0x0),
fBins(0x0),
fWeight(rhs.Weight())
{
  // copy ctor

  if ( rhs.fBinning )
  {
    fBinning = new AliAnalysisMuMuBinning(*rhs.fBinning);
  }

  TIter next(rhs.fBins);
  AliAnalysisMuMuResult* bin;
  
  while ( ( bin = static_cast<AliAnalysisMuMuResult*>(next()) ) )
  {
    if (!fBins)
    {
      fBins = new TObjArray;
      fBins->SetOwner(kTRUE);
    }
    fBins->Add(bin);
  }
  
  
}

//______________________________________________________________________________
AliAnalysisMuMuSpectra&
AliAnalysisMuMuSpectra::operator=(const AliAnalysisMuMuSpectra& rhs)
{
  // assignment operator
  
  if (this==&rhs) return *this;
  
  delete fBinning;
  fBinning = 0x0;
  delete fBins;
  fBins = 0x0;
  
  if ( rhs.fBinning )
  {
    fBinning = new AliAnalysisMuMuBinning(*rhs.fBinning);
  }
  
  TIter next(rhs.fBins);
  AliAnalysisMuMuResult* bin;
  
  while ( ( bin = static_cast<AliAnalysisMuMuResult*>(next()) ) )
  {
    if (!fBins)
    {
      fBins = new TObjArray;
      fBins->SetOwner(kTRUE);
    }
    fBins->Add(bin);
  }
  
  fWeight = rhs.Weight();
  
  return *this;
}

//______________________________________________________________________________
AliAnalysisMuMuSpectra::~AliAnalysisMuMuSpectra()
{
  // dtor
  delete fBinning;
  delete fBins;
}

//______________________________________________________________________________
Bool_t AliAnalysisMuMuSpectra::AdoptResult(const AliAnalysisMuMuBinning::Range& bin,
                                         AliAnalysisMuMuResult* result)
{
  // adopt (i.e. we are becoming the owner) a result for a given bin
  if ( !result )
  {
    AliError("Cannot adopt a null result");
    return kFALSE
    ;
  }
  if (!fBinning)
  {
    fBinning = new AliAnalysisMuMuBinning;
    fBins = new TObjArray;
    fBins->SetOwner(kTRUE);
  }
  fBinning->AddBin(bin); // Add a bin to the spectra
  
  Int_t sizeBeforeAdd = fBins->GetEntriesFast();
  fBins->Add(result); // Add the result to the recently added bin
  Int_t sizeAfterAdd = fBins->GetEntriesFast();
  if ( sizeBeforeAdd >= sizeAfterAdd )
  {
   AliError(Form("Error adopting result %s to spectra %s",result->GetName(),GetName()));
    return kFALSE;
  }
  else return kTRUE;
}

//______________________________________________________________________________
Bool_t AliAnalysisMuMuSpectra::Correct(const AliAnalysisMuMuSpectra& accEff, const char* particle, const char* subResultName)
{
  /// Correct this spectra by acceff one
  if (IsEmpty())
  {
    AliError("Cannot correct an empty spectra !");
    return kFALSE;
  }
  
  // check we have the same binning first
  AliAnalysisMuMuBinning* accEffBins = accEff.Binning();
  
  if ( !fBinning->IsEqual(accEffBins) )
  {
    AliError("Cannot correct with a spectra which does not have the same binning");
    return kFALSE;
  }
  
  TObjArray* particles = fBinning->CreateWhatArray();
  TObjArray* types = fBinning->CreateQuantityArray();
  
  // FIXME : cross-check what happens here with a binning containing
  // centralities, etc...
  
  if (particles->GetEntries()!=1 || types->GetEntries()!=1 )
  {
    delete particles;
    delete types;
    return kFALSE;
  }
  
  TObjArray* bins = accEff.BinContentArray();

  
  for ( Int_t i = 0; i < bins->GetEntries(); ++i )
  {
    AliAnalysisMuMuJpsiResult* thisResult = static_cast<AliAnalysisMuMuJpsiResult*>(fBins->At(i));
    AliAnalysisMuMuJpsiResult* accResult = static_cast<AliAnalysisMuMuJpsiResult*>(bins->At(i));
//    AliInfoClass(Form("i=%d",i ));
//    StdoutToAliInfoClass(thisResult->Print("full");
//                         std::cout << "----" << std::endl;
//                         accResult->Print("full"));
    
    thisResult->Correct(*accResult,particle,subResultName);
  }
  
  delete particles;
  delete types;
  return kTRUE;
}

//______________________________________________________________________________
AliAnalysisMuMuResult*
AliAnalysisMuMuSpectra::GetResultForBin(const AliAnalysisMuMuBinning::Range& bin) const
{
  /// Get result for a given bin
  /// Warning: this requires a loop on bins
  
  if ( IsEmpty() ) return 0x0;
  
  TObjArray* bins = fBinning->CreateBinObjArray();
  
  Int_t j(-1);
  
  StdoutToAliDebug(1,std::cout << "searching for "; bin.Print());
  
  for ( Int_t i = 0; i <= bins->GetLast() && j < 0 ; ++i )
  {
    AliAnalysisMuMuBinning::Range* b = static_cast<AliAnalysisMuMuBinning::Range*>(bins->At(i));

    StdoutToAliDebug(1,b->Print(););
    
    if ( bin == *b )
    {
      j = i;
    }
  }
  
  delete bins;
  
  if (j>=0)
  {
    return static_cast<AliAnalysisMuMuResult*>(fBins->At(j));
  }
  else
  {
    StdoutToAliDebug(1,std::cout << "Could not find result for bin:" << std::endl; bin.Print(););
  }
  return 0x0;
}

//______________________________________________________________________________
AliAnalysisMuMuResult*
AliAnalysisMuMuSpectra::GetResultForBin(const char* binName) const
{
  /// Get result for a given bin
  /// Warning: this requires a loop on bins
  
  if ( IsEmpty() ) return 0x0;
  
  TObjArray* bins = fBinning->CreateBinObjArray();
  
  Int_t j(-1);
  
  AliDebug(1,Form("searching for bin %s",binName));
  
  for ( Int_t i = 0; i <= bins->GetLast() && j < 0 ; ++i )
  {
    AliAnalysisMuMuBinning::Range* b = static_cast<AliAnalysisMuMuBinning::Range*>(bins->At(i));
    
    if ( b->AsString() == binName )
    {
      j = i;
    }
  }
  
  delete bins;
  
  if (j>=0)
  {
    return static_cast<AliAnalysisMuMuResult*>(fBins->At(j));
  }
  else
  {
    AliDebug(1,Form("Could not find result for bin %s",binName));
  }
  return 0x0;
}

//______________________________________________________________________________
Bool_t AliAnalysisMuMuSpectra::HasValue(const char* what) const
{
    // whether or not our result(s) has a given property
  if ( IsEmpty() ) return kFALSE;
  
  AliAnalysisMuMuResult* r = static_cast<AliAnalysisMuMuResult*>(fBins->First());
  
  return r->HasValue(what);
}

//______________________________________________________________________________
Bool_t AliAnalysisMuMuSpectra::IsEmpty() const
{
  // whether this spectra is empty or not
  return ( fBins==0x0 || fBins->GetEntries()<=0 );
}

//______________________________________________________________________________
Long64_t AliAnalysisMuMuSpectra::Merge(TCollection* list)
{
  /// Merge method
  
  // Merge a list of AliAnalysisMuMuSpectra objects with this
  // Returns the number of merged objects (including this).
  
  if (!list) return 0;
  
  if (list->IsEmpty()) return 1;
  
  TIter next(list);
  TObject* currObj;
  Int_t count(0);
  
  TList binningList;
  
  // for each bin must do a list of results, and merge that list
  
  TObjArray* bins = fBinning->CreateBinObjArray();
  TIter nextBin(bins);
  AliAnalysisMuMuBinning::Range* bin;

  Int_t i(0);
  
  while ( ( bin = static_cast<AliAnalysisMuMuBinning::Range*>(nextBin()) ) )
  {
    next.Reset();
    
    TList binList;
    
    while ( ( currObj = next() ) )
    {
      AliAnalysisMuMuSpectra* spectra = static_cast<AliAnalysisMuMuSpectra*>(currObj);

      if (i==0)
      {
        binningList.Add(spectra->Binning());
  
        if ( !fBinning->IsEqual(spectra->Binning()) || spectra->BinContentArray()->GetLast() != BinContentArray()->GetLast() )
        {
          AliError("Cannot merge spectra with different binning");
          continue;
        }
        ++count;
      }
      
      binList.Add(spectra->GetResultForBin(*bin));
    }
    
    ++i;
    
    AliAnalysisMuMuResult* r = static_cast<AliAnalysisMuMuResult*>(GetResultForBin(*bin));
    r->Merge(&binList);
    
  }

  delete bins;
  
  return count+1;
}

//_____________________________________________________________________________
TH1* AliAnalysisMuMuSpectra::Plot(const char* what, const char* subresult, Bool_t divideByBinWidth) const
{
  // Convert the spectra into an histogram
  
  TString swhat(what);
  TString swhatT(what);
  swhat.ToUpper();
  
  Double_t* bins = fBinning->CreateBinArray();
  Double_t* binsX = fBinning->CreateBinArrayX();
  Double_t* binsY = fBinning->CreateBinArrayY();
  
  Int_t nbinsX = fBinning->GetNBinsX();
  Int_t nbinsY = fBinning->GetNBinsY();
  
  TObjArray* binArray = fBinning->CreateBinObjArray();
  
  TH1* h(0x0);
  
  AliDebug(1,Form("nbins=%d nresults=%d",binArray->GetEntries(),fBins->GetEntries()));
  
  for ( Int_t j = 0; j < TMath::Min(binArray->GetEntries(),fBins->GetEntries()); ++j )
  {
    AliAnalysisMuMuJpsiResult* r = static_cast<AliAnalysisMuMuJpsiResult*>(fBins->At(j));
    
    if ( strlen(subresult) > 0 && r->SubResults() )
    {
      TString sub(subresult);
      r = static_cast<AliAnalysisMuMuJpsiResult*>(r->SubResult(sub.Data()));
      if (!r) continue;
    }
    
    const AliAnalysisMuMuBinning::Range& b = r->Bin();
    
    if ( b.Is2D() )
    {
      if (!h)
      {
        h = new TH2F(r->GetName(),r->GetName(),nbinsX,binsX,nbinsY,binsY);
        h->SetDirectory(0);
      }
      
      Double_t z = r->GetValue(swhatT.Data());
      Double_t zerr = r->GetErrorStat(swhatT.Data());
      
      if ( swhat.Contains("AccEff",TString::kIgnoreCase) )
      {
        if ( z < 0. || z > 5.)
        {
          z = -1.;
          zerr = 0.;
        }
      }
      
      if ( divideByBinWidth && b.WidthX()>0 )
      {
        z /= (b.WidthX()*b.WidthY());
        zerr /= (b.WidthX()*b.WidthY());
        
      }
      
      std::cout << b.AsString();
      r->PrintValue(swhat.Data(),"",z,zerr);
      
      Int_t x = j/nbinsY + 1;
      Int_t y = (j % nbinsY) + 1;
      
      std::cout << "x="  << x << ";" << "y=" << y << std::endl;
      
      h->SetBinContent(x,y,z);
      h->SetBinError(x,y,zerr);
      
    }

    else
    {
      if (!h)
      {
        h = new TH1F(r->GetName(),r->GetName(),binArray->GetEntries(),bins);
        h->SetDirectory(0);
      }
      
      Double_t y = r->GetValue(swhatT.Data());
      Double_t yerr = r->GetErrorStat(swhatT.Data());
      
      if ( divideByBinWidth && b.WidthX()>0 )
      {
        y /= (b.WidthX());
        yerr /= (b.WidthX());
      }
      
      if (!TMath::Finite(y)) y = 0.0;
      if (!TMath::Finite(yerr)) yerr = 0.0;
      
      std::cout << b.AsString();
      r->PrintValue(swhat.Data(),"",y,yerr);
      
      h->SetBinContent(j+1,y);
      h->SetBinError(j+1,yerr);
    }
  }
  
  delete binArray;
  delete[] binsX;
  delete[] binsY;
  delete[] bins;
  
  return h;
}


//______________________________________________________________________________
void AliAnalysisMuMuSpectra::Print(Option_t* opt) const
{
  // printout
  
  if (!IsEmpty())
  {
    TString sopt(opt);
    Int_t nmax = sopt.Atoi();
    if ( nmax <= 0 ) nmax = fBins->GetEntries();
    for ( Int_t i = 0; i < nmax; ++i )
    {
      AliAnalysisMuMuResult* r = static_cast<AliAnalysisMuMuResult*>(fBins->At(i));
      if (r) r->Print(opt);
    }
  }
}

//______________________________________________________________________________
void AliAnalysisMuMuSpectra::Scale(Double_t value)
{
  // scale all bins by value

  TIter next(fBins);
  AliAnalysisMuMuResult* r;

  while ( ( r = static_cast<AliAnalysisMuMuResult*>(next()) ) )
  {
    r->Scale(value);
  }
}

//______________________________________________________________________________
void AliAnalysisMuMuSpectra::SetWeight(Double_t w)
{
  // Set the weight of this spectra
  fWeight = w;
  TIter next(fBins);
  AliAnalysisMuMuResult* r;
  
  while ( ( r = static_cast<AliAnalysisMuMuResult*>(next()) ) )
  {
    r->SetWeight(Weight());
  }
}
 AliAnalysisMuMuSpectra.cxx:1
 AliAnalysisMuMuSpectra.cxx:2
 AliAnalysisMuMuSpectra.cxx:3
 AliAnalysisMuMuSpectra.cxx:4
 AliAnalysisMuMuSpectra.cxx:5
 AliAnalysisMuMuSpectra.cxx:6
 AliAnalysisMuMuSpectra.cxx:7
 AliAnalysisMuMuSpectra.cxx:8
 AliAnalysisMuMuSpectra.cxx:9
 AliAnalysisMuMuSpectra.cxx:10
 AliAnalysisMuMuSpectra.cxx:11
 AliAnalysisMuMuSpectra.cxx:12
 AliAnalysisMuMuSpectra.cxx:13
 AliAnalysisMuMuSpectra.cxx:14
 AliAnalysisMuMuSpectra.cxx:15
 AliAnalysisMuMuSpectra.cxx:16
 AliAnalysisMuMuSpectra.cxx:17
 AliAnalysisMuMuSpectra.cxx:18
 AliAnalysisMuMuSpectra.cxx:19
 AliAnalysisMuMuSpectra.cxx:20
 AliAnalysisMuMuSpectra.cxx:21
 AliAnalysisMuMuSpectra.cxx:22
 AliAnalysisMuMuSpectra.cxx:23
 AliAnalysisMuMuSpectra.cxx:24
 AliAnalysisMuMuSpectra.cxx:25
 AliAnalysisMuMuSpectra.cxx:26
 AliAnalysisMuMuSpectra.cxx:27
 AliAnalysisMuMuSpectra.cxx:28
 AliAnalysisMuMuSpectra.cxx:29
 AliAnalysisMuMuSpectra.cxx:30
 AliAnalysisMuMuSpectra.cxx:31
 AliAnalysisMuMuSpectra.cxx:32
 AliAnalysisMuMuSpectra.cxx:33
 AliAnalysisMuMuSpectra.cxx:34
 AliAnalysisMuMuSpectra.cxx:35
 AliAnalysisMuMuSpectra.cxx:36
 AliAnalysisMuMuSpectra.cxx:37
 AliAnalysisMuMuSpectra.cxx:38
 AliAnalysisMuMuSpectra.cxx:39
 AliAnalysisMuMuSpectra.cxx:40
 AliAnalysisMuMuSpectra.cxx:41
 AliAnalysisMuMuSpectra.cxx:42
 AliAnalysisMuMuSpectra.cxx:43
 AliAnalysisMuMuSpectra.cxx:44
 AliAnalysisMuMuSpectra.cxx:45
 AliAnalysisMuMuSpectra.cxx:46
 AliAnalysisMuMuSpectra.cxx:47
 AliAnalysisMuMuSpectra.cxx:48
 AliAnalysisMuMuSpectra.cxx:49
 AliAnalysisMuMuSpectra.cxx:50
 AliAnalysisMuMuSpectra.cxx:51
 AliAnalysisMuMuSpectra.cxx:52
 AliAnalysisMuMuSpectra.cxx:53
 AliAnalysisMuMuSpectra.cxx:54
 AliAnalysisMuMuSpectra.cxx:55
 AliAnalysisMuMuSpectra.cxx:56
 AliAnalysisMuMuSpectra.cxx:57
 AliAnalysisMuMuSpectra.cxx:58
 AliAnalysisMuMuSpectra.cxx:59
 AliAnalysisMuMuSpectra.cxx:60
 AliAnalysisMuMuSpectra.cxx:61
 AliAnalysisMuMuSpectra.cxx:62
 AliAnalysisMuMuSpectra.cxx:63
 AliAnalysisMuMuSpectra.cxx:64
 AliAnalysisMuMuSpectra.cxx:65
 AliAnalysisMuMuSpectra.cxx:66
 AliAnalysisMuMuSpectra.cxx:67
 AliAnalysisMuMuSpectra.cxx:68
 AliAnalysisMuMuSpectra.cxx:69
 AliAnalysisMuMuSpectra.cxx:70
 AliAnalysisMuMuSpectra.cxx:71
 AliAnalysisMuMuSpectra.cxx:72
 AliAnalysisMuMuSpectra.cxx:73
 AliAnalysisMuMuSpectra.cxx:74
 AliAnalysisMuMuSpectra.cxx:75
 AliAnalysisMuMuSpectra.cxx:76
 AliAnalysisMuMuSpectra.cxx:77
 AliAnalysisMuMuSpectra.cxx:78
 AliAnalysisMuMuSpectra.cxx:79
 AliAnalysisMuMuSpectra.cxx:80
 AliAnalysisMuMuSpectra.cxx:81
 AliAnalysisMuMuSpectra.cxx:82
 AliAnalysisMuMuSpectra.cxx:83
 AliAnalysisMuMuSpectra.cxx:84
 AliAnalysisMuMuSpectra.cxx:85
 AliAnalysisMuMuSpectra.cxx:86
 AliAnalysisMuMuSpectra.cxx:87
 AliAnalysisMuMuSpectra.cxx:88
 AliAnalysisMuMuSpectra.cxx:89
 AliAnalysisMuMuSpectra.cxx:90
 AliAnalysisMuMuSpectra.cxx:91
 AliAnalysisMuMuSpectra.cxx:92
 AliAnalysisMuMuSpectra.cxx:93
 AliAnalysisMuMuSpectra.cxx:94
 AliAnalysisMuMuSpectra.cxx:95
 AliAnalysisMuMuSpectra.cxx:96
 AliAnalysisMuMuSpectra.cxx:97
 AliAnalysisMuMuSpectra.cxx:98
 AliAnalysisMuMuSpectra.cxx:99
 AliAnalysisMuMuSpectra.cxx:100
 AliAnalysisMuMuSpectra.cxx:101
 AliAnalysisMuMuSpectra.cxx:102
 AliAnalysisMuMuSpectra.cxx:103
 AliAnalysisMuMuSpectra.cxx:104
 AliAnalysisMuMuSpectra.cxx:105
 AliAnalysisMuMuSpectra.cxx:106
 AliAnalysisMuMuSpectra.cxx:107
 AliAnalysisMuMuSpectra.cxx:108
 AliAnalysisMuMuSpectra.cxx:109
 AliAnalysisMuMuSpectra.cxx:110
 AliAnalysisMuMuSpectra.cxx:111
 AliAnalysisMuMuSpectra.cxx:112
 AliAnalysisMuMuSpectra.cxx:113
 AliAnalysisMuMuSpectra.cxx:114
 AliAnalysisMuMuSpectra.cxx:115
 AliAnalysisMuMuSpectra.cxx:116
 AliAnalysisMuMuSpectra.cxx:117
 AliAnalysisMuMuSpectra.cxx:118
 AliAnalysisMuMuSpectra.cxx:119
 AliAnalysisMuMuSpectra.cxx:120
 AliAnalysisMuMuSpectra.cxx:121
 AliAnalysisMuMuSpectra.cxx:122
 AliAnalysisMuMuSpectra.cxx:123
 AliAnalysisMuMuSpectra.cxx:124
 AliAnalysisMuMuSpectra.cxx:125
 AliAnalysisMuMuSpectra.cxx:126
 AliAnalysisMuMuSpectra.cxx:127
 AliAnalysisMuMuSpectra.cxx:128
 AliAnalysisMuMuSpectra.cxx:129
 AliAnalysisMuMuSpectra.cxx:130
 AliAnalysisMuMuSpectra.cxx:131
 AliAnalysisMuMuSpectra.cxx:132
 AliAnalysisMuMuSpectra.cxx:133
 AliAnalysisMuMuSpectra.cxx:134
 AliAnalysisMuMuSpectra.cxx:135
 AliAnalysisMuMuSpectra.cxx:136
 AliAnalysisMuMuSpectra.cxx:137
 AliAnalysisMuMuSpectra.cxx:138
 AliAnalysisMuMuSpectra.cxx:139
 AliAnalysisMuMuSpectra.cxx:140
 AliAnalysisMuMuSpectra.cxx:141
 AliAnalysisMuMuSpectra.cxx:142
 AliAnalysisMuMuSpectra.cxx:143
 AliAnalysisMuMuSpectra.cxx:144
 AliAnalysisMuMuSpectra.cxx:145
 AliAnalysisMuMuSpectra.cxx:146
 AliAnalysisMuMuSpectra.cxx:147
 AliAnalysisMuMuSpectra.cxx:148
 AliAnalysisMuMuSpectra.cxx:149
 AliAnalysisMuMuSpectra.cxx:150
 AliAnalysisMuMuSpectra.cxx:151
 AliAnalysisMuMuSpectra.cxx:152
 AliAnalysisMuMuSpectra.cxx:153
 AliAnalysisMuMuSpectra.cxx:154
 AliAnalysisMuMuSpectra.cxx:155
 AliAnalysisMuMuSpectra.cxx:156
 AliAnalysisMuMuSpectra.cxx:157
 AliAnalysisMuMuSpectra.cxx:158
 AliAnalysisMuMuSpectra.cxx:159
 AliAnalysisMuMuSpectra.cxx:160
 AliAnalysisMuMuSpectra.cxx:161
 AliAnalysisMuMuSpectra.cxx:162
 AliAnalysisMuMuSpectra.cxx:163
 AliAnalysisMuMuSpectra.cxx:164
 AliAnalysisMuMuSpectra.cxx:165
 AliAnalysisMuMuSpectra.cxx:166
 AliAnalysisMuMuSpectra.cxx:167
 AliAnalysisMuMuSpectra.cxx:168
 AliAnalysisMuMuSpectra.cxx:169
 AliAnalysisMuMuSpectra.cxx:170
 AliAnalysisMuMuSpectra.cxx:171
 AliAnalysisMuMuSpectra.cxx:172
 AliAnalysisMuMuSpectra.cxx:173
 AliAnalysisMuMuSpectra.cxx:174
 AliAnalysisMuMuSpectra.cxx:175
 AliAnalysisMuMuSpectra.cxx:176
 AliAnalysisMuMuSpectra.cxx:177
 AliAnalysisMuMuSpectra.cxx:178
 AliAnalysisMuMuSpectra.cxx:179
 AliAnalysisMuMuSpectra.cxx:180
 AliAnalysisMuMuSpectra.cxx:181
 AliAnalysisMuMuSpectra.cxx:182
 AliAnalysisMuMuSpectra.cxx:183
 AliAnalysisMuMuSpectra.cxx:184
 AliAnalysisMuMuSpectra.cxx:185
 AliAnalysisMuMuSpectra.cxx:186
 AliAnalysisMuMuSpectra.cxx:187
 AliAnalysisMuMuSpectra.cxx:188
 AliAnalysisMuMuSpectra.cxx:189
 AliAnalysisMuMuSpectra.cxx:190
 AliAnalysisMuMuSpectra.cxx:191
 AliAnalysisMuMuSpectra.cxx:192
 AliAnalysisMuMuSpectra.cxx:193
 AliAnalysisMuMuSpectra.cxx:194
 AliAnalysisMuMuSpectra.cxx:195
 AliAnalysisMuMuSpectra.cxx:196
 AliAnalysisMuMuSpectra.cxx:197
 AliAnalysisMuMuSpectra.cxx:198
 AliAnalysisMuMuSpectra.cxx:199
 AliAnalysisMuMuSpectra.cxx:200
 AliAnalysisMuMuSpectra.cxx:201
 AliAnalysisMuMuSpectra.cxx:202
 AliAnalysisMuMuSpectra.cxx:203
 AliAnalysisMuMuSpectra.cxx:204
 AliAnalysisMuMuSpectra.cxx:205
 AliAnalysisMuMuSpectra.cxx:206
 AliAnalysisMuMuSpectra.cxx:207
 AliAnalysisMuMuSpectra.cxx:208
 AliAnalysisMuMuSpectra.cxx:209
 AliAnalysisMuMuSpectra.cxx:210
 AliAnalysisMuMuSpectra.cxx:211
 AliAnalysisMuMuSpectra.cxx:212
 AliAnalysisMuMuSpectra.cxx:213
 AliAnalysisMuMuSpectra.cxx:214
 AliAnalysisMuMuSpectra.cxx:215
 AliAnalysisMuMuSpectra.cxx:216
 AliAnalysisMuMuSpectra.cxx:217
 AliAnalysisMuMuSpectra.cxx:218
 AliAnalysisMuMuSpectra.cxx:219
 AliAnalysisMuMuSpectra.cxx:220
 AliAnalysisMuMuSpectra.cxx:221
 AliAnalysisMuMuSpectra.cxx:222
 AliAnalysisMuMuSpectra.cxx:223
 AliAnalysisMuMuSpectra.cxx:224
 AliAnalysisMuMuSpectra.cxx:225
 AliAnalysisMuMuSpectra.cxx:226
 AliAnalysisMuMuSpectra.cxx:227
 AliAnalysisMuMuSpectra.cxx:228
 AliAnalysisMuMuSpectra.cxx:229
 AliAnalysisMuMuSpectra.cxx:230
 AliAnalysisMuMuSpectra.cxx:231
 AliAnalysisMuMuSpectra.cxx:232
 AliAnalysisMuMuSpectra.cxx:233
 AliAnalysisMuMuSpectra.cxx:234
 AliAnalysisMuMuSpectra.cxx:235
 AliAnalysisMuMuSpectra.cxx:236
 AliAnalysisMuMuSpectra.cxx:237
 AliAnalysisMuMuSpectra.cxx:238
 AliAnalysisMuMuSpectra.cxx:239
 AliAnalysisMuMuSpectra.cxx:240
 AliAnalysisMuMuSpectra.cxx:241
 AliAnalysisMuMuSpectra.cxx:242
 AliAnalysisMuMuSpectra.cxx:243
 AliAnalysisMuMuSpectra.cxx:244
 AliAnalysisMuMuSpectra.cxx:245
 AliAnalysisMuMuSpectra.cxx:246
 AliAnalysisMuMuSpectra.cxx:247
 AliAnalysisMuMuSpectra.cxx:248
 AliAnalysisMuMuSpectra.cxx:249
 AliAnalysisMuMuSpectra.cxx:250
 AliAnalysisMuMuSpectra.cxx:251
 AliAnalysisMuMuSpectra.cxx:252
 AliAnalysisMuMuSpectra.cxx:253
 AliAnalysisMuMuSpectra.cxx:254
 AliAnalysisMuMuSpectra.cxx:255
 AliAnalysisMuMuSpectra.cxx:256
 AliAnalysisMuMuSpectra.cxx:257
 AliAnalysisMuMuSpectra.cxx:258
 AliAnalysisMuMuSpectra.cxx:259
 AliAnalysisMuMuSpectra.cxx:260
 AliAnalysisMuMuSpectra.cxx:261
 AliAnalysisMuMuSpectra.cxx:262
 AliAnalysisMuMuSpectra.cxx:263
 AliAnalysisMuMuSpectra.cxx:264
 AliAnalysisMuMuSpectra.cxx:265
 AliAnalysisMuMuSpectra.cxx:266
 AliAnalysisMuMuSpectra.cxx:267
 AliAnalysisMuMuSpectra.cxx:268
 AliAnalysisMuMuSpectra.cxx:269
 AliAnalysisMuMuSpectra.cxx:270
 AliAnalysisMuMuSpectra.cxx:271
 AliAnalysisMuMuSpectra.cxx:272
 AliAnalysisMuMuSpectra.cxx:273
 AliAnalysisMuMuSpectra.cxx:274
 AliAnalysisMuMuSpectra.cxx:275
 AliAnalysisMuMuSpectra.cxx:276
 AliAnalysisMuMuSpectra.cxx:277
 AliAnalysisMuMuSpectra.cxx:278
 AliAnalysisMuMuSpectra.cxx:279
 AliAnalysisMuMuSpectra.cxx:280
 AliAnalysisMuMuSpectra.cxx:281
 AliAnalysisMuMuSpectra.cxx:282
 AliAnalysisMuMuSpectra.cxx:283
 AliAnalysisMuMuSpectra.cxx:284
 AliAnalysisMuMuSpectra.cxx:285
 AliAnalysisMuMuSpectra.cxx:286
 AliAnalysisMuMuSpectra.cxx:287
 AliAnalysisMuMuSpectra.cxx:288
 AliAnalysisMuMuSpectra.cxx:289
 AliAnalysisMuMuSpectra.cxx:290
 AliAnalysisMuMuSpectra.cxx:291
 AliAnalysisMuMuSpectra.cxx:292
 AliAnalysisMuMuSpectra.cxx:293
 AliAnalysisMuMuSpectra.cxx:294
 AliAnalysisMuMuSpectra.cxx:295
 AliAnalysisMuMuSpectra.cxx:296
 AliAnalysisMuMuSpectra.cxx:297
 AliAnalysisMuMuSpectra.cxx:298
 AliAnalysisMuMuSpectra.cxx:299
 AliAnalysisMuMuSpectra.cxx:300
 AliAnalysisMuMuSpectra.cxx:301
 AliAnalysisMuMuSpectra.cxx:302
 AliAnalysisMuMuSpectra.cxx:303
 AliAnalysisMuMuSpectra.cxx:304
 AliAnalysisMuMuSpectra.cxx:305
 AliAnalysisMuMuSpectra.cxx:306
 AliAnalysisMuMuSpectra.cxx:307
 AliAnalysisMuMuSpectra.cxx:308
 AliAnalysisMuMuSpectra.cxx:309
 AliAnalysisMuMuSpectra.cxx:310
 AliAnalysisMuMuSpectra.cxx:311
 AliAnalysisMuMuSpectra.cxx:312
 AliAnalysisMuMuSpectra.cxx:313
 AliAnalysisMuMuSpectra.cxx:314
 AliAnalysisMuMuSpectra.cxx:315
 AliAnalysisMuMuSpectra.cxx:316
 AliAnalysisMuMuSpectra.cxx:317
 AliAnalysisMuMuSpectra.cxx:318
 AliAnalysisMuMuSpectra.cxx:319
 AliAnalysisMuMuSpectra.cxx:320
 AliAnalysisMuMuSpectra.cxx:321
 AliAnalysisMuMuSpectra.cxx:322
 AliAnalysisMuMuSpectra.cxx:323
 AliAnalysisMuMuSpectra.cxx:324
 AliAnalysisMuMuSpectra.cxx:325
 AliAnalysisMuMuSpectra.cxx:326
 AliAnalysisMuMuSpectra.cxx:327
 AliAnalysisMuMuSpectra.cxx:328
 AliAnalysisMuMuSpectra.cxx:329
 AliAnalysisMuMuSpectra.cxx:330
 AliAnalysisMuMuSpectra.cxx:331
 AliAnalysisMuMuSpectra.cxx:332
 AliAnalysisMuMuSpectra.cxx:333
 AliAnalysisMuMuSpectra.cxx:334
 AliAnalysisMuMuSpectra.cxx:335
 AliAnalysisMuMuSpectra.cxx:336
 AliAnalysisMuMuSpectra.cxx:337
 AliAnalysisMuMuSpectra.cxx:338
 AliAnalysisMuMuSpectra.cxx:339
 AliAnalysisMuMuSpectra.cxx:340
 AliAnalysisMuMuSpectra.cxx:341
 AliAnalysisMuMuSpectra.cxx:342
 AliAnalysisMuMuSpectra.cxx:343
 AliAnalysisMuMuSpectra.cxx:344
 AliAnalysisMuMuSpectra.cxx:345
 AliAnalysisMuMuSpectra.cxx:346
 AliAnalysisMuMuSpectra.cxx:347
 AliAnalysisMuMuSpectra.cxx:348
 AliAnalysisMuMuSpectra.cxx:349
 AliAnalysisMuMuSpectra.cxx:350
 AliAnalysisMuMuSpectra.cxx:351
 AliAnalysisMuMuSpectra.cxx:352
 AliAnalysisMuMuSpectra.cxx:353
 AliAnalysisMuMuSpectra.cxx:354
 AliAnalysisMuMuSpectra.cxx:355
 AliAnalysisMuMuSpectra.cxx:356
 AliAnalysisMuMuSpectra.cxx:357
 AliAnalysisMuMuSpectra.cxx:358
 AliAnalysisMuMuSpectra.cxx:359
 AliAnalysisMuMuSpectra.cxx:360
 AliAnalysisMuMuSpectra.cxx:361
 AliAnalysisMuMuSpectra.cxx:362
 AliAnalysisMuMuSpectra.cxx:363
 AliAnalysisMuMuSpectra.cxx:364
 AliAnalysisMuMuSpectra.cxx:365
 AliAnalysisMuMuSpectra.cxx:366
 AliAnalysisMuMuSpectra.cxx:367
 AliAnalysisMuMuSpectra.cxx:368
 AliAnalysisMuMuSpectra.cxx:369
 AliAnalysisMuMuSpectra.cxx:370
 AliAnalysisMuMuSpectra.cxx:371
 AliAnalysisMuMuSpectra.cxx:372
 AliAnalysisMuMuSpectra.cxx:373
 AliAnalysisMuMuSpectra.cxx:374
 AliAnalysisMuMuSpectra.cxx:375
 AliAnalysisMuMuSpectra.cxx:376
 AliAnalysisMuMuSpectra.cxx:377
 AliAnalysisMuMuSpectra.cxx:378
 AliAnalysisMuMuSpectra.cxx:379
 AliAnalysisMuMuSpectra.cxx:380
 AliAnalysisMuMuSpectra.cxx:381
 AliAnalysisMuMuSpectra.cxx:382
 AliAnalysisMuMuSpectra.cxx:383
 AliAnalysisMuMuSpectra.cxx:384
 AliAnalysisMuMuSpectra.cxx:385
 AliAnalysisMuMuSpectra.cxx:386
 AliAnalysisMuMuSpectra.cxx:387
 AliAnalysisMuMuSpectra.cxx:388
 AliAnalysisMuMuSpectra.cxx:389
 AliAnalysisMuMuSpectra.cxx:390
 AliAnalysisMuMuSpectra.cxx:391
 AliAnalysisMuMuSpectra.cxx:392
 AliAnalysisMuMuSpectra.cxx:393
 AliAnalysisMuMuSpectra.cxx:394
 AliAnalysisMuMuSpectra.cxx:395
 AliAnalysisMuMuSpectra.cxx:396
 AliAnalysisMuMuSpectra.cxx:397
 AliAnalysisMuMuSpectra.cxx:398
 AliAnalysisMuMuSpectra.cxx:399
 AliAnalysisMuMuSpectra.cxx:400
 AliAnalysisMuMuSpectra.cxx:401
 AliAnalysisMuMuSpectra.cxx:402
 AliAnalysisMuMuSpectra.cxx:403
 AliAnalysisMuMuSpectra.cxx:404
 AliAnalysisMuMuSpectra.cxx:405
 AliAnalysisMuMuSpectra.cxx:406
 AliAnalysisMuMuSpectra.cxx:407
 AliAnalysisMuMuSpectra.cxx:408
 AliAnalysisMuMuSpectra.cxx:409
 AliAnalysisMuMuSpectra.cxx:410
 AliAnalysisMuMuSpectra.cxx:411
 AliAnalysisMuMuSpectra.cxx:412
 AliAnalysisMuMuSpectra.cxx:413
 AliAnalysisMuMuSpectra.cxx:414
 AliAnalysisMuMuSpectra.cxx:415
 AliAnalysisMuMuSpectra.cxx:416
 AliAnalysisMuMuSpectra.cxx:417
 AliAnalysisMuMuSpectra.cxx:418
 AliAnalysisMuMuSpectra.cxx:419
 AliAnalysisMuMuSpectra.cxx:420
 AliAnalysisMuMuSpectra.cxx:421
 AliAnalysisMuMuSpectra.cxx:422
 AliAnalysisMuMuSpectra.cxx:423
 AliAnalysisMuMuSpectra.cxx:424
 AliAnalysisMuMuSpectra.cxx:425
 AliAnalysisMuMuSpectra.cxx:426
 AliAnalysisMuMuSpectra.cxx:427
 AliAnalysisMuMuSpectra.cxx:428
 AliAnalysisMuMuSpectra.cxx:429
 AliAnalysisMuMuSpectra.cxx:430
 AliAnalysisMuMuSpectra.cxx:431
 AliAnalysisMuMuSpectra.cxx:432
 AliAnalysisMuMuSpectra.cxx:433
 AliAnalysisMuMuSpectra.cxx:434
 AliAnalysisMuMuSpectra.cxx:435
 AliAnalysisMuMuSpectra.cxx:436
 AliAnalysisMuMuSpectra.cxx:437
 AliAnalysisMuMuSpectra.cxx:438
 AliAnalysisMuMuSpectra.cxx:439
 AliAnalysisMuMuSpectra.cxx:440
 AliAnalysisMuMuSpectra.cxx:441
 AliAnalysisMuMuSpectra.cxx:442
 AliAnalysisMuMuSpectra.cxx:443
 AliAnalysisMuMuSpectra.cxx:444
 AliAnalysisMuMuSpectra.cxx:445
 AliAnalysisMuMuSpectra.cxx:446
 AliAnalysisMuMuSpectra.cxx:447
 AliAnalysisMuMuSpectra.cxx:448
 AliAnalysisMuMuSpectra.cxx:449
 AliAnalysisMuMuSpectra.cxx:450
 AliAnalysisMuMuSpectra.cxx:451
 AliAnalysisMuMuSpectra.cxx:452
 AliAnalysisMuMuSpectra.cxx:453
 AliAnalysisMuMuSpectra.cxx:454
 AliAnalysisMuMuSpectra.cxx:455
 AliAnalysisMuMuSpectra.cxx:456
 AliAnalysisMuMuSpectra.cxx:457
 AliAnalysisMuMuSpectra.cxx:458
 AliAnalysisMuMuSpectra.cxx:459
 AliAnalysisMuMuSpectra.cxx:460
 AliAnalysisMuMuSpectra.cxx:461
 AliAnalysisMuMuSpectra.cxx:462
 AliAnalysisMuMuSpectra.cxx:463
 AliAnalysisMuMuSpectra.cxx:464
 AliAnalysisMuMuSpectra.cxx:465
 AliAnalysisMuMuSpectra.cxx:466
 AliAnalysisMuMuSpectra.cxx:467
 AliAnalysisMuMuSpectra.cxx:468
 AliAnalysisMuMuSpectra.cxx:469
 AliAnalysisMuMuSpectra.cxx:470
 AliAnalysisMuMuSpectra.cxx:471
 AliAnalysisMuMuSpectra.cxx:472
 AliAnalysisMuMuSpectra.cxx:473
 AliAnalysisMuMuSpectra.cxx:474
 AliAnalysisMuMuSpectra.cxx:475
 AliAnalysisMuMuSpectra.cxx:476
 AliAnalysisMuMuSpectra.cxx:477
 AliAnalysisMuMuSpectra.cxx:478
 AliAnalysisMuMuSpectra.cxx:479
 AliAnalysisMuMuSpectra.cxx:480
 AliAnalysisMuMuSpectra.cxx:481
 AliAnalysisMuMuSpectra.cxx:482
 AliAnalysisMuMuSpectra.cxx:483
 AliAnalysisMuMuSpectra.cxx:484
 AliAnalysisMuMuSpectra.cxx:485
 AliAnalysisMuMuSpectra.cxx:486
 AliAnalysisMuMuSpectra.cxx:487
 AliAnalysisMuMuSpectra.cxx:488
 AliAnalysisMuMuSpectra.cxx:489
 AliAnalysisMuMuSpectra.cxx:490
 AliAnalysisMuMuSpectra.cxx:491
 AliAnalysisMuMuSpectra.cxx:492
 AliAnalysisMuMuSpectra.cxx:493
 AliAnalysisMuMuSpectra.cxx:494
 AliAnalysisMuMuSpectra.cxx:495
 AliAnalysisMuMuSpectra.cxx:496
 AliAnalysisMuMuSpectra.cxx:497
 AliAnalysisMuMuSpectra.cxx:498
 AliAnalysisMuMuSpectra.cxx:499
 AliAnalysisMuMuSpectra.cxx:500
 AliAnalysisMuMuSpectra.cxx:501
 AliAnalysisMuMuSpectra.cxx:502
 AliAnalysisMuMuSpectra.cxx:503
 AliAnalysisMuMuSpectra.cxx:504
 AliAnalysisMuMuSpectra.cxx:505
 AliAnalysisMuMuSpectra.cxx:506
 AliAnalysisMuMuSpectra.cxx:507
 AliAnalysisMuMuSpectra.cxx:508
 AliAnalysisMuMuSpectra.cxx:509
 AliAnalysisMuMuSpectra.cxx:510
 AliAnalysisMuMuSpectra.cxx:511
 AliAnalysisMuMuSpectra.cxx:512
 AliAnalysisMuMuSpectra.cxx:513
 AliAnalysisMuMuSpectra.cxx:514
 AliAnalysisMuMuSpectra.cxx:515
 AliAnalysisMuMuSpectra.cxx:516
 AliAnalysisMuMuSpectra.cxx:517
 AliAnalysisMuMuSpectra.cxx:518