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)
28 AliMUONTriggerSegmentation::AliMUONTriggerSegmentation(Bool_t bending)
29 : AliMUONVGeometryDESegmentation(),
47 // Non default constructor
48 fNsec = 7; // 4 sector densities at most per slat
49 /* fNDiv = new TArrayI(fNsec);
50 fDpxD = new TArrayF(fNsec);
51 fDpyD = new TArrayF(fNsec);
52 (*fNDiv)[0]=(*fNDiv)[1]=(*fNDiv)[2]=(*fNDiv)[3]=0;
53 (*fDpxD)[0]=(*fDpxD)[1]=(*fDpxD)[2]=(*fDpxD)[3]=0;
54 (*fDpyD)[0]=(*fDpyD)[1]=(*fDpyD)[2]=(*fDpyD)[3]=0;
57 //----------------------------------------------------------------------
58 AliMUONTriggerSegmentation::AliMUONTriggerSegmentation(const AliMUONTriggerSegmentation& rhs) : AliMUONVGeometryDESegmentation(rhs)
60 AliFatal("Not implemented.");
62 //----------------------------------------------------------------------
63 AliMUONTriggerSegmentation::~AliMUONTriggerSegmentation()
66 /* if (fNDiv) delete fNDiv;
67 if (fDpxD) delete fDpxD;
68 if (fDpyD) delete fDpyD;
71 //----------------------------------------------------------------------
72 AliMUONTriggerSegmentation& AliMUONTriggerSegmentation::operator=(const AliMUONTriggerSegmentation& rhs)
74 // Protected assignement operator
75 if (this == &rhs) return *this;
76 AliFatal("Not implemented.");
79 //____________________________________________________________________________
80 Float_t AliMUONTriggerSegmentation::Dpx(Int_t isec) const
82 // Return x-strip width
83 Int_t iModule = TMath::Abs(isec)-Int_t(TMath::Abs(isec)/10)*10 - 1;
84 return fStripXsize[iModule];
86 //____________________________________________________________________________
87 Float_t AliMUONTriggerSegmentation::Dpy(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 fStripYsize[iModule];
93 //----------------------------------------------------------------------------
94 void AliMUONTriggerSegmentation::GetPadLoc2Glo(Int_t ixLoc, Int_t iyLoc,
95 Int_t &ixGlo, Int_t &iyGlo)
100 ixGlo = (10 * fLineNumber) + ixLoc;
102 } else if (!fBending) {
103 Int_t iCountStrip = 0;
104 for (Int_t iModule=0; iModule<7; iModule++) {
105 for (Int_t iStrip=0; iStrip<fNstrip[iModule]; iStrip++) {
106 if ((ixLoc-1)==iCountStrip) {
107 ixGlo = (10 * fLineNumber) + iModule + 1;
114 // printf(" in GetPadLoc2Glo ixLoc iyLoc ixGlo iyGlo %i %i %i %i \n",ixLoc,iyLoc,ixGlo,iyGlo);
117 //----------------------------------------------------------------------------
118 void AliMUONTriggerSegmentation::GetPadC(Int_t ix, Int_t iy, Float_t &x, Float_t &y)
124 GetPadLoc2Glo(ixLoc, iyLoc, ixGlo, iyGlo);
128 // Returns real coordinates (x,y) for given pad coordinates (ix,iy)
131 // find module number
132 Int_t iModule = TMath::Abs(ix)-Int_t(TMath::Abs(ix)/10)*10 - 1;
135 x = (fModuleXmax[iModule] - fModuleXmin[iModule]) / 2.;
137 x = fModuleXmax[iModule-1] +
138 (fModuleXmax[iModule] - fModuleXmin[iModule]) / 2.;
140 y = (iy * fStripYsize[iModule]) + fStripYsize[iModule]/2;
141 } else if (!fBending) {
142 x = fModuleXmin[iModule] +
143 (iy * fStripXsize[iModule]) + fStripXsize[iModule]/2;
144 y = fStripYsize[iModule] / 2;
146 x = x - fRpcHalfXsize;
147 y = y - fRpcHalfYsize;
149 // 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);
152 //_____________________________________________________________________________
153 void AliMUONTriggerSegmentation::GetPadI(Float_t x, Float_t y, Int_t &ix, Int_t &iy)
155 // Returns pad coordinates (ix,iy) for given real coordinates (x,y)
157 x = x + fRpcHalfXsize;
158 y = y + fRpcHalfYsize;
159 // find module number
161 for (Int_t iModule=0; iModule<7; iModule++) { // modules
162 if ( x > fModuleXmin[iModule] && x < fModuleXmax[iModule] ) {
163 ix = (10 * fLineNumber) + iModule;
170 Float_t yMax = fModuleYmin[modNum];
172 Float_t xMax = fModuleXmin[modNum];
174 for (Int_t iStrip=0; iStrip<fNstrip[modNum]; iStrip++) {
177 yMax = yMin + fStripYsize[modNum];
178 if (y > yMin && y < yMax) iy = iStrip;
181 xMax = xMin + fStripXsize[modNum];
182 if (x > xMin && x < xMax) iy = iStrip;
186 // printf("in GetPadI ix iy x y %i %i %f %f \n",ix,iy,x,y);
188 //-------------------------------------------------------------------------
189 void AliMUONTriggerSegmentation::GetPadI(Float_t x, Float_t y , Float_t /*z*/, Int_t &ix, Int_t &iy)
191 GetPadI(x, y, ix, iy);
193 //____________________________________________________________________________
194 void AliMUONTriggerSegmentation::SetPadSize(Float_t p1, Float_t p2)
200 //-------------------------------------------------------------------------
201 void AliMUONTriggerSegmentation::SetLineNumber(Int_t iLineNumber){
202 fLineNumber = iLineNumber;
204 //-------------------------------------------------------------------------
205 void AliMUONTriggerSegmentation::SetNstrip(Int_t nStrip[7]){
206 for (Int_t i=0; i<7; i++) fNstrip[i]=nStrip[i];
208 //-------------------------------------------------------------------------
209 void AliMUONTriggerSegmentation::SetStripYsize(Float_t stripYsize[7]){
210 for (Int_t i=0; i<7; i++) fStripYsize[i]=stripYsize[i];
212 //-------------------------------------------------------------------------
213 void AliMUONTriggerSegmentation::SetStripXsize(Float_t stripXsize[7]){
214 for (Int_t i=0; i<7; i++) fStripXsize[i]=stripXsize[i];
216 //-------------------------------------------------------------------------
217 void AliMUONTriggerSegmentation::SetPad(Int_t ix, Int_t iy)
220 // Sets virtual pad coordinates, needed for evaluating pad response
221 // outside the tracking program
222 GetPadC(ix,iy,fX,fY);
223 fSector=Sector(ix,iy);
225 //---------------------------------------------------------------------------
226 void AliMUONTriggerSegmentation::SetHit(Float_t x, Float_t y)
234 //----------------------------------------------------------------------------
235 void AliMUONTriggerSegmentation::SetHit(Float_t xhit, Float_t yhit, Float_t /*zhit*/)
240 //--------------------------------------------------------------------------
241 Int_t AliMUONTriggerSegmentation::Sector(Int_t ix, Int_t /*iy*/)
243 // Determine segmentation zone from pad coordinates
246 //-----------------------------------------------------------------------------
247 void AliMUONTriggerSegmentation::
248 IntegrationLimits(Float_t& x1,Float_t& x2,Float_t& y1, Float_t& y2)
250 // Returns integration limits for current pad
252 x1=fXhit-fX-Dpx(fSector)/2.;
254 y1=fYhit-fY-Dpy(fSector)/2.;
256 // printf("\n Integration Limits %f %f %f %f %d %f", x1, x2, y1, y2, fSector, Dpx(fSector));
259 //-----------------------------------------------------------------------------
260 void AliMUONTriggerSegmentation::
261 Neighbours(Int_t iX, Int_t iY, Int_t* Nlist, Int_t Xlist[10], Int_t Ylist[10])
263 // Returns list of next neighbours for given Pad (iX, iY)
275 Int_t sector = Sector(iX,iY);
277 if (iY+1 <= fNpyS[sector]) {
289 //--------------------------------------------------------------------------
290 void AliMUONTriggerSegmentation::Init(Int_t detectionElementId,
293 Float_t stripYsize[7],
294 Float_t stripXsize[7],
297 // printf(" fBending: %d \n",fBending);
298 // WARNING: pay attention to the fucking length of the chamber
299 // i.e. in the last module the y strip width varies within the module
300 // (thank you General Tecnica!)
302 fLineNumber = iLineNumber;
304 if (fBending) nStripMax = nStrip[0];
306 for (Int_t i=0; i<7; i++) {
307 fNstrip[i]=nStrip[i];
308 fStripYsize[i]=stripYsize[i];
309 fStripXsize[i]=stripXsize[i];
313 Int_t npad = 0; // number of pad in x and y
314 for (Int_t iModule=0; iModule<7; iModule++) { // modules
315 fModuleXmin[iModule] = tmp;
316 npad = npad + fNstrip[iModule];
318 fModuleXmax[iModule] =
319 fModuleXmin[iModule] + fStripXsize[iModule];
320 } else if (!fBending) {
322 fModuleXmax[iModule] =
323 fModuleXmin[iModule] + fStripXsize[iModule]*fNstrip[iModule];
324 } else if (iModule==6) {
325 fModuleXmax[iModule] =
326 fModuleXmin[iModule] +
327 (fStripXsize[iModule]*fNstrip[iModule]/2) +
328 (fStripXsize[iModule]/2.*fNstrip[iModule]/2);
331 tmp = fModuleXmax[iModule];
333 // calculate nStripMax in x & y
335 if (fNstrip[iModule] > nStripMax) nStripMax = fNstrip[iModule];
336 } else if (!fBending) {
337 for (Int_t iStrip=0; iStrip<fNstrip[iModule]; iStrip++) nStripMax++;
341 // take care of offset in Y in chamber 5, first module
342 fModuleYmin[0] = offset;
344 // associate nStripMax
348 } else if (!fBending) {
353 // calculate half size in x & y
357 for (Int_t iModule=0; iModule<7; iModule++)
358 fRpcHalfXsize = fRpcHalfXsize + fStripXsize[iModule];
359 fRpcHalfYsize = fNstrip[1] * fStripYsize[1];
360 } else if (!fBending) {
361 fRpcHalfXsize = fModuleXmax[6];
362 fRpcHalfYsize = fStripYsize[1];
364 fRpcHalfXsize = fRpcHalfXsize / 2.;
365 fRpcHalfYsize = fRpcHalfYsize / 2.;
368 printf(" fNpx fNpy fRpcHalfXsize fRpcHalfYsize = %i %i %f %f \n",
369 fNpx,fNpy,fRpcHalfXsize,fRpcHalfYsize);
371 for (Int_t iModule=0; iModule<7; iModule++) {
372 printf(" iModule fModuleXmin fModuleXmax fStripXsize fStripYsize %i %f %f %f %f\n",
373 iModule,fModuleXmin[iModule],fModuleXmax[iModule],
374 fStripXsize[iModule],fStripYsize[iModule]);
377 // printf("npad = %i",npad);
379 fId = detectionElementId;