]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONDigitMaker.cxx
DIPO added
[u/mrichter/AliRoot.git] / MUON / AliMUONDigitMaker.cxx
index d9b65ebe40a0332879a9d57ae0a026d9968a629b..c4f62350b9a59ddb8913557babc2e0dbdfa362a7 100644 (file)
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
 
-////////////////////////////////////
-///
-/// MUON Digit maker from rawdata in ALICE-MUON
-/// Using new interface with AliMUONRawStreamTracker(Trigger)
-/// (New interface of AliMUONRawReader class)
-/// Class version 1 (further details could be found in Alice-note)
-///
-/// Implemented non-constant buspatch numbers for tracking
-/// with correct DDL id (first guess)
-/// (Ch. Finck, dec 2005)
-///
+/// \class AliMUONDigitMaker
+/// MUON Digit maker from rawdata.
 ///
 /// Raw2Digits:
 /// Using real mapping  for tracker
 /// Indranil Das (Adapted for runloader: Ch. Finck) july 05
+///
+/// Implemented non-constant buspatch numbers for tracking
+/// with correct DDL id.
+/// (Ch. Finck, dec 05)
+///
 /// Add reader for scaler trigger events
 /// Use memcpy instead of assignment elt by elt
 /// (Ch. Finck, Jan 06)
-/// 
-////////////////////////////////////
-
-#include <fstream>
-#include <string>
-
-#include <TClonesArray.h>
-
-#include "AliRawReader.h"
-#include "AliRawDataHeader.h"
-#include "AliLog.h"
-#include "AliRun.h"
+///
+/// Using new interface with AliMUONRawStreamTracker(Trigger)
+/// (New interface of AliMUONRawReader class)
+/// (further details could be found in Alice-note)
+/// (Ch. Finck, March 06)
+///
+/// Add (S)Digit maker tracker (for free)
+/// and for trigger. Create trigger inverse mapping.
+///
+/// \author Ch. Finck, oct 06 
 
-#include "AliMpBusPatch.h"
-#include "AliMUON.h"
 #include "AliMUONDigitMaker.h"
 #include "AliMUONDigit.h"
 
 #include "AliMUONRegHeader.h"
 #include "AliMUONLocalStruct.h"
 
+#include "AliMUONTriggerCrateStore.h"
+#include "AliMUONTriggerCrate.h"
+#include "AliMUONLocalTriggerBoard.h"
 #include "AliMUONLocalTrigger.h"
 #include "AliMUONGlobalTrigger.h"
+#include "AliMUONTriggerCircuit.h"
 
-#include "AliMpSegFactory.h"
+#include "AliMpSegmentation.h"
 #include "AliMpVSegmentation.h"
 #include "AliMpPad.h"
 #include "AliMpDEManager.h"
+#include "AliMpDDLStore.h"
+#include "AliMpCathodType.h"
 
+#include "AliRawReader.h"
+#include "AliRawDataHeader.h"
+#include "AliLog.h"
+#include "AliRun.h"
+
+#include <TList.h>
+#include <TArrayS.h>
+
+
+/// \cond CLASSIMP
 ClassImp(AliMUONDigitMaker) // Class implementation in ROOT context
+/// \endcond
+
 //__________________________________________________________________________
-AliMUONDigitMaker::AliMUONDigitMaker(AliMUONData* data)
+AliMUONDigitMaker::AliMUONDigitMaker(Bool_t flag)
   : TObject(),
-    fScalerEvent(kFALSE)
+    fMUONData(0x0),
+    fScalerEvent(kFALSE),
+    fDigitFlag(flag),
+    fTriggerFlag(kTRUE),
+    fDisplayFlag(kFALSE),
+    fRawStreamTracker(new AliMUONRawStreamTracker()),    
+    fRawStreamTrigger(new AliMUONRawStreamTrigger()),    
+    fDigit(new AliMUONDigit()),
+    fLocalTrigger(new AliMUONLocalTrigger()),
+    fGlobalTrigger(new AliMUONGlobalTrigger()),
+    fCrateManager(0x0),
+    fTrackerTimer(),
+    fTriggerTimer(),
+    fMappingTimer()
 {
-  //
-  // ctor with AliMUONData as argument
-  // for reconstruction
-  //
+  /// ctor with AliMUONData as argument
+  /// for reconstruction
 
   AliDebug(1,"");
 
   // Standard Constructor
 
-  // initialize segmentation factory
-  fSegFactory = new AliMpSegFactory();
-
-  // initialize container
-  fMUONData  = data;
-
-  // bus patch 
-  fBusPatchManager = new AliMpBusPatch();
-  fBusPatchManager->ReadBusPatchFile();
-
-  // raw streamers
-  fRawStreamTracker = new AliMUONRawStreamTracker();    
-  fRawStreamTrigger = new AliMUONRawStreamTrigger();    
-
-  // digit
-  fDigit = new AliMUONDigit();
-
-  // local trigger
-  fLocalTrigger  =  new AliMUONLocalTrigger();
-  fGlobalTrigger =  new AliMUONGlobalTrigger();
-
   fTrackerTimer.Start(kTRUE); fTrackerTimer.Stop();
   fTriggerTimer.Start(kTRUE); fTriggerTimer.Stop();
   fMappingTimer.Start(kTRUE); fMappingTimer.Stop();
@@ -115,59 +115,10 @@ AliMUONDigitMaker::AliMUONDigitMaker(AliMUONData* data)
 }
 
 //__________________________________________________________________________
-AliMUONDigitMaker::AliMUONDigitMaker()
-  : TObject(),
-    fMUONData(0),
-    fSegFactory(0),
-    fBusPatchManager(0),
-    fScalerEvent(kFALSE),
-    fRawStreamTracker(0),
-    fRawStreamTrigger(0),
-    fDigit(0),
-    fLocalTrigger(0)
-{
-  //
-  // Default Constructor
-  //
-  AliDebug(1,""); 
-  fTrackerTimer.Start(kTRUE); fTrackerTimer.Stop();
-  fTriggerTimer.Start(kTRUE); fTriggerTimer.Stop();
-  fMappingTimer.Start(kTRUE); fMappingTimer.Stop();
-  
-}
-
-//_______________________________________________________________________
-AliMUONDigitMaker::AliMUONDigitMaker (const AliMUONDigitMaker& rhs)
-  : TObject(rhs)
-{
-  //
-  // Protected copy constructor
-  //
-  AliFatal("Not implemented.");
-}
-
-//_______________________________________________________________________
-AliMUONDigitMaker & 
-AliMUONDigitMaker::operator=(const AliMUONDigitMaker& rhs)
-{
-  //
-  // Protected assignement operator
-  //
-  if (this == &rhs) return *this;
-
-  AliFatal("Not implemented.");
-    
-  return *this;  
-}
-
-//__________________________________________________________________________
-AliMUONDigitMaker::~AliMUONDigitMaker(void)
+AliMUONDigitMaker::~AliMUONDigitMaker()
 {
-  //
-  // clean up
-  // and time processing measure
-  //
-  delete fSegFactory;  
+  /// clean up
+  /// and time processing measure
 
   delete fRawStreamTracker;
   delete fRawStreamTrigger;
@@ -176,14 +127,12 @@ AliMUONDigitMaker::~AliMUONDigitMaker(void)
   delete fLocalTrigger;
   delete fGlobalTrigger;
 
-  delete fBusPatchManager;
-
-  AliInfo(Form("Execution time for MUON tracker : R:%.2fs C:%.2fs",
+  AliDebug(1, Form("Execution time for MUON tracker : R:%.2fs C:%.2fs",
                fTrackerTimer.RealTime(),fTrackerTimer.CpuTime()));
-  AliInfo(Form("   Execution time for MUON tracker (mapping calls part) "
+  AliDebug(1, Form("   Execution time for MUON tracker (mapping calls part) "
                ": R:%.2fs C:%.2fs",
                fMappingTimer.RealTime(),fMappingTimer.CpuTime()));
-  AliInfo(Form("Execution time for MUON trigger : R:%.2fs C:%.2fs",
+  AliDebug(1, Form("Execution time for MUON trigger : R:%.2fs C:%.2fs",
                fTriggerTimer.RealTime(),fTriggerTimer.CpuTime()));
 
   return;
@@ -192,15 +141,18 @@ AliMUONDigitMaker::~AliMUONDigitMaker(void)
 //____________________________________________________________________
 Int_t AliMUONDigitMaker::Raw2Digits(AliRawReader* rawReader)
 {
-  // Main method to creates digit
-  // for tracker 
-  // and trigger
+  /// Main method to creates digit
+  /// for tracker 
+  /// and trigger
 
   // generate digits
   ReadTrackerDDL(rawReader);
 
   // generate trigger
-  ReadTriggerDDL(rawReader);
+  if( fTriggerFlag)
+      ReadTriggerDDL(rawReader);
+  else
+      AliInfo("Reading trigger rawdata disable");
 
   return kTRUE;
 
@@ -210,9 +162,9 @@ Int_t AliMUONDigitMaker::Raw2Digits(AliRawReader* rawReader)
 Int_t AliMUONDigitMaker::ReadTrackerDDL(AliRawReader* rawReader)
 {
 
-  // reading tracker DDL
-  // filling the TClonesArray in MUONData
-  //
+  /// reading tracker DDL
+  /// filling the TClonesArray in MUONData
+
   fTrackerTimer.Start(kFALSE);
 
   // elex info
@@ -223,16 +175,17 @@ Int_t AliMUONDigitMaker::ReadTrackerDDL(AliRawReader* rawReader)
   UShort_t charge; 
   Int_t    dataSize;
 
+  Int_t iChamber;
+
   AliMUONDDLTracker*   ddlTracker = 0x0;
   AliMUONBlockHeader*  blkHeader  = 0x0;
   AliMUONDspHeader*    dspHeader  = 0x0;
   AliMUONBusStruct*    busStruct  = 0x0;
 
-
   fRawStreamTracker->SetReader(rawReader);
 
   while(fRawStreamTracker->NextDDL()) {
-
+    
     ddlTracker =  fRawStreamTracker->GetDDLTracker();
 
     Int_t nBlock = ddlTracker->GetBlkHeaderEntries();
@@ -270,7 +223,7 @@ Int_t AliMUONDigitMaker::ReadTrackerDDL(AliRawReader* rawReader)
            // Get Back the hits at pads
            Int_t error = GetMapping(buspatchId,manuId,channelId,fDigit); 
            if (error) {
-             printf("Mapping Error\n");
+             AliWarning("Mapping Error\n");
              continue;
            }
            // debugging 
@@ -288,7 +241,14 @@ Int_t AliMUONDigitMaker::ReadTrackerDDL(AliRawReader* rawReader)
            }
 
            // fill digits
-           fMUONData->AddDigit(fRawStreamTracker->GetDDL()/2, *fDigit);
+           iChamber = AliMpDEManager::GetChamberId(fDigit->DetElemId());
+
+           if (fDigitFlag || fDisplayFlag)
+               fMUONData->AddDigit(iChamber, *fDigit);
+           else
+               fMUONData->AddSDigit(iChamber, *fDigit);
+
 
          } // iData
        } // iBusPatch
@@ -304,16 +264,16 @@ Int_t AliMUONDigitMaker::ReadTrackerDDL(AliRawReader* rawReader)
 Int_t AliMUONDigitMaker::GetMapping(Int_t busPatchId, UShort_t manuId, 
                                         UChar_t channelId, AliMUONDigit* digit )
 {
-  //
-  // mapping  for tracker
-  //
+  /// mapping  for tracker
+
   fMappingTimer.Start(kFALSE);
   
   // getting DE from buspatch
-  Int_t  detElemId = fBusPatchManager->GetDEfromBus(busPatchId);
+  Int_t detElemId = AliMpDDLStore::Instance()->GetDEfromBus(busPatchId);
   AliDebug(3,Form("detElemId: %d busPatchId %d\n", detElemId, busPatchId));
 
-  AliMpVSegmentation* seg = fSegFactory->CreateMpSegmentationByElectronics(detElemId, manuId);  
+  const AliMpVSegmentation* seg 
+    = AliMpSegmentation::Instance()->GetMpSegmentationByElectronics(detElemId, manuId);  
   AliMpPad pad = seg->PadByLocation(AliMpIntPair(manuId,channelId),kTRUE);
 
   if (!pad.IsValid())
@@ -338,7 +298,7 @@ Int_t AliMUONDigitMaker::GetMapping(Int_t busPatchId, UShort_t manuId,
   
   AliDebug(3,Form("detElemId: %d, busPatchId %d, manuId: %d, channelId: %d, padx: %d pady %d\n",
                  detElemId, busPatchId, manuId, channelId, padX, padY));
-  StdoutToAliDebug(3,digit->Print(););
+//  StdoutToAliDebug(3,digit->Print(););
   
   fMappingTimer.Stop();
   return kFALSE;
@@ -347,9 +307,8 @@ Int_t AliMUONDigitMaker::GetMapping(Int_t busPatchId, UShort_t manuId,
 //____________________________________________________________________
 Int_t AliMUONDigitMaker::ReadTriggerDDL(AliRawReader* rawReader)
 {
-  // reading tracker DDL
-  // filling the TClonesArray in MUONData
-  //
+  /// reading tracker DDL
+  /// filling the TClonesArray in MUONData
 
   AliMUONDDLTrigger*       ddlTrigger      = 0x0;
   AliMUONDarcHeader*       darcHeader      = 0x0;
@@ -357,42 +316,100 @@ Int_t AliMUONDigitMaker::ReadTriggerDDL(AliRawReader* rawReader)
   AliMUONLocalStruct*      localStruct     = 0x0;
 
   Int_t loCircuit;
+  TList digitList;
 
   fTriggerTimer.Start(kFALSE);
 
   fRawStreamTrigger->SetReader(rawReader);
 
   while(fRawStreamTrigger->NextDDL()) {
-
+    
     ddlTrigger = fRawStreamTrigger->GetDDLTrigger();
     darcHeader = ddlTrigger->GetDarcHeader();
 
-    // fill global trigger information
-    if (darcHeader->GetGlobalFlag() == 2) {
-      fGlobalTrigger->SetGlobalPattern(darcHeader->GetGlobalOutput());
-      fMUONData->AddGlobalTrigger(*fGlobalTrigger);
+    // fill global trigger information in Digit Tree
+    if (fDigitFlag) {
+      if (darcHeader->GetGlobalFlag()) {
+       if (!fDisplayFlag) {
+         fGlobalTrigger->SetFromGlobalResponse(darcHeader->GetGlobalOutput());
+         fMUONData->AddGlobalTrigger(*fGlobalTrigger);
+       }
+      }
     }
 
     Int_t nReg = darcHeader->GetRegHeaderEntries();
 
     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);
+  
+      if (!crate) 
+       AliWarning(Form("Missing crate number %d in DDL %d\n", iReg, fRawStreamTrigger->GetDDL()));
+
+      TObjArray *boards  = crate->Boards();
+
       regHeader =  darcHeader->GetRegHeaderEntry(iReg);
 
       Int_t nLocal = regHeader->GetLocalEntries();
-
       for(Int_t iLocal = 0; iLocal < nLocal; iLocal++) {  
-
+       
        localStruct = regHeader->GetLocalEntry(iLocal);
 
-       if (localStruct->GetTriggerY() == 0) {
-         loCircuit = localStruct->GetId()+ 16*regHeader->GetId() 
-                                              + 128*fRawStreamTrigger->GetDDL(); 
-           
-         // fill local trigger
-         fLocalTrigger->SetLocalStruct(loCircuit, *localStruct);
+       // if card exist
+       if (localStruct) {
+
+         AliMUONLocalTriggerBoard* localBoard = 
+           (AliMUONLocalTriggerBoard*)boards->At(localStruct->GetId()+1);
+
+         // skip copy cards
+         if( !(loCircuit = localBoard->GetNumber()) )
+            continue;
+
+         if (fDigitFlag) {
+           // fill local trigger
+             fLocalTrigger->SetLocalStruct(loCircuit, *localStruct);
+             fMUONData->AddLocalTrigger(*fLocalTrigger);
+             
+         } else {
+           // Make SDigit
+
+           digitList.Clear();
+           //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);
+
+           if( TriggerDigits(loCircuit, xyPattern, digitList) ) {
+
+             for (Int_t iEntry = 0; iEntry < digitList.GetEntries(); iEntry++) {
+
+               AliMUONDigit* digit = (AliMUONDigit*)digitList.At(iEntry);
+               
+               // filling S container
+               Int_t iChamber = AliMpDEManager::GetChamberId(digit->DetElemId());
+               if (!fDisplayFlag) {
+                 fMUONData->AddSDigit(iChamber, *digit);
+               } else {
+                 fMUONData->AddDigit(iChamber, *digit);
+               }
+
+             }
+
+           } // trigger digits
+         } // S flag
 
-         fMUONData->AddLocalTrigger(*fLocalTrigger);
        } // if triggerY
       } // iLocal
     } // iReg
@@ -404,3 +421,111 @@ Int_t AliMUONDigitMaker::ReadTriggerDDL(AliRawReader* rawReader)
 
 }
 
+//____________________________________________________________________
+Int_t AliMUONDigitMaker::TriggerDigits(Int_t nBoard, 
+                                      TArrayS* xyPattern,
+                                      TList& digitList)
+{
+  /// make (S)Digit for trigger
+
+  Int_t detElemId;
+  Int_t previousDetElemId[4] = {0};
+  Int_t previousBoard[4] = {0};
+
+  // loop over x1-4 and y1-4
+  for(Int_t iChamber = 0; iChamber < 4; ++iChamber){
+    for(Int_t iCath = 0; iCath < 2; ++iCath){
+  
+      Int_t pattern = (Int_t)xyPattern[iCath].At(iChamber); 
+      if (!pattern) continue;
+
+      // get detElemId
+      AliMUONTriggerCircuit triggerCircuit;
+      AliMUONLocalTriggerBoard* localBoard = fCrateManager->LocalBoard(nBoard);
+      detElemId = triggerCircuit.DetElemId(iChamber+10, localBoard->GetName());//FIXME +/-10 (should be ok with new mapping)
+
+
+      if(iCath == 1){ // FIXME should find a more elegant way
+       // Don't save twice the same digit
+       // (since strips in non bending plane can cross several boards)
+       Int_t prevDetElemId = previousDetElemId[iChamber];
+       Int_t prevBoard = previousBoard[iChamber];
+       previousDetElemId[iChamber] = detElemId;
+       previousBoard[iChamber] = nBoard;
+
+       if(detElemId == prevDetElemId){
+         if(nBoard-prevBoard==1) continue;
+       }
+      }
+
+      const AliMpVSegmentation* seg 
+         = AliMpSegmentation::Instance()
+         ->GetMpSegmentation(detElemId, AliMp::GetCathodType(iCath));  
+
+      // loop over the 16 bits of pattern
+      for (Int_t ibitxy = 0; ibitxy < 16; ++ibitxy) {
+    
+       if ((pattern >> ibitxy) & 0x1) {
+
+         // not quite sure about this
+         Int_t offset = 0;
+         if (iCath && localBoard->GetSwitch(6)) offset = -8;
+
+         AliMpPad pad = seg->PadByLocation(AliMpIntPair(nBoard,ibitxy+offset),kTRUE);
+
+         AliMUONDigit* digit = new  AliMUONDigit();
+         if (!pad.IsValid()) {
+           AliWarning(Form("No pad for detElemId: %d, nboard %d, ibitxy: %d\n",
+                           detElemId, nBoard, ibitxy));
+           continue;
+         } // 
+
+         Int_t padX = pad.GetIndices().GetFirst();
+         Int_t padY = pad.GetIndices().GetSecond();
+
+         // file digit
+         digit->SetPadX(padX);
+         digit->SetPadY(padY);
+         digit->SetSignal(1.);
+         digit->SetCathode(iCath);
+         digit->SetDetElemId(detElemId);
+         digit->SetElectronics(nBoard, ibitxy);
+         digitList.Add(digit);
+       
+       }// xyPattern
+      }// ibitxy
+    }// cath
+  } // ichamber
+
+  return kTRUE;
+} 
+//____________________________________________________________________
+void  AliMUONDigitMaker::GetCrateName(Char_t* name, Int_t iDDL, Int_t iReg) 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;
+      }
+
+      // crate Right for first DDL
+      if (iDDL == 0)
+       strcat(name, "R");
+      else 
+       strcat(name, "L"); 
+}