]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/MUONCheckDI.C
remoe duplicate QA initialisation and do ESD QA for same detectors as RecPoint QA
[u/mrichter/AliRoot.git] / MUON / MUONCheckDI.C
index b5ad1febe6902f0f86b090cb9de08d2b0d4a80a6..ec765711db4c31987cfe7033dd7870b4ae666738 100644 (file)
 
 /* $Id$ */
 
-//
-// Macro for checking AliMUONDataInterface and AliMUONMCDataInterface.
-// By Bruce Becker, DAPNIA/SPhN/CEA Saclay
-//
-// Modified to updated versions of data interfaces.
-//  Artur Szostak <artursz@iafrica.com> (University of Cape Town)
-//
+/// \ingroup macros
+/// \file MUONCheckDI.C
+/// \brief Macro for checking AliMUONDataInterface and AliMUONMCDataInterface.
+///
+/// \author Bruce Becker, DAPNIA/SPhN/CEA Saclay
+///
+/// Modified to updated versions of data interfaces
+/// by Artur Szostak <artursz@iafrica.com> (University of Cape Town)
 
 #if !defined(__CINT__) || defined(__MAKECINT__)
-#include <Rtypes.h>
-#include <Riostream.h>
-#include <TObjArray.h>
-#include <TIterator.h>
 #include "AliMUONHit.h"
 #include "AliMUONVDigit.h"
-#include "AliMUONRawCluster.h"
-#include "AliMUONTrack.h"
+#include "AliMUONVCluster.h"
 #include "AliMUONLocalTrigger.h"
 #include "AliMUONRegionalTrigger.h"
 #include "AliMUONGlobalTrigger.h"
-#include "AliMUONTriggerTrack.h"
 #include "AliMUONMCDataInterface.h"
 #include "AliMUONDataInterface.h"
+#include "AliMUONVHitStore.h"
 #include "AliMUONVDigitStore.h"
 #include "AliMUONVClusterStore.h"
-#include "AliMUONVTrackStore.h"
 #include "AliMUONVTriggerStore.h"
-#include "AliMUONVTriggerTrackStore.h"
 #include "AliMpConstants.h"
 #include "AliMpDEManager.h"
+
+#include "AliCDBManager.h"
+
+#include <Rtypes.h>
+#include <Riostream.h>
+#include <TObjArray.h>
+#include <TIterator.h>
+#include <TMatrixD.h>
+
 #include <cstdlib>
+
 #endif
 
 
 Int_t Compare(const TObject* a, const TObject* b)
 {
        int result = -999;
-       if (a->IsA() == AliMUONTrack::Class() && b->IsA() == AliMUONTrack::Class())
-       {
-               const AliMUONTrack* ta = static_cast<const AliMUONTrack*>(a);
-               const AliMUONTrack* tb = static_cast<const AliMUONTrack*>(b);
-               if (ta->GetNTrackHits() < tb->GetNTrackHits()) return -1;
-               if (ta->GetNTrackHits() > tb->GetNTrackHits()) return 1;
-               if (ta->GetMatchTrigger() < tb->GetMatchTrigger()) return -1;
-               if (ta->GetMatchTrigger() > tb->GetMatchTrigger()) return 1;
-               if (ta->GetLoTrgNum() < tb->GetLoTrgNum()) return -1;
-               if (ta->GetLoTrgNum() > tb->GetLoTrgNum()) return 1;
-               if (ta->GetChi2MatchTrigger() < tb->GetChi2MatchTrigger()) return -1;
-               if (ta->GetChi2MatchTrigger() > tb->GetChi2MatchTrigger()) return 1;
-               const AliMUONTrackParam* tpa = static_cast<const AliMUONTrackParam*>(ta->GetTrackParamAtHit()->First());
-               const AliMUONTrackParam* tpb = static_cast<const AliMUONTrackParam*>(tb->GetTrackParamAtHit()->First());
-               if (tpa->GetNonBendingCoor() < tpb->GetNonBendingCoor()) return -1;
-               if (tpa->GetNonBendingCoor() > tpb->GetNonBendingCoor()) return 1;
-               if (tpa->GetNonBendingSlope() < tpb->GetNonBendingSlope()) return -1;
-               if (tpa->GetNonBendingSlope() > tpb->GetNonBendingSlope()) return 1;
-               if (tpa->GetBendingCoor() < tpb->GetBendingCoor()) return -1;
-               if (tpa->GetBendingCoor() > tpb->GetBendingCoor()) return 1;
-               if (tpa->GetBendingSlope() < tpb->GetBendingSlope()) return -1;
-               if (tpa->GetBendingSlope() > tpb->GetBendingSlope()) return 1;
-               if (tpa->GetInverseBendingMomentum() < tpb->GetInverseBendingMomentum()) return -1;
-               if (tpa->GetInverseBendingMomentum() > tpb->GetInverseBendingMomentum()) return 1;
-               if (tpa->GetCharge() < tpb->GetCharge()) return -1;
-               if (tpa->GetCharge() > tpb->GetCharge()) return 1;
-               return 0;
-       }
-       else if (a->IsA() == AliMUONLocalTrigger::Class() && b->IsA() == AliMUONLocalTrigger::Class())
+       if (a->IsA() == AliMUONLocalTrigger::Class() && b->IsA() == AliMUONLocalTrigger::Class())
        {
                result = memcmp(a, b, sizeof(AliMUONLocalTrigger));
        }
        else if (a->IsA() == AliMUONRegionalTrigger::Class() && b->IsA() == AliMUONRegionalTrigger::Class())
        {
-               result = memcmp(a, b, sizeof(AliMUONRegionalTrigger));
+               const AliMUONRegionalTrigger* ra = static_cast<const AliMUONRegionalTrigger*>(a);
+               const AliMUONRegionalTrigger* rb = static_cast<const AliMUONRegionalTrigger*>(b);
+               if (ra->GetId() < rb->GetId()) return -1;
+               if (ra->GetId() > rb->GetId()) return 1;
+               if (ra->GetLocalOutput(0) < rb->GetLocalOutput(0)) return -1;
+               if (ra->GetLocalOutput(0) > rb->GetLocalOutput(0)) return 1;
+               if (ra->GetLocalOutput(1) < rb->GetLocalOutput(1)) return -1;
+               if (ra->GetLocalOutput(1) > rb->GetLocalOutput(1)) return 1;
+               if (ra->GetLocalMask() < rb->GetLocalMask()) return -1;
+               if (ra->GetLocalMask() > rb->GetLocalMask()) return 1;
+               if (ra->GetOutput() < rb->GetOutput()) return -1;
+               if (ra->GetOutput() > rb->GetOutput()) return 1;
+               return 0;
        }
        else if (a->IsA() == AliMUONGlobalTrigger::Class() && b->IsA() == AliMUONGlobalTrigger::Class())
        {
                result = memcmp(a, b, sizeof(AliMUONGlobalTrigger));
        }
-       else if (a->IsA() == AliMUONTriggerTrack::Class() && b->IsA() == AliMUONTriggerTrack::Class())
-       {
-               const AliMUONTriggerTrack* ta = static_cast<const AliMUONTriggerTrack*>(a);
-               const AliMUONTriggerTrack* tb = static_cast<const AliMUONTriggerTrack*>(b);
-               if (ta->GetX11() < tb->GetX11()) return -1;
-               if (ta->GetX11() > tb->GetX11()) return 1;
-               if (ta->GetY11() < tb->GetY11()) return -1;
-               if (ta->GetY11() > tb->GetY11()) return 1;
-               if (ta->GetThetax() < tb->GetThetax()) return -1;
-               if (ta->GetThetax() > tb->GetThetax()) return 1;
-               if (ta->GetThetay() < tb->GetThetay()) return -1;
-               if (ta->GetThetay() > tb->GetThetay()) return 1;
-               if (ta->GetLoTrgNum() < tb->GetLoTrgNum()) return -1;
-               if (ta->GetLoTrgNum() > tb->GetLoTrgNum()) return 1;
-               if (ta->GetGTPattern() < tb->GetGTPattern()) return -1;
-               if (ta->GetGTPattern() > tb->GetGTPattern()) return 1;
-               return 0;
-       }
        else
        {
                result = memcmp(a, b, sizeof(TObject));
@@ -134,17 +104,18 @@ Int_t Compare(const TObject* a, const TObject* b)
  * The arrays and objects are then compared to each other. The arrays and objects
  * should contain the same information if everything is working correctly with
  * AliMUONMCDataInterface. If not then the difference is printed together with an
- * error message and kFALSE is returned.
+ * error message and false is returned.
  */
 bool SimTriggersOk()
 {
-       AliMUONMCDataInterface data;
+       AliMUONMCDataInterface data("generated/galice.root");
        for (Int_t event = 0; event < data.NumberOfEvents(); event++)
        {
                TObjArray localsFromStore, regionalsFromStore;
                localsFromStore.SetOwner(kTRUE);
                regionalsFromStore.SetOwner(kTRUE);
                AliMUONVTriggerStore* store = data.TriggerStore(event);
+               if (store == NULL) return false;
                AliMUONGlobalTrigger* globalFromStore = static_cast<AliMUONGlobalTrigger*>(store->Global()->Clone());
                TIter nextLocal(store->CreateLocalIterator());
                AliMUONLocalTrigger* localTrig;
@@ -244,6 +215,274 @@ bool SimTriggersOk()
                                regionalsByIndex[i]->Print();
                                return false;
                        }
+                               regionalsFromStore[i]->Print();
+                               regionalsByIndex[i]->Print();
+               }
+       }
+       return true;
+}
+
+/**
+ * This method fills internal arrays with s-digits returned by the AliMUONMCDataInterface.
+ * For each set of interface methods available a TObjArray is filled with copies of 
+ * the s-digits. These arrays are sorted and then compared to each other. The arrays
+ * should contain the same s-digit information if everything is working correctly with
+ * AliMUONMCDataInterface. If not then the difference is printed together with an
+ * error message and false is returned.
+ */
+bool SimSDigitsOk()
+{
+       AliMUONMCDataInterface data("generated/galice.root");
+       for (Int_t event = 0; event < data.NumberOfEvents(); event++)
+       {
+               TObjArray digitsFromStore;
+               digitsFromStore.SetOwner(kTRUE);
+               AliMUONVDigitStore* store = data.SDigitStore(event);
+               if (store == NULL) return false;
+               TIter next(store->CreateIterator());
+               AliMUONVDigit* digit;
+               while ( (digit = static_cast<AliMUONVDigit*>( next() )) != NULL )
+               {
+                       digitsFromStore.Add(digit->Clone());
+               }
+               digitsFromStore.Sort();
+               
+               TObjArray digitsByDetElem;
+               digitsByDetElem.SetOwner(kTRUE);
+               data.GetEvent(event);
+               for (Int_t detElem = 0; detElem < 1500; detElem++)
+               {
+                       if (! AliMpDEManager::IsValidDetElemId(detElem)) continue;
+                       Int_t ndigits = data.NumberOfSDigits(detElem);
+                       for (Int_t i = 0; i < ndigits; i++)
+                       {
+                               AliMUONVDigit* digit = data.SDigit(detElem, i);
+                               digitsByDetElem.Add(digit->Clone());
+                       }
+               }
+               digitsByDetElem.Sort();
+               
+               TObjArray digitsByChamber;
+               digitsByChamber.SetOwner(kTRUE);
+               data.GetEvent(event);
+               for (Int_t chamber = 0; chamber < AliMpConstants::NofChambers(); chamber++)
+               for (Int_t cathode = 0; cathode < 2; cathode++)
+               {
+                       Int_t ndigits = data.NumberOfSDigits(chamber, cathode);
+                       for (Int_t i = 0; i < ndigits; i++)
+                       {
+                               AliMUONVDigit* digit = data.SDigit(chamber, cathode, i);
+                               digitsByChamber.Add(digit->Clone());
+                       }
+               }
+               digitsByChamber.Sort();
+               
+               // Now check that all the lists of s-digits contain the same results.
+               // They must. If they do not then something is wrong with the implementation
+               // of AliMUONMCDataInterface.
+               if (digitsFromStore.GetEntriesFast() != digitsByDetElem.GetEntriesFast()
+                   || digitsFromStore.GetEntriesFast() != digitsByChamber.GetEntriesFast())
+               {
+                       Error(  "SimSDigitsOk",
+                               "The AliMUONMCDataInterface does not return all the s-digits correctly"
+                                 " through all its user interface methods. We got the following"
+                                 " numbers of s-digits: %d, %d and %d",
+                               digitsFromStore.GetEntriesFast(),
+                               digitsByDetElem.GetEntriesFast(),
+                               digitsByChamber.GetEntriesFast()
+                       );
+                       return false;
+               }
+               for (Int_t i = 0; i < digitsFromStore.GetEntriesFast(); i++)
+               {
+                       if (digitsFromStore[i]->Compare(digitsByDetElem[i]) != 0
+                           || digitsFromStore[i]->Compare(digitsByChamber[i]) != 0)
+                       {
+                               Error(  "SimSDigitsOk",
+                                       "The AliMUONMCDataInterface does not return identical s-digits"
+                                         " through all its user interface methods. The incorrect"
+                                         " s-digit has index %d after sorting.",
+                                       i
+                               );
+                               digitsFromStore[i]->Print();
+                               digitsByChamber[i]->Print();
+                               digitsByDetElem[i]->Print();
+                               return false;
+                       }
+               }
+       }
+       return true;
+}
+
+/**
+ * This method fills internal arrays with digits returned by the AliMUONMCDataInterface.
+ * For each set of interface methods available a TObjArray is filled with copies of 
+ * the digits. These arrays are sorted and then compared to each other. The arrays
+ * should contain the same digit information if everything is working correctly with
+ * AliMUONMCDataInterface. If not then the difference is printed together with an
+ * error message and false is returned.
+ */
+bool SimDigitsOk()
+{
+       AliMUONMCDataInterface data("generated/galice.root");
+       for (Int_t event = 0; event < data.NumberOfEvents(); event++)
+       {
+               TObjArray digitsFromStore;
+               digitsFromStore.SetOwner(kTRUE);
+               AliMUONVDigitStore* store = data.DigitStore(event);
+               if (store == NULL) return false;
+               TIter next(store->CreateIterator());
+               AliMUONVDigit* digit;
+               while ( (digit = static_cast<AliMUONVDigit*>( next() )) != NULL )
+               {
+                       digitsFromStore.Add(digit->Clone());
+               }
+               digitsFromStore.Sort();
+               
+               TObjArray digitsByDetElem;
+               digitsByDetElem.SetOwner(kTRUE);
+               data.GetEvent(event);
+               for (Int_t detElem = 0; detElem < 1500; detElem++)
+               {
+                       if (! AliMpDEManager::IsValidDetElemId(detElem)) continue;
+                       Int_t ndigits = data.NumberOfDigits(detElem);
+                       for (Int_t i = 0; i < ndigits; i++)
+                       {
+                               AliMUONVDigit* digit = data.Digit(detElem, i);
+                               digitsByDetElem.Add(digit->Clone());
+                       }
+               }
+               digitsByDetElem.Sort();
+               
+               TObjArray digitsByChamber;
+               digitsByChamber.SetOwner(kTRUE);
+               data.GetEvent(event);
+               for (Int_t chamber = 0; chamber < AliMpConstants::NofChambers(); chamber++)
+               for (Int_t cathode = 0; cathode < 2; cathode++)
+               {
+                       Int_t ndigits = data.NumberOfDigits(chamber, cathode);
+                       for (Int_t i = 0; i < ndigits; i++)
+                       {
+                               AliMUONVDigit* digit = data.Digit(chamber, cathode, i);
+                               digitsByChamber.Add(digit->Clone());
+                       }
+               }
+               digitsByChamber.Sort();
+               
+               // Now check that all the lists of digits contain the same results.
+               // They must. If they do not then something is wrong with the implementation
+               // of AliMUONMCDataInterface.
+               if (digitsFromStore.GetEntriesFast() != digitsByDetElem.GetEntriesFast()
+                   || digitsFromStore.GetEntriesFast() != digitsByChamber.GetEntriesFast())
+               {
+                       Error(  "SimDigitsOk",
+                               "The AliMUONMCDataInterface does not return all the digits correctly"
+                                 " through all its user interface methods. We got the following"
+                                 " numbers of digits: %d, %d and %d",
+                               digitsFromStore.GetEntriesFast(),
+                               digitsByDetElem.GetEntriesFast(),
+                               digitsByChamber.GetEntriesFast()
+                       );
+                       return false;
+               }
+               for (Int_t i = 0; i < digitsFromStore.GetEntriesFast(); i++)
+               {
+                       if (digitsFromStore[i]->Compare(digitsByDetElem[i]) != 0
+                           || digitsFromStore[i]->Compare(digitsByChamber[i]) != 0)
+                       {
+                               Error(  "SimDigitsOk",
+                                       "The AliMUONMCDataInterface does not return identical digits"
+                                         " through all its user interface methods. The incorrect"
+                                         " digit has index %d after sorting.",
+                                       i
+                               );
+                               digitsFromStore[i]->Print();
+                               digitsByChamber[i]->Print();
+                               digitsByDetElem[i]->Print();
+                               return false;
+                       }
+               }
+       }
+       return true;
+}
+
+/**
+ * This method fills internal arrays with hits returned by the AliMUONMCDataInterface.
+ * For each set of interface methods available a TObjArray is filled with copies of 
+ * the hits. These arrays are then compared to each other. The arrays should contain
+ * the same hit information if everything is working correctly with AliMUONMCDataInterface.
+ * If not then the difference is printed together with an error message and false is returned.
+ */
+bool SimHitsOk()
+{
+       AliMUONMCDataInterface data("generated/galice.root");
+       for (Int_t event = 0; event < data.NumberOfEvents(); event++)
+       {
+               if (data.NumberOfTracks(event) != data.NumberOfTracks())
+               {
+                       Error(  "SimHitsOk",
+                               "The AliMUONMCDataInterface does not return the same number of tracks"
+                                 " through all its user interface methods. We got the following"
+                                 " numbers of tracks: %d and %d",
+                               data.NumberOfTracks(event),
+                               data.NumberOfTracks()
+                       );
+                       return false;
+               }
+               
+               for (Int_t track = 0; track < data.NumberOfTracks(); track++)
+               {
+                       TObjArray hitsFromStore;
+                       hitsFromStore.SetOwner(kTRUE);
+                       AliMUONVHitStore* store = data.HitStore(event, track);
+                       if (store == NULL) return false;
+                       TIter next(store->CreateIterator());
+                       AliMUONHit* hit;
+                       while ( (hit = static_cast<AliMUONHit*>( next() )) != NULL )
+                       {
+                               hitsFromStore.Add(hit->Clone());
+                       }
+                       //hitsFromStore.Sort();  // Unfortunately hits do not implement the Compare method.
+                       
+                       TObjArray hitsByMethod;
+                       hitsByMethod.SetOwner(kTRUE);
+                       data.GetEvent(event);
+                       for (Int_t i = 0; i < data.NumberOfHits(track); i++)
+                       {
+                               AliMUONHit* hit = data.Hit(track, i);
+                               hitsByMethod.Add(hit->Clone());
+                       }
+                       //hitsByMethod.Sort();  // Unfortunately hits do not implement the Compare method.
+                       
+                       // Now check that both lists of hits contain the same results.
+                       // They must. If they do not then something is wrong with the implementation
+                       // of AliMUONMCDataInterface.
+                       if (hitsFromStore.GetEntriesFast() != hitsByMethod.GetEntriesFast())
+                       {
+                               Error(  "SimHitsOk",
+                                       "The AliMUONMCDataInterface does not return all the hits correctly"
+                                       " through all its user interface methods. We got the following"
+                                       " numbers of hits: %d and %d",
+                                       hitsFromStore.GetEntriesFast(),
+                                       hitsByMethod.GetEntriesFast()
+                               );
+                               return false;
+                       }
+                       for (Int_t i = 0; i < hitsFromStore.GetEntriesFast(); i++)
+                       {
+                               if (Compare(hitsFromStore[i], hitsByMethod[i]) != 0)
+                               {
+                                       Error(  "SimHitsOk",
+                                               "The AliMUONMCDataInterface does not return identical hits"
+                                               " through all its user interface methods. The incorrect"
+                                               " hit has index %d after sorting, for track %d.",
+                                               i, track
+                                       );
+                                       hitsFromStore[i]->Print();
+                                       hitsByMethod[i]->Print();
+                                       return false;
+                               }
+                       }
                }
        }
        return true;
@@ -255,7 +494,7 @@ bool SimTriggersOk()
  * the digits. These arrays are sorted and then compared to each other. The arrays
  * should contain the same digit information if everything is working correctly with
  * AliMUONDataInterface. If not then the difference is printed together with an
- * error message and kFALSE is returned.
+ * error message and false is returned.
  */
 bool RecDigitsOk()
 {
@@ -265,6 +504,7 @@ bool RecDigitsOk()
                TObjArray digitsFromStore;
                digitsFromStore.SetOwner(kTRUE);
                AliMUONVDigitStore* store = data.DigitStore(event);
+               if (store == NULL) return false;
                TIter next(store->CreateIterator());
                AliMUONVDigit* digit;
                while ( (digit = static_cast<AliMUONVDigit*>( next() )) != NULL )
@@ -346,7 +586,7 @@ bool RecDigitsOk()
  * filled with copies of the raw clusters. These arrays are sorted and then compared
  * to each other. The arrays should contain the same information if everything is
  * working correctly with AliMUONDataInterface. If not then the difference is printed
- * together with an error message and kFALSE is returned.
+ * together with an error message and false is returned.
  */
 bool RawClustersOk()
 {
@@ -356,9 +596,10 @@ bool RawClustersOk()
                TObjArray clustersFromStore;
                clustersFromStore.SetOwner(kTRUE);
                AliMUONVClusterStore* store = data.ClusterStore(event);
+               if (store == NULL) return false;
                TIter next(store->CreateIterator());
-               AliMUONRawCluster* cluster;
-               while ( (cluster = static_cast<AliMUONRawCluster*>( next() )) != NULL )
+               AliMUONVCluster* cluster;
+               while ( (cluster = static_cast<AliMUONVCluster*>( next() )) != NULL )
                {
                        clustersFromStore.Add(cluster->Clone());
                }
@@ -367,12 +608,12 @@ bool RawClustersOk()
                TObjArray clustersByChamber;
                clustersByChamber.SetOwner(kTRUE);
                data.GetEvent(event);
-               for (Int_t chamber = 0; chamber < AliMpConstants::NofChambers(); chamber++)
+               for (Int_t chamber = 0; chamber < AliMpConstants::NofTrackingChambers(); chamber++)
                {
                        Int_t nclusters = data.NumberOfRawClusters(chamber);
                        for (Int_t i = 0; i < nclusters; i++)
                        {
-                               AliMUONRawCluster* cluster = data.RawCluster(chamber, i);
+                               AliMUONVCluster* cluster = data.RawCluster(chamber, i);
                                clustersByChamber.Add(cluster->Clone());
                        }
                }
@@ -411,72 +652,6 @@ bool RawClustersOk()
        return true;
 }
 
-/**
- * This method fills internal arrays with tracks returned by AliMUONDataInterface.
- * For each set of interface methods available in AliMUONDataInterface a TObjArray is
- * filled with copies of the raw clusters. These arrays are then compared to each
- * other. The arrays should contain the same information if everything is working
- * correctly with AliMUONDataInterface. If not then the difference is printed
- * together with an error message and kFALSE is returned.
- */
-bool TracksOk()
-{
-       AliMUONDataInterface data;
-       for (Int_t event = 0; event < data.NumberOfEvents(); event++)
-       {
-               TObjArray tracksFromStore;
-               tracksFromStore.SetOwner(kTRUE);
-               AliMUONVTrackStore* store = data.TrackStore(event);
-               TIter next(store->CreateIterator());
-               AliMUONTrack* track;
-               while ( (track = static_cast<AliMUONTrack*>( next() )) != NULL )
-               {
-                       tracksFromStore.Add(track->Clone());
-               }
-               
-               TObjArray tracksByIndex;
-               tracksByIndex.SetOwner(kTRUE);
-               data.GetEvent(event);
-               Int_t ntracks = data.NumberOfTracks();
-               for (Int_t i = 0; i < ntracks; i++)
-               {
-                       AliMUONTrack* track = data.Track(i);
-                       tracksByIndex.Add(track->Clone());
-               }
-               
-               // Now check that all the lists of tracks contain the same results.
-               // They must. If they do not then something is wrong with the implementation
-               // of AliMUONDataInterface.
-               if (tracksFromStore.GetEntriesFast() != tracksByIndex.GetEntriesFast())
-               {
-                       Error(  "TracksOk",
-                               "The AliMUONDataInterface does not return all the tracks correctly"
-                                 " through all its user interface methods. We got the following"
-                                 " numbers of tracks: %d and %d",
-                               tracksFromStore.GetEntriesFast(),
-                               tracksByIndex.GetEntriesFast()
-                       );
-                       return false;
-               }
-               for (Int_t i = 0; i < tracksFromStore.GetEntriesFast(); i++)
-               {
-                       if (Compare(tracksFromStore[i], tracksByIndex[i]) != 0)
-                       {
-                               Error(  "TracksOk",
-                                       "The AliMUONDataInterface does not return identical tracks"
-                                         " through all its user interface methods. The incorrect"
-                                         " track has index %d.",
-                                       i
-                               );
-                               tracksFromStore[i]->Print();
-                               tracksByIndex[i]->Print();
-                               return false;
-                       }
-               }
-       }
-       return true;
-}
-
 /**
  * This method fills internal arrays with local and regional triggers returned
  * by AliMUONDataInterface. For each set of interface methods available in
@@ -486,7 +661,7 @@ bool TracksOk()
  * The arrays and objects are then compared to each other. The arrays and objects
  * should contain the same information if everything is working correctly with
  * AliMUONDataInterface. If not then the difference is printed together with an
- * error message and kFALSE is returned.
+ * error message and false is returned.
  */
 bool TriggersOk()
 {
@@ -497,6 +672,7 @@ bool TriggersOk()
                localsFromStore.SetOwner(kTRUE);
                regionalsFromStore.SetOwner(kTRUE);
                AliMUONVTriggerStore* store = data.TriggerStore(event);
+               if (store == NULL) return false;
                AliMUONGlobalTrigger* globalFromStore = static_cast<AliMUONGlobalTrigger*>(store->Global()->Clone());
                TIter nextLocal(store->CreateLocalIterator());
                AliMUONLocalTrigger* localTrig;
@@ -601,72 +777,6 @@ bool TriggersOk()
        return true;
 }
 
-/**
- * This method fills internal arrays with trigger tracks returned by AliMUONDataInterface.
- * For each set of interface methods available in AliMUONDataInterface a TObjArray is
- * filled with copies of the trigger tracks. These arrays are then compared to each
- * other. The arrays should contain the same information if everything is working
- * correctly with AliMUONDataInterface. If not then the difference is printed
- * together with an error message and kFALSE is returned.
- */
-bool TriggerTracksOk()
-{
-       AliMUONDataInterface data;
-       for (Int_t event = 0; event < data.NumberOfEvents(); event++)
-       {
-               TObjArray tracksFromStore;
-               tracksFromStore.SetOwner(kTRUE);
-               AliMUONVTriggerTrackStore* store = data.TriggerTrackStore(event);
-               TIter next(store->CreateIterator());
-               AliMUONTriggerTrack* track;
-               while ( (track = static_cast<AliMUONTriggerTrack*>( next() )) != NULL )
-               {
-                       tracksFromStore.Add(track->Clone());
-               }
-               
-               TObjArray tracksByIndex;
-               tracksByIndex.SetOwner(kTRUE);
-               data.GetEvent(event);
-               Int_t ntracks = data.NumberOfTriggerTracks();
-               for (Int_t i = 0; i < ntracks; i++)
-               {
-                       AliMUONTriggerTrack* track = data.TriggerTrack(i);
-                       tracksByIndex.Add(track->Clone());
-               }
-               
-               // Now check that all the lists of trigger tracks contain the same results.
-               // They must. If they do not then something is wrong with the implementation
-               // of AliMUONDataInterface.
-               if (tracksFromStore.GetEntriesFast() != tracksByIndex.GetEntriesFast())
-               {
-                       Error(  "TriggerTracksOk",
-                               "The AliMUONDataInterface does not return all the trigger tracks"
-                                 " correctly through all its user interface methods. We got the"
-                                 " following numbers of tracks: %d and %d",
-                               tracksFromStore.GetEntriesFast(),
-                               tracksByIndex.GetEntriesFast()
-                       );
-                       return false;
-               }
-               for (Int_t i = 0; i < tracksFromStore.GetEntriesFast(); i++)
-               {
-                       if (Compare(tracksFromStore[i], tracksByIndex[i]) != 0)
-                       {
-                               Error(  "TriggerTracksOk",
-                                       "The AliMUONDataInterface does not return identical trigger"
-                                         " tracks through all its user interface methods. The"
-                                         " incorrect track has index %d.",
-                                       i
-                               );
-                               tracksFromStore[i]->Print();
-                               tracksByIndex[i]->Print();
-                               return false;
-                       }
-               }
-       }
-       return true;
-}
-
 /**
  * This method performs a check of the AliMUONDataInterface and AliMUONMCDataInterface
  * classes. Basically there are at least 2 ways to fetch data using these interfaces:
@@ -678,32 +788,48 @@ bool TriggerTracksOk()
  * confirmation message is printed, if not then kFALSE is returned with the failure
  * reason printed to screen.
  */
-bool MUONCheckDI()
+bool MUONCheckDI(bool checkSim = true, bool checkRec = true)
 {
-       // TODO: complete checking AliMUONMCDataInterface.
-       //cout << "Checking simulated triggers..." << endl;
-       //if (! SimTriggersOk()) return false;
-       //cout << "Simulated triggers look OK." << endl;
+       AliCDBManager::Instance()->SetDefaultStorage("local://$ALICE_ROOT");
+
+       // Note: we do not bother checking the AliMUONMCDataInterface::Particle,
+       // AliMUONMCDataInterface::Stack and AliMUONMCDataInterface::TrackRefs methods
+       // because they are trivial enough to validate from a quick inspecition of
+       // the source code.
        
-       cout << "Checking reconstructed digits..." << endl;
-       if (! RecDigitsOk()) return false;
-       cout << "Reconstructed digits look OK." << endl;
+       if (checkSim)
+       {
+               cout << "Checking simulated hits..." << endl;
+               if (! SimHitsOk()) return false;
+               cout << "Simulated hits look OK." << endl;
+               
+               cout << "Checking simulated s-digits..." << endl;
+               if (! SimSDigitsOk()) return false;
+               cout << "Simulated s-digits look OK." << endl;
+               
+               cout << "Checking simulated digits..." << endl;
+               if (! SimDigitsOk()) return false;
+               cout << "Simulated digits look OK." << endl;
+               
+               cout << "Checking simulated triggers..." << endl;
+               if (! SimTriggersOk()) return false;
+               cout << "Simulated triggers look OK." << endl;
+       }
        
-       cout << "Checking raw clusters..." << endl;
-       if (! RawClustersOk()) return false;
-       cout << "Raw clusters look OK." << endl;
-
-       cout << "Checking reconstructed tracks..." << endl;
-       if (! TracksOk()) return false;
-       cout << "Reconstructed tracks look OK." << endl;
-
-       cout << "Checking reconstructed triggers..." << endl;
-       if (! TriggersOk()) return false;
-       cout << "Reconstructed triggers look OK." << endl;
-
-       cout << "Checking reconstructed trigger tracks..." << endl;
-       if (! TriggerTracksOk()) return false;
-       cout << "Reconstructed trigger tracks look OK." << endl;
+       if (checkRec)
+       {
+               cout << "Checking reconstructed digits..." << endl;
+               if (! RecDigitsOk()) return false;
+               cout << "Reconstructed digits look OK." << endl;
+               
+               cout << "Checking raw clusters..." << endl;
+               if (! RawClustersOk()) return false;
+               cout << "Raw clusters look OK." << endl;
        
+               cout << "Checking reconstructed triggers..." << endl;
+               if (! TriggersOk()) return false;
+               cout << "Reconstructed triggers look OK." << endl;
+       }
+
        return true;
 }