1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
21 #include "AliMUONTriggerSegmentation.h"
24 //___________________________________________
25 ClassImp(AliMUONTriggerSegmentation)
27 AliMUONTriggerSegmentation::AliMUONTriggerSegmentation()
28 : AliMUONVGeometryDESegmentation(),
32 // default constructor
34 //___________________________________________
35 AliMUONTriggerSegmentation::AliMUONTriggerSegmentation(Bool_t bending)
36 : AliMUONVGeometryDESegmentation(),
54 // Non default constructor
55 fNsec = 7; // 4 sector densities at most per slat
56 /* fNDiv = new TArrayI(fNsec);
57 fDpxD = new TArrayF(fNsec);
58 fDpyD = new TArrayF(fNsec);
59 (*fNDiv)[0]=(*fNDiv)[1]=(*fNDiv)[2]=(*fNDiv)[3]=0;
60 (*fDpxD)[0]=(*fDpxD)[1]=(*fDpxD)[2]=(*fDpxD)[3]=0;
61 (*fDpyD)[0]=(*fDpyD)[1]=(*fDpyD)[2]=(*fDpyD)[3]=0;
64 //----------------------------------------------------------------------
65 AliMUONTriggerSegmentation::AliMUONTriggerSegmentation(const AliMUONTriggerSegmentation& rhs) : AliMUONVGeometryDESegmentation(rhs)
67 AliFatal("Not implemented.");
69 //----------------------------------------------------------------------
70 AliMUONTriggerSegmentation::~AliMUONTriggerSegmentation()
73 /* if (fNDiv) delete fNDiv;
74 if (fDpxD) delete fDpxD;
75 if (fDpyD) delete fDpyD;
78 //----------------------------------------------------------------------
79 AliMUONTriggerSegmentation& AliMUONTriggerSegmentation::operator=(const AliMUONTriggerSegmentation& rhs)
81 // Protected assignement operator
82 if (this == &rhs) return *this;
83 AliFatal("Not implemented.");
86 //____________________________________________________________________________
87 Float_t AliMUONTriggerSegmentation::Dpx(Int_t isec) const
89 // Return x-strip width
90 Int_t iModule = TMath::Abs(isec)-Int_t(TMath::Abs(isec)/10)*10 - 1;
91 return fStripXsize[iModule];
93 //____________________________________________________________________________
94 Float_t AliMUONTriggerSegmentation::Dpy(Int_t isec) const
96 // Return x-strip width
97 Int_t iModule = TMath::Abs(isec)-Int_t(TMath::Abs(isec)/10)*10 - 1;
98 return fStripYsize[iModule];
100 //----------------------------------------------------------------------------
101 void AliMUONTriggerSegmentation::GetPadLoc2Glo(Int_t ixLoc, Int_t iyLoc,
102 Int_t &ixGlo, Int_t &iyGlo)
107 ixGlo = (10 * fLineNumber) + ixLoc;
109 } else if (!fBending) {
110 Int_t iCountStrip = 0;
111 for (Int_t iModule=0; iModule<7; iModule++) {
112 for (Int_t iStrip=0; iStrip<fNstrip[iModule]; iStrip++) {
113 if ((ixLoc-1)==iCountStrip) {
114 ixGlo = (10 * fLineNumber) + iModule + 1;
121 // printf(" in GetPadLoc2Glo ixLoc iyLoc ixGlo iyGlo %i %i %i %i \n",ixLoc,iyLoc,ixGlo,iyGlo);
124 //----------------------------------------------------------------------------
125 void AliMUONTriggerSegmentation::GetPadC(Int_t ix, Int_t iy, Float_t &x, Float_t &y)
131 GetPadLoc2Glo(ixLoc, iyLoc, ixGlo, iyGlo);
135 // Returns real coordinates (x,y) for given pad coordinates (ix,iy)
138 // find module number
139 Int_t iModule = TMath::Abs(ix)-Int_t(TMath::Abs(ix)/10)*10 - 1;
142 x = (fModuleXmax[iModule] - fModuleXmin[iModule]) / 2.;
144 x = fModuleXmax[iModule-1] +
145 (fModuleXmax[iModule] - fModuleXmin[iModule]) / 2.;
147 y = (iy * fStripYsize[iModule]) + fStripYsize[iModule]/2;
148 } else if (!fBending) {
149 x = fModuleXmin[iModule] +
150 (iy * fStripXsize[iModule]) + fStripXsize[iModule]/2;
151 y = fStripYsize[iModule] / 2;
153 x = x - fRpcHalfXsize;
154 y = y - fRpcHalfYsize;
156 // printf(" in GetPadC iModule ixloc iyloc ix iy x y %i %i %i %i %i %f %f \n",iModule,ixLoc,iyLoc,ix,iy,x,y);
159 //_____________________________________________________________________________
160 void AliMUONTriggerSegmentation::GetPadI(Float_t x, Float_t y, Int_t &ix, Int_t &iy)
162 // Returns pad coordinates (ix,iy) for given real coordinates (x,y)
164 x = x + fRpcHalfXsize;
165 y = y + fRpcHalfYsize;
166 // find module number
168 for (Int_t iModule=0; iModule<7; iModule++) { // modules
169 if ( x > fModuleXmin[iModule] && x < fModuleXmax[iModule] ) {
170 ix = (10 * fLineNumber) + iModule;
177 Float_t yMax = fModuleYmin[modNum];
179 Float_t xMax = fModuleXmin[modNum];
181 for (Int_t iStrip=0; iStrip<fNstrip[modNum]; iStrip++) {
184 yMax = yMin + fStripYsize[modNum];
185 if (y > yMin && y < yMax) iy = iStrip;
188 xMax = xMin + fStripXsize[modNum];
189 if (x > xMin && x < xMax) iy = iStrip;
193 // printf("in GetPadI ix iy x y %i %i %f %f \n",ix,iy,x,y);
195 //-------------------------------------------------------------------------
196 void AliMUONTriggerSegmentation::GetPadI(Float_t x, Float_t y , Float_t /*z*/, Int_t &ix, Int_t &iy)
198 GetPadI(x, y, ix, iy);
200 //____________________________________________________________________________
201 void AliMUONTriggerSegmentation::SetPadSize(Float_t p1, Float_t p2)
207 //-------------------------------------------------------------------------
208 void AliMUONTriggerSegmentation::SetLineNumber(Int_t iLineNumber){
209 fLineNumber = iLineNumber;
211 //-------------------------------------------------------------------------
212 void AliMUONTriggerSegmentation::SetNstrip(Int_t nStrip[7]){
213 for (Int_t i=0; i<7; i++) fNstrip[i]=nStrip[i];
215 //-------------------------------------------------------------------------
216 void AliMUONTriggerSegmentation::SetStripYsize(Float_t stripYsize[7]){
217 for (Int_t i=0; i<7; i++) fStripYsize[i]=stripYsize[i];
219 //-------------------------------------------------------------------------
220 void AliMUONTriggerSegmentation::SetStripXsize(Float_t stripXsize[7]){
221 for (Int_t i=0; i<7; i++) fStripXsize[i]=stripXsize[i];
223 //-------------------------------------------------------------------------
224 void AliMUONTriggerSegmentation::SetPad(Int_t ix, Int_t iy)
227 // Sets virtual pad coordinates, needed for evaluating pad response
228 // outside the tracking program
229 GetPadC(ix,iy,fX,fY);
230 fSector=Sector(ix,iy);
232 //---------------------------------------------------------------------------
233 void AliMUONTriggerSegmentation::SetHit(Float_t x, Float_t y)
241 //----------------------------------------------------------------------------
242 void AliMUONTriggerSegmentation::SetHit(Float_t xhit, Float_t yhit, Float_t /*zhit*/)
247 //--------------------------------------------------------------------------
248 Int_t AliMUONTriggerSegmentation::Sector(Int_t ix, Int_t /*iy*/)
250 // Determine segmentation zone from pad coordinates
253 //-----------------------------------------------------------------------------
254 void AliMUONTriggerSegmentation::
255 IntegrationLimits(Float_t& x1,Float_t& x2,Float_t& y1, Float_t& y2)
257 // Returns integration limits for current pad
259 x1=fXhit-fX-Dpx(fSector)/2.;
261 y1=fYhit-fY-Dpy(fSector)/2.;
263 // printf("\n Integration Limits %f %f %f %f %d %f", x1, x2, y1, y2, fSector, Dpx(fSector));
266 //-----------------------------------------------------------------------------
267 void AliMUONTriggerSegmentation::
268 Neighbours(Int_t iX, Int_t iY, Int_t* Nlist, Int_t Xlist[10], Int_t Ylist[10])
270 // Returns list of next neighbours for given Pad (iX, iY)
282 Int_t sector = Sector(iX,iY);
284 if (iY+1 <= fNpyS[sector]) {
296 //--------------------------------------------------------------------------
297 void AliMUONTriggerSegmentation::Init(Int_t detectionElementId,
300 Float_t stripYsize[7],
301 Float_t stripXsize[7],
304 // printf(" fBending: %d \n",fBending);
305 // WARNING: pay attention to the fucking length of the chamber
306 // i.e. in the last module the y strip width varies within the module
307 // (thank you General Tecnica!)
309 fLineNumber = iLineNumber;
311 if (fBending) nStripMax = nStrip[0];
313 for (Int_t i=0; i<7; i++) {
314 fNstrip[i]=nStrip[i];
315 fStripYsize[i]=stripYsize[i];
316 fStripXsize[i]=stripXsize[i];
320 Int_t npad = 0; // number of pad in x and y
321 for (Int_t iModule=0; iModule<7; iModule++) { // modules
322 fModuleXmin[iModule] = tmp;
323 npad = npad + fNstrip[iModule];
325 fModuleXmax[iModule] =
326 fModuleXmin[iModule] + fStripXsize[iModule];
327 } else if (!fBending) {
329 fModuleXmax[iModule] =
330 fModuleXmin[iModule] + fStripXsize[iModule]*fNstrip[iModule];
331 } else if (iModule==6) {
332 fModuleXmax[iModule] =
333 fModuleXmin[iModule] +
334 (fStripXsize[iModule]*fNstrip[iModule]/2) +
335 (fStripXsize[iModule]/2.*fNstrip[iModule]/2);
338 tmp = fModuleXmax[iModule];
340 // calculate nStripMax in x & y
342 if (fNstrip[iModule] > nStripMax) nStripMax = fNstrip[iModule];
343 } else if (!fBending) {
344 for (Int_t iStrip=0; iStrip<fNstrip[iModule]; iStrip++) nStripMax++;
348 // take care of offset in Y in chamber 5, first module
349 fModuleYmin[0] = offset;
351 // associate nStripMax
355 } else if (!fBending) {
360 // calculate half size in x & y
364 for (Int_t iModule=0; iModule<7; iModule++)
365 fRpcHalfXsize = fRpcHalfXsize + fStripXsize[iModule];
366 fRpcHalfYsize = fNstrip[1] * fStripYsize[1];
367 } else if (!fBending) {
368 fRpcHalfXsize = fModuleXmax[6];
369 fRpcHalfYsize = fStripYsize[1];
371 fRpcHalfXsize = fRpcHalfXsize / 2.;
372 fRpcHalfYsize = fRpcHalfYsize / 2.;
375 printf(" fNpx fNpy fRpcHalfXsize fRpcHalfYsize = %i %i %f %f \n",
376 fNpx,fNpy,fRpcHalfXsize,fRpcHalfYsize);
378 for (Int_t iModule=0; iModule<7; iModule++) {
379 printf(" iModule fModuleXmin fModuleXmax fStripXsize fStripYsize %i %f %f %f %f\n",
380 iModule,fModuleXmin[iModule],fModuleXmax[iModule],
381 fStripXsize[iModule],fStripYsize[iModule]);
384 // printf("npad = %i",npad);
386 fId = detectionElementId;