Code from MUON-dev joined
[u/mrichter/AliRoot.git] / MUON / AliMUONSegmentationTriggerY.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
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  **************************************************************************/
15
16 /*
17 $Log$
18 Revision 1.1.2.1  2000/06/09 21:51:58  morsch
19 Code from AliMUONSegResTriggerY.cxx
20
21 */
22
23 /*
24 Old Log:
25 Revision 1.1.2.4  2000/05/05 10:17:04  morsch
26 Y strip numerotation changed (CP)
27
28 Revision 1.1.2.3  2000/04/26 12:33:40  morsch
29 Minor changes in some methods (CP)
30
31 Revision 1.1.2.2  2000/02/20 07:49:50  morsch
32 Bugs in Dpx, Dpy and ISector methods corrected (P.C.)
33
34 Revision 1.1.2.1  2000/02/17 14:34:57  morsch
35 Draft version from P. Crochet
36
37 */
38
39 #include "AliMUONSegmentationTriggerY.h"
40 #include "TMath.h"
41 #include "TRandom.h"
42 #include "TArc.h"
43 #include "AliMUONChamber.h"
44 #include <iostream.h> 
45 ClassImp(AliMUONSegmentationTriggerY)
46
47 void AliMUONSegmentationTriggerY::Init(AliMUONChamber* Chamber)
48 {
49   cout << "Initialize Trigger Chamber Geometry Y " << "\n";    
50   AliMUONSegmentationTrigger::Init(Chamber);
51     
52 // calculate x & y position of Y strips
53   for (Int_t imodule=0; imodule<fgNmodule; imodule++) {    
54     Float_t width=StripSizeY(fgNum[imodule]);
55     for (Int_t istrip=0; istrip<fgNstripy[imodule]; istrip++){
56       if (imodule<63) {
57         fXofysmin[imodule][istrip]=(fgXcmin[imodule]+width*(istrip))*fZscale;
58         fXofysmax[imodule][istrip]=(fgXcmin[imodule]+width*(istrip+1))*fZscale;
59       } else {  
60         fXofysmin[imodule][istrip]=-1.*fXofysmax[imodule-63][istrip];
61         fXofysmax[imodule][istrip]=-1.*fXofysmin[imodule-63][istrip];
62       }      
63       fYofysmin[imodule][istrip] = fgYcmin[imodule]*fZscale;
64       fYofysmax[imodule][istrip] = fgYcmax[imodule]*fZscale;
65     }
66   }
67
68 }
69
70 //------------------------------------------------------------------
71 void AliMUONSegmentationTriggerY::GetPadIxy(Float_t x,Float_t y,Int_t &ix,Int_t &iy){
72 //  Returns pad coordinates (ix,iy) for given real coordinates (x,y)
73 //  x,y = real coordinates; ix = module number , iy = strip number
74
75   ix = 0;    
76   iy = 0;
77   for (Int_t imodule=0; imodule<fgNmodule; imodule++) {
78     for (Int_t istrip=0; istrip<fgNstripy[imodule]; istrip++){
79       if (x>fXofysmin[imodule][istrip]&&x<fXofysmax[imodule][istrip]&&
80           y>fYofysmin[imodule][istrip]&&y<fYofysmax[imodule][istrip]){
81         ix = fgNum[imodule];
82         iy = istrip;
83       }
84     }
85   }
86 }
87
88 //------------------------------------------------------------------
89 void AliMUONSegmentationTriggerY::GetPadCxy(Int_t ix, Int_t iy, Float_t &x, Float_t &y){
90 //  Returns real coordinates (x,y) for given pad coordinates (ix,iy)
91 //  ix = module number , iy = strip number;  x,y = center of strip
92   x = 0.;    
93   y = 0.;
94   for (Int_t imodule=0; imodule<fgNmodule; imodule++) {
95     if (fgNum[imodule]==ix){
96       x=fXofysmin[imodule][iy]+(fXofysmax[imodule][iy]-fXofysmin[imodule][iy])/2.;
97       y=fYofysmin[imodule][iy]+(fYofysmax[imodule][iy]-fYofysmin[imodule][iy])/2.;
98     }
99   }
100 }
101
102 //------------------------------------------------------------------
103 void AliMUONSegmentationTriggerY::SetPadSize(Float_t p1, Float_t p2)
104 {
105 //  Sets the padsize 
106 //  
107   fDpx=p1;
108   fDpy=p2;
109 }
110
111 //------------------------------------------------------------------
112 void AliMUONSegmentationTriggerY::
113 Neighbours(Int_t iX, Int_t iY, Int_t* Nlist, Int_t Xlist[2], Int_t Ylist[2]){
114 // Returns list of next neighbours for given Pad (ix, iy)  
115   Int_t absiX=TMath::Abs(iX); 
116   *Nlist = 0;
117   
118   if (absiX!=0) {                         
119     Int_t numModule=ModuleNumber(absiX);
120     
121     if (iY==fgNstripy[numModule]-1) {                      // strip right 
122       if (absiX%10!=7) {
123         *Nlist=1;
124         Xlist[0]=absiX+1;
125         Ylist[0]=0;
126       } 
127     } else {
128       *Nlist=1;
129       Xlist[0]=absiX;
130       Ylist[0]=iY+1;
131     }
132     
133     if (iY==0) {                                            // strip left 
134       if (absiX%10!=1&&absiX!=52) {
135         *Nlist=*Nlist+1;
136         Xlist[*Nlist-1]=absiX-1;
137         Ylist[*Nlist-1]=fgNstripy[numModule-1]-1;
138       } 
139     } else {
140       *Nlist=*Nlist+1;
141       Xlist[*Nlist-1]=absiX;
142       Ylist[*Nlist-1]=iY-1;
143     }
144     
145     if (iX<0) {                                  // left side of chamber 
146       for (Int_t i=0; i<*Nlist; i++) {Xlist[i]=-Xlist[i];}
147     }
148   }     
149 }
150
151 //------------------------------------------------------------------   
152 void AliMUONSegmentationTriggerY::SetPad(Int_t ix, Int_t iy)
153 {
154   // Sets virtual pad coordinates, needed for evaluating pad response 
155   // outside the tracking program 
156   GetPadCxy(ix,iy,fx,fy);
157   GetPadIxy(fx,fy,fix,fiy);
158   fSector=Sector(ix,iy);    
159 }
160
161 //------------------------------------------------------------------   
162 Int_t AliMUONSegmentationTriggerY::ISector()
163 { return fSector;}
164
165 //------------------------------------------------------------------   
166 Int_t AliMUONSegmentationTriggerY::Ix()
167 { return fix;}
168
169 //------------------------------------------------------------------   
170 Int_t AliMUONSegmentationTriggerY::Iy()
171 { return fiy;}
172
173 //------------------------------------------------------------------
174 Float_t AliMUONSegmentationTriggerY::Dpx(Int_t isec)
175 { // returns x size of y strips for sector isec
176
177   if (isec==1) {
178     return 2.125*fZscale;
179   } else if (isec==2) {
180     return 2.125*fZscale;
181   } else if (isec==3) {
182     return 2.125*fZscale;
183   } else if (isec==4) {
184     return 4.25*fZscale;
185   } else {
186     return 0.;  
187   }       
188 }
189
190 //------------------------------------------------------------------
191 Float_t AliMUONSegmentationTriggerY::Dpy(Int_t isec)
192 { // returns y size of y strips for sector isec
193     // cout << " In AliMUONSegmentationTriggerX::Dpx" << "\n";  
194
195   if (isec==1) {
196     return 68.0*fZscale;
197   } else if (isec==2) {
198     return 51.0*fZscale;
199   } else if (isec==3) {
200     return 68.0*fZscale;
201   } else if (isec==4) {
202     return 68.0*fZscale;
203   } else if (isec==5) {
204     return 68.0*fZscale;
205   } else {
206     return 0.;
207   }
208
209 }
210
211 //------------------------------------------------------------------   
212 void AliMUONSegmentationTriggerY::SetHit(Float_t xhit, Float_t yhit)
213 { AliMUONSegmentationTrigger::SetHit(xhit,yhit);}
214
215 //------------------------------------------------------------------   
216 Int_t AliMUONSegmentationTriggerY::Sector(Int_t ix, Int_t iy)
217 {
218 // Returns sector number for given module
219 // 
220   Int_t absix=TMath::Abs(ix);
221   Int_t iwidth=Int_t(StripSizeY(absix));
222     
223   if (absix==52) {
224     return 1;
225   } else if (absix==41||absix==61) {
226     return 2;
227   } else if (iwidth==2) {
228     return 3;
229   } else if (iwidth==4) {
230     return 4;
231   } else {
232     return 0;
233   }
234 }
235
236 //------------------------------------------------------------------   
237 void AliMUONSegmentationTriggerY::
238 IntegrationLimits(Float_t& x1, Float_t& x2, Float_t& x3, Float_t& width) 
239
240 // returns quantities needed to evaluate neighbour strip response
241   Int_t ix,iy;
242   Float_t xstrip,ystrip;
243   GetPadIxy(fxhit,fyhit,ix,iy);  
244   GetPadCxy(ix,iy,xstrip,ystrip);  
245   x1=fxhit;        // hit x position
246   x2=xstrip;       // x coordinate of the main strip
247   x3=fx;           // current strip real x coordinate  
248   width=StripSizeY(ix);   // width of the main strip 
249 }
250
251
252
253