]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONTriggerCircuit.cxx
Adding more bins in QA (Alis)
[u/mrichter/AliRoot.git] / MUON / AliMUONTriggerCircuit.cxx
index 255b48543896488c925c40159b03b8caae30770b..016f2067f4389a3d08581d7e4ef9b68991660124 100644 (file)
@@ -39,6 +39,7 @@
 #include "AliMpLocalBoard.h"
 #include "AliMpConstants.h"
 #include "AliMpPad.h"
+#include "AliMpEncodePair.h"
 
 #include "AliRun.h"
 #include "AliLog.h"
@@ -46,6 +47,8 @@
 #include <TMath.h>
 #include <Riostream.h>
 
+using std::cout;
+using std::endl;
 /// \cond CLASSIMP
 ClassImp(AliMUONTriggerCircuit)
 /// \endcond
@@ -62,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
@@ -78,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]);
+    */
   }
 
 }
@@ -91,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();
     }
 
 } 
@@ -109,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];
     }
 
 }
@@ -128,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;
@@ -146,8 +186,8 @@ void AliMUONTriggerCircuit::LoadYPos(AliMpLocalBoard* const 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 
@@ -162,7 +202,7 @@ void AliMUONTriggerCircuit::LoadYPos(AliMpLocalBoard* const localBoard)
   Int_t iStripCircuit = 0;
 
   FillXstrips(icol, iFirstStrip, iLastStrip, 
-             iStripCircuit, fYpos11[fCurrentLocalBoard]);
+             iStripCircuit, kTRUE);
   
   //--- second plane 
   ichamber = 12;
@@ -177,7 +217,7 @@ void AliMUONTriggerCircuit::LoadYPos(AliMpLocalBoard* const localBoard)
   iStripCircuit = 8;
 
   FillXstrips(icol, iFirstStripMiddle, iLastStripMiddle,
-             iStripCircuit, fYpos21[fCurrentLocalBoard]);
+             iStripCircuit, kFALSE);
   
   // second plane upper part
   if (zeroUp == 0) { // something up
@@ -186,7 +226,7 @@ void AliMUONTriggerCircuit::LoadYPos(AliMpLocalBoard* const localBoard)
     Int_t icolUp = icol;
 
     // check if we need to move to another detElemId
-    AliMpPad pad = fkCurrentSeg->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;
@@ -207,11 +247,15 @@ void AliMUONTriggerCircuit::LoadYPos(AliMpLocalBoard* const 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
@@ -226,7 +270,7 @@ void AliMUONTriggerCircuit::LoadYPos(AliMpLocalBoard* const localBoard)
     Int_t icolDo = icol;
     
     // check if we need to move to another detElemId      
-    AliMpPad pad = fkCurrentSeg->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;             
@@ -252,11 +296,15 @@ void AliMUONTriggerCircuit::LoadYPos(AliMpLocalBoard* const 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,25 +312,35 @@ void AliMUONTriggerCircuit::LoadYPos(AliMpLocalBoard* const 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 = fkCurrentSeg->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;
                        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++;
   }    
 }
@@ -311,8 +369,8 @@ void AliMUONTriggerCircuit::LoadXPos(AliMpLocalBoard* const 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);
@@ -347,11 +405,11 @@ 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 = fkCurrentSeg->PadByIndices(AliMpIntPair(istrip,0),kTRUE);
+    AliMpPad pad = fkCurrentSeg->PadByIndices(istrip,0,kTRUE);
 
     if ( !pad.IsValid() )
     {
@@ -360,20 +418,23 @@ void AliMUONTriggerCircuit::FillYstrips(const Int_t iFirstStrip, const Int_t iLa
                         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++;
@@ -388,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 
   fkTransformer->Local2Global(fCurrentDetElem, xl1, yl1, 0, 
-                                 xyGlobal[0], xyGlobal[1], zg1);
+                                 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
@@ -413,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];
 }
 
 //----------------------------------------------------------------------
@@ -427,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)
@@ -455,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];
@@ -463,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);
 }