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.                  *
**************************************************************************/
//
// Class for spectrum correction
// Subtraction of hadronic background, Unfolding of the data and
// Renormalization done here
// The following containers have to be set:
//  - Correction framework container for real data
//  - Correction framework container for MC (Efficiency Map)
//  - Correction framework container for background coming from data
//  - Correction framework container for background coming from MC
//
//  Author: 
//            Raphaelle Bailhache <R.Bailhache@gsi.de>
//            Markus Fasel <M.Fasel@gsi.de>
//

#include <TArrayD.h>
#include <TH1.h>
#include <TList.h>
#include <TObjArray.h>
#include <TROOT.h>
#include <TCanvas.h>
#include <TLegend.h>
#include <TStyle.h>
#include <TMath.h>
#include <TAxis.h>
#include <TGraphErrors.h>
#include <TFile.h>
#include <TPad.h>
#include <TH2D.h>
#include <TF1.h>

#include "AliPID.h"
#include "AliCFContainer.h"
#include "AliCFDataGrid.h"
#include "AliCFEffGrid.h"
#include "AliCFGridSparse.h"
#include "AliCFUnfolding.h"
#include "AliLog.h"

#include "AliHFEInclusiveSpectrum.h"
#include "AliHFEInclusiveSpectrumQA.h"
#include "AliHFEcuts.h"
#include "AliHFEcontainer.h"
#include "AliHFEtools.h"

ClassImp(AliHFEInclusiveSpectrum)

//____________________________________________________________
AliHFEInclusiveSpectrum::AliHFEInclusiveSpectrum(const char *name):
  AliHFECorrectSpectrumBase(name),
  fQA(NULL),
  fNoCentralitySelectionMC(kFALSE)
{
  //
  // Default constructor
  //

  fQA = new AliHFEInclusiveSpectrumQA("AliHFEInclusiveSpectrumQA");
 
}
//____________________________________________________________
AliHFEInclusiveSpectrum::AliHFEInclusiveSpectrum(const AliHFEInclusiveSpectrum &ref):
  AliHFECorrectSpectrumBase(ref),
  fQA(ref.fQA),
  fNoCentralitySelectionMC(ref.fNoCentralitySelectionMC)
{
  //
  // Copy constructor
  //
  ref.Copy(*this);

}
//____________________________________________________________
AliHFEInclusiveSpectrum &AliHFEInclusiveSpectrum::operator=(const AliHFEInclusiveSpectrum &ref){
  //
  // Assignment operator
  //
  if(this == &ref) 
    ref.Copy(*this);
  return *this;
}
//____________________________________________________________
void AliHFEInclusiveSpectrum::Copy(TObject &o) const {
  // 
  // Copy into object o
  //
  AliHFEInclusiveSpectrum &target = dynamic_cast<AliHFEInclusiveSpectrum &>(o);
  target.fQA = fQA;
  target.fNoCentralitySelectionMC = fNoCentralitySelectionMC;


}
//____________________________________________________________
AliHFEInclusiveSpectrum::~AliHFEInclusiveSpectrum(){
  //
  // Destructor
  //
  if(fQA) delete fQA;
  
}
//____________________________________________________________
Bool_t AliHFEInclusiveSpectrum::Init(const AliHFEcontainer *datahfecontainer, const AliHFEcontainer *mchfecontainer, const AliHFEcontainer */*bghfecontainer*/, const AliHFEcontainer *v0hfecontainer,AliCFContainer *photoniccontainerD){
  //
  // Init what we need for the correction:
  //
  // Raw spectrum, hadron contamination
  // MC efficiency maps, correlation matrix
  // V0 efficiency if wanted
  //
  // This for a given dimension.
  //
  //

 
  Bool_t centralitySelectionData = kTRUE, centralitySelectionMC = !fNoCentralitySelectionMC; 

  //
  // Data container: raw spectrum + hadron contamination
  //
  AliCFContainer *datacontainer = datahfecontainer->GetCFContainer("recTrackContReco");
  AliCFContainer *contaminationcontainer = datahfecontainer->GetCFContainer("hadronicBackground");
  if((!datacontainer) || (!contaminationcontainer)) return kFALSE;
  AliCFContainer *datacontainerD = GetSlicedContainer(datacontainer, fNbDimensions, fDims, -1, fChargeChoosen,fTestCentralityLow,fTestCentralityHigh, centralitySelectionData);
  AliCFContainer *contaminationcontainerD = GetSlicedContainer(contaminationcontainer, fNbDimensions, fDims, -1, fChargeChoosen,fTestCentralityLow,fTestCentralityHigh, centralitySelectionData);
  if((!datacontainerD) || (!contaminationcontainerD)) return kFALSE;
  SetContainer(datacontainerD,AliHFECorrectSpectrumBase::kDataContainer);
  SetContainer(contaminationcontainerD,AliHFECorrectSpectrumBase::kBackgroundData);

  // Photonic Background
  SetContainer(photoniccontainerD,AliHFECorrectSpectrumBase::kPhotonicBackground);

  // QA 
  Int_t dimqa = datacontainer->GetNVar();
  Int_t dimsqa[dimqa];
  for(Int_t i = 0; i < dimqa; i++) dimsqa[i] = i;
  AliCFContainer *datacontainerDQA = GetSlicedContainer(datacontainer, dimqa, dimsqa, -1, fChargeChoosen,fTestCentralityLow,fTestCentralityHigh, centralitySelectionData);
  fQA->AddResultAt(datacontainerDQA,AliHFEInclusiveSpectrumQA::kDataProjection);

  //
  // MC container: ESD/MC efficiency maps + MC/MC efficiency maps 
  //
  AliCFContainer *mccontaineresd = 0x0;
  AliCFContainer *mccontainermc = 0x0;
  mccontaineresd = mchfecontainer->MakeMergedCFContainer("sumesd","sumesd","MCTrackCont:recTrackContReco");
  mccontainermc = mchfecontainer->MakeMergedCFContainer("summc","summc","MCTrackCont:recTrackContMC");
  if((!mccontaineresd) || (!mccontainermc)) return kFALSE;  
  Int_t source = -1;
  AliCFContainer *mccontaineresdD = GetSlicedContainer(mccontaineresd, fNbDimensions, fDims, source, fChargeChoosen,fTestCentralityLow,fTestCentralityHigh, centralitySelectionMC);
  AliCFContainer *mccontainermcD = GetSlicedContainer(mccontainermc, fNbDimensions, fDims, source, fChargeChoosen,fTestCentralityLow,fTestCentralityHigh, centralitySelectionMC);
  if((!mccontaineresdD) || (!mccontainermcD)) return kFALSE;
  SetContainer(mccontainermcD,AliHFECorrectSpectrumBase::kMCContainerMC);
  SetContainer(mccontaineresdD,AliHFECorrectSpectrumBase::kMCContainerESD);

  //
  // Correlation matrix
  //  
  THnSparseF *mccorrelation = mchfecontainer->GetCorrelationMatrix("correlationstepbeforePID");
  if(!mccorrelation) mccorrelation = mchfecontainer->GetCorrelationMatrix("correlationstepafterPID");
  if(!mccorrelation) return kFALSE;
  THnSparseF *mccorrelationD = GetSlicedCorrelation(mccorrelation, fNbDimensions, fDims,fChargeChoosen,fTestCentralityLow,fTestCentralityHigh, centralitySelectionMC);
  if(!mccorrelationD) {
    printf("No correlation\n");
    return kFALSE;
  }
  SetCorrelation(mccorrelationD);
  // QA
  fQA->AddResultAt(mccorrelation,AliHFEInclusiveSpectrumQA::kCMProjection);
 
  //
  // V0 container Electron, pt eta phi
  //
  if(v0hfecontainer) {
    AliCFContainer *containerV0 = v0hfecontainer->GetCFContainer("taggedTrackContainerReco");
    if(!containerV0) return kFALSE;
    AliCFContainer *containerV0Electron = GetSlicedContainer(containerV0, fNbDimensions, fDims, AliPID::kElectron,fChargeChoosen,fTestCentralityLow,fTestCentralityHigh);
    if(!containerV0Electron) return kFALSE;
    SetContainer(containerV0Electron,AliHFECorrectSpectrumBase::kDataContainerV0);
  }

  //
  fQA->DrawProjections();

  
  return kTRUE;
}
//____________________________________________________________
Bool_t AliHFEInclusiveSpectrum::Correct(Bool_t subtractcontamination, Bool_t subtractphotonic){
  //
  // Correct the spectrum for efficiency and unfolding
  // with both method and compare
  //
  
  gStyle->SetPalette(1);
  gStyle->SetOptStat(1111);
  gStyle->SetPadBorderMode(0);
  gStyle->SetCanvasColor(10);
  gStyle->SetPadLeftMargin(0.13);
  gStyle->SetPadRightMargin(0.13);

  printf("Steps are: stepdata %d, stepMC %d, steptrue %d, stepV0after %d, stepV0before %d\n",fStepData,fStepMC,fStepTrue,fStepAfterCutsV0,fStepBeforeCutsV0);

  ///////////////////////////
  // Check initialization
  ///////////////////////////

  if((!GetContainer(kDataContainer)) || (!GetContainer(kMCContainerMC)) || (!GetContainer(kMCContainerESD))){
    AliInfo("You have to init before");
    return kFALSE;
  }

  if((fStepTrue < 0) && (fStepMC < 0) && (fStepData < 0)) {
    AliInfo("You have to set the steps before: SetMCTruthStep, SetMCEffStep, SetStepToCorrect");
    return kFALSE;
  }

  SetStepGuessedUnfolding(AliHFEcuts::kStepRecKineITSTPC + AliHFEcuts::kNcutStepsMCTrack);

  AliCFDataGrid *dataGridAfterFirstSteps = 0x0;

  //////////////////////////////////
  // Subtract hadron background
  /////////////////////////////////
  AliCFDataGrid *dataspectrumaftersubstraction = 0x0;
  if(subtractcontamination) {
    dataspectrumaftersubstraction = SubtractBackground();
    dataGridAfterFirstSteps = dataspectrumaftersubstraction;
  }

  //////////////////////////////////
  // Subtract Photonic background
  /////////////////////////////////
  AliCFDataGrid *dataspectrumafterphotonicsubstraction = 0x0;
  if(subtractphotonic) {
    dataspectrumafterphotonicsubstraction = SubtractPhotonicBackground();
    dataGridAfterFirstSteps = dataspectrumafterphotonicsubstraction;
  }

  ////////////////////////////////////////////////
  // Correct for TPC efficiency from V0 if any
  ///////////////////////////////////////////////
  AliCFDataGrid *dataspectrumafterV0efficiencycorrection = 0x0;
  AliCFContainer *dataContainerV0 = GetContainer(kDataContainerV0);
  if(dataContainerV0){
    dataspectrumafterV0efficiencycorrection = CorrectV0Efficiency(dataspectrumaftersubstraction);
    dataGridAfterFirstSteps = dataspectrumafterV0efficiencycorrection;
  }

  //////////////////////////////////////////////////////////////////////////////
  // Correct for efficiency parametrized (if TPC efficiency is parametrized)
  /////////////////////////////////////////////////////////////////////////////
  AliCFDataGrid *dataspectrumafterefficiencyparametrizedcorrection = 0x0;
  if(fEfficiencyFunction){
    dataspectrumafterefficiencyparametrizedcorrection = CorrectParametrizedEfficiency(dataGridAfterFirstSteps);
    dataGridAfterFirstSteps = dataspectrumafterefficiencyparametrizedcorrection;  
  }
    
  TGraphErrors* correctedspectrumD = 0x0;
  TGraphErrors* alltogetherspectrumD = 0x0;
  if(fStepMC>fStepTrue) {
    ///////////////
    // Unfold
    //////////////
    THnSparse *correctedspectrum = Unfold(dataGridAfterFirstSteps);
    if(!correctedspectrum){
      AliError("No corrected spectrum\n");
      return kFALSE;
    }
    
    /////////////////////
    // Simply correct
    ////////////////////
    AliCFDataGrid *alltogetherCorrection = CorrectForEfficiency(dataGridAfterFirstSteps);

    ////////////////////
    // Normalization
    ////////////////////
    correctedspectrumD = Normalize(correctedspectrum);
    alltogetherspectrumD = Normalize(alltogetherCorrection);
  }
  else {

    ////////////////////
    // Normalization
    ////////////////////
    if(dataGridAfterFirstSteps) {
      correctedspectrumD = Normalize(dataGridAfterFirstSteps);
      alltogetherspectrumD = Normalize(dataGridAfterFirstSteps);
    }
  }
  
  // QA final results

  fQA->AddResultAt(correctedspectrumD,AliHFEInclusiveSpectrumQA::kFinalResultUnfolded);
  fQA->AddResultAt(alltogetherspectrumD,AliHFEInclusiveSpectrumQA::kFinalResultDirectEfficiency);
  fQA->DrawResult();

  return kTRUE;
}

//____________________________________________________________
AliCFDataGrid* AliHFEInclusiveSpectrum::SubtractBackground(){
  //
  // Apply background subtraction
  //

  // Raw spectrum
  AliCFContainer *dataContainer = GetContainer(kDataContainer);
  if(!dataContainer){
    AliError("Data Container not available");
    return NULL;
  }
  printf("Step data: %d\n",fStepData);
  AliCFDataGrid *spectrumSubtracted = new AliCFDataGrid("spectrumSubtracted", "Data Grid for spectrum after Background subtraction", *dataContainer,fStepData);

  AliCFDataGrid *dataspectrumbeforesubstraction = (AliCFDataGrid *) ((AliCFDataGrid *)GetSpectrum(GetContainer(kDataContainer),fStepData))->Clone();
  dataspectrumbeforesubstraction->SetName("dataspectrumbeforesubstraction"); 
 

  // Background Estimate
  AliCFContainer *backgroundContainer = GetContainer(kBackgroundData);
  if(!backgroundContainer){
    AliError("MC background container not found");
    return NULL;
  }

  Int_t stepbackground = 1; 
  AliCFDataGrid *backgroundGrid = new AliCFDataGrid("ContaminationGrid","ContaminationGrid",*backgroundContainer,stepbackground);

  // Subtract 
  spectrumSubtracted->Add(backgroundGrid,-1.0);

  // QA
  TH1D *subtractedspectrum = (TH1D *) spectrumSubtracted->Project(0);
  AliHFEtools::NormaliseBinWidth(subtractedspectrum);
  TH1D *rawspectrum = (TH1D *) dataspectrumbeforesubstraction->Project(0);
  AliHFEtools::NormaliseBinWidth(rawspectrum);
  fQA->AddResultAt(subtractedspectrum,AliHFEInclusiveSpectrumQA::kAfterSC);
  fQA->AddResultAt(rawspectrum,AliHFEInclusiveSpectrumQA::kBeforeSC);
  fQA->DrawSubtractContamination();

  if(fNbDimensions>=2) {
    fQA->AddResultAt((TObject *) spectrumSubtracted,AliHFEInclusiveSpectrumQA::kAfterSCND);
    fQA->AddResultAt((TObject *) dataspectrumbeforesubstraction,AliHFEInclusiveSpectrumQA::kBeforeSCND);
    fQA->AddResultAt((TObject *) backgroundGrid,AliHFEInclusiveSpectrumQA::kHadronContaminationND);
    fQA->DrawSubtractContaminationND();
  }
  

  return spectrumSubtracted;
}

//____________________________________________________________
AliCFDataGrid* AliHFEInclusiveSpectrum::SubtractPhotonicBackground(){
  //
  // Apply Photonic background subtraction
  //

  printf("Photonic Background Subtraction \n");

  // Raw spectrum
  AliCFContainer *dataContainer = GetContainer(kDataContainer);
  if(!dataContainer){
    AliError("Data Container not available");
    return NULL;
  }
  printf("Step data: %d\n",fStepData);
  AliCFDataGrid *spectrumPhotonicSubtracted = new AliCFDataGrid("spectrumPhotonicSubtracted", "Data Grid for spectrum after Photonic Background subtraction", *dataContainer,fStepData);

  AliCFDataGrid *dataSpectrumBeforePhotonicSubstraction = (AliCFDataGrid *) ((AliCFDataGrid *)GetSpectrum(GetContainer(kDataContainer),fStepData))->Clone();
  dataSpectrumBeforePhotonicSubstraction->SetName("dataSpectrumBeforePhotonicSubstraction");


  // Background Estimate
  AliCFContainer *photonicContainer = GetContainer(kPhotonicBackground);
  if(!photonicContainer){
    AliError("Photonic background container not found");
    return NULL;
  }

  Int_t stepbackground = 0;
  AliCFDataGrid *photonicGrid = new AliCFDataGrid("ContaminationGrid","ContaminationGrid",*photonicContainer,stepbackground);

  // Subtract
  spectrumPhotonicSubtracted->Add(photonicGrid,-1.0);

  // QA
  TH1D *photonicsubtractedspectrum = (TH1D *) spectrumPhotonicSubtracted->Project(0);
  AliHFEtools::NormaliseBinWidth(photonicsubtractedspectrum);
  TH1D *newrawspectrum = (TH1D *) dataSpectrumBeforePhotonicSubstraction->Project(0);
  AliHFEtools::NormaliseBinWidth(newrawspectrum);
  fQA->AddResultAt(photonicsubtractedspectrum,AliHFEInclusiveSpectrumQA::kAfterSPB);
  fQA->AddResultAt(newrawspectrum,AliHFEInclusiveSpectrumQA::kBeforeSPB);
  fQA->DrawSubtractPhotonicBackground();

  return spectrumPhotonicSubtracted;
}


//____________________________________________________________
AliCFDataGrid *AliHFEInclusiveSpectrum::CorrectParametrizedEfficiency(AliCFDataGrid* const bgsubpectrum){
  
  //
  // Apply TPC pid efficiency correction from parametrisation
  //

  // Data in the right format
  AliCFDataGrid *dataGrid = 0x0;  
  if(bgsubpectrum) {
    dataGrid = bgsubpectrum;
  }
  else {

    AliCFContainer *dataContainer = GetContainer(kDataContainer);
    if(!dataContainer){
      AliError("Data Container not available");
      return NULL;
    }
    dataGrid = new AliCFDataGrid("dataGrid","dataGrid",*dataContainer, fStepData);
  } 
  AliCFDataGrid *result = (AliCFDataGrid *) dataGrid->Clone();
  result->SetName("ParametrizedEfficiencyBefore");
  THnSparse *h = result->GetGrid();
  Int_t nbdimensions = h->GetNdimensions();
  //printf("CorrectParametrizedEfficiency::We have dimensions %d\n",nbdimensions);
  AliCFContainer *dataContainer = GetContainer(kDataContainer);
  if(!dataContainer){
    AliError("Data Container not available");
    return NULL;
  }
  AliCFContainer *dataContainerbis = (AliCFContainer *) dataContainer->Clone();
  dataContainerbis->Add(dataContainerbis,-1.0);


  Int_t* coord = new Int_t[nbdimensions];
  memset(coord, 0, sizeof(Int_t) * nbdimensions);
  Double_t* points = new Double_t[nbdimensions];

  ULong64_t nEntries = h->GetNbins();
  for (ULong64_t i = 0; i < nEntries; ++i) {

    Double_t value = h->GetBinContent(i, coord);
    //Double_t valuecontainer = dataContainerbis->GetBinContent(coord,fStepData);
    //printf("Value %f, and valuecontainer %f\n",value,valuecontainer);

    // Get the bin co-ordinates given an coord
    for (Int_t j = 0; j < nbdimensions; ++j)
      points[j] = h->GetAxis(j)->GetBinCenter(coord[j]);

    if (!fEfficiencyFunction->IsInside(points))
         continue;
    TF1::RejectPoint(kFALSE);

    // Evaulate function at points
    Double_t valueEfficiency = fEfficiencyFunction->EvalPar(points, NULL);
    //printf("Value efficiency is %f\n",valueEfficiency);

    if(valueEfficiency > 0.0) {
      h->SetBinContent(coord,value/valueEfficiency);
      dataContainerbis->SetBinContent(coord,fStepData,value/valueEfficiency);
      Double_t error = h->GetBinError(i);
      h->SetBinError(coord,error/valueEfficiency);
      dataContainerbis->SetBinError(coord,fStepData,error/valueEfficiency);
    }
   
  } 

  delete[] coord;
  delete[] points;

  AliCFDataGrid *resultt = new AliCFDataGrid("spectrumEfficiencyParametrized", "Data Grid for spectrum after Efficiency parametrized", *dataContainerbis,fStepData);

 // QA
  TH1D *afterE = (TH1D *) resultt->Project(0);
  AliHFEtools::NormaliseBinWidth(afterE);
  TH1D *beforeE = (TH1D *) dataGrid->Project(0);
  AliHFEtools::NormaliseBinWidth(beforeE);
  fQA->AddResultAt(afterE,AliHFEInclusiveSpectrumQA::kAfterPE);
  fQA->AddResultAt(beforeE,AliHFEInclusiveSpectrumQA::kBeforePE);
  fQA->AddResultAt(fEfficiencyFunction,AliHFEInclusiveSpectrumQA::kPEfficiency);
  fQA->DrawCorrectWithEfficiency(AliHFEInclusiveSpectrumQA::kParametrized);

  if(fNbDimensions>=2) {
    fQA->AddResultAt((TObject *) resultt,AliHFEInclusiveSpectrumQA::kAfterPEND);
    fQA->AddResultAt((TObject *) dataGrid,AliHFEInclusiveSpectrumQA::kBeforePEND);
    fQA->AddResultAt((TObject *) fEfficiencyFunction,AliHFEInclusiveSpectrumQA::kPEfficiencyND);
    fQA->DrawCorrectWithEfficiencyND(AliHFEInclusiveSpectrumQA::kParametrized);
  }
  
  return resultt;

}
//____________________________________________________________
AliCFDataGrid *AliHFEInclusiveSpectrum::CorrectV0Efficiency(AliCFDataGrid* const bgsubpectrum){
  
  //
  // Apply TPC pid efficiency correction from V0
  //

  AliCFContainer *v0Container = GetContainer(kDataContainerV0);
  if(!v0Container){
    AliError("V0 Container not available");
    return NULL;
  }

  // Efficiency
  AliCFEffGrid* efficiencyD = new AliCFEffGrid("efficiency","",*v0Container);
  efficiencyD->CalculateEfficiency(fStepAfterCutsV0,fStepBeforeCutsV0);

  // Data in the right format
  AliCFDataGrid *dataGrid = 0x0;  
  if(bgsubpectrum) {
    dataGrid = bgsubpectrum;
  }
  else {
    AliCFContainer *dataContainer = GetContainer(kDataContainer);
    if(!dataContainer){
      AliError("Data Container not available");
      return NULL;
    }
    dataGrid = new AliCFDataGrid("dataGrid","dataGrid",*dataContainer, fStepData);
  } 

  // Correct
  AliCFDataGrid *result = (AliCFDataGrid *) dataGrid->Clone();
  result->ApplyEffCorrection(*efficiencyD);

  // QA
  TH1D *afterE = (TH1D *) result->Project(0);
  AliHFEtools::NormaliseBinWidth(afterE);
  TH1D *beforeE = (TH1D *) dataGrid->Project(0);
  AliHFEtools::NormaliseBinWidth(beforeE);
  TH1D* efficiencyDproj = (TH1D *) efficiencyD->Project(0);
  fQA->AddResultAt(afterE,AliHFEInclusiveSpectrumQA::kAfterV0);
  fQA->AddResultAt(beforeE,AliHFEInclusiveSpectrumQA::kBeforeV0);
  fQA->AddResultAt(efficiencyDproj,AliHFEInclusiveSpectrumQA::kV0Efficiency);
  fQA->DrawCorrectWithEfficiency(AliHFEInclusiveSpectrumQA::kV0);

  if(fNbDimensions>=2) {
    fQA->AddResultAt((TObject *) result,AliHFEInclusiveSpectrumQA::kAfterV0ND);
    fQA->AddResultAt((TObject *) dataGrid,AliHFEInclusiveSpectrumQA::kBeforeV0ND);
    fQA->AddResultAt((TObject *) efficiencyD,AliHFEInclusiveSpectrumQA::kV0EfficiencyND);
    fQA->DrawCorrectWithEfficiencyND(AliHFEInclusiveSpectrumQA::kV0);
  }
 

  return result;

}
//____________________________________________________________
THnSparse *AliHFEInclusiveSpectrum::Unfold(AliCFDataGrid* const bgsubpectrum){
  
  //
  // Return the unfolded spectrum
  //

  AliCFContainer *mcContainer = GetContainer(kMCContainerMC);
  if(!mcContainer){
    AliError("MC Container not available");
    return NULL;
  }

  if(!fCorrelation){
    AliError("No Correlation map available");
    return NULL;
  }

  // Data 
  AliCFDataGrid *dataGrid = 0x0;
  if(bgsubpectrum) {
    dataGrid = bgsubpectrum;
  }
  else {

    AliCFContainer *dataContainer = GetContainer(kDataContainer);
    if(!dataContainer){
      AliError("Data Container not available");
      return NULL;
    }

    dataGrid = new AliCFDataGrid("dataGrid","dataGrid",*dataContainer, fStepData);
  }

  // Guessed
  AliCFDataGrid* guessedGrid = new AliCFDataGrid("guessed","",*mcContainer, fStepGuessedUnfolding);
  THnSparse* guessedTHnSparse = ((AliCFGridSparse*)guessedGrid->GetData())->GetGrid();

  // Efficiency
  AliCFEffGrid* efficiencyD = new AliCFEffGrid("efficiency","",*mcContainer);
  efficiencyD->CalculateEfficiency(fStepMC,fStepTrue);

  // Unfold

  AliCFUnfolding unfolding("unfolding","",fNbDimensions,fCorrelation,efficiencyD->GetGrid(),dataGrid->GetGrid(),guessedTHnSparse,1.e-06,0,fNumberOfIterations);
  if(fSetSmoothing) unfolding.UseSmoothing();
  unfolding.Unfold();

  // Results
  THnSparse* result = unfolding.GetUnfolded();
  THnSparse* residual = unfolding.GetEstMeasured();

  // QA
  TH1D *residualh = (TH1D *) residual->Projection(0);
  TH1D *beforeE = (TH1D *) dataGrid->Project(0);
  TH1D* efficiencyDproj = (TH1D *) efficiencyD->Project(0);
  TH1D *afterE = (TH1D *) result->Projection(0);
  AliHFEtools::NormaliseBinWidth(residualh);
  AliHFEtools::NormaliseBinWidth(beforeE);
  AliHFEtools::NormaliseBinWidth(afterE);
  fQA->AddResultAt(residualh,AliHFEInclusiveSpectrumQA::kResidualU);
  fQA->AddResultAt(afterE,AliHFEInclusiveSpectrumQA::kAfterU);
  fQA->AddResultAt(beforeE,AliHFEInclusiveSpectrumQA::kBeforeU);
  fQA->AddResultAt(efficiencyDproj,AliHFEInclusiveSpectrumQA::kUEfficiency);
  fQA->DrawUnfolding();

  return (THnSparse *) result->Clone();

}
//____________________________________________________________
AliCFDataGrid *AliHFEInclusiveSpectrum::CorrectForEfficiency(AliCFDataGrid* const bgsubpectrum){

  //
  // Apply unfolding and efficiency correction together to bgsubspectrum
  //

  AliCFContainer *mcContainer = GetContainer(kMCContainerESD);
  if(!mcContainer){
    AliError("MC Container not available");
    return NULL;
  }

  // Efficiency
  AliCFEffGrid* efficiencyD = new AliCFEffGrid("efficiency","",*mcContainer);
  efficiencyD->CalculateEfficiency(fStepMC,fStepTrue);

  // Data in the right format
  AliCFDataGrid *dataGrid = 0x0;
  if(bgsubpectrum) {
    dataGrid = bgsubpectrum;
  }
  else {

    AliCFContainer *dataContainer = GetContainer(kDataContainer);
    if(!dataContainer){
      AliError("Data Container not available");
      return NULL;
    }

    dataGrid = new AliCFDataGrid("dataGrid","dataGrid",*dataContainer, fStepData);
  }

  // Correct
  AliCFDataGrid *result = (AliCFDataGrid *) dataGrid->Clone();
  result->ApplyEffCorrection(*efficiencyD);

  // QA
  TH1D *afterE = (TH1D *) result->Project(0);
  AliHFEtools::NormaliseBinWidth(afterE);
  TH1D *beforeE = (TH1D *) dataGrid->Project(0); 
  AliHFEtools::NormaliseBinWidth(beforeE);
  TH1D* efficiencyDproj = (TH1D *) efficiencyD->Project(0);
  fQA->AddResultAt(afterE,AliHFEInclusiveSpectrumQA::kAfterMCE);
  fQA->AddResultAt(beforeE,AliHFEInclusiveSpectrumQA::kBeforeMCE);
  fQA->AddResultAt(efficiencyDproj,AliHFEInclusiveSpectrumQA::kMCEfficiency);
  fQA->DrawCorrectWithEfficiency(AliHFEInclusiveSpectrumQA::kMC);

  if(fNbDimensions>=2) {
    fQA->AddResultAt((TObject *) result,AliHFEInclusiveSpectrumQA::kAfterMCEND);
    fQA->AddResultAt((TObject *) dataGrid,AliHFEInclusiveSpectrumQA::kBeforeMCEND);
    fQA->AddResultAt((TObject *) efficiencyD,AliHFEInclusiveSpectrumQA::kMCEfficiencyND);
    fQA->DrawCorrectWithEfficiencyND(AliHFEInclusiveSpectrumQA::kMC);
  }

  return result;

}
//____________________________________________________________
void AliHFEInclusiveSpectrum::WriteResults(const char *filename)
{
  //
  // Write results
  //

  AliCFContainer *dataContainer = GetContainer(kDataContainer);
  AliCFContainer *mcContainer = GetContainer(kMCContainerMC);
  TObject *unfolded = 0x0;
  TObject *correctedspectrum = 0x0;
  if(fQA) {
    unfolded = fQA->GetResult(AliHFEInclusiveSpectrumQA::kFinalResultUnfolded);
    correctedspectrum = fQA->GetResult(AliHFEInclusiveSpectrumQA::kFinalResultDirectEfficiency);
  }

  TFile *file = TFile::Open(filename,"recreate");
  if(dataContainer) dataContainer->Write("data");
  if(mcContainer) mcContainer->Write("mcefficiency");
  if(fCorrelation) fCorrelation->Write("correlationmatrix");
  if(unfolded) unfolded->Write("unfoldedspectrum");
  if(correctedspectrum) correctedspectrum->Write("correctedspectrum");
  if(fQA) fQA->Write("QAResults");
  file->Close();

}

 AliHFEInclusiveSpectrum.cxx:1
 AliHFEInclusiveSpectrum.cxx:2
 AliHFEInclusiveSpectrum.cxx:3
 AliHFEInclusiveSpectrum.cxx:4
 AliHFEInclusiveSpectrum.cxx:5
 AliHFEInclusiveSpectrum.cxx:6
 AliHFEInclusiveSpectrum.cxx:7
 AliHFEInclusiveSpectrum.cxx:8
 AliHFEInclusiveSpectrum.cxx:9
 AliHFEInclusiveSpectrum.cxx:10
 AliHFEInclusiveSpectrum.cxx:11
 AliHFEInclusiveSpectrum.cxx:12
 AliHFEInclusiveSpectrum.cxx:13
 AliHFEInclusiveSpectrum.cxx:14
 AliHFEInclusiveSpectrum.cxx:15
 AliHFEInclusiveSpectrum.cxx:16
 AliHFEInclusiveSpectrum.cxx:17
 AliHFEInclusiveSpectrum.cxx:18
 AliHFEInclusiveSpectrum.cxx:19
 AliHFEInclusiveSpectrum.cxx:20
 AliHFEInclusiveSpectrum.cxx:21
 AliHFEInclusiveSpectrum.cxx:22
 AliHFEInclusiveSpectrum.cxx:23
 AliHFEInclusiveSpectrum.cxx:24
 AliHFEInclusiveSpectrum.cxx:25
 AliHFEInclusiveSpectrum.cxx:26
 AliHFEInclusiveSpectrum.cxx:27
 AliHFEInclusiveSpectrum.cxx:28
 AliHFEInclusiveSpectrum.cxx:29
 AliHFEInclusiveSpectrum.cxx:30
 AliHFEInclusiveSpectrum.cxx:31
 AliHFEInclusiveSpectrum.cxx:32
 AliHFEInclusiveSpectrum.cxx:33
 AliHFEInclusiveSpectrum.cxx:34
 AliHFEInclusiveSpectrum.cxx:35
 AliHFEInclusiveSpectrum.cxx:36
 AliHFEInclusiveSpectrum.cxx:37
 AliHFEInclusiveSpectrum.cxx:38
 AliHFEInclusiveSpectrum.cxx:39
 AliHFEInclusiveSpectrum.cxx:40
 AliHFEInclusiveSpectrum.cxx:41
 AliHFEInclusiveSpectrum.cxx:42
 AliHFEInclusiveSpectrum.cxx:43
 AliHFEInclusiveSpectrum.cxx:44
 AliHFEInclusiveSpectrum.cxx:45
 AliHFEInclusiveSpectrum.cxx:46
 AliHFEInclusiveSpectrum.cxx:47
 AliHFEInclusiveSpectrum.cxx:48
 AliHFEInclusiveSpectrum.cxx:49
 AliHFEInclusiveSpectrum.cxx:50
 AliHFEInclusiveSpectrum.cxx:51
 AliHFEInclusiveSpectrum.cxx:52
 AliHFEInclusiveSpectrum.cxx:53
 AliHFEInclusiveSpectrum.cxx:54
 AliHFEInclusiveSpectrum.cxx:55
 AliHFEInclusiveSpectrum.cxx:56
 AliHFEInclusiveSpectrum.cxx:57
 AliHFEInclusiveSpectrum.cxx:58
 AliHFEInclusiveSpectrum.cxx:59
 AliHFEInclusiveSpectrum.cxx:60
 AliHFEInclusiveSpectrum.cxx:61
 AliHFEInclusiveSpectrum.cxx:62
 AliHFEInclusiveSpectrum.cxx:63
 AliHFEInclusiveSpectrum.cxx:64
 AliHFEInclusiveSpectrum.cxx:65
 AliHFEInclusiveSpectrum.cxx:66
 AliHFEInclusiveSpectrum.cxx:67
 AliHFEInclusiveSpectrum.cxx:68
 AliHFEInclusiveSpectrum.cxx:69
 AliHFEInclusiveSpectrum.cxx:70
 AliHFEInclusiveSpectrum.cxx:71
 AliHFEInclusiveSpectrum.cxx:72
 AliHFEInclusiveSpectrum.cxx:73
 AliHFEInclusiveSpectrum.cxx:74
 AliHFEInclusiveSpectrum.cxx:75
 AliHFEInclusiveSpectrum.cxx:76
 AliHFEInclusiveSpectrum.cxx:77
 AliHFEInclusiveSpectrum.cxx:78
 AliHFEInclusiveSpectrum.cxx:79
 AliHFEInclusiveSpectrum.cxx:80
 AliHFEInclusiveSpectrum.cxx:81
 AliHFEInclusiveSpectrum.cxx:82
 AliHFEInclusiveSpectrum.cxx:83
 AliHFEInclusiveSpectrum.cxx:84
 AliHFEInclusiveSpectrum.cxx:85
 AliHFEInclusiveSpectrum.cxx:86
 AliHFEInclusiveSpectrum.cxx:87
 AliHFEInclusiveSpectrum.cxx:88
 AliHFEInclusiveSpectrum.cxx:89
 AliHFEInclusiveSpectrum.cxx:90
 AliHFEInclusiveSpectrum.cxx:91
 AliHFEInclusiveSpectrum.cxx:92
 AliHFEInclusiveSpectrum.cxx:93
 AliHFEInclusiveSpectrum.cxx:94
 AliHFEInclusiveSpectrum.cxx:95
 AliHFEInclusiveSpectrum.cxx:96
 AliHFEInclusiveSpectrum.cxx:97
 AliHFEInclusiveSpectrum.cxx:98
 AliHFEInclusiveSpectrum.cxx:99
 AliHFEInclusiveSpectrum.cxx:100
 AliHFEInclusiveSpectrum.cxx:101
 AliHFEInclusiveSpectrum.cxx:102
 AliHFEInclusiveSpectrum.cxx:103
 AliHFEInclusiveSpectrum.cxx:104
 AliHFEInclusiveSpectrum.cxx:105
 AliHFEInclusiveSpectrum.cxx:106
 AliHFEInclusiveSpectrum.cxx:107
 AliHFEInclusiveSpectrum.cxx:108
 AliHFEInclusiveSpectrum.cxx:109
 AliHFEInclusiveSpectrum.cxx:110
 AliHFEInclusiveSpectrum.cxx:111
 AliHFEInclusiveSpectrum.cxx:112
 AliHFEInclusiveSpectrum.cxx:113
 AliHFEInclusiveSpectrum.cxx:114
 AliHFEInclusiveSpectrum.cxx:115
 AliHFEInclusiveSpectrum.cxx:116
 AliHFEInclusiveSpectrum.cxx:117
 AliHFEInclusiveSpectrum.cxx:118
 AliHFEInclusiveSpectrum.cxx:119
 AliHFEInclusiveSpectrum.cxx:120
 AliHFEInclusiveSpectrum.cxx:121
 AliHFEInclusiveSpectrum.cxx:122
 AliHFEInclusiveSpectrum.cxx:123
 AliHFEInclusiveSpectrum.cxx:124
 AliHFEInclusiveSpectrum.cxx:125
 AliHFEInclusiveSpectrum.cxx:126
 AliHFEInclusiveSpectrum.cxx:127
 AliHFEInclusiveSpectrum.cxx:128
 AliHFEInclusiveSpectrum.cxx:129
 AliHFEInclusiveSpectrum.cxx:130
 AliHFEInclusiveSpectrum.cxx:131
 AliHFEInclusiveSpectrum.cxx:132
 AliHFEInclusiveSpectrum.cxx:133
 AliHFEInclusiveSpectrum.cxx:134
 AliHFEInclusiveSpectrum.cxx:135
 AliHFEInclusiveSpectrum.cxx:136
 AliHFEInclusiveSpectrum.cxx:137
 AliHFEInclusiveSpectrum.cxx:138
 AliHFEInclusiveSpectrum.cxx:139
 AliHFEInclusiveSpectrum.cxx:140
 AliHFEInclusiveSpectrum.cxx:141
 AliHFEInclusiveSpectrum.cxx:142
 AliHFEInclusiveSpectrum.cxx:143
 AliHFEInclusiveSpectrum.cxx:144
 AliHFEInclusiveSpectrum.cxx:145
 AliHFEInclusiveSpectrum.cxx:146
 AliHFEInclusiveSpectrum.cxx:147
 AliHFEInclusiveSpectrum.cxx:148
 AliHFEInclusiveSpectrum.cxx:149
 AliHFEInclusiveSpectrum.cxx:150
 AliHFEInclusiveSpectrum.cxx:151
 AliHFEInclusiveSpectrum.cxx:152
 AliHFEInclusiveSpectrum.cxx:153
 AliHFEInclusiveSpectrum.cxx:154
 AliHFEInclusiveSpectrum.cxx:155
 AliHFEInclusiveSpectrum.cxx:156
 AliHFEInclusiveSpectrum.cxx:157
 AliHFEInclusiveSpectrum.cxx:158
 AliHFEInclusiveSpectrum.cxx:159
 AliHFEInclusiveSpectrum.cxx:160
 AliHFEInclusiveSpectrum.cxx:161
 AliHFEInclusiveSpectrum.cxx:162
 AliHFEInclusiveSpectrum.cxx:163
 AliHFEInclusiveSpectrum.cxx:164
 AliHFEInclusiveSpectrum.cxx:165
 AliHFEInclusiveSpectrum.cxx:166
 AliHFEInclusiveSpectrum.cxx:167
 AliHFEInclusiveSpectrum.cxx:168
 AliHFEInclusiveSpectrum.cxx:169
 AliHFEInclusiveSpectrum.cxx:170
 AliHFEInclusiveSpectrum.cxx:171
 AliHFEInclusiveSpectrum.cxx:172
 AliHFEInclusiveSpectrum.cxx:173
 AliHFEInclusiveSpectrum.cxx:174
 AliHFEInclusiveSpectrum.cxx:175
 AliHFEInclusiveSpectrum.cxx:176
 AliHFEInclusiveSpectrum.cxx:177
 AliHFEInclusiveSpectrum.cxx:178
 AliHFEInclusiveSpectrum.cxx:179
 AliHFEInclusiveSpectrum.cxx:180
 AliHFEInclusiveSpectrum.cxx:181
 AliHFEInclusiveSpectrum.cxx:182
 AliHFEInclusiveSpectrum.cxx:183
 AliHFEInclusiveSpectrum.cxx:184
 AliHFEInclusiveSpectrum.cxx:185
 AliHFEInclusiveSpectrum.cxx:186
 AliHFEInclusiveSpectrum.cxx:187
 AliHFEInclusiveSpectrum.cxx:188
 AliHFEInclusiveSpectrum.cxx:189
 AliHFEInclusiveSpectrum.cxx:190
 AliHFEInclusiveSpectrum.cxx:191
 AliHFEInclusiveSpectrum.cxx:192
 AliHFEInclusiveSpectrum.cxx:193
 AliHFEInclusiveSpectrum.cxx:194
 AliHFEInclusiveSpectrum.cxx:195
 AliHFEInclusiveSpectrum.cxx:196
 AliHFEInclusiveSpectrum.cxx:197
 AliHFEInclusiveSpectrum.cxx:198
 AliHFEInclusiveSpectrum.cxx:199
 AliHFEInclusiveSpectrum.cxx:200
 AliHFEInclusiveSpectrum.cxx:201
 AliHFEInclusiveSpectrum.cxx:202
 AliHFEInclusiveSpectrum.cxx:203
 AliHFEInclusiveSpectrum.cxx:204
 AliHFEInclusiveSpectrum.cxx:205
 AliHFEInclusiveSpectrum.cxx:206
 AliHFEInclusiveSpectrum.cxx:207
 AliHFEInclusiveSpectrum.cxx:208
 AliHFEInclusiveSpectrum.cxx:209
 AliHFEInclusiveSpectrum.cxx:210
 AliHFEInclusiveSpectrum.cxx:211
 AliHFEInclusiveSpectrum.cxx:212
 AliHFEInclusiveSpectrum.cxx:213
 AliHFEInclusiveSpectrum.cxx:214
 AliHFEInclusiveSpectrum.cxx:215
 AliHFEInclusiveSpectrum.cxx:216
 AliHFEInclusiveSpectrum.cxx:217
 AliHFEInclusiveSpectrum.cxx:218
 AliHFEInclusiveSpectrum.cxx:219
 AliHFEInclusiveSpectrum.cxx:220
 AliHFEInclusiveSpectrum.cxx:221
 AliHFEInclusiveSpectrum.cxx:222
 AliHFEInclusiveSpectrum.cxx:223
 AliHFEInclusiveSpectrum.cxx:224
 AliHFEInclusiveSpectrum.cxx:225
 AliHFEInclusiveSpectrum.cxx:226
 AliHFEInclusiveSpectrum.cxx:227
 AliHFEInclusiveSpectrum.cxx:228
 AliHFEInclusiveSpectrum.cxx:229
 AliHFEInclusiveSpectrum.cxx:230
 AliHFEInclusiveSpectrum.cxx:231
 AliHFEInclusiveSpectrum.cxx:232
 AliHFEInclusiveSpectrum.cxx:233
 AliHFEInclusiveSpectrum.cxx:234
 AliHFEInclusiveSpectrum.cxx:235
 AliHFEInclusiveSpectrum.cxx:236
 AliHFEInclusiveSpectrum.cxx:237
 AliHFEInclusiveSpectrum.cxx:238
 AliHFEInclusiveSpectrum.cxx:239
 AliHFEInclusiveSpectrum.cxx:240
 AliHFEInclusiveSpectrum.cxx:241
 AliHFEInclusiveSpectrum.cxx:242
 AliHFEInclusiveSpectrum.cxx:243
 AliHFEInclusiveSpectrum.cxx:244
 AliHFEInclusiveSpectrum.cxx:245
 AliHFEInclusiveSpectrum.cxx:246
 AliHFEInclusiveSpectrum.cxx:247
 AliHFEInclusiveSpectrum.cxx:248
 AliHFEInclusiveSpectrum.cxx:249
 AliHFEInclusiveSpectrum.cxx:250
 AliHFEInclusiveSpectrum.cxx:251
 AliHFEInclusiveSpectrum.cxx:252
 AliHFEInclusiveSpectrum.cxx:253
 AliHFEInclusiveSpectrum.cxx:254
 AliHFEInclusiveSpectrum.cxx:255
 AliHFEInclusiveSpectrum.cxx:256
 AliHFEInclusiveSpectrum.cxx:257
 AliHFEInclusiveSpectrum.cxx:258
 AliHFEInclusiveSpectrum.cxx:259
 AliHFEInclusiveSpectrum.cxx:260
 AliHFEInclusiveSpectrum.cxx:261
 AliHFEInclusiveSpectrum.cxx:262
 AliHFEInclusiveSpectrum.cxx:263
 AliHFEInclusiveSpectrum.cxx:264
 AliHFEInclusiveSpectrum.cxx:265
 AliHFEInclusiveSpectrum.cxx:266
 AliHFEInclusiveSpectrum.cxx:267
 AliHFEInclusiveSpectrum.cxx:268
 AliHFEInclusiveSpectrum.cxx:269
 AliHFEInclusiveSpectrum.cxx:270
 AliHFEInclusiveSpectrum.cxx:271
 AliHFEInclusiveSpectrum.cxx:272
 AliHFEInclusiveSpectrum.cxx:273
 AliHFEInclusiveSpectrum.cxx:274
 AliHFEInclusiveSpectrum.cxx:275
 AliHFEInclusiveSpectrum.cxx:276
 AliHFEInclusiveSpectrum.cxx:277
 AliHFEInclusiveSpectrum.cxx:278
 AliHFEInclusiveSpectrum.cxx:279
 AliHFEInclusiveSpectrum.cxx:280
 AliHFEInclusiveSpectrum.cxx:281
 AliHFEInclusiveSpectrum.cxx:282
 AliHFEInclusiveSpectrum.cxx:283
 AliHFEInclusiveSpectrum.cxx:284
 AliHFEInclusiveSpectrum.cxx:285
 AliHFEInclusiveSpectrum.cxx:286
 AliHFEInclusiveSpectrum.cxx:287
 AliHFEInclusiveSpectrum.cxx:288
 AliHFEInclusiveSpectrum.cxx:289
 AliHFEInclusiveSpectrum.cxx:290
 AliHFEInclusiveSpectrum.cxx:291
 AliHFEInclusiveSpectrum.cxx:292
 AliHFEInclusiveSpectrum.cxx:293
 AliHFEInclusiveSpectrum.cxx:294
 AliHFEInclusiveSpectrum.cxx:295
 AliHFEInclusiveSpectrum.cxx:296
 AliHFEInclusiveSpectrum.cxx:297
 AliHFEInclusiveSpectrum.cxx:298
 AliHFEInclusiveSpectrum.cxx:299
 AliHFEInclusiveSpectrum.cxx:300
 AliHFEInclusiveSpectrum.cxx:301
 AliHFEInclusiveSpectrum.cxx:302
 AliHFEInclusiveSpectrum.cxx:303
 AliHFEInclusiveSpectrum.cxx:304
 AliHFEInclusiveSpectrum.cxx:305
 AliHFEInclusiveSpectrum.cxx:306
 AliHFEInclusiveSpectrum.cxx:307
 AliHFEInclusiveSpectrum.cxx:308
 AliHFEInclusiveSpectrum.cxx:309
 AliHFEInclusiveSpectrum.cxx:310
 AliHFEInclusiveSpectrum.cxx:311
 AliHFEInclusiveSpectrum.cxx:312
 AliHFEInclusiveSpectrum.cxx:313
 AliHFEInclusiveSpectrum.cxx:314
 AliHFEInclusiveSpectrum.cxx:315
 AliHFEInclusiveSpectrum.cxx:316
 AliHFEInclusiveSpectrum.cxx:317
 AliHFEInclusiveSpectrum.cxx:318
 AliHFEInclusiveSpectrum.cxx:319
 AliHFEInclusiveSpectrum.cxx:320
 AliHFEInclusiveSpectrum.cxx:321
 AliHFEInclusiveSpectrum.cxx:322
 AliHFEInclusiveSpectrum.cxx:323
 AliHFEInclusiveSpectrum.cxx:324
 AliHFEInclusiveSpectrum.cxx:325
 AliHFEInclusiveSpectrum.cxx:326
 AliHFEInclusiveSpectrum.cxx:327
 AliHFEInclusiveSpectrum.cxx:328
 AliHFEInclusiveSpectrum.cxx:329
 AliHFEInclusiveSpectrum.cxx:330
 AliHFEInclusiveSpectrum.cxx:331
 AliHFEInclusiveSpectrum.cxx:332
 AliHFEInclusiveSpectrum.cxx:333
 AliHFEInclusiveSpectrum.cxx:334
 AliHFEInclusiveSpectrum.cxx:335
 AliHFEInclusiveSpectrum.cxx:336
 AliHFEInclusiveSpectrum.cxx:337
 AliHFEInclusiveSpectrum.cxx:338
 AliHFEInclusiveSpectrum.cxx:339
 AliHFEInclusiveSpectrum.cxx:340
 AliHFEInclusiveSpectrum.cxx:341
 AliHFEInclusiveSpectrum.cxx:342
 AliHFEInclusiveSpectrum.cxx:343
 AliHFEInclusiveSpectrum.cxx:344
 AliHFEInclusiveSpectrum.cxx:345
 AliHFEInclusiveSpectrum.cxx:346
 AliHFEInclusiveSpectrum.cxx:347
 AliHFEInclusiveSpectrum.cxx:348
 AliHFEInclusiveSpectrum.cxx:349
 AliHFEInclusiveSpectrum.cxx:350
 AliHFEInclusiveSpectrum.cxx:351
 AliHFEInclusiveSpectrum.cxx:352
 AliHFEInclusiveSpectrum.cxx:353
 AliHFEInclusiveSpectrum.cxx:354
 AliHFEInclusiveSpectrum.cxx:355
 AliHFEInclusiveSpectrum.cxx:356
 AliHFEInclusiveSpectrum.cxx:357
 AliHFEInclusiveSpectrum.cxx:358
 AliHFEInclusiveSpectrum.cxx:359
 AliHFEInclusiveSpectrum.cxx:360
 AliHFEInclusiveSpectrum.cxx:361
 AliHFEInclusiveSpectrum.cxx:362
 AliHFEInclusiveSpectrum.cxx:363
 AliHFEInclusiveSpectrum.cxx:364
 AliHFEInclusiveSpectrum.cxx:365
 AliHFEInclusiveSpectrum.cxx:366
 AliHFEInclusiveSpectrum.cxx:367
 AliHFEInclusiveSpectrum.cxx:368
 AliHFEInclusiveSpectrum.cxx:369
 AliHFEInclusiveSpectrum.cxx:370
 AliHFEInclusiveSpectrum.cxx:371
 AliHFEInclusiveSpectrum.cxx:372
 AliHFEInclusiveSpectrum.cxx:373
 AliHFEInclusiveSpectrum.cxx:374
 AliHFEInclusiveSpectrum.cxx:375
 AliHFEInclusiveSpectrum.cxx:376
 AliHFEInclusiveSpectrum.cxx:377
 AliHFEInclusiveSpectrum.cxx:378
 AliHFEInclusiveSpectrum.cxx:379
 AliHFEInclusiveSpectrum.cxx:380
 AliHFEInclusiveSpectrum.cxx:381
 AliHFEInclusiveSpectrum.cxx:382
 AliHFEInclusiveSpectrum.cxx:383
 AliHFEInclusiveSpectrum.cxx:384
 AliHFEInclusiveSpectrum.cxx:385
 AliHFEInclusiveSpectrum.cxx:386
 AliHFEInclusiveSpectrum.cxx:387
 AliHFEInclusiveSpectrum.cxx:388
 AliHFEInclusiveSpectrum.cxx:389
 AliHFEInclusiveSpectrum.cxx:390
 AliHFEInclusiveSpectrum.cxx:391
 AliHFEInclusiveSpectrum.cxx:392
 AliHFEInclusiveSpectrum.cxx:393
 AliHFEInclusiveSpectrum.cxx:394
 AliHFEInclusiveSpectrum.cxx:395
 AliHFEInclusiveSpectrum.cxx:396
 AliHFEInclusiveSpectrum.cxx:397
 AliHFEInclusiveSpectrum.cxx:398
 AliHFEInclusiveSpectrum.cxx:399
 AliHFEInclusiveSpectrum.cxx:400
 AliHFEInclusiveSpectrum.cxx:401
 AliHFEInclusiveSpectrum.cxx:402
 AliHFEInclusiveSpectrum.cxx:403
 AliHFEInclusiveSpectrum.cxx:404
 AliHFEInclusiveSpectrum.cxx:405
 AliHFEInclusiveSpectrum.cxx:406
 AliHFEInclusiveSpectrum.cxx:407
 AliHFEInclusiveSpectrum.cxx:408
 AliHFEInclusiveSpectrum.cxx:409
 AliHFEInclusiveSpectrum.cxx:410
 AliHFEInclusiveSpectrum.cxx:411
 AliHFEInclusiveSpectrum.cxx:412
 AliHFEInclusiveSpectrum.cxx:413
 AliHFEInclusiveSpectrum.cxx:414
 AliHFEInclusiveSpectrum.cxx:415
 AliHFEInclusiveSpectrum.cxx:416
 AliHFEInclusiveSpectrum.cxx:417
 AliHFEInclusiveSpectrum.cxx:418
 AliHFEInclusiveSpectrum.cxx:419
 AliHFEInclusiveSpectrum.cxx:420
 AliHFEInclusiveSpectrum.cxx:421
 AliHFEInclusiveSpectrum.cxx:422
 AliHFEInclusiveSpectrum.cxx:423
 AliHFEInclusiveSpectrum.cxx:424
 AliHFEInclusiveSpectrum.cxx:425
 AliHFEInclusiveSpectrum.cxx:426
 AliHFEInclusiveSpectrum.cxx:427
 AliHFEInclusiveSpectrum.cxx:428
 AliHFEInclusiveSpectrum.cxx:429
 AliHFEInclusiveSpectrum.cxx:430
 AliHFEInclusiveSpectrum.cxx:431
 AliHFEInclusiveSpectrum.cxx:432
 AliHFEInclusiveSpectrum.cxx:433
 AliHFEInclusiveSpectrum.cxx:434
 AliHFEInclusiveSpectrum.cxx:435
 AliHFEInclusiveSpectrum.cxx:436
 AliHFEInclusiveSpectrum.cxx:437
 AliHFEInclusiveSpectrum.cxx:438
 AliHFEInclusiveSpectrum.cxx:439
 AliHFEInclusiveSpectrum.cxx:440
 AliHFEInclusiveSpectrum.cxx:441
 AliHFEInclusiveSpectrum.cxx:442
 AliHFEInclusiveSpectrum.cxx:443
 AliHFEInclusiveSpectrum.cxx:444
 AliHFEInclusiveSpectrum.cxx:445
 AliHFEInclusiveSpectrum.cxx:446
 AliHFEInclusiveSpectrum.cxx:447
 AliHFEInclusiveSpectrum.cxx:448
 AliHFEInclusiveSpectrum.cxx:449
 AliHFEInclusiveSpectrum.cxx:450
 AliHFEInclusiveSpectrum.cxx:451
 AliHFEInclusiveSpectrum.cxx:452
 AliHFEInclusiveSpectrum.cxx:453
 AliHFEInclusiveSpectrum.cxx:454
 AliHFEInclusiveSpectrum.cxx:455
 AliHFEInclusiveSpectrum.cxx:456
 AliHFEInclusiveSpectrum.cxx:457
 AliHFEInclusiveSpectrum.cxx:458
 AliHFEInclusiveSpectrum.cxx:459
 AliHFEInclusiveSpectrum.cxx:460
 AliHFEInclusiveSpectrum.cxx:461
 AliHFEInclusiveSpectrum.cxx:462
 AliHFEInclusiveSpectrum.cxx:463
 AliHFEInclusiveSpectrum.cxx:464
 AliHFEInclusiveSpectrum.cxx:465
 AliHFEInclusiveSpectrum.cxx:466
 AliHFEInclusiveSpectrum.cxx:467
 AliHFEInclusiveSpectrum.cxx:468
 AliHFEInclusiveSpectrum.cxx:469
 AliHFEInclusiveSpectrum.cxx:470
 AliHFEInclusiveSpectrum.cxx:471
 AliHFEInclusiveSpectrum.cxx:472
 AliHFEInclusiveSpectrum.cxx:473
 AliHFEInclusiveSpectrum.cxx:474
 AliHFEInclusiveSpectrum.cxx:475
 AliHFEInclusiveSpectrum.cxx:476
 AliHFEInclusiveSpectrum.cxx:477
 AliHFEInclusiveSpectrum.cxx:478
 AliHFEInclusiveSpectrum.cxx:479
 AliHFEInclusiveSpectrum.cxx:480
 AliHFEInclusiveSpectrum.cxx:481
 AliHFEInclusiveSpectrum.cxx:482
 AliHFEInclusiveSpectrum.cxx:483
 AliHFEInclusiveSpectrum.cxx:484
 AliHFEInclusiveSpectrum.cxx:485
 AliHFEInclusiveSpectrum.cxx:486
 AliHFEInclusiveSpectrum.cxx:487
 AliHFEInclusiveSpectrum.cxx:488
 AliHFEInclusiveSpectrum.cxx:489
 AliHFEInclusiveSpectrum.cxx:490
 AliHFEInclusiveSpectrum.cxx:491
 AliHFEInclusiveSpectrum.cxx:492
 AliHFEInclusiveSpectrum.cxx:493
 AliHFEInclusiveSpectrum.cxx:494
 AliHFEInclusiveSpectrum.cxx:495
 AliHFEInclusiveSpectrum.cxx:496
 AliHFEInclusiveSpectrum.cxx:497
 AliHFEInclusiveSpectrum.cxx:498
 AliHFEInclusiveSpectrum.cxx:499
 AliHFEInclusiveSpectrum.cxx:500
 AliHFEInclusiveSpectrum.cxx:501
 AliHFEInclusiveSpectrum.cxx:502
 AliHFEInclusiveSpectrum.cxx:503
 AliHFEInclusiveSpectrum.cxx:504
 AliHFEInclusiveSpectrum.cxx:505
 AliHFEInclusiveSpectrum.cxx:506
 AliHFEInclusiveSpectrum.cxx:507
 AliHFEInclusiveSpectrum.cxx:508
 AliHFEInclusiveSpectrum.cxx:509
 AliHFEInclusiveSpectrum.cxx:510
 AliHFEInclusiveSpectrum.cxx:511
 AliHFEInclusiveSpectrum.cxx:512
 AliHFEInclusiveSpectrum.cxx:513
 AliHFEInclusiveSpectrum.cxx:514
 AliHFEInclusiveSpectrum.cxx:515
 AliHFEInclusiveSpectrum.cxx:516
 AliHFEInclusiveSpectrum.cxx:517
 AliHFEInclusiveSpectrum.cxx:518
 AliHFEInclusiveSpectrum.cxx:519
 AliHFEInclusiveSpectrum.cxx:520
 AliHFEInclusiveSpectrum.cxx:521
 AliHFEInclusiveSpectrum.cxx:522
 AliHFEInclusiveSpectrum.cxx:523
 AliHFEInclusiveSpectrum.cxx:524
 AliHFEInclusiveSpectrum.cxx:525
 AliHFEInclusiveSpectrum.cxx:526
 AliHFEInclusiveSpectrum.cxx:527
 AliHFEInclusiveSpectrum.cxx:528
 AliHFEInclusiveSpectrum.cxx:529
 AliHFEInclusiveSpectrum.cxx:530
 AliHFEInclusiveSpectrum.cxx:531
 AliHFEInclusiveSpectrum.cxx:532
 AliHFEInclusiveSpectrum.cxx:533
 AliHFEInclusiveSpectrum.cxx:534
 AliHFEInclusiveSpectrum.cxx:535
 AliHFEInclusiveSpectrum.cxx:536
 AliHFEInclusiveSpectrum.cxx:537
 AliHFEInclusiveSpectrum.cxx:538
 AliHFEInclusiveSpectrum.cxx:539
 AliHFEInclusiveSpectrum.cxx:540
 AliHFEInclusiveSpectrum.cxx:541
 AliHFEInclusiveSpectrum.cxx:542
 AliHFEInclusiveSpectrum.cxx:543
 AliHFEInclusiveSpectrum.cxx:544
 AliHFEInclusiveSpectrum.cxx:545
 AliHFEInclusiveSpectrum.cxx:546
 AliHFEInclusiveSpectrum.cxx:547
 AliHFEInclusiveSpectrum.cxx:548
 AliHFEInclusiveSpectrum.cxx:549
 AliHFEInclusiveSpectrum.cxx:550
 AliHFEInclusiveSpectrum.cxx:551
 AliHFEInclusiveSpectrum.cxx:552
 AliHFEInclusiveSpectrum.cxx:553
 AliHFEInclusiveSpectrum.cxx:554
 AliHFEInclusiveSpectrum.cxx:555
 AliHFEInclusiveSpectrum.cxx:556
 AliHFEInclusiveSpectrum.cxx:557
 AliHFEInclusiveSpectrum.cxx:558
 AliHFEInclusiveSpectrum.cxx:559
 AliHFEInclusiveSpectrum.cxx:560
 AliHFEInclusiveSpectrum.cxx:561
 AliHFEInclusiveSpectrum.cxx:562
 AliHFEInclusiveSpectrum.cxx:563
 AliHFEInclusiveSpectrum.cxx:564
 AliHFEInclusiveSpectrum.cxx:565
 AliHFEInclusiveSpectrum.cxx:566
 AliHFEInclusiveSpectrum.cxx:567
 AliHFEInclusiveSpectrum.cxx:568
 AliHFEInclusiveSpectrum.cxx:569
 AliHFEInclusiveSpectrum.cxx:570
 AliHFEInclusiveSpectrum.cxx:571
 AliHFEInclusiveSpectrum.cxx:572
 AliHFEInclusiveSpectrum.cxx:573
 AliHFEInclusiveSpectrum.cxx:574
 AliHFEInclusiveSpectrum.cxx:575
 AliHFEInclusiveSpectrum.cxx:576
 AliHFEInclusiveSpectrum.cxx:577
 AliHFEInclusiveSpectrum.cxx:578
 AliHFEInclusiveSpectrum.cxx:579
 AliHFEInclusiveSpectrum.cxx:580
 AliHFEInclusiveSpectrum.cxx:581
 AliHFEInclusiveSpectrum.cxx:582
 AliHFEInclusiveSpectrum.cxx:583
 AliHFEInclusiveSpectrum.cxx:584
 AliHFEInclusiveSpectrum.cxx:585
 AliHFEInclusiveSpectrum.cxx:586
 AliHFEInclusiveSpectrum.cxx:587
 AliHFEInclusiveSpectrum.cxx:588
 AliHFEInclusiveSpectrum.cxx:589
 AliHFEInclusiveSpectrum.cxx:590
 AliHFEInclusiveSpectrum.cxx:591
 AliHFEInclusiveSpectrum.cxx:592
 AliHFEInclusiveSpectrum.cxx:593
 AliHFEInclusiveSpectrum.cxx:594
 AliHFEInclusiveSpectrum.cxx:595
 AliHFEInclusiveSpectrum.cxx:596
 AliHFEInclusiveSpectrum.cxx:597
 AliHFEInclusiveSpectrum.cxx:598
 AliHFEInclusiveSpectrum.cxx:599
 AliHFEInclusiveSpectrum.cxx:600
 AliHFEInclusiveSpectrum.cxx:601
 AliHFEInclusiveSpectrum.cxx:602
 AliHFEInclusiveSpectrum.cxx:603
 AliHFEInclusiveSpectrum.cxx:604
 AliHFEInclusiveSpectrum.cxx:605
 AliHFEInclusiveSpectrum.cxx:606
 AliHFEInclusiveSpectrum.cxx:607
 AliHFEInclusiveSpectrum.cxx:608
 AliHFEInclusiveSpectrum.cxx:609
 AliHFEInclusiveSpectrum.cxx:610
 AliHFEInclusiveSpectrum.cxx:611
 AliHFEInclusiveSpectrum.cxx:612
 AliHFEInclusiveSpectrum.cxx:613
 AliHFEInclusiveSpectrum.cxx:614
 AliHFEInclusiveSpectrum.cxx:615
 AliHFEInclusiveSpectrum.cxx:616
 AliHFEInclusiveSpectrum.cxx:617
 AliHFEInclusiveSpectrum.cxx:618
 AliHFEInclusiveSpectrum.cxx:619
 AliHFEInclusiveSpectrum.cxx:620
 AliHFEInclusiveSpectrum.cxx:621
 AliHFEInclusiveSpectrum.cxx:622
 AliHFEInclusiveSpectrum.cxx:623
 AliHFEInclusiveSpectrum.cxx:624
 AliHFEInclusiveSpectrum.cxx:625
 AliHFEInclusiveSpectrum.cxx:626
 AliHFEInclusiveSpectrum.cxx:627
 AliHFEInclusiveSpectrum.cxx:628
 AliHFEInclusiveSpectrum.cxx:629
 AliHFEInclusiveSpectrum.cxx:630
 AliHFEInclusiveSpectrum.cxx:631
 AliHFEInclusiveSpectrum.cxx:632
 AliHFEInclusiveSpectrum.cxx:633
 AliHFEInclusiveSpectrum.cxx:634
 AliHFEInclusiveSpectrum.cxx:635
 AliHFEInclusiveSpectrum.cxx:636
 AliHFEInclusiveSpectrum.cxx:637
 AliHFEInclusiveSpectrum.cxx:638
 AliHFEInclusiveSpectrum.cxx:639
 AliHFEInclusiveSpectrum.cxx:640
 AliHFEInclusiveSpectrum.cxx:641
 AliHFEInclusiveSpectrum.cxx:642
 AliHFEInclusiveSpectrum.cxx:643
 AliHFEInclusiveSpectrum.cxx:644
 AliHFEInclusiveSpectrum.cxx:645
 AliHFEInclusiveSpectrum.cxx:646
 AliHFEInclusiveSpectrum.cxx:647
 AliHFEInclusiveSpectrum.cxx:648
 AliHFEInclusiveSpectrum.cxx:649
 AliHFEInclusiveSpectrum.cxx:650
 AliHFEInclusiveSpectrum.cxx:651
 AliHFEInclusiveSpectrum.cxx:652
 AliHFEInclusiveSpectrum.cxx:653
 AliHFEInclusiveSpectrum.cxx:654
 AliHFEInclusiveSpectrum.cxx:655
 AliHFEInclusiveSpectrum.cxx:656
 AliHFEInclusiveSpectrum.cxx:657
 AliHFEInclusiveSpectrum.cxx:658
 AliHFEInclusiveSpectrum.cxx:659
 AliHFEInclusiveSpectrum.cxx:660
 AliHFEInclusiveSpectrum.cxx:661
 AliHFEInclusiveSpectrum.cxx:662
 AliHFEInclusiveSpectrum.cxx:663
 AliHFEInclusiveSpectrum.cxx:664
 AliHFEInclusiveSpectrum.cxx:665
 AliHFEInclusiveSpectrum.cxx:666
 AliHFEInclusiveSpectrum.cxx:667
 AliHFEInclusiveSpectrum.cxx:668
 AliHFEInclusiveSpectrum.cxx:669
 AliHFEInclusiveSpectrum.cxx:670
 AliHFEInclusiveSpectrum.cxx:671
 AliHFEInclusiveSpectrum.cxx:672
 AliHFEInclusiveSpectrum.cxx:673
 AliHFEInclusiveSpectrum.cxx:674
 AliHFEInclusiveSpectrum.cxx:675
 AliHFEInclusiveSpectrum.cxx:676
 AliHFEInclusiveSpectrum.cxx:677
 AliHFEInclusiveSpectrum.cxx:678
 AliHFEInclusiveSpectrum.cxx:679
 AliHFEInclusiveSpectrum.cxx:680
 AliHFEInclusiveSpectrum.cxx:681
 AliHFEInclusiveSpectrum.cxx:682
 AliHFEInclusiveSpectrum.cxx:683
 AliHFEInclusiveSpectrum.cxx:684
 AliHFEInclusiveSpectrum.cxx:685
 AliHFEInclusiveSpectrum.cxx:686
 AliHFEInclusiveSpectrum.cxx:687
 AliHFEInclusiveSpectrum.cxx:688
 AliHFEInclusiveSpectrum.cxx:689
 AliHFEInclusiveSpectrum.cxx:690
 AliHFEInclusiveSpectrum.cxx:691
 AliHFEInclusiveSpectrum.cxx:692
 AliHFEInclusiveSpectrum.cxx:693
 AliHFEInclusiveSpectrum.cxx:694
 AliHFEInclusiveSpectrum.cxx:695
 AliHFEInclusiveSpectrum.cxx:696
 AliHFEInclusiveSpectrum.cxx:697
 AliHFEInclusiveSpectrum.cxx:698
 AliHFEInclusiveSpectrum.cxx:699
 AliHFEInclusiveSpectrum.cxx:700
 AliHFEInclusiveSpectrum.cxx:701
 AliHFEInclusiveSpectrum.cxx:702
 AliHFEInclusiveSpectrum.cxx:703
 AliHFEInclusiveSpectrum.cxx:704
 AliHFEInclusiveSpectrum.cxx:705
 AliHFEInclusiveSpectrum.cxx:706
 AliHFEInclusiveSpectrum.cxx:707
 AliHFEInclusiveSpectrum.cxx:708
 AliHFEInclusiveSpectrum.cxx:709
 AliHFEInclusiveSpectrum.cxx:710
 AliHFEInclusiveSpectrum.cxx:711
 AliHFEInclusiveSpectrum.cxx:712
 AliHFEInclusiveSpectrum.cxx:713
 AliHFEInclusiveSpectrum.cxx:714
 AliHFEInclusiveSpectrum.cxx:715
 AliHFEInclusiveSpectrum.cxx:716
 AliHFEInclusiveSpectrum.cxx:717