]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONDigitMaker.cxx
mchview related changes.
[u/mrichter/AliRoot.git] / MUON / AliMUONDigitMaker.cxx
index 2779db98cbf7ff301c07b7fe4077dbab1b9e2740..68c7a357a4d081d4646d0be4e6856ea35abd45e0 100644 (file)
@@ -13,6 +13,9 @@
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
 
+// $Id$
+
+//-----------------------------------------------------------------------------
 /// \class AliMUONDigitMaker
 /// MUON Digit maker from rawdata.
 ///
 /// and for trigger. Create trigger inverse mapping.
 ///
 /// \author Ch. Finck, oct 06 
+//-----------------------------------------------------------------------------
 
 #include "AliMUONDigitMaker.h"
 
-#include "AliLog.h"
 #include "AliMUONDDLTrigger.h"
 #include "AliMUONDarcHeader.h"
 #include "AliMUONVDigit.h"
 #include "AliMUONGlobalTrigger.h"
 #include "AliMUONLocalStruct.h"
 #include "AliMUONLocalTrigger.h"
-#include "AliMUONLocalTriggerBoard.h"
+#include "AliMUONLogger.h"
 #include "AliMUONRawStreamTracker.h"
+#include "AliMUONRawStreamTrackerHP.h"
 #include "AliMUONRawStreamTrigger.h"
+#include "AliMUONRawStreamTriggerHP.h"
 #include "AliMUONRegHeader.h"
 #include "AliMUONTriggerCircuit.h"
-#include "AliMUONTriggerCrate.h"
-#include "AliMUONTriggerCrateStore.h"
 #include "AliMUONVTriggerStore.h"
+#include "AliMpDetElement.h"
+#include "AliMpTriggerCrate.h"
+#include "AliMpLocalBoard.h"
 #include "AliMpCathodType.h"
 #include "AliMpDDLStore.h"
 #include "AliMpDEManager.h"
 #include "AliMpPad.h"
 #include "AliMpSegmentation.h"
 #include "AliMpVSegmentation.h"
+#include "AliCodeTimer.h"
+#include "AliLog.h"
 #include "AliRawReader.h"
 #include <TArrayS.h>
 
@@ -70,29 +78,32 @@ ClassImp(AliMUONDigitMaker) // Class implementation in ROOT context
 /// \endcond
 
 //__________________________________________________________________________
-AliMUONDigitMaker::AliMUONDigitMaker()
-  : TObject(),
+AliMUONDigitMaker::AliMUONDigitMaker(
+      Bool_t enableErrorLogger,
+      Bool_t useFastTrackerDecoder, Bool_t useFastTriggerDecoder
+  ) :
+    TObject(),
     fScalerEvent(kFALSE),
     fMakeTriggerDigits(kFALSE),
-    fRawStreamTracker(new AliMUONRawStreamTracker()),    
-    fRawStreamTrigger(new AliMUONRawStreamTrigger()),    
-    fCrateManager(0x0),
-    fTrackerTimer(),
-    fTriggerTimer(),
-    fMappingTimer(),
+    fRawStreamTracker(NULL),
+    fRawStreamTrigger(NULL),
     fDigitStore(0x0),
-    fTriggerStore(0x0)
+    fTriggerStore(0x0),
+  fLogger(new AliMUONLogger(10000))
 {
   /// ctor 
 
   AliDebug(1,"");
+  
+  CreateRawStreamTracker(useFastTrackerDecoder);
+  CreateRawStreamTrigger(useFastTriggerDecoder);
 
   // Standard Constructor
+  if (enableErrorLogger) {
+    fRawStreamTracker->EnabbleErrorLogger();
+    fRawStreamTrigger->EnabbleErrorLogger();
+  }
 
-  fTrackerTimer.Start(kTRUE); fTrackerTimer.Stop();
-  fTriggerTimer.Start(kTRUE); fTriggerTimer.Stop();
-  fMappingTimer.Start(kTRUE); fMappingTimer.Stop();
-  
   SetMakeTriggerDigits();
 
 }
@@ -105,21 +116,59 @@ AliMUONDigitMaker::~AliMUONDigitMaker()
 
   delete fRawStreamTracker;
   delete fRawStreamTrigger;
+  delete fLogger;
+}
 
-  AliDebug(1, Form("Execution time for MUON tracker : R:%.2fs C:%.2fs",
-               fTrackerTimer.RealTime(),fTrackerTimer.CpuTime()));
-  AliDebug(1, Form("   Execution time for MUON tracker (mapping calls part) "
-               ": R:%.2fs C:%.2fs",
-               fMappingTimer.RealTime(),fMappingTimer.CpuTime()));
-  AliDebug(1, Form("Execution time for MUON trigger : R:%.2fs C:%.2fs",
-               fTriggerTimer.RealTime(),fTriggerTimer.CpuTime()));
+//__________________________________________________________________________
+void AliMUONDigitMaker::CreateRawStreamTracker(Bool_t useFastDecoder)
+{
+/// Create raw stream tracker according to the passed option
 
+  if (useFastDecoder)
+  {
+    fRawStreamTracker = new AliMUONRawStreamTrackerHP();
+  }
+  else {
+    AliInfo("Using non-high performance tracker decoder.");
+    fRawStreamTracker = new AliMUONRawStreamTracker();
+  }  
+}
+
+//__________________________________________________________________________
+void AliMUONDigitMaker::CreateRawStreamTrigger(Bool_t useFastDecoder)
+{
+/// Create raw stream trigger according to the passed option
+
+  if (useFastDecoder)
+  {
+    fRawStreamTrigger = new AliMUONRawStreamTriggerHP();
+  }
+  else {
+    AliInfo("Using non-high performance tracker decoder.");
+    fRawStreamTrigger = new AliMUONRawStreamTrigger();
+  }  
 }
 
 //____________________________________________________________________
-Int_t AliMUONDigitMaker::Raw2Digits(AliRawReader* rawReader, 
-                                    AliMUONVDigitStore* digitStore,
-                                    AliMUONVTriggerStore* triggerStore)
+void
+AliMUONDigitMaker::Print(Option_t*) const
+{
+  /// Printout
+
+  cout << "RawStreamerTracker class=" << fRawStreamTracker->ClassName()
+       << " MakeTriggerDigits=" << fMakeTriggerDigits
+       << " ScalerEvent=" << fScalerEvent
+       << " DigitStore=" << fDigitStore
+       << " TriggerStore=" << fTriggerStore << endl;
+
+  if ( fLogger ) fLogger->Print();
+}
+
+//____________________________________________________________________
+Int_t
+AliMUONDigitMaker::Raw2Digits(AliRawReader* rawReader, 
+                                        AliMUONVDigitStore* digitStore,
+                                        AliMUONVTriggerStore* triggerStore)
 {
   /// Main method to creates digit
   /// for tracker 
@@ -133,14 +182,17 @@ Int_t AliMUONDigitMaker::Raw2Digits(AliRawReader* rawReader,
   
   if (!fDigitStore && !fTriggerStore)
   {
-    AliError("No digit or trigger store given. Nothing to do...");
-    return kFALSE;
+    fLogger->Log("No digit or trigger store given. Nothing to do...");
+    return kTriggerBAD & kTrackerBAD;
   }
   
+  Int_t tracker(kOK);
+  Int_t trigger(kOK);
+  
   if ( fDigitStore ) 
   {
     fDigitStore->Clear(); // insure we start with an empty container
-    ReadTrackerDDL(rawReader);
+    tracker = ReadTrackerDDL(rawReader);
   }
   
   if ( fTriggerStore || fMakeTriggerDigits ) 
@@ -148,26 +200,27 @@ Int_t AliMUONDigitMaker::Raw2Digits(AliRawReader* rawReader,
     if ( fTriggerStore ) fTriggerStore->Clear();
     if ( fMakeTriggerDigits && !fDigitStore ) 
     {
-      AliError("Asking for trigger digits but digitStore is null");
+      fLogger->Log("Asking for trigger digits but digitStore is null");
     }
     else
     {
-      ReadTriggerDDL(rawReader);
+      trigger = ReadTriggerDDL(rawReader);
     }
   }
   
-  return kTRUE;
+  return tracker | trigger;
 }
 
 //____________________________________________________________________
-Int_t AliMUONDigitMaker::ReadTrackerDDL(AliRawReader* rawReader)
+Int_t
+AliMUONDigitMaker::ReadTrackerDDL(AliRawReader* rawReader)
 {
   /// Reading tracker DDL
   /// filling the fDigitStore container, which must not be null
 
   AliDebug(1,"");
   
-  fTrackerTimer.Start(kFALSE);
+  AliCodeTimerAuto("");
 
   // elex info
   Int_t    buspatchId;
@@ -183,27 +236,47 @@ Int_t AliMUONDigitMaker::ReadTrackerDDL(AliRawReader* rawReader)
     // getting DE from buspatch
     Int_t detElemId = AliMpDDLStore::Instance()->GetDEfromBus(buspatchId);
 
+    AliMpDetElement* de = AliMpDDLStore::Instance()->GetDetElement(detElemId);
+
+    if (!de)
+      {
+       fLogger->Log(Form("DE %04d does not exist !"));
+       continue;
+      }
+
+    if (!de->IsConnectedChannel(manuId,channelId))
+      {
+       // non connected pad, do nothing (this is not an error !)
+       continue;
+      }
+
     const AliMpVSegmentation* seg 
       = AliMpSegmentation::Instance()->GetMpSegmentationByElectronics(detElemId, 
                                                                       manuId);  
 
-    AliMp::CathodType cathodeType = AliMpDEManager::GetCathod(detElemId, 
-                                                              seg->PlaneType());
+    if (!seg)
+    {
+      fLogger->Log(Form("(DE,MANUID)=(%04d,%04d) is not valid",detElemId,manuId));
+      continue;
+    }
+    
+    AliMp::CathodType cathodeType = de->GetCathodType(seg->PlaneType());
 
     AliMpPad pad = seg->PadByLocation(AliMpIntPair(manuId,channelId),kFALSE);
-    
+
     if (!pad.IsValid())
     {
-      AliError(Form("No pad for detElemId: %d, manuId: %d, channelId: %d",
+      fLogger->Log(Form("No pad for detElemId: %d, manuId: %d, channelId: %d",
                     detElemId, manuId, channelId));
       continue;
     } 
-    
+
     AliMUONVDigit* digit = fDigitStore->Add(detElemId,manuId,channelId,cathodeType,
                                             AliMUONVDigitStore::kDeny);
+
     if (!digit)
     {
-      AliError(Form("Digit DE %04d Manu %04d Channel %02d could not be added",
+      fLogger->Log(Form("Digit DE %04d Manu %04d Channel %02d could not be added",
                     detElemId, manuId, channelId));
       continue;
     }
@@ -215,13 +288,17 @@ Int_t AliMUONDigitMaker::ReadTrackerDDL(AliRawReader* rawReader)
 
   }
   
-  fTrackerTimer.Stop();
-
-  return kTRUE;
+  if ( fRawStreamTracker->IsErrorMessage() ) 
+  {
+    return kTrackerBAD;
+  }
+  
+  return kOK;
 }
 
 //____________________________________________________________________
-Int_t AliMUONDigitMaker::ReadTriggerDDL(AliRawReader* rawReader)
+Int_t
+AliMUONDigitMaker::ReadTriggerDDL(AliRawReader* rawReader)
 {
   /// reading tracker DDL
   /// filling the fTriggerStore container, which must not be null
@@ -235,7 +312,9 @@ Int_t AliMUONDigitMaker::ReadTriggerDDL(AliRawReader* rawReader)
 
   Int_t loCircuit;
 
-  fTriggerTimer.Start(kFALSE);
+  AliCodeTimerAuto("");
+  
+  if (UsingFastTriggerDecoder()) return ReadTriggerDDLFast(rawReader);
 
   fRawStreamTrigger->SetReader(rawReader);
 
@@ -260,14 +339,14 @@ Int_t AliMUONDigitMaker::ReadTriggerDDL(AliRawReader* rawReader)
     for(Int_t iReg = 0; iReg < nReg ;iReg++)
     {   //reg loop
       
-      // crate info
-      if (!fCrateManager) AliFatal("Crate Store not defined");
-      AliMUONTriggerCrate* crate = fCrateManager->Crate(fRawStreamTrigger->GetDDL(), iReg);
+
+      // crate info  
+      AliMpTriggerCrate* crate = AliMpDDLStore::Instance()->
+                                GetTriggerCrate(fRawStreamTrigger->GetDDL(), iReg);
       
       if (!crate) 
-        AliWarning(Form("Missing crate number %d in DDL %d\n", iReg, fRawStreamTrigger->GetDDL()));
-      
-      TObjArray *boards  = crate->Boards();
+        fLogger->Log(Form("Missing crate number %d in DDL %d\n", iReg, fRawStreamTrigger->GetDDL()));
+     
       
       regHeader =  darcHeader->GetRegHeaderEntry(iReg);
       
@@ -280,12 +359,15 @@ Int_t AliMUONDigitMaker::ReadTriggerDDL(AliRawReader* rawReader)
         // if card exist
         if (localStruct) {
           
-          AliMUONLocalTriggerBoard* localBoard = 
-          (AliMUONLocalTriggerBoard*)boards->At(localStruct->GetId()+1);
-          
-          // skip copy cards
-          if( !(loCircuit = localBoard->GetNumber()) )
-            continue;
+         loCircuit = crate->GetLocalBoardId(localStruct->GetId());
+
+         if ( !loCircuit ) continue; // empty slot
+
+         AliMpLocalBoard* localBoard = AliMpDDLStore::Instance()->GetLocalBoard(loCircuit, false);
+
+         // skip copy cards
+         if( !localBoard->IsNotified()) 
+            continue;
           
           if (fTriggerStore) 
           {
@@ -299,18 +381,9 @@ Int_t AliMUONDigitMaker::ReadTriggerDDL(AliRawReader* rawReader)
           {
             //FIXEME should find something better than a TArray
             TArrayS xyPattern[2];
-            xyPattern[0].Set(4);
-            xyPattern[1].Set(4);
-            
-            xyPattern[0].AddAt(localStruct->GetX1(),0);
-            xyPattern[0].AddAt(localStruct->GetX2(),1);
-            xyPattern[0].AddAt(localStruct->GetX3(),2);
-            xyPattern[0].AddAt(localStruct->GetX4(),3);
             
-            xyPattern[1].AddAt(localStruct->GetY1(),0);
-            xyPattern[1].AddAt(localStruct->GetY2(),1);
-            xyPattern[1].AddAt(localStruct->GetY3(),2);
-            xyPattern[1].AddAt(localStruct->GetY4(),3);
+           localStruct->GetXPattern(xyPattern[0]);
+           localStruct->GetYPattern(xyPattern[1]);
             
             TriggerDigits(loCircuit, xyPattern, *fDigitStore);
           }          
@@ -319,10 +392,115 @@ Int_t AliMUONDigitMaker::ReadTriggerDDL(AliRawReader* rawReader)
     } // iReg
   } // NextDDL
   
-  fTriggerTimer.Stop();
+  return kOK;
+}
 
-  return kTRUE;
+//____________________________________________________________________
+Int_t
+AliMUONDigitMaker::ReadTriggerDDLFast(AliRawReader* rawReader)
+{
+  /// reading tracker DDL like ReadTriggerDDL but with fast decoder interface.
+  /// filling the fTriggerStore container, which must not be null
+
+  const AliMUONRawStreamTriggerHP::AliHeader*          darcHeader  = 0x0;
+  const AliMUONRawStreamTriggerHP::AliRegionalHeader*  regHeader   = 0x0;
+  const AliMUONRawStreamTriggerHP::AliLocalStruct*     localStruct = 0x0;
+
+  Int_t loCircuit;
+
+  fRawStreamTrigger->SetReader(rawReader);
+  AliMUONRawStreamTriggerHP* rawStreamTrigger =
+    dynamic_cast<AliMUONRawStreamTriggerHP*>(fRawStreamTrigger);
 
+  while (fRawStreamTrigger->NextDDL())
+  {
+    darcHeader = rawStreamTrigger->GetHeaders();
+    
+    // fill global trigger information
+    if (fTriggerStore) 
+    {
+      if (darcHeader->GetGlobalFlag()) 
+      {
+          AliMUONGlobalTrigger globalTrigger;
+          globalTrigger.SetFromGlobalResponse(darcHeader->GetGlobalOutput());
+          fTriggerStore->SetGlobal(globalTrigger);
+      }
+    }
+    
+    Int_t nReg = rawStreamTrigger->GetRegionalHeaderCount();
+    
+    for(Int_t iReg = 0; iReg < nReg ;iReg++)
+    {   //reg loop
+      
+
+      // crate info  
+      AliMpTriggerCrate* crate = AliMpDDLStore::Instance()->
+                                GetTriggerCrate(fRawStreamTrigger->GetDDL(), iReg);
+      
+      if (!crate) 
+        fLogger->Log(Form("Missing crate number %d in DDL %d\n", iReg, fRawStreamTrigger->GetDDL()));
+     
+      
+      regHeader =  rawStreamTrigger->GetRegionalHeader(iReg);
+      
+      Int_t nLocal = regHeader->GetLocalStructCount();
+      for(Int_t iLocal = 0; iLocal < nLocal; iLocal++) 
+      {
+        
+        localStruct = regHeader->GetLocalStruct(iLocal);
+        
+        // if card exist
+        if (localStruct) {
+          
+         loCircuit = crate->GetLocalBoardId(localStruct->GetId());
+
+         if ( !loCircuit ) continue; // empty slot
+
+         AliMpLocalBoard* localBoard = AliMpDDLStore::Instance()->GetLocalBoard(loCircuit, kTRUE);
+
+         // skip copy cards
+         if( !localBoard->IsNotified()) 
+            continue;
+          
+          if (fTriggerStore)
+          {
+            // fill local trigger
+            AliMUONLocalTrigger localTrigger;
+            localTrigger.SetLoCircuit(loCircuit);
+            localTrigger.SetLoStripX((Int_t)localStruct->GetXPos());
+            localTrigger.SetLoStripY((Int_t)localStruct->GetYPos());
+            localTrigger.SetLoDev((Int_t)localStruct->GetXDev());
+            localTrigger.SetLoSdev((Int_t)localStruct->GetSXDev());
+            localTrigger.SetLoTrigY((Int_t)localStruct->GetTrigY());
+            localTrigger.SetLoLpt(localStruct->GetLpt());
+            localTrigger.SetLoHpt(localStruct->GetHpt());
+            localTrigger.SetX1Pattern(localStruct->GetX1());
+            localTrigger.SetX2Pattern(localStruct->GetX2());
+            localTrigger.SetX3Pattern(localStruct->GetX3());
+            localTrigger.SetX4Pattern(localStruct->GetX4());
+            localTrigger.SetY1Pattern(localStruct->GetY1());
+            localTrigger.SetY2Pattern(localStruct->GetY2());
+            localTrigger.SetY3Pattern(localStruct->GetY3());
+            localTrigger.SetY4Pattern(localStruct->GetY4());
+            fTriggerStore->Add(localTrigger);
+          }
+          
+          if ( fMakeTriggerDigits )
+          {
+            //FIXEME should find something better than a TArray
+            TArrayS xyPattern[2];
+            
+           localStruct->GetXPattern(xyPattern[0]);
+           localStruct->GetYPattern(xyPattern[1]);
+            
+            TriggerDigits(loCircuit, xyPattern, *fDigitStore);
+          }
+        } // if triggerY
+      } // iLocal
+    } // iReg
+  } // NextDDL
+  
+  return kOK;
 }
 
 //____________________________________________________________________
@@ -332,6 +510,14 @@ Int_t AliMUONDigitMaker::TriggerDigits(Int_t nBoard,
 {
   /// make digits for trigger from pattern, and add them to digitStore
 
+  AliCodeTimerAuto("");
+  
+  Int_t detElemId;
+
+  AliMpLocalBoard* localBoard = AliMpDDLStore::Instance()->GetLocalBoard(nBoard);
+
+  Int_t n,b;
+
   // loop over x1-4 and y1-4
   for (Int_t iChamber = 0; iChamber < 4; ++iChamber)
   {
@@ -341,9 +527,7 @@ Int_t AliMUONDigitMaker::TriggerDigits(Int_t nBoard,
       if (!pattern) continue;
       
       // get detElemId
-      AliMUONTriggerCircuit triggerCircuit;
-      AliMUONLocalTriggerBoard* localBoard = fCrateManager->LocalBoard(nBoard);
-      Int_t detElemId = triggerCircuit.DetElemId(iChamber+10, localBoard->GetName());//FIXME +/-10 (should be ok with new mapping)
+      detElemId = AliMpDDLStore::Instance()->GetDEfromLocalBoard(nBoard, iChamber);
         
         const AliMpVSegmentation* seg 
           = AliMpSegmentation::Instance()
@@ -362,18 +546,24 @@ Int_t AliMUONDigitMaker::TriggerDigits(Int_t nBoard,
                         
             if (!pad.IsValid()) 
             {
-              AliWarning(Form("No pad for detElemId: %d, nboard %d, ibitxy: %d\n",
+              fLogger->Log(Form("No pad for detElemId: %d, nboard %d, ibitxy: %d\n",
                               detElemId, nBoard, ibitxy));
               continue;
             }
-            
-            AliMUONVDigit* digit = digitStore.Add(detElemId,nBoard,ibitxy,iCath,AliMUONVDigitStore::kDeny);
+
+            n = pad.GetLocation(0).GetFirst(); // always take first location so that digits are not inserted several times
+           b = pad.GetLocation(0).GetSecond();
+
+           AliDebug(1,Form("Using localBoard %d ixy %d instead of %d,%d",
+                           n,b,nBoard,ibitxy));
+
+           AliMUONVDigit* digit = digitStore.Add(detElemId,n,b,iCath,AliMUONVDigitStore::kDeny);
             
             if (!digit)
             {
-              AliError(Form("Could not add digit DE %04d LocalBoard %03d ibitxy %02d cath %d",
-                            detElemId,nBoard,ibitxy,iCath));
-              continue;
+               AliDebug(1, Form("Digit DE %04d LocalBoard %03d ibitxy %02d cath %d already in store",
+                                detElemId,nBoard,ibitxy,iCath));
+               continue;
             }
             
             Int_t padX = pad.GetIndices().GetFirst();
@@ -388,35 +578,41 @@ Int_t AliMUONDigitMaker::TriggerDigits(Int_t nBoard,
   } // ichamber
   
   return kTRUE;
-} 
+}
+
 //____________________________________________________________________
-void  
-AliMUONDigitMaker::GetCrateName(Char_t* name, Int_t iDDL, Int_t iReg) const
+Bool_t AliMUONDigitMaker::UsingFastTrackerDecoder() const
 {
-  /// set crate name from DDL & reg number
-  /// method same as in RawWriter, not so nice
-  /// should be put in AliMUONTriggerCrateStore
-
-      switch(iReg) {
-      case 0:
-      case 1:
-       sprintf(name,"%d", iReg+1);
-       break;
-      case 2:
-       strcpy(name, "2-3");
-       break;
-      case 3:
-      case 4:
-      case 5:
-      case 6:
-      case 7:
-       sprintf(name,"%d", iReg);
-       break;
-      }
+/// Returns kTRUE if the digit maker is using the high performance decoder for
+/// tracker DDL stream decoding.
 
-      // crate Right for first DDL
-      if (iDDL == 0)
-       strcat(name, "R");
-      else 
-       strcat(name, "L"); 
+  return (fRawStreamTracker->IsA() == AliMUONRawStreamTrackerHP::Class());
 }
+
+//____________________________________________________________________
+Bool_t AliMUONDigitMaker::UsingFastTriggerDecoder() const
+{
+/// Returns kTRUE if the digit maker is using the high performance decoder for
+/// trigger DDL stream decoding.
+
+  return (fRawStreamTrigger->IsA() == AliMUONRawStreamTriggerHP::Class());
+}
+
+//____________________________________________________________________
+void  AliMUONDigitMaker::SetFastTrackerDecoder(Bool_t useFastDecoder)
+{
+/// Set fast raw data decoder
+
+  delete fRawStreamTracker;
+  CreateRawStreamTracker(useFastDecoder);
+}
+
+//____________________________________________________________________
+void  AliMUONDigitMaker::SetFastTriggerDecoder(Bool_t useFastDecoder)
+{
+/// Set fast raw data decoder
+
+  delete fRawStreamTrigger;
+  CreateRawStreamTrigger(useFastDecoder);
+}
+