ROOT logo
/**************************************************************************
 * Copyright(c) 2007-2009, 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.                  *
 **************************************************************************/

/* $Id$ */

///////////////////////////////////////////////////////////////////
//                                                               //
// Implementation of the class to store the number of signal     //
// and background events in bins of the cut values               //
// Origin:       Elena Bruna (bruna@to.infn.it)                  //
// Updated:      Sergey Senyukov (senyukov@to.infn.it)           //
//               Francesco Prino (prino@to.infn.it)              //
// Last Updated: Giacomo Ortona (ortona@to.infn.it)              //
//                                                               //
///////////////////////////////////////////////////////////////////

#include <fstream>
#include <Riostream.h>
#include "TH2.h"
#include "AliMultiDimVector.h"
#include "AliLog.h"
#include "TString.h"

using std::cout;
using std::endl;

ClassImp(AliMultiDimVector)
//___________________________________________________________________________
AliMultiDimVector::AliMultiDimVector():TNamed("AliMultiDimVector","default"),
fNVariables(0),
fNPtBins(0),
fVett(0),
fNTotCells(0),
fIsIntegrated(0)
{
  // default constructor

  for(Int_t i=0; i<fgkMaxNVariables; i++) {
    fNCutSteps[i]=0;
    fMinLimits[i]=0;
    fMaxLimits[i]=0;
    fGreaterThan[i]=kTRUE;
    fAxisTitles[i]="";
  }
  for(Int_t i=0; i<fgkMaxNPtBins+1; i++) {
    fPtLimits[i]=0;
  }
}
//___________________________________________________________________________
AliMultiDimVector::AliMultiDimVector(const char *name,const char *title, const Int_t nptbins, const Float_t* ptlimits, const Int_t npars,  const Int_t *nofcells,const Float_t *loosecuts, const Float_t *tightcuts, const TString *axisTitles):TNamed(name,title),
fNVariables(npars),
fNPtBins(nptbins),
fVett(0),
fNTotCells(0),
fIsIntegrated(0){
// standard constructor

  for(Int_t i=0; i<fgkMaxNVariables; i++) {
    fNCutSteps[i]=0;
    fMinLimits[i]=0;
    fMaxLimits[i]=0;
    fGreaterThan[i]=kTRUE;
    fAxisTitles[i]="";
  }
  for(Int_t i=0; i<fgkMaxNPtBins+1; i++) {
    fPtLimits[i]=0;
  }

  ULong64_t ntot=1; 
  for(Int_t i=0;i<fNVariables;i++){
    ntot*=nofcells[i];
    fNCutSteps[i]=nofcells[i];
    if(loosecuts[i] == tightcuts[i]){
      if(loosecuts[i]!=0){
	printf("AliMultiDimVector::AliMultiDimVector: WARNING! same tight/loose variable for variable number %d. AliMultiDimVector with run with the following values: loose: %f; tight: %f\n",i,tightcuts[i]-0.1*tightcuts[i],tightcuts[i]);
	fMinLimits[i]=tightcuts[i]-0.1*tightcuts[i];
	fMaxLimits[i]=tightcuts[i];
      }else{
	fMinLimits[i]=0;
	fMaxLimits[i]=0.0001;
      }
	fGreaterThan[i]=kTRUE;
    }
    if(loosecuts[i] < tightcuts[i]){
      fMinLimits[i]=loosecuts[i];
      fMaxLimits[i]=tightcuts[i];
      fGreaterThan[i]=kTRUE;
    }else{
      fMinLimits[i]=tightcuts[i];
      fMaxLimits[i]=loosecuts[i];
      fGreaterThan[i]=kFALSE;
    }
    fAxisTitles[i]=axisTitles[i].Data();
  }
  fNTotCells=ntot*fNPtBins;  
  fVett.Set(fNTotCells); 
  for(Int_t ipt=0;ipt<fNPtBins+1;ipt++) fPtLimits[ipt]=ptlimits[ipt];
  for(Int_t ipt=fNPtBins+1;ipt<fgkMaxNPtBins+1;ipt++) fPtLimits[ipt]=999.;
  for (ULong64_t j=0;j<fNTotCells;j++) fVett.AddAt(0,j);
}
//___________________________________________________________________________
AliMultiDimVector::AliMultiDimVector(const AliMultiDimVector &mv):TNamed(mv.GetName(),mv.GetTitle()),
fNVariables(mv.fNVariables),
fNPtBins(mv.fNPtBins),
fVett(0),
fNTotCells(mv.fNTotCells),
fIsIntegrated(mv.fIsIntegrated)
{
  // copy constructor

  for(Int_t i=0; i<fgkMaxNVariables; i++) {
    fNCutSteps[i]=0;
    fMinLimits[i]=0;
    fMaxLimits[i]=0;
    fGreaterThan[i]=kTRUE;
    fAxisTitles[i]="";
  }
  for(Int_t i=0; i<fgkMaxNPtBins+1; i++) {
    fPtLimits[i]=0;
  }


  for(Int_t i=0;i<fNVariables;i++){
    fNCutSteps[i]=mv.GetNCutSteps(i);
    fMinLimits[i]=mv.GetMinLimit(i);
    fMaxLimits[i]=mv.GetMaxLimit(i);
    fGreaterThan[i]=mv.GetGreaterThan(i);
    fAxisTitles[i]=mv.GetAxisTitle(i);
  }
  fVett.Set(fNTotCells); 
  
  for(Int_t ipt=0;ipt<fNPtBins+1;ipt++) fPtLimits[ipt]=mv.GetPtLimit(ipt);
  for(ULong64_t i=0;i<fNTotCells;i++) fVett[i]=mv.GetElement(i);
}
//___________________________________________________________________________
AliMultiDimVector &AliMultiDimVector::operator=(const AliMultiDimVector &mv)
{
  // assignment operator

  if(&mv == this) return *this;

  TNamed::operator=(mv);

  fNVariables=mv.fNVariables;
  fNPtBins=mv.fNPtBins;
  fNTotCells=mv.fNTotCells;
  fIsIntegrated=mv.fIsIntegrated;


  for(Int_t i=0; i<fgkMaxNVariables; i++) {
    fNCutSteps[i]=0;
    fMinLimits[i]=0;
    fMaxLimits[i]=0;
    fGreaterThan[i]=kTRUE;
    fAxisTitles[i]="";
  }
  for(Int_t i=0; i<fgkMaxNPtBins+1; i++) {
    fPtLimits[i]=0;
  }


  for(Int_t i=0;i<fNVariables;i++){
    fNCutSteps[i]=mv.GetNCutSteps(i);
    fMinLimits[i]=mv.GetMinLimit(i);
    fMaxLimits[i]=mv.GetMaxLimit(i);
    fGreaterThan[i]=mv.GetGreaterThan(i);
    fAxisTitles[i]=mv.GetAxisTitle(i);
  }
  fVett.Set(fNTotCells); 
  
  for(Int_t ipt=0;ipt<fNPtBins+1;ipt++) fPtLimits[ipt]=mv.GetPtLimit(ipt);
  for(ULong64_t i=0;i<fNTotCells;i++) fVett[i]=mv.GetElement(i);

  return *this;
}
//___________________________________________________________________________
void AliMultiDimVector::CopyStructure(const AliMultiDimVector* mv){
// Sets dimensions and limit from mv
  fNVariables=mv->GetNVariables();
  fNPtBins=mv->GetNPtBins();
  fNTotCells=mv->GetNTotCells();
  fIsIntegrated=mv->IsIntegrated();
  for(Int_t i=0;i<fNVariables;i++){
    fNCutSteps[i]=mv->GetNCutSteps(i);
    fMinLimits[i]=mv->GetMinLimit(i);
    fMaxLimits[i]=mv->GetMaxLimit(i);
    fGreaterThan[i]=mv->GetGreaterThan(i);
    fAxisTitles[i]=mv->GetAxisTitle(i);
  }
  for(Int_t ipt=0;ipt<fNPtBins+1;ipt++) fPtLimits[ipt]=mv->GetPtLimit(ipt);
  fVett.Set(fNTotCells);  
}
//______________________________________________________________________
Bool_t AliMultiDimVector::GetIndicesFromGlobalAddress(ULong64_t globadd, Int_t *ind, Int_t &ptbin) const {
// returns matrix element indices and Pt bin from global index
  if(globadd>=fNTotCells) return kFALSE;
  ULong64_t r=globadd;
  Int_t prod=1;
  Int_t nOfCellsPlusLevel[fgkMaxNVariables+1];
  for(Int_t k=0;k<fNVariables;k++) nOfCellsPlusLevel[k]=fNCutSteps[k];
  nOfCellsPlusLevel[fNVariables]=fNPtBins;
	
  for(Int_t i=0;i<fNVariables+1;i++) prod*=nOfCellsPlusLevel[i];
  for(Int_t i=0;i<fNVariables+1;i++){
    prod/=nOfCellsPlusLevel[i];
    if(i<fNVariables) ind[i]=r/prod;
    else ptbin=r/prod;
    r=globadd%prod;
  }
  return kTRUE;
}
//______________________________________________________________________
Bool_t AliMultiDimVector::GetCutValuesFromGlobalAddress(ULong64_t globadd, Float_t *cuts, Int_t &ptbin) const {
  Int_t ind[fgkMaxNVariables];
  Bool_t retcode=GetIndicesFromGlobalAddress(globadd,ind,ptbin);
  if(!retcode) return kFALSE;
  for(Int_t i=0;i<fNVariables;i++) cuts[i]=GetCutValue(i,ind[i]);
  return kTRUE;
}
//______________________________________________________________________
ULong64_t AliMultiDimVector::GetGlobalAddressFromIndices(const Int_t *ind, Int_t ptbin) const {
  // Returns the global index of the cell in the matrix
  Int_t prod=1;
  ULong64_t elem=0;
  Int_t indexPlusLevel[fgkMaxNVariables+1];
  Int_t nOfCellsPlusLevel[fgkMaxNVariables+1];
  for(Int_t i=0;i<fNVariables;i++){
    indexPlusLevel[i]=ind[i];
    nOfCellsPlusLevel[i]=fNCutSteps[i];
  }
  indexPlusLevel[fNVariables]=ptbin;
  nOfCellsPlusLevel[fNVariables]=fNPtBins;
	
  for(Int_t i=0;i<fNVariables+1;i++){
    prod=indexPlusLevel[i];
    if(i<fNVariables){
      for(Int_t j=i+1;j<fNVariables+1;j++){
	prod*=nOfCellsPlusLevel[j];
      }
    }
    elem+=prod;
  }
  return elem;
}
//______________________________________________________________________
Bool_t AliMultiDimVector::GetIndicesFromValues(const Float_t *values, Int_t *ind) const {
  // Fills the array of matrix indices strating from variable values
  for(Int_t i=0;i<fNVariables;i++){
    if(fGreaterThan[i]){ 
      if(values[i]<GetMinLimit(i)) return kFALSE;
      ind[i]=(Int_t)((values[i]-fMinLimits[i])/GetCutStep(i));
      if(ind[i]>=GetNCutSteps(i)) ind[i]=GetNCutSteps(i)-1;
    }else{
      if(values[i]>GetMaxLimit(i)) return kFALSE;
      ind[i]=(Int_t)((fMaxLimits[i]-values[i])/GetCutStep(i));
      if(ind[i]>=GetNCutSteps(i)) ind[i]=GetNCutSteps(i)-1;
    }
  }
  return kTRUE;
}
//______________________________________________________________________
ULong64_t AliMultiDimVector::GetGlobalAddressFromValues(const Float_t *values, Int_t ptbin) const {
  // Returns the global index of the cell in the matrix
   Int_t ind[fgkMaxNVariables];
   Bool_t retcode=GetIndicesFromValues(values,ind);
   if(retcode) return GetGlobalAddressFromIndices(ind,ptbin);
   else{
     AliError("Values out of range");
     return fNTotCells+999;
   }
}
//_____________________________________________________________________________
void AliMultiDimVector::MultiplyBy(Float_t factor){
  // multiply the AliMultiDimVector by a constant factor
  for(ULong64_t i=0;i<fNTotCells;i++){
    if(fVett.At(i)>0.)
      fVett.AddAt(fVett.At(i)*factor,i);
    else fVett.AddAt(-1,i);
  }
  
}
//_____________________________________________________________________________
void AliMultiDimVector::Multiply(const AliMultiDimVector* mv,Float_t factor){
  //  Sets AliMultiDimVector=mv*constant factor
  for(ULong64_t i=0;i<fNTotCells;i++){
    if(mv->GetElement(i)>0.)
      fVett.AddAt(mv->GetElement(i)*factor,i);
    else fVett.AddAt(-1,i); 
  }
}
//_____________________________________________________________________________
void AliMultiDimVector::Multiply(const AliMultiDimVector* mv1, const AliMultiDimVector* mv2){
  //  Sets AliMultiDimVector=mv1*mv2
  for(ULong64_t i=0;i<fNTotCells;i++){
    if(mv1->GetElement(i)>0. && mv2->GetElement(i)>0.)
      fVett.AddAt(mv1->GetElement(i)*mv2->GetElement(i),i);
    else fVett.AddAt(-1,i); 
  }
}
//_____________________________________________________________________________
void AliMultiDimVector::Add(const AliMultiDimVector* mv){
  // Sums contents of mv to AliMultiDimVector
  if (mv->GetNTotCells()!=fNTotCells){ 
    AliError("Different dimension of the vectors!!");
  }else{
    for(ULong64_t i=0;i<fNTotCells;i++) 
      if(mv->GetElement(i)>0. && fVett.At(i)>0.)
	fVett.AddAt(fVett.At(i)+mv->GetElement(i),i);
      else fVett.AddAt(-1,i); 
  }
}
//_____________________________________________________________________________
void AliMultiDimVector::Sum(const AliMultiDimVector* mv1, const AliMultiDimVector* mv2){
  // Sets AliMultiDimVector=mv1+mv2
  if (fNTotCells!=mv1->GetNTotCells()&&mv1->GetNTotCells()!=mv2->GetNTotCells()) {
    AliError("Different dimension of the vectors!!");
  }
  else{
    for(ULong64_t i=0;i<mv1->GetNTotCells();i++) {
      if(mv1->GetElement(i)>0. && mv2->GetElement(i)>0.)
	fVett.AddAt(mv1->GetElement(i)+mv2->GetElement(i),i); 
      else fVett.AddAt(-1,i); 
    }
  }
}
//_____________________________________________________________________________
void AliMultiDimVector::LinearComb(const AliMultiDimVector* mv1, Float_t norm1, const AliMultiDimVector* mv2, Float_t norm2){
  // Sets AliMultiDimVector=n1*mv1+n2*mv2
  if (fNTotCells!=mv1->GetNTotCells()&&mv1->GetNTotCells()!=mv2->GetNTotCells()) {
    AliError("Different dimension of the vectors!!");
  }
  else{
    for(ULong64_t i=0;i<mv1->GetNTotCells();i++) {
      if(mv1->GetElement(i)>0. && mv2->GetElement(i)>0.)
	fVett.AddAt(norm1*mv1->GetElement(i)+norm2*mv2->GetElement(i),i); 
      else fVett.AddAt(-1,i); 
    }
  }
}
//_____________________________________________________________________________
void AliMultiDimVector::DivideBy(const AliMultiDimVector* mv){
  // Divide AliMulivector by mv
  if (mv->GetNTotCells()!=fNTotCells) {
    AliError("Different dimension of the vectors!!");
  }
  else{
    for(ULong64_t i=0;i<fNTotCells;i++) 
      if(mv->GetElement(i)!=0 &&mv->GetElement(i)>0. && fVett.At(i)>0.)
	fVett.AddAt(fVett.At(i)/mv->GetElement(i),i);
      else fVett.AddAt(-1,i);
  }

}
//_____________________________________________________________________________
void AliMultiDimVector::Divide(const AliMultiDimVector* mv1, const AliMultiDimVector* mv2){
  // Sets AliMultiDimVector=mv1/mv2
  if (fNTotCells!=mv1->GetNTotCells()&&mv1->GetNTotCells()!=mv2->GetNTotCells()) {
    AliError("Different dimension of the vectors!!");
  }
  else{
    for(ULong64_t i=0;i<mv1->GetNTotCells();i++) 
      if(mv2->GetElement(i)!=0&& mv2->GetElement(i)>0.&& mv1->GetElement(i)>0.)
	{
	  fVett.AddAt(mv1->GetElement(i)/mv2->GetElement(i),i);
	}
      else fVett.AddAt(-1,i);
  }
}
//_____________________________________________________________________________
void AliMultiDimVector::Sqrt(){
  // Sqrt of elements of AliMultiDimVector
  for(ULong64_t i=0;i<fNTotCells;i++) {
    if(fVett.At(i)>=0) fVett.AddAt(TMath::Sqrt(fVett.At(i)),i);
    else {
      fVett.AddAt(-1,i);
    }
  }
}
//_____________________________________________________________________________
void AliMultiDimVector::Sqrt(const AliMultiDimVector* mv){
  // Sets AliMultiDimVector=sqrt(mv)
  for(ULong64_t i=0;i<fNTotCells;i++) 
    if(mv->GetElement(i)>=0) fVett.AddAt(TMath::Sqrt(mv->GetElement(i)),i);
    else fVett.AddAt(-1,i);
}
//_____________________________________________________________________________
void AliMultiDimVector::FindMaximum(Float_t& maxValue, Int_t *ind , Int_t ptbin){
  // finds the element with maximum contents
  const ULong64_t nelem=fNTotCells/fNPtBins;
  TArrayF vett;
  vett.Set(nelem);
  ULong64_t runningAddress;
  for(ULong64_t i=0;i<nelem;i++){
    runningAddress=ptbin+i*fNPtBins;
    vett.AddAt(fVett[runningAddress],i);
  }
  maxValue=TMath::MaxElement(nelem,vett.GetArray());
  ULong64_t maxAddress=TMath::LocMax(nelem,vett.GetArray());
  ULong64_t maxGlobalAddress=ptbin+maxAddress*fNPtBins;
  Int_t checkedptbin;
  GetIndicesFromGlobalAddress(maxGlobalAddress,ind,checkedptbin);
}

//_____________________________________________________________________________
//Int_t* AliMultiDimVector::FindLocalMaximum(Float_t& maxValue, Bool_t *isFree,Int_t* indFixed, Int_t ptbin){
Int_t* AliMultiDimVector::FindLocalMaximum(Float_t& maxValue, Int_t *numFixed,Int_t* indFixed, Int_t nfixed,Int_t ptbin){
  //return the elements with maximum content (maxValue) given fixed step for not free variables
  //numFixed[nfixed] is the indices of the fixed variables in the cuts array [fNVariables]={kTRUE,kTRUE,...,kFALSE,...,kFALSE,...,kTRUE}
  //indFixed[nfixed]={1,2} //nfixed is the number of false in isFree; indFixed contains the step for the i-th variable
  //!!take care of deleting the array of index returned!!

  //  Int_t nfixed=0,nfree=0;
  //Int_t indtmp[fNVariables];
  if(nfixed>fNVariables)cout<<"AliMultiDimVector::FindLocalMaximum:ERROR! too many variables"<<endl;
  ULong64_t nelem=1;
  Int_t* indMax=new Int_t[fNVariables];
  //Get the number of fixed vars
  /*
  for (Int_t iv=0;iv<fNVariables;iv++){
    if(isFree[iv]){
      nfree++;
      nelem*=fNCutSteps[iv];
      indMax[iv]=0;
    }
    else {
      indMax[iv]=indFixed[nfixed];
      if(indFixed[nfixed]>=GetNCutSteps(iv)){
	indMax[iv]=0;
	cout<<"AliMultiDimVector::FindLocalMaximum:ERROR! called fixed ind "<< indFixed[nfixed]<<"  but "<<iv<<" var has only "<<GetNCutSteps(iv)<<" steps"<<endl;
      }
      nfixed++;
    }
  }
  */
  for (Int_t iv=0;iv<fNVariables;iv++)indMax[iv]=0;
  for(Int_t i=0;i<nfixed;i++){
    indMax[numFixed[i]]=indFixed[i];
  }
  //Get position of fixed vars
  /*
  Int_t fixedIndexes[nfixed];
  Int_t iforfixed=0;
  for (Int_t iv=0;iv<fNVariables;iv++){
    if(!isFree[iv]){
      fixedIndexes[iforfixed]=iv;
      iforfixed++;
    }
  }
  */
  TArrayF vett;
  vett.Set(nelem);

  ULong64_t first=fNTotCells/fNPtBins*ptbin;
  ULong64_t last=first+fNTotCells/fNPtBins;
  Int_t dummyptbin;

  maxValue=fVett[GetGlobalAddressFromIndices(indMax,ptbin)];
  Int_t tmpInd[fNVariables];

  //loop on multidimvector global addresses
  for(ULong64_t iga=first;iga<last;iga++){
    GetIndicesFromGlobalAddress(iga,tmpInd,dummyptbin);
    Bool_t goodCell=kTRUE;
    for(Int_t ifix=0;ifix<nfixed&&goodCell;ifix++){
      //      if(indFixed[ifix]!=indMax[fixedIndexes[ifix]])goodCell=kFALSE;
      if(indFixed[ifix]!=tmpInd[numFixed[ifix]])goodCell=kFALSE;
    }
    if(goodCell){
      if(fVett[iga]>maxValue){
	maxValue=fVett[iga];
	//	GetIndicesFromGlobalAddress(iga,indMax,dummyptbin);
	for(Int_t inv=0;inv<fNVariables;inv++)indMax[inv]=tmpInd[inv];
      }
    }
  }

  return indMax;
}

//_____________________________________________________________________________
TH2F*  AliMultiDimVector::Project(Int_t firstVar, Int_t secondVar, const Int_t* fixedVars, Int_t ptbin, Float_t norm){
  // Project the AliMultiDimVector on a 2D histogram

  TString hisName=Form("hproj%s%dv%d",GetName(),secondVar,firstVar);
  TString hisTit=Form("%s vs. %s",fAxisTitles[secondVar].Data(),fAxisTitles[firstVar].Data());
  TH2F* h2=new TH2F(hisName.Data(),hisTit.Data(),fNCutSteps[firstVar],fMinLimits[firstVar],fMaxLimits[firstVar],fNCutSteps[secondVar],fMinLimits[secondVar],fMaxLimits[secondVar]);
	
  Int_t index[fgkMaxNVariables];
  for(Int_t i=0;i<fNVariables;i++){
    index[i]=fixedVars[i];
  }
  
  for(Int_t i=0;i<fNCutSteps[firstVar];i++){
    for(Int_t j=0;j<fNCutSteps[secondVar];j++){
      index[firstVar]=i;
      index[secondVar]=j;
      Float_t cont=GetElement(index,ptbin)/norm;
      Int_t bin1=i+1;
      if(!fGreaterThan[firstVar]) bin1=fNCutSteps[firstVar]-i;
      Int_t bin2=j+1;
      if(!fGreaterThan[secondVar]) bin2=fNCutSteps[secondVar]-j;
      h2->SetBinContent(bin1,bin2,cont);
    }
  }
  return h2;
}
//_____________________________________________________________________________ 
void  AliMultiDimVector::GetIntegrationLimits(Int_t iVar, Int_t iCell, Int_t& minbin, Int_t& maxbin) const {
  // computes bin limits for integrating the AliMultiDimVector
  minbin=0;
  maxbin=0;
  if(iVar<fNVariables){
    minbin=iCell;
    maxbin=fNCutSteps[iVar]-1;
  }
}
//_____________________________________________________________________________ 
void  AliMultiDimVector::GetFillRange(Int_t iVar, Int_t iCell, Int_t& minbin, Int_t& maxbin) const {
  // computes range of cells passing the cuts for FillAndIntegrate
  minbin=0;
  maxbin=0;
  if(iVar<fNVariables){
    minbin=0; // bin 0 corresponds to loose cuts
    maxbin=iCell;
  }
}
//_____________________________________________________________________________ 
void AliMultiDimVector::Integrate(){
  // integrates the matrix
  if(fIsIntegrated){
    AliError("MultiDimVector already integrated");
    return;
  }
  TArrayF integral(fNTotCells);
  for(ULong64_t i=0;i<fNTotCells;i++) integral[i]=CountsAboveCell(i);
  for(ULong64_t i=0;i<fNTotCells;i++) fVett[i]= integral[i];
  fIsIntegrated=kTRUE;
}//_____________________________________________________________________________ 
ULong64_t* AliMultiDimVector::GetGlobalAddressesAboveCuts(const Float_t *values, Int_t ptbin, Int_t& nVals) const{
  // fills an array with global addresses of cells passing the cuts

  Int_t ind[fgkMaxNVariables];
  Bool_t retcode=GetIndicesFromValues(values,ind);
  if(!retcode){ 
    nVals=0;
    return 0x0;
  }
  for(Int_t i=fNVariables; i<fgkMaxNVariables; i++) ind[i]=0;
  Int_t mink[fgkMaxNVariables];
  Int_t maxk[fgkMaxNVariables];
  Int_t size=1;
  for(Int_t i=0;i<fgkMaxNVariables;i++){
    GetFillRange(i,ind[i],mink[i],maxk[i]);
    size*=(maxk[i]-mink[i]+1);
  }
  ULong64_t* indexes=new ULong64_t[size];
  nVals=0;
  for(Int_t k0=mink[0]; k0<=maxk[0]; k0++){
    for(Int_t k1=mink[1]; k1<=maxk[1]; k1++){
      for(Int_t k2=mink[2]; k2<=maxk[2]; k2++){
	for(Int_t k3=mink[3]; k3<=maxk[3]; k3++){
	  for(Int_t k4=mink[4]; k4<=maxk[4]; k4++){
	    for(Int_t k5=mink[5]; k5<=maxk[5]; k5++){
	      for(Int_t k6=mink[6]; k6<=maxk[6]; k6++){
		for(Int_t k7=mink[7]; k7<=maxk[7]; k7++){
		  for(Int_t k8=mink[8]; k8<=maxk[8]; k8++){
		    for(Int_t k9=mink[9]; k9<=maxk[9]; k9++){
		      Int_t currentBin[fgkMaxNVariables]={k0,k1,k2,k3,k4,k5,k6,k7,k8,k9};
		      indexes[nVals++]=GetGlobalAddressFromIndices(currentBin,ptbin);
		    }
		  }
		}
	      }
	    }
	  }
	}
      }
    }
  }
  return indexes;
}
//_____________________________________________________________________________ 
Float_t AliMultiDimVector::CountsAboveCell(ULong64_t globadd) const{
  // integrates the counts of cells above cell with address globadd
  Int_t ind[fgkMaxNVariables];
  Int_t ptbin;
  GetIndicesFromGlobalAddress(globadd,ind,ptbin);
  for(Int_t i=fNVariables; i<fgkMaxNVariables; i++) ind[i]=0;
  Int_t mink[fgkMaxNVariables];
  Int_t maxk[fgkMaxNVariables];
  for(Int_t i=0;i<fgkMaxNVariables;i++){
    GetIntegrationLimits(i,ind[i],mink[i],maxk[i]);
  }
  Float_t sumcont=0.;
  for(Int_t k0=mink[0]; k0<=maxk[0]; k0++){
    for(Int_t k1=mink[1]; k1<=maxk[1]; k1++){
      for(Int_t k2=mink[2]; k2<=maxk[2]; k2++){
	for(Int_t k3=mink[3]; k3<=maxk[3]; k3++){
	  for(Int_t k4=mink[4]; k4<=maxk[4]; k4++){
	    for(Int_t k5=mink[5]; k5<=maxk[5]; k5++){
	      for(Int_t k6=mink[6]; k6<=maxk[6]; k6++){
		for(Int_t k7=mink[7]; k7<=maxk[7]; k7++){
		  for(Int_t k8=mink[8]; k8<=maxk[8]; k8++){
		    for(Int_t k9=mink[9]; k9<=maxk[9]; k9++){
		      Int_t currentBin[fgkMaxNVariables]={k0,k1,k2,k3,k4,k5,k6,k7,k8,k9};
		      sumcont+=GetElement(currentBin,ptbin);
		    }
		  }
		}
	      }
	    }
	  }
	}
      }
    }
  }
  return sumcont;
}
//_____________________________________________________________________________ 
void AliMultiDimVector::Fill(Float_t* values, Int_t ptbin){
  // fills the cells of AliMultiDimVector corresponding to values
  if(fIsIntegrated){
    AliError("MultiDimVector already integrated -- Use FillAndIntegrate");
    return;
  }
  Int_t ind[fgkMaxNVariables];
  Bool_t retcode=GetIndicesFromValues(values,ind);
  for(Int_t i=fNVariables; i<fgkMaxNVariables; i++) ind[i]=0;
  if(retcode) IncrementElement(ind,ptbin);
}
//_____________________________________________________________________________ 
void AliMultiDimVector::FillAndIntegrate(Float_t* values, Int_t ptbin){
  // fills the cells of AliMultiDimVector passing the cuts
  // The number of nested loops must match fgkMaxNVariables!!!!
  fIsIntegrated=kTRUE;
  Int_t ind[fgkMaxNVariables];
  Bool_t retcode=GetIndicesFromValues(values,ind);
  if(!retcode) return;
  for(Int_t i=fNVariables; i<fgkMaxNVariables; i++) ind[i]=0;
  Int_t mink[fgkMaxNVariables];
  Int_t maxk[fgkMaxNVariables];
  for(Int_t i=0;i<fgkMaxNVariables;i++){
    GetFillRange(i,ind[i],mink[i],maxk[i]);
  }
  for(Int_t k0=mink[0]; k0<=maxk[0]; k0++){
    for(Int_t k1=mink[1]; k1<=maxk[1]; k1++){
      for(Int_t k2=mink[2]; k2<=maxk[2]; k2++){
	for(Int_t k3=mink[3]; k3<=maxk[3]; k3++){
	  for(Int_t k4=mink[4]; k4<=maxk[4]; k4++){
	    for(Int_t k5=mink[5]; k5<=maxk[5]; k5++){
	      for(Int_t k6=mink[6]; k6<=maxk[6]; k6++){
		for(Int_t k7=mink[7]; k7<=maxk[7]; k7++){
		  for(Int_t k8=mink[8]; k8<=maxk[8]; k8++){
		    for(Int_t k9=mink[9]; k9<=maxk[9]; k9++){
		      Int_t currentBin[fgkMaxNVariables]={k0,k1,k2,k3,k4,k5,k6,k7,k8,k9};
		      IncrementElement(currentBin,ptbin);
		    }
		  }
		}
	      }
	    }
	  }
	}
      }
    }
  }

}
//_____________________________________________________________________________ 
void AliMultiDimVector::SuppressZeroBKGEffect(const AliMultiDimVector* mvBKG){
  // Sets to zero elements for which mvBKG=0
  for(ULong64_t i=0;i<fNTotCells;i++)
    if(mvBKG->GetElement(i)<0.00000001) fVett.AddAt(0,i);
}
//_____________________________________________________________________________ 
AliMultiDimVector* AliMultiDimVector:: ShrinkPtBins(Int_t firstBin, Int_t lastBin){
  // sums the elements of pt bins between firstBin and lastBin
  if(firstBin<0 || lastBin>=fNPtBins || firstBin>=lastBin){
    AliError("Bad numbers of Pt bins to be shrinked");
    return 0;
  }
  Int_t nofcells[fgkMaxNVariables];
  Float_t loosecuts[fgkMaxNVariables];
  Float_t tightcuts[fgkMaxNVariables];
  TString axisTitles[fgkMaxNVariables];
  for(Int_t j=0;j<fgkMaxNVariables;j++) {
    nofcells[j]=0;
    loosecuts[j]=0.;
    tightcuts[j]=0.;
    axisTitles[j]="";
  }
  for(Int_t i=0;i<fNVariables;i++){
    nofcells[i]=fNCutSteps[i];
    if(fGreaterThan[i]){
      loosecuts[i]=fMinLimits[i];
      tightcuts[i]=fMaxLimits[i];
    }else{
      loosecuts[i]=fMaxLimits[i];
      tightcuts[i]=fMinLimits[i];
    }
    axisTitles[i]=fAxisTitles[i];
  }
  Int_t newNptbins=fNPtBins-(lastBin-firstBin);
  Float_t ptlimits[fgkMaxNPtBins+1];
  for(Int_t ipt=0; ipt<=firstBin;ipt++) ptlimits[ipt]=fPtLimits[ipt];
  for(Int_t ipt=firstBin+1; ipt<newNptbins+1;ipt++) ptlimits[ipt]=fPtLimits[ipt+(lastBin-firstBin)];
  AliMultiDimVector* shrinkedMV=new AliMultiDimVector(GetName(),GetTitle(),newNptbins,ptlimits,fNVariables,nofcells,loosecuts,tightcuts,axisTitles);
  
  ULong64_t nOfPointsPerPtbin=fNTotCells/fNPtBins;
  ULong64_t addressOld,addressNew;
  Int_t npb,opb;
  for(npb=0;npb<firstBin;npb++){
    opb=npb;
    for(ULong64_t k=0;k<nOfPointsPerPtbin;k++){
      addressOld=opb+k*fNPtBins;
      addressNew=npb+k*newNptbins;
      shrinkedMV->SetElement(addressNew,fVett[addressOld]);
    }
  }
  npb=firstBin;
  for(ULong64_t k=0;k<nOfPointsPerPtbin;k++){
    Float_t summedValue=0.;
    for(opb=firstBin;opb<=lastBin;opb++){
      addressOld=opb+k*fNPtBins;
      summedValue+=fVett[addressOld];
    }
    addressNew=npb+k*newNptbins;
    shrinkedMV->SetElement(addressNew,summedValue);
  }
  for(npb=firstBin+1;npb<newNptbins;npb++){
    opb=npb+(lastBin-firstBin);
    for(ULong64_t k=0;k<nOfPointsPerPtbin;k++){
      addressOld=opb+k*fNPtBins;
      addressNew=npb+k*newNptbins;
      shrinkedMV->SetElement(addressNew,fVett[addressOld]);
    }
  }
  return shrinkedMV;
}
//_____________________________________________________________________________ 
void AliMultiDimVector::SetNewLimits(Float_t* loose,Float_t* tight){
  for(Int_t i=0;i<fNVariables;i++){
    if(loose[i] < tight[i]){
      fMinLimits[i]=loose[i];
      fMaxLimits[i]=tight[i];
      fGreaterThan[i]=kTRUE;
    }else{
      fMinLimits[i]=tight[i];
      fMaxLimits[i]=loose[i];
      fGreaterThan[i]=kFALSE;
    }
  }
}
//_____________________________________________________________________________ 
void AliMultiDimVector::SwapLimits(Int_t ivar){
  Float_t oldmin = fMinLimits[ivar];
  fMinLimits[ivar] = fMaxLimits[ivar];
  fMaxLimits[ivar] = oldmin;
  if(fGreaterThan[ivar])fGreaterThan[ivar]=kFALSE;
  else fGreaterThan[ivar]=kTRUE;
}
//_____________________________________________________________________________ 
void AliMultiDimVector::PrintStatus(){
  //
  printf("Number of Pt bins       = %d\n",fNPtBins);
  printf("Limits of Pt bins       = ");
  for(Int_t ib=0;ib<fNPtBins+1;ib++) printf("%6.2f ",fPtLimits[ib]);
  printf("\n");
  printf("Number of cut variables = %d\n",fNVariables);
  for(Int_t iv=0;iv<fNVariables;iv++){
    printf("- Variable %d: %s\n",iv,fAxisTitles[iv].Data());
    printf("    Nsteps= %d Rage = %6.2f %6.2f\n",
	   fNCutSteps[iv],fMinLimits[iv],fMaxLimits[iv]);
  }
}
 AliMultiDimVector.cxx:1
 AliMultiDimVector.cxx:2
 AliMultiDimVector.cxx:3
 AliMultiDimVector.cxx:4
 AliMultiDimVector.cxx:5
 AliMultiDimVector.cxx:6
 AliMultiDimVector.cxx:7
 AliMultiDimVector.cxx:8
 AliMultiDimVector.cxx:9
 AliMultiDimVector.cxx:10
 AliMultiDimVector.cxx:11
 AliMultiDimVector.cxx:12
 AliMultiDimVector.cxx:13
 AliMultiDimVector.cxx:14
 AliMultiDimVector.cxx:15
 AliMultiDimVector.cxx:16
 AliMultiDimVector.cxx:17
 AliMultiDimVector.cxx:18
 AliMultiDimVector.cxx:19
 AliMultiDimVector.cxx:20
 AliMultiDimVector.cxx:21
 AliMultiDimVector.cxx:22
 AliMultiDimVector.cxx:23
 AliMultiDimVector.cxx:24
 AliMultiDimVector.cxx:25
 AliMultiDimVector.cxx:26
 AliMultiDimVector.cxx:27
 AliMultiDimVector.cxx:28
 AliMultiDimVector.cxx:29
 AliMultiDimVector.cxx:30
 AliMultiDimVector.cxx:31
 AliMultiDimVector.cxx:32
 AliMultiDimVector.cxx:33
 AliMultiDimVector.cxx:34
 AliMultiDimVector.cxx:35
 AliMultiDimVector.cxx:36
 AliMultiDimVector.cxx:37
 AliMultiDimVector.cxx:38
 AliMultiDimVector.cxx:39
 AliMultiDimVector.cxx:40
 AliMultiDimVector.cxx:41
 AliMultiDimVector.cxx:42
 AliMultiDimVector.cxx:43
 AliMultiDimVector.cxx:44
 AliMultiDimVector.cxx:45
 AliMultiDimVector.cxx:46
 AliMultiDimVector.cxx:47
 AliMultiDimVector.cxx:48
 AliMultiDimVector.cxx:49
 AliMultiDimVector.cxx:50
 AliMultiDimVector.cxx:51
 AliMultiDimVector.cxx:52
 AliMultiDimVector.cxx:53
 AliMultiDimVector.cxx:54
 AliMultiDimVector.cxx:55
 AliMultiDimVector.cxx:56
 AliMultiDimVector.cxx:57
 AliMultiDimVector.cxx:58
 AliMultiDimVector.cxx:59
 AliMultiDimVector.cxx:60
 AliMultiDimVector.cxx:61
 AliMultiDimVector.cxx:62
 AliMultiDimVector.cxx:63
 AliMultiDimVector.cxx:64
 AliMultiDimVector.cxx:65
 AliMultiDimVector.cxx:66
 AliMultiDimVector.cxx:67
 AliMultiDimVector.cxx:68
 AliMultiDimVector.cxx:69
 AliMultiDimVector.cxx:70
 AliMultiDimVector.cxx:71
 AliMultiDimVector.cxx:72
 AliMultiDimVector.cxx:73
 AliMultiDimVector.cxx:74
 AliMultiDimVector.cxx:75
 AliMultiDimVector.cxx:76
 AliMultiDimVector.cxx:77
 AliMultiDimVector.cxx:78
 AliMultiDimVector.cxx:79
 AliMultiDimVector.cxx:80
 AliMultiDimVector.cxx:81
 AliMultiDimVector.cxx:82
 AliMultiDimVector.cxx:83
 AliMultiDimVector.cxx:84
 AliMultiDimVector.cxx:85
 AliMultiDimVector.cxx:86
 AliMultiDimVector.cxx:87
 AliMultiDimVector.cxx:88
 AliMultiDimVector.cxx:89
 AliMultiDimVector.cxx:90
 AliMultiDimVector.cxx:91
 AliMultiDimVector.cxx:92
 AliMultiDimVector.cxx:93
 AliMultiDimVector.cxx:94
 AliMultiDimVector.cxx:95
 AliMultiDimVector.cxx:96
 AliMultiDimVector.cxx:97
 AliMultiDimVector.cxx:98
 AliMultiDimVector.cxx:99
 AliMultiDimVector.cxx:100
 AliMultiDimVector.cxx:101
 AliMultiDimVector.cxx:102
 AliMultiDimVector.cxx:103
 AliMultiDimVector.cxx:104
 AliMultiDimVector.cxx:105
 AliMultiDimVector.cxx:106
 AliMultiDimVector.cxx:107
 AliMultiDimVector.cxx:108
 AliMultiDimVector.cxx:109
 AliMultiDimVector.cxx:110
 AliMultiDimVector.cxx:111
 AliMultiDimVector.cxx:112
 AliMultiDimVector.cxx:113
 AliMultiDimVector.cxx:114
 AliMultiDimVector.cxx:115
 AliMultiDimVector.cxx:116
 AliMultiDimVector.cxx:117
 AliMultiDimVector.cxx:118
 AliMultiDimVector.cxx:119
 AliMultiDimVector.cxx:120
 AliMultiDimVector.cxx:121
 AliMultiDimVector.cxx:122
 AliMultiDimVector.cxx:123
 AliMultiDimVector.cxx:124
 AliMultiDimVector.cxx:125
 AliMultiDimVector.cxx:126
 AliMultiDimVector.cxx:127
 AliMultiDimVector.cxx:128
 AliMultiDimVector.cxx:129
 AliMultiDimVector.cxx:130
 AliMultiDimVector.cxx:131
 AliMultiDimVector.cxx:132
 AliMultiDimVector.cxx:133
 AliMultiDimVector.cxx:134
 AliMultiDimVector.cxx:135
 AliMultiDimVector.cxx:136
 AliMultiDimVector.cxx:137
 AliMultiDimVector.cxx:138
 AliMultiDimVector.cxx:139
 AliMultiDimVector.cxx:140
 AliMultiDimVector.cxx:141
 AliMultiDimVector.cxx:142
 AliMultiDimVector.cxx:143
 AliMultiDimVector.cxx:144
 AliMultiDimVector.cxx:145
 AliMultiDimVector.cxx:146
 AliMultiDimVector.cxx:147
 AliMultiDimVector.cxx:148
 AliMultiDimVector.cxx:149
 AliMultiDimVector.cxx:150
 AliMultiDimVector.cxx:151
 AliMultiDimVector.cxx:152
 AliMultiDimVector.cxx:153
 AliMultiDimVector.cxx:154
 AliMultiDimVector.cxx:155
 AliMultiDimVector.cxx:156
 AliMultiDimVector.cxx:157
 AliMultiDimVector.cxx:158
 AliMultiDimVector.cxx:159
 AliMultiDimVector.cxx:160
 AliMultiDimVector.cxx:161
 AliMultiDimVector.cxx:162
 AliMultiDimVector.cxx:163
 AliMultiDimVector.cxx:164
 AliMultiDimVector.cxx:165
 AliMultiDimVector.cxx:166
 AliMultiDimVector.cxx:167
 AliMultiDimVector.cxx:168
 AliMultiDimVector.cxx:169
 AliMultiDimVector.cxx:170
 AliMultiDimVector.cxx:171
 AliMultiDimVector.cxx:172
 AliMultiDimVector.cxx:173
 AliMultiDimVector.cxx:174
 AliMultiDimVector.cxx:175
 AliMultiDimVector.cxx:176
 AliMultiDimVector.cxx:177
 AliMultiDimVector.cxx:178
 AliMultiDimVector.cxx:179
 AliMultiDimVector.cxx:180
 AliMultiDimVector.cxx:181
 AliMultiDimVector.cxx:182
 AliMultiDimVector.cxx:183
 AliMultiDimVector.cxx:184
 AliMultiDimVector.cxx:185
 AliMultiDimVector.cxx:186
 AliMultiDimVector.cxx:187
 AliMultiDimVector.cxx:188
 AliMultiDimVector.cxx:189
 AliMultiDimVector.cxx:190
 AliMultiDimVector.cxx:191
 AliMultiDimVector.cxx:192
 AliMultiDimVector.cxx:193
 AliMultiDimVector.cxx:194
 AliMultiDimVector.cxx:195
 AliMultiDimVector.cxx:196
 AliMultiDimVector.cxx:197
 AliMultiDimVector.cxx:198
 AliMultiDimVector.cxx:199
 AliMultiDimVector.cxx:200
 AliMultiDimVector.cxx:201
 AliMultiDimVector.cxx:202
 AliMultiDimVector.cxx:203
 AliMultiDimVector.cxx:204
 AliMultiDimVector.cxx:205
 AliMultiDimVector.cxx:206
 AliMultiDimVector.cxx:207
 AliMultiDimVector.cxx:208
 AliMultiDimVector.cxx:209
 AliMultiDimVector.cxx:210
 AliMultiDimVector.cxx:211
 AliMultiDimVector.cxx:212
 AliMultiDimVector.cxx:213
 AliMultiDimVector.cxx:214
 AliMultiDimVector.cxx:215
 AliMultiDimVector.cxx:216
 AliMultiDimVector.cxx:217
 AliMultiDimVector.cxx:218
 AliMultiDimVector.cxx:219
 AliMultiDimVector.cxx:220
 AliMultiDimVector.cxx:221
 AliMultiDimVector.cxx:222
 AliMultiDimVector.cxx:223
 AliMultiDimVector.cxx:224
 AliMultiDimVector.cxx:225
 AliMultiDimVector.cxx:226
 AliMultiDimVector.cxx:227
 AliMultiDimVector.cxx:228
 AliMultiDimVector.cxx:229
 AliMultiDimVector.cxx:230
 AliMultiDimVector.cxx:231
 AliMultiDimVector.cxx:232
 AliMultiDimVector.cxx:233
 AliMultiDimVector.cxx:234
 AliMultiDimVector.cxx:235
 AliMultiDimVector.cxx:236
 AliMultiDimVector.cxx:237
 AliMultiDimVector.cxx:238
 AliMultiDimVector.cxx:239
 AliMultiDimVector.cxx:240
 AliMultiDimVector.cxx:241
 AliMultiDimVector.cxx:242
 AliMultiDimVector.cxx:243
 AliMultiDimVector.cxx:244
 AliMultiDimVector.cxx:245
 AliMultiDimVector.cxx:246
 AliMultiDimVector.cxx:247
 AliMultiDimVector.cxx:248
 AliMultiDimVector.cxx:249
 AliMultiDimVector.cxx:250
 AliMultiDimVector.cxx:251
 AliMultiDimVector.cxx:252
 AliMultiDimVector.cxx:253
 AliMultiDimVector.cxx:254
 AliMultiDimVector.cxx:255
 AliMultiDimVector.cxx:256
 AliMultiDimVector.cxx:257
 AliMultiDimVector.cxx:258
 AliMultiDimVector.cxx:259
 AliMultiDimVector.cxx:260
 AliMultiDimVector.cxx:261
 AliMultiDimVector.cxx:262
 AliMultiDimVector.cxx:263
 AliMultiDimVector.cxx:264
 AliMultiDimVector.cxx:265
 AliMultiDimVector.cxx:266
 AliMultiDimVector.cxx:267
 AliMultiDimVector.cxx:268
 AliMultiDimVector.cxx:269
 AliMultiDimVector.cxx:270
 AliMultiDimVector.cxx:271
 AliMultiDimVector.cxx:272
 AliMultiDimVector.cxx:273
 AliMultiDimVector.cxx:274
 AliMultiDimVector.cxx:275
 AliMultiDimVector.cxx:276
 AliMultiDimVector.cxx:277
 AliMultiDimVector.cxx:278
 AliMultiDimVector.cxx:279
 AliMultiDimVector.cxx:280
 AliMultiDimVector.cxx:281
 AliMultiDimVector.cxx:282
 AliMultiDimVector.cxx:283
 AliMultiDimVector.cxx:284
 AliMultiDimVector.cxx:285
 AliMultiDimVector.cxx:286
 AliMultiDimVector.cxx:287
 AliMultiDimVector.cxx:288
 AliMultiDimVector.cxx:289
 AliMultiDimVector.cxx:290
 AliMultiDimVector.cxx:291
 AliMultiDimVector.cxx:292
 AliMultiDimVector.cxx:293
 AliMultiDimVector.cxx:294
 AliMultiDimVector.cxx:295
 AliMultiDimVector.cxx:296
 AliMultiDimVector.cxx:297
 AliMultiDimVector.cxx:298
 AliMultiDimVector.cxx:299
 AliMultiDimVector.cxx:300
 AliMultiDimVector.cxx:301
 AliMultiDimVector.cxx:302
 AliMultiDimVector.cxx:303
 AliMultiDimVector.cxx:304
 AliMultiDimVector.cxx:305
 AliMultiDimVector.cxx:306
 AliMultiDimVector.cxx:307
 AliMultiDimVector.cxx:308
 AliMultiDimVector.cxx:309
 AliMultiDimVector.cxx:310
 AliMultiDimVector.cxx:311
 AliMultiDimVector.cxx:312
 AliMultiDimVector.cxx:313
 AliMultiDimVector.cxx:314
 AliMultiDimVector.cxx:315
 AliMultiDimVector.cxx:316
 AliMultiDimVector.cxx:317
 AliMultiDimVector.cxx:318
 AliMultiDimVector.cxx:319
 AliMultiDimVector.cxx:320
 AliMultiDimVector.cxx:321
 AliMultiDimVector.cxx:322
 AliMultiDimVector.cxx:323
 AliMultiDimVector.cxx:324
 AliMultiDimVector.cxx:325
 AliMultiDimVector.cxx:326
 AliMultiDimVector.cxx:327
 AliMultiDimVector.cxx:328
 AliMultiDimVector.cxx:329
 AliMultiDimVector.cxx:330
 AliMultiDimVector.cxx:331
 AliMultiDimVector.cxx:332
 AliMultiDimVector.cxx:333
 AliMultiDimVector.cxx:334
 AliMultiDimVector.cxx:335
 AliMultiDimVector.cxx:336
 AliMultiDimVector.cxx:337
 AliMultiDimVector.cxx:338
 AliMultiDimVector.cxx:339
 AliMultiDimVector.cxx:340
 AliMultiDimVector.cxx:341
 AliMultiDimVector.cxx:342
 AliMultiDimVector.cxx:343
 AliMultiDimVector.cxx:344
 AliMultiDimVector.cxx:345
 AliMultiDimVector.cxx:346
 AliMultiDimVector.cxx:347
 AliMultiDimVector.cxx:348
 AliMultiDimVector.cxx:349
 AliMultiDimVector.cxx:350
 AliMultiDimVector.cxx:351
 AliMultiDimVector.cxx:352
 AliMultiDimVector.cxx:353
 AliMultiDimVector.cxx:354
 AliMultiDimVector.cxx:355
 AliMultiDimVector.cxx:356
 AliMultiDimVector.cxx:357
 AliMultiDimVector.cxx:358
 AliMultiDimVector.cxx:359
 AliMultiDimVector.cxx:360
 AliMultiDimVector.cxx:361
 AliMultiDimVector.cxx:362
 AliMultiDimVector.cxx:363
 AliMultiDimVector.cxx:364
 AliMultiDimVector.cxx:365
 AliMultiDimVector.cxx:366
 AliMultiDimVector.cxx:367
 AliMultiDimVector.cxx:368
 AliMultiDimVector.cxx:369
 AliMultiDimVector.cxx:370
 AliMultiDimVector.cxx:371
 AliMultiDimVector.cxx:372
 AliMultiDimVector.cxx:373
 AliMultiDimVector.cxx:374
 AliMultiDimVector.cxx:375
 AliMultiDimVector.cxx:376
 AliMultiDimVector.cxx:377
 AliMultiDimVector.cxx:378
 AliMultiDimVector.cxx:379
 AliMultiDimVector.cxx:380
 AliMultiDimVector.cxx:381
 AliMultiDimVector.cxx:382
 AliMultiDimVector.cxx:383
 AliMultiDimVector.cxx:384
 AliMultiDimVector.cxx:385
 AliMultiDimVector.cxx:386
 AliMultiDimVector.cxx:387
 AliMultiDimVector.cxx:388
 AliMultiDimVector.cxx:389
 AliMultiDimVector.cxx:390
 AliMultiDimVector.cxx:391
 AliMultiDimVector.cxx:392
 AliMultiDimVector.cxx:393
 AliMultiDimVector.cxx:394
 AliMultiDimVector.cxx:395
 AliMultiDimVector.cxx:396
 AliMultiDimVector.cxx:397
 AliMultiDimVector.cxx:398
 AliMultiDimVector.cxx:399
 AliMultiDimVector.cxx:400
 AliMultiDimVector.cxx:401
 AliMultiDimVector.cxx:402
 AliMultiDimVector.cxx:403
 AliMultiDimVector.cxx:404
 AliMultiDimVector.cxx:405
 AliMultiDimVector.cxx:406
 AliMultiDimVector.cxx:407
 AliMultiDimVector.cxx:408
 AliMultiDimVector.cxx:409
 AliMultiDimVector.cxx:410
 AliMultiDimVector.cxx:411
 AliMultiDimVector.cxx:412
 AliMultiDimVector.cxx:413
 AliMultiDimVector.cxx:414
 AliMultiDimVector.cxx:415
 AliMultiDimVector.cxx:416
 AliMultiDimVector.cxx:417
 AliMultiDimVector.cxx:418
 AliMultiDimVector.cxx:419
 AliMultiDimVector.cxx:420
 AliMultiDimVector.cxx:421
 AliMultiDimVector.cxx:422
 AliMultiDimVector.cxx:423
 AliMultiDimVector.cxx:424
 AliMultiDimVector.cxx:425
 AliMultiDimVector.cxx:426
 AliMultiDimVector.cxx:427
 AliMultiDimVector.cxx:428
 AliMultiDimVector.cxx:429
 AliMultiDimVector.cxx:430
 AliMultiDimVector.cxx:431
 AliMultiDimVector.cxx:432
 AliMultiDimVector.cxx:433
 AliMultiDimVector.cxx:434
 AliMultiDimVector.cxx:435
 AliMultiDimVector.cxx:436
 AliMultiDimVector.cxx:437
 AliMultiDimVector.cxx:438
 AliMultiDimVector.cxx:439
 AliMultiDimVector.cxx:440
 AliMultiDimVector.cxx:441
 AliMultiDimVector.cxx:442
 AliMultiDimVector.cxx:443
 AliMultiDimVector.cxx:444
 AliMultiDimVector.cxx:445
 AliMultiDimVector.cxx:446
 AliMultiDimVector.cxx:447
 AliMultiDimVector.cxx:448
 AliMultiDimVector.cxx:449
 AliMultiDimVector.cxx:450
 AliMultiDimVector.cxx:451
 AliMultiDimVector.cxx:452
 AliMultiDimVector.cxx:453
 AliMultiDimVector.cxx:454
 AliMultiDimVector.cxx:455
 AliMultiDimVector.cxx:456
 AliMultiDimVector.cxx:457
 AliMultiDimVector.cxx:458
 AliMultiDimVector.cxx:459
 AliMultiDimVector.cxx:460
 AliMultiDimVector.cxx:461
 AliMultiDimVector.cxx:462
 AliMultiDimVector.cxx:463
 AliMultiDimVector.cxx:464
 AliMultiDimVector.cxx:465
 AliMultiDimVector.cxx:466
 AliMultiDimVector.cxx:467
 AliMultiDimVector.cxx:468
 AliMultiDimVector.cxx:469
 AliMultiDimVector.cxx:470
 AliMultiDimVector.cxx:471
 AliMultiDimVector.cxx:472
 AliMultiDimVector.cxx:473
 AliMultiDimVector.cxx:474
 AliMultiDimVector.cxx:475
 AliMultiDimVector.cxx:476
 AliMultiDimVector.cxx:477
 AliMultiDimVector.cxx:478
 AliMultiDimVector.cxx:479
 AliMultiDimVector.cxx:480
 AliMultiDimVector.cxx:481
 AliMultiDimVector.cxx:482
 AliMultiDimVector.cxx:483
 AliMultiDimVector.cxx:484
 AliMultiDimVector.cxx:485
 AliMultiDimVector.cxx:486
 AliMultiDimVector.cxx:487
 AliMultiDimVector.cxx:488
 AliMultiDimVector.cxx:489
 AliMultiDimVector.cxx:490
 AliMultiDimVector.cxx:491
 AliMultiDimVector.cxx:492
 AliMultiDimVector.cxx:493
 AliMultiDimVector.cxx:494
 AliMultiDimVector.cxx:495
 AliMultiDimVector.cxx:496
 AliMultiDimVector.cxx:497
 AliMultiDimVector.cxx:498
 AliMultiDimVector.cxx:499
 AliMultiDimVector.cxx:500
 AliMultiDimVector.cxx:501
 AliMultiDimVector.cxx:502
 AliMultiDimVector.cxx:503
 AliMultiDimVector.cxx:504
 AliMultiDimVector.cxx:505
 AliMultiDimVector.cxx:506
 AliMultiDimVector.cxx:507
 AliMultiDimVector.cxx:508
 AliMultiDimVector.cxx:509
 AliMultiDimVector.cxx:510
 AliMultiDimVector.cxx:511
 AliMultiDimVector.cxx:512
 AliMultiDimVector.cxx:513
 AliMultiDimVector.cxx:514
 AliMultiDimVector.cxx:515
 AliMultiDimVector.cxx:516
 AliMultiDimVector.cxx:517
 AliMultiDimVector.cxx:518
 AliMultiDimVector.cxx:519
 AliMultiDimVector.cxx:520
 AliMultiDimVector.cxx:521
 AliMultiDimVector.cxx:522
 AliMultiDimVector.cxx:523
 AliMultiDimVector.cxx:524
 AliMultiDimVector.cxx:525
 AliMultiDimVector.cxx:526
 AliMultiDimVector.cxx:527
 AliMultiDimVector.cxx:528
 AliMultiDimVector.cxx:529
 AliMultiDimVector.cxx:530
 AliMultiDimVector.cxx:531
 AliMultiDimVector.cxx:532
 AliMultiDimVector.cxx:533
 AliMultiDimVector.cxx:534
 AliMultiDimVector.cxx:535
 AliMultiDimVector.cxx:536
 AliMultiDimVector.cxx:537
 AliMultiDimVector.cxx:538
 AliMultiDimVector.cxx:539
 AliMultiDimVector.cxx:540
 AliMultiDimVector.cxx:541
 AliMultiDimVector.cxx:542
 AliMultiDimVector.cxx:543
 AliMultiDimVector.cxx:544
 AliMultiDimVector.cxx:545
 AliMultiDimVector.cxx:546
 AliMultiDimVector.cxx:547
 AliMultiDimVector.cxx:548
 AliMultiDimVector.cxx:549
 AliMultiDimVector.cxx:550
 AliMultiDimVector.cxx:551
 AliMultiDimVector.cxx:552
 AliMultiDimVector.cxx:553
 AliMultiDimVector.cxx:554
 AliMultiDimVector.cxx:555
 AliMultiDimVector.cxx:556
 AliMultiDimVector.cxx:557
 AliMultiDimVector.cxx:558
 AliMultiDimVector.cxx:559
 AliMultiDimVector.cxx:560
 AliMultiDimVector.cxx:561
 AliMultiDimVector.cxx:562
 AliMultiDimVector.cxx:563
 AliMultiDimVector.cxx:564
 AliMultiDimVector.cxx:565
 AliMultiDimVector.cxx:566
 AliMultiDimVector.cxx:567
 AliMultiDimVector.cxx:568
 AliMultiDimVector.cxx:569
 AliMultiDimVector.cxx:570
 AliMultiDimVector.cxx:571
 AliMultiDimVector.cxx:572
 AliMultiDimVector.cxx:573
 AliMultiDimVector.cxx:574
 AliMultiDimVector.cxx:575
 AliMultiDimVector.cxx:576
 AliMultiDimVector.cxx:577
 AliMultiDimVector.cxx:578
 AliMultiDimVector.cxx:579
 AliMultiDimVector.cxx:580
 AliMultiDimVector.cxx:581
 AliMultiDimVector.cxx:582
 AliMultiDimVector.cxx:583
 AliMultiDimVector.cxx:584
 AliMultiDimVector.cxx:585
 AliMultiDimVector.cxx:586
 AliMultiDimVector.cxx:587
 AliMultiDimVector.cxx:588
 AliMultiDimVector.cxx:589
 AliMultiDimVector.cxx:590
 AliMultiDimVector.cxx:591
 AliMultiDimVector.cxx:592
 AliMultiDimVector.cxx:593
 AliMultiDimVector.cxx:594
 AliMultiDimVector.cxx:595
 AliMultiDimVector.cxx:596
 AliMultiDimVector.cxx:597
 AliMultiDimVector.cxx:598
 AliMultiDimVector.cxx:599
 AliMultiDimVector.cxx:600
 AliMultiDimVector.cxx:601
 AliMultiDimVector.cxx:602
 AliMultiDimVector.cxx:603
 AliMultiDimVector.cxx:604
 AliMultiDimVector.cxx:605
 AliMultiDimVector.cxx:606
 AliMultiDimVector.cxx:607
 AliMultiDimVector.cxx:608
 AliMultiDimVector.cxx:609
 AliMultiDimVector.cxx:610
 AliMultiDimVector.cxx:611
 AliMultiDimVector.cxx:612
 AliMultiDimVector.cxx:613
 AliMultiDimVector.cxx:614
 AliMultiDimVector.cxx:615
 AliMultiDimVector.cxx:616
 AliMultiDimVector.cxx:617
 AliMultiDimVector.cxx:618
 AliMultiDimVector.cxx:619
 AliMultiDimVector.cxx:620
 AliMultiDimVector.cxx:621
 AliMultiDimVector.cxx:622
 AliMultiDimVector.cxx:623
 AliMultiDimVector.cxx:624
 AliMultiDimVector.cxx:625
 AliMultiDimVector.cxx:626
 AliMultiDimVector.cxx:627
 AliMultiDimVector.cxx:628
 AliMultiDimVector.cxx:629
 AliMultiDimVector.cxx:630
 AliMultiDimVector.cxx:631
 AliMultiDimVector.cxx:632
 AliMultiDimVector.cxx:633
 AliMultiDimVector.cxx:634
 AliMultiDimVector.cxx:635
 AliMultiDimVector.cxx:636
 AliMultiDimVector.cxx:637
 AliMultiDimVector.cxx:638
 AliMultiDimVector.cxx:639
 AliMultiDimVector.cxx:640
 AliMultiDimVector.cxx:641
 AliMultiDimVector.cxx:642
 AliMultiDimVector.cxx:643
 AliMultiDimVector.cxx:644
 AliMultiDimVector.cxx:645
 AliMultiDimVector.cxx:646
 AliMultiDimVector.cxx:647
 AliMultiDimVector.cxx:648
 AliMultiDimVector.cxx:649
 AliMultiDimVector.cxx:650
 AliMultiDimVector.cxx:651
 AliMultiDimVector.cxx:652
 AliMultiDimVector.cxx:653
 AliMultiDimVector.cxx:654
 AliMultiDimVector.cxx:655
 AliMultiDimVector.cxx:656
 AliMultiDimVector.cxx:657
 AliMultiDimVector.cxx:658
 AliMultiDimVector.cxx:659
 AliMultiDimVector.cxx:660
 AliMultiDimVector.cxx:661
 AliMultiDimVector.cxx:662
 AliMultiDimVector.cxx:663
 AliMultiDimVector.cxx:664
 AliMultiDimVector.cxx:665
 AliMultiDimVector.cxx:666
 AliMultiDimVector.cxx:667
 AliMultiDimVector.cxx:668
 AliMultiDimVector.cxx:669
 AliMultiDimVector.cxx:670
 AliMultiDimVector.cxx:671
 AliMultiDimVector.cxx:672
 AliMultiDimVector.cxx:673
 AliMultiDimVector.cxx:674
 AliMultiDimVector.cxx:675
 AliMultiDimVector.cxx:676
 AliMultiDimVector.cxx:677
 AliMultiDimVector.cxx:678
 AliMultiDimVector.cxx:679
 AliMultiDimVector.cxx:680
 AliMultiDimVector.cxx:681
 AliMultiDimVector.cxx:682
 AliMultiDimVector.cxx:683
 AliMultiDimVector.cxx:684
 AliMultiDimVector.cxx:685
 AliMultiDimVector.cxx:686
 AliMultiDimVector.cxx:687
 AliMultiDimVector.cxx:688
 AliMultiDimVector.cxx:689
 AliMultiDimVector.cxx:690
 AliMultiDimVector.cxx:691
 AliMultiDimVector.cxx:692
 AliMultiDimVector.cxx:693
 AliMultiDimVector.cxx:694
 AliMultiDimVector.cxx:695
 AliMultiDimVector.cxx:696
 AliMultiDimVector.cxx:697
 AliMultiDimVector.cxx:698
 AliMultiDimVector.cxx:699
 AliMultiDimVector.cxx:700
 AliMultiDimVector.cxx:701
 AliMultiDimVector.cxx:702
 AliMultiDimVector.cxx:703
 AliMultiDimVector.cxx:704
 AliMultiDimVector.cxx:705
 AliMultiDimVector.cxx:706
 AliMultiDimVector.cxx:707
 AliMultiDimVector.cxx:708
 AliMultiDimVector.cxx:709
 AliMultiDimVector.cxx:710
 AliMultiDimVector.cxx:711
 AliMultiDimVector.cxx:712
 AliMultiDimVector.cxx:713
 AliMultiDimVector.cxx:714
 AliMultiDimVector.cxx:715
 AliMultiDimVector.cxx:716
 AliMultiDimVector.cxx:717
 AliMultiDimVector.cxx:718
 AliMultiDimVector.cxx:719
 AliMultiDimVector.cxx:720
 AliMultiDimVector.cxx:721
 AliMultiDimVector.cxx:722
 AliMultiDimVector.cxx:723
 AliMultiDimVector.cxx:724
 AliMultiDimVector.cxx:725
 AliMultiDimVector.cxx:726
 AliMultiDimVector.cxx:727
 AliMultiDimVector.cxx:728
 AliMultiDimVector.cxx:729
 AliMultiDimVector.cxx:730
 AliMultiDimVector.cxx:731
 AliMultiDimVector.cxx:732
 AliMultiDimVector.cxx:733
 AliMultiDimVector.cxx:734
 AliMultiDimVector.cxx:735
 AliMultiDimVector.cxx:736
 AliMultiDimVector.cxx:737
 AliMultiDimVector.cxx:738
 AliMultiDimVector.cxx:739
 AliMultiDimVector.cxx:740
 AliMultiDimVector.cxx:741
 AliMultiDimVector.cxx:742
 AliMultiDimVector.cxx:743
 AliMultiDimVector.cxx:744
 AliMultiDimVector.cxx:745
 AliMultiDimVector.cxx:746
 AliMultiDimVector.cxx:747
 AliMultiDimVector.cxx:748
 AliMultiDimVector.cxx:749
 AliMultiDimVector.cxx:750
 AliMultiDimVector.cxx:751
 AliMultiDimVector.cxx:752
 AliMultiDimVector.cxx:753
 AliMultiDimVector.cxx:754
 AliMultiDimVector.cxx:755
 AliMultiDimVector.cxx:756
 AliMultiDimVector.cxx:757
 AliMultiDimVector.cxx:758
 AliMultiDimVector.cxx:759
 AliMultiDimVector.cxx:760
 AliMultiDimVector.cxx:761
 AliMultiDimVector.cxx:762
 AliMultiDimVector.cxx:763
 AliMultiDimVector.cxx:764
 AliMultiDimVector.cxx:765
 AliMultiDimVector.cxx:766
 AliMultiDimVector.cxx:767
 AliMultiDimVector.cxx:768
 AliMultiDimVector.cxx:769
 AliMultiDimVector.cxx:770
 AliMultiDimVector.cxx:771
 AliMultiDimVector.cxx:772
 AliMultiDimVector.cxx:773
 AliMultiDimVector.cxx:774
 AliMultiDimVector.cxx:775
 AliMultiDimVector.cxx:776
 AliMultiDimVector.cxx:777
 AliMultiDimVector.cxx:778
 AliMultiDimVector.cxx:779
 AliMultiDimVector.cxx:780
 AliMultiDimVector.cxx:781
 AliMultiDimVector.cxx:782
 AliMultiDimVector.cxx:783
 AliMultiDimVector.cxx:784
 AliMultiDimVector.cxx:785
 AliMultiDimVector.cxx:786
 AliMultiDimVector.cxx:787