/* $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));
* 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;
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;
* 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()
{
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 )
* 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()
{
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());
}
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());
}
}
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
* 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()
{
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;
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:
* 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;
}