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 */
7 // Revision of includes 07/05/2004
9 #include "AliSegmentation.h"
11 class AliMUONSegmentationV1 : public AliSegmentation
14 AliMUONSegmentationV1();
15 virtual ~AliMUONSegmentationV1(){}
17 // Set Chamber Segmentation Parameters
18 // Set Number of zones
19 void SetNzone(Int_t N) {fNzone = N;};
21 virtual void SetPadSize(Float_t p1, Float_t p2);
22 // Set Sense wire offset
23 void SetSensOffset(Float_t Offset) {fSensOffset = Offset;};
25 void SetDAnod(Float_t D) {fDAnod = D;};
26 // max x and y for the zone in number of pads units
27 //(WARNING : first pad is labelled 0 !!)
28 virtual void AddCut(Int_t Zone, Int_t nX, Int_t nY);
30 virtual void DefaultCut(void);
33 virtual void Init(Int_t id);
38 virtual Float_t Dpx() const {return fDpx;}
40 virtual Float_t Dpy() const {return fDpy;}
41 // Pad size in x by Sector
42 virtual Float_t Dpx(Int_t /*i*/) const {return fDpx;}
43 // Pad size in y by Sector
44 virtual Float_t Dpy(Int_t /*i*/)const {return fDpy;}
45 // Maximum number of Pads in x
46 virtual Int_t Npx() const {return fNpx;}
47 // Maximum number of Pads in y
48 virtual Int_t Npy() const {return fNpy;}
50 // Get the zone of segmentation
51 virtual Int_t GetZone(Float_t X, Float_t Y);
52 virtual Int_t GetZone(Int_t X, Int_t Y);
54 // Transform from pad (wire) to real coordinates and vice versa
55 virtual Int_t GetiAnod(Float_t xhit);
56 // Anod wire coordinate closest to xhit
57 virtual Float_t GetAnod(Float_t xhit) const;
58 // Transform from pad to real coordinates
59 virtual void GetPadI(Float_t x ,Float_t y , Int_t &ix, Int_t &iy);
60 virtual void GetPadI(Float_t x, Float_t y , Float_t /*z*/, Int_t &ix, Int_t &iy)
61 {GetPadI(x, y, ix, iy);}
62 // Transform from real to pad coordinates
63 virtual void GetPadC(Int_t ix, Int_t iy, Float_t &x, Float_t &y);
64 virtual void GetPadC(Int_t ix, Int_t iy, Float_t &x, Float_t &y, Float_t &z)
65 {z=fZ; GetPadC(ix, iy, x , y);}
67 virtual void SetPad(Int_t ix, Int_t iy);
69 virtual void SetHit(Float_t xhit, Float_t yhit);
70 virtual void SetHit(Float_t xhit, Float_t yhit, Float_t /*zhit*/)
74 // Set Pad coordinates
75 virtual void SetPadCoord(Int_t iX, Int_t iY);
77 virtual void FirstPad(Float_t xhit, Float_t yhit, Float_t dx, Float_t dy);
78 virtual void FirstPad(Float_t xhit, Float_t yhit, Float_t /*zhit*/, Float_t dx, Float_t dy)
79 {FirstPad(xhit, yhit, dx, dy);}
81 virtual void NextPad();
83 virtual Int_t MorePads();
84 // Get next neighbours
85 virtual void Neighbours // implementation Neighbours function
86 (Int_t iX, Int_t iY, Int_t* Nlist, Int_t *Xlist, Int_t *Ylist);
87 virtual void NeighboursDiag // with diagonal elements
88 (Int_t iX, Int_t iY, Int_t* Nlist, Int_t *Xlist, Int_t *Ylist);
89 virtual void NeighboursNonDiag // without diagonal elements
90 (Int_t iX, Int_t iY, Int_t* Nlist, Int_t *Xlist, Int_t *Ylist);
91 void CleanNeighbours(Int_t* Nlist, Int_t *Xlist, Int_t *Ylist);
93 // Current pad cursor during disintegration
95 virtual Int_t Ix(Int_t trueX, Int_t trueY);
98 virtual Int_t Iy() {return fIy;}
100 virtual Int_t ISector();
101 // calculate sector from pad coordinates
102 virtual Int_t Sector(Int_t /*ix*/, Int_t /*iy*/) {return 1;}
103 virtual Int_t Sector(Float_t /*x*/, Float_t /*y*/) {return 1;}
104 // Position of pad in perellel read-out
105 virtual Int_t IsParallel2(Int_t iX, Int_t iY) const;
106 virtual Int_t IsParallel3(Int_t iX, Int_t iY) const;
107 // Number of pads read in parallel
108 virtual Int_t NParallel2(Int_t iX, Int_t iY) const;
109 virtual Int_t NParallel3(Int_t iX, Int_t iY) const;
111 // Number of pads read in parallel and offset to add to x
112 virtual void GetNParallelAndOffset(Int_t iX, Int_t iY,
113 Int_t *Nparallel, Int_t *Offset);
114 // Minimum distance between 1 pad and a position
115 virtual Float_t Distance2AndOffset(Int_t iX, Int_t iY, Float_t X, Float_t Y, Int_t *Offset);
117 // Signal Generation Condition during Stepping
118 Int_t SigGenCond(Float_t x, Float_t y, Float_t z);
119 // Initialise signal generation at coord (x,y,z)
120 void SigGenInit(Float_t x, Float_t y, Float_t z);
121 // Test points for auto calibration
122 void GiveTestPoints(Int_t &n, Float_t *x, Float_t *y) const;
123 // Current integration limits
124 virtual void IntegrationLimits
125 (Float_t& x1, Float_t& x2, Float_t& y1, Float_t& y2);
126 // Draw the segmentation zones
127 virtual void Draw(const char * = "") const {}
128 // Function for systematic corrections
129 // Set the correction function
130 virtual void SetCorrFunc(Int_t /*dum*/, TF1* func) {fCorr=func;}
131 // Get the correction function
132 virtual TF1* CorrFunc(Int_t) const {return fCorr;}
134 ClassDef(AliMUONSegmentationV1,1) // Implementation of the Lyon type chamber segmentation with parallel read-out
137 AliMUONSegmentationV1(const AliMUONSegmentationV1 & segmentation);
138 AliMUONSegmentationV1& operator=(const AliMUONSegmentationV1& rhs);
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.
145 static const Int_t fgkNzone = 3; // Specific for chamber with equal pads
146 static const Int_t fgkNzonem1 = 2; // fgkNzone - 1
147 static const Int_t fgkNzoneCUT = 30; // NzoneCUT
150 Int_t fNzone; // Number of differents sensitive zones
151 Float_t fDpx; // X pad width
152 Float_t fDpy; // Y pad width
153 Int_t fNZoneCut[fgkNzonem1]; // Number of cuts for given zone
154 Int_t fZoneX[fgkNzonem1][fgkNzoneCUT]; // X descriptor of zone segmentations
155 Int_t fZoneY[fgkNzonem1][fgkNzoneCUT]; // Y descriptor of zone segmentations
156 Float_t frSensMax2; // square of maximum sensitive radius
157 Float_t frSensMin2; // square of minimum sensitive radius
158 Int_t fNpx; // Maximum number of pads along x
159 Int_t fNpy; // Maximum number of pads along y
160 Float_t fDAnod; // Anod gap
161 Float_t fSensOffset; // Offset of sensitive zone with respect to quadrant (positive)
163 // Chamber region consideres during disintegration (lower left and upper right corner)
165 Int_t fIxmin; // lower left x
166 Int_t fIxmax; // lower left y
167 Int_t fIymin; // upper right x
168 Int_t fIymax; // upper right y
170 // Current pad during integration (cursor for disintegration)
171 Int_t fIx; // pad coord. x
172 Int_t fIy; // pad coord. y
173 Float_t fX; // real coord. x
174 Float_t fY; // real ccord. y
176 // Current pad and wire during tracking (cursor at hit centre)
177 Int_t fIxt; // x-position of hit
178 Int_t fIyt; // y-position of hit
179 // Reference point to define signal generation condition
180 Int_t fIwt; // wire number
183 Float_t fXhit; // x-position of hit
184 Float_t fYhit; // y-position of hit
185 Float_t fZ; // z-position of chamber
187 TF1* fCorr; // correction function