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

///////////////////////////////////////////////////////////////////////////
//                Dielectron MixingHandler                                  //
//                                                                       //
//                                                                       //
/*
Detailed description


*/
//                                                                       //
///////////////////////////////////////////////////////////////////////////

#include <TVectorD.h>
#include <TH1.h>
#include <TAxis.h>

#include <AliLog.h>
#include <AliVTrack.h>

#include "AliDielectron.h"
#include "AliDielectronHelper.h"
#include "AliDielectronHistos.h"
#include "AliDielectronEvent.h"

#include "AliDielectronMixingHandler.h"

ClassImp(AliDielectronMixingHandler)

AliDielectronMixingHandler::AliDielectronMixingHandler() :
  TNamed(),
  fDepth(10),
  fArrPools("TClonesArray"),
  fAxes(kMaxCuts),
  fMixType(kOSonly),
  fMixIncomplete(kTRUE),
  fMoveToSameVertex(kFALSE),
  fSkipFirstEvt(kFALSE),
  fPID(0x0)
{
  //
  // Default Constructor
  //
  for (Int_t i=0; i<kMaxCuts; ++i){
    fEventCuts[i]=0;
  }
  fAxes.SetOwner(kTRUE);
}

//______________________________________________
AliDielectronMixingHandler::AliDielectronMixingHandler(const char* name, const char* title) :
  TNamed(name, title),
  fDepth(10),
  fArrPools("TClonesArray"),
  fAxes(kMaxCuts),
  fMixType(kOSonly),
  fMixIncomplete(kTRUE),
  fMoveToSameVertex(kFALSE),
  fSkipFirstEvt(kFALSE),
  fPID(0x0)
{
  //
  // Named Constructor
  //
  for (Int_t i=0; i<kMaxCuts; ++i){
    fEventCuts[i]=0;
  }
  fAxes.SetOwner(kTRUE);
}

//______________________________________________
AliDielectronMixingHandler::~AliDielectronMixingHandler()
{
  //
  // Default Destructor
  //
  fAxes.Delete();
  delete fPID;
}

//________________________________________________________________
void AliDielectronMixingHandler::AddVariable(AliDielectronVarManager::ValueTypes type,
                                             Int_t nbins, Double_t min, Double_t max, Bool_t log)
{
  //
  // Add a variable to the mixing handler
  //

  // limit number of variables to kMaxCuts
  if (fAxes.GetEntriesFast()>=kMaxCuts) return;
  
  TVectorD *binLimits=0x0;
  if (!log) binLimits=AliDielectronHelper::MakeLinBinning(nbins,min,max);
  else binLimits=AliDielectronHelper::MakeLogBinning(nbins,min,max);
  if (!binLimits) return;

  Int_t size=fAxes.GetEntriesFast();
  fEventCuts[size]=(UShort_t)type;
  fAxes.Add(binLimits);
}

//________________________________________________________________
void AliDielectronMixingHandler::AddVariable(AliDielectronVarManager::ValueTypes type,
                                             const char* binLimitStr)
{
  //
  // Add a variable to the mixing handler with arbitrary binning
  //

  // limit number of variables to kMaxCuts
  if (fAxes.GetEntriesFast()>=kMaxCuts) return;
  
  TVectorD *binLimits=AliDielectronHelper::MakeArbitraryBinning(binLimitStr);
  if (!binLimits) return;
  
  Int_t size=fAxes.GetEntriesFast();
  fEventCuts[size]=(UShort_t)type;
  fAxes.Add(binLimits);
}

//________________________________________________________________
void AliDielectronMixingHandler::AddVariable(AliDielectronVarManager::ValueTypes type,
                                             TVectorD * const bins)
{
  //
  // Add a variable to the mixing handler with arbitrary binning 'bins'
  //

  // limit number of variables to kMaxCuts
  if (fAxes.GetEntriesFast()>=kMaxCuts) return;

  Int_t size=fAxes.GetEntriesFast();
  fEventCuts[size]=(UShort_t)type;
  fAxes.Add(bins);
}

//______________________________________________
void AliDielectronMixingHandler::Fill(const AliVEvent *ev, AliDielectron *diele)
{
  //
  // fill event buffers and perform mixing if the pool depth is reached
  //

  //check if there are tracks available
  if (diele->GetTrackArray(0)->GetEntriesFast()==0 && diele->GetTrackArray(1)->GetEntriesFast()==0) return;

  TString dim;
  Int_t bin=FindBin(AliDielectronVarManager::GetData(),&dim);

  //add mixing bin to event data
  AliDielectronVarManager::SetValue(AliDielectronVarManager::kMixingBin,bin);

  if (bin<0){
    AliDebug(5,Form("Bin outside range: %s",dim.Data()));
    return;
  }

  // get mixing pool, create it if it does not yet exist.
  TClonesArray *poolp=static_cast<TClonesArray*>(fArrPools.At(bin));
  if (!poolp){
    AliDebug(10,Form("New pool at %d (%s)\n",bin,dim.Data()));
    poolp=new(fArrPools[bin]) TClonesArray("AliDielectronEvent",1);
  }
  TClonesArray &pool=*poolp;

  // clear the current pool if its size was reached by last event
  // clear before fill new event into it
  // NOTE: clear not directly after DoMixing, because you may want to use the ME
  // in the internal train by other configs/tasks
  // reset the event pool size to 1 (this keeps the physical memory consumption low)
  if(pool.GetEntriesFast()==fDepth)  {
    pool.Clear("C");
    pool.ExpandCreate(1);
  }

  AliDebug(10,Form("new event at %d: %d",bin,pool.GetEntriesFast()));
  AliDielectronEvent *event=new(pool[pool.GetEntriesFast()]) AliDielectronEvent();
  if(ev->IsA() == AliAODEvent::Class()) event->SetAOD(TMath::Max(diele->GetTrackArray(0)->GetEntriesFast(),diele->GetTrackArray(1)->GetEntriesFast()));
  else event->SetESD();

  event->SetProcessID(fPID);
  event->SetTracks(*diele->GetTrackArray(0), *diele->GetTrackArray(1), *diele->GetPairArray(1));
  event->SetEventData(AliDielectronVarManager::GetData());

  // check if pool depth is reached.
  if (pool.GetEntriesFast()<fDepth) return;

  // pool depth reached, do mixing
  DoMixing(pool,diele);

  // increase counter for full bins
  if (diele->fHistos) {
    diele->fHistos->Fill("Mixing","Stats",0);
    diele->fHistos->Fill("Mixing","CompletePools",bin);
  }

}

//______________________________________________
void AliDielectronMixingHandler::DoMixing(TClonesArray &pool, AliDielectron *diele)
{
  //
  // perform the mixing
  //

  //buffer track arrays and copy them back afterwards
  TObjArray arrTrDummy[4];
  for (Int_t i=0; i<4; ++i) arrTrDummy[i]=diele->fTracks[i];

  //buffer also global event data
  Double_t values[AliDielectronVarManager::kNMaxValues]={0};
  for (Int_t i=AliDielectronVarManager::kPairMax; i<AliDielectronVarManager::kNMaxValues; ++i)
    values[i]=AliDielectronVarManager::GetValue((AliDielectronVarManager::ValueTypes)i);


  // use event data from the first event
  // all events are in the same mixing bin anyhow...
  // optionally use only the event data from the first event and no tracks of it,
  // by this you should get ride of event plane - leg correlations in the mixing
  // but you loose the 1st event in the mixing statistics
  AliDielectronEvent *ev0=static_cast<AliDielectronEvent*>(pool.At(0));
  AliDielectronVarManager::SetEventData(ev0->GetEventData());
  Int_t firstEvt=(fSkipFirstEvt ? 1 : 0);

  for (Int_t i1=firstEvt; i1<pool.GetEntriesFast(); ++i1){
    AliDielectronEvent *ev1=static_cast<AliDielectronEvent*>(pool.At(i1));
    //use event data from the first event
    //both events are in the same mixing bin anyhow...
    if( !fSkipFirstEvt ) AliDielectronVarManager::SetEventData(ev1->GetEventData());

    TObject *o=0x0;
    TIter ev1P(ev1->GetTrackArrayP());
    TIter ev1N(ev1->GetTrackArrayN());
    
    for (Int_t i2=i1+1; i2<pool.GetEntriesFast(); ++i2){
      //clear arryas
      diele->fTracks[0].Clear();
      diele->fTracks[1].Clear();
      diele->fTracks[2].Clear();
      diele->fTracks[3].Clear();
      
      //setup track arrays
      AliDielectronEvent *ev2=static_cast<AliDielectronEvent*>(pool.At(i2));
      ev1P.Reset();
      ev1N.Reset();
      TIter ev2P(ev2->GetTrackArrayP());
      TIter ev2N(ev2->GetTrackArrayN());

      //
      //move tracks to the same vertex (vertex of the first event), if requested
      //
      if (fMoveToSameVertex){
        const Double_t *varsFirst=ev1->GetEventData();
        const Double_t *varsMix=ev2->GetEventData();

        const Double_t vFirst[3]={varsFirst[AliDielectronVarManager::kXvPrim],
                                  varsFirst[AliDielectronVarManager::kYvPrim],
                                  varsFirst[AliDielectronVarManager::kZvPrim]};

        const Double_t vMix[3]  ={varsMix[AliDielectronVarManager::kXvPrim],
                                  varsMix[AliDielectronVarManager::kYvPrim],
                                  varsMix[AliDielectronVarManager::kZvPrim]};
                                  
        //loop over all tracks from the second event and move them to the vertex of the first
        AliVTrack *vtrack=0x0;
        while ( ( vtrack=(AliVTrack*)ev2P() ) ){
          MoveToSameVertex(vtrack, vFirst, vMix);
        }

        
        while ( ( vtrack=(AliVTrack*)ev2N() ) ){
          MoveToSameVertex(vtrack, vFirst, vMix);
        }

        
        ev2P.Reset();
        ev2N.Reset();
      }

      //mixing of ev1- ev2+ (pair type4). This is common for all mixing types
      while ( (o=ev1N()) ) diele->fTracks[1].Add(o); 
      while ( (o=ev2P()) ) diele->fTracks[2].Add(o);
      diele->FillPairArrays(1,2);
      
      if (fMixType==kAll || fMixType==kOSandLS){
        // all 4 pair arrays will be filled
        while ( (o=ev1P()) ) diele->fTracks[0].Add(o);
        while ( (o=ev2N()) ) diele->fTracks[3].Add(o);
        diele->FillPairArrays(0,2);
        diele->FillPairArrays(1,3);
        if (fMixType==kAll) diele->FillPairArrays(0,3);
      }
      
      if (fMixType==kOSonly || fMixType==kOSandLS){
        //use the pair type of ev1- ev1+ also for ev1+ ev1-
        diele->fTracks[1].Clear();
        diele->fTracks[2].Clear();
        while ( (o=ev1P()) ) diele->fTracks[1].Add(o);
        while ( (o=ev2N()) ) diele->fTracks[2].Add(o);
        diele->FillPairArrays(1,2);
      }

    }
  }

  //copy back the tracks
  for (Int_t i=0; i<4; ++i) {
    diele->fTracks[i].Clear();
    diele->fTracks[i]=arrTrDummy[i];
  }

  //set back global event values
  AliDielectronVarManager::SetEventData(values);
}

//______________________________________________
Bool_t AliDielectronMixingHandler::MixRemaining(AliDielectron *diele, Int_t ipool)
{
  //
  // mix all pools even if they are incomplete
  //

  //Check if there was any processed data and it is requested to mix incomplete bins
  if (!diele || !fMixIncomplete ) return 0;

  AliDielectronVarManager::SetEvent(0x0);
    TClonesArray *poolp=static_cast<TClonesArray*>(fArrPools.At(ipool));
    if (!poolp || !poolp->GetEntriesFast() || !poolp->At(0)) return 0;
    //clear the arrays before the final processing"
    AliDebug(10,Form("Incomplete: Bin %d (%d)\n",ipool,poolp->GetEntriesFast()));
    diele->ClearArrays();
    DoMixing(*poolp,diele);

    // increase counter for incomplete bins
    if (diele->fHistos) {
      //buffer event data and set event data using the first event in this pool
      Double_t values[AliDielectronVarManager::kNMaxValues]={0};
      for (Int_t i=AliDielectronVarManager::kPairMax; i<AliDielectronVarManager::kNMaxValues; ++i)
        values[i]=AliDielectronVarManager::GetValue((AliDielectronVarManager::ValueTypes)i);
      
      AliDielectronEvent *ev1=static_cast<AliDielectronEvent*>(poolp->At(0));
      //use event data from the first event all events are in the same mixing bin anyhow...
      AliDielectronVarManager::SetEventData(ev1->GetEventData());
      
      // fill the histograms
      diele->FillHistograms(0x0, kTRUE);
      diele->fHistos->Fill("Mixing","Stats",1);
      diele->fHistos->Fill("Mixing","InCompletePools",ipool);
      diele->fHistos->Fill("Mixing","Entries_InCompletePools",poolp->GetEntriesFast());
      
      //set back global event values (this would mean set back to zero)
      //AliDielectronVarManager::SetEventData(values);
    }
    return 1;
}


//______________________________________________
void AliDielectronMixingHandler::Init(const AliDielectron *diele)
{
  //
  // initialise event buffers
  //
  Int_t size=GetNumberOfBins();

  AliDebug(10,Form("Creating a pool array with size %d \n",size));

  if(diele && diele->DoEventProcess()) fArrPools.Expand(size);

  //add statics histogram if we have a histogram manager
  if (diele && diele->fHistos && diele->DoEventProcess()) {
    diele->fHistos->AddClass("Mixing");
    diele->fHistos->UserHistogram("Mixing","Stats","Mixing Statistics;;#called bins",2,0,2);
    TH1* h=diele->fHistos->GetHistogram("Mixing","Stats");
    h->GetXaxis()->SetBinLabel(1,"Complete");
    h->GetXaxis()->SetBinLabel(2,"Incomplete");

    diele->fHistos->UserHistogram("Mixing","CompletePools","Mixing Statistics compete pools;bin;#fills",size,0,size);
    diele->fHistos->UserHistogram("Mixing","InCompletePools","Mixing Statistics incomplete pools;bin;#fills",size,0,size);
    diele->fHistos->UserHistogram("Mixing","Entries_InCompletePools","#entries in incomplete pools;entries;#fills",fDepth,0,fDepth);
  }

  TString values;
  for (Int_t i=0; i<fAxes.GetEntriesFast(); ++i){
    TVectorD *bins=static_cast<TVectorD*>(fAxes.At(i));
    Int_t nRows=bins->GetNrows();
    values+=Form("%s: ",AliDielectronVarManager::GetValueName(fEventCuts[i]));
    for (Int_t irow=0; irow<nRows; ++irow){
      values+=Form("%.2f, ",(*bins)[irow]);
    }
  }
  
  if (!fPID){
    fPID=TProcessID::AddProcessID();
  }

  AliDebug(10,values.Data());
}

//______________________________________________
Int_t AliDielectronMixingHandler::GetNumberOfBins() const
{
  //
  // return the number of bins this mixing handler has
  //
  Int_t size=1;
  for (Int_t i=0; i<fAxes.GetEntriesFast(); ++i)
    size*=((static_cast<TVectorD*>(fAxes.At(i)))->GetNrows()-1);
  return size;
}

//______________________________________________
Int_t AliDielectronMixingHandler::FindBin(const Double_t values[], TString *dim)
{
  //
  // bin bin in mixing stack described by 'values'
  // if the values are outside the binning range -1 is returned
  // if dim is non NULL debug info will be stored in the variable
  //

  if (fAxes.GetEntriesFast()==0) {
    if (dim) (*dim)="single bin";
    return 0;
  }
  if (dim) (*dim)="";
  Int_t sizeAdd=1;
  Int_t bin=0;
  for (Int_t i=0; i<fAxes.GetEntriesFast(); ++i){
    Double_t val=values[fEventCuts[i]];
    TVectorD *bins=static_cast<TVectorD*>(fAxes.At(i));
    Int_t nRows=bins->GetNrows();
    if ( (val<(*bins)[0]) || (val>(*bins)[nRows-1]) ) {
      return -1;
    }

    Int_t pos=TMath::BinarySearch(nRows,bins->GetMatrixArray(),val);
    bin+=sizeAdd*pos;
    if (dim) (*dim)+=Form("%s: %f (%d); ",AliDielectronVarManager::GetValueName(fEventCuts[i]),val,pos);
    sizeAdd*=(nRows-1);
  }

  return bin;
}

//______________________________________________
void AliDielectronMixingHandler::MoveToSameVertex(AliVTrack * const vtrack, const Double_t *vFirst, const Double_t* vMix)
{
  //
  // move 'track' which belongs to the vertex information of vMix to the vertex of vFirst
  //

  static Bool_t printed=kFALSE;
  
  if (vtrack->IsA()==AliESDtrack::Class()){
    AliESDtrack *track=(AliESDtrack*)vtrack;

    //get track information
    Double_t x        = track->GetX();
    Double_t alpha    = track->GetAlpha();
    Double_t param[5] = {0};
    Double_t cov[15]  = {0};

    for (Int_t i=0; i<5;  ++i) param[i]=track->GetParameter()[i];
    for (Int_t i=0; i<15; ++i) cov[i]  =track->GetCovariance()[i];

    //translation
    Double_t vt[3] = {vMix[0]-vFirst[0],vMix[1]-vFirst[1],vMix[2]-vFirst[2]};
    //rotate to the track frame
//     track->Global2LocalPosition(vt,track->GetAlpha());

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