]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONDataInterface.cxx
Moving required CMake version from 2.8.4 to 2.8.8
[u/mrichter/AliRoot.git] / MUON / AliMUONDataInterface.cxx
index f3167ab61f5ca5e82b8d7f5c45095ba3f26adb51..8ee174b1228267b4e11e7669a953a49045bf9954 100644 (file)
  
 /* $Id$ */
 
-#include <TError.h>
-#include <TParticle.h>
-
-#include "AliRunLoader.h"
-#include "AliLoader.h"
-
 #include "AliMUONDataInterface.h"
+#include "AliMUONGeometryTransformer.h"
+#include "AliMUONVDigit.h"
+#include "AliMUONVCluster.h"
 #include "AliMUONLocalTrigger.h"
+#include "AliMUONRegionalTrigger.h"
 #include "AliMUONGlobalTrigger.h"
-#include "AliMUONHit.h"
-#include "AliMUONDigit.h"
-#include "AliMUONRawCluster.h"
-#include "AliMUONTrack.h"
-#include "AliLog.h"
-
-#include <Riostream.h>
-
+#include "AliMUONTriggerCircuit.h"
+#include "AliMUONVClusterStore.h"
 #include "AliMUONVDigitStore.h"
 #include "AliMUONVTriggerStore.h"
-#include "AliMUONVClusterStore.h"
-#include "AliMUONVTrackStore.h"
-#include "AliMUONVTriggerTrackStore.h"
-#include "AliMUONDataManager.h"
+#include "AliMpCDB.h"
+
+#include "AliMpEncodePair.h"
+#include "AliMpDEManager.h"
+#include "AliMpConstants.h"
+#include "AliMpCDB.h"
+
+#include "AliLoader.h"
+#include "AliRunLoader.h"
+#include "AliHeader.h"
+#include "AliCDBManager.h"
 #include "AliLog.h"
+
+#include <Riostream.h>
+#include <TFile.h>
 #include <TList.h>
+#include <TNtuple.h>
+#include <TSystem.h>
+#include <TIterator.h>
+#include <cstdlib>
+#include <cassert>
 
-///
+//-----------------------------------------------------------------------------
 /// \class AliMUONDataInterface
 ///
 /// An easy to use interface to the MUON data data stored in
-/// TreeS, TreeD, TreeR and TreeT.
+/// TreeS, TreeD and TreeR.
 ///
 /// For MC related information (i.e. TreeH, TreeK, TreeTR), see
 /// AliMUONMCDataInterface.
 /// This interface in not necessarily the fastest way to fetch the data but
 /// it is the easiest.
 ///
-/// \author Laurent Aphecetche, Subatech
+/// \author Laurent Aphecetche, Subatech & Artur Szostak <artursz@iafrica.com> (University of Cape Town)
+//-----------------------------------------------------------------------------
 
 /// \cond CLASSIMP
 ClassImp(AliMUONDataInterface)
 /// \endcond
 
+
+Int_t AliMUONDataInterface::fgInstanceCounter(0);
+
 //______________________________________________________________________________
 AliMUONDataInterface::AliMUONDataInterface(const char* filename)
-       : TObject(), 
-fDataManager(new AliMUONDataManager(filename))
+: TObject(), 
+fLoader(0x0),
+fDigitStore(0x0),
+fTriggerStore(0x0),
+fClusterStore(0x0),
+fCurrentEvent(-1),
+fTreeLetter(""),
+fIsValid(kFALSE),
+fCurrentIteratorType(kNoIterator),
+fCurrentIndex(-1),
+fDataX(-1),
+fDataY(-1),
+fIterator(0x0)
 {
   /// ctor
   /// @param filename should be the full path to a valid galice.root file
   
-  if (!IsValid())
-  {
-    AliError("Improper initialization. Object will be unuseable");
+  ++fgInstanceCounter;
+  
+  if ( AliCDBManager::Instance() != NULL &&
+       AliCDBManager::Instance()->GetDefaultStorage() == NULL ) {
+      AliFatal("CDB default storage not defined.");
+  }
+  
+  Open(filename);
+
+  // Load mapping
+  if ( ! AliMpCDB::LoadDDLStore() ) {
+    AliFatal("Could not access mapping from OCDB !");
   }
 }
 
@@ -78,524 +109,815 @@ fDataManager(new AliMUONDataManager(filename))
 AliMUONDataInterface::~AliMUONDataInterface()
 {
   /// dtor
-  delete fDataManager;
-}
-
-//______________________________________________________________________________
-AliMUONVClusterStore*
-AliMUONDataInterface::ClusterStore(Int_t event) const
-{
-  /// Return the cluster store for a given event
-  if (!IsValid()) return 0x0;
-  return dynamic_cast<AliMUONVClusterStore*>(fDataManager->ReadConnectable(event,"R","Cluster"));
-
-}
-
-//______________________________________________________________________________
-void
-AliMUONDataInterface::DumpRecPoints(Int_t event, Bool_t sorted) const
-{
-  /// Dump the recpoints for a given event, sorted if so required
-  DumpIt("R","Cluster",event,sorted);
+  ResetStores();
+  --fgInstanceCounter;  
 }
 
 //______________________________________________________________________________
 AliMUONVDigitStore*
-AliMUONDataInterface::DigitStore(Int_t event) const
-{
-  /// Return the digit store for a given event
-  if (!IsValid()) return 0x0;
-  return dynamic_cast<AliMUONVDigitStore*>(fDataManager->ReadConnectable(event,"D","Digit"));
-}
-
-//______________________________________________________________________________
-TList* 
-AliMUONDataInterface::DigitStoreAsList(Int_t event) const
-{
-  /// Return the digitStore as a TList
-  AliMUONVDigitStore* digitStore = DigitStore(event);
+AliMUONDataInterface::DigitStore(Int_t event)
+{
+  /// Return digitStore for a given event.
+  /// Return 0x0 if event not found.
+  /// Returned pointer should not be deleted
+  ///
+  /// \note If a previous store has been retrieved by one of the methods of
+  /// this class, but for a different event number, then those stores will
+  /// be deleted and no longer valid.
+  /// If you require access to the data for the earlier retrieved store,
+  /// but for different events, then you should deep copy / clone the object.
   
-  TIter next(digitStore->CreateIterator());
-
-  TList* list = new TList;
-  list->SetOwner(kTRUE);
-  TObject* object;
+  if (not IsValid()) return 0x0;
+  
+  if (event == fCurrentEvent)
+  {
+    if (fDigitStore != 0x0)
+      return fDigitStore;
+  }
+  else
+  {
+    ResetStores();
+    if ( not LoadEvent(event) ) return 0x0;
+  }
+  
+  fLoader->LoadDigits();
+  
+  TTree* treeD = fLoader->TreeD();
+  if (treeD == 0x0)
+  {
+    AliError("Could not get treeD");
+    return 0x0;
+  }
   
-  while ( ( object = next() ) ) 
+  fDigitStore = AliMUONVDigitStore::Create(*treeD);
+  if ( fDigitStore != 0x0 ) 
   {
-    list->Add(object->Clone());
+    fDigitStore->Clear();
+    fDigitStore->Connect(*treeD);
+    treeD->GetEvent(0);
   }
   
-  delete digitStore;
-  return list;
+  fLoader->UnloadDigits();
+  
+  return fDigitStore;
 }
 
 //______________________________________________________________________________
-void
-AliMUONDataInterface::DumpIt(const char* treeLetter, const char* what, 
-                             Int_t event, Bool_t sorted) const
-{
-  /// Generic dump method used by the other DumpXXX methods
-  AliMUONVStore* store = fDataManager->ReadConnectable(event,treeLetter,what);
-  if (!store)
+AliMUONVClusterStore*
+AliMUONDataInterface::ClusterStore(Int_t event)
+{
+  /// Return clusterStore for a given event.
+  /// Return 0x0 if event not found.
+  /// Returned pointer should not be deleted
+  ///
+  /// \note If a previous store has been retrieved by one of the methods of
+  /// this class, but for a different event number, then those stores will
+  /// be deleted and no longer valid.
+  /// If you require access to the data for the earlier retrieved store,
+  /// but for different events, then you should deep copy / clone the object.
+  
+  if (not IsValid()) return 0x0;
+  
+  if (event == fCurrentEvent)
   {
-    AliError(Form("Could not read %s from tree%s",what,treeLetter));
-    return;
+    if (fClusterStore != 0x0)
+      return fClusterStore;
+  }
+  else
+  {
+    ResetStores();
+    if ( not LoadEvent(event) ) return 0x0;
   }
   
-  if ( sorted ) 
+  fLoader->LoadRecPoints();
+  
+  TTree* treeR = fLoader->TreeR();
+  if (treeR == 0x0)
+  {
+    AliError("Could not get treeR");
+    return 0x0;
+  }
+  
+  fClusterStore = AliMUONVClusterStore::Create(*treeR);
+  if ( fClusterStore != 0x0 ) 
   {
-    TList list;
-    list.SetOwner(kFALSE);
-    TIter next(store->CreateIterator());
-    TObject* object;
+    fClusterStore->Clear();
+    fClusterStore->Connect(*treeR);
+    treeR->GetEvent(0);
+  }
+  
+  fLoader->UnloadRecPoints();
   
-    while ( ( object = next() ) ) 
+  return fClusterStore;
+}
+
+//_____________________________________________________________________________
+AliMUONVTriggerStore*
+AliMUONDataInterface::TriggerStore(Int_t event, const char* treeLetter)
+{
+  /// Return the triggerStore for a given event.
+  /// Return 0x0 if event not found.
+  /// Returned pointer should not be deleted
+  /// treeLetter can be R or D to tell from which tree to read the information
+  ///
+  /// \note If a previous store has been retrieved by one of the methods of
+  /// this class, but for a different event number, then those stores will
+  /// be deleted and no longer valid.
+  /// If you require access to the data for the earlier retrieved store,
+  /// but for different events, then you should deep copy / clone the object.
+  
+  if (not IsValid()) return 0x0;
+  
+  if (event == fCurrentEvent)
+  {
+    if (fTreeLetter == treeLetter)
     {
-      list.Add(object);
+      if (fTriggerStore != 0x0)
+        return fTriggerStore;
+    }
+    else
+    {
+      // Reset only the fTriggerStore since the others might still be valid
+      // for the same event.
+      if (fTriggerStore != 0x0)
+      {
+        delete fTriggerStore;
+        fTriggerStore = 0x0;
+      }
     }
-
-    list.Sort();
-  
-    list.Print();
   }
   else
   {
-    store->Print();
+    // Event has changed so reset all the stores.
+    ResetStores();
+    if ( not LoadEvent(event) ) return 0x0;
+  }
+  
+  TTree* tree(0x0);
+  
+  TString stree(treeLetter);
+  stree.ToUpper();
+  
+  if ( stree == "D" )
+  {
+    fLoader->LoadDigits();    
+    tree = fLoader->TreeD();
+  }
+  else if ( stree == "R" )
+  {
+    fLoader->LoadRecPoints();
+    tree = fLoader->TreeR();
   }
   
-  delete store;
+  if ( tree == 0x0 ) 
+  {
+    AliError(Form("Could not get tree%s",treeLetter));
+    return 0x0;
+  }
+  
+  fTriggerStore = AliMUONVTriggerStore::Create(*tree);
+  if ( fTriggerStore != 0x0 ) 
+  {
+    fTriggerStore->Clear();
+    fTriggerStore->Connect(*tree);
+    tree->GetEvent(0);
+  }
+  
+  if ( stree == "D" )
+  {
+    fLoader->UnloadDigits();    
+  }
+  else if ( stree == "R" )
+  {
+    fLoader->UnloadRecPoints();
+  }
+  fTreeLetter = stree;
+  
+  return fTriggerStore;
 }
 
 //______________________________________________________________________________
 void
-AliMUONDataInterface::DumpDigits(Int_t event, Bool_t sorted) const
-{
-  /// Dump digits of a given event, sorted if so required
-  DumpIt("D","Digit",event,sorted);
-}
-
-//______________________________________________________________________________
-Bool_t
-AliMUONDataInterface::IsValid() const
-{
-  /// Whether we were properly initialized from a valid galice.root file
-  return fDataManager->IsValid();
-}
-
-//______________________________________________________________________________
-Int_t
-AliMUONDataInterface::NumberOfEvents() const
+AliMUONDataInterface::DumpDigits(Int_t event, Bool_t sorted)
 {
-  /// Number of events in the current galice.root file we're attached to 
-  if (!IsValid()) return 0;
-  return fDataManager->NumberOfEvents();
-}
-
-//______________________________________________________________________________
-AliMUONVDigitStore*
-AliMUONDataInterface::SDigitStore(Int_t event) const
-{
-  /// Return the SDigit store for a given event
-  if (!IsValid()) return 0x0;
-  return dynamic_cast<AliMUONVDigitStore*>(fDataManager->ReadConnectable(event,"S","SDigit"));
+  /// Dump the digits for a given event, sorted if so required
+  DigitStore(event);
+  if ( fDigitStore != 0x0 ) 
+  {
+    if ( sorted ) 
+    {
+      DumpSorted(*fDigitStore);
+    }
+    else
+    {
+      fDigitStore->Print();
+    }
+  }
 }
 
 //______________________________________________________________________________
 void
-AliMUONDataInterface::DumpSDigits(Int_t event, Bool_t sorted) const
-{
-  /// Dump sdigits for a given event, sorted if so required
-  DumpIt("S","Digit",event,sorted);
-}
-
-
-//______________________________________________________________________________
-AliMUONVTrackStore* 
-AliMUONDataInterface::TrackStore(Int_t event) const
+AliMUONDataInterface::DumpRecPoints(Int_t event, Bool_t sorted)
 {
-  /// Return the track store for a given event
-  if (!IsValid()) return 0x0;
-  return dynamic_cast<AliMUONVTrackStore*>(fDataManager->ReadConnectable(event,"T","Track"));
+  /// Dump the recpoints for a given event, sorted if so required
+  ClusterStore(event);
+  if ( fClusterStore != 0x0 ) 
+  {
+    if ( sorted ) 
+    {
+      DumpSorted(*fClusterStore);
+    }
+    else
+    {
+      fClusterStore->Print();
+    }
+  }
 }
 
-//______________________________________________________________________________
+//_____________________________________________________________________________
 void
-AliMUONDataInterface::DumpTracks(Int_t event, Bool_t sorted) const
+AliMUONDataInterface::DumpSorted(const AliMUONVStore& store) const
 {
-  /// Dump tracks for a given event, sorted if so required
-  DumpIt("T","Track",event,sorted);
-}
-
-//______________________________________________________________________________
-AliMUONVTriggerStore* 
-AliMUONDataInterface::TriggerStore(Int_t event, const char* treeLetter) const
-{
-  /// Return the trigger store for a given event, from a given tree (D or R)
-  if (!IsValid()) return 0x0;
-  return dynamic_cast<AliMUONVTriggerStore*>(fDataManager->ReadConnectable(event,treeLetter,"Trigger"));  
+  /// Dump the given store, in sorted order
+  
+  TIter next(store.CreateIterator());
+  TObject* object;
+  TList list;
+  list.SetOwner(kFALSE);
+  
+  while ( ( object = next() ) )
+  {
+    list.Add(object);
+  }
+  
+  list.Sort();
+  
+  list.Print();
 }
 
-//______________________________________________________________________________
+//_____________________________________________________________________________
 void
-AliMUONDataInterface::DumpTrigger(Int_t event, const char* treeLetter) const
+AliMUONDataInterface::DumpTrigger(Int_t event, const char* treeLetter)
 {
-  /// Dump trigger for a given event, from a given tree, sorted if possible
-  DumpIt(treeLetter,"Trigger",event,kFALSE);
-}
-
-//______________________________________________________________________________
-AliMUONVTriggerTrackStore* 
-AliMUONDataInterface::TriggerTrackStore(Int_t event) const
-{
-  /// Return trigger track store for a given event
-  if (!IsValid()) return 0x0;
-  return dynamic_cast<AliMUONVTriggerTrackStore*>(fDataManager->ReadConnectable(event,"T","TriggerTrack"));  
+  /// Dump trigger for a given event from a given tree (if event>=0)
+  /// or loop over all events and build a trigger ntuple if event<0
+  /// treeLetter can be R or D to tell from which tree to read the information
+  
+  if ( event < 0 ) 
+  {
+    NtupleTrigger(treeLetter);
+  }
+  else
+  {
+    TriggerStore(event,treeLetter);
+  
+    if ( fTriggerStore != 0x0 ) 
+    {
+      fTriggerStore->Print();
+    }
+  }
 }
 
-//______________________________________________________________________________
+//_____________________________________________________________________________
 void
-AliMUONDataInterface::DumpTriggerTracks(Int_t event, Bool_t sorted) const
-{
-  /// Dump trigger tracks for a given event
-  DumpIt("T","Trigger",event,sorted);
-}
-
-//______________________________________________________________________________
-//______________________________________________________________________________
-//______________________________________________________________________________
-//______________________________________________________________________________
-
-void AliMUONDataInterface::Reset()
+AliMUONDataInterface::NtupleTrigger(const char* treeLetter)
 {
-/// \deprecated Method is going to be removed
-
-  AliFatal("Deprecated");
-}
-
-Bool_t AliMUONDataInterface::UseCurrentRunLoader()
-{
-/// \deprecated Method is going to be removed
-
-  AliFatal("Deprecated");
-  return kFALSE;
-}
+  //// Loop over events to build trigger ntuples
+  ///
   
-Int_t AliMUONDataInterface::NumberOfEvents(TString , TString )
-{
-/// \deprecated Method is going to be removed
-
-  AliFatal("Deprecated");
-  return 0;
-}
-
-
-Int_t AliMUONDataInterface::NumberOfParticles(TString , TString , Int_t )
-{
-/// \deprecated Method is going to be removed
-
-  AliFatal("Deprecated");
-  return 0;
-}
-
-
-TParticle* AliMUONDataInterface::Particle(
-               TString , TString , Int_t , Int_t 
-       )
-{
-/// \deprecated Method is going to be removed
-
-  AliFatal("Deprecated");
-  return 0;
-}
-
-
-Int_t AliMUONDataInterface::NumberOfTracks(TString , TString , Int_t )
-{
-/// \deprecated Method is going to be removed
-
-  AliFatal("Deprecated");
-  return 0;
-}
-
-
-Int_t AliMUONDataInterface::NumberOfHits(
-               TString , TString , Int_t , Int_t 
-       )
-{
-/// \deprecated Method is going to be removed
-
-  AliFatal("Deprecated");
-  return 0;
-}
-
-
-AliMUONHit* AliMUONDataInterface::Hit(
-               TString , TString , Int_t ,
-               Int_t , Int_t 
-       )
-{
-/// \deprecated Method is going to be removed
-
-  AliFatal("Deprecated");
-  return 0;
-}
-
-
-Int_t AliMUONDataInterface::NumberOfSDigits(
-               TString , TString , Int_t ,
-               Int_t , Int_t 
-       )
-{
-/// \deprecated Method is going to be removed
-
-  AliFatal("Deprecated");
-  return 0;
-}
-
-
-AliMUONDigit* AliMUONDataInterface::SDigit(
-               TString , TString , Int_t ,
-               Int_t , Int_t , Int_t 
-       )
-{
-/// \deprecated Method is going to be removed
-
-  AliFatal("Deprecated");
-  return 0;
-}
-
-
-Int_t AliMUONDataInterface::NumberOfDigits(
-               TString , TString , Int_t ,
-               Int_t , Int_t 
-       )
-{
-/// \deprecated Method is going to be removed
-
-  AliFatal("Deprecated");
-  return 0;
-}
-
-
-AliMUONDigit* AliMUONDataInterface::Digit(
-               TString , TString , Int_t ,
-               Int_t , Int_t , Int_t 
-       )
-{
-/// \deprecated Method is going to be removed
-
-  AliFatal("Deprecated");
-  return 0;
-}
-
-
-Int_t AliMUONDataInterface::NumberOfRawClusters(
-               TString , TString , Int_t , Int_t 
-       )
-{
-/// \deprecated Method is going to be removed
-
-  AliFatal("Deprecated");
-  return 0;
-}
-
-
-AliMUONRawCluster* AliMUONDataInterface::RawCluster(
-               TString , TString , Int_t ,
-               Int_t , Int_t 
-       )
-{
-/// \deprecated Method is going to be removed
+  TString sTreeLetter(treeLetter);
+  sTreeLetter.ToUpper();
+  
+  if ( sTreeLetter != "R" && sTreeLetter != "D" ) 
+  {
+    AliError(Form("Cannot handle tree%s. Use D or R",treeLetter));
+    return;
+  }
+  
+  // book ntuples
+  TNtuple tupleGlo("TgtupleGlo","Global Trigger Ntuple",
+                   "ev:slpt:shpt:uplpt:uphpt:lplpt:lplpt");
+  TNtuple tupleLoc("TgtupleLoc","Local Trigger Ntuple",
+                   "ev:LoCircuit:LoStripX:LoDev:StripY:LoLpt:LoHpt:y11:y21:x11");
+  
+  // initialize counters
+  Int_t sLowpt=0;
+  Int_t sHighpt=0;
+  Int_t uSLowpt=0;
+  Int_t uSHighpt=0;
+  Int_t lSLowpt=0;
+  Int_t lSHighpt=0;
+  
+  AliMUONGeometryTransformer transformer;
+  transformer.LoadGeometryData(Form("%s/geometry.root",
+                                    gSystem->DirName(fLoader->GetRunLoader()->GetFileName())));
+    AliMUONTriggerCircuit triggerCircuit(&transformer);
+
+  // select output file name from selected Tree
+  Char_t fileNameOut[30];
+  if (sTreeLetter == "D") 
+  {
+    AliInfo(Form("reading from Digits\n"));
+    sprintf(fileNameOut,"TriggerCheckFromDigits.root");
+  } 
+  else if (sTreeLetter == "R") 
+  {
+    AliInfo(Form("reading from RecPoints\n"));
+    sprintf(fileNameOut,"TriggerCheckFromRP.root");
+  }
+  
+  // loop on events
+  Int_t nevents = NumberOfEvents();
 
-  AliFatal("Deprecated");
-  return 0;
+  for (Int_t ievent=0; ievent<nevents; ++ievent) 
+  {
+    if (ievent%100==0) AliInfo(Form("Processing event %d\n",ievent));
+    
+    AliMUONVTriggerStore* triggerStore = TriggerStore(ievent,treeLetter);
+    
+    if (!triggerStore)
+    {
+      AliError(Form("Could not read %s from tree%s","Trigger",treeLetter));
+      return;
+    }
+    
+    // get global trigger info
+    AliMUONGlobalTrigger* gloTrg = triggerStore->Global();     
+    sLowpt+=gloTrg->SingleLpt();
+    sHighpt+=gloTrg->SingleHpt();
+    uSLowpt+=gloTrg->PairUnlikeLpt(); 
+    uSHighpt+=gloTrg->PairUnlikeHpt();
+    lSLowpt+=gloTrg->PairLikeLpt(); 
+    lSHighpt+=gloTrg->PairLikeHpt();
+    
+    // loop on local triggers  
+    TIter next(triggerStore->CreateIterator());
+    AliMUONLocalTrigger* locTrg(0x0);
+    while ( ( locTrg = static_cast<AliMUONLocalTrigger*>(next()) ) )
+    {
+      Bool_t xTrig=locTrg->IsTrigX();
+      Bool_t yTrig=locTrg->IsTrigY();
+      
+      if (xTrig && yTrig) 
+      { // fill ntuple if trigger in X and Y                   
+        tupleLoc.Fill(ievent,locTrg->LoCircuit(),
+                       locTrg->LoStripX(),
+                       locTrg->LoDev(),
+                       locTrg->LoStripY(),
+                       locTrg->LoLpt(),
+                       locTrg->LoHpt(),
+                       triggerCircuit.GetY11Pos(locTrg->LoCircuit(),locTrg->LoStripX()),
+                       triggerCircuit.GetY21Pos(locTrg->LoCircuit(),locTrg->LoStripX()+locTrg->LoDev()+1),
+                       triggerCircuit.GetX11Pos(locTrg->LoCircuit(),locTrg->LoStripY()));
+      }
+      tupleGlo.Fill(ievent,gloTrg->SingleLpt(),gloTrg->SingleHpt(),
+                     gloTrg->PairUnlikeLpt(),gloTrg->PairUnlikeHpt(),
+                     gloTrg->PairLikeLpt(),gloTrg->PairLikeHpt());
+    } // end of loop on local triggers
+  } // end of loop on events
+  
+  // print info and store ntuples
+  printf("\n");
+  printf("=============================================\n");
+  printf("================  SUMMARY  ==================\n");
+  printf("\n");
+  printf("Total number of events processed %d \n",nevents);
+  printf("\n");
+  printf(" Global Trigger output       Low pt  High pt\n");
+  printf(" number of Single           :\t");
+  printf("%i\t%i\t",sLowpt,sHighpt);
+  printf("\n");
+  printf(" number of UnlikeSign pair  :\t"); 
+  printf("%i\t%i\t",uSLowpt,uSHighpt);
+  printf("\n");
+  printf(" number of LikeSign pair    :\t");  
+  printf("%i\t%i\t",lSLowpt,lSHighpt);
+  printf("\n");
+  printf("=============================================\n");
+  fflush(stdout);    
+  
+  TFile myFile(fileNameOut, "RECREATE");
+  tupleGlo.Write();
+  tupleLoc.Write();
+  myFile.Close();
 }
 
-
-Int_t AliMUONDataInterface::NumberOfLocalTriggers(TString , TString , Int_t )
+//_____________________________________________________________________________
+Bool_t
+AliMUONDataInterface::LoadEvent(Int_t event)
 {
-/// \deprecated Method is going to be removed
-
-  AliFatal("Deprecated");
-  return 0;
+  /// Load event if different from the current one.
+  /// Returns kFALSE on error and kTRUE if the event was loaded.
+  
+  assert( IsValid() );
+  
+  AliDebug(1,Form("Loading event %d using runLoader %p",event,fLoader->GetRunLoader()));
+  if (fLoader->GetRunLoader()->GetEvent(event) == 0)
+  {
+    fCurrentEvent = event;
+    return kTRUE;
+  }
+  else
+    return kFALSE;
 }
 
-
-AliMUONLocalTrigger* AliMUONDataInterface::LocalTrigger(
-               TString , TString , Int_t , Int_t 
-       )
+//______________________________________________________________________________
+Int_t
+AliMUONDataInterface::NumberOfEvents() const
 {
-/// \deprecated Method is going to be removed
-
-  AliFatal("Deprecated");
-  return 0;
+  /// Number of events in the current galice.root file we're attached to 
+  if (not IsValid()) return -1;
+  return fLoader->GetRunLoader()->GetNumberOfEvents();
 }
 
-Bool_t AliMUONDataInterface::SetFile(TString , TString )
+//_____________________________________________________________________________
+void
+AliMUONDataInterface::Open(const char* filename)
 {
-/// \deprecated Method is going to be removed
+  /// Connect to a given galice.root file
+  
+  ResetStores();
+  
+  fCurrentEvent=-1;
+  
+  if ( fLoader != 0x0 ) 
+  {
+    delete fLoader->GetRunLoader();
+  }
+  
+  fLoader = 0x0;
+  
+  fIsValid = kTRUE;
+  
+  TString foldername(Form("%s-%d",ClassName(),fgInstanceCounter));
+  
+  while (AliRunLoader::GetRunLoader(foldername) != 0x0) 
+  {
+    delete AliRunLoader::GetRunLoader(foldername);
+  }
+  
+  AliRunLoader* runLoader = AliRunLoader::Open(filename,foldername);
+  if (runLoader == 0x0) 
+  {
+    AliError(Form("Cannot open file %s",filename));    
+    fIsValid = kFALSE;
+    return;
+  }
 
-  AliFatal("Deprecated");
-  return 0;
+  runLoader->LoadHeader();
+  if ( ! runLoader->GetHeader() ) {
+    AliError("Cannot load header.");    
+    fIsValid = kFALSE;
+  }
+  else {
+    Int_t runNumber = runLoader->GetHeader()->GetRun();
+    AliCDBManager::Instance()->SetRun(runNumber>=0 ? runNumber : 1);
+  }  
+  runLoader->UnloadHeader(); 
+
+  fLoader = runLoader->GetDetectorLoader("MUON");
+  if (fLoader == 0x0) 
+  {
+    AliError("Cannot get AliMUONLoader");
+    fIsValid = kFALSE;
+  }
+  
+  if (not IsValid())
+  {
+    AliError(Form("Could not access %s filename. Object is unuseable",filename));
+  }
 }
 
-
-Bool_t AliMUONDataInterface::GetEvent(Int_t )
+//_____________________________________________________________________________
+Bool_t AliMUONDataInterface::GetEvent(Int_t event)
 {
-/// \deprecated Method is going to be removed
+/// Loads all reconstructed data for the given event.
 
-  AliFatal("Deprecated");
-  return 0;
+  if (DigitStore(event) == 0x0) return kFALSE;
+  if (ClusterStore(event) == 0x0) return kFALSE;
+  if (TriggerStore(event) == 0x0) return kFALSE;
+  return kTRUE;
 }
 
-Int_t AliMUONDataInterface::NumberOfParticles()
+//_____________________________________________________________________________
+Int_t AliMUONDataInterface::NumberOfDigits(Int_t detElemId)
 {
-/// \deprecated Method is going to be removed
+/// Returns the number of digits to be found on a given detector element.
+/// @param detElemId  The detector element ID number to search on.
 
-  AliFatal("Deprecated");
-  return 0;
+  TIterator* iter = GetIterator(kDigitIteratorByDetectorElement, detElemId);
+  return CountObjects(iter);
 }
 
-
-TParticle* AliMUONDataInterface::Particle(Int_t )
+//_____________________________________________________________________________
+AliMUONVDigit* AliMUONDataInterface::Digit(Int_t detElemId, Int_t index)
 {
-/// \deprecated Method is going to be removed
+/// Returns the a pointer to the index'th digit on the specified detector element.
+/// @param detElemId  The detector element ID number to search on.
+/// @param index  The index number of the digit to fetch in the range [0 .. N-1],
+///   where N = NumberOfDigits(detElemId)
 
-  AliFatal("Deprecated");
-  return 0;
+  TIterator* iter = GetIterator(kDigitIteratorByDetectorElement, detElemId);
+  return static_cast<AliMUONVDigit*>( FetchObject(iter, index) );
 }
 
-
-Int_t AliMUONDataInterface::NumberOfTracks()
+//_____________________________________________________________________________
+Int_t AliMUONDataInterface::NumberOfDigits(Int_t chamber, Int_t cathode)
 {
-/// \deprecated Method is going to be removed
+/// Returns the number of digits to be found on a specific chamber and cathode.
+/// @param chamber  The chamber number in the range [0 .. 13].
+/// @param cathode  The cathode in the range [0 .. 1], where 0 is the bending and
+///   1 is the non-bending plane.
 
-  AliFatal("Deprecated");
-  return 0;
+  TIterator* iter = GetIterator(kDigitIteratorByChamberAndCathode, chamber, cathode);
+  return CountObjects(iter);
 }
 
-
-Int_t AliMUONDataInterface::NumberOfHits(Int_t )
+//_____________________________________________________________________________
+AliMUONVDigit* AliMUONDataInterface::Digit(Int_t chamber, Int_t cathode, Int_t index)
 {
-/// \deprecated Method is going to be removed
+/// Returns the a pointer to the index'th digit on the specified chamber and cathode.
+/// @param chamber  The chamber number in the range [0 .. 13].
+/// @param cathode  The cathode in the range [0 .. 1], where 0 is the bending and
+///   1 is the non-bending plane.
+/// @param index  The index number of the digit to fetch in the range [0 .. N-1],
+///   where N = NumberOfDigits(chamber, cathode)
 
-  AliFatal("Deprecated");
-  return 0;
+  TIterator* iter = GetIterator(kDigitIteratorByChamberAndCathode, chamber, cathode);
+  return static_cast<AliMUONVDigit*>( FetchObject(iter, index) );
 }
 
-
-AliMUONHit* 
-AliMUONDataInterface::Hit(Int_t , Int_t )
+//_____________________________________________________________________________
+Int_t AliMUONDataInterface::NumberOfRawClusters(Int_t chamber)
 {
-/// \deprecated Method is going to be removed
+/// Returns the number of reconstructed raw clusters on the specified chamber.
+/// @param chamber  The chamber number in the range [0 .. 13].
 
-  AliFatal("Deprecated");
-  return 0;
+  TIterator* iter = GetIterator(kRawClusterIterator, chamber);
+  return CountObjects(iter);
 }
 
-
-Int_t AliMUONDataInterface::NumberOfSDigits(Int_t , Int_t )
+//_____________________________________________________________________________
+AliMUONVCluster* AliMUONDataInterface::RawCluster(Int_t chamber, Int_t index)
 {
-/// \deprecated Method is going to be removed
+/// Returns a pointer to the index'th raw cluster on the specified chamber.
+/// @param chamber  The chamber number in the range [0 .. 13].
+/// @param index  The index number of the raw cluster to fetch in the range [0 .. N-1],
+///   where N = NumberOfRawClusters(chamber)
 
-  AliFatal("Deprecated");
-  return 0;
+  TIterator* iter = GetIterator(kRawClusterIterator, chamber);
+  return static_cast<AliMUONVCluster*>( FetchObject(iter, index) );
 }
 
-
-AliMUONDigit* AliMUONDataInterface::SDigit(Int_t , Int_t , Int_t )
+//_____________________________________________________________________________
+Int_t AliMUONDataInterface::NumberOfLocalTriggers()
 {
-/// \deprecated Method is going to be removed
-
-  AliFatal("Deprecated");
-  return 0;
+/// Returns the number of reconstructed local trigger objects.
 
+  TIterator* iter = GetIterator(kLocalTriggerIterator);
+  return CountObjects(iter);
 }
 
-
-Int_t AliMUONDataInterface::NumberOfDigits(Int_t , Int_t )
+//_____________________________________________________________________________
+AliMUONLocalTrigger* AliMUONDataInterface::LocalTrigger(Int_t index)
 {
-/// \deprecated Method is going to be removed
-
-  AliFatal("Deprecated");
-  return 0;
+/// Returns a pointer to the index'th local trigger object.
+/// @param index  The index number of the local trigger object to fetch in the range [0 .. N-1],
+///   where N = NumberOfLocalTriggers()
 
+  TIterator* iter = GetIterator(kLocalTriggerIterator);
+  return static_cast<AliMUONLocalTrigger*>( FetchObject(iter, index) );
 }
 
-
-AliMUONDigit* AliMUONDataInterface::Digit(Int_t , Int_t , Int_t )
+//_____________________________________________________________________________
+Int_t AliMUONDataInterface::NumberOfRegionalTriggers()
 {
-/// \deprecated Method is going to be removed
+/// Returns the number of regional trigger objects reconstructed.
 
-  AliFatal("Deprecated");
-  return 0;
+  TIterator* iter = GetIterator(kRegionalTriggerIterator);
+  return CountObjects(iter);
 }
 
-
-Int_t AliMUONDataInterface::NumberOfRawClusters(Int_t )
+//_____________________________________________________________________________
+AliMUONRegionalTrigger* AliMUONDataInterface::RegionalTrigger(Int_t index)
 {
-/// \deprecated Method is going to be removed
+/// Returns a pointer to the index'th regional trigger object.
+/// @param index  The index number of the regional trigger object to fetch in the range [0 .. N-1],
+///   where N = NumberOfRegionalTriggers()
 
-  AliFatal("Deprecated");
-  return 0;
+  TIterator* iter = GetIterator(kRegionalTriggerIterator);
+  return static_cast<AliMUONRegionalTrigger*>( FetchObject(iter, index) );
 }
 
-
-AliMUONRawCluster* AliMUONDataInterface::RawCluster(Int_t , Int_t )
+//_____________________________________________________________________________
+AliMUONGlobalTrigger* AliMUONDataInterface::GlobalTrigger()
 {
-/// \deprecated Method is going to be removed
+/// Returns a pointer to the reconstructed global trigger object for the event.
 
-  AliFatal("Deprecated");
-  return 0;
+  AliMUONVTriggerStore* store = TriggerStore(fCurrentEvent);
+  if (store == 0x0) return 0x0;
+  return store->Global();
 }
 
-
-Int_t AliMUONDataInterface::NumberOfLocalTriggers()
+//_____________________________________________________________________________
+void AliMUONDataInterface::ResetStores()
 {
-/// \deprecated Method is going to be removed
+/// Deletes all the store objects that have been created and resets the pointers to 0x0.
+/// The temporary iterator object is automatically reset. See ResetIterator for more details.
 
-  AliFatal("Deprecated");
-  return 0;
+  ResetIterator();
+  if (fDigitStore != 0x0)
+  {
+    delete fDigitStore;
+    fDigitStore = 0x0;
+  }
+  if (fTriggerStore != 0x0)
+  {
+    delete fTriggerStore;
+    fTriggerStore = 0x0;
+  }
+  if (fClusterStore != 0x0)
+  {
+    delete fClusterStore;
+    fClusterStore = 0x0;
+  }
 }
 
-
-AliMUONLocalTrigger* AliMUONDataInterface::LocalTrigger(Int_t )
-{
-/// \deprecated Method is going to be removed
-
-  AliFatal("Deprecated");
-  return 0;
+//_____________________________________________________________________________
+TIterator* AliMUONDataInterface::GetIterator(IteratorType type, Int_t x, Int_t y)
+{
+/// Creates an appropriate iterator object and returns it.
+/// If the iterator has already been created then that one is returned otherwise
+/// a new object is created.
+/// Depending on the value of 'type' the semantics of parameters x and y can change.
+/// @param type  The type of iterator to create.
+/// @param x  This is the detector element ID if type == kDigitIteratorByDetectorElement
+///           If type equals kDigitIteratorByChamberAndCathode or kRawClusterIterator
+///           then this is the chamber number. In all other cases this parameter is
+///           ignored.
+/// @param y  If type == kDigitIteratorByChamberAndCathode then this parameter is the
+///           cathode number. In all other cases this parameter is
+///           ignored.
+
+  if (type == fCurrentIteratorType and fDataX == x and fDataY == y)
+       return fIterator;
+  
+  if (fCurrentEvent == -1)
+  {
+    AliError("No event was selected. Try first using GetEvent().");
+    return 0x0;
+  }
+  
+  ResetIterator();
+  
+  switch (type)
+  {
+  case kDigitIteratorByDetectorElement:
+    {
+      Int_t detElem = x;
+      AliMUONVDigitStore* store = DigitStore(fCurrentEvent);
+      if (store == 0x0) return 0x0;
+      fIterator = store->CreateIterator(detElem, detElem, 2);
+      if (fIterator == 0x0) return 0x0;
+      fCurrentIteratorType = kDigitIteratorByDetectorElement;
+      fDataX = detElem;
+      return fIterator;
+    }
+    
+  case kDigitIteratorByChamberAndCathode:
+    {
+      Int_t chamber = x;
+      Int_t cathode = y;
+      if (chamber < 0 or AliMpConstants::NofChambers() <= chamber)
+      {
+        AliError(Form(
+          "Must have give a chamber value in the range [0..%d], but got a value of: %d",
+          AliMpConstants::NofChambers() - 1,
+          chamber
+        ));
+        return 0x0;
+      }
+      if (cathode < 0 or 1 < cathode)
+      {
+        AliError(Form("Must have give a cathode value in the range [0..1], but got a value of: %d", cathode));
+        return 0x0;
+      }
+      
+      AliMUONVDigitStore* store = DigitStore(fCurrentEvent);
+      if (store == 0x0) return 0x0;
+      MpPair_t pair = AliMpDEManager::GetDetElemIdRange(chamber);
+      fIterator = store->CreateIterator(AliMp::PairFirst(pair), AliMp::PairSecond(pair), cathode);
+      if (fIterator == 0x0) return 0x0;
+      fCurrentIteratorType = kDigitIteratorByChamberAndCathode;
+      fDataX = chamber;
+      fDataY = cathode;
+      return fIterator;
+    }
+    
+  case kRawClusterIterator:
+    {
+      Int_t chamber = x;
+      AliMUONVClusterStore* store = ClusterStore(fCurrentEvent);
+      if (store == 0x0) return 0x0;
+      fIterator = store->CreateChamberIterator(chamber, chamber);
+      if (fIterator == 0x0) return 0x0;
+      fCurrentIteratorType = kRawClusterIterator;
+      fDataX = chamber;
+      return fIterator;
+    }
+    
+  case kLocalTriggerIterator:
+    {
+      AliMUONVTriggerStore* store = TriggerStore(fCurrentEvent);
+      if (store == 0x0) return 0x0;
+      fIterator = store->CreateLocalIterator();
+      if (fIterator == 0x0) return 0x0;
+      fCurrentIteratorType = kLocalTriggerIterator;
+      return fIterator;
+    }
+    
+  case kRegionalTriggerIterator:
+    {
+      AliMUONVTriggerStore* store = TriggerStore(fCurrentEvent);
+      if (store == 0x0) return 0x0;
+      fIterator = store->CreateRegionalIterator();
+      if (fIterator == 0x0) return 0x0;
+      fCurrentIteratorType = kRegionalTriggerIterator;
+      return fIterator;
+    }
+    
+  default:
+    return 0x0;
+  }
 }
 
-Int_t AliMUONDataInterface::NumberOfGlobalTriggers()
+//_____________________________________________________________________________
+void AliMUONDataInterface::ResetIterator()
 {
-/// \deprecated Method is going to be removed
+/// The temporary iterator object is deleted if it exists and the pointer reset to 0x0.
+/// The iterator type and temporary data indicating the state of the iterator are
+/// also reset.
 
-  AliFatal("Deprecated");
-  return 0;
+  if (fIterator != 0x0) delete fIterator;
+  fCurrentIteratorType = kNoIterator;
+  fCurrentIndex = fDataX = fDataY = -1;
+  fIterator = 0x0;
 }
 
-AliMUONGlobalTrigger* AliMUONDataInterface::GlobalTrigger(Int_t )
+//_____________________________________________________________________________
+Int_t AliMUONDataInterface::CountObjects(TIterator* iter)
 {
-/// \deprecated Method is going to be removed
+/// Counts the number of objects in the iterator and resets it.
+/// @return The number of objects in 'iter'.
 
-  AliFatal("Deprecated");
-  return 0;
+  if (iter == 0x0) return -1;
+  Int_t count = 0;
+  iter->Reset();
+  while ( iter->Next() != 0x0 ) count++;
+  iter->Reset();
+  fCurrentIndex = -1;
+  return count;
 }
 
-Int_t AliMUONDataInterface::NumberOfRecTracks()
+//_____________________________________________________________________________
+TObject* AliMUONDataInterface::FetchObject(TIterator* iter, Int_t index)
 {
-/// \deprecated Method is going to be removed
-
-  AliFatal("Deprecated");
-  return 0;
-}
+/// Fetches the index'th object from the iterator counting the first object
+/// returned by iterator after it is reset as index == 0. The next object
+/// has index == 1 and so on where the last object returned by the iterator
+/// has index == N-1 where N = CountObjects(iter)
+/// This method will only reset the iterator if index is smaller than
+/// fCurrentIndex, which is used to track the iteration progress and is
+/// updated when a new object if returned by this method.
+/// @param iter  The iterator to fetch an object from.
+/// @param index The index number of the object to fetch in the range [0 .. N-1]
+///        where N = CountObjects(iter)
 
-AliMUONTrack* AliMUONDataInterface::RecTrack(Int_t )
-{
-/// \deprecated Method is going to be removed
+  if (index < 0)
+  {
+    AliError(Form("Index is out of bounds. Got a value of %d.", index));
+    return 0x0;
+  }
 
-  AliFatal("Deprecated");
-  return 0;
+  if (iter == 0x0) return 0x0;
+  if (index <= fCurrentIndex)
+  {
+    iter->Reset();
+    fCurrentIndex = -1;
+  }
+  
+  TObject* object = 0x0;
+  while (fCurrentIndex < index)
+  {
+    object = iter->Next();
+    if (object == 0x0)
+    {
+      AliError(Form("Index is out of bounds. Got a value of %d.", index));
+      iter->Reset();
+      fCurrentIndex = -1;
+      return 0x0;
+    }
+    fCurrentIndex++;
+  }
+  return object;
 }