]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONTriggerElectronics.cxx
Must for the init of the mapping for Amore case
[u/mrichter/AliRoot.git] / MUON / AliMUONTriggerElectronics.cxx
index 79f938f34cc8762296312e049483c2624327d704..a8b347b9efb92c0a1ef314b9f1c4a6dad69fe0c9 100644 (file)
@@ -28,7 +28,6 @@
 
 #include "AliLoader.h"
 #include "AliLog.h"
-#include "AliMUON.h" 
 #include "AliMUONCalibrationData.h"
 #include "AliMUONVDigit.h"
 #include "AliMUONVDigitStore.h"
 #include "AliMUONTriggerCrate.h"
 #include "AliMUONTriggerCrateStore.h"
 #include "AliMUONTriggerElectronics.h"
+#include "AliMUONTriggerCrateConfig.h"
+#include "AliMUONRegionalTriggerConfig.h"
+#include "AliMUONGlobalCrateConfig.h"
 #include "AliMUONVTriggerStore.h"
 #include "AliMUONVCalibParam.h"
 #include "AliMpCathodType.h"
+#include "AliMpCDB.h"
 #include "AliMpDEManager.h"
 #include "AliMpSegmentation.h"
 #include "AliMpVSegmentation.h"
@@ -81,9 +84,16 @@ AliMUONTriggerElectronics::AliMUONTriggerElectronics(AliMUONCalibrationData* cal
     fCopyYInput[i]->SetOwner();
   }
 
+  // force loading of mapping if not already done
+  if ( !AliMpDDLStore::Instance(kFALSE) )
+  {
+    AliMpCDB::LoadDDLStore();
+  }
+  
   SetCopyInput();
+  
   Factory(calibData);
-  LoadMasks(calibData);
+  LoadMasks(calibData); 
 }
 
 //___________________________________________
@@ -99,22 +109,23 @@ AliMUONTriggerElectronics::~AliMUONTriggerElectronics()
   }
 
 }
+
 //___________________________________________
 void AliMUONTriggerElectronics::SetCopyInput()
 {  
-/// set list of copy input
-
+  /// set list of copy input
+  
     for (Int_t iDDL = 0; iDDL < 2; ++iDDL) { 
-
+    
       for(Int_t iReg = 0; iReg < 8; ++iReg){   //reg loop
-
+      
        AliMpTriggerCrate* crateMapping = AliMpDDLStore::Instance()->GetTriggerCrate(iDDL, iReg);
-
+      
        for(Int_t iLocal = 0; iLocal < crateMapping->GetNofLocalBoards(); ++iLocal) { 
-
+        
          Int_t localBoardFromId = crateMapping->GetLocalBoardId(iLocal);
          if (!localBoardFromId) continue; //empty slot, should not happen
-
+        
           AliMpLocalBoard* localBoardFrom = AliMpDDLStore::Instance()->GetLocalBoard(localBoardFromId);
          Int_t localBoardToId;
          if ((localBoardToId = localBoardFrom->GetInputXto())) {
@@ -123,25 +134,25 @@ void AliMUONTriggerElectronics::SetCopyInput()
              Int_t   slotFrom  = localBoardFrom->GetSlot();
              TString crateTo   = localBoardTo->GetCrate();
              Int_t   slotTo    = localBoardTo->GetSlot();
-
+          
              fCopyXInput[0]->Add(new AliMpIntPair(AliMpExMap::GetIndex(crateFrom), slotFrom));
              fCopyXInput[1]->Add(new AliMpIntPair(AliMpExMap::GetIndex(crateTo), slotTo));
              AliDebug(3, Form("copy xInputs from local  %s_%d to %s_%d\n", crateFrom.Data(), slotFrom, 
                               crateTo.Data(), slotTo));
          }
-
+        
          if ((localBoardToId = localBoardFrom->GetInputYto())) {
              AliMpLocalBoard* localBoardTo = AliMpDDLStore::Instance()->GetLocalBoard(localBoardToId);
              TString crateFrom = localBoardFrom->GetCrate();
              Int_t   slotFrom  = localBoardFrom->GetSlot();
              TString crateTo   = localBoardTo->GetCrate();
              Int_t   slotTo    = localBoardTo->GetSlot();
-
+          
              fCopyYInput[0]->Add(new AliMpIntPair(AliMpExMap::GetIndex(crateFrom), slotFrom));
              fCopyYInput[1]->Add(new AliMpIntPair(AliMpExMap::GetIndex(crateTo), slotTo));
              AliDebug(3, Form("copy yInputs from local  %s_%d to %s_%d\n", crateFrom.Data(), slotFrom, 
                               crateTo.Data(), slotTo));
-
+          
          }
  
        }
@@ -155,31 +166,7 @@ void AliMUONTriggerElectronics::Factory(AliMUONCalibrationData* calibData)
  /// BUILD ALL ELECTRONICS
  ///
 
-// get coinc44 from AliMUON (added 12/09/06)
-  AliMUON *pMUON  = (AliMUON*)gAlice->GetModule("MUON");
-  Int_t coinc44 = pMUON->GetTriggerCoinc44();
-  if (coinc44 != 0 && coinc44 != 1) {
-      AliFatal("Coinc 44 should be equal to 0 or 1");
-      return;
-  }
-
-  fCrates->ReadFromFile();
-  
-  if ( !calibData ) return;
-  
-  AliMUONTriggerLut* lut = calibData->TriggerLut();
-  
-  if (!lut) return;
-  
-  AliMUONLocalTriggerBoard* localBoard;
-  
-  fCrates->FirstLocalBoard();
-  
-  while ( (localBoard=fCrates->NextLocalBoard()) )
-  {
-    localBoard->SetLUT(lut);
-    localBoard->SetCoinc44(coinc44);
-  }
+    fCrates->ReadFromFile(calibData);
 }
 
 //___________________________________________
@@ -214,15 +201,13 @@ void AliMUONTriggerElectronics::Feed(const AliMUONVDigitStore& digitStore)
       
       AliDebug(3,Form("cathode %d ix %d iy %d ",cathode,ix,iy));
 
-      AliMpPad pad = seg->PadByIndices(AliMpIntPair(ix,iy),kTRUE);
+      AliMpPad pad = seg->PadByIndices(ix,iy,kTRUE);
       
       for (Int_t i=0; i<pad.GetNofLocations(); i++) 
       {
-        AliMpIntPair location = pad.GetLocation(i);
+        Int_t nboard = pad.GetLocalBoardId(i);
         
-        Int_t nboard = location.GetFirst();
-        
-        Int_t ibitxy = location.GetSecond();
+        Int_t ibitxy = pad.GetLocalBoardChannel(i);
         
         AliMUONLocalTriggerBoard *b = fCrates->LocalBoard(nboard);
         
@@ -294,10 +279,9 @@ void AliMUONTriggerElectronics::Feed(const AliMUONVDigitStore& digitStore)
   
   // FILL UP/DOWN OF CURRENT BOARD (DONE VIA J3 BUS IN REAL LIFE)
   AliMUONTriggerCrate* cr;
+  TIter next2(fCrates->CreateCrateIterator());
   
-  fCrates->FirstCrate();
-  
-  while ( ( cr = fCrates->NextCrate() ) )
+  while ( ( cr = static_cast<AliMUONTriggerCrate*>(next2()) ) )
   {            
     TObjArray *boards = cr->Boards();
     
@@ -337,10 +321,9 @@ void AliMUONTriggerElectronics::Feed(UShort_t pattern[2][4])
   /// FILL INPUTS
   ///
   AliMUONTriggerCrate* cr;
+  TIter next(fCrates->CreateCrateIterator());
    
-   fCrates->FirstCrate();
-   
-   while ( ( cr = fCrates->NextCrate() ) )
+   while ( ( cr = static_cast<AliMUONTriggerCrate*>(next()) ) )
    {                 
      TObjArray *boards = cr->Boards();
      
@@ -377,10 +360,9 @@ void AliMUONTriggerElectronics::Scan(Option_t *option)
   ///
 
   AliMUONTriggerCrate* cr;
+  TIter next(fCrates->CreateCrateIterator());  
   
-  fCrates->FirstCrate();
-  
-  while ( ( cr = fCrates->NextCrate() ) )
+  while ( ( cr = static_cast<AliMUONTriggerCrate*>(next()) ) )
   {                
     TObjArray *boards = cr->Boards();
     
@@ -412,10 +394,8 @@ void AliMUONTriggerElectronics::Reset()
   ///
   
    AliMUONTriggerCrate* cr;
-   
-   fCrates->FirstCrate();
-   
-   while ( ( cr = fCrates->NextCrate() ) )
+  TIter next(fCrates->CreateCrateIterator());
+   while ( ( cr = static_cast<AliMUONTriggerCrate*>(next()) ) )
    {            
       TObjArray *boards = cr->Boards();
             
@@ -428,30 +408,39 @@ void AliMUONTriggerElectronics::Reset()
    }
 }
 
+
 //_______________________________________________________________________
 void AliMUONTriggerElectronics::LoadMasks(AliMUONCalibrationData* calibData)
 {
-  /// LOAD MASKS FROM CDB
+  /// Load mask from config in CDB 
   
+  // Set mask
+  
+  AliMUONRegionalTriggerConfig* regionalConfig = calibData->RegionalTriggerConfig();
+  if (!regionalConfig)
+     AliWarning("No valid regional trigger configuration in CDB");
 
-  // SET MASKS
   
   AliMUONTriggerCrate* cr;
-  
-  fCrates->FirstCrate();
+  TIter next(fCrates->CreateCrateIterator());
   
   Int_t irb(0);
   
-  while ( ( cr = fCrates->NextCrate() ) )
+  while ( ( cr = static_cast<AliMUONTriggerCrate*>(next()) ) )
   {            
     TObjArray *boards = cr->Boards();
     
-    AliMUONRegionalTriggerBoard *regb =
-      (AliMUONRegionalTriggerBoard*)boards->At(0);
+    AliMUONRegionalTriggerBoard *regb = (AliMUONRegionalTriggerBoard*)boards->At(0);
 
-    AliMUONVCalibParam* regionalBoardMasks = calibData->RegionalTriggerBoardMasks(irb);
+    AliMUONTriggerCrateConfig* crateConfig = regionalConfig->FindTriggerCrate(cr->GetName());
+    
+    if (!crateConfig)
+    {
+      AliError(Form("Crate %s not present in configuration !!!", cr->GetName()));
+      return;
+    }
     
-    UShort_t rmask = static_cast<UShort_t>(regionalBoardMasks->ValueAsInt(0) & 0xFFFF);
+    UShort_t rmask= crateConfig->GetMask();
 
     regb->Mask(rmask);
     
@@ -474,14 +463,16 @@ void AliMUONTriggerElectronics::LoadMasks(AliMUONCalibrationData* calibData)
     ++irb;
   }
   
-  AliMUONVCalibParam* globalBoardMasks = calibData->GlobalTriggerBoardMasks();
-  for ( Int_t i = 0; i < globalBoardMasks->Size(); ++i )
-  {
-    UShort_t gmask = static_cast<UShort_t>(globalBoardMasks->ValueAsInt(i) & 0xFF);
-    fGlobalTriggerBoard->Mask(i,gmask);
-  }
-}
+   AliMUONGlobalCrateConfig * globalConfig = calibData->GlobalTriggerCrateConfig();
+  if (!globalConfig)
+     AliWarning("No valid trigger crate configuration in CDB");
 
+    UInt_t gmask = 0;
+    for (Int_t i = 0; i < 4; i++) {
+      gmask = globalConfig->GetGlobalMask(i);
+      fGlobalTriggerBoard->Mask(i,gmask);
+    }
+}
 
 //___________________________________________
 void AliMUONTriggerElectronics::LocalResponse()
@@ -489,10 +480,9 @@ void AliMUONTriggerElectronics::LocalResponse()
 /// Compute the response for local cards
        
   AliMUONTriggerCrate* cr;
+  TIter next(fCrates->CreateCrateIterator());
   
-  fCrates->FirstCrate();
-  
-  while ( ( cr = fCrates->NextCrate() ) )
+  while ( ( cr = static_cast<AliMUONTriggerCrate*>(next()) ) )
   {            
     
     TObjArray *boards = cr->Boards();
@@ -538,10 +528,9 @@ void AliMUONTriggerElectronics::RegionalResponse()
 {
   /// Compute the response for all regional cards.
   AliMUONTriggerCrate* cr;
+  TIter next(fCrates->CreateCrateIterator());
   
-  fCrates->FirstCrate();
-  
-  while ( ( cr = fCrates->NextCrate() ) )
+  while ( ( cr = static_cast<AliMUONTriggerCrate*>(next()) ) )
   {            
       TObjArray *boards = cr->Boards();
 
@@ -562,8 +551,6 @@ void AliMUONTriggerElectronics::GlobalResponse()
   UShort_t regional[16];
   
   AliMUONTriggerCrate* cr;
-  
-  fCrates->FirstCrate();
   Int_t irb(0);
   
   if ( !fCrates->NumberOfCrates() >= 16 ) 
@@ -571,15 +558,23 @@ void AliMUONTriggerElectronics::GlobalResponse()
     AliFatal(Form("Something is wrong : too many crates %d",
                   fCrates->NumberOfCrates()));
   }
+
+  // send regional responses to the global trigger in right order
+  // do not used iterator order
   
-  while ( ( cr = fCrates->NextCrate() ) )
+  for (Int_t iSide = 0; iSide < 2; iSide++) // right & left side
   {            
-    AliMUONTriggerBoard* rb = 
-      static_cast<AliMUONTriggerBoard*>(cr->Boards()->At(0));
-    regional[irb] = rb->GetResponse();
-    ++irb;
+    for (Int_t iReg = 0; iReg < 8; iReg++) // 8 crates/regional boards for each side.
+    {
+      cr = fCrates->Crate(iSide, iReg);     
+
+      AliMUONTriggerBoard* rb = 
+       static_cast<AliMUONTriggerBoard*>(cr->Boards()->At(0));
+      regional[irb] = rb->GetResponse();
+      ++irb;
+    }
   }
-  
+
   fGlobalTriggerBoard->SetRegionalResponse(regional);
   fGlobalTriggerBoard->Response();
 }
@@ -686,10 +681,12 @@ void AliMUONTriggerElectronics::Digits2Trigger(const AliMUONVDigitStore& digitSt
   
   // GLOBAL TRIGGER INFORMATION
   UShort_t global = fGlobalTriggerBoard->GetResponse();
-  
+  UInt_t *globalInput = fGlobalTriggerBoard->GetGlobalInput();  
+
   AliMUONGlobalTrigger globalTrigger;
   
   globalTrigger.SetFromGlobalResponse(global);
+  globalTrigger.SetFromGlobalInput(globalInput);
   // ADD A LOCAL TRIGGER IN THE LIST 
   triggerStore.SetGlobal(globalTrigger);