]>
Commit | Line | Data |
---|---|---|
a9e2aefa | 1 | #ifndef ALIMUONSEGMENTATIONV1_H |
2 | #define ALIMUONSEGMENTATIONV1_H | |
3 | /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * | |
4 | * See cxx source for full Copyright notice */ | |
5 | ||
6 | /* $Id$ */ | |
7 | ||
a30a000f | 8 | #include "AliSegmentation.h" |
a9e2aefa | 9 | |
10 | const Int_t kNzone = 3; // Specific for chamber with equal pads | |
11 | const Int_t kNzonem1 = 2; // kNzone - 1 | |
12 | const Int_t kNzoneCUT = 30; | |
13 | ||
14 | class AliMUONSegmentationV1 : | |
a30a000f | 15 | public AliSegmentation { |
a9e2aefa | 16 | public: |
17 | AliMUONSegmentationV1(); | |
18 | AliMUONSegmentationV1(const AliMUONSegmentationV1 & segmentation); | |
19 | virtual ~AliMUONSegmentationV1(){} | |
20 | // | |
21 | // Set Chamber Segmentation Parameters | |
22 | // Set Number of zones | |
23 | void SetNzone(Int_t N) {fNzone = N;}; | |
24 | // Pad size Dx*Dy | |
25 | virtual void SetPadSize(Float_t p1, Float_t p2); | |
26 | // Set Sense wire offset | |
27 | void SetSensOffset(Float_t Offset) {fSensOffset = Offset;}; | |
28 | // Anod Pitch | |
29 | void SetDAnod(Float_t D) {fDAnod = D;}; | |
30 | // max x and y for the zone in number of pads units | |
31 | //(WARNING : first pad is labelled 0 !!) | |
32 | virtual void AddCut(Int_t Zone, Int_t nX, Int_t nY); | |
33 | // Apply default cut | |
34 | virtual void DefaultCut(void); | |
35 | // | |
36 | // Initialisation | |
d81db581 | 37 | virtual void Init(Int_t id); |
a9e2aefa | 38 | // |
39 | // Get member data | |
40 | // | |
41 | // Pad size in x | |
94de3818 | 42 | virtual Float_t Dpx() const {return fDpx;} |
a9e2aefa | 43 | // Pad size in y |
94de3818 | 44 | virtual Float_t Dpy() const {return fDpy;} |
a9e2aefa | 45 | // Pad size in x by Sector |
94de3818 | 46 | virtual Float_t Dpx(Int_t i) const {return fDpx;} |
a9e2aefa | 47 | // Pad size in y by Sector |
94de3818 | 48 | virtual Float_t Dpy(Int_t i)const {return fDpy;} |
a9e2aefa | 49 | // Maximum number of Pads in x |
94de3818 | 50 | virtual Int_t Npx() const {return fNpx;} |
a9e2aefa | 51 | // Maximum number of Pads in y |
94de3818 | 52 | virtual Int_t Npy() const {return fNpy;} |
a9e2aefa | 53 | // |
54 | // Get the zone of segmentation | |
55 | virtual Int_t GetZone(Float_t X, Float_t Y); | |
56 | virtual Int_t GetZone(Int_t X, Int_t Y); | |
57 | // | |
58 | // Transform from pad (wire) to real coordinates and vice versa | |
59 | virtual Int_t GetiAnod(Float_t xhit); | |
60 | // Anod wire coordinate closest to xhit | |
c3eff6ad | 61 | virtual Float_t GetAnod(Float_t xhit) const; |
a9e2aefa | 62 | // Transform from pad to real coordinates |
a30a000f | 63 | virtual void GetPadI(Float_t x ,Float_t y , Int_t &ix, Int_t &iy); |
64 | virtual void GetPadI(Float_t x, Float_t y , Float_t z, Int_t &ix, Int_t &iy) | |
65 | {GetPadI(x, y, ix, iy);} | |
a9e2aefa | 66 | // Transform from real to pad coordinates |
a30a000f | 67 | virtual void GetPadC(Int_t ix, Int_t iy, Float_t &x, Float_t &y); |
68 | virtual void GetPadC(Int_t ix, Int_t iy, Float_t &x, Float_t &y, Float_t &z) | |
3e1872ed | 69 | {z=fZ; GetPadC(ix, iy, x , y);} |
a9e2aefa | 70 | // Set pad position |
71 | virtual void SetPad(Int_t ix, Int_t iy); | |
72 | // Set hit position | |
73 | virtual void SetHit(Float_t xhit, Float_t yhit); | |
24b005db | 74 | virtual void SetHit(Float_t xhit, Float_t yhit, Float_t zhit) |
75 | {SetHit(xhit, yhit);} | |
a9e2aefa | 76 | // |
77 | // Iterate over pads | |
78 | // Set Pad coordinates | |
79 | virtual void SetPadCoord(Int_t iX, Int_t iY); | |
80 | // Initialiser | |
81 | virtual void FirstPad(Float_t xhit, Float_t yhit, Float_t dx, Float_t dy); | |
24b005db | 82 | virtual void FirstPad(Float_t xhit, Float_t yhit, Float_t zhit, Float_t dx, Float_t dy) |
83 | {FirstPad(xhit, yhit, dx, dy);} | |
a9e2aefa | 84 | // Stepper |
85 | virtual void NextPad(); | |
86 | // Condition | |
87 | virtual Int_t MorePads(); | |
88 | // Get next neighbours | |
89 | virtual void Neighbours // implementation Neighbours function | |
90 | (Int_t iX, Int_t iY, Int_t* Nlist, Int_t *Xlist, Int_t *Ylist); | |
91 | virtual void NeighboursDiag // with diagonal elements | |
92 | (Int_t iX, Int_t iY, Int_t* Nlist, Int_t *Xlist, Int_t *Ylist); | |
93 | virtual void NeighboursNonDiag // without diagonal elements | |
94 | (Int_t iX, Int_t iY, Int_t* Nlist, Int_t *Xlist, Int_t *Ylist); | |
95 | void CleanNeighbours(Int_t* Nlist, Int_t *Xlist, Int_t *Ylist); | |
96 | // | |
97 | // Current pad cursor during disintegration | |
98 | // x-coordinate | |
99 | virtual Int_t Ix(Int_t trueX, Int_t trueY); | |
100 | virtual Int_t Ix(); | |
101 | // y-coordinate | |
c3eff6ad | 102 | virtual Int_t Iy() {return fIy;} |
a9e2aefa | 103 | // current sector |
104 | virtual Int_t ISector(); | |
105 | // calculate sector from pad coordinates | |
106 | virtual Int_t Sector(Int_t ix, Int_t iy) {return 1;} | |
107 | // Position of pad in perellel read-out | |
108 | virtual Int_t IsParallel2(Int_t iX, Int_t iY); | |
109 | virtual Int_t IsParallel3(Int_t iX, Int_t iY); | |
110 | // Number of pads read in parallel | |
111 | virtual Int_t NParallel2(Int_t iX, Int_t iY); | |
112 | virtual Int_t NParallel3(Int_t iX, Int_t iY); | |
113 | // | |
114 | // Number of pads read in parallel and offset to add to x | |
115 | virtual void GetNParallelAndOffset(Int_t iX, Int_t iY, | |
116 | Int_t *Nparallel, Int_t *Offset); | |
117 | // Minimum distance between 1 pad and a position | |
118 | virtual Float_t Distance2AndOffset(Int_t iX, Int_t iY, Float_t X, Float_t Y, Int_t *Offset); | |
119 | // | |
120 | // Signal Generation Condition during Stepping | |
121 | Int_t SigGenCond(Float_t x, Float_t y, Float_t z); | |
122 | // Initialise signal generation at coord (x,y,z) | |
123 | void SigGenInit(Float_t x, Float_t y, Float_t z); | |
124 | // Test points for auto calibration | |
c3eff6ad | 125 | void GiveTestPoints(Int_t &n, Float_t *x, Float_t *y) const; |
a9e2aefa | 126 | // Current integration limits |
127 | virtual void IntegrationLimits | |
128 | (Float_t& x1, Float_t& x2, Float_t& y1, Float_t& y2); | |
129 | // Draw the segmentation zones | |
c3eff6ad | 130 | virtual void Draw(const char * = "") const {} |
a9e2aefa | 131 | // Function for systematic corrections |
132 | // Set the correction function | |
133 | virtual void SetCorrFunc(Int_t dum, TF1* func) {fCorr=func;} | |
134 | // Get the correction function | |
c3eff6ad | 135 | virtual TF1* CorrFunc(Int_t) const {return fCorr;} |
a9e2aefa | 136 | // |
137 | AliMUONSegmentationV1& operator=(const AliMUONSegmentationV1& rhs); | |
138 | ClassDef(AliMUONSegmentationV1,1) // Implementation of the Lyon type chamber segmentation with parallel read-out | |
139 | protected: | |
140 | // | |
141 | // Implementation of the segmentation data | |
142 | // Version This models rectangular pads with the same dimensions all | |
143 | // over the cathode plane but let the possibilit for different design. | |
144 | // | |
145 | // geometry | |
146 | Int_t fNzone; // Number of differents sensitive zones | |
147 | Float_t fDpx; // X pad width | |
148 | Float_t fDpy; // Y pad width | |
149 | Int_t fNZoneCut[kNzonem1]; // Number of cuts for given zone | |
150 | Int_t fZoneX[kNzonem1][kNzoneCUT]; // X descriptor of zone segmentations | |
151 | Int_t fZoneY[kNzonem1][kNzoneCUT]; // Y descriptor of zone segmentations | |
152 | Float_t frSensMax2; // square of maximum sensitive radius | |
153 | Float_t frSensMin2; // square of minimum sensitive radius | |
154 | Int_t fNpx; // Maximum number of pads along x | |
155 | Int_t fNpy; // Maximum number of pads along y | |
156 | Float_t fDAnod; // Anod gap | |
157 | Float_t fSensOffset; // Offset of sensitive zone with respect to quadrant (positive) | |
158 | ||
159 | // Chamber region consideres during disintegration (lower left and upper right corner) | |
160 | // | |
ecfa008b | 161 | Int_t fIxmin; // lower left x |
162 | Int_t fIxmax; // lower left y | |
163 | Int_t fIymin; // upper right x | |
164 | Int_t fIymax; // upper right y | |
a9e2aefa | 165 | // |
166 | // Current pad during integration (cursor for disintegration) | |
ecfa008b | 167 | Int_t fIx; // pad coord. x |
168 | Int_t fIy; // pad coord. y | |
169 | Float_t fX; // real coord. x | |
170 | Float_t fY; // real ccord. y | |
a9e2aefa | 171 | // |
172 | // Current pad and wire during tracking (cursor at hit centre) | |
ecfa008b | 173 | Int_t fIxt; // x-position of hit |
174 | Int_t fIyt; // y-position of hit | |
a9e2aefa | 175 | // Reference point to define signal generation condition |
ecfa008b | 176 | Int_t fIwt; // wire number |
177 | Float_t fXt; // x | |
178 | Float_t fYt; // y | |
179 | Float_t fXhit; // x-position of hit | |
180 | Float_t fYhit; // y-position of hit | |
3e1872ed | 181 | Float_t fZ; // z-position of chamber |
a9e2aefa | 182 | |
183 | TF1* fCorr; // correction function | |
184 | }; | |
185 | ||
186 | #endif | |
187 | ||
188 |