]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONDigitMaker.cxx
DIPO added
[u/mrichter/AliRoot.git] / MUON / AliMUONDigitMaker.cxx
index 5f4c381655c9b8e1f881f3ffef60cf2cd6dfd427..c4f62350b9a59ddb8913557babc2e0dbdfa362a7 100644 (file)
@@ -35,7 +35,8 @@
 ///
 /// Add (S)Digit maker tracker (for free)
 /// and for trigger. Create trigger inverse mapping.
-/// (Ch. Finck, oct 06) 
+///
+/// \author Ch. Finck, oct 06 
 
 #include "AliMUONDigitMaker.h"
 #include "AliMUONDigit.h"
@@ -75,6 +76,7 @@
 #include "AliRun.h"
 
 #include <TList.h>
+#include <TArrayS.h>
 
 
 /// \cond CLASSIMP
@@ -88,6 +90,7 @@ AliMUONDigitMaker::AliMUONDigitMaker(Bool_t flag)
     fScalerEvent(kFALSE),
     fDigitFlag(flag),
     fTriggerFlag(kTRUE),
+    fDisplayFlag(kFALSE),
     fRawStreamTracker(new AliMUONRawStreamTracker()),    
     fRawStreamTrigger(new AliMUONRawStreamTrigger()),    
     fDigit(new AliMUONDigit()),
@@ -179,11 +182,10 @@ Int_t AliMUONDigitMaker::ReadTrackerDDL(AliRawReader* rawReader)
   AliMUONDspHeader*    dspHeader  = 0x0;
   AliMUONBusStruct*    busStruct  = 0x0;
 
-
   fRawStreamTracker->SetReader(rawReader);
 
   while(fRawStreamTracker->NextDDL()) {
-
+    
     ddlTracker =  fRawStreamTracker->GetDDLTracker();
 
     Int_t nBlock = ddlTracker->GetBlkHeaderEntries();
@@ -241,10 +243,11 @@ Int_t AliMUONDigitMaker::ReadTrackerDDL(AliRawReader* rawReader)
            // fill digits
            iChamber = AliMpDEManager::GetChamberId(fDigit->DetElemId());
 
-           if (fDigitFlag)
-             fMUONData->AddDigit(iChamber, *fDigit);
+           if (fDigitFlag || fDisplayFlag)
+               fMUONData->AddDigit(iChamber, *fDigit);
            else
-             fMUONData->AddSDigit(iChamber, *fDigit);
+               fMUONData->AddSDigit(iChamber, *fDigit);
 
 
          } // iData
@@ -315,21 +318,22 @@ Int_t AliMUONDigitMaker::ReadTriggerDDL(AliRawReader* rawReader)
   Int_t loCircuit;
   TList digitList;
 
-
   fTriggerTimer.Start(kFALSE);
 
   fRawStreamTrigger->SetReader(rawReader);
 
   while(fRawStreamTrigger->NextDDL()) {
-
+    
     ddlTrigger = fRawStreamTrigger->GetDDLTrigger();
     darcHeader = ddlTrigger->GetDarcHeader();
 
     // fill global trigger information in Digit Tree
     if (fDigitFlag) {
       if (darcHeader->GetGlobalFlag()) {
-       fGlobalTrigger->SetFromGlobalResponse(darcHeader->GetGlobalOutput());
-       fMUONData->AddGlobalTrigger(*fGlobalTrigger);
+       if (!fDisplayFlag) {
+         fGlobalTrigger->SetFromGlobalResponse(darcHeader->GetGlobalOutput());
+         fMUONData->AddGlobalTrigger(*fGlobalTrigger);
+       }
       }
     }
 
@@ -346,12 +350,11 @@ Int_t AliMUONDigitMaker::ReadTriggerDDL(AliRawReader* rawReader)
 
       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 card exist
@@ -366,16 +369,29 @@ Int_t AliMUONDigitMaker::ReadTriggerDDL(AliRawReader* rawReader)
 
          if (fDigitFlag) {
            // fill local trigger
-           fLocalTrigger->SetLocalStruct(loCircuit, *localStruct);
-
-           fMUONData->AddLocalTrigger(*fLocalTrigger);
-
+             fLocalTrigger->SetLocalStruct(loCircuit, *localStruct);
+             fMUONData->AddLocalTrigger(*fLocalTrigger);
+             
          } else {
            // Make SDigit
 
            digitList.Clear();
-           
-           if( TriggerDigits(localBoard, localStruct, digitList) ) {
+           //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++) {
 
@@ -383,7 +399,11 @@ Int_t AliMUONDigitMaker::ReadTriggerDDL(AliRawReader* rawReader)
                
                // filling S container
                Int_t iChamber = AliMpDEManager::GetChamberId(digit->DetElemId());
-               fMUONData->AddSDigit(iChamber, *digit);
+               if (!fDisplayFlag) {
+                 fMUONData->AddSDigit(iChamber, *digit);
+               } else {
+                 fMUONData->AddDigit(iChamber, *digit);
+               }
 
              }
 
@@ -400,117 +420,82 @@ Int_t AliMUONDigitMaker::ReadTriggerDDL(AliRawReader* rawReader)
   return kTRUE;
 
 }
+
 //____________________________________________________________________
-void AliMUONDigitMaker::GetTriggerChamber(AliMUONLocalStruct* localStruct, Int_t& xyPattern, 
-                                         Int_t& iChamber, Int_t& iCath, Int_t icase)
-{
-  /// get chamber & cathode number, (chamber starts at 0 !)
-
-    switch(icase) {
-    case 0: 
-      xyPattern =  localStruct->GetX1();
-      iCath = 0;
-      iChamber = 10;
-      break;
-    case 1: 
-      xyPattern =  localStruct->GetX2();
-      iCath = 0;
-      iChamber = 11;
-      break;
-    case 2: 
-      xyPattern =  localStruct->GetX3();
-      iCath = 0;
-      iChamber = 12;
-      break;
-    case 3: 
-      xyPattern =  localStruct->GetX4();
-      iCath = 0;
-      iChamber = 13;
-      break;
-    case 4: 
-      xyPattern =  localStruct->GetY1();
-      iCath = 1;
-      iChamber = 10;
-      break;
-    case 5: 
-      xyPattern =  localStruct->GetY2();
-      iCath = 1;
-      iChamber = 11;
-      break;
-    case 6: 
-      xyPattern =  localStruct->GetY3();
-      iCath = 1;
-      iChamber = 12;
-      break;
-    case 7: 
-      xyPattern =  localStruct->GetY4();
-      iCath = 1;
-      iChamber = 13;
-      break;
-    }
-}
-//____________________________________________________________________
-Int_t AliMUONDigitMaker::TriggerDigits(AliMUONLocalTriggerBoard* localBoard, 
-                                      AliMUONLocalStruct* localStruct,
+Int_t AliMUONDigitMaker::TriggerDigits(Int_t nBoard, 
+                                      TArrayS* xyPattern,
                                       TList& digitList)
 {
   /// make (S)Digit for trigger
 
   Int_t detElemId;
-  Int_t nBoard;
-  Int_t iCath = -1;
-  Int_t iChamber = 0;
-  Int_t xyPattern = 0;
+  Int_t previousDetElemId[4] = {0};
+  Int_t previousBoard[4] = {0};
 
   // loop over x1-4 and y1-4
-  for (Int_t icase = 0; icase < 8; icase++) {
-
-    // get chamber, cathode and associated trigger response pattern
-    GetTriggerChamber(localStruct, xyPattern, iChamber, iCath, icase);
+  for(Int_t iChamber = 0; iChamber < 4; ++iChamber){
+    for(Int_t iCath = 0; iCath < 2; ++iCath){
   
-    if (!xyPattern) continue;
-
-    // get detElemId
-    AliMUONTriggerCircuit triggerCircuit;
-    detElemId = triggerCircuit.DetElemId(iChamber, localBoard->GetName());
-    nBoard    = localBoard->GetNumber();
+      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));  
+      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++) {
+      // loop over the 16 bits of pattern
+      for (Int_t ibitxy = 0; ibitxy < 16; ++ibitxy) {
     
-      if ((xyPattern >> 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->SetCathode(iCath);
-       digit->SetDetElemId(detElemId);
-       digit->SetElectronics(nBoard, ibitxy);
-       digitList.Add(digit);
+       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
-  }// case
+       }// xyPattern
+      }// ibitxy
+    }// cath
+  } // ichamber
 
   return kTRUE;
 }