1 /////////////////////////////////////////////////////
2 // Segmentation and Response classes version 01 //
3 /////////////////////////////////////////////////////
10 #include "AliMUONSegResV01.h"
15 //___________________________________________
16 ClassImp(AliMUONsegmentationV01)
18 Float_t AliMUONsegmentationV01::Dpx(Int_t isec)
23 Float_t AliMUONsegmentationV01::Dpy(Int_t )
28 AliMUONsegmentationV01::AliMUONsegmentationV01()
34 fRSec[0]=fRSec[1]=fRSec[2]=fRSec[3]=0;
35 fNDiv[0]=fNDiv[1]=fNDiv[2]=fNDiv[3]=0;
36 fDpxD[0]=fDpxD[1]=fDpxD[2]=fDpxD[3]=0;
37 fCorr = new TObjArray(3);
43 void AliMUONsegmentationV01::SetSegRadii(Float_t r[4])
45 for (Int_t i=0; i<4; i++) {
47 //printf("\n R %d %f \n",i,fRSec[i]);
53 void AliMUONsegmentationV01::SetPadDivision(Int_t ndiv[4])
56 // Defines the pad size perp. to the anode wire (y) for different sectors.
58 for (Int_t i=0; i<4; i++) {
60 //printf("\n Ndiv %d %d \n",i,fNDiv[i]);
66 void AliMUONsegmentationV01::Init(AliMUONchamber* )
69 // Fill the arrays fCx (x-contour) and fNpxS (ix-contour) for each sector
70 // These arrays help in converting from real to pad co-ordinates and
74 //printf("\n Initialise segmentation v01 -- test !!!!!!!!!!!!!! \n");
75 fNpy=Int_t(fRSec[fNsec-1]/fDpy)+1;
79 for (Int_t i=fNsec-2; i>=0; i--){
80 fDpxD[i]=fDpxD[fNsec-1]/fNDiv[i];
81 //printf("\n test ---dx %d %f \n",i,fDpxD[i]);
85 // fill the arrays defining the pad segmentation boundaries
91 for(isec=0; isec<fNsec; isec++) {
93 // loop over pads along the aode wires
94 for (Int_t iy=1; iy<=fNpy; iy++) {
96 Float_t x=iy*fDpy-fDpy/2;
97 if (x > fRSec[isec]) {
101 ry=TMath::Sqrt(fRSec[isec]*fRSec[isec]-x*x);
103 dnx= Int_t((ry-fCx[isec-1][iy])/fDpxD[isec]);
104 if (isec < fNsec-1) {
105 if (TMath::Odd((Long_t)dnx)) dnx++;
107 fNpxS[isec][iy]=fNpxS[isec-1][iy]+dnx;
108 fCx[isec][iy]=fCx[isec-1][iy]+dnx*fDpxD[isec];
109 } else if (isec == 1) {
110 dnx= Int_t((ry-fCx[isec-1][iy])/fDpxD[isec]);
111 fNpxS[isec][iy]=fNpxS[isec-1][iy]+dnx;
112 add=4 - (fNpxS[isec][iy])%4;
113 if (add < 4) fNpxS[isec][iy]+=add;
114 dnx=fNpxS[isec][iy]-fNpxS[isec-1][iy];
115 fCx[isec][iy]=fCx[isec-1][iy]+dnx*fDpxD[isec];
117 dnx=Int_t(ry/fDpxD[isec]);
119 fCx[isec][iy]=dnx*fDpxD[isec];
125 // for debugging only
127 //printf("segmentationv01 - I was here ! \n");
130 Int_t AliMUONsegmentationV01::Sector(Int_t ix, Int_t iy)
132 Int_t absix=TMath::Abs(ix);
133 Int_t absiy=TMath::Abs(iy);
135 for (Int_t i=0; i<fNsec; i++) {
136 if (absix<=fNpxS[i][absiy]){
144 void AliMUONsegmentationV01::
145 GetPadIxy(Float_t x, Float_t y, Int_t &ix, Int_t &iy)
147 // returns pad coordinates (ix,iy) for given real coordinates (x,y)
149 iy = (y>0)? Int_t(y/fDpy)+1 : Int_t(y/fDpy)-1;
150 if (iy > fNpy) iy= fNpy;
151 if (iy < -fNpy) iy=-fNpy;
155 Float_t absx=TMath::Abs(x);
156 Int_t absiy=TMath::Abs(iy);
157 for (Int_t i=0; i < fNsec; i++) {
158 if (absx <= fCx[i][absiy]) {
164 ix= Int_t((absx-fCx[isec-1][absiy])/fDpxD[isec])
165 +fNpxS[isec-1][absiy]+1;
166 } else if (isec == 0) {
167 ix= Int_t(absx/fDpxD[isec])+1;
169 ix=fNpxS[fNsec-1][absiy]+1;
171 // printf("\n something %d %d \n",isec,absiy);
176 void AliMUONsegmentationV01::
177 GetPadCxy(Int_t ix, Int_t iy, Float_t &x, Float_t &y)
179 // returns real coordinates (x,y) for given pad coordinates (ix,iy)
181 y = (iy>0) ? Float_t(iy*fDpy)-fDpy/2. : Float_t(iy*fDpy)+fDpy/2.;
184 Int_t isec=AliMUONsegmentationV01::Sector(ix,iy);
186 Int_t absix=TMath::Abs(ix);
187 Int_t absiy=TMath::Abs(iy);
189 x=fCx[isec-1][absiy]+(absix-fNpxS[isec-1][absiy])*fDpxD[isec];
190 x=(ix>0) ? x-fDpxD[isec]/2 : -x+fDpxD[isec]/2;
196 void AliMUONsegmentationV01::
197 SetPad(Int_t ix, Int_t iy)
199 GetPadCxy(ix,iy,fx,fy);
200 fSector=Sector(ix,iy);
204 void AliMUONsegmentationV01::
205 FirstPad(Float_t xhit, Float_t yhit, Float_t dx, Float_t dy)
208 // Find the wire position (center of charge distribution)
209 Float_t x0a=GetAnod(xhit);
214 // and take fNsigma*sigma around this center
215 Float_t x01=x0a - dx;
216 Float_t x02=x0a + dx;
217 Float_t y01=yhit - dy;
218 Float_t y02=yhit + dy;
220 // find the pads over which the charge distributes
221 GetPadIxy(x01,y01,fixmin,fiymin);
222 GetPadIxy(x02,y02,fixmax,fiymax);
229 // Set current pad to lower left corner
230 if (fixmax < fixmin) fixmax=fixmin;
231 if (fiymax < fiymin) fiymax=fiymin;
234 GetPadCxy(fix,fiy,fx,fy);
238 void AliMUONsegmentationV01::NextPad()
241 // Step to next pad in integration region
245 // step from left to right
246 if (fx < fxmax && fx != 0) {
250 } else if (fiy != fiymax) {
253 // get y-position of next row (yc), xc not used here
254 GetPadCxy(fix,fiy,xc,yc);
255 // get x-pad coordiante for 1 pad in row (fix)
256 GetPadIxy(fxmin,yc,fix,iyc);
258 printf("\n Error: Stepping outside integration region\n ");
260 GetPadCxy(fix,fiy,fx,fy);
261 fSector=Sector(fix,fiy);
263 (fSector ==-1 || fSector==0 ||
264 TMath::Abs(fx)<1.5 || TMath::Abs(fy)<1.5))
267 // printf("\n this pad %f %f %d %d \n",fx,fy,fix,fiy);
271 Int_t AliMUONsegmentationV01::MorePads()
273 // Are there more pads in the integration region
275 if ((fx >= fxmax && fiy >= fiymax) || fy==0) {
282 void AliMUONsegmentationV01::
283 IntegrationLimits(Float_t& x1,Float_t& x2,Float_t& y1, Float_t& y2)
285 x1=fxhit-fx-Dpx(fSector)/2.;
287 y1=fyhit-fy-Dpy(fSector)/2.;
291 void AliMUONsegmentationV01::
292 Neighbours(Int_t iX, Int_t iY, Int_t* Nlist, Int_t Xlist[10], Int_t Ylist[10])
294 const Float_t epsilon=fDpy/1000;
297 Int_t ixx, iyy, isec1;
299 Int_t isec0=AliMUONsegmentationV01::Sector(iX,iY);
311 AliMUONsegmentationV01::GetPadCxy(iX,iY,x,y);
312 AliMUONsegmentationV01::GetPadIxy(x+epsilon,y+fDpy,ixx,iyy);
315 isec1=AliMUONsegmentationV01::Sector(ixx,iyy);
318 // no sector boundary crossing
324 } else if (isec1 < isec0) {
325 // finer segmentation
335 // coarser segmenation
337 if (TMath::Odd(iX-fNpxS[isec1-1][iY+1])) {
347 AliMUONsegmentationV01::GetPadCxy(iX,iY,x,y);
348 AliMUONsegmentationV01::GetPadIxy(x+epsilon,y-fDpy,ixx,iyy);
351 isec1=AliMUONsegmentationV01::Sector(ixx,iyy);
354 // no sector boundary crossing
360 } else if (isec1 < isec0) {
361 // finer segmentation
371 // coarser segmentation
373 if (TMath::Odd(iX-fNpxS[isec1-1][iY-1])) {
385 void AliMUONsegmentationV01::GiveTestPoints(Int_t &n, Float_t *x, Float_t *y)
388 x[0]=(fRSec[0]+fRSec[1])/2/TMath::Sqrt(2.);
390 x[1]=(fRSec[1]+fRSec[2])/2/TMath::Sqrt(2.);
392 x[2]=(fRSec[2]+fRSec[3])/2/TMath::Sqrt(2.);
396 void AliMUONsegmentationV01::Draw(Option_t *)
400 Float_t dx=0.95/fCx[3][1]/2;
401 Float_t dy=0.95/(Float_t(Npy()))/2;
406 for (Int_t iy=1; iy<Npy(); iy++)
408 for (Int_t isec=0; isec<4; isec++) {
413 x0=fCx[isec-1][iy]*dx;
418 box=new TBox(x0+xc,y0+yc,x1+xc,y1+yc);
419 box->SetFillColor(isec+1);
422 box=new TBox(-x1+xc,y0+yc,-x0+xc,y1+yc);
423 box->SetFillColor(isec+1);
426 box=new TBox(x0+xc,-y1+yc,x1+xc,-y0+yc);
427 box->SetFillColor(isec+1);
430 box=new TBox(-x1+xc,-y1+yc,-x0+xc,-y0+yc);
431 box->SetFillColor(isec+1);
436 void AliMUONsegmentationV01::SetCorrFunc(Int_t isec, TF1* func)
442 TF1* AliMUONsegmentationV01::CorrFunc(Int_t isec)
444 return (TF1*) (*fCorr)[isec];