ROOT logo
// Author: Benjamin Hess   29/01/2010

/*************************************************************************
 * Copyright (C) 2009-2010, Alexandru Bercuci, Benjamin Hess.            *
 * All rights reserved.                                                  *
 *************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// AliEveListAnalyser                                                   //
//                                                                      //
// An AliEveListAnalyser is, in principal, a TEveElementList with some  //
// sophisticated features. You can add macros to this list, which then  //
// can be applied to the list of analysis objects (these objects can be //
// added to the list in the same way as for the TEveElementList, but    //
// also "by clicking" (cf. AliEveListAnaLyserEditor)).                  //
// In general, please use AddMacro(...) for this purpose.               //
// Macros that are no longer needed can be removed from the list via    //
// RemoveSelectedMacros(...). This function takes an iterator of the    //
// list of macros that are to be removed.                               //
// An entry looks like:                                                 //
// The data for each macro consists of path, name, type and the command //
// that will be used to apply the macro. This stuff is stored in a map  //
// which takes the macro name for the key and the above mentioned data  //
// in a TGeneralMacroData-object for the value.                         //
// You can get the macro type via GetMacroType(...).                    //
// To find the type of objects the macro will deal with (corresponds to //
// "YourObjectType" in the examples below) please use                   //
// GetMacroObjectType(...).                                             //
// With ApplySOSelectionMacros(...) or ApplyProcessMacros(...)          //
// respectively you can apply the macros to the track list via          //
// iterators (same style like for RemoveSelectedMacros(...)(cf. above)).//
// Selection macros (de-)select macros according to a selection rule    //
// by setting the rnr-state of the tracks.                              //
// If multiple selection macros are applied, a track is selected, if    //
// all selection macros select the track.                               //
// Process macros create data or histograms, which will be stored in    //
// a temporary file. The editor of this class will access this file     //
// and draw all the stuff within it's DrawHistos() function. The file   //
// will be deleted by the destructor.                                   //
//                                                                      //
// Currently, the following macro types are supported:                  //
// Selection macros:                                                    //
// Bool_t YourMacro(const YourObjectType*);                             //
// Bool_t YourMacro(const YourObjectType*, const YourObjectType2*);     //
//                                                                      //
// Process macros:                                                      //
// void YourMacro(const YourObjectType*, Double_t*&, Int_t&);           //
// void YourMacro(const YourObjectType*, const YourObjectType2*,        //
//                Double_t*&, Int_t&);                                  //
// TH1* YourMacro(const YourObjectType*);                               //
// TH1* YourMacro(const YourObjectType*, const YourObjectType2*);       //
//                                                                      //
// The macros which take 2 tracks are applied to all track pairs        //
// (whereby BOTH tracks of the pair have to be selected by the single   //
// track selection macros and have to be unequal, otherwise they will   //
// be skipped) that have been selected by ALL correlated tracks         //
// selection macros. The selection macros with 2 tracks do NOT affect   //
// process macros that process only a single track!                     //
//////////////////////////////////////////////////////////////////////////


// Uncomment to display debugging infos
//#define AliEveListAnalyser_DEBUG

#include <TEveManager.h>
#include <TEveSelection.h>
#include <TFile.h>
#include <TFunction.h>
#include <TH1.h>
#include <TList.h>
#include <TMap.h>
#include <TMethodArg.h>
#include <TMethodCall.h>
#include <TObjString.h>
#include <TQObject.h>
#include <TROOT.h>
#include <TSystem.h>
#include <TTree.h>
#include <TTreeStream.h>

#include <AliTRDReconstructor.h>

#include <EveDet/AliEveListAnalyser.h>
#include <EveDet/AliEveListAnalyserEditor.h>

ClassImp(AliEveListAnalyser)

///////////////////////////////////////////////////////////
/////////////   AliEveListAnalyser ////////////////////////
///////////////////////////////////////////////////////////
AliEveListAnalyser::AliEveListAnalyser(const Text_t* n, const Text_t* t, Bool_t doColor):
  TEveElementList(n, t, doColor),
  fConnected(kFALSE),
  fDataFromMacroList(0x0),
  fEditor(0x0),
  fMacroList(0x0),
  fDataTree(0x0),
  fHistoDataSelected(0),
  fMacroListSelected(0),
  fSelectedTab(2)                               // Standard tab: "Apply macros" (index 2)
{
  // Creates the AliEveListAnalyser.

  // Only accept childs of type TEveElement
  SetChildClass(TEveElement::Class());

  // Allocate memory for the lists and declare them as owners of their contents
  fDataFromMacroList = new TList();
  fDataFromMacroList->TCollection::SetOwner(kTRUE);

  fMacroList = new TMap();
  // Set map to owner of it's objects to delete them, if they are removed from the map
  fMacroList->SetOwnerKeyValue(kTRUE, kTRUE);

  // Set the build directory for AClic
  if(gSystem->AccessPathName(Form("%s/.QArec" , gSystem->Getenv("HOME")))) gSystem->Exec("mkdir $HOME/.QArec");
  gSystem->SetBuildDir(Form("%s/.QArec", gSystem->Getenv("HOME")));

  AddStandardContent();
}

//______________________________________________________
AliEveListAnalyser::~AliEveListAnalyser()
{
  // Frees allocated memory (lists etc.).

  // Stop adding objects
  StopAddingObjects();

  // Let the editor know that the list will be destroyed -> The editor will save the data
  if (fEditor != 0)
  {
    fEditor->SaveMacroList(fMacroList);
    fEditor = 0;
  }

  if (fDataFromMacroList != 0)
  {
    fDataFromMacroList->Delete();
    delete fDataFromMacroList;
    fDataFromMacroList = 0;
  } 
  if (fDataTree != 0)
  {
    delete fDataTree;
    fDataTree = 0;
  } 
  if (fMacroList != 0)
  {
    fMacroList->DeleteAll();
    delete fMacroList;
    fMacroList = 0;
  }
  // Note: gSystem->AccessPathName(...) returns kTRUE, if the access FAILED!
  if(!gSystem->AccessPathName(Form("/tmp/ListAnalyserMacroData_%s.root", gSystem->Getenv("USER")))) 
    gSystem->Exec(Form("rm /tmp/ListAnalyserMacroData_%s.root", gSystem->Getenv("USER")));
}

//______________________________________________________
Int_t AliEveListAnalyser::AddMacro(const Char_t* path, const Char_t* nameC, Bool_t forceReload)
{
  // Checks, if the file exists and if the signature is correct.
  // If these criteria are fullfilled, the library for this macro is built
  // and the macro is added to the corresponding list.
  // Supported macro types:
  // Selection macros:                                                    
  // Bool_t YourMacro(const YourObjectType*)
  // Bool_t YourMacro(const YourObjectType*, const YourObjectType2*)
  //
  // Process macros:                                                      
  // void YourMacro(const YourObjectType*, Double_t*&, Int_t&)             
  // void YourMacro(const YourObjectType*, const YourObjectType2*, Double_t*&, Int_t&)                                   
  // TH1* YourMacro(const YourObjectType*)                                 
  // TH1* YourMacro(const YourObjectType*, const YourObjectType2*)                              

  Char_t pathname[fkMaxMacroPathNameLength];
  memset(pathname, '\0', sizeof(Char_t) * fkMaxMacroPathNameLength);

  // Expand the path and create the pathname
  Char_t* systemPath = gSystem->ExpandPathName(path);
  snprintf(pathname, fkMaxMacroPathNameLength, "%s/%s", systemPath, nameC);
  delete systemPath;
  systemPath = 0;

  // Delete ".C" from filename
  Char_t name[fkMaxMacroNameLength];
  memset(name, '\0', sizeof(Char_t) * fkMaxMacroNameLength);
  
  for (UInt_t ind = 0; ind < fkMaxMacroNameLength && ind < strlen(nameC) - 2; ind++)  name[ind] = nameC[ind];

  // Check, if files exists
  FILE* fp = 0x0;
  if((fp = fopen(pathname, "rb"))){
    fclose(fp);
    fp = 0x0;
  } else  return NOT_EXIST_ERROR;
  
  // Clean up root, load the desired macro and then check the type of the macro
  // A.B. gROOT->Reset();
 
  gROOT->ProcessLineSync(Form(".L %s+%c", pathname, forceReload ? '+' : ' '));

  TClass* objectType;
  TClass* objectType2;

  objectType = GetMacroObjectType(name, 1);
  objectType2 = GetMacroObjectType(name, 2);

  // We need this line... otherwise, in some cases, there will be problems concerning ACLIC
  gROOT->ProcessLineSync(Form(".L %s", pathname));

  if (!objectType)  return UNKNOWN_OBJECT_TYPE_ERROR;

  // This might be a macro dealing with only 1 object... test this afterwards!
  Bool_t testSecondObj = kFALSE;
  if (!objectType2) 
  {
    objectType2 = TObject::Class();
    testSecondObj = kTRUE;
  }
  AliEveListAnalyserMacroType type = GetMacroType(name, objectType->GetName(), objectType2->GetName(), kFALSE);

  if (testSecondObj)
  {
    switch (type)
    {
    case AliEveListAnalyser::kCorrelObjectSelect:
    case AliEveListAnalyser::kCorrelObjectAnalyse:
    case AliEveListAnalyser::kCorrelObjectHisto:
      // There must be a second type -> Error!
      return UNKNOWN_OBJECT_TYPE_ERROR;
      break;
    default:
      // Ok, single object macro!
      break;
    }
  }


  // Clean up again
  // A.B. gROOT->Reset();
 
  // Has not the correct signature!
  if (type == kUnknown) return SIGNATURE_ERROR;

  // Only add macro, if it is not already in the list
  Int_t returnValue = WARNING;
  if(fMacroList->GetValue(name) == 0) 
  {
    returnValue = AddMacroFast(path, name, type, objectType, objectType2) ? SUCCESS : ERROR;
  }

  return returnValue;
}

//______________________________________________________
Bool_t AliEveListAnalyser::AddMacroFast(const Char_t* path, const Char_t* name, AliEveListAnalyserMacroType type, 
                                        TClass* objectType, TClass* objectType2)
{
  // Adds a macro (path/name) to the corresponding list. No checks are performed (file exists, 
  // macro already in list/map, signature correct),  no libraries are created!
  // You can use this function only, if the macro has been added successfully before 
  // (and then maybe was removed). The function is very fast. On success kTRUE is returned, otherwise: kFALSE;
  // Note: If your macro takes only 1 pointer as a parameter, just use "0x0" for objectType2!

  Bool_t success = kFALSE;

  switch (type)
  {
    case kSingleObjectSelect:
    case kCorrelObjectSelect:
    case kSingleObjectAnalyse:
    case kSingleObjectHisto:
    case kCorrelObjectAnalyse:
    case kCorrelObjectHisto:
      fMacroList->Add(new TObjString(name), new TGeneralMacroData(name, path, type, objectType, objectType2));

      // We do not know, where the element has been inserted - deselect this list
      fMacroListSelected = 0;
    
      success = kTRUE;

#ifdef AliEveListAnalyser_DEBUG
      // Successfull add will only be displayed in debug mode
      printf("AliEveListAnalyser::AddMacroFast: Added macro \"%s/%s\" with object types \"%s\" and \"%s\" to the corresponding list\n", 
             path, name, objectType->GetName(), objectType2->GetName());
#endif

      break;

    default:
      // Error will always be displayed
      printf("AliEveListAnalyser::AddMacroFast: ERROR: Could not add macro \"%s/%s\" with object types \"%s\" and \"%s\" to the corresponding list\n", path, name, objectType->GetName(), objectType2->GetName());

      success = kFALSE;

      break;
  }

  return success;
}


//______________________________________________________
Int_t AliEveListAnalyser::AddPrimSelectedObject(TEveElement* el)
{
  // Adds the TEveElement el to the list. If it is already in the list, it is removed.
  // If the list is the only parent of the clicked object, the object is moved outside the list in the browser (not deleted!).
  // If you want to delete the object, just select it there and choose "Destroy" in the menu.
  // This function is designed to be used together with a signal:
  // It adds the (primarily) selected objects in the viewer to the list (objects that are already in the list are removed!).
  // Returns "ERROR" (cf. defines) on error, "WARNING" if the element does not contain any user data and else "SUCCESS" (i.e.
  // the element has been added successfully or the element is the list itself and therefore ignored, or the element is ignored 
  // because it has been added via secondary selection).
 
  if (!el)
  {
    Error("AliEveListAnalyser::AddPrimSelectedObject", "Zero pointer!");

    return ERROR;
  }

  // If the clicked element is the list itself, just do nothing.
  if (el == this)  return SUCCESS;

  if (!this->HasChild(el))
  {

    // Ignore objects that do not have any user data, since these cannot be used in the analysis!
    if (el->GetUserData() == 0x0)
    {
      Warning("AddPrimSelectedObject", "Selected object does not contain any \"user data\" and therefore is ignored!");

      return WARNING;
    }

    // Element clicked that is not in the list (and is not the list itself!) -> Add this element to the list
    this->AddElement(el);
    this->SetTitle(Form("Objects %d", this->NumChildren()));
    gEve->Redraw3D();
  }
  else
  {
    // Element clicked that is already in the list. Remove it. But: Only take care of objects that have been added
    // via primary selection (name does not start with "[sec")
    if (TString(el->GetElementName()).BeginsWith("[sec:"))  return SUCCESS;


    // Element is a child of this list. So, if there are only 2 parents, we know them: list + eve selection. In this case,
    // the element needs to be destroyed. If there are more parents, just remove the element from the list.
    // Since the elements editor will be opened, the element is not deleted, but "moved" outside the list (in the browser).
    if (el->NumParents() > 2) 
    {
      this->RemoveElement(el);
    }
    else
    {
      // There must be at least 2 parents!
      if (el->NumParents() <= 1)  return ERROR;

      TEveElement* listObj = 0x0;
      listObj = this->FindChild(el->GetElementName());
      if (!listObj)  return ERROR;

      gEve->AddElement(listObj, 0);
      // Alternatively: Switch on that the element is NOT destroyed, instead of adding it outside the list. Warning: Memory leaks possible.
      //listObj->SetDestroyOnZeroRefCnt(kFALSE);
      this->RemoveElement(listObj);
      //gEve->RemoveElement(listObj, 0);
    }
  } 

  this->SetTitle(Form("Objects %d", this->NumChildren()));
  gEve->Redraw3D();

  return SUCCESS;
}


/*
//______________________________________________________
void AliEveListAnalyser::AddPrimSelectedObjects()
{
  // Adds the (primarily) selected objects in the viewer to the list (objects that are already in the list are ignored).
  // Hold the CTRL-key for multiple selection.

  TEveSelection* eveSel = gEve->GetSelection();
  if (!eveSel)
  {
    Error("AliEveListAnalyser::AddPrimSelectedObjects", "Failed to get the selection!\n");
    return;
  }
  
  TEveElement* elem = 0x0;
  Bool_t changedSomething = kFALSE;

  for (TEveElement::List_i iter = eveSel->BeginChildren(); iter != eveSel->EndChildren(); ++iter)
  {
    if(!(elem = dynamic_cast<TEveElement*>(*iter))) continue;

    if (!this->HasChild(elem) && elem != this)
    {
      // Element clicked that is not in the list (and is not the list itself!) -> Add this element to list
      this->AddElement(elem);
      this->SetTitle(Form("Objects %d", this->NumChildren()));
      changedSomething = kTRUE;
    }
  }

  if (changedSomething) gEve->Redraw3D();
}
*/

//______________________________________________________
void AliEveListAnalyser::AddSecSelectedSingleObjectToList(Int_t pointId)
{
  // This function adds the selected object (secondary selection in the viewer) to the list
  // of analysis objects. If the object is already in the list, it will be removed from it.
  // This function is used to add single objects of a TEvePointset, e.g. single clusters.

  TEvePointSet* ps = dynamic_cast<TEvePointSet*>((TQObject*) gTQSender);
  if (!ps)
  {
    Error("AliEveListAnalyser::AddSecSelectedSingleObjectToList", "Zero pointer!");
    return;
  }

  // Check, if object is already there. If so, remove it!
  
  // 1st possibility: Object of the list clicked. But: Only take care of objects that have been added
  // via secondary selection (name starts with "[sec"). Note: HasChild will also return kTRUE, if e.g.
  // the whole TEvePointSet of clusters is in the last (but maybe another point of it has been clicked!)

  if (this->HasChild(ps))
  {
    if (TString(ps->GetName()).BeginsWith("[sec:"))
    {
      // I don't know why, but you get a crash, if you try this->RemoveElement(ps) (in some cases).
      // So, use this way instead.
      TEveElement* listObj = this->FindChild(ps->GetName());
      if (listObj)
      {
        listObj->SetUserData(0x0);
        this->RemoveElement(listObj);
        this->SetTitle(Form("Objects %d", this->NumChildren()));
      }

      return;
    }
  }

  TObject* obj = ps->GetPointId(pointId);
  if (obj)
  {
    // 2nd possibility: Same object clicked again
    TEveElement* listObj = 0x0;
    listObj = this->FindChild(Form("[sec:%d] %s%d", obj->GetUniqueID(), obj->GetName(), pointId));
    if (listObj)
    {
      listObj->SetUserData(0x0);
      this->RemoveElement(listObj); 
      this->SetTitle(Form("Objects %d", this->NumChildren()));
      return;
    }

    // Object clicked that is not in the list -> Add this object to list
    TEvePointSet* newPS = new TEvePointSet(Form("[sec:%d] %s%d", obj->GetUniqueID(), obj->GetName(), pointId));
    Double_t x = 0, y = 0, z = 0;
    ps->GetPoint(pointId, x, y, z);
    newPS->SetPoint(0, x, y, z);
    newPS->SetUserData(obj);
    // Choose yellow for the added points and inherit style and size for the marker
    newPS->SetMarkerColor(5);
    newPS->SetMarkerStyle(ps->GetMarkerStyle());
    newPS->SetMarkerSize(ps->GetMarkerSize());
    // Own points -> Will be cleared, if this object is removed
    newPS->SetOwnIds(kTRUE);

    this->AddElement(newPS);
    this->SetTitle(Form("Objects %d", this->NumChildren()));
    gEve->Redraw3D();
  }
  else
  {
    Error("AliEveListAnalyser::AddSecSelectedSingleObjectToList", "Selected object is NULL and therefore ignored!");
  }
}

//______________________________________________________
void AliEveListAnalyser::AddStandardContent()
{
  // Adds standard macros to the macro list.

  // Add your standard macros here, e.g.: 
  // To add a macro use:
  // AddMacro("$(ALICE_ROOT)/myFolder", "myMacroName.C");
  // -> If the file does not exist, nothing happens. So if you want to handle this,
  // use the return value of AddMacro (NOT_EXIST_ERROR is returned, if file does not exist)
  // (-> You can also check for other return values (see AddMacro(...)))

}

//______________________________________________________
Bool_t AliEveListAnalyser::ApplyProcessMacros(const TList* selIterator, const TList* procIterator)
{
  // Uses the procIterator (for the selected process macros) to apply the selected macros to the data.
  // Returns kTRUE on success, otherwise kFALSE. If there no process macros selected, kTRUE is returned 
  // (this is no error!).
  // The single object process macros are applied to all selected objects.
  // The selIterator (for the selected selection macros) will be used to apply the correlated objects selection
  // macros to all object pairs (whereby BOTH objects have to be selected, otherwise they will be skipped).
  // All object pairs that have been selected by ALL correlated objects selection macros will be processed by
  // the correlated objects process macros.

  // No process macros need to be processed
  if (procIterator->GetEntries() <= 0)  return kTRUE;

  // Clear root
  // A.B. gROOT->Reset();
  
  // Clear old data and re-allocate
  if (fDataTree == NULL){
    TDirectory *cwd = gDirectory;
    fDataTree = new TTreeSRedirector(Form("/tmp/ListAnalyserMacroData_%s.root", gSystem->Getenv("USER")));
    cwd->cd();
  }
  if (!fDataTree){
    Error("Apply process macros", "File \"/tmp/ListAnalyserMacroData_%s.root\" could not be accessed properly!",
          gSystem->Getenv("USER"));
    return kFALSE;
  }
  
  if (fDataFromMacroList != 0) {
    fDataFromMacroList->Delete();
    delete fDataFromMacroList;
  }
  fDataFromMacroList = new TList();
  fDataFromMacroList->TCollection::SetOwner(kTRUE);

  fHistoDataSelected = 0;
  TGeneralMacroData* macro(NULL);

  TString* procCmds                      = new TString[procIterator->GetEntries()];
  AliEveListAnalyserMacroType* mProcType = new AliEveListAnalyserMacroType[procIterator->GetEntries()];
  TClass** mProcObjectType               = new TClass*[procIterator->GetEntries()];
  TClass** mProcObjectType2              = new TClass*[procIterator->GetEntries()];

  TString* selCmds(NULL);
  AliEveListAnalyserMacroType* mSelType(NULL);
  TClass** mSelObjectType(NULL);
  TClass** mSelObjectType2(NULL);
  
  Bool_t selectedByCorrSelMacro = kFALSE;

  AliEveListAnalyserMacroType macroType = kUnknown;
  Int_t numHistoMacros = 0;
  TH1** histos(NULL);

  TEveElement* object1(NULL);
  TEveElement* object2(NULL);
  TH1* returnedHist(NULL);

  // Collect the commands for each process macro and add them to "data-from-list"
  for (Int_t i = 0; i < procIterator->GetEntries(); i++){
    macro = (TGeneralMacroData*)fMacroList->GetValue(procIterator->At(i)->GetTitle());

    if (!macro){
      Error("Apply process macros", 
        "Macro list is corrupted: Macro \"%s\" is not registered!",
        procIterator->At(i)->GetTitle());
      continue;
    }

#ifdef AliEveListAnalyser_DEBUG
    printf("AliEveListAnalyser: Checking process macro: %s\n", macro->GetName());
#endif 
           
    // Find the object types of the macro
    mProcObjectType[i] = macro->GetObjectType();
    mProcObjectType2[i] = macro->GetObjectType2();

    // Find the type of the process macro
    macroType = macro->GetType();
    if (macroType == kSingleObjectHisto || macroType == kCorrelObjectHisto){
      mProcType[i] = macroType;
      numHistoMacros++;
      // Create the command 
      procCmds[i] = macro->GetCmd();

      // Add to "data-from-list" -> Mark as a histo macro with the substring "(histo macro)"
      fDataFromMacroList->Add(new TObjString(Form("%s (histo macro)", macro->GetName())));
    } else if (macroType == kSingleObjectAnalyse || macroType == kCorrelObjectAnalyse) {
      mProcType[i] = macroType;
      // Create the command 
      procCmds[i] = macro->GetCmd();

      // Add to "data-from-list"
      fDataFromMacroList->Add(new TObjString(macro->GetName()));
    } else {
      Error("Apply process macros", 
        "Macro list corrupted: Macro \"%s/%s.C\" is not registered as a process macro!",
        macro->GetPath(), macro->GetName());
      mProcType[i] = kUnknown;
    } 
  }  


  Int_t selEntries = selIterator->GetEntries();
  // Collect the commands for each selection macro and add them to "data-from-list"
  if (selEntries > 0) {
    selCmds         = new TString[selEntries];
    mSelType        = new AliEveListAnalyserMacroType[selEntries];
    mSelObjectType  = new TClass*[selEntries];
    mSelObjectType2 = new TClass*[selEntries];
    for (Int_t i = 0; i < selEntries; i++){
      macro = (TGeneralMacroData*)fMacroList->GetValue(selIterator->At(i)->GetTitle());

      if (!macro){
        Error("Apply process macros",
          "Macro list is corrupted: Macro \"%s\" is not registered!",
          selIterator->At(i)->GetTitle());
        continue;
      }

#ifdef AliEveListAnalyser_DEBUG
      printf("AliEveListAnalyser: Checking selection macro: %s\n", macro->GetName());
#endif

      // Find the object types of the macro
      mSelObjectType[i] = macro->GetObjectType();
      mSelObjectType2[i] = macro->GetObjectType2();

      // Find the type of the process macro
      macroType = macro->GetType();

      // Single Object select macro
      if (macroType == kSingleObjectSelect) {
        // Has already been processed by ApplySOSelectionMacros(...)
        mSelType[i] = macroType;
      }
      // Correlated Objects select macro
      else if (macroType == kCorrelObjectSelect) {
        mSelType[i] = macroType;

        // Create the command
        selCmds[i] = macro->GetCmd();
      } else {
        Error("Apply process macros",
          "Macro list corrupted: Macro \"%s/%s.C\" is not registered as a selection macro!",
          macro->GetPath(), macro->GetName());
        mSelType[i] = kUnknown;
      }
    }
  }

  // Allocate memory for the histograms
  if (numHistoMacros > 0){
    histos = new TH1*[numHistoMacros];
    memset(histos, 0, numHistoMacros*sizeof(TH1*));
  }
  Bool_t secondBeforeFirstObject = kTRUE;
  

  //////////////////////////////////////
  // WALK THROUGH THE LIST OF OBJECTS //
  //////////////////////////////////////     
  for (TEveElement::List_i iter = this->BeginChildren(); iter != this->EndChildren(); ++iter){
    if(!(object1 = dynamic_cast<TEveElement*>(*iter))) continue;

    // Skip objects that have not been selected
    if (!object1->GetRnrState())  continue;
    
    // Cast to the "real" object behind
    gROOT->ProcessLineSync(Form("TEveElement *automaticEveElement = (TEveElement*)%p;", (void*)object1));
    gROOT->ProcessLineSync("TObject* automaticObject_1 = (TObject*)automaticEveElement->GetUserData();");

    // Collect data for each macro
    for (Int_t i = 0, histoIndex = 0; i < procIterator->GetEntries(); i++){
      // Find the type of the object and relate it to the macro object type
      // Only apply macro to this object, if...
      // ... the macro takes objects of exactly this type.
      // ... the macro object type is a child of this object's type.
      // Otherwise: Continue

      // Finally, via procCmds[i], the automatic objects are casted to the correct type and analysed by each macro!
      if (((TObject*)object1->GetUserData())->IsA() != mProcObjectType[i] && 
          !((TObject*)object1->GetUserData())->InheritsFrom(mProcObjectType[i]))  continue;

        
      // Single object histo
      if (mProcType[i] == kSingleObjectHisto){
        returnedHist = (TH1*)gROOT->ProcessLineSync(procCmds[i]);
        if (histos && returnedHist)
        {
          if (!histos[histoIndex])  histos[histoIndex] = returnedHist;
          else  
          {
            histos[histoIndex]->Add((const TH1*)returnedHist);
            delete returnedHist;
            returnedHist = 0;
          }
        }
        histoIndex++;
       // Correlated Objects histo
      } else if (mProcType[i] == kCorrelObjectHisto) {
        // To get all pairs, do the second loop over all objects.
        // But: If a macro takes 2 pointers of the same type, we must take care that one gets the same pair, when we exchange the objects
        // (this is not true, if we have different types - even if they inherit from the same classes!).
        // Thus: If the latter case occurs, we ignore an object pair, if the second object is BEFORE the first object in the list.
        // Since then the pair has already been taken into account.
        // Furthermore, we have a pair of objects, if and only if both objects of the pair are selected (Rnr-state)
        // and are not equal.
        // The correlated objects process macro will be applied to all pairs that will be additionally selected by
        // all correlated objects selection macros.

        secondBeforeFirstObject = kTRUE;
        for (TEveElement::List_i iter2 = this->BeginChildren(); iter2 != this->EndChildren(); ++iter2)
        {
          // If the objects are the same, it is not a pair -> continue. From now on: 2nd object BEHIND the 1st object in the list!
          if (iter == iter2)
          {
            secondBeforeFirstObject = kFALSE;
            continue;
          }
          if(!(object2 = dynamic_cast<TEveElement*>(*iter2))) continue;

          // Skip objects that have not been selected
          if (!object2->GetRnrState())  continue;

          // Same check of the macro object type as before
          if (((TObject*)object2->GetUserData())->IsA() != mProcObjectType2[i] && 
              !((TObject*)object2->GetUserData())->InheritsFrom(mProcObjectType2[i]))  continue;
          // Do not process object pairs twice
          if (secondBeforeFirstObject)
          {
            if (mProcObjectType[i] == mProcObjectType2[i]) continue;
          }
      
          // Cast to the "real" object behind
          gROOT->ProcessLineSync(Form("TEveElement *automaticEveElement = (TEveElement*)%p;", (void*)object2));
          gROOT->ProcessLineSync("TObject* automaticObject_2 = (TObject*)automaticEveElement->GetUserData();");

          // Select object by default (so it will be processed, if there are no correlated objects selection macros!)
          selectedByCorrSelMacro = kTRUE;
          for (Int_t j = 0; j < selEntries; j++){
            if (mSelType[j] == kCorrelObjectSelect){
          // Check, whether the macro can deal with both objects. If not, skip it.
          // Note: Again, via selCmds[i], the automatic objects are casted to the correct type!
          if (((TObject*)object1->GetUserData())->IsA() != mSelObjectType[j] && 
              !((TObject*)object1->GetUserData())->InheritsFrom(mSelObjectType[j]))  continue;
          if (((TObject*)object2->GetUserData())->IsA() != mSelObjectType2[j] && 
              !((TObject*)object2->GetUserData())->InheritsFrom(mSelObjectType2[j]))  continue;

              selectedByCorrSelMacro = (Bool_t)gROOT->ProcessLineSync(selCmds[j]);
              if (!selectedByCorrSelMacro)  break;
            }
          }       

          // If the pair has not been selected by the correlated objects selection macros, skip it!
          if (!selectedByCorrSelMacro) continue;

          returnedHist = (TH1*)gROOT->ProcessLineSync(procCmds[i]);
          if (returnedHist && numHistoMacros)
          {
            if (!histos[histoIndex])  histos[histoIndex] = returnedHist;
            else  
            {
              histos[histoIndex]->Add((const TH1*)returnedHist);

              delete returnedHist;
              returnedHist = 0;
            }
          }
        }
        histoIndex++;
      }
      // Single object analyse
      else if (mProcType[i] == kSingleObjectAnalyse) {
        // Create data pointers in CINT, execute the macro and get the data
        gROOT->ProcessLineSync("Double_t* results = 0;");
        gROOT->ProcessLineSync("Int_t n = 0;");
        gROOT->ProcessLineSync(procCmds[i]);
        Double_t* results = (Double_t*)gROOT->ProcessLineSync("results;");
        Int_t nResults = (Int_t)gROOT->ProcessLineSync("n;");
        
        if (results == 0) {
          Error("Apply macros", "Error reading data from macro \"%s\"", procIterator->At(i)->GetTitle());
          continue;
        }
        for (Int_t resInd = 0; resInd < nResults; resInd++){
          (*fDataTree) << Form("ObjectData%d", i) << Form("Macro%d=", i) << results[resInd] << (Char_t*)"\n";   
        }

        delete results;
        results = 0;
      }
      // Correlated objects analyse
      else if (mProcType[i] == kCorrelObjectAnalyse){
        // To get all pairs, do the second loop over all objects.
        // But: If a macro takes 2 pointers of the same type, we must take care that one gets the same pair, when we exchange the objects
        // (this is not true, if we have different types - even if they inherit from the same classes!).
        // Thus: If the latter case occurs, we ignore an object pair, if the second object is BEFORE the first object in the list.
        // Since then the pair has already been taken into account.
        // Furthermore, we have a pair of objects, if and only if both objects of the pair are selected (Rnr-state)
        // and are not equal.
        // The correlated objects process macro will be applied to all pairs that will be additionally selected by
        // all correlated objects selection macros.

        secondBeforeFirstObject = kTRUE;
        for (TEveElement::List_i iter2 = this->BeginChildren(); iter2 != this->EndChildren(); ++iter2)
        {
          // If the objects are the same, it is not a pair -> continue. From now on: 2nd object BEHIND the 1st object in the list!
          if (iter == iter2)
          {
            secondBeforeFirstObject = kFALSE;
            continue;
          }
          if(!(object2 = dynamic_cast<TEveElement*>(*iter2))) continue;
 
          // Skip objects that have not been selected
          if (!object2->GetRnrState())  continue;

          // Same check of the macro object type as before
          if (((TObject*)object2->GetUserData())->IsA() != mProcObjectType2[i] && 
              !((TObject*)object2->GetUserData())->InheritsFrom(mProcObjectType2[i]))  continue;
          // Do not process object pairs twice
          if (secondBeforeFirstObject)
          {
            if (mProcObjectType[i] == mProcObjectType2[i]) continue;
          }
    
          // Cast to the "real" object behind
          gROOT->ProcessLineSync(Form("TEveElement *automaticEveElement = (TEveElement*)%p;", (void*)object2));
          gROOT->ProcessLineSync("TObject* automaticObject_2 = (TObject*)automaticEveElement->GetUserData();");

          // Select object by default (so it will be processed, if there are no correlated objects selection macros!)
          selectedByCorrSelMacro = kTRUE;
          for (Int_t j = 0; j < selEntries; j++) {
            if (mSelType[j] == kCorrelObjectSelect) {
              // Check, whether the macro can deal with both objects. If not, skip it.
              // Note: Again, via selCmds[i], the automatic objects are casted to the correct type! 
              if (((TObject*)object1->GetUserData())->IsA() != mSelObjectType[j] && 
                  !((TObject*)object1->GetUserData())->InheritsFrom(mSelObjectType[j]))  continue;
              if (((TObject*)object2->GetUserData())->IsA() != mSelObjectType2[j] && 
                  !((TObject*)object2->GetUserData())->InheritsFrom(mSelObjectType2[j]))  continue;

              selectedByCorrSelMacro = (Bool_t)gROOT->ProcessLineSync(selCmds[j]);
              if (!selectedByCorrSelMacro)  break;
            }
          }       

          // If the pair has not been selected by the correlated objects selection macros, skip it!
          if (!selectedByCorrSelMacro) continue;
          
          // Create data pointers in CINT, execute the macro and get the data
          gROOT->ProcessLineSync("Double_t* results = 0;");
          gROOT->ProcessLineSync("Int_t n = 0;");
          gROOT->ProcessLineSync(procCmds[i]);
          Double_t* results = (Double_t*)gROOT->ProcessLineSync("results;");
          Int_t nResults = (Int_t)gROOT->ProcessLineSync("n;");
     
          if (results == 0) {
            Error("Apply macros", "Error reading data from macro \"%s\"", procIterator->At(i)->GetTitle());
            continue;
          }
          for (Int_t resInd = 0; resInd < nResults; resInd++) {
            (*fDataTree) << Form("ObjectData%d", i) << Form("Macro%d=", i) << results[resInd] << (Char_t*)"\n";   
          }

          delete results;
          results = 0;
        }
      }
    }
  }    

  for (Int_t i = 0, histoIndex = 0; i < procIterator->GetEntries() && histoIndex < numHistoMacros; i++) {
    if (mProcType[i] == kSingleObjectHisto || mProcType[i] == kCorrelObjectHisto) {
      // Might be empty (e.g. no objects have been selected)!
      if (histos[histoIndex]) {
        (*fDataTree) << Form("ObjectData%d", i) << Form("Macro%d=", i) << histos[histoIndex] << (Char_t*)"\n";
      }
      histoIndex++;
    }
  }

  if (fDataTree != 0) delete fDataTree;
  fDataTree = 0;

  if (procCmds != 0)  delete [] procCmds;
  procCmds = 0;
  if (mProcObjectType != 0) delete [] mProcObjectType;
  mProcObjectType = 0;
  if (mProcObjectType2 != 0) delete [] mProcObjectType2;
  mProcObjectType2 = 0;
  if (mProcType != 0)  delete [] mProcType;
  mProcType = 0;

  if (selCmds != 0)  delete [] selCmds;
  selCmds = 0;
  if (mSelObjectType != 0)  delete [] mSelObjectType;
  mSelObjectType = 0;
  if (mSelObjectType2 != 0)  delete [] mSelObjectType2;
  mSelObjectType2 = 0;
  if (mSelType != 0)  delete [] mSelType;
  mSelType = 0;

  if (histos != 0)  delete [] histos;
  histos = 0;

  // Clear root
  // A.B. gROOT->Reset();
  
  // If there is data, select the first data set
  if (procIterator->GetEntries() > 0) SETBIT(fHistoDataSelected, 0);

  // Now the data is stored in "/tmp/ListAnalyserMacroData_$USER.root"
  // The editor will access this file to display the data
  return kTRUE;
}

//______________________________________________________
void AliEveListAnalyser::ApplySOSelectionMacros(const TList* iterator)
{
  // Uses the iterator (for the selected selection macros) to apply the selected macros to the data.
  // The rnr-states of the objects are set according to the result of the macro calls (kTRUE, if all
  // macros return kTRUE for this object, otherwise: kFALSE).
  // "SO" stands for "single object". This means that only single object selection macros are applied.
  // Correlated objects selection macros will be used inside the call of ApplyProcessMacros(...)!

  TGeneralMacroData* macro = 0;
  AliEveListAnalyserMacroType macroType = kUnknown;
  TEveElement* object1 = 0;
  Bool_t selectedByMacro = kFALSE;

  // Clear root
  // A.B. gROOT->Reset();

  // Select all objecs at first. A object is then deselected, if at least one selection macro
  // returns kFALSE for this object.
  // Enable all objects (Note: EnableListElements(..) will call "ElementChanged", which will cause unforeseen behaviour!)
  for (TEveElement::List_i iter = this->BeginChildren(); iter != this->EndChildren(); ++iter) ((TEveElement*)(*iter))->SetRnrState(kTRUE);
  SetRnrState(kTRUE);
  
  for (Int_t i = 0; i < iterator->GetEntries(); i++){
    macro = (TGeneralMacroData*)fMacroList->GetValue(iterator->At(i)->GetTitle());

    if (!macro){
      Error("Apply selection macros", 
            "Macro list is corrupted: Macro \"%s\" is not registered!", iterator->At(i)->GetTitle());
      continue;
    }

#ifdef AliEveListAnalyser_DEBUG
    printf("AliEveListAnalyser: Applying selection macro: %s\n", macro->GetName());
#endif
    
    // Determine macro type
    macroType = macro->GetType();

    // Single object select macro
    if (macroType == kSingleObjectSelect){
      // Walk through the list of objects
      for (TEveElement::List_i iter = this->BeginChildren(); iter != this->EndChildren(); ++iter)
      {
        object1 = dynamic_cast<TEveElement*>(*iter);

        if (!object1) continue;

        // If the object has already been deselected, nothing is to do here
        if (!object1->GetRnrState()) continue;

        // Find the type of the object and relate it to the macro object type
        // Only apply macro to this object, if...
        // ... the macro takes objects of exactly this type.
        // ... the macro object type is a child of this object's type.
        // Otherwise: Continue
        if (((TObject*)object1->GetUserData())->IsA() != macro->GetObjectType() && 
            !((TObject*)object1->GetUserData())->InheritsFrom(macro->GetObjectType()))  continue;

        // Cast to the "real" object behind
        gROOT->ProcessLineSync(Form("TEveElement *automaticEveElement = (TEveElement*)%p;", (void*)object1));
        gROOT->ProcessLineSync("TObject* automaticObject_1 = (TObject*)automaticEveElement->GetUserData();");

        // GetCmd() will cast the automatic objects to the correct type for each macro!
        selectedByMacro = (Bool_t)gROOT->ProcessLineSync(macro->GetCmd());
        object1->SetRnrState(selectedByMacro && object1->GetRnrState());               
      }
    }
    // Correlated objects select macro
    else if (macroType == kCorrelObjectSelect){
      // Will be processed in ApplyProcessMacros(...)
      continue;
    } else {
      Error("Apply selection macros", 
        "Macro list corrupted: Macro \"%s/%s.C\" is not registered as a selection macro!",
        macro->GetPath(), macro->GetName());
    } 
  }

  // Clear root
  // A.B. gROOT->Reset();  
}

//______________________________________________________
TClass* AliEveListAnalyser::GetMacroObjectType(const Char_t* name, Int_t argNum) const
{
  // Returns the type of object (of argument argNum) the macro with name "name" is dealing with; 
  // e.g. if you have the signature:
  // void MyMacro(const AliTRDtrackV1* track, Double_t* &results, Int_t& nResults)
  // the call 'GetMacroObjectType("MyMacro")' yields the AliTRDtrackV1-class.
  // If the macro is not found (or there is an error), 0x0 is returned.

  if (argNum - 1 < 0) return 0x0;

  TFunction* f = gROOT->GetGlobalFunction(name, 0 , kTRUE);
  TMethodArg* m = 0;
  TList* list = 0;

  if (f)
  {
    list = f->GetListOfMethodArgs();
    
    if (!list->IsEmpty())
    {
      m = (TMethodArg*)list->At(argNum - 1);

      if (m)  return TClass::GetClass(m->GetTypeName());
    }
  }  

  // Error
  return 0x0;
}

//______________________________________________________
AliEveListAnalyser::AliEveListAnalyserMacroType AliEveListAnalyser::GetMacroType(const Char_t* name, const Char_t* objectType, 
                                                                                 const Char_t* objectType2, Bool_t UseList) const
{
  // Returns the type of the corresponding macro, that accepts pointers of the classes "objectType" (first pointer) and
  // objectType2" (second pointer) as parametres. 
  // If "UseList" is kTRUE, the type will be looked up in the internal list (very fast). But if this list
  // does not exist, you have to use kFALSE for this parameter. Then the type will be determined by the
  // prototype! NOTE: It is assumed that the macro has been compiled! If not, the return value is not
  // predictable, but normally will be kUnknown.
  // Note: AddMacro(Fast) will update the internal list and RemoveMacros respectively.

  AliEveListAnalyserMacroType type = kUnknown;

  TString* typeStr = 0;
  TString* typeStr2 = 0;
  
  if (objectType != 0) 
  {
    typeStr = new TString(objectType);
    // Remove white-spaces
    typeStr->ReplaceAll(" ", "");
  }
  else
  {
    typeStr = new TString("TObject");
  }
  if (objectType2 != 0) 
  {
    typeStr2 = new TString(objectType2);
    // Remove white-spaces
    typeStr2->ReplaceAll(" ", "");
  }
  else
  {
    typeStr2 = new TString("TObject");
  }

  TString* mangled1Str = new TString();
  TString* mangled2Str = new TString();
  TString* mangled3Str = new TString();
  TString* mangled4Str = new TString();
  TString* mangledArg1Str = new TString();
  TString* mangledArg2Str = new TString();

  // We want "const 'OBJECTTYPE'*"
  mangled1Str->Form("const %s*", typeStr->Data());

  // We want "const 'OBJECTTYPE'*, Double_t*&, Int_t&"
  mangled2Str->Form("const %s*, Double_t*&, Int_t&", typeStr->Data());

  // We want "const 'OBJECTTYPE'*, const 'OBJECTTYPE2'*"
  mangled3Str->Form("const %s*, const %s*", typeStr->Data(), typeStr2->Data());

  // We want "const 'OBJECTTYPE'*, const 'OBJECTTYPE2'*, Double_t*&, Int_t&"
  mangled4Str->Form("const %s*, const %s*, Double_t*&, Int_t&", typeStr->Data(), typeStr2->Data());

  // We want "oPconstsP'OBJECTTYPE'mUsP"
  mangledArg1Str->Form("oPconstsP%smUsP", typeStr->Data());

  // We want "cOconstsP'OBJECTTYPE2'mUsP"
  mangledArg2Str->Form("cOconstsP%smUsP", typeStr2->Data());
  
  // Re-do the check of the macro type
  if (!UseList){
    // Single object select macro or single object histo macro?
    TFunction* f = gROOT->GetGlobalFunctionWithPrototype(name, mangled1Str->Data(), kTRUE);

    if (f != 0x0)
    {
      // Some additional check (is the parameter EXACTLY of the desired type?)
      if (strstr(f->GetMangledName(), mangledArg1Str->Data()) != 0x0)
      {
        // Single object select macro?
        if (!strcmp(f->GetReturnTypeName(), "Bool_t")) 
        { 
          type = kSingleObjectSelect;     
        }
        // single object histo macro?
        else if (!strcmp(f->GetReturnTypeName(), "TH1*"))
        {
          type = kSingleObjectHisto;
        }
      }
    }
    // Single object analyse macro?
    else if ((f = gROOT->GetGlobalFunctionWithPrototype(name, mangled2Str->Data(), kTRUE)) 
             != 0x0)
    {
      if (!strcmp(f->GetReturnTypeName(), "void"))
      {
        // Some additional check (are the parameters EXACTLY of the desired type?)
        if (strstr(f->GetMangledName(), mangledArg1Str->Data()) != 0x0 &&
            strstr(f->GetMangledName(), "cODouble_tmUaNsP") != 0x0 &&
            strstr(f->GetMangledName(), "cOInt_taNsP") != 0x0)
        {
          type = kSingleObjectAnalyse;
        }
      }
    }    
    // Correlated objects select macro or correlated objects histo macro?
    else if ((f = gROOT->GetGlobalFunctionWithPrototype(name, mangled3Str->Data(), kTRUE)) 
             != 0x0)
    {
      // Some additional check (is the parameter EXACTLY of the desired type?)
      if (strstr(f->GetMangledName(), mangledArg1Str->Data()) != 0x0 &&
          strstr(f->GetMangledName(), mangledArg2Str->Data()) != 0x0)
      {
        // Correlated objects select macro?
        if (!strcmp(f->GetReturnTypeName(), "Bool_t")) 
        { 
          type = kCorrelObjectSelect;     
        }
        // Correlated objects histo macro?
        else if (!strcmp(f->GetReturnTypeName(), "TH1*"))
        {
          type = kCorrelObjectHisto;
        }
      }
    }    
    // Correlated objects analyse macro?
    else if ((f = gROOT->GetGlobalFunctionWithPrototype(name, mangled4Str->Data(), kTRUE)) 
             != 0x0)
    {
      if (!strcmp(f->GetReturnTypeName(), "void"))
      {
        // Some additional check (is the parameter EXACTLY of the desired type?)
        if (strstr(f->GetMangledName(), mangledArg1Str->Data()) != 0x0 &&
            strstr(f->GetMangledName(), mangledArg2Str->Data()) != 0x0 &&
            strstr(f->GetMangledName(), "cODouble_tmUaNsP") != 0x0 &&
            strstr(f->GetMangledName(), "cOInt_taNsP") != 0x0)
        {
          type = kCorrelObjectAnalyse;
        }
      }
    }    
  }
  // Use list to look up the macro type
  else
  {
    TGeneralMacroData* macro = 0;
    macro = (TGeneralMacroData*)fMacroList->GetValue(name);
    if (macro == 0)  return kUnknown; 
    
    type = macro->GetType();
    switch (type)
    {
      case kSingleObjectSelect:
      case kSingleObjectAnalyse:
      case kSingleObjectHisto:
      case kCorrelObjectSelect:
      case kCorrelObjectAnalyse:
      case kCorrelObjectHisto:      
        break;
    default:
      type = kUnknown;
      break;
    }
  }

  // Clean up
  if (mangled1Str != 0)
  {
    mangled1Str->Clear();
    delete mangled1Str;
    mangled1Str = 0;
  }
  if (mangled2Str != 0)
  {
    mangled2Str->Clear();
    delete mangled2Str;
    mangled2Str = 0;
  }
  if (mangled3Str != 0)
  {
    mangled3Str->Clear();
    delete mangled3Str;
    mangled3Str = 0;
  }
  if (mangled4Str != 0)
  {
    mangled4Str->Clear();
    delete mangled4Str;
    mangled4Str = 0;
  }
  if (mangledArg1Str != 0)
  {
    mangledArg1Str->Clear();
    delete mangledArg1Str;
    mangledArg1Str = 0;
  }
  if (mangledArg2Str != 0)
  {
    mangledArg2Str->Clear();
    delete mangledArg2Str;
    mangledArg2Str = 0;
  }

  typeStr->Clear();
  delete typeStr;
  typeStr = 0;

  typeStr2->Clear();
  delete typeStr2;
  typeStr2 = 0;


  return type;
}


/*
//______________________________________________________
void AliEveListAnalyser::RemovePrimSelectedObjects()
{
  // Removes the (primarily) selected objects in the viewer from the list (objects that are already in the list are ignored).
  // Hold the CTRL-key for multiple selection.

  TEveSelection* eveSel = gEve->GetSelection();

  if (!eveSel)
  {
    Error("AliEveListAnalyser::RemovePrimSelectedObjects", "Failed to get the selection!\n");
    return;
  }
  
  TEveElement* elem = 0x0;
  Bool_t changedSomething = kFALSE;

  for (TEveElement::List_i iter = eveSel->BeginChildren(); iter != eveSel->EndChildren(); ++iter)
  {
    if(!(elem = dynamic_cast<TEveElement*>(*iter))) continue;

    // Check, if element is already there. If so, remove it!
    if (this->HasChild(elem) && elem != this)
    {
      this->RemoveElement(elem);
      this->SetTitle(Form("Objects %d", this->NumChildren()));
      changedSomething = kTRUE;
    }
  }

  if (changedSomething) gEve->Redraw3D();
}
*/

//______________________________________________________
void AliEveListAnalyser::RemoveSelectedMacros(const TList* iterator) 
{
  // Uses the iterator (for the selected macros) to remove the selected macros from 
  // the corresponding list.
   
  TObject* key = 0;
  TPair*   entry = 0;
  for (Int_t i = 0; i < iterator->GetEntries(); i++)
  {
    entry = (TPair*)fMacroList->FindObject(iterator->At(i)->GetTitle());

    if (entry == 0)
    {
      Error("AliEveListAnalyser::RemoveSelectedMacros", "Macro \"%s\" not found in list!",
                                                                     iterator->At(i)->GetTitle());
      continue;
    }
    key = entry->Key();

    if (key == 0)   
    {
      Error("AliEveListAnalyser::RemoveSelectedMacros", "Key for macro \"%s\" not found in list!",
                                                                     iterator->At(i)->GetTitle());
      continue;
    }

    // Key and value will be deleted, too, since fMacroList is the owner of them
    Bool_t rem = fMacroList->DeleteEntry(key);

    if (rem)
    {
#ifdef AliEveListAnalyser_DEBUG
    printf("AliEveListAnalyser::RemoveSelectedMacros(): Removed macro: %s\n", iterator->At(i)->GetTitle());
#endif
    }
    else
    {
      Error("AliEveListAnalyser::RemoveSelectedMacros", "Macro \"%s\" could not be removed from the list!",
                                                                     iterator->At(i)->GetTitle());
    }
  }
}

//______________________________________________________
void AliEveListAnalyser::ResetObjectList()
{
  // Removes all objects from the list.

  RemoveElements();
  this->SetTitle(Form("Objects %d", this->NumChildren()));
}

//______________________________________________________
Bool_t AliEveListAnalyser::StartAddingObjects()
{ 
  // Starts adding objects for the analysis. Returns kTRUE on success.

  if (fConnected == kFALSE)
  {
    fConnected = TQObject::Connect("TEvePointSet", "PointSelected(Int_t)", "AliEveListAnalyser", this, "AddSecSelectedSingleObjectToList(Int_t)");
    if (fConnected)  fConnected = TQObject::Connect(gEve->GetSelection(), "SelectionAdded(TEveElement*)", "AliEveListAnalyser", this, "AddPrimSelectedObject(TEveElement*)");

    if (fConnected) return kTRUE;
    
    Error("AliEveListAnalyser::StartAddingObjects", "Connection failed!");
    
    // Connection of 2nd signal failed, but first connection succeeded -> Disconnect 1st signal.
    TQObject::Disconnect("TEvePointSet", "PointSelected(Int_t)", this, "AddObjectToList(Int_t)");
  }

  return kFALSE;
}

//______________________________________________________
Bool_t AliEveListAnalyser::StopAddingObjects()
{
  // Stops adding objects for the analysis. Returns kTRUE on success.

  if (fConnected)
  {
    Bool_t dis1 = kFALSE, dis2 = kFALSE;
    dis1 = TQObject::Disconnect("TEvePointSet", "PointSelected(Int_t)", this, "AddSecSelectedSingleObjectToList(Int_t)");
    dis2 = TQObject::Disconnect(gEve->GetSelection(), "SelectionAdded(TEveElement*)", this, "AddPrimSelectedObject(TEveElement*)");

    if (dis1 || dis2) fConnected = kFALSE;
    if (dis1 && dis2) return kTRUE;
    else
    {
      Error("AliEveListAnalyser::StopAddingObjects", "Disconnection failed!");

      return kFALSE;
    }
  }

  return kTRUE;
}
 AliEveListAnalyser.cxx:1
 AliEveListAnalyser.cxx:2
 AliEveListAnalyser.cxx:3
 AliEveListAnalyser.cxx:4
 AliEveListAnalyser.cxx:5
 AliEveListAnalyser.cxx:6
 AliEveListAnalyser.cxx:7
 AliEveListAnalyser.cxx:8
 AliEveListAnalyser.cxx:9
 AliEveListAnalyser.cxx:10
 AliEveListAnalyser.cxx:11
 AliEveListAnalyser.cxx:12
 AliEveListAnalyser.cxx:13
 AliEveListAnalyser.cxx:14
 AliEveListAnalyser.cxx:15
 AliEveListAnalyser.cxx:16
 AliEveListAnalyser.cxx:17
 AliEveListAnalyser.cxx:18
 AliEveListAnalyser.cxx:19
 AliEveListAnalyser.cxx:20
 AliEveListAnalyser.cxx:21
 AliEveListAnalyser.cxx:22
 AliEveListAnalyser.cxx:23
 AliEveListAnalyser.cxx:24
 AliEveListAnalyser.cxx:25
 AliEveListAnalyser.cxx:26
 AliEveListAnalyser.cxx:27
 AliEveListAnalyser.cxx:28
 AliEveListAnalyser.cxx:29
 AliEveListAnalyser.cxx:30
 AliEveListAnalyser.cxx:31
 AliEveListAnalyser.cxx:32
 AliEveListAnalyser.cxx:33
 AliEveListAnalyser.cxx:34
 AliEveListAnalyser.cxx:35
 AliEveListAnalyser.cxx:36
 AliEveListAnalyser.cxx:37
 AliEveListAnalyser.cxx:38
 AliEveListAnalyser.cxx:39
 AliEveListAnalyser.cxx:40
 AliEveListAnalyser.cxx:41
 AliEveListAnalyser.cxx:42
 AliEveListAnalyser.cxx:43
 AliEveListAnalyser.cxx:44
 AliEveListAnalyser.cxx:45
 AliEveListAnalyser.cxx:46
 AliEveListAnalyser.cxx:47
 AliEveListAnalyser.cxx:48
 AliEveListAnalyser.cxx:49
 AliEveListAnalyser.cxx:50
 AliEveListAnalyser.cxx:51
 AliEveListAnalyser.cxx:52
 AliEveListAnalyser.cxx:53
 AliEveListAnalyser.cxx:54
 AliEveListAnalyser.cxx:55
 AliEveListAnalyser.cxx:56
 AliEveListAnalyser.cxx:57
 AliEveListAnalyser.cxx:58
 AliEveListAnalyser.cxx:59
 AliEveListAnalyser.cxx:60
 AliEveListAnalyser.cxx:61
 AliEveListAnalyser.cxx:62
 AliEveListAnalyser.cxx:63
 AliEveListAnalyser.cxx:64
 AliEveListAnalyser.cxx:65
 AliEveListAnalyser.cxx:66
 AliEveListAnalyser.cxx:67
 AliEveListAnalyser.cxx:68
 AliEveListAnalyser.cxx:69
 AliEveListAnalyser.cxx:70
 AliEveListAnalyser.cxx:71
 AliEveListAnalyser.cxx:72
 AliEveListAnalyser.cxx:73
 AliEveListAnalyser.cxx:74
 AliEveListAnalyser.cxx:75
 AliEveListAnalyser.cxx:76
 AliEveListAnalyser.cxx:77
 AliEveListAnalyser.cxx:78
 AliEveListAnalyser.cxx:79
 AliEveListAnalyser.cxx:80
 AliEveListAnalyser.cxx:81
 AliEveListAnalyser.cxx:82
 AliEveListAnalyser.cxx:83
 AliEveListAnalyser.cxx:84
 AliEveListAnalyser.cxx:85
 AliEveListAnalyser.cxx:86
 AliEveListAnalyser.cxx:87
 AliEveListAnalyser.cxx:88
 AliEveListAnalyser.cxx:89
 AliEveListAnalyser.cxx:90
 AliEveListAnalyser.cxx:91
 AliEveListAnalyser.cxx:92
 AliEveListAnalyser.cxx:93
 AliEveListAnalyser.cxx:94
 AliEveListAnalyser.cxx:95
 AliEveListAnalyser.cxx:96
 AliEveListAnalyser.cxx:97
 AliEveListAnalyser.cxx:98
 AliEveListAnalyser.cxx:99
 AliEveListAnalyser.cxx:100
 AliEveListAnalyser.cxx:101
 AliEveListAnalyser.cxx:102
 AliEveListAnalyser.cxx:103
 AliEveListAnalyser.cxx:104
 AliEveListAnalyser.cxx:105
 AliEveListAnalyser.cxx:106
 AliEveListAnalyser.cxx:107
 AliEveListAnalyser.cxx:108
 AliEveListAnalyser.cxx:109
 AliEveListAnalyser.cxx:110
 AliEveListAnalyser.cxx:111
 AliEveListAnalyser.cxx:112
 AliEveListAnalyser.cxx:113
 AliEveListAnalyser.cxx:114
 AliEveListAnalyser.cxx:115
 AliEveListAnalyser.cxx:116
 AliEveListAnalyser.cxx:117
 AliEveListAnalyser.cxx:118
 AliEveListAnalyser.cxx:119
 AliEveListAnalyser.cxx:120
 AliEveListAnalyser.cxx:121
 AliEveListAnalyser.cxx:122
 AliEveListAnalyser.cxx:123
 AliEveListAnalyser.cxx:124
 AliEveListAnalyser.cxx:125
 AliEveListAnalyser.cxx:126
 AliEveListAnalyser.cxx:127
 AliEveListAnalyser.cxx:128
 AliEveListAnalyser.cxx:129
 AliEveListAnalyser.cxx:130
 AliEveListAnalyser.cxx:131
 AliEveListAnalyser.cxx:132
 AliEveListAnalyser.cxx:133
 AliEveListAnalyser.cxx:134
 AliEveListAnalyser.cxx:135
 AliEveListAnalyser.cxx:136
 AliEveListAnalyser.cxx:137
 AliEveListAnalyser.cxx:138
 AliEveListAnalyser.cxx:139
 AliEveListAnalyser.cxx:140
 AliEveListAnalyser.cxx:141
 AliEveListAnalyser.cxx:142
 AliEveListAnalyser.cxx:143
 AliEveListAnalyser.cxx:144
 AliEveListAnalyser.cxx:145
 AliEveListAnalyser.cxx:146
 AliEveListAnalyser.cxx:147
 AliEveListAnalyser.cxx:148
 AliEveListAnalyser.cxx:149
 AliEveListAnalyser.cxx:150
 AliEveListAnalyser.cxx:151
 AliEveListAnalyser.cxx:152
 AliEveListAnalyser.cxx:153
 AliEveListAnalyser.cxx:154
 AliEveListAnalyser.cxx:155
 AliEveListAnalyser.cxx:156
 AliEveListAnalyser.cxx:157
 AliEveListAnalyser.cxx:158
 AliEveListAnalyser.cxx:159
 AliEveListAnalyser.cxx:160
 AliEveListAnalyser.cxx:161
 AliEveListAnalyser.cxx:162
 AliEveListAnalyser.cxx:163
 AliEveListAnalyser.cxx:164
 AliEveListAnalyser.cxx:165
 AliEveListAnalyser.cxx:166
 AliEveListAnalyser.cxx:167
 AliEveListAnalyser.cxx:168
 AliEveListAnalyser.cxx:169
 AliEveListAnalyser.cxx:170
 AliEveListAnalyser.cxx:171
 AliEveListAnalyser.cxx:172
 AliEveListAnalyser.cxx:173
 AliEveListAnalyser.cxx:174
 AliEveListAnalyser.cxx:175
 AliEveListAnalyser.cxx:176
 AliEveListAnalyser.cxx:177
 AliEveListAnalyser.cxx:178
 AliEveListAnalyser.cxx:179
 AliEveListAnalyser.cxx:180
 AliEveListAnalyser.cxx:181
 AliEveListAnalyser.cxx:182
 AliEveListAnalyser.cxx:183
 AliEveListAnalyser.cxx:184
 AliEveListAnalyser.cxx:185
 AliEveListAnalyser.cxx:186
 AliEveListAnalyser.cxx:187
 AliEveListAnalyser.cxx:188
 AliEveListAnalyser.cxx:189
 AliEveListAnalyser.cxx:190
 AliEveListAnalyser.cxx:191
 AliEveListAnalyser.cxx:192
 AliEveListAnalyser.cxx:193
 AliEveListAnalyser.cxx:194
 AliEveListAnalyser.cxx:195
 AliEveListAnalyser.cxx:196
 AliEveListAnalyser.cxx:197
 AliEveListAnalyser.cxx:198
 AliEveListAnalyser.cxx:199
 AliEveListAnalyser.cxx:200
 AliEveListAnalyser.cxx:201
 AliEveListAnalyser.cxx:202
 AliEveListAnalyser.cxx:203
 AliEveListAnalyser.cxx:204
 AliEveListAnalyser.cxx:205
 AliEveListAnalyser.cxx:206
 AliEveListAnalyser.cxx:207
 AliEveListAnalyser.cxx:208
 AliEveListAnalyser.cxx:209
 AliEveListAnalyser.cxx:210
 AliEveListAnalyser.cxx:211
 AliEveListAnalyser.cxx:212
 AliEveListAnalyser.cxx:213
 AliEveListAnalyser.cxx:214
 AliEveListAnalyser.cxx:215
 AliEveListAnalyser.cxx:216
 AliEveListAnalyser.cxx:217
 AliEveListAnalyser.cxx:218
 AliEveListAnalyser.cxx:219
 AliEveListAnalyser.cxx:220
 AliEveListAnalyser.cxx:221
 AliEveListAnalyser.cxx:222
 AliEveListAnalyser.cxx:223
 AliEveListAnalyser.cxx:224
 AliEveListAnalyser.cxx:225
 AliEveListAnalyser.cxx:226
 AliEveListAnalyser.cxx:227
 AliEveListAnalyser.cxx:228
 AliEveListAnalyser.cxx:229
 AliEveListAnalyser.cxx:230
 AliEveListAnalyser.cxx:231
 AliEveListAnalyser.cxx:232
 AliEveListAnalyser.cxx:233
 AliEveListAnalyser.cxx:234
 AliEveListAnalyser.cxx:235
 AliEveListAnalyser.cxx:236
 AliEveListAnalyser.cxx:237
 AliEveListAnalyser.cxx:238
 AliEveListAnalyser.cxx:239
 AliEveListAnalyser.cxx:240
 AliEveListAnalyser.cxx:241
 AliEveListAnalyser.cxx:242
 AliEveListAnalyser.cxx:243
 AliEveListAnalyser.cxx:244
 AliEveListAnalyser.cxx:245
 AliEveListAnalyser.cxx:246
 AliEveListAnalyser.cxx:247
 AliEveListAnalyser.cxx:248
 AliEveListAnalyser.cxx:249
 AliEveListAnalyser.cxx:250
 AliEveListAnalyser.cxx:251
 AliEveListAnalyser.cxx:252
 AliEveListAnalyser.cxx:253
 AliEveListAnalyser.cxx:254
 AliEveListAnalyser.cxx:255
 AliEveListAnalyser.cxx:256
 AliEveListAnalyser.cxx:257
 AliEveListAnalyser.cxx:258
 AliEveListAnalyser.cxx:259
 AliEveListAnalyser.cxx:260
 AliEveListAnalyser.cxx:261
 AliEveListAnalyser.cxx:262
 AliEveListAnalyser.cxx:263
 AliEveListAnalyser.cxx:264
 AliEveListAnalyser.cxx:265
 AliEveListAnalyser.cxx:266
 AliEveListAnalyser.cxx:267
 AliEveListAnalyser.cxx:268
 AliEveListAnalyser.cxx:269
 AliEveListAnalyser.cxx:270
 AliEveListAnalyser.cxx:271
 AliEveListAnalyser.cxx:272
 AliEveListAnalyser.cxx:273
 AliEveListAnalyser.cxx:274
 AliEveListAnalyser.cxx:275
 AliEveListAnalyser.cxx:276
 AliEveListAnalyser.cxx:277
 AliEveListAnalyser.cxx:278
 AliEveListAnalyser.cxx:279
 AliEveListAnalyser.cxx:280
 AliEveListAnalyser.cxx:281
 AliEveListAnalyser.cxx:282
 AliEveListAnalyser.cxx:283
 AliEveListAnalyser.cxx:284
 AliEveListAnalyser.cxx:285
 AliEveListAnalyser.cxx:286
 AliEveListAnalyser.cxx:287
 AliEveListAnalyser.cxx:288
 AliEveListAnalyser.cxx:289
 AliEveListAnalyser.cxx:290
 AliEveListAnalyser.cxx:291
 AliEveListAnalyser.cxx:292
 AliEveListAnalyser.cxx:293
 AliEveListAnalyser.cxx:294
 AliEveListAnalyser.cxx:295
 AliEveListAnalyser.cxx:296
 AliEveListAnalyser.cxx:297
 AliEveListAnalyser.cxx:298
 AliEveListAnalyser.cxx:299
 AliEveListAnalyser.cxx:300
 AliEveListAnalyser.cxx:301
 AliEveListAnalyser.cxx:302
 AliEveListAnalyser.cxx:303
 AliEveListAnalyser.cxx:304
 AliEveListAnalyser.cxx:305
 AliEveListAnalyser.cxx:306
 AliEveListAnalyser.cxx:307
 AliEveListAnalyser.cxx:308
 AliEveListAnalyser.cxx:309
 AliEveListAnalyser.cxx:310
 AliEveListAnalyser.cxx:311
 AliEveListAnalyser.cxx:312
 AliEveListAnalyser.cxx:313
 AliEveListAnalyser.cxx:314
 AliEveListAnalyser.cxx:315
 AliEveListAnalyser.cxx:316
 AliEveListAnalyser.cxx:317
 AliEveListAnalyser.cxx:318
 AliEveListAnalyser.cxx:319
 AliEveListAnalyser.cxx:320
 AliEveListAnalyser.cxx:321
 AliEveListAnalyser.cxx:322
 AliEveListAnalyser.cxx:323
 AliEveListAnalyser.cxx:324
 AliEveListAnalyser.cxx:325
 AliEveListAnalyser.cxx:326
 AliEveListAnalyser.cxx:327
 AliEveListAnalyser.cxx:328
 AliEveListAnalyser.cxx:329
 AliEveListAnalyser.cxx:330
 AliEveListAnalyser.cxx:331
 AliEveListAnalyser.cxx:332
 AliEveListAnalyser.cxx:333
 AliEveListAnalyser.cxx:334
 AliEveListAnalyser.cxx:335
 AliEveListAnalyser.cxx:336
 AliEveListAnalyser.cxx:337
 AliEveListAnalyser.cxx:338
 AliEveListAnalyser.cxx:339
 AliEveListAnalyser.cxx:340
 AliEveListAnalyser.cxx:341
 AliEveListAnalyser.cxx:342
 AliEveListAnalyser.cxx:343
 AliEveListAnalyser.cxx:344
 AliEveListAnalyser.cxx:345
 AliEveListAnalyser.cxx:346
 AliEveListAnalyser.cxx:347
 AliEveListAnalyser.cxx:348
 AliEveListAnalyser.cxx:349
 AliEveListAnalyser.cxx:350
 AliEveListAnalyser.cxx:351
 AliEveListAnalyser.cxx:352
 AliEveListAnalyser.cxx:353
 AliEveListAnalyser.cxx:354
 AliEveListAnalyser.cxx:355
 AliEveListAnalyser.cxx:356
 AliEveListAnalyser.cxx:357
 AliEveListAnalyser.cxx:358
 AliEveListAnalyser.cxx:359
 AliEveListAnalyser.cxx:360
 AliEveListAnalyser.cxx:361
 AliEveListAnalyser.cxx:362
 AliEveListAnalyser.cxx:363
 AliEveListAnalyser.cxx:364
 AliEveListAnalyser.cxx:365
 AliEveListAnalyser.cxx:366
 AliEveListAnalyser.cxx:367
 AliEveListAnalyser.cxx:368
 AliEveListAnalyser.cxx:369
 AliEveListAnalyser.cxx:370
 AliEveListAnalyser.cxx:371
 AliEveListAnalyser.cxx:372
 AliEveListAnalyser.cxx:373
 AliEveListAnalyser.cxx:374
 AliEveListAnalyser.cxx:375
 AliEveListAnalyser.cxx:376
 AliEveListAnalyser.cxx:377
 AliEveListAnalyser.cxx:378
 AliEveListAnalyser.cxx:379
 AliEveListAnalyser.cxx:380
 AliEveListAnalyser.cxx:381
 AliEveListAnalyser.cxx:382
 AliEveListAnalyser.cxx:383
 AliEveListAnalyser.cxx:384
 AliEveListAnalyser.cxx:385
 AliEveListAnalyser.cxx:386
 AliEveListAnalyser.cxx:387
 AliEveListAnalyser.cxx:388
 AliEveListAnalyser.cxx:389
 AliEveListAnalyser.cxx:390
 AliEveListAnalyser.cxx:391
 AliEveListAnalyser.cxx:392
 AliEveListAnalyser.cxx:393
 AliEveListAnalyser.cxx:394
 AliEveListAnalyser.cxx:395
 AliEveListAnalyser.cxx:396
 AliEveListAnalyser.cxx:397
 AliEveListAnalyser.cxx:398
 AliEveListAnalyser.cxx:399
 AliEveListAnalyser.cxx:400
 AliEveListAnalyser.cxx:401
 AliEveListAnalyser.cxx:402
 AliEveListAnalyser.cxx:403
 AliEveListAnalyser.cxx:404
 AliEveListAnalyser.cxx:405
 AliEveListAnalyser.cxx:406
 AliEveListAnalyser.cxx:407
 AliEveListAnalyser.cxx:408
 AliEveListAnalyser.cxx:409
 AliEveListAnalyser.cxx:410
 AliEveListAnalyser.cxx:411
 AliEveListAnalyser.cxx:412
 AliEveListAnalyser.cxx:413
 AliEveListAnalyser.cxx:414
 AliEveListAnalyser.cxx:415
 AliEveListAnalyser.cxx:416
 AliEveListAnalyser.cxx:417
 AliEveListAnalyser.cxx:418
 AliEveListAnalyser.cxx:419
 AliEveListAnalyser.cxx:420
 AliEveListAnalyser.cxx:421
 AliEveListAnalyser.cxx:422
 AliEveListAnalyser.cxx:423
 AliEveListAnalyser.cxx:424
 AliEveListAnalyser.cxx:425
 AliEveListAnalyser.cxx:426
 AliEveListAnalyser.cxx:427
 AliEveListAnalyser.cxx:428
 AliEveListAnalyser.cxx:429
 AliEveListAnalyser.cxx:430
 AliEveListAnalyser.cxx:431
 AliEveListAnalyser.cxx:432
 AliEveListAnalyser.cxx:433
 AliEveListAnalyser.cxx:434
 AliEveListAnalyser.cxx:435
 AliEveListAnalyser.cxx:436
 AliEveListAnalyser.cxx:437
 AliEveListAnalyser.cxx:438
 AliEveListAnalyser.cxx:439
 AliEveListAnalyser.cxx:440
 AliEveListAnalyser.cxx:441
 AliEveListAnalyser.cxx:442
 AliEveListAnalyser.cxx:443
 AliEveListAnalyser.cxx:444
 AliEveListAnalyser.cxx:445
 AliEveListAnalyser.cxx:446
 AliEveListAnalyser.cxx:447
 AliEveListAnalyser.cxx:448
 AliEveListAnalyser.cxx:449
 AliEveListAnalyser.cxx:450
 AliEveListAnalyser.cxx:451
 AliEveListAnalyser.cxx:452
 AliEveListAnalyser.cxx:453
 AliEveListAnalyser.cxx:454
 AliEveListAnalyser.cxx:455
 AliEveListAnalyser.cxx:456
 AliEveListAnalyser.cxx:457
 AliEveListAnalyser.cxx:458
 AliEveListAnalyser.cxx:459
 AliEveListAnalyser.cxx:460
 AliEveListAnalyser.cxx:461
 AliEveListAnalyser.cxx:462
 AliEveListAnalyser.cxx:463
 AliEveListAnalyser.cxx:464
 AliEveListAnalyser.cxx:465
 AliEveListAnalyser.cxx:466
 AliEveListAnalyser.cxx:467
 AliEveListAnalyser.cxx:468
 AliEveListAnalyser.cxx:469
 AliEveListAnalyser.cxx:470
 AliEveListAnalyser.cxx:471
 AliEveListAnalyser.cxx:472
 AliEveListAnalyser.cxx:473
 AliEveListAnalyser.cxx:474
 AliEveListAnalyser.cxx:475
 AliEveListAnalyser.cxx:476
 AliEveListAnalyser.cxx:477
 AliEveListAnalyser.cxx:478
 AliEveListAnalyser.cxx:479
 AliEveListAnalyser.cxx:480
 AliEveListAnalyser.cxx:481
 AliEveListAnalyser.cxx:482
 AliEveListAnalyser.cxx:483
 AliEveListAnalyser.cxx:484
 AliEveListAnalyser.cxx:485
 AliEveListAnalyser.cxx:486
 AliEveListAnalyser.cxx:487
 AliEveListAnalyser.cxx:488
 AliEveListAnalyser.cxx:489
 AliEveListAnalyser.cxx:490
 AliEveListAnalyser.cxx:491
 AliEveListAnalyser.cxx:492
 AliEveListAnalyser.cxx:493
 AliEveListAnalyser.cxx:494
 AliEveListAnalyser.cxx:495
 AliEveListAnalyser.cxx:496
 AliEveListAnalyser.cxx:497
 AliEveListAnalyser.cxx:498
 AliEveListAnalyser.cxx:499
 AliEveListAnalyser.cxx:500
 AliEveListAnalyser.cxx:501
 AliEveListAnalyser.cxx:502
 AliEveListAnalyser.cxx:503
 AliEveListAnalyser.cxx:504
 AliEveListAnalyser.cxx:505
 AliEveListAnalyser.cxx:506
 AliEveListAnalyser.cxx:507
 AliEveListAnalyser.cxx:508
 AliEveListAnalyser.cxx:509
 AliEveListAnalyser.cxx:510
 AliEveListAnalyser.cxx:511
 AliEveListAnalyser.cxx:512
 AliEveListAnalyser.cxx:513
 AliEveListAnalyser.cxx:514
 AliEveListAnalyser.cxx:515
 AliEveListAnalyser.cxx:516
 AliEveListAnalyser.cxx:517
 AliEveListAnalyser.cxx:518
 AliEveListAnalyser.cxx:519
 AliEveListAnalyser.cxx:520
 AliEveListAnalyser.cxx:521
 AliEveListAnalyser.cxx:522
 AliEveListAnalyser.cxx:523
 AliEveListAnalyser.cxx:524
 AliEveListAnalyser.cxx:525
 AliEveListAnalyser.cxx:526
 AliEveListAnalyser.cxx:527
 AliEveListAnalyser.cxx:528
 AliEveListAnalyser.cxx:529
 AliEveListAnalyser.cxx:530
 AliEveListAnalyser.cxx:531
 AliEveListAnalyser.cxx:532
 AliEveListAnalyser.cxx:533
 AliEveListAnalyser.cxx:534
 AliEveListAnalyser.cxx:535
 AliEveListAnalyser.cxx:536
 AliEveListAnalyser.cxx:537
 AliEveListAnalyser.cxx:538
 AliEveListAnalyser.cxx:539
 AliEveListAnalyser.cxx:540
 AliEveListAnalyser.cxx:541
 AliEveListAnalyser.cxx:542
 AliEveListAnalyser.cxx:543
 AliEveListAnalyser.cxx:544
 AliEveListAnalyser.cxx:545
 AliEveListAnalyser.cxx:546
 AliEveListAnalyser.cxx:547
 AliEveListAnalyser.cxx:548
 AliEveListAnalyser.cxx:549
 AliEveListAnalyser.cxx:550
 AliEveListAnalyser.cxx:551
 AliEveListAnalyser.cxx:552
 AliEveListAnalyser.cxx:553
 AliEveListAnalyser.cxx:554
 AliEveListAnalyser.cxx:555
 AliEveListAnalyser.cxx:556
 AliEveListAnalyser.cxx:557
 AliEveListAnalyser.cxx:558
 AliEveListAnalyser.cxx:559
 AliEveListAnalyser.cxx:560
 AliEveListAnalyser.cxx:561
 AliEveListAnalyser.cxx:562
 AliEveListAnalyser.cxx:563
 AliEveListAnalyser.cxx:564
 AliEveListAnalyser.cxx:565
 AliEveListAnalyser.cxx:566
 AliEveListAnalyser.cxx:567
 AliEveListAnalyser.cxx:568
 AliEveListAnalyser.cxx:569
 AliEveListAnalyser.cxx:570
 AliEveListAnalyser.cxx:571
 AliEveListAnalyser.cxx:572
 AliEveListAnalyser.cxx:573
 AliEveListAnalyser.cxx:574
 AliEveListAnalyser.cxx:575
 AliEveListAnalyser.cxx:576
 AliEveListAnalyser.cxx:577
 AliEveListAnalyser.cxx:578
 AliEveListAnalyser.cxx:579
 AliEveListAnalyser.cxx:580
 AliEveListAnalyser.cxx:581
 AliEveListAnalyser.cxx:582
 AliEveListAnalyser.cxx:583
 AliEveListAnalyser.cxx:584
 AliEveListAnalyser.cxx:585
 AliEveListAnalyser.cxx:586
 AliEveListAnalyser.cxx:587
 AliEveListAnalyser.cxx:588
 AliEveListAnalyser.cxx:589
 AliEveListAnalyser.cxx:590
 AliEveListAnalyser.cxx:591
 AliEveListAnalyser.cxx:592
 AliEveListAnalyser.cxx:593
 AliEveListAnalyser.cxx:594
 AliEveListAnalyser.cxx:595
 AliEveListAnalyser.cxx:596
 AliEveListAnalyser.cxx:597
 AliEveListAnalyser.cxx:598
 AliEveListAnalyser.cxx:599
 AliEveListAnalyser.cxx:600
 AliEveListAnalyser.cxx:601
 AliEveListAnalyser.cxx:602
 AliEveListAnalyser.cxx:603
 AliEveListAnalyser.cxx:604
 AliEveListAnalyser.cxx:605
 AliEveListAnalyser.cxx:606
 AliEveListAnalyser.cxx:607
 AliEveListAnalyser.cxx:608
 AliEveListAnalyser.cxx:609
 AliEveListAnalyser.cxx:610
 AliEveListAnalyser.cxx:611
 AliEveListAnalyser.cxx:612
 AliEveListAnalyser.cxx:613
 AliEveListAnalyser.cxx:614
 AliEveListAnalyser.cxx:615
 AliEveListAnalyser.cxx:616
 AliEveListAnalyser.cxx:617
 AliEveListAnalyser.cxx:618
 AliEveListAnalyser.cxx:619
 AliEveListAnalyser.cxx:620
 AliEveListAnalyser.cxx:621
 AliEveListAnalyser.cxx:622
 AliEveListAnalyser.cxx:623
 AliEveListAnalyser.cxx:624
 AliEveListAnalyser.cxx:625
 AliEveListAnalyser.cxx:626
 AliEveListAnalyser.cxx:627
 AliEveListAnalyser.cxx:628
 AliEveListAnalyser.cxx:629
 AliEveListAnalyser.cxx:630
 AliEveListAnalyser.cxx:631
 AliEveListAnalyser.cxx:632
 AliEveListAnalyser.cxx:633
 AliEveListAnalyser.cxx:634
 AliEveListAnalyser.cxx:635
 AliEveListAnalyser.cxx:636
 AliEveListAnalyser.cxx:637
 AliEveListAnalyser.cxx:638
 AliEveListAnalyser.cxx:639
 AliEveListAnalyser.cxx:640
 AliEveListAnalyser.cxx:641
 AliEveListAnalyser.cxx:642
 AliEveListAnalyser.cxx:643
 AliEveListAnalyser.cxx:644
 AliEveListAnalyser.cxx:645
 AliEveListAnalyser.cxx:646
 AliEveListAnalyser.cxx:647
 AliEveListAnalyser.cxx:648
 AliEveListAnalyser.cxx:649
 AliEveListAnalyser.cxx:650
 AliEveListAnalyser.cxx:651
 AliEveListAnalyser.cxx:652
 AliEveListAnalyser.cxx:653
 AliEveListAnalyser.cxx:654
 AliEveListAnalyser.cxx:655
 AliEveListAnalyser.cxx:656
 AliEveListAnalyser.cxx:657
 AliEveListAnalyser.cxx:658
 AliEveListAnalyser.cxx:659
 AliEveListAnalyser.cxx:660
 AliEveListAnalyser.cxx:661
 AliEveListAnalyser.cxx:662
 AliEveListAnalyser.cxx:663
 AliEveListAnalyser.cxx:664
 AliEveListAnalyser.cxx:665
 AliEveListAnalyser.cxx:666
 AliEveListAnalyser.cxx:667
 AliEveListAnalyser.cxx:668
 AliEveListAnalyser.cxx:669
 AliEveListAnalyser.cxx:670
 AliEveListAnalyser.cxx:671
 AliEveListAnalyser.cxx:672
 AliEveListAnalyser.cxx:673
 AliEveListAnalyser.cxx:674
 AliEveListAnalyser.cxx:675
 AliEveListAnalyser.cxx:676
 AliEveListAnalyser.cxx:677
 AliEveListAnalyser.cxx:678
 AliEveListAnalyser.cxx:679
 AliEveListAnalyser.cxx:680
 AliEveListAnalyser.cxx:681
 AliEveListAnalyser.cxx:682
 AliEveListAnalyser.cxx:683
 AliEveListAnalyser.cxx:684
 AliEveListAnalyser.cxx:685
 AliEveListAnalyser.cxx:686
 AliEveListAnalyser.cxx:687
 AliEveListAnalyser.cxx:688
 AliEveListAnalyser.cxx:689
 AliEveListAnalyser.cxx:690
 AliEveListAnalyser.cxx:691
 AliEveListAnalyser.cxx:692
 AliEveListAnalyser.cxx:693
 AliEveListAnalyser.cxx:694
 AliEveListAnalyser.cxx:695
 AliEveListAnalyser.cxx:696
 AliEveListAnalyser.cxx:697
 AliEveListAnalyser.cxx:698
 AliEveListAnalyser.cxx:699
 AliEveListAnalyser.cxx:700
 AliEveListAnalyser.cxx:701
 AliEveListAnalyser.cxx:702
 AliEveListAnalyser.cxx:703
 AliEveListAnalyser.cxx:704
 AliEveListAnalyser.cxx:705
 AliEveListAnalyser.cxx:706
 AliEveListAnalyser.cxx:707
 AliEveListAnalyser.cxx:708
 AliEveListAnalyser.cxx:709
 AliEveListAnalyser.cxx:710
 AliEveListAnalyser.cxx:711
 AliEveListAnalyser.cxx:712
 AliEveListAnalyser.cxx:713
 AliEveListAnalyser.cxx:714
 AliEveListAnalyser.cxx:715
 AliEveListAnalyser.cxx:716
 AliEveListAnalyser.cxx:717
 AliEveListAnalyser.cxx:718
 AliEveListAnalyser.cxx:719
 AliEveListAnalyser.cxx:720
 AliEveListAnalyser.cxx:721
 AliEveListAnalyser.cxx:722
 AliEveListAnalyser.cxx:723
 AliEveListAnalyser.cxx:724
 AliEveListAnalyser.cxx:725
 AliEveListAnalyser.cxx:726
 AliEveListAnalyser.cxx:727
 AliEveListAnalyser.cxx:728
 AliEveListAnalyser.cxx:729
 AliEveListAnalyser.cxx:730
 AliEveListAnalyser.cxx:731
 AliEveListAnalyser.cxx:732
 AliEveListAnalyser.cxx:733
 AliEveListAnalyser.cxx:734
 AliEveListAnalyser.cxx:735
 AliEveListAnalyser.cxx:736
 AliEveListAnalyser.cxx:737
 AliEveListAnalyser.cxx:738
 AliEveListAnalyser.cxx:739
 AliEveListAnalyser.cxx:740
 AliEveListAnalyser.cxx:741
 AliEveListAnalyser.cxx:742
 AliEveListAnalyser.cxx:743
 AliEveListAnalyser.cxx:744
 AliEveListAnalyser.cxx:745
 AliEveListAnalyser.cxx:746
 AliEveListAnalyser.cxx:747
 AliEveListAnalyser.cxx:748
 AliEveListAnalyser.cxx:749
 AliEveListAnalyser.cxx:750
 AliEveListAnalyser.cxx:751
 AliEveListAnalyser.cxx:752
 AliEveListAnalyser.cxx:753
 AliEveListAnalyser.cxx:754
 AliEveListAnalyser.cxx:755
 AliEveListAnalyser.cxx:756
 AliEveListAnalyser.cxx:757
 AliEveListAnalyser.cxx:758
 AliEveListAnalyser.cxx:759
 AliEveListAnalyser.cxx:760
 AliEveListAnalyser.cxx:761
 AliEveListAnalyser.cxx:762
 AliEveListAnalyser.cxx:763
 AliEveListAnalyser.cxx:764
 AliEveListAnalyser.cxx:765
 AliEveListAnalyser.cxx:766
 AliEveListAnalyser.cxx:767
 AliEveListAnalyser.cxx:768
 AliEveListAnalyser.cxx:769
 AliEveListAnalyser.cxx:770
 AliEveListAnalyser.cxx:771
 AliEveListAnalyser.cxx:772
 AliEveListAnalyser.cxx:773
 AliEveListAnalyser.cxx:774
 AliEveListAnalyser.cxx:775
 AliEveListAnalyser.cxx:776
 AliEveListAnalyser.cxx:777
 AliEveListAnalyser.cxx:778
 AliEveListAnalyser.cxx:779
 AliEveListAnalyser.cxx:780
 AliEveListAnalyser.cxx:781
 AliEveListAnalyser.cxx:782
 AliEveListAnalyser.cxx:783
 AliEveListAnalyser.cxx:784
 AliEveListAnalyser.cxx:785
 AliEveListAnalyser.cxx:786
 AliEveListAnalyser.cxx:787
 AliEveListAnalyser.cxx:788
 AliEveListAnalyser.cxx:789
 AliEveListAnalyser.cxx:790
 AliEveListAnalyser.cxx:791
 AliEveListAnalyser.cxx:792
 AliEveListAnalyser.cxx:793
 AliEveListAnalyser.cxx:794
 AliEveListAnalyser.cxx:795
 AliEveListAnalyser.cxx:796
 AliEveListAnalyser.cxx:797
 AliEveListAnalyser.cxx:798
 AliEveListAnalyser.cxx:799
 AliEveListAnalyser.cxx:800
 AliEveListAnalyser.cxx:801
 AliEveListAnalyser.cxx:802
 AliEveListAnalyser.cxx:803
 AliEveListAnalyser.cxx:804
 AliEveListAnalyser.cxx:805
 AliEveListAnalyser.cxx:806
 AliEveListAnalyser.cxx:807
 AliEveListAnalyser.cxx:808
 AliEveListAnalyser.cxx:809
 AliEveListAnalyser.cxx:810
 AliEveListAnalyser.cxx:811
 AliEveListAnalyser.cxx:812
 AliEveListAnalyser.cxx:813
 AliEveListAnalyser.cxx:814
 AliEveListAnalyser.cxx:815
 AliEveListAnalyser.cxx:816
 AliEveListAnalyser.cxx:817
 AliEveListAnalyser.cxx:818
 AliEveListAnalyser.cxx:819
 AliEveListAnalyser.cxx:820
 AliEveListAnalyser.cxx:821
 AliEveListAnalyser.cxx:822
 AliEveListAnalyser.cxx:823
 AliEveListAnalyser.cxx:824
 AliEveListAnalyser.cxx:825
 AliEveListAnalyser.cxx:826
 AliEveListAnalyser.cxx:827
 AliEveListAnalyser.cxx:828
 AliEveListAnalyser.cxx:829
 AliEveListAnalyser.cxx:830
 AliEveListAnalyser.cxx:831
 AliEveListAnalyser.cxx:832
 AliEveListAnalyser.cxx:833
 AliEveListAnalyser.cxx:834
 AliEveListAnalyser.cxx:835
 AliEveListAnalyser.cxx:836
 AliEveListAnalyser.cxx:837
 AliEveListAnalyser.cxx:838
 AliEveListAnalyser.cxx:839
 AliEveListAnalyser.cxx:840
 AliEveListAnalyser.cxx:841
 AliEveListAnalyser.cxx:842
 AliEveListAnalyser.cxx:843
 AliEveListAnalyser.cxx:844
 AliEveListAnalyser.cxx:845
 AliEveListAnalyser.cxx:846
 AliEveListAnalyser.cxx:847
 AliEveListAnalyser.cxx:848
 AliEveListAnalyser.cxx:849
 AliEveListAnalyser.cxx:850
 AliEveListAnalyser.cxx:851
 AliEveListAnalyser.cxx:852
 AliEveListAnalyser.cxx:853
 AliEveListAnalyser.cxx:854
 AliEveListAnalyser.cxx:855
 AliEveListAnalyser.cxx:856
 AliEveListAnalyser.cxx:857
 AliEveListAnalyser.cxx:858
 AliEveListAnalyser.cxx:859
 AliEveListAnalyser.cxx:860
 AliEveListAnalyser.cxx:861
 AliEveListAnalyser.cxx:862
 AliEveListAnalyser.cxx:863
 AliEveListAnalyser.cxx:864
 AliEveListAnalyser.cxx:865
 AliEveListAnalyser.cxx:866
 AliEveListAnalyser.cxx:867
 AliEveListAnalyser.cxx:868
 AliEveListAnalyser.cxx:869
 AliEveListAnalyser.cxx:870
 AliEveListAnalyser.cxx:871
 AliEveListAnalyser.cxx:872
 AliEveListAnalyser.cxx:873
 AliEveListAnalyser.cxx:874
 AliEveListAnalyser.cxx:875
 AliEveListAnalyser.cxx:876
 AliEveListAnalyser.cxx:877
 AliEveListAnalyser.cxx:878
 AliEveListAnalyser.cxx:879
 AliEveListAnalyser.cxx:880
 AliEveListAnalyser.cxx:881
 AliEveListAnalyser.cxx:882
 AliEveListAnalyser.cxx:883
 AliEveListAnalyser.cxx:884
 AliEveListAnalyser.cxx:885
 AliEveListAnalyser.cxx:886
 AliEveListAnalyser.cxx:887
 AliEveListAnalyser.cxx:888
 AliEveListAnalyser.cxx:889
 AliEveListAnalyser.cxx:890
 AliEveListAnalyser.cxx:891
 AliEveListAnalyser.cxx:892
 AliEveListAnalyser.cxx:893
 AliEveListAnalyser.cxx:894
 AliEveListAnalyser.cxx:895
 AliEveListAnalyser.cxx:896
 AliEveListAnalyser.cxx:897
 AliEveListAnalyser.cxx:898
 AliEveListAnalyser.cxx:899
 AliEveListAnalyser.cxx:900
 AliEveListAnalyser.cxx:901
 AliEveListAnalyser.cxx:902
 AliEveListAnalyser.cxx:903
 AliEveListAnalyser.cxx:904
 AliEveListAnalyser.cxx:905
 AliEveListAnalyser.cxx:906
 AliEveListAnalyser.cxx:907
 AliEveListAnalyser.cxx:908
 AliEveListAnalyser.cxx:909
 AliEveListAnalyser.cxx:910
 AliEveListAnalyser.cxx:911
 AliEveListAnalyser.cxx:912
 AliEveListAnalyser.cxx:913
 AliEveListAnalyser.cxx:914
 AliEveListAnalyser.cxx:915
 AliEveListAnalyser.cxx:916
 AliEveListAnalyser.cxx:917
 AliEveListAnalyser.cxx:918
 AliEveListAnalyser.cxx:919
 AliEveListAnalyser.cxx:920
 AliEveListAnalyser.cxx:921
 AliEveListAnalyser.cxx:922
 AliEveListAnalyser.cxx:923
 AliEveListAnalyser.cxx:924
 AliEveListAnalyser.cxx:925
 AliEveListAnalyser.cxx:926
 AliEveListAnalyser.cxx:927
 AliEveListAnalyser.cxx:928
 AliEveListAnalyser.cxx:929
 AliEveListAnalyser.cxx:930
 AliEveListAnalyser.cxx:931
 AliEveListAnalyser.cxx:932
 AliEveListAnalyser.cxx:933
 AliEveListAnalyser.cxx:934
 AliEveListAnalyser.cxx:935
 AliEveListAnalyser.cxx:936
 AliEveListAnalyser.cxx:937
 AliEveListAnalyser.cxx:938
 AliEveListAnalyser.cxx:939
 AliEveListAnalyser.cxx:940
 AliEveListAnalyser.cxx:941
 AliEveListAnalyser.cxx:942
 AliEveListAnalyser.cxx:943
 AliEveListAnalyser.cxx:944
 AliEveListAnalyser.cxx:945
 AliEveListAnalyser.cxx:946
 AliEveListAnalyser.cxx:947
 AliEveListAnalyser.cxx:948
 AliEveListAnalyser.cxx:949
 AliEveListAnalyser.cxx:950
 AliEveListAnalyser.cxx:951
 AliEveListAnalyser.cxx:952
 AliEveListAnalyser.cxx:953
 AliEveListAnalyser.cxx:954
 AliEveListAnalyser.cxx:955
 AliEveListAnalyser.cxx:956
 AliEveListAnalyser.cxx:957
 AliEveListAnalyser.cxx:958
 AliEveListAnalyser.cxx:959
 AliEveListAnalyser.cxx:960
 AliEveListAnalyser.cxx:961
 AliEveListAnalyser.cxx:962
 AliEveListAnalyser.cxx:963
 AliEveListAnalyser.cxx:964
 AliEveListAnalyser.cxx:965
 AliEveListAnalyser.cxx:966
 AliEveListAnalyser.cxx:967
 AliEveListAnalyser.cxx:968
 AliEveListAnalyser.cxx:969
 AliEveListAnalyser.cxx:970
 AliEveListAnalyser.cxx:971
 AliEveListAnalyser.cxx:972
 AliEveListAnalyser.cxx:973
 AliEveListAnalyser.cxx:974
 AliEveListAnalyser.cxx:975
 AliEveListAnalyser.cxx:976
 AliEveListAnalyser.cxx:977
 AliEveListAnalyser.cxx:978
 AliEveListAnalyser.cxx:979
 AliEveListAnalyser.cxx:980
 AliEveListAnalyser.cxx:981
 AliEveListAnalyser.cxx:982
 AliEveListAnalyser.cxx:983
 AliEveListAnalyser.cxx:984
 AliEveListAnalyser.cxx:985
 AliEveListAnalyser.cxx:986
 AliEveListAnalyser.cxx:987
 AliEveListAnalyser.cxx:988
 AliEveListAnalyser.cxx:989
 AliEveListAnalyser.cxx:990
 AliEveListAnalyser.cxx:991
 AliEveListAnalyser.cxx:992
 AliEveListAnalyser.cxx:993
 AliEveListAnalyser.cxx:994
 AliEveListAnalyser.cxx:995
 AliEveListAnalyser.cxx:996
 AliEveListAnalyser.cxx:997
 AliEveListAnalyser.cxx:998
 AliEveListAnalyser.cxx:999
 AliEveListAnalyser.cxx:1000
 AliEveListAnalyser.cxx:1001
 AliEveListAnalyser.cxx:1002
 AliEveListAnalyser.cxx:1003
 AliEveListAnalyser.cxx:1004
 AliEveListAnalyser.cxx:1005
 AliEveListAnalyser.cxx:1006
 AliEveListAnalyser.cxx:1007
 AliEveListAnalyser.cxx:1008
 AliEveListAnalyser.cxx:1009
 AliEveListAnalyser.cxx:1010
 AliEveListAnalyser.cxx:1011
 AliEveListAnalyser.cxx:1012
 AliEveListAnalyser.cxx:1013
 AliEveListAnalyser.cxx:1014
 AliEveListAnalyser.cxx:1015
 AliEveListAnalyser.cxx:1016
 AliEveListAnalyser.cxx:1017
 AliEveListAnalyser.cxx:1018
 AliEveListAnalyser.cxx:1019
 AliEveListAnalyser.cxx:1020
 AliEveListAnalyser.cxx:1021
 AliEveListAnalyser.cxx:1022
 AliEveListAnalyser.cxx:1023
 AliEveListAnalyser.cxx:1024
 AliEveListAnalyser.cxx:1025
 AliEveListAnalyser.cxx:1026
 AliEveListAnalyser.cxx:1027
 AliEveListAnalyser.cxx:1028
 AliEveListAnalyser.cxx:1029
 AliEveListAnalyser.cxx:1030
 AliEveListAnalyser.cxx:1031
 AliEveListAnalyser.cxx:1032
 AliEveListAnalyser.cxx:1033
 AliEveListAnalyser.cxx:1034
 AliEveListAnalyser.cxx:1035
 AliEveListAnalyser.cxx:1036
 AliEveListAnalyser.cxx:1037
 AliEveListAnalyser.cxx:1038
 AliEveListAnalyser.cxx:1039
 AliEveListAnalyser.cxx:1040
 AliEveListAnalyser.cxx:1041
 AliEveListAnalyser.cxx:1042
 AliEveListAnalyser.cxx:1043
 AliEveListAnalyser.cxx:1044
 AliEveListAnalyser.cxx:1045
 AliEveListAnalyser.cxx:1046
 AliEveListAnalyser.cxx:1047
 AliEveListAnalyser.cxx:1048
 AliEveListAnalyser.cxx:1049
 AliEveListAnalyser.cxx:1050
 AliEveListAnalyser.cxx:1051
 AliEveListAnalyser.cxx:1052
 AliEveListAnalyser.cxx:1053
 AliEveListAnalyser.cxx:1054
 AliEveListAnalyser.cxx:1055
 AliEveListAnalyser.cxx:1056
 AliEveListAnalyser.cxx:1057
 AliEveListAnalyser.cxx:1058
 AliEveListAnalyser.cxx:1059
 AliEveListAnalyser.cxx:1060
 AliEveListAnalyser.cxx:1061
 AliEveListAnalyser.cxx:1062
 AliEveListAnalyser.cxx:1063
 AliEveListAnalyser.cxx:1064
 AliEveListAnalyser.cxx:1065
 AliEveListAnalyser.cxx:1066
 AliEveListAnalyser.cxx:1067
 AliEveListAnalyser.cxx:1068
 AliEveListAnalyser.cxx:1069
 AliEveListAnalyser.cxx:1070
 AliEveListAnalyser.cxx:1071
 AliEveListAnalyser.cxx:1072
 AliEveListAnalyser.cxx:1073
 AliEveListAnalyser.cxx:1074
 AliEveListAnalyser.cxx:1075
 AliEveListAnalyser.cxx:1076
 AliEveListAnalyser.cxx:1077
 AliEveListAnalyser.cxx:1078
 AliEveListAnalyser.cxx:1079
 AliEveListAnalyser.cxx:1080
 AliEveListAnalyser.cxx:1081
 AliEveListAnalyser.cxx:1082
 AliEveListAnalyser.cxx:1083
 AliEveListAnalyser.cxx:1084
 AliEveListAnalyser.cxx:1085
 AliEveListAnalyser.cxx:1086
 AliEveListAnalyser.cxx:1087
 AliEveListAnalyser.cxx:1088
 AliEveListAnalyser.cxx:1089
 AliEveListAnalyser.cxx:1090
 AliEveListAnalyser.cxx:1091
 AliEveListAnalyser.cxx:1092
 AliEveListAnalyser.cxx:1093
 AliEveListAnalyser.cxx:1094
 AliEveListAnalyser.cxx:1095
 AliEveListAnalyser.cxx:1096
 AliEveListAnalyser.cxx:1097
 AliEveListAnalyser.cxx:1098
 AliEveListAnalyser.cxx:1099
 AliEveListAnalyser.cxx:1100
 AliEveListAnalyser.cxx:1101
 AliEveListAnalyser.cxx:1102
 AliEveListAnalyser.cxx:1103
 AliEveListAnalyser.cxx:1104
 AliEveListAnalyser.cxx:1105
 AliEveListAnalyser.cxx:1106
 AliEveListAnalyser.cxx:1107
 AliEveListAnalyser.cxx:1108
 AliEveListAnalyser.cxx:1109
 AliEveListAnalyser.cxx:1110
 AliEveListAnalyser.cxx:1111
 AliEveListAnalyser.cxx:1112
 AliEveListAnalyser.cxx:1113
 AliEveListAnalyser.cxx:1114
 AliEveListAnalyser.cxx:1115
 AliEveListAnalyser.cxx:1116
 AliEveListAnalyser.cxx:1117
 AliEveListAnalyser.cxx:1118
 AliEveListAnalyser.cxx:1119
 AliEveListAnalyser.cxx:1120
 AliEveListAnalyser.cxx:1121
 AliEveListAnalyser.cxx:1122
 AliEveListAnalyser.cxx:1123
 AliEveListAnalyser.cxx:1124
 AliEveListAnalyser.cxx:1125
 AliEveListAnalyser.cxx:1126
 AliEveListAnalyser.cxx:1127
 AliEveListAnalyser.cxx:1128
 AliEveListAnalyser.cxx:1129
 AliEveListAnalyser.cxx:1130
 AliEveListAnalyser.cxx:1131
 AliEveListAnalyser.cxx:1132
 AliEveListAnalyser.cxx:1133
 AliEveListAnalyser.cxx:1134
 AliEveListAnalyser.cxx:1135
 AliEveListAnalyser.cxx:1136
 AliEveListAnalyser.cxx:1137
 AliEveListAnalyser.cxx:1138
 AliEveListAnalyser.cxx:1139
 AliEveListAnalyser.cxx:1140
 AliEveListAnalyser.cxx:1141
 AliEveListAnalyser.cxx:1142
 AliEveListAnalyser.cxx:1143
 AliEveListAnalyser.cxx:1144
 AliEveListAnalyser.cxx:1145
 AliEveListAnalyser.cxx:1146
 AliEveListAnalyser.cxx:1147
 AliEveListAnalyser.cxx:1148
 AliEveListAnalyser.cxx:1149
 AliEveListAnalyser.cxx:1150
 AliEveListAnalyser.cxx:1151
 AliEveListAnalyser.cxx:1152
 AliEveListAnalyser.cxx:1153
 AliEveListAnalyser.cxx:1154
 AliEveListAnalyser.cxx:1155
 AliEveListAnalyser.cxx:1156
 AliEveListAnalyser.cxx:1157
 AliEveListAnalyser.cxx:1158
 AliEveListAnalyser.cxx:1159
 AliEveListAnalyser.cxx:1160
 AliEveListAnalyser.cxx:1161
 AliEveListAnalyser.cxx:1162
 AliEveListAnalyser.cxx:1163
 AliEveListAnalyser.cxx:1164
 AliEveListAnalyser.cxx:1165
 AliEveListAnalyser.cxx:1166
 AliEveListAnalyser.cxx:1167
 AliEveListAnalyser.cxx:1168
 AliEveListAnalyser.cxx:1169
 AliEveListAnalyser.cxx:1170
 AliEveListAnalyser.cxx:1171
 AliEveListAnalyser.cxx:1172
 AliEveListAnalyser.cxx:1173
 AliEveListAnalyser.cxx:1174
 AliEveListAnalyser.cxx:1175
 AliEveListAnalyser.cxx:1176
 AliEveListAnalyser.cxx:1177
 AliEveListAnalyser.cxx:1178
 AliEveListAnalyser.cxx:1179
 AliEveListAnalyser.cxx:1180
 AliEveListAnalyser.cxx:1181
 AliEveListAnalyser.cxx:1182
 AliEveListAnalyser.cxx:1183
 AliEveListAnalyser.cxx:1184
 AliEveListAnalyser.cxx:1185
 AliEveListAnalyser.cxx:1186
 AliEveListAnalyser.cxx:1187
 AliEveListAnalyser.cxx:1188
 AliEveListAnalyser.cxx:1189
 AliEveListAnalyser.cxx:1190
 AliEveListAnalyser.cxx:1191
 AliEveListAnalyser.cxx:1192
 AliEveListAnalyser.cxx:1193
 AliEveListAnalyser.cxx:1194
 AliEveListAnalyser.cxx:1195
 AliEveListAnalyser.cxx:1196
 AliEveListAnalyser.cxx:1197
 AliEveListAnalyser.cxx:1198
 AliEveListAnalyser.cxx:1199
 AliEveListAnalyser.cxx:1200
 AliEveListAnalyser.cxx:1201
 AliEveListAnalyser.cxx:1202
 AliEveListAnalyser.cxx:1203
 AliEveListAnalyser.cxx:1204
 AliEveListAnalyser.cxx:1205
 AliEveListAnalyser.cxx:1206
 AliEveListAnalyser.cxx:1207
 AliEveListAnalyser.cxx:1208
 AliEveListAnalyser.cxx:1209
 AliEveListAnalyser.cxx:1210
 AliEveListAnalyser.cxx:1211
 AliEveListAnalyser.cxx:1212
 AliEveListAnalyser.cxx:1213
 AliEveListAnalyser.cxx:1214
 AliEveListAnalyser.cxx:1215
 AliEveListAnalyser.cxx:1216
 AliEveListAnalyser.cxx:1217
 AliEveListAnalyser.cxx:1218
 AliEveListAnalyser.cxx:1219
 AliEveListAnalyser.cxx:1220
 AliEveListAnalyser.cxx:1221
 AliEveListAnalyser.cxx:1222
 AliEveListAnalyser.cxx:1223
 AliEveListAnalyser.cxx:1224
 AliEveListAnalyser.cxx:1225
 AliEveListAnalyser.cxx:1226
 AliEveListAnalyser.cxx:1227
 AliEveListAnalyser.cxx:1228
 AliEveListAnalyser.cxx:1229
 AliEveListAnalyser.cxx:1230
 AliEveListAnalyser.cxx:1231
 AliEveListAnalyser.cxx:1232
 AliEveListAnalyser.cxx:1233
 AliEveListAnalyser.cxx:1234
 AliEveListAnalyser.cxx:1235
 AliEveListAnalyser.cxx:1236
 AliEveListAnalyser.cxx:1237
 AliEveListAnalyser.cxx:1238
 AliEveListAnalyser.cxx:1239
 AliEveListAnalyser.cxx:1240
 AliEveListAnalyser.cxx:1241
 AliEveListAnalyser.cxx:1242
 AliEveListAnalyser.cxx:1243
 AliEveListAnalyser.cxx:1244
 AliEveListAnalyser.cxx:1245
 AliEveListAnalyser.cxx:1246
 AliEveListAnalyser.cxx:1247
 AliEveListAnalyser.cxx:1248
 AliEveListAnalyser.cxx:1249
 AliEveListAnalyser.cxx:1250
 AliEveListAnalyser.cxx:1251
 AliEveListAnalyser.cxx:1252
 AliEveListAnalyser.cxx:1253
 AliEveListAnalyser.cxx:1254
 AliEveListAnalyser.cxx:1255
 AliEveListAnalyser.cxx:1256
 AliEveListAnalyser.cxx:1257
 AliEveListAnalyser.cxx:1258
 AliEveListAnalyser.cxx:1259
 AliEveListAnalyser.cxx:1260
 AliEveListAnalyser.cxx:1261
 AliEveListAnalyser.cxx:1262
 AliEveListAnalyser.cxx:1263
 AliEveListAnalyser.cxx:1264
 AliEveListAnalyser.cxx:1265
 AliEveListAnalyser.cxx:1266
 AliEveListAnalyser.cxx:1267
 AliEveListAnalyser.cxx:1268
 AliEveListAnalyser.cxx:1269
 AliEveListAnalyser.cxx:1270
 AliEveListAnalyser.cxx:1271
 AliEveListAnalyser.cxx:1272
 AliEveListAnalyser.cxx:1273
 AliEveListAnalyser.cxx:1274
 AliEveListAnalyser.cxx:1275
 AliEveListAnalyser.cxx:1276
 AliEveListAnalyser.cxx:1277
 AliEveListAnalyser.cxx:1278
 AliEveListAnalyser.cxx:1279
 AliEveListAnalyser.cxx:1280
 AliEveListAnalyser.cxx:1281
 AliEveListAnalyser.cxx:1282
 AliEveListAnalyser.cxx:1283
 AliEveListAnalyser.cxx:1284
 AliEveListAnalyser.cxx:1285
 AliEveListAnalyser.cxx:1286
 AliEveListAnalyser.cxx:1287
 AliEveListAnalyser.cxx:1288
 AliEveListAnalyser.cxx:1289
 AliEveListAnalyser.cxx:1290
 AliEveListAnalyser.cxx:1291
 AliEveListAnalyser.cxx:1292
 AliEveListAnalyser.cxx:1293
 AliEveListAnalyser.cxx:1294
 AliEveListAnalyser.cxx:1295
 AliEveListAnalyser.cxx:1296
 AliEveListAnalyser.cxx:1297
 AliEveListAnalyser.cxx:1298
 AliEveListAnalyser.cxx:1299
 AliEveListAnalyser.cxx:1300
 AliEveListAnalyser.cxx:1301
 AliEveListAnalyser.cxx:1302
 AliEveListAnalyser.cxx:1303
 AliEveListAnalyser.cxx:1304
 AliEveListAnalyser.cxx:1305
 AliEveListAnalyser.cxx:1306
 AliEveListAnalyser.cxx:1307
 AliEveListAnalyser.cxx:1308
 AliEveListAnalyser.cxx:1309
 AliEveListAnalyser.cxx:1310
 AliEveListAnalyser.cxx:1311
 AliEveListAnalyser.cxx:1312
 AliEveListAnalyser.cxx:1313
 AliEveListAnalyser.cxx:1314
 AliEveListAnalyser.cxx:1315
 AliEveListAnalyser.cxx:1316
 AliEveListAnalyser.cxx:1317
 AliEveListAnalyser.cxx:1318
 AliEveListAnalyser.cxx:1319
 AliEveListAnalyser.cxx:1320
 AliEveListAnalyser.cxx:1321
 AliEveListAnalyser.cxx:1322
 AliEveListAnalyser.cxx:1323
 AliEveListAnalyser.cxx:1324
 AliEveListAnalyser.cxx:1325
 AliEveListAnalyser.cxx:1326
 AliEveListAnalyser.cxx:1327
 AliEveListAnalyser.cxx:1328
 AliEveListAnalyser.cxx:1329
 AliEveListAnalyser.cxx:1330
 AliEveListAnalyser.cxx:1331
 AliEveListAnalyser.cxx:1332
 AliEveListAnalyser.cxx:1333
 AliEveListAnalyser.cxx:1334
 AliEveListAnalyser.cxx:1335
 AliEveListAnalyser.cxx:1336
 AliEveListAnalyser.cxx:1337
 AliEveListAnalyser.cxx:1338
 AliEveListAnalyser.cxx:1339
 AliEveListAnalyser.cxx:1340
 AliEveListAnalyser.cxx:1341
 AliEveListAnalyser.cxx:1342
 AliEveListAnalyser.cxx:1343
 AliEveListAnalyser.cxx:1344
 AliEveListAnalyser.cxx:1345
 AliEveListAnalyser.cxx:1346
 AliEveListAnalyser.cxx:1347
 AliEveListAnalyser.cxx:1348
 AliEveListAnalyser.cxx:1349
 AliEveListAnalyser.cxx:1350
 AliEveListAnalyser.cxx:1351
 AliEveListAnalyser.cxx:1352
 AliEveListAnalyser.cxx:1353
 AliEveListAnalyser.cxx:1354
 AliEveListAnalyser.cxx:1355
 AliEveListAnalyser.cxx:1356
 AliEveListAnalyser.cxx:1357
 AliEveListAnalyser.cxx:1358
 AliEveListAnalyser.cxx:1359
 AliEveListAnalyser.cxx:1360
 AliEveListAnalyser.cxx:1361
 AliEveListAnalyser.cxx:1362
 AliEveListAnalyser.cxx:1363
 AliEveListAnalyser.cxx:1364
 AliEveListAnalyser.cxx:1365
 AliEveListAnalyser.cxx:1366
 AliEveListAnalyser.cxx:1367
 AliEveListAnalyser.cxx:1368
 AliEveListAnalyser.cxx:1369
 AliEveListAnalyser.cxx:1370
 AliEveListAnalyser.cxx:1371
 AliEveListAnalyser.cxx:1372
 AliEveListAnalyser.cxx:1373
 AliEveListAnalyser.cxx:1374
 AliEveListAnalyser.cxx:1375
 AliEveListAnalyser.cxx:1376
 AliEveListAnalyser.cxx:1377
 AliEveListAnalyser.cxx:1378
 AliEveListAnalyser.cxx:1379