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(),
50 // add to St345SlatSegmentation
55 // add to St345SlatSegmentation
56 for (Int_t i=0; i<7; i++) {
67 //___________________________________________
68 AliMUONTriggerSegmentation::AliMUONTriggerSegmentation(Bool_t bending)
69 : AliMUONVGeometryDESegmentation(),
87 // add to St345SlatSegmentation
92 // Non default constructor
93 fNsec = 4; // 4 sector densities at most per slat
94 fNDiv = new TArrayI(fNsec);
95 fDpxD = new TArrayF(fNsec);
96 fDpyD = new TArrayF(fNsec);
97 (*fNDiv)[0]=(*fNDiv)[1]=(*fNDiv)[2]=(*fNDiv)[3]=0;
98 (*fDpxD)[0]=(*fDpxD)[1]=(*fDpxD)[2]=(*fDpxD)[3]=0;
99 (*fDpyD)[0]=(*fDpyD)[1]=(*fDpyD)[2]=(*fDpyD)[3]=0;
100 // add to St345SlatSegmentation
101 for (Int_t i=0; i<7; i++) {
111 //----------------------------------------------------------------------
112 AliMUONTriggerSegmentation::AliMUONTriggerSegmentation(const AliMUONTriggerSegmentation& rhs) : AliMUONVGeometryDESegmentation(rhs)
114 AliFatal("Not implemented.");
116 //----------------------------------------------------------------------
117 AliMUONTriggerSegmentation::~AliMUONTriggerSegmentation()
120 /* if (fNDiv) delete fNDiv;
121 if (fDpxD) delete fDpxD;
122 if (fDpyD) delete fDpyD;
125 //----------------------------------------------------------------------
126 AliMUONTriggerSegmentation& AliMUONTriggerSegmentation::operator=(const AliMUONTriggerSegmentation& rhs)
128 // Protected assignement operator
129 if (this == &rhs) return *this;
130 AliFatal("Not implemented.");
133 //----------------------------------------------------------------------
134 Bool_t AliMUONTriggerSegmentation::HasPad(Int_t ix, Int_t iy)
136 // check if steping outside the limits
142 GetPadLoc2Glo(ixLoc, iyLoc, ixGlo, iyGlo);
143 Int_t iModule = TMath::Abs(ixGlo)-Int_t(TMath::Abs(ixGlo)/10)*10 - 1;
144 if ((iy-1)>=fNstrip[iModule]) hasPad = false;
147 //____________________________________________________________________________
148 Float_t AliMUONTriggerSegmentation::Dpx(Int_t isec) const
150 // Return x-strip width
152 Int_t iModule = TMath::Abs(isec)-Int_t(TMath::Abs(isec)/10)*10 - 1;
153 // printf ("iModule = %i\n",iModule);
156 size = fStripXsize[iModule];
157 } else if (iModule==7) {
158 size = fStripXsize[iModule-1]/2;
162 //____________________________________________________________________________
163 Float_t AliMUONTriggerSegmentation::Dpy(Int_t isec) const
165 // Return y-strip width
167 Int_t iModule = TMath::Abs(isec)-Int_t(TMath::Abs(isec)/10)*10 - 1;
169 size = fStripYsize[iModule];
170 } else if (iModule==7) {
171 size = fStripYsize[iModule-1];
175 //----------------------------------------------------------------------------
176 void AliMUONTriggerSegmentation::GetPadLoc2Glo(Int_t ixLoc, Int_t iyLoc,
177 Int_t &ixGlo, Int_t &iyGlo)
179 // converts ixLoc & iyLoc into ixGlo & iyGLo (module,strip number)
183 ixGlo = (10 * fLineNumber) + ixLoc;
185 } else if (!fBending) {
186 Int_t iCountStrip = 0;
187 for (Int_t iModule=0; iModule<7; iModule++) {
188 for (Int_t iStrip=0; iStrip<fNstrip[iModule]; iStrip++) {
189 if ((ixLoc-1)==iCountStrip) {
190 ixGlo = (10 * fLineNumber) + iModule + 1;
197 // printf(" in GetPadLoc2Glo ixLoc iyLoc ixGlo iyGlo %i %i %i %i \n",ixLoc,iyLoc,ixGlo,iyGlo);
200 //----------------------------------------------------------------------------
201 void AliMUONTriggerSegmentation::GetPadC(Int_t ix, Int_t iy, Float_t &x, Float_t &y)
207 GetPadLoc2Glo(ixLoc, iyLoc, ixGlo, iyGlo);
211 // Returns real coordinates (x,y) for given pad coordinates (ix,iy)
214 // find module number
215 Int_t iModule = TMath::Abs(ix)-Int_t(TMath::Abs(ix)/10)*10 - 1;
218 x = (fModuleXmax[iModule] - fModuleXmin[iModule]) / 2.;
220 x = fModuleXmax[iModule-1] +
221 (fModuleXmax[iModule] - fModuleXmin[iModule]) / 2.;
223 y = fModuleYmin[iModule] +
224 (iy * fStripYsize[iModule]) + fStripYsize[iModule]/2.;
225 } else if (!fBending) {
226 if (TMath::Abs(ixGlo)-Int_t(TMath::Abs(ixGlo)/10)*10==7 && iyGlo>7) {
227 x = fModuleXmin[iModule] + 7 * fStripXsize[iModule] +
228 ( (iy -8)* fStripXsize[iModule]/2.) + fStripXsize[iModule]/4.;
229 y = fModuleYmin[iModule] + fStripYsize[iModule] / 2.;
231 x = fModuleXmin[iModule] +
232 (iy * fStripXsize[iModule]) + fStripXsize[iModule]/2.;
233 y = fModuleYmin[iModule] + fStripYsize[iModule] / 2.;
236 x = x - fRpcHalfXsize;
237 y = y - fRpcHalfYsize;
239 // 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);
242 //_____________________________________________________________________________
243 void AliMUONTriggerSegmentation::GetPadI(Float_t x, Float_t y, Int_t &ix, Int_t &iy)
245 // Returns pad coordinates (ix,iy) for given real coordinates (x,y)
247 x = x + fRpcHalfXsize;
248 y = y + fRpcHalfYsize;
249 // find module number
251 for (Int_t iModule=0; iModule<7; iModule++) { // modules
252 if ( x > fModuleXmin[iModule] && x < fModuleXmax[iModule] ) {
253 ix = (10 * fLineNumber) + iModule;
260 Float_t yMax = fModuleYmin[modNum];
262 Float_t xMax = fModuleXmin[modNum];
264 for (Int_t iStrip=0; iStrip<fNstrip[modNum]; iStrip++) {
267 yMax = yMin + fStripYsize[modNum];
268 if (y > yMin && y < yMax) iy = iStrip;
271 xMax = xMin + fStripXsize[modNum];
272 if (x > xMin && x < xMax) iy = iStrip;
276 // printf("in GetPadI ix iy x y %i %i %f %f \n",ix,iy,x,y);
278 //-------------------------------------------------------------------------
279 void AliMUONTriggerSegmentation::GetPadI(Float_t x, Float_t y , Float_t /*z*/, Int_t &ix, Int_t &iy)
281 GetPadI(x, y, ix, iy);
283 //____________________________________________________________________________
284 void AliMUONTriggerSegmentation::SetPadSize(Float_t p1, Float_t p2)
290 //-------------------------------------------------------------------------
291 void AliMUONTriggerSegmentation::SetLineNumber(Int_t iLineNumber){
292 fLineNumber = iLineNumber;
294 //-------------------------------------------------------------------------
295 void AliMUONTriggerSegmentation::SetNstrip(Int_t nStrip[7]){
296 for (Int_t i=0; i<7; i++) fNstrip[i]=nStrip[i];
298 //-------------------------------------------------------------------------
299 void AliMUONTriggerSegmentation::SetStripYsize(Float_t stripYsize[7]){
300 for (Int_t i=0; i<7; i++) fStripYsize[i]=stripYsize[i];
302 //-------------------------------------------------------------------------
303 void AliMUONTriggerSegmentation::SetStripXsize(Float_t stripXsize[7]){
304 for (Int_t i=0; i<7; i++) fStripXsize[i]=stripXsize[i];
306 //-------------------------------------------------------------------------
307 void AliMUONTriggerSegmentation::SetPad(Int_t ix, Int_t iy)
310 // Sets virtual pad coordinates, needed for evaluating pad response
311 // outside the tracking program
312 GetPadC(ix,iy,fX,fY);
313 fSector=Sector(ix,iy);
315 //---------------------------------------------------------------------------
316 void AliMUONTriggerSegmentation::SetHit(Float_t x, Float_t y)
323 //----------------------------------------------------------------------------
324 void AliMUONTriggerSegmentation::SetHit(Float_t xhit, Float_t yhit, Float_t /*zhit*/)
329 //--------------------------------------------------------------------------
330 Int_t AliMUONTriggerSegmentation::Sector(Int_t ix, Int_t iy)
332 // Determine segmentation zone from pad coordinates
337 GetPadLoc2Glo(ixLoc, iyLoc, ixGlo, iyGlo);
339 TMath::Abs(ixGlo)-Int_t(TMath::Abs(ixGlo)/10)*10==7 && iyGlo>7) {
340 return ixGlo + 1; // different strip width within same module
346 //-----------------------------------------------------------------------------
347 void AliMUONTriggerSegmentation::
348 IntegrationLimits(Float_t& x1,Float_t& x2,Float_t& y1, Float_t& y2)
350 // Returns integration limits for current pad
352 x1=fXhit-fX-Dpx(fSector)/2.;
354 y1=fYhit-fY-Dpy(fSector)/2.;
356 // printf("\n Integration Limits %f %f %f %f %d %f", x1, x2, y1, y2, fSector, Dpx(fSector));
359 //-----------------------------------------------------------------------------
360 void AliMUONTriggerSegmentation::
361 Neighbours(Int_t iX, Int_t iY, Int_t* Nlist, Int_t Xlist[10], Int_t Ylist[10])
363 // Returns list of next neighbours for given Pad (iX, iY)
375 Int_t sector = Sector(iX,iY);
377 if (iY+1 <= fNpyS[sector]) {
389 //--------------------------------------------------------------------------
390 void AliMUONTriggerSegmentation::Init(Int_t detectionElementId,
392 Float_t stripYsize[7],
393 Float_t stripXsize[7],
396 // printf(" fBending: %d \n",fBending);
399 if (fBending) nStripMax = nStrip[0];
401 for (Int_t i=0; i<7; i++) {
402 fNstrip[i]=nStrip[i];
403 fStripYsize[i]=stripYsize[i];
404 fStripXsize[i]=stripXsize[i];
407 // take care of offset in Y in chamber 5, first module
408 fModuleYmin[0] = offset;
411 Int_t npad = 0; // number of pad in x and y
412 for (Int_t iModule=0; iModule<7; iModule++) { // modules
413 fModuleXmin[iModule] = tmp;
414 npad = npad + fNstrip[iModule];
416 fModuleXmax[iModule] =
417 fModuleXmin[iModule] + fStripXsize[iModule];
418 } else if (!fBending) {
420 fModuleXmax[iModule] =
421 fModuleXmin[iModule] + fStripXsize[iModule]*fNstrip[iModule];
422 } else if (iModule==6) {
423 fModuleXmax[iModule] =
424 fModuleXmin[iModule] +
425 (fStripXsize[iModule]*fNstrip[iModule]/2) +
426 (fStripXsize[iModule]/2.*fNstrip[iModule]/2);
429 tmp = fModuleXmax[iModule];
431 // calculate nStripMax in x & y
433 if (fNstrip[iModule] > nStripMax) nStripMax = fNstrip[iModule];
434 } else if (!fBending) {
435 for (Int_t iStrip=0; iStrip<fNstrip[iModule]; iStrip++) nStripMax++;
440 // associate nStripMax
444 } else if (!fBending) {
449 // calculate half size in x & y (to shift the local coordinate ref. system)
453 for (Int_t iModule=0; iModule<7; iModule++)
454 fRpcHalfXsize = fRpcHalfXsize + fStripXsize[iModule];
455 fRpcHalfYsize = fNstrip[1] * fStripYsize[1];
456 } else if (!fBending) {
457 fRpcHalfXsize = fModuleXmax[6];
458 fRpcHalfYsize = fStripYsize[1];
460 fRpcHalfXsize = fRpcHalfXsize / 2.;
461 fRpcHalfYsize = fRpcHalfYsize / 2.;
464 printf(" fNpx fNpy fRpcHalfXsize fRpcHalfYsize = %i %i %f %f \n",
465 fNpx,fNpy,fRpcHalfXsize,fRpcHalfYsize);
469 for (Int_t iModule=0; iModule<7; iModule++) {
470 printf(" iModule fModuleXmin fModuleXmax fModuleYmin fStripXsize fStripYsize %i %f %f %f %f %f\n",
471 iModule,fModuleXmin[iModule],fModuleXmax[iModule],
472 fModuleYmin[iModule],
473 fStripXsize[iModule],fStripYsize[iModule]);
476 for (Int_t iModule=0; iModule<7; iModule++) {
477 printf(" iModule fNstrip fStripXsize fStripYsize %i %i %f %f \n",
478 iModule,fNstrip[iModule],
479 fStripXsize[iModule],fStripYsize[iModule]);
485 // printf("npad = %i",npad);
487 fId = detectionElementId;