]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONTriggerCircuit.cxx
next50 trigger mask in AliHLTGlobalEsdConverterComponent
[u/mrichter/AliRoot.git] / MUON / AliMUONTriggerCircuit.cxx
index 721139da8a99bfe3a667992084f31712880f08ff..016f2067f4389a3d08581d7e4ef9b68991660124 100644 (file)
@@ -27,8 +27,8 @@
 
 #include "AliMUONTriggerCircuit.h"
 #include "AliMUONConstants.h"
+#include "AliMUONGeometryTransformer.h"
 
-#include "AliMpTriggerSegmentation.h"
 #include "AliMpTrigger.h"
 #include "AliMpSlat.h"
 #include "AliMpPCB.h"
@@ -38,6 +38,8 @@
 #include "AliMpDDLStore.h"
 #include "AliMpLocalBoard.h"
 #include "AliMpConstants.h"
+#include "AliMpPad.h"
+#include "AliMpEncodePair.h"
 
 #include "AliRun.h"
 #include "AliLog.h"
@@ -45,6 +47,8 @@
 #include <TMath.h>
 #include <Riostream.h>
 
+using std::cout;
+using std::endl;
 /// \cond CLASSIMP
 ClassImp(AliMUONTriggerCircuit)
 /// \endcond
@@ -52,8 +56,8 @@ ClassImp(AliMUONTriggerCircuit)
 //----------------------------------------------------------------------
 AliMUONTriggerCircuit::AliMUONTriggerCircuit(const AliMUONGeometryTransformer* transformer)
     : TObject(),
-      fTransformer(transformer),
-      fCurrentSeg(0x0),
+      fkTransformer(transformer),
+      fkCurrentSeg(0x0),
       fCurrentDetElem(0x0),
       fCurrentLocalBoard(0x0)
 {
@@ -61,8 +65,13 @@ AliMUONTriggerCircuit::AliMUONTriggerCircuit(const AliMUONGeometryTransformer* t
   
     for (Int_t i = 1; i < AliMpConstants::NofLocalBoards()+1; ++i) {
       fXpos11[i].Set(16); 
-      fYpos11[i].Set(31);
-      fYpos21[i].Set(63);
+      fYpos11[i].Set(32);
+      fYpos21[i].Set(64);
+      fZpos11[i].Set(32);
+      fZpos21[i].Set(64);
+      fXwidth11[i].Set(16); 
+      fYwidth11[i].Set(32);
+      fYwidth21[i].Set(64);
     }
 
     for (Int_t i = 1; i < AliMpConstants::NofLocalBoards()+1; ++i) { // board begins at 1
@@ -77,7 +86,24 @@ AliMUONTriggerCircuit::AliMUONTriggerCircuit(const AliMUONGeometryTransformer* t
 
     LoadXPos(localBoard);
     LoadYPos(localBoard);
-
+    /*
+    printf("LocalBoard %03d \n",i);
+    printf("fXpos11 \n");
+    for (Int_t i1 = 0; i1 < 16; i1++) 
+      printf("%02d   %7.2f \n",i1,fXpos11[i][i1]);
+    printf("fYpos11 \n");
+    for (Int_t i2 = 0; i2 < 32; i2++) 
+      printf("%02d   %7.2f \n",i2,fYpos11[i][i2]);
+    printf("fYpos21 \n");
+    for (Int_t i3 = 0; i3 < 64; i3++) 
+      printf("%02d   %7.2f \n",i3,fYpos21[i][i3]);
+    printf("fZpos11 \n");
+    for (Int_t i4 = 0; i4 < 32; i4++) 
+      printf("%02d   %8.2f \n",i4,fZpos11[i][i4]);
+    printf("fZpos21 \n");
+    for (Int_t i5 = 0; i5 < 64; i5++) 
+      printf("%02d   %8.2f \n",i5,fZpos21[i][i5]);
+    */
   }
 
 }
@@ -90,6 +116,11 @@ AliMUONTriggerCircuit::~AliMUONTriggerCircuit()
      fXpos11[i].Reset();
      fYpos11[i].Reset();
      fYpos21[i].Reset();
+     fZpos11[i].Reset();
+     fZpos21[i].Reset();
+     fXwidth11[i].Reset();
+     fYwidth11[i].Reset();
+     fYwidth21[i].Reset();
     }
 
 } 
@@ -97,8 +128,8 @@ AliMUONTriggerCircuit::~AliMUONTriggerCircuit()
 //----------------------------------------------------------------------
 AliMUONTriggerCircuit::AliMUONTriggerCircuit(const AliMUONTriggerCircuit& circuit)
     :  TObject(circuit),
-       fTransformer(circuit.fTransformer), // do not copy, just pointed to
-       fCurrentSeg(circuit.fCurrentSeg),
+       fkTransformer(circuit.fkTransformer), // do not copy, just pointed to
+       fkCurrentSeg(circuit.fkCurrentSeg),
        fCurrentDetElem(circuit.fCurrentDetElem),
        fCurrentLocalBoard(circuit.fCurrentLocalBoard)
 {
@@ -108,6 +139,11 @@ AliMUONTriggerCircuit::AliMUONTriggerCircuit(const AliMUONTriggerCircuit& circui
       fXpos11[i] = circuit.fXpos11[i];
       fYpos11[i] = circuit.fYpos11[i];
       fYpos21[i] = circuit.fYpos21[i];
+      fZpos11[i] = circuit.fZpos11[i];
+      fZpos21[i] = circuit.fZpos21[i];
+      fXwidth11[i] = circuit.fXwidth11[i];
+      fYwidth11[i] = circuit.fYwidth11[i];
+      fYwidth21[i] = circuit.fYwidth21[i];
     }
 
 }
@@ -118,8 +154,8 @@ AliMUONTriggerCircuit& AliMUONTriggerCircuit::operator=(const AliMUONTriggerCirc
 
   if (this == &circuit) return *this;
 
-  fTransformer       = circuit.fTransformer;
-  fCurrentSeg        = circuit.fCurrentSeg;
+  fkTransformer      = circuit.fkTransformer;
+  fkCurrentSeg       = circuit.fkCurrentSeg;
   fCurrentDetElem    = circuit.fCurrentDetElem;
   fCurrentLocalBoard = circuit.fCurrentLocalBoard;
 
@@ -127,6 +163,11 @@ AliMUONTriggerCircuit& AliMUONTriggerCircuit::operator=(const AliMUONTriggerCirc
     fXpos11[i] = circuit.fXpos11[i];
     fYpos11[i] = circuit.fYpos11[i];
     fYpos21[i] = circuit.fYpos21[i];
+    fZpos11[i] = circuit.fZpos11[i];
+    fZpos21[i] = circuit.fZpos21[i];
+    fXwidth11[i] = circuit.fXwidth11[i];
+    fYwidth11[i] = circuit.fYwidth11[i];
+    fYwidth21[i] = circuit.fYwidth21[i];
   }
 
   return *this;
@@ -134,7 +175,7 @@ AliMUONTriggerCircuit& AliMUONTriggerCircuit::operator=(const AliMUONTriggerCirc
 }
 
 //---------------------------------------------------------------------
-void AliMUONTriggerCircuit::LoadYPos(AliMpLocalBoard* localBoard)
+void AliMUONTriggerCircuit::LoadYPos(AliMpLocalBoard* const localBoard)
 {
 /// fill fYpos11 and fYpos21 -> y position of X declusterized strips
   
@@ -145,15 +186,15 @@ void AliMUONTriggerCircuit::LoadYPos(AliMpLocalBoard* localBoard)
   Int_t zeroDown = localBoard->GetSwitch(AliMpLocalBoard::kZeroDown);
   Int_t zeroUp   = localBoard->GetSwitch(AliMpLocalBoard::kZeroUp);
  
-  Int_t iline = localBoard->GetPosition().GetFirst();
-  Int_t icol  = localBoard->GetPosition().GetSecond();
+  Int_t iline = AliMp::PairFirst(localBoard->GetPosition());
+  Int_t icol  = AliMp::PairSecond(localBoard->GetPosition());
   if ( iline == 5 ) --icol;
 
   //--- first plane 
   ichamber = 10;
   fCurrentDetElem = AliMpDDLStore::Instance()->GetDEfromLocalBoard(fCurrentLocalBoard, ichamber);
 
-  fCurrentSeg = AliMpSegmentation::Instance()
+  fkCurrentSeg = AliMpSegmentation::Instance()
         ->GetMpSegmentation(fCurrentDetElem, AliMp::GetCathodType(icathode));  
 
   Int_t iFirstStrip = FirstStrip(localBoard);
@@ -161,13 +202,13 @@ void AliMUONTriggerCircuit::LoadYPos(AliMpLocalBoard* localBoard)
   Int_t iStripCircuit = 0;
 
   FillXstrips(icol, iFirstStrip, iLastStrip, 
-             iStripCircuit, fYpos11[fCurrentLocalBoard]);
+             iStripCircuit, kTRUE);
   
   //--- second plane 
   ichamber = 12;
   fCurrentDetElem = AliMpDDLStore::Instance()->GetDEfromLocalBoard(fCurrentLocalBoard, ichamber);
 
-  fCurrentSeg = AliMpSegmentation::Instance()
+  fkCurrentSeg = AliMpSegmentation::Instance()
         ->GetMpSegmentation(fCurrentDetElem, AliMp::GetCathodType(icathode));  
 
   // second plane middle part
@@ -176,7 +217,7 @@ void AliMUONTriggerCircuit::LoadYPos(AliMpLocalBoard* localBoard)
   iStripCircuit = 8;
 
   FillXstrips(icol, iFirstStripMiddle, iLastStripMiddle,
-             iStripCircuit, fYpos21[fCurrentLocalBoard]);
+             iStripCircuit, kFALSE);
   
   // second plane upper part
   if (zeroUp == 0) { // something up
@@ -185,7 +226,7 @@ void AliMUONTriggerCircuit::LoadYPos(AliMpLocalBoard* localBoard)
     Int_t icolUp = icol;
 
     // check if we need to move to another detElemId
-    AliMpPad pad = fCurrentSeg->PadByIndices(AliMpIntPair(icol-1,iLastStripMiddle+1),kFALSE);
+    AliMpPad pad = fkCurrentSeg->PadByIndices(icol-1,iLastStripMiddle+1,kFALSE);
 
     if (pad.IsValid()) { // upper strips within same detElemId
       iFirstStripUp = iLastStripMiddle;
@@ -195,7 +236,7 @@ void AliMUONTriggerCircuit::LoadYPos(AliMpLocalBoard* localBoard)
       fCurrentDetElem = AliMpDDLStore::Instance()->
                   GetNextDEfromLocalBoard(fCurrentLocalBoard, ichamber);
 
-      fCurrentSeg = AliMpSegmentation::Instance()
+      fkCurrentSeg = AliMpSegmentation::Instance()
             ->GetMpSegmentation(fCurrentDetElem, AliMp::GetCathodType(icathode));  
 
       iFirstStripUp = 0;
@@ -206,16 +247,20 @@ void AliMUONTriggerCircuit::LoadYPos(AliMpLocalBoard* localBoard)
     
     iStripCircuit = 24;
     FillXstrips(icolUp, iFirstStripUp, iLastStripUp,
-               iStripCircuit, fYpos21[fCurrentLocalBoard]);
+               iStripCircuit, kFALSE);
     
     // fill strip between middle and upper part
     fYpos21[fCurrentLocalBoard][47] = (fYpos21[fCurrentLocalBoard][46] + 
                                       fYpos21[fCurrentLocalBoard][48])/2.;
+    fZpos21[fCurrentLocalBoard][47] = (fZpos21[fCurrentLocalBoard][46] + 
+                                      fZpos21[fCurrentLocalBoard][48])/2.;
+    fYwidth21[fCurrentLocalBoard][47] = (fYwidth21[fCurrentLocalBoard][46] + 
+                                        fYwidth21[fCurrentLocalBoard][48])/2.;
   } // end of something up
   
   // restore current detElemId & segmentation
   fCurrentDetElem = AliMpDDLStore::Instance()->GetDEfromLocalBoard(fCurrentLocalBoard, ichamber);
-  fCurrentSeg = AliMpSegmentation::Instance()
+  fkCurrentSeg = AliMpSegmentation::Instance()
       ->GetMpSegmentation(fCurrentDetElem, AliMp::GetCathodType(icathode));  
 
   // second plane lower part
@@ -225,7 +270,7 @@ void AliMUONTriggerCircuit::LoadYPos(AliMpLocalBoard* localBoard)
     Int_t icolDo = icol;
     
     // check if we need to move to another detElemId      
-    AliMpPad pad = fCurrentSeg->PadByIndices(AliMpIntPair(icol-1,iFirstStripMiddle-1),kFALSE);
+    AliMpPad pad = fkCurrentSeg->PadByIndices(icol-1,iFirstStripMiddle-1,kFALSE);
     if (pad.IsValid()) { // lower strips within same detElemId
       iFirstStripDo = iFirstStripMiddle - 8;
       iLastStripDo  = iFirstStripDo + 8;             
@@ -234,12 +279,11 @@ void AliMUONTriggerCircuit::LoadYPos(AliMpLocalBoard* localBoard)
       fCurrentDetElem = AliMpDDLStore::Instance()
          ->GetPreviousDEfromLocalBoard(fCurrentLocalBoard, ichamber);
 
-      fCurrentSeg = AliMpSegmentation::Instance()
+      fkCurrentSeg = AliMpSegmentation::Instance()
          ->GetMpSegmentation(fCurrentDetElem, AliMp::GetCathodType(icathode));  
 
       // get iFirstStrip in this module 
-      const AliMpTriggerSegmentation* trig = (AliMpTriggerSegmentation*)(fCurrentSeg);
-      const AliMpTrigger* t = trig->Slat();
+      const AliMpTrigger* t = AliMpSegmentation::Instance()->GetTrigger(fkCurrentSeg);
       const AliMpSlat* slat = t->GetLayer(0);
 
       if (iline == 5) icolDo = icol + 1; // special case
@@ -252,11 +296,15 @@ void AliMUONTriggerCircuit::LoadYPos(AliMpLocalBoard* localBoard)
     
     iStripCircuit = 0;
     FillXstrips(icolDo, iFirstStripDo, iLastStripDo,
-               iStripCircuit, fYpos21[fCurrentLocalBoard]);
+               iStripCircuit, kFALSE);
     
     // fill strip between middle and upper part
     fYpos21[fCurrentLocalBoard][15] = (fYpos21[fCurrentLocalBoard][14] + 
                                       fYpos21[fCurrentLocalBoard][16])/2.;
+    fZpos21[fCurrentLocalBoard][15] = (fZpos21[fCurrentLocalBoard][14] + 
+                                      fZpos21[fCurrentLocalBoard][16])/2.;
+    fYwidth21[fCurrentLocalBoard][15] = (fYwidth21[fCurrentLocalBoard][14] + 
+                                        fYwidth21[fCurrentLocalBoard][16])/2.;
   } // end of something down
   
 }
@@ -264,32 +312,42 @@ void AliMUONTriggerCircuit::LoadYPos(AliMpLocalBoard* localBoard)
 //----------------------------------------------------------------------
 void AliMUONTriggerCircuit::FillXstrips(const Int_t icol, 
                                        const Int_t iFirstStrip, const Int_t iLastStrip, 
-                                       Int_t liStripCircuit, TArrayF& ypos)
+                                       Int_t liStripCircuit, const Bool_t is11)
 {    
 /// fill 
-  Double_t xyGlobal[2] = {0.};
+  TArrayF& ypos   = (is11) ? fYpos11[fCurrentLocalBoard] : fYpos21[fCurrentLocalBoard];
+  TArrayF& zpos   = (is11) ? fZpos11[fCurrentLocalBoard] : fZpos21[fCurrentLocalBoard];
+  TArrayF& ywidth = (is11) ? fYwidth11[fCurrentLocalBoard] : fYwidth21[fCurrentLocalBoard];
+
+  Double_t xyGlobal[3] = {0.};
   for (Int_t istrip = iFirstStrip; istrip < iLastStrip; ++istrip) {
 
-    AliMpPad pad = fCurrentSeg->PadByIndices(AliMpIntPair(icol-1,istrip),kTRUE);
+    AliMpPad pad = fkCurrentSeg->PadByIndices(icol-1,istrip,kTRUE);
     if ( !pad.IsValid() ) {
       StdoutToAliError(cout << "Pad not found in seg " << endl;
-                       fCurrentSeg->Print();
+                       fkCurrentSeg->Print();
                        cout << " ix,iy=" << icol-1 << "," << istrip << endl;
                        );
     }
-    Float_t yDim = pad.Dimensions().Y(); // half size! 
+    Float_t yDim = pad.GetDimensionY(); // half size! 
 
     XYGlobal(pad,xyGlobal);
     
     ypos[2*liStripCircuit] = xyGlobal[1];
-    if (istrip != (iLastStrip - 1)) ypos[2*liStripCircuit+1] = xyGlobal[1] + yDim;
+    zpos[2*liStripCircuit] = xyGlobal[2];
+    ywidth[2*liStripCircuit] = 2. * yDim;
+    if (istrip != (iLastStrip - 1)) {
+      ypos[2*liStripCircuit+1] = xyGlobal[1] + yDim;
+      zpos[2*liStripCircuit+1] = xyGlobal[2];
+      ywidth[2*liStripCircuit+1] = 2. * yDim;
+    }
     liStripCircuit++;
   }    
 }
 
 
 //----------------------------------------------------------------------
-void AliMUONTriggerCircuit::LoadXPos(AliMpLocalBoard* localBoard)
+void AliMUONTriggerCircuit::LoadXPos(AliMpLocalBoard* const localBoard)
 {
 /// fill fXpos11 -> x position of Y strips for the first plane only
 /// fXpos11 contains the x position of Y strip for the current circuit
@@ -311,13 +369,13 @@ void AliMUONTriggerCircuit::LoadXPos(AliMpLocalBoard* localBoard)
   Int_t  iLastStrip    = 0;
   Bool_t doubling      = kFALSE;
   
-  Int_t iline  = localBoard->GetPosition().GetFirst();
-  Int_t icol   = localBoard->GetPosition().GetSecond();
+  Int_t iline = AliMp::PairFirst(localBoard->GetPosition());
+  Int_t icol  = AliMp::PairSecond(localBoard->GetPosition());
   if ( iline == 5 ) --icol;
 
   fCurrentDetElem = AliMpDDLStore::Instance()->GetDEfromLocalBoard(fCurrentLocalBoard, ichamber);
 
-  fCurrentSeg = AliMpSegmentation::Instance()
+  fkCurrentSeg = AliMpSegmentation::Instance()
         ->GetMpSegmentation(fCurrentDetElem, AliMp::GetCathodType(icathode));  
 
   // check if one needs a strip doubling or not
@@ -328,8 +386,7 @@ void AliMUONTriggerCircuit::LoadXPos(AliMpLocalBoard* localBoard)
   if (zeroAllYLSB) iStripCircuit = 8;
   
   // get iFirstStrip in this module 
-  const AliMpTriggerSegmentation* trig = (AliMpTriggerSegmentation*)(fCurrentSeg);
-  const AliMpTrigger* t = trig->Slat();
+  const AliMpTrigger* t = AliMpSegmentation::Instance()->GetTrigger(fkCurrentSeg);
   const AliMpSlat* slat = t->GetLayer(0);
   
   const AliMpPCB* pcb = slat->GetPCB(icol-1);
@@ -348,33 +405,36 @@ void AliMUONTriggerCircuit::FillYstrips(const Int_t iFirstStrip, const Int_t iLa
                                        const Bool_t doubling)
 {    
 /// fill
-  Double_t xyGlobal[2] = {0.};
+  Double_t xyGlobal[3] = {0.};
 
   for (Int_t istrip = iFirstStrip; istrip < iLastStrip; ++istrip) {
 
-    AliMpPad pad = fCurrentSeg->PadByIndices(AliMpIntPair(istrip,0),kTRUE);
+    AliMpPad pad = fkCurrentSeg->PadByIndices(istrip,0,kTRUE);
 
     if ( !pad.IsValid() )
     {
        StdoutToAliError(cout << "Pad not found in seg " << endl;
-                        fCurrentSeg->Print();
+                        fkCurrentSeg->Print();
                         cout << " ix,iy=" << istrip << "," << 0 << endl;
                         );
     }
-    Float_t xDim = pad.Dimensions().X(); // half size!
+    Float_t xDim = pad.GetDimensionX(); // half size!
 
     XYGlobal(pad,xyGlobal);
     
     if (!doubling) {   
       fXpos11[fCurrentLocalBoard].AddAt(xyGlobal[0], liStripCircuit);
+      fXwidth11[fCurrentLocalBoard].AddAt(2. * xDim, liStripCircuit);
     } else if (doubling) {
 
       fXpos11[fCurrentLocalBoard].AddAt(TMath::Sign(1.,xyGlobal[0]) * 
                                  (TMath::Abs(xyGlobal[0]) - xDim/2.), 2*liStripCircuit);
+      fXwidth11[fCurrentLocalBoard].AddAt(2. * xDim, 2*liStripCircuit);
 
       fXpos11[fCurrentLocalBoard].AddAt(TMath::Sign(1.,xyGlobal[0]) *
                                  (TMath::Abs(fXpos11[fCurrentLocalBoard][2*liStripCircuit]) + xDim),
                                        2*liStripCircuit + 1); 
+      fXwidth11[fCurrentLocalBoard].AddAt(2. * xDim, 2*liStripCircuit + 1);
     }
 
     liStripCircuit++;
@@ -389,19 +449,24 @@ void AliMUONTriggerCircuit::XYGlobal(const AliMpPad& pad,
 /// note: no need for transformation for pad dimensions
   
   // get the pad position and dimensions
-  Double_t xl1 = pad.Position().X();
-  Double_t yl1 = pad.Position().Y();
-  Double_t zg1 = 0;
+  Double_t xl1 = pad.GetPositionX();
+  Double_t yl1 = pad.GetPositionY();
   
   // positions from local to global 
-  fTransformer->Local2Global(fCurrentDetElem, xl1, yl1, 0, 
-                                 xyGlobal[0], xyGlobal[1], zg1);
+  fkTransformer->Local2Global(fCurrentDetElem, xl1, yl1, 0, 
+                                 xyGlobal[0], xyGlobal[1], xyGlobal[2]);
 }
 
 
 //----------------------------------------------------------------------
 //--- methods which return member data related info
 //----------------------------------------------------------------------
+//----------------------------------------------------------------------
+Float_t AliMUONTriggerCircuit::GetX11Pos(Int_t localBoardId, Int_t istrip) const 
+{
+/// returns X position of Y strip istrip in MC11
+  return fXpos11[localBoardId][istrip];
+}
 Float_t AliMUONTriggerCircuit::GetY11Pos(Int_t localBoardId, Int_t istrip) const 
 {
 /// returns Y position of X strip istrip in MC11
@@ -414,10 +479,32 @@ Float_t AliMUONTriggerCircuit::GetY21Pos(Int_t localBoardId, Int_t istrip) const
   return fYpos21[localBoardId][istrip];
 }
 //----------------------------------------------------------------------
-Float_t AliMUONTriggerCircuit::GetX11Pos(Int_t localBoardId, Int_t istrip) const 
+Float_t AliMUONTriggerCircuit::GetZ11Pos(Int_t localBoardId, Int_t istrip) const 
 {
-/// returns X position of Y strip istrip in MC11
-  return fXpos11[localBoardId][istrip];
+/// returns Z position of X strip istrip in MC11
+  return fZpos11[localBoardId][istrip];
+}
+//----------------------------------------------------------------------
+Float_t AliMUONTriggerCircuit::GetZ21Pos(Int_t localBoardId, Int_t istrip) const 
+{
+/// returns Z position of X strip istrip in MC21
+  return fZpos21[localBoardId][istrip];
+}
+Float_t AliMUONTriggerCircuit::GetX11Width(Int_t localBoardId, Int_t istrip) const 
+{
+/// returns width of Y strip istrip in MC11
+  return fXwidth11[localBoardId][istrip];
+}
+Float_t AliMUONTriggerCircuit::GetY11Width(Int_t localBoardId, Int_t istrip) const 
+{
+/// returns width of X strip istrip in MC11
+  return fYwidth11[localBoardId][istrip];
+}
+//----------------------------------------------------------------------
+Float_t AliMUONTriggerCircuit::GetY21Width(Int_t localBoardId, Int_t istrip) const 
+{
+/// returns width of X strip istrip in MC21
+  return fYwidth21[localBoardId][istrip];
 }
 
 //----------------------------------------------------------------------
@@ -428,8 +515,8 @@ Int_t AliMUONTriggerCircuit::FirstStrip(AliMpLocalBoard* localBoard)
   Int_t iFirstStrip = -1;
   Int_t boardNumber = atoi(localBoard->GetName()+6);
 
-  Int_t iline = localBoard->GetPosition().GetFirst();
-  Int_t icol  = localBoard->GetPosition().GetSecond();
+  Int_t iline = AliMp::PairFirst(localBoard->GetPosition());
+  Int_t icol  = AliMp::PairSecond(localBoard->GetPosition());
   if ( iline == 5 ) --icol;
 
   switch (boardNumber)
@@ -456,7 +543,6 @@ Float_t AliMUONTriggerCircuit::PtCal(Int_t localBoardId, Int_t istripX, Int_t id
 /// returns calculated pt for circuit/istripX/idev/istripY according 
 /// to the formula of the TRD. Note : idev (input) is in [0+30]
 
-  //  Int_t jdev = idev - 15;        // jdev in [-15+15]
   Int_t istripX2=istripX+idev+1; // find istripX2 using istripX and idev
 
   Float_t yPosX1=fYpos11[localBoardId][istripX];
@@ -464,11 +550,11 @@ Float_t AliMUONTriggerCircuit::PtCal(Int_t localBoardId, Int_t istripX, Int_t id
   Float_t xPosY1=fXpos11[localBoardId][istripY];
 
 // Z distance between IP and center of dipole
-  Float_t zf= TMath::Abs(0.5 *(AliMUONConstants::CoilZ() + AliMUONConstants::YokeZ()));
-  Float_t z1=AliMUONConstants::DefaultChamberZ(10);
-  Float_t z2=AliMUONConstants::DefaultChamberZ(12);
-  Float_t thetaDev=(1./zf)*(yPosX1*z2-yPosX2*z1)/(z2-z1);
+  Float_t zf= 0.5 *(AliMUONConstants::CoilZ() + AliMUONConstants::YokeZ());
+  Float_t z1=fZpos11[localBoardId][istripX];
+  Float_t z2=fZpos21[localBoardId][istripX2];
+  Float_t thetaDev=(1./TMath::Abs(zf))*(yPosX1*z2-yPosX2*z1)/(z2-z1);
   Float_t xf=xPosY1*zf/z1; 
   Float_t yf=yPosX2-((yPosX2-yPosX1)*(z2-zf))/(z2-z1);
-  return (3.*0.3/TMath::Abs(thetaDev)) * TMath::Sqrt(xf*xf+yf*yf)/zf;
+  return (3.*0.3/TMath::Abs(thetaDev)) * TMath::Sqrt(xf*xf+yf*yf)/TMath::Abs(zf);
 }