91183666e173aeebc32463346e950530c345e3bf
[u/mrichter/AliRoot.git] / MUON / AliMUONSegmentationTrigger.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 /* $Id$ */
17
18 #include "AliMUONSegmentationTrigger.h"
19 #include "AliMUONTriggerConstants.h"
20 #include "AliRun.h"
21 #include "AliMUON.h"
22 #include <TMath.h>
23 #include <TRandom.h>
24 #include <TArc.h>
25 #include "AliMUONChamber.h"
26 #include <Riostream.h>
27
28 ClassImp(AliMUONSegmentationTrigger)
29
30 //------------------------------------------------------------------
31 void AliMUONSegmentationTrigger::Init(Int_t chamber)
32 {
33   // initialize Module geometry
34   AliMUON *pMUON  = (AliMUON *) gAlice->GetModule("MUON");
35   AliMUONChamber* iChamber=&(pMUON->Chamber(chamber));
36
37   if(pMUON->GetDebug()>1) printf("%s: Initialize Trigger Chamber Module Geometry\n",ClassName());
38
39   Float_t zPos=iChamber->Z();
40   Float_t z1Pos=1603.5;
41   fZscale = zPos/z1Pos;
42
43   Float_t y1Cmin[126];
44   Float_t y1Cmax[126];
45
46   Float_t dz=7.2;
47   Float_t z1PosPlus=z1Pos+dz/2.;
48   Float_t z1PosMinus=z1Pos-dz/2.;
49
50   Float_t z1pm=z1PosPlus/z1PosMinus;
51   Float_t z1mp=z1PosMinus/z1PosPlus;
52
53   if(pMUON->GetDebug()>1) printf("%s: fZscale = %f \n",ClassName(),fZscale);
54   
55 // calculate yCmin and fYcmax 
56   Int_t i;  
57   for (i=62; i>=0; i--) {
58     Int_t j=ModuleNumber(-AliMUONTriggerConstants::ModuleId(i));  // i == right, j == left 
59     if (Int_t(AliMUONTriggerConstants::ModuleId(i)/10)==5) {  // start with middle chamber
60       if (AliMUONTriggerConstants::ModuleId(i)==51) {         // special case (empty module)
61         fYcmin[i]=fYcmax[i]=fYcmin[j]=fYcmax[j]=0.;
62       } else {
63         y1Cmin[i]=y1Cmin[j]=-34;
64         y1Cmax[i]=y1Cmax[j]=34;
65         fYcmin[i]=fYcmin[j]=-34.;
66
67         fYcmax[i]=fYcmax[j]=34.;
68       }
69     } else if (Int_t(AliMUONTriggerConstants::ModuleId(i)/10)==4) { // up
70       if (AliMUONTriggerConstants::ModuleId(i)!=41) {       
71         y1Cmin[i]=y1Cmax[i+7]*z1pm;
72         y1Cmax[i]=y1Cmin[i]+68.;
73         fYcmin[i]=y1Cmin[i];
74         fYcmax[i]=fYcmin[i]+68.;
75
76         y1Cmin[j]=y1Cmax[j+7]*z1mp;
77         y1Cmax[j]=y1Cmin[j]+68.;
78         fYcmin[j]=y1Cmin[j];
79         fYcmax[j]=fYcmin[j]+68.;
80       } else { 
81         y1Cmin[i]=y1Cmin[ModuleNumber(42)]+17;
82         y1Cmax[i]=y1Cmin[i]+51.;
83         fYcmin[i]=y1Cmin[i];
84         fYcmax[i]=fYcmin[i]+51.;
85
86         y1Cmin[j]=y1Cmin[ModuleNumber(-42)]+17;
87         y1Cmax[j]=y1Cmin[j]+51.;
88         fYcmin[j]=y1Cmin[j];
89         fYcmax[j]=fYcmin[j]+51.;
90       }
91     } else if (Int_t(AliMUONTriggerConstants::ModuleId(i)/10)==3) { 
92       y1Cmin[i]=y1Cmax[i+7]*z1mp;
93       y1Cmax[i]=y1Cmin[i]+68.;
94       fYcmin[i]=y1Cmin[i];
95       fYcmax[i]=fYcmin[i]+68.;
96
97       y1Cmin[j]=y1Cmax[j+7]*z1pm;
98       y1Cmax[j]=y1Cmin[j]+68.;
99       fYcmin[j]=y1Cmin[j];
100       fYcmax[j]=fYcmin[j]+68.;
101     } else if (Int_t(AliMUONTriggerConstants::ModuleId(i)/10)==2) {
102       y1Cmin[i]=y1Cmax[i+7]*z1pm;
103       y1Cmax[i]=y1Cmin[i]+68.;
104       fYcmin[i]=y1Cmin[i];
105       fYcmax[i]=fYcmin[i]+68.;
106
107       y1Cmin[j]=y1Cmax[j+7]*z1mp;
108       y1Cmax[j]=y1Cmin[j]+68.;
109       fYcmin[j]=y1Cmin[j];
110       fYcmax[j]=fYcmin[j]+68.;
111     } else if (Int_t(AliMUONTriggerConstants::ModuleId(i)/10)==1) {
112       y1Cmin[i]=y1Cmax[i+7]*z1mp;
113       y1Cmax[i]=y1Cmin[i]+68.;
114       fYcmin[i]=y1Cmin[i];
115       fYcmax[i]=fYcmin[i]+68.;
116
117       y1Cmin[j]=y1Cmax[j+7]*z1pm;
118       y1Cmax[j]=y1Cmin[j]+68.;
119       fYcmin[j]=y1Cmin[j];
120       fYcmax[j]=fYcmin[j]+68.;
121     }
122   }
123
124   for (i=0; i<63; i++) {      // second loop (fill lower part)
125     Int_t j=ModuleNumber(-AliMUONTriggerConstants::ModuleId(i));  // i == right, j == left 
126     if (TMath::Abs(Int_t(AliMUONTriggerConstants::ModuleId(i)/10))==6) { 
127       fYcmin[i]=-fYcmax[i-14];
128       fYcmax[i]=-fYcmin[i-14];
129       fYcmin[j]=-fYcmax[j-14];
130       fYcmax[j]=-fYcmin[j-14];
131     } else if (TMath::Abs(Int_t(AliMUONTriggerConstants::ModuleId(i)/10))==7) { 
132       fYcmin[i]=-fYcmax[i-28];
133       fYcmax[i]=-fYcmin[i-28];
134       fYcmin[j]=-fYcmax[j-28];
135       fYcmax[j]=-fYcmin[j-28];
136     } else if (TMath::Abs(Int_t(AliMUONTriggerConstants::ModuleId(i)/10))==8) { 
137       fYcmin[i]=-fYcmax[i-42];
138       fYcmax[i]=-fYcmin[i-42];
139       fYcmin[j]=-fYcmax[j-42];
140       fYcmax[j]=-fYcmin[j-42];
141     } else if (TMath::Abs(Int_t(AliMUONTriggerConstants::ModuleId(i)/10))==9) { 
142       fYcmin[i]=-fYcmax[i-56];
143       fYcmax[i]=-fYcmin[i-56];
144       fYcmin[j]=-fYcmax[j-56];
145       fYcmax[j]=-fYcmin[j-56];
146     } 
147   }
148
149   fNpx=124;
150   fNpy=64;  
151
152 // Set parent chamber number
153   fChamber=&(pMUON->Chamber(chamber));
154   fId=chamber;
155
156 }
157
158 //------------------------------------------------------------------
159 Int_t AliMUONSegmentationTrigger::ModuleNumber(Int_t imodule){
160 // returns module number (from 0 to 126) corresponding to module imodule
161   Int_t imod=0;
162   for (Int_t i=0; i<AliMUONTriggerConstants::Nmodule(); i++) {
163     if (AliMUONTriggerConstants::ModuleId(i)==imodule) { 
164       imod=i;
165       break;
166     }
167   }
168   return imod;
169 }
170
171 //------------------------------------------------------------------
172 Float_t AliMUONSegmentationTrigger::StripSizeX(Int_t imodule){
173 // Returns x-strip size for given module imodule
174
175   Int_t absimodule=TMath::Abs(imodule); 
176   Int_t moduleNum=ModuleNumber(imodule);
177   if (absimodule==51) {
178     return 0; 
179   } else {
180     return TMath::Abs((fYcmax[moduleNum]-fYcmin[moduleNum])/
181                       AliMUONTriggerConstants::NstripX(moduleNum));
182   }  
183 }
184
185 //------------------------------------------------------------------
186 Float_t AliMUONSegmentationTrigger::StripSizeY(Int_t imodule){
187 // Returns y-strip size for given module imodule
188         
189   Int_t absimodule=TMath::Abs(imodule); 
190   Int_t moduleNum=ModuleNumber(imodule);
191   if (absimodule==51) {
192     return 0;
193   } else {
194       return TMath::Abs((AliMUONTriggerConstants::XcMax(moduleNum) - 
195                          AliMUONTriggerConstants::XcMin(moduleNum)) / 
196                         AliMUONTriggerConstants::NstripY(moduleNum));
197   }
198 }
199
200 //------------------------------------------------------------------   
201 void AliMUONSegmentationTrigger::SetHit(Float_t xhit, Float_t yhit)
202 {
203     // Sets virtual hit position, needed for evaluating pad response 
204     // outside the tracking program 
205     
206   fXhit=xhit;
207   fYhit=yhit;
208 }
209
210
211
212
213
214
215
216
217