#include <TMath.h>
#include <Riostream.h>
+using std::cout;
+using std::endl;
/// \cond CLASSIMP
ClassImp(AliMUONTriggerCircuit)
/// \endcond
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
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]);
+ */
}
}
fXpos11[i].Reset();
fYpos11[i].Reset();
fYpos21[i].Reset();
+ fZpos11[i].Reset();
+ fZpos21[i].Reset();
+ fXwidth11[i].Reset();
+ fYwidth11[i].Reset();
+ fYwidth21[i].Reset();
}
}
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];
}
}
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;
Int_t iStripCircuit = 0;
FillXstrips(icol, iFirstStrip, iLastStrip,
- iStripCircuit, fYpos11[fCurrentLocalBoard]);
+ iStripCircuit, kTRUE);
//--- second plane
ichamber = 12;
iStripCircuit = 8;
FillXstrips(icol, iFirstStripMiddle, iLastStripMiddle,
- iStripCircuit, fYpos21[fCurrentLocalBoard]);
+ iStripCircuit, kFALSE);
// second plane upper part
if (zeroUp == 0) { // something up
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
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
}
//----------------------------------------------------------------------
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(icol-1,istrip,kTRUE);
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++;
}
}
const Bool_t doubling)
{
/// fill
- Double_t xyGlobal[2] = {0.};
+ Double_t xyGlobal[3] = {0.};
for (Int_t istrip = iFirstStrip; istrip < iLastStrip; ++istrip) {
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++;
/// 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
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];
}
//----------------------------------------------------------------------
/// 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];
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);
}