]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONData.cxx
Added protection and 2 levels for problems
[u/mrichter/AliRoot.git] / MUON / AliMUONData.cxx
index 996db06b2bed6f64e82add9b8e365be225427aa1..0e877991a73ca6e0c3831cf0faa7d931fa6cb718 100644 (file)
 
 /* $Id$ */
 
-/// AliMUONData class
+/// \class AliMUONData
 ///
 /// Class containing MUON data: hits, digits, rawclusters, globaltrigger, localtrigger, etc ..
 /// The classe makes the lik between the MUON data lists and the event trees from loaders
 ///
-/// Gines Martinez, Subatech,  September 2003
+/// \author Gines Martinez, Subatech,  September 2003
 ///
 
 #include "AliMUONData.h"
-
-#include "AliLog.h"
+#include "AliMUONDataIterator.h"
 #include "AliMUONConstants.h"
-#include "AliMUONHit.h"
 #include "AliMUONDigit.h"
 #include "AliMUONGlobalTrigger.h"
 #include "AliMUONLocalTrigger.h"
 #include "AliMUONRegionalTrigger.h"
+#include "AliMUONTriggerCrateStore.h"
+#include "AliMUONTriggerCircuit.h"
+#include "AliMUONGeometryTransformer.h"
 #include "AliMUONRawCluster.h"
-#include "AliMUONTrack.h"
-#include "AliMUONTriggerTrack.h"
+
 #include "AliRunLoader.h"
-#include "TArrayI.h"
-#include "TString.h"
+#include "AliStack.h"
+#include "AliLog.h"
+
+#include <TString.h>
+#include <TParticle.h>
+#include <TNtuple.h>
+#include <Riostream.h>
+#include <TFile.h>
 
 /// \cond CLASSIMP
 ClassImp(AliMUONData)
@@ -46,78 +52,90 @@ ClassImp(AliMUONData)
 //_____________________________________________________________________________
   AliMUONData::AliMUONData():
     TNamed(),
+    fRunLoader(0x0),
     fLoader(0x0),
-    fHits(0x0),
-    fDigits(0x0),
     fSDigits(0x0),
-    fRawClusters(0x0),
+    fDigits(0x0),
     fGlobalTrigger(0x0),
     fLocalTrigger(0x0),
     fRegionalTrigger(0x0),
-    fRecTracks(0x0),
-    fRecTriggerTracks(0x0),
-    fNhits(0),
-    fNdigits(0x0),
     fNSdigits(0x0),
-    fNrawclusters(0x0),
+    fNdigits(0x0),
     fNglobaltrigger(0),
     fNlocaltrigger(0),
     fNregionaltrigger(0),
-    fNrectracks(0),
-    fNrectriggertracks(0),
     fSplitLevel(0),
     fCurrentEvent(-1)
 {
-  // Default constructor
+/// Default constructor
 }
 //_____________________________________________________________________________
 AliMUONData::AliMUONData(AliLoader * loader, const char* name, const char* title):
   TNamed(name,title),
+    fRunLoader(0x0),
     fLoader(loader),
-    fHits(0x0),
-    fDigits(0x0),
     fSDigits(0x0),
-    fRawClusters(0x0),
+    fDigits(0x0),
     fGlobalTrigger(0x0),
     fLocalTrigger(0x0),
     fRegionalTrigger(0x0),
-    fRecTracks(0x0),
-    fRecTriggerTracks(0x0),
-    fNhits(0),
-    fNdigits(0x0),
     fNSdigits(0x0),
-    fNrawclusters(0x0),
+    fNdigits(0x0),
     fNglobaltrigger(0),
     fNlocaltrigger(0),
     fNregionaltrigger(0),
-    fNrectracks(0),
-    fNrectriggertracks(0),
     fSplitLevel(0),
     fCurrentEvent(-1)
 {
 /// Standard constructor
 }
 
+//_____________________________________________________________________________
+AliMUONData::AliMUONData(const char* galiceFile, const char* folderName):
+  TNamed("MUON", "MUON"),
+    fRunLoader(0x0),
+    fLoader(0x0),
+    fSDigits(0x0),
+    fDigits(0x0),
+    fGlobalTrigger(0x0),
+    fLocalTrigger(0x0),
+    fRegionalTrigger(0x0),
+    fNSdigits(0x0),
+    fNdigits(0x0),
+    fNglobaltrigger(0),
+    fNlocaltrigger(0),
+    fNregionaltrigger(0),
+    fSplitLevel(0),
+    fCurrentEvent(-1)
+{
+/// Constructor for loading data from gAlice file
+
+  fRunLoader = AliRunLoader::Open(galiceFile, folderName, "READ");
+  if (!fRunLoader) {
+    AliError(Form("Error opening %s file \n", galiceFile));
+    return;
+  }  
+
+  fLoader = fRunLoader->GetLoader("MUONLoader");
+  if ( ! fLoader ) {
+    AliError(Form("Could get MUONLoader"));
+    return;
+  }  
+}
+
 //_____________________________________________________________________________
 AliMUONData::~AliMUONData()
 {
 /// Destructor for AliMUONData
-  if (fHits) {
-    fHits->Delete();
-    delete fHits;
-  }
   
-  if (fDigits) {
-    fDigits->Delete();
-    delete fDigits;
-  }
   if (fSDigits) {
     fSDigits->Delete();
     delete fSDigits;
   }
-  if (fRawClusters) {
-    fRawClusters->Delete();
-    delete fRawClusters;
+
+  if (fDigits) {
+    fDigits->Delete();
+    delete fDigits;
   }
   if (fGlobalTrigger){
     fGlobalTrigger->Delete();
@@ -131,78 +149,27 @@ AliMUONData::~AliMUONData()
     fLocalTrigger->Delete();
     delete fLocalTrigger;
   }
-  if (fRecTracks){
-    fRecTracks->Delete();
-    delete fRecTracks;
-  }
-  if (fRecTriggerTracks){
-    fRecTriggerTracks->Delete();
-    delete fRecTriggerTracks;
-  }
-}
-//____________________________________________________________________________
-void AliMUONData::AddHit(Int_t fIshunt, Int_t track, Int_t iChamber, 
-                        Int_t idpart, Float_t X, Float_t Y, Float_t Z, 
-                        Float_t tof, Float_t momentum, Float_t theta, 
-                        Float_t phi, Float_t length, Float_t destep,
-                        Float_t Xref,Float_t Yref,Float_t Zref)
-{
-/// Add new hit to the hit list
-
-  TClonesArray &lhits = *fHits;
-  new(lhits[fNhits++]) AliMUONHit(fIshunt, track, iChamber, 
-                                 idpart, X, Y, Z, 
-                                 tof, momentum, theta, 
-                                 phi, length, destep,
-                                 Xref,Yref,Zref);
-}
-//____________________________________________________________________________
-void AliMUONData::AddHit2(Int_t fIshunt, Int_t track, Int_t detElemId, 
-                        Int_t idpart, Float_t X, Float_t Y, Float_t Z, 
-                        Float_t tof, Float_t momentum, Float_t theta, 
-                        Float_t phi, Float_t length, Float_t destep,
-                        Float_t Xref,Float_t Yref,Float_t Zref)
-{
- // Add new hit to the hit list
-
-  TClonesArray &lhits = *fHits;
-  new(lhits[fNhits++]) AliMUONHit(fIshunt, track, detElemId, 
-                                 idpart, X, Y, Z, 
-                                 tof, momentum, theta, 
-                                 phi, length, destep,
-                                 Xref,Yref,Zref, true);
-}
-//_____________________________________________________________________________
-void AliMUONData::AddDigit(Int_t id, Int_t *tracks, Int_t *charges, Int_t *digits)
-{
-/// Add a MUON digit to the list of Digits of the detection plane id
-  TClonesArray &ldigits = * Digits(id) ; 
-  new(ldigits[fNdigits[id]++]) AliMUONDigit(tracks,charges,digits);
-}
-//_____________________________________________________________________________
-void AliMUONData::AddDigit(Int_t id, const AliMUONDigit& digit)
-{
-/// Add a MUON digit to the list of Digits of the detection plane id
 
-  TClonesArray &ldigits = * Digits(id) ; 
-  new(ldigits[fNdigits[id]++]) AliMUONDigit(digit);
+  if (fRunLoader) {
+    fRunLoader->UnloadAll();
+    delete fRunLoader;
+  }  
 }
 //_____________________________________________________________________________
-void AliMUONData::AddSDigit(Int_t id, Int_t *tracks, Int_t *charges, Int_t *sdigits)
+void AliMUONData::AddSDigit(Int_t id, const AliMUONDigit& Sdigit)
 {
 /// Add a MUON Sdigit to the list of SDigits of the detection plane id
 
   TClonesArray &lSdigits = * SDigits(id) ; 
-  new(lSdigits[fNSdigits[id]++]) AliMUONDigit(tracks,charges,sdigits);
+  new(lSdigits[fNSdigits[id]++]) AliMUONDigit(Sdigit);
 }
 //_____________________________________________________________________________
-void AliMUONData::AddSDigit(Int_t id, const AliMUONDigit& Sdigit)
+void AliMUONData::AddDigit(Int_t id, const AliMUONDigit& digit)
 {
-/// Add a MUON Sdigit to the list of SDigits of the detection plane id
+/// Add a MUON digit to the list of Digits of the detection plane id
 
-  TClonesArray &lSdigits = * SDigits(id) ; 
-  new(lSdigits[fNSdigits[id]++]) AliMUONDigit(Sdigit);
+  TClonesArray &ldigits = * Digits(id) ; 
+  new(ldigits[fNdigits[id]++]) AliMUONDigit(digit);
 }
 
 //_____________________________________________________________________________
@@ -230,40 +197,6 @@ void AliMUONData::AddLocalTrigger(const  AliMUONLocalTrigger& trigger)
   new(localTrigger[fNlocaltrigger++]) AliMUONLocalTrigger(trigger);
 }
 
-//_____________________________________________________________________________
-void AliMUONData::AddRawCluster(Int_t id, const AliMUONRawCluster& c)
-{
-/// Add a MUON rawcluster to the list in the detection plane id
-
-  TClonesArray &lrawcl = *((TClonesArray*) fRawClusters->At(id));
-  new(lrawcl[fNrawclusters[id]++]) AliMUONRawCluster(c);
-}
-//_____________________________________________________________________________
-void AliMUONData::AddRecTrack(const AliMUONTrack& track)
-{
-/// Add a MUON rectrack
-
-  TClonesArray &lrectracks = *fRecTracks;
-  new(lrectracks[fNrectracks++]) AliMUONTrack(track);
-}
-//_____________________________________________________________________________
-void AliMUONData::AddRecTriggerTrack(const AliMUONTriggerTrack& triggertrack)
-{
-/// Add a MUON triggerrectrack
-
-  TClonesArray &lrectriggertracks = *fRecTriggerTracks;  
-  new(lrectriggertracks[fNrectriggertracks++]) AliMUONTriggerTrack(triggertrack);
-}
-//____________________________________________________________________________
-TClonesArray*  AliMUONData::Digits(Int_t DetectionPlane) const
-{
-/// Getting List of Digits
-
-  if (fDigits)
-    return ( (TClonesArray*) fDigits->At(DetectionPlane) );
-  else
-    return NULL;
-}
 //____________________________________________________________________________
 TClonesArray*  AliMUONData::SDigits(Int_t DetectionPlane) const
 {
@@ -275,27 +208,19 @@ TClonesArray*  AliMUONData::SDigits(Int_t DetectionPlane) const
     return NULL;
 }
 //____________________________________________________________________________
-Bool_t   AliMUONData::IsRawClusterBranchesInTree()
+TClonesArray*  AliMUONData::Digits(Int_t DetectionPlane) const
 {
-/// Checking if there are RawCluster Branches In TreeR
+/// Getting List of Digits
 
-  if (TreeR()==0x0) {
-    AliError("No treeR in memory");
-    return kFALSE;
-  }
-  else {
-     char branchname[30];
-     sprintf(branchname,"%sRawClusters1",GetName());
-     TBranch * branch = 0x0;
-     branch = TreeR()->GetBranch(branchname);
-     if (branch)  return kTRUE;
-     else return kFALSE;    
-  }
+  if (fDigits)
+    return ( (TClonesArray*) fDigits->At(DetectionPlane) );
+  else
+    return NULL;
 }
 //____________________________________________________________________________
 Bool_t   AliMUONData::IsDigitsBranchesInTree()
 {
-/// Checking if there are RawCluster Branches In TreeR
+/// Checking if there are Digits Branches In TreeD
 
   if (TreeD()==0x0) {
     AliError("No treeD in memory");
@@ -311,26 +236,9 @@ Bool_t   AliMUONData::IsDigitsBranchesInTree()
   }
 }
 //____________________________________________________________________________
-Bool_t   AliMUONData::IsTriggerBranchesInTree()
-{
-/// Checking if there are Trigger Branches In TreeR
- if (TreeR()==0x0) {
-    AliError("No treeR in memory");
-    return kFALSE;
-  }
-  else {
-     char branchname[30];
-     sprintf(branchname,"%sLocalTrigger",GetName());
-     TBranch * branch = 0x0;
-     branch = TreeR()->GetBranch(branchname);
-     if (branch)  return kTRUE;
-     else return kFALSE;    
-  }
-}
-//____________________________________________________________________________
 Bool_t   AliMUONData::IsTriggerBranchesInTreeD()
 {
-/// Checking if there are Trigger Branches In TreeR
+/// Checking if there are Trigger Branches In TreeD
  if (TreeD()==0x0) {
     AliError("No treeD in memory");
     return kFALSE;
@@ -345,64 +253,24 @@ Bool_t   AliMUONData::IsTriggerBranchesInTreeD()
   }
 }
 
-//____________________________________________________________________________
-Bool_t   AliMUONData::IsTrackBranchesInTree()
-{
-/// Checking if there are Track Branches In TreeT
-  if (TreeT()==0x0) {
-    AliError("No treeT in memory");
-    return kFALSE;
-  }
-  else {
-     char branchname[30];
-     sprintf(branchname,"%sTrack",GetName());
-     TBranch * branch = 0x0;
-     branch = TreeT()->GetBranch(branchname);
-     if (branch)  return kTRUE;
-     else return kFALSE;    
-  }
-}
-//____________________________________________________________________________
-Bool_t   AliMUONData::IsTriggerTrackBranchesInTree()
-{
-/// Checking if there are TriggerTrack Branches In TreeT
-  if (TreeT()==0x0) {
-    AliError("No treeT in memory");
-    return kFALSE;
-  }
-  else {
-     char branchname[30];
-     sprintf(branchname,"%sTriggerTrack",GetName());
-     TBranch * branch = 0x0;
-     branch = TreeT()->GetBranch(branchname);
-     if (branch)  return kTRUE;
-     else return kFALSE;    
-  }
-}
 //____________________________________________________________________________
 void AliMUONData::Fill(Option_t* option)
 {
 /// Method to fill the trees
-  const char *cH   = strstr(option,"H");
-  const char *cD   = strstr(option,"D");   // Digits branches in TreeD
+
   const char *cS   = strstr(option,"S");   // SDigits branches in TreeS
-  const char *cRC  = strstr(option,"RC");  // RawCluster branches in TreeR
+  const char *cD   = strstr(option,"D");   // Digits branches in TreeD
   const char *cGLT = strstr(option,"GLT"); // Global and Local Trigger branches in TreeD
-  const char *cTC = strstr(option,"TC");   // global and local Trigger branches Copy in TreeR
-  const char *cRT  = strstr(option,"RT");  // Reconstructed Track in TreeT
-  const char *cRL = strstr(option,"RL");   // Reconstructed Trigger Track in TreeT
-
-  //const char *cRP  = strstr(option,"RP");  // Reconstructed Particle in TreeP
   
   char branchname[30];
   TBranch * branch = 0x0;
 
-  // Filling TreeH
-  if ( TreeH() && cH 
+  // Filling TreeS
+  if ( TreeS() && cS
   {
-    TreeH()->Fill();
-  }  
+    TreeS()->Fill();
+  }
+
   // Filling TreeD
 
   if ( TreeD() && cD && cGLT )
@@ -450,97 +318,6 @@ void AliMUONData::Fill(Option_t* option)
       }
     }
   } // end of TreeD() handling.
-
-  // Filling TreeS
-  if ( TreeS() && cS) 
-  {
-    TreeS()->Fill();
-  }
-
-  // Filling TreeR
-  
-  if ( TreeR() && cRC && cTC )
-  {
-    TreeR()->Fill();
-  }
-  else
-  {  
-    if ( TreeR()  && cRC ) 
-    {
-      if ( IsTriggerBranchesInTree() ) 
-      {
-      // Branch per branch filling
-        for (int i=0; i<AliMUONConstants::NTrackingCh(); i++) 
-        {
-          sprintf(branchname,"%sRawClusters%d",GetName(),i+1);
-          branch = TreeR()->GetBranch(branchname);
-          branch->Fill();
-        }
-      }
-      else  
-      {
-        TreeR()->Fill();
-      }
-    }
-    
-    if ( TreeR()  && cTC) 
-    {
-      if (IsRawClusterBranchesInTree()) 
-      {
-        // Branch per branch filling
-        sprintf(branchname,"%sLocalTrigger",GetName());
-        branch = TreeR()->GetBranch(branchname); 
-        branch->Fill();
-       sprintf(branchname,"%sRegionalTrigger",GetName());
-        branch = TreeR()->GetBranch(branchname); 
-        branch->Fill();
-        sprintf(branchname,"%sGlobalTrigger",GetName());
-        branch = TreeR()->GetBranch(branchname);
-        branch->Fill();
-      }
-      else
-      {
-        TreeR()->Fill();
-      }
-    }
-  }
-
-  // Filling TreeT
-  
-  if ( TreeT() && cRT && cRL )
-  {
-    TreeT()->Fill();
-  }
-  else
-  {
-    if ( TreeT() && cRT ) 
-    {
-      if (IsTriggerTrackBranchesInTree()) 
-      {
-        sprintf(branchname,"%sTrack",GetName());  
-        branch = TreeT()->GetBranch(branchname);
-        branch->Fill();
-      }
-      else 
-      {
-        TreeT()->Fill();
-      }
-    }
-
-    if ( TreeT() && cRL ) 
-    {
-      if (IsTrackBranchesInTree()) 
-      {
-        sprintf(branchname,"%sTriggerTrack",GetName());  
-        branch = TreeT()->GetBranch(branchname);
-        branch->Fill();
-      }    
-      else 
-      {
-        TreeT()->Fill();
-      }
-    }
-  }
 }
 
 //_____________________________________________________________________________
@@ -551,39 +328,32 @@ void AliMUONData::MakeBranch(Option_t* option)
   const Int_t kBufferSize = 4000;
   char branchname[30];
   
-  
-  const char *cH   = strstr(option,"H");
-  const char *cD   = strstr(option,"D");   // Digits branches in TreeD
+  //Setting Data Container
+  SetDataContainer(option);  
+
   const char *cS   = strstr(option,"S");   // Digits branches in TreeS
-  const char *cRC  = strstr(option,"RC");  // RawCluster branches in TreeR
+  const char *cD   = strstr(option,"D");   // Digits branches in TreeD
   const char *cGLT = strstr(option,"GLT"); // Global and Local Trigger branches in TreeD
-  const char *cTC  = strstr(option,"TC");   // global and local Trigger branches Copy in TreeR
-  const char *cRT  = strstr(option,"RT");  // Reconstructed Track in TreeT
-  const char *cRL  = strstr(option,"RL");  // Reconstructed Trigger Track in TreeT
-                                           //const char *cRP  = strstr(option,"RP");  // Reconstructed Particle in TreeP
   
   TBranch * branch = 0x0;
   
-  // Creating Branches for Hits
-  if (TreeH() && cH) {
-    
-    if (fHits == 0x0)  {
-      fHits = new TClonesArray("AliMUONHit",1000);
-      //       if (gAlice->GetMCApp())
-      //         gAlice->GetMCApp()->AddHitList (fHits);
-    }
-    
-    fNhits = 0;
-    sprintf(branchname,"%sHits",GetName());  
-    branch = TreeH()->GetBranch(branchname);
-    if (branch) {  
-      AliInfo(Form("MakeBranch","Branch %s is already in tree.",branchname));
-      return ;
+  //Creating Branches for SDigits
+  if (TreeS() && cS ) {
+    // one branch for Sdigits per chamber
+    for (Int_t iDetectionPlane=0; iDetectionPlane<AliMUONConstants::NCh() ;iDetectionPlane++) {
+      sprintf(branchname,"%sSDigits%d",GetName(),iDetectionPlane+1);
+      branch = 0x0;
+      branch = TreeS()->GetBranch(branchname);
+      if (branch) {  
+        AliInfo(Form("Branch %s is already in tree.",branchname));
+        return;
+      }
+      TClonesArray * sdigits = SDigits(iDetectionPlane); 
+      branch = TreeS()->Branch(branchname, &sdigits, kBufferSize,1);
+      //Info("MakeBranch","Making Branch %s for sdigits in detection plane %d\n",branchname,iDetectionPlane+1);
     }
-    branch = TreeH()->Branch(branchname,&fHits,kBufferSize);
-    //Info("MakeBranch","Making Branch %s for hits \n",branchname);
-  }  
-  
+  }
+
   //Creating Branches for Digits
   TTree* treeD = 0x0;
   if ( cD || cGLT )
@@ -594,24 +364,6 @@ void AliMUONData::MakeBranch(Option_t* option)
   if ( treeD && cD ) 
   {
     // one branch for digits per chamber
-    if (fDigits  == 0x0) 
-    {
-      fDigits  = new TObjArray(AliMUONConstants::NCh());
-      for (Int_t iDetectionPlane=0; iDetectionPlane<AliMUONConstants::NCh() ;iDetectionPlane++) 
-      {
-        TClonesArray * tca = new TClonesArray("AliMUONDigit",10000);
-        tca->SetOwner();
-        fDigits->AddAt(tca,iDetectionPlane); 
-      }
-    }
-    if (fNdigits == 0x0) 
-    {
-      fNdigits = new Int_t[AliMUONConstants::NCh()];
-      for (Int_t iDetectionPlane=0; iDetectionPlane<AliMUONConstants::NCh() ;iDetectionPlane++) 
-      {
-        fNdigits[iDetectionPlane]=0;
-      }
-    }
     for (Int_t iDetectionPlane=0; iDetectionPlane<AliMUONConstants::NCh() ;iDetectionPlane++) 
     {
       sprintf(branchname,"%sDigits%d",GetName(),iDetectionPlane+1);
@@ -632,12 +384,6 @@ void AliMUONData::MakeBranch(Option_t* option)
     // one branch for global trigger
     //
     sprintf(branchname,"%sGlobalTrigger",GetName());
-    
-    if (fGlobalTrigger == 0x0) 
-    {
-      fGlobalTrigger = new TClonesArray("AliMUONGlobalTrigger"); 
-      fNglobaltrigger = 0;
-    }
     branch = treeD->GetBranch(branchname);
     if (branch) 
     {  
@@ -651,12 +397,6 @@ void AliMUONData::MakeBranch(Option_t* option)
     //  
     sprintf(branchname,"%sRegionalTrigger",GetName());
     branch = 0x0;
-    
-    if (fRegionalTrigger == 0x0) 
-    {
-      fRegionalTrigger  = new TClonesArray("AliMUONRegionalTrigger",16);
-      fNregionaltrigger = 0;
-    }
     branch = treeD->GetBranch(branchname);
     if (branch) 
     {  
@@ -671,12 +411,6 @@ void AliMUONData::MakeBranch(Option_t* option)
     //  
     sprintf(branchname,"%sLocalTrigger",GetName());
     branch = 0x0;
-    
-    if (fLocalTrigger == 0x0) 
-    {
-      fLocalTrigger  = new TClonesArray("AliMUONLocalTrigger",234);
-      fNlocaltrigger = 0;
-    }
     branch = treeD->GetBranch(branchname);
     if (branch) 
     {  
@@ -685,170 +419,24 @@ void AliMUONData::MakeBranch(Option_t* option)
     }
     branch = treeD->Branch(branchname, &fLocalTrigger, kBufferSize);
   }
-    
-  //Creating Branches for SDigits
-  if (TreeS() && cS ) {
-    // one branch for Sdigits per chamber
-    if (fSDigits  == 0x0) {
-      fSDigits  = new TObjArray(AliMUONConstants::NCh());
-      for (Int_t iDetectionPlane=0; iDetectionPlane<AliMUONConstants::NCh() ;iDetectionPlane++) {
-        TClonesArray * tca = new TClonesArray("AliMUONDigit",10000);
-        tca->SetOwner();
-        fSDigits->AddAt(tca,iDetectionPlane); 
-      }
-    }
-    if (fNSdigits == 0x0) {
-      fNSdigits = new Int_t[AliMUONConstants::NCh()];
-      for (Int_t iDetectionPlane=0; iDetectionPlane<AliMUONConstants::NCh() ;iDetectionPlane++) {
-        fNSdigits[iDetectionPlane]=0;
-      }
-    }
-    for (Int_t iDetectionPlane=0; iDetectionPlane<AliMUONConstants::NCh() ;iDetectionPlane++) {
-      sprintf(branchname,"%sSDigits%d",GetName(),iDetectionPlane+1);
-      branch = 0x0;
-      branch = TreeS()->GetBranch(branchname);
-      if (branch) {  
-        AliInfo(Form("Branch %s is already in tree.",branchname));
-        return;
-      }
-      TClonesArray * sdigits = SDigits(iDetectionPlane); 
-      branch = TreeS()->Branch(branchname, &sdigits, kBufferSize,1);
-      //Info("MakeBranch","Making Branch %s for sdigits in detection plane %d\n",branchname,iDetectionPlane+1);
-    }
-  }
-  
-  if (TreeR() && cRC ) {
-    //  one branch for raw clusters per tracking detection plane
-    //        
-    Int_t i;
-    if (fRawClusters == 0x0) {
-      fRawClusters = new TObjArray(AliMUONConstants::NTrackingCh());
-      for (Int_t i=0; i<AliMUONConstants::NTrackingCh();i++) {
-        TClonesArray * tca = new TClonesArray("AliMUONRawCluster",1000);
-        tca->SetOwner();
-        fRawClusters->AddAt(tca,i); 
-      }
-    }
-    
-    if (fNrawclusters == 0x0) {
-      fNrawclusters= new Int_t[AliMUONConstants::NTrackingCh()];
-      for (Int_t i=0; i<AliMUONConstants::NTrackingCh();i++) {
-        fNrawclusters[i]=0;
-      }
-    }
-    
-    for (i=0; i<AliMUONConstants::NTrackingCh() ;i++) {
-      sprintf(branchname,"%sRawClusters%d",GetName(),i+1);     
-      branch = 0x0;
-      branch = TreeR()->GetBranch(branchname);
-      if (branch) {  
-        AliInfo(Form("Branch %s is already in tree.",branchname));
-        return;
-      }
-      branch = TreeR()->Branch(branchname, &((*fRawClusters)[i]),kBufferSize);
-      //Info("MakeBranch","Making Branch %s for rawcluster in detection plane %d\n",branchname,i+1);
-    }
-  }
-  
-  if (TreeR() && cTC ) {
-    //
-    // one branch for global trigger
-    //
-    sprintf(branchname,"%sGlobalTrigger",GetName());
-    branch = 0x0;
-    
-    if (fGlobalTrigger == 0x0) {
-      fGlobalTrigger = new TClonesArray("AliMUONGlobalTrigger"); 
-      fNglobaltrigger = 0;
-    }
-    branch = TreeR()->GetBranch(branchname);
-    if (branch) {  
-      AliInfo(Form("Branch GlobalTrigger is already in treeR."));
-      return ;
-    }
-    branch = TreeR()->Branch(branchname, &fGlobalTrigger, kBufferSize);
-    //Info("MakeBranch", "Making Branch %s for Global Trigger\n",branchname);
-
-  //
-    // one branch for regional trigger
-    //  
-    sprintf(branchname,"%sRegionalTrigger",GetName());
-    branch = 0x0;
-    
-    if (fRegionalTrigger == 0x0) {
-      fRegionalTrigger  = new TClonesArray("AliMUONRegionalTrigger",16);
-      fNregionaltrigger = 0;
-    }
-    branch = TreeR()->GetBranch(branchname);
-    if (branch) {  
-      AliInfo(Form("Branch RegionalTrigger is already in treeR."));
-      return;
-    }
-    branch = TreeR()->Branch(branchname, &fRegionalTrigger, kBufferSize);
-     
-    //
-    // one branch for local trigger
-    //  
-    sprintf(branchname,"%sLocalTrigger",GetName());
-    branch = 0x0;
-    
-    if (fLocalTrigger == 0x0) {
-      fLocalTrigger  = new TClonesArray("AliMUONLocalTrigger",234);
-      fNlocaltrigger = 0;
-    }
-    branch = TreeR()->GetBranch(branchname);
-    if (branch) {  
-      AliInfo(Form("Branch LocalTrigger is already in treeR."));
-      return;
-    }
-    branch = TreeR()->Branch(branchname, &fLocalTrigger, kBufferSize);
-    //Info("MakeBranch", "Making Branch %s for Global Trigger\n",branchname);  
-  }
-  
-  if (TreeT() && cRT ) {
-    if (fRecTracks == 0x0)  fRecTracks = new TClonesArray("AliMUONTrack",100);
-    fNrectracks = 0;
-    sprintf(branchname,"%sTrack",GetName());  
-    branch = TreeT()->GetBranch(branchname);
-    if (branch) {  
-      AliInfo(Form("Branch %s is already in tree.",GetName()));
-      return ;
-    }
-    branch = TreeT()->Branch(branchname,&fRecTracks,kBufferSize);
-    //Info("MakeBranch","Making Branch %s for tracks \n",branchname);
-  }  
-  // trigger tracks
-  if (TreeT() && cRL ) {
-    if (fRecTriggerTracks == 0x0)  fRecTriggerTracks = new TClonesArray("AliMUONTriggerTrack",100);
-    fNrectriggertracks = 0;
-    sprintf(branchname,"%sTriggerTrack",GetName());  
-    branch = TreeT()->GetBranch(branchname);
-    if (branch) {  
-      AliInfo(Form("Branch %s is already in tree.",GetName()));
-      return ;
-    }
-    branch = TreeT()->Branch(branchname,&fRecTriggerTracks,kBufferSize);
-    //Info("MakeBranch","Making Branch %s for trigger tracks \n",branchname);
-  }  
 }
+
 //____________________________________________________________________________
-TClonesArray*  AliMUONData::RawClusters(Int_t DetectionPlane)
+TClonesArray*  
+AliMUONData::LocalTrigger() const
 {
-/// Getting Raw Clusters
+/// Getting local trigger
 
-  if (fRawClusters) 
-    return ( (TClonesArray*) fRawClusters->At(DetectionPlane) );
-  else
-    return NULL;
+  return fLocalTrigger;
 }
 
 //____________________________________________________________________________
 TClonesArray*  
-AliMUONData::LocalTrigger() const
+AliMUONData::RegionalTrigger() const
 {
-/// Getting local trigger
+/// Getting regional trigger
 
-  return fLocalTrigger;
+  return fRegionalTrigger;
 }
 
 //____________________________________________________________________________
@@ -876,17 +464,6 @@ AliMUONData::GlobalTrigger() const
   return fGlobalTrigger;
 }
 
-//____________________________________________________________________________
-void AliMUONData::ResetDigits()
-{
-/// Reset number of digits and the digits array for this detector
-
-    if (fDigits == 0x0) return;
-    for ( int i=0;i<AliMUONConstants::NCh();i++ ) {
-      if ((*fDigits)[i])    ((TClonesArray*)fDigits->At(i))->Clear("C");
-      if (fNdigits)  fNdigits[i]=0;
-    }
-}
 //____________________________________________________________________________
 void AliMUONData::ResetSDigits()
 {
@@ -898,23 +475,16 @@ void AliMUONData::ResetSDigits()
       if (fNSdigits)  fNSdigits[i]=0;
     }
 }
-//______________________________________________________________________________
-void AliMUONData::ResetHits()
-{
-/// Reset number of clusters and the cluster array for this detector
-
-  fNhits   = 0;
-  if (fHits) fHits->Clear();
-}
-//_______________________________________________________________________________
-void AliMUONData::ResetRawClusters()
+//____________________________________________________________________________
+void AliMUONData::ResetDigits()
 {
-/// Reset number of raw clusters and the raw clust array for this detector
+/// Reset number of digits and the digits array for this detector
 
-  for ( int i=0;i<AliMUONConstants::NTrackingCh();i++ ) {
-    if ((*fRawClusters)[i])    ((TClonesArray*)fRawClusters->At(i))->Clear();
-    if (fNrawclusters)  fNrawclusters[i]=0;
-  }
+    if (fDigits == 0x0) return;
+    for ( int i=0;i<AliMUONConstants::NCh();i++ ) {
+      if ((*fDigits)[i])    ((TClonesArray*)fDigits->At(i))->Clear("C");
+      if (fNdigits)  fNdigits[i]=0;
+    }
 }
 //_______________________________________________________________________________
 void AliMUONData::ResetTrigger()
@@ -930,85 +500,109 @@ void AliMUONData::ResetTrigger()
 
 }
 //____________________________________________________________________________
-void AliMUONData::ResetRecTracks()
+void AliMUONData::SetDataContainer(Option_t* option)
 {
-/// Reset tracks information
+/// Setting data containers of muon data
 
-  fNrectracks = 0;
-  if (fRecTracks) fRecTracks->Delete(); // necessary to delete in case of memory allocation
-}
-//____________________________________________________________________________
-void AliMUONData::ResetRecTriggerTracks()
-{
-/// Reset tracks information
-
-  fNrectriggertracks = 0;
-  if (fRecTriggerTracks) fRecTriggerTracks->Delete(); // necessary to delete in case of memory allocation
-}
-//_____________________________________________________________________________
-void AliMUONData::SetTreeAddress(Option_t* option)
-{
-/// Setting Addresses to the events trees
+  const char *cS   = strstr(option,"S");   // SDigits
+  const char *cD   = strstr(option,"D");   // Digits
+  const char *cGLT = strstr(option,"GLT"); // Global and Local Trigger
 
-  const char *cH   = strstr(option,"H");
-  const char *cD   = strstr(option,"D");   // Digits branches in TreeD
-  const char *cS   = strstr(option,"S");   // SDigits branches in TreeS
-  const char *cRC  = strstr(option,"RC");  // RawCluster branches in TreeR
-  const char *cGLT = strstr(option,"GLT"); // Global and Local Trigger branches in TreeD
-  const char *cTC = strstr(option,"TC");   // global and local Trigger branches Copy in TreeR
-  const char *cRT  = strstr(option,"RT");  // Reconstructed Track in TreeT
-  const char *cRL  = strstr(option,"RL");  // Reconstructed Trigger Track in TreeT
-                                           //const char *cRP  = strstr(option,"RP");  // Reconstructed Particle in TreeP
-  
-  // Set branch address for the Hits, Digits, RawClusters, GlobalTrigger and LocalTrigger Tree.
-  char branchname[30];
-  TBranch * branch = 0x0;
-  
   AliDebug(1,Form("option=%s",option));
+  
   //
-  // Branch address for hit tree
-  if ( TreeH() && cH ) {
-    if (fHits == 0x0) {
-      fHits     = new TClonesArray("AliMUONHit",1000);
-      //       if (gAlice->GetMCApp())
-      //  gAlice->GetMCApp()->AddHitList (fHits);  Moved to AliMUON
-    }
-    fNhits =0;
-  } 
-  if (TreeH() && fHits && cH) {
-    sprintf(branchname,"%sHits",GetName());  
-    branch = TreeH()->GetBranch(branchname);
-    if (branch) {
-      //      Info("SetTreeAddress","(%s) Setting for Hits",GetName());
-      branch->SetAddress(&fHits);
+  // Container for Sdigits
+  if (cS) {
+    if (fSDigits == 0x0) { 
+      AliDebug(1,"Creating fSDigits TObjArray");
+      fSDigits = new TObjArray(AliMUONConstants::NCh());
+      fNSdigits= new Int_t[AliMUONConstants::NCh()];
+      for (Int_t i=0; i<AliMUONConstants::NCh() ;i++) {
+       TClonesArray* a = new TClonesArray("AliMUONDigit",10000);
+       a->SetOwner();
+       fSDigits->AddAt(a,i);
+       AliDebug(1,Form("fSDigits[%d]=%p",i,a));
+        fNSdigits[i]=0;
+      }
     }
-    else { //can be invoked before branch creation
-      AliWarning(Form("(%s) Failed for Hits. Can not find branch in tree.",GetName()));
+    else {
+      AliDebug(1,Form("fSDigits already there = %p",fSDigits));
     }
-  }
-  
+    ResetSDigits();
+  }  
+
   //
-  // Branch address for digit tree
-  if ( TreeD() ) {      
-    if (fDigits == 0x0 && cD) {
+  // ObjArray of ClonesArrays for Digits
+  if ( cD ) {      
+    if (fDigits == 0x0 ) {
       fDigits = new TObjArray(AliMUONConstants::NCh());
       fNdigits= new Int_t[AliMUONConstants::NCh()];
       for (Int_t i=0; i<AliMUONConstants::NCh() ;i++) {
-        fDigits->AddAt(new TClonesArray("AliMUONDigit",10000),i); 
+       TClonesArray * tca = new TClonesArray("AliMUONDigit",10000);
+       tca->SetOwner();
+        fDigits->AddAt(tca,i); 
         fNdigits[i]=0;
       }
+    } 
+    else {
+      AliDebug(1,Form("fDigits already there = %p",fDigits));
     }
-    if (fLocalTrigger == 0x0 && cGLT) {
+    ResetDigits();
+  }
+
+  //
+  // ClonesArrays for Trigger
+  if ( cGLT ) { 
+    if (fLocalTrigger == 0x0) {
       fLocalTrigger  = new TClonesArray("AliMUONLocalTrigger",234);
     }
-    if (fRegionalTrigger == 0x0 && cGLT) {
+    if (fRegionalTrigger == 0x0) {
       fRegionalTrigger  = new TClonesArray("AliMUONRegionalTrigger",16);
     }
-    if (fGlobalTrigger== 0x0 && cGLT) {
+    if (fGlobalTrigger== 0x0) {
       fGlobalTrigger = new TClonesArray("AliMUONGlobalTrigger",1); 
     }
+    ResetTrigger();
   }
+}
+
+//____________________________________________________________________________
+void AliMUONData::SetTreeAddress(Option_t* option)
+{
+  // Setting Data containers
+  SetDataContainer(option);
+
+/// Setting Addresses to the events trees
+
+  const char *cS   = strstr(option,"S");   // SDigits branches in TreeS
+  const char *cD   = strstr(option,"D");   // Digits branches in TreeD
+  const char *cGLT = strstr(option,"GLT"); // Global and Local Trigger branches in TreeD
   
+  // Set branch address for the Hits, Digits, RawClusters, GlobalTrigger and LocalTrigger Tree.
+  char branchname[30];
+  TBranch * branch = 0x0;
+  
+  AliDebug(1,Form("option=%s",option));
+  
+  //
+  // Branch address for Sdigit tree
+  if (TreeS() && fSDigits && cS) {
+    AliDebug(1,"Setting branch addresses");
+    for (int i=0; i<AliMUONConstants::NCh(); i++) {
+      sprintf(branchname,"%sSDigits%d",GetName(),i+1);
+      if (fSDigits) {
+        AliDebug(1,Form("TreeS=%p for ich=%d branchname=%s",
+                        TreeS(),i,branchname));
+        branch = TreeS()->GetBranch(branchname);
+        TClonesArray * sdigits = SDigits(i);
+        if (branch) branch->SetAddress( &sdigits );
+        else AliWarning(Form("(%s) Failed for SDigits Detection plane %d. Can not find branch in tree.",GetName(),i));
+      }
+    }
+  }
+
+  //
+  // Branch address for digit tree
   if (TreeD() && fDigits && cD) {
     for (int i=0; i<AliMUONConstants::NCh(); i++) {
       sprintf(branchname,"%sDigits%d",GetName(),i+1);
@@ -1040,125 +634,6 @@ void AliMUONData::SetTreeAddress(Option_t* option)
     if (branch) branch->SetAddress(&fGlobalTrigger);
     else AliWarning(Form("(%s) Failed for GlobalTrigger. Can not find branch in treeD.",GetName()));
   }
-  
-  //
-  // Branch address for Sdigit tree
-  if ( TreeS() && cS) 
-  {
-    if (fSDigits == 0x0) 
-    { 
-      AliDebug(1,"Creating fSDigits TObjArray");
-      fSDigits = new TObjArray(AliMUONConstants::NCh());
-      fNSdigits= new Int_t[AliMUONConstants::NCh()];
-      for (Int_t i=0; i<AliMUONConstants::NCh() ;i++) 
-      {
-        TClonesArray* a = new TClonesArray("AliMUONDigit",10000);
-        fSDigits->AddAt(a,i);
-        AliDebug(1,Form("fSDigits[%d]=%p",i,a));
-        fNSdigits[i]=0;
-      }
-    }
-    else
-    {
-      AliDebug(1,Form("fSDigits already there = %p",fSDigits));
-    }
-  }
-  
-  if (TreeS() && fSDigits && cS) {
-    AliDebug(1,"Setting branch addresses");
-    for (int i=0; i<AliMUONConstants::NCh(); i++) {
-      sprintf(branchname,"%sSDigits%d",GetName(),i+1);
-      if (fSDigits) {
-        AliDebug(1,Form("TreeS=%p for ich=%d branchname=%s",
-                        TreeS(),i,branchname));
-        branch = TreeS()->GetBranch(branchname);
-        TClonesArray * sdigits = SDigits(i);
-        if (branch) branch->SetAddress( &sdigits );
-        else AliWarning(Form("(%s) Failed for SDigits Detection plane %d. Can not find branch in tree.",GetName(),i));
-      }
-    }
-  }
-  
-  //
-  // Branch address for rawclusters, globaltrigger and local trigger tree
-  if (TreeR() ) {
-    if (fRawClusters == 0x0 && cRC) {
-      fRawClusters = new TObjArray(AliMUONConstants::NTrackingCh());
-      fNrawclusters= new Int_t[AliMUONConstants::NTrackingCh()];
-      for (Int_t i=0; i<AliMUONConstants::NTrackingCh();i++) {
-        fRawClusters->AddAt(new TClonesArray("AliMUONRawCluster",10000),i); 
-        fNrawclusters[i]=0;
-      }
-    }
-    if (fLocalTrigger == 0x0 && cTC) {
-      fLocalTrigger  = new TClonesArray("AliMUONLocalTrigger",234);
-    }
-   if (fRegionalTrigger == 0x0 && cTC) {
-      fRegionalTrigger  = new TClonesArray("AliMUONRegionalTrigger",16);
-    }
-    if (fGlobalTrigger== 0x0 && cTC) {
-      fGlobalTrigger = new TClonesArray("AliMUONGlobalTrigger",1); 
-    }
-    
-  }
-  if ( TreeR()  && fRawClusters && cRC && !strstr(cRC,"RCC")) {
-    for (int i=0; i<AliMUONConstants::NTrackingCh(); i++) {
-      sprintf(branchname,"%sRawClusters%d",GetName(),i+1);
-      if (fRawClusters) {
-        branch = TreeR()->GetBranch(branchname);
-        if (branch) branch->SetAddress( &((*fRawClusters)[i]) );
-        else AliWarning(Form("(%s) Failed for RawClusters Detection plane %d. Can not find branch in tree.",GetName(),i));
-      }
-    }
-  }
-  if ( TreeR()  && fLocalTrigger && cTC) {
-    sprintf(branchname,"%sLocalTrigger",GetName());
-    branch = TreeR()->GetBranch(branchname);
-    if (branch) branch->SetAddress(&fLocalTrigger);
-    else AliWarning(Form("(%s) Failed for LocalTrigger. Can not find branch in treeR.",GetName()));
-  }
-
-  if ( TreeR()  && fRegionalTrigger && cTC) {
-    sprintf(branchname,"%sRegionalTrigger",GetName());
-    branch = TreeR()->GetBranch(branchname);
-    if (branch) branch->SetAddress(&fRegionalTrigger);
-    else AliWarning(Form("(%s) Failed for RegionalTrigger. Can not find branch in treeR.",GetName()));
-  }
-
-  if ( TreeR() && fGlobalTrigger && cTC) {
-    sprintf(branchname,"%sGlobalTrigger",GetName());
-    branch = TreeR()->GetBranch(branchname);
-    if (branch) branch->SetAddress(&fGlobalTrigger);
-    else AliWarning(Form("(%s) Failed for GlobalTrigger. Can not find branch in treeR.",GetName()));
-  }
-  
-  if ( TreeT() ) {
-    if (fRecTracks == 0x0 && cRT)  {
-      fRecTracks  = new TClonesArray("AliMUONTrack",100);
-    }
-    
-  }
-  if ( TreeT() && fRecTracks && cRT ) {
-    sprintf(branchname,"%sTrack",GetName());  
-    branch = TreeT()->GetBranch(branchname);
-    if (branch) branch->SetAddress(&fRecTracks);
-    else AliWarning(Form("(%s) Failed for Tracks. Can not find branch in tree.",GetName()));
-  }
-  // trigger tracks
-  if ( TreeT() ) {
-    if (fRecTriggerTracks == 0x0 && cRL)  {
-      fRecTriggerTracks  = new TClonesArray("AliMUONTriggerTrack",100);
-    }
-    
-  }
-  if ( TreeT() && fRecTriggerTracks && cRL ) {
-    sprintf(branchname,"%sTriggerTrack",GetName());  
-    branch = TreeT()->GetBranch(branchname);
-    if (branch) branch->SetAddress(&fRecTriggerTracks);
-    else AliWarning(Form("(%s) Failed for Trigger Tracks. Can not find branch in tree.",GetName()));
-  }
-  
-  
 }
 
 //_____________________________________________________________________________
@@ -1184,7 +659,7 @@ AliMUONData::Print(Option_t* opt) const
       }
     }
   }
-  
+
   if ( options.Contains("S") )
   {
     for ( Int_t ich = 0; ich < AliMUONConstants::NCh(); ++ich)
@@ -1198,6 +673,72 @@ AliMUONData::Print(Option_t* opt) const
         digit->Print();
       }
     }
+  }  
+}
+
+//_____________________________________________________________________________
+void 
+AliMUONData::DumpSDigits(Int_t event2Check, Option_t* opt)
+{
+/// Dump SDigits
+
+  fLoader->LoadSDigits("READ");
+  
+  // Event loop
+  Int_t nevents = fRunLoader->GetNumberOfEvents();
+  for (Int_t ievent=0; ievent<nevents; ievent++) {
+    if (event2Check!=0) ievent=event2Check;
+    printf(">>> Event %d \n",ievent);
+
+    // Getting event ievent
+    fRunLoader->GetEvent(ievent);
+    SetTreeAddress("S");
+    GetSDigits();
+
+    // Loop on chambers
+    Int_t nchambers = AliMUONConstants::NCh(); ;
+    for (Int_t ichamber=0; ichamber<nchambers; ichamber++) {
+      TClonesArray* digits = SDigits(ichamber);
+
+      // Loop on Sdigits
+      Int_t ndigits = (Int_t)digits->GetEntriesFast();
+      for (Int_t idigit=0; idigit<ndigits; idigit++) {
+        AliMUONDigit* mDigit = static_cast<AliMUONDigit*>(digits->At(idigit));
+        mDigit->Print(opt);
+      }
+    }
+    ResetSDigits();
+    if (event2Check!=0) ievent=nevents;
   }
+  fLoader->UnloadSDigits();
+}
+//_____________________________________________________________________________
+void 
+AliMUONData::DumpDigits(Int_t event2Check, Option_t* opt)
+{
+/// Dump digits
+
+  fLoader->LoadDigits("READ");
+  
+  // Event loop
+  Int_t firstEvent = 0;
+  Int_t lastEvent = fRunLoader->GetNumberOfEvents()-1;
+  if ( event2Check != 0 ) {
+    firstEvent = event2Check;
+    lastEvent = event2Check;
+  }  
   
+  for ( Int_t ievent = firstEvent; ievent <= lastEvent; ++ievent ) {
+    printf(">>> Event %d \n",ievent);
+    fRunLoader->GetEvent(ievent);
+
+    AliMUONDataIterator it(this, "digit", AliMUONDataIterator::kTrackingChambers);
+    AliMUONDigit* digit;
+     while ( ( digit = (AliMUONDigit*)it.Next() ) )
+     {
+       digit->Print(opt);
+     }
+  } 
+  fLoader->UnloadDigits();
 }