]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUON2DStoreValidator.cxx
libTPCsim depends on libTPCrec since ALiTPCDigitizer uses AliTPCReconstructor::Stream...
[u/mrichter/AliRoot.git] / MUON / AliMUON2DStoreValidator.cxx
index e082b61191600cddfc6a72307d789a0fd8f877fc..ca12872181e4d74ed65d46791abbb5e501e38f58 100644 (file)
 #include "AliMUON2DStoreValidator.h"
 
 #include "AliLog.h"
-#include "AliMUONCalibParam1I.h"
-#include "AliMpIntPair.h"
-#include "AliMpManuList.h"
-#include "AliMUONV2DStore.h"
-#include "TList.h"
-#include "TObjArray.h"
 #include "AliMUONCheckItem.h"
-#include "AliMUONCheckItemIterator.h"
+#include "AliMUONVCalibParam.h"
+#include "AliMUONVStore.h"
+#include "AliMpConstants.h"
+#include "AliMpDDLStore.h"
 #include "AliMpDEManager.h"
-#include "TObjString.h"
-#include "AliMUONConstants.h"
-#include "Riostream.h"
+#include "AliMpDetElement.h"
+#include "AliMpManuIterator.h"
+#include <Riostream.h>
+#include <TList.h>
+#include <TObjArray.h>
+#include <TObjString.h>
 
+//-----------------------------------------------------------------------------
 /// \class AliMUON2DStoreValidator
 ///
 /// Determine which channels, manus, DEs, stations are missing
-/// from a 2DStore. This is mainly to be used during (shuttle) preprocessing
+/// from a VStore, which must be 2D, and the 2 dimensions must be
+/// (detElemId,manuId).
+/// This is mainly to be used during (shuttle) preprocessing
 /// to insure that what we'll put in the CDB is as complete as possible,
 /// and to detect possible problem.
 ///
 /// The list of missing things is kept in a structure of objects defined as :
 /// 
 /// fMissing = TObjArray[0..N tracking chambers]
+///
 /// fMissing[iChamber] = AliMUONCheckItem which contains n AliMUONCheckItem, 
 /// where n is the number of DE for that chamber
+///
 /// fMissing[iChamber]->GetItem(de) = AliMUONCheckItem which contains m
 /// AliMUONCheckItem where m is the number of Manu for that DE
+///
 /// fMissing[iChamber]->GetItem(de)->GetItem(manu) = AliMUONCheckItem which 
 /// contains k TObjString = Form("%d",manuChannel)
 ///
 /// \author Laurent Aphecetche
+//-----------------------------------------------------------------------------
 
 /// \cond CLASSIMP
 ClassImp(AliMUON2DStoreValidator)
@@ -61,8 +68,8 @@ ClassImp(AliMUON2DStoreValidator)
 //_____________________________________________________________________________
 AliMUON2DStoreValidator::AliMUON2DStoreValidator() 
 : TObject(),
-  fManuList(0x0),
-  fChambers(0x0)
+  fChambers(0x0),
+  fStatus(0x0)
 {
     /// ctor
 }
@@ -71,8 +78,8 @@ AliMUON2DStoreValidator::AliMUON2DStoreValidator()
 AliMUON2DStoreValidator::~AliMUON2DStoreValidator()
 {
   /// dtor
-  delete fManuList;
   delete fChambers;
+  delete fStatus;
 }
 
 //_____________________________________________________________________________
@@ -82,7 +89,7 @@ AliMUON2DStoreValidator::GetChamber(Int_t chamberID)
   /// Return (and create if not present) the given chamber
   /// chamberID in 0..NCh()
   
-  if ( chamberID < 0 || chamberID >= AliMUONConstants::NCh() )
+  if ( chamberID < 0 || chamberID >= AliMpConstants::NofTrackingChambers() )
   {
     AliFatal(Form("Invalid chamber number %d",chamberID));
     return 0x0;
@@ -90,7 +97,7 @@ AliMUON2DStoreValidator::GetChamber(Int_t chamberID)
   
   if (!fChambers) 
   {
-    fChambers = new TObjArray(AliMUONConstants::NCh());
+    fChambers = new TObjArray(AliMpConstants::NofTrackingChambers());
   }
     
   AliMUONCheckItem* chamber = 
@@ -121,7 +128,7 @@ AliMUON2DStoreValidator::GetDE(Int_t detElemId)
     AliDebug(3,Form("Did not find DE %4d into chamber %d, will create it",
                     detElemId,chamberID));
     de = new AliMUONCheckItem(detElemId,
-                              AliMpManuList::NumberOfManus(detElemId),
+                              AliMpDDLStore::Instance()->GetDetElement(detElemId)->NofManus(),
                               "Detection Element");
     Bool_t ok = chamber->AddItem(detElemId,de);
     if (!ok)
@@ -142,7 +149,7 @@ AliMUON2DStoreValidator::GetManu(Int_t detElemId, Int_t manuId)
   AliMUONCheckItem* manu = static_cast<AliMUONCheckItem*>(de->GetItem(manuId));
   if (!manu)
   {
-    manu = new AliMUONCheckItem(manuId,AliMpManuList::NumberOfChannels(detElemId,manuId),"Manu");
+    manu = new AliMUONCheckItem(manuId,AliMpDDLStore::Instance()->GetDetElement(detElemId)->NofChannelsInManu(manuId),"Manu");
     Bool_t ok = de->AddItem(manuId,manu);
     if (!ok)
     {
@@ -181,7 +188,7 @@ AliMUON2DStoreValidator::AddMissingManu(Int_t detElemId, Int_t manuId)
   AliDebug(3,Form("DE %4d Manu %4d is completely missing",
                   detElemId,manuId));
 
-  Int_t n(AliMpManuList::NumberOfChannels(detElemId,manuId));
+  Int_t n(AliMpDDLStore::Instance()->GetDetElement(detElemId)->NofChannelsInManu(manuId));
 
   for ( Int_t i = 0; i < n; ++i )
   {
@@ -191,74 +198,82 @@ AliMUON2DStoreValidator::AddMissingManu(Int_t detElemId, Int_t manuId)
 
 //_____________________________________________________________________________
 void
-AliMUON2DStoreValidator::ReportManu(AliMUONCheckItem& manu)
+AliMUON2DStoreValidator::ReportManu(TList& lines, const AliMUONCheckItem& manu)
 {  
   /// Report list of missing channels from this manu
   
   TObjString* channel(0x0);
-  AliMUONCheckItemIterator it(manu);
-  
-  it.First();
+  TIter next(manu.CreateIterator());
   
-  while ( ( channel = static_cast<TObjString*>(it.Next()) ) )
+  while ( ( channel = static_cast<TObjString*>(next()) ) )
   {
-    cout << Form("\t\t\tChannel %s is missing",channel->GetString().Data()) << endl;
+    lines.Add(new TObjString(Form("\t\t\tChannel %s is missing or dead",
+                                  channel->GetString().Data())));
   }
   
 }
 
 //_____________________________________________________________________________
 void
-AliMUON2DStoreValidator::ReportDE(AliMUONCheckItem& de)
+AliMUON2DStoreValidator::ReportDE(TList& lines, const AliMUONCheckItem& de)
 {  
   /// Report list of missing manus from this de
   AliMUONCheckItem* manu(0x0);
-  AliMUONCheckItemIterator it(de);
   
-  cout << Form("\tDE %4d",de.GetID()) << endl;
+  TIter next(de.CreateIterator());
   
-  it.First();
+  lines.Add(new TObjString(Form("DE %5d",de.GetID())));
   
-  while ( ( manu = static_cast<AliMUONCheckItem*>(it.Next()) ) )
+  
+  while ( ( manu = static_cast<AliMUONCheckItem*>(next()) ) )
   {
     if ( manu->IsDead() )
     {
-      cout << Form("\t\tManu %4d is missing",manu->GetID()) << endl;
+      lines.Add(new TObjString(Form("\t\tManu %4d is missing or dead",manu->GetID())));
     }
     else
     {
-      ReportManu(*manu);
+      ReportManu(lines,*manu);
     }
   }
 }
 
 //_____________________________________________________________________________
 void
-AliMUON2DStoreValidator::ReportChamber(AliMUONCheckItem& chamber)
+AliMUON2DStoreValidator::ReportChamber(TList& lines, const AliMUONCheckItem& chamber)
 {  
   /// Report list of missing de from this chamber
   
   AliMUONCheckItem* de(0x0);
-  AliMUONCheckItemIterator it(chamber);
-  
-  it.First();
+  TIter next(chamber.CreateIterator());
   
-  while ( ( de = static_cast<AliMUONCheckItem*>(it.Next()) ) )
+  while ( ( de = static_cast<AliMUONCheckItem*>(next()) ) )
   {
     if ( de->IsDead() )
     {
-      cout << Form("\tDE %4d is missing",de->GetID()) << endl;
+      lines.Add(new TObjString(Form("\tDE %4d is missing or dead",de->GetID())));
     }
     else
     {
-      ReportDE(*de);
+      ReportDE(lines,*de);
     }
   }
 }
 
 //_____________________________________________________________________________
 void
-AliMUON2DStoreValidator::Report(const TObjArray& chambers)
+AliMUON2DStoreValidator::Report(TList& lines) const
+{ 
+  /// 
+  if (fChambers) 
+  {
+    Report(lines,*fChambers); 
+  }
+}
+
+//_____________________________________________________________________________
+void
+AliMUON2DStoreValidator::Report(TList& lines, const TObjArray& chambers)
 {
   /// Reports what is missing, trying to be as concise as possible.
   
@@ -269,11 +284,11 @@ AliMUON2DStoreValidator::Report(const TObjArray& chambers)
     {
       if ( chamber->IsDead() )
       {
-        cout << Form("Chamber %2d is missing",iChamber) << endl;
+        lines.Add(new TObjString(Form("Chamber %2d is missing or dead",iChamber)));
       }
       else
       {
-        ReportChamber(*chamber);
+        ReportChamber(lines,*chamber);
       }
     }
   }
@@ -281,39 +296,111 @@ AliMUON2DStoreValidator::Report(const TObjArray& chambers)
 
 //_____________________________________________________________________________
 TObjArray* 
-AliMUON2DStoreValidator::Validate(const AliMUONV2DStore& store,
-                                  Float_t invalidFloatValue)
+AliMUON2DStoreValidator::Validate(const AliMUONVStore& store,
+                                  AliMUONVStore* config)
+{                                  
+  /// Validate the store. Check only the presence of all manus (i.e.
+  /// check nothing about the values themselves). 
+  /// Absence of manus which are not in the config is considered as normal.
+  
+  Bool_t (*kCheck)(const AliMUONVCalibParam&,Int_t) = 0x0;
+  return Validate(store,kCheck,config);
+}
+
+//_____________________________________________________________________________
+TObjArray* 
+AliMUON2DStoreValidator::Validate(const AliMUONVStore& store,
+                                  Bool_t (*check)(const AliMUONVCalibParam&,Int_t),
+                                  AliMUONVStore* config)
 {
   /// Validate the store. 
-  /// The invalidFloatValue is used to decide if a store content value
+  /// The check method is used to decide if a store content value
   /// is valid or not.
   
   delete fChambers;
   fChambers = 0x0;
   
-  if (!fManuList) fManuList = AliMpManuList::ManuList();
-
   // Now checks if some full manus are missing
-  TIter next(fManuList);
-  AliMpIntPair* p;
 
-  while ( ( p = (AliMpIntPair*)next() ) )
+  AliMpManuIterator it;
+
+  Int_t detElemId;
+  Int_t manuId;
+  
+  while ( it.Next(detElemId,manuId) )
   {
-    Int_t detElemId = p->GetFirst();
-    Int_t manuId = p->GetSecond();
     AliMUONVCalibParam* test = 
-      static_cast<AliMUONVCalibParam*>(store.Get(detElemId,manuId));
+      static_cast<AliMUONVCalibParam*>(store.FindObject(detElemId,manuId));
     if (!test)
     {
       // completely missing manu
-      AddMissingManu(detElemId,manuId);
+      if ( !config || ( config && config->FindObject(detElemId,manuId ) ) )
+      {
+        // manu is in the config but not in the store : that's an error
+        AddMissingManu(detElemId,manuId);
+      }
+    }
+    else
+    {
+      if (!check) continue;
+      
+      AliMpDetElement* de = AliMpDDLStore::Instance()->GetDetElement(detElemId);
+      
+      // manu is there, check all its channels
+      for ( Int_t manuChannel = 0 ; manuChannel < test->Size(); ++manuChannel )
+      {
+        if ( de->IsConnectedChannel(manuId,manuChannel) &&
+             !check(*test,manuChannel) )             
+        {
+          AddMissingChannel(detElemId,manuId,manuChannel);
+        }
+      }
+    }
+  }
+  return fChambers;
+  
+}
+
+
+//_____________________________________________________________________________
+TObjArray* 
+AliMUON2DStoreValidator::Validate(const AliMUONVStore& store,
+                                  Float_t invalidFloatValue,
+                                  AliMUONVStore* config)
+{
+  /// Validate the store. 
+  /// The invalidFloatValue is used to decide if a store content value
+  /// is valid or not.
+  
+  delete fChambers;
+  fChambers = 0x0;
+  
+  // Now checks if some full manus are missing
+
+  AliMpManuIterator it;
+  Int_t detElemId;
+  Int_t manuId;
+  
+  while ( it.Next(detElemId,manuId) )
+  {
+    AliMUONVCalibParam* test = 
+      static_cast<AliMUONVCalibParam*>(store.FindObject(detElemId,manuId));
+    if (!test)
+    {
+      if ( !config || ( config && config->FindObject(detElemId,manuId ) ) )
+      {
+        // completely missing manu
+        AddMissingManu(detElemId,manuId);
+      }
     }
     else
     {
       // manu is there, check all its channels
+      AliMpDetElement* de = AliMpDDLStore::Instance()->GetDetElement(detElemId);
+      
       for ( Int_t manuChannel = 0 ; manuChannel < test->Size(); ++manuChannel )
       {
-        if ( AliMpManuList::DoesChannelExist(detElemId,manuId,manuChannel) &&
+        if ( de->IsConnectedChannel(manuId,manuChannel) &&
              ( test->ValueAsFloat(manuChannel,0) == invalidFloatValue ||
                test->ValueAsFloat(manuChannel,1) == invalidFloatValue ) )             
         {