]> git.uio.no Git - u/mrichter/AliRoot.git/blob - MUON/AliMUONSegmentationV1.h
Code revision:
[u/mrichter/AliRoot.git] / MUON / AliMUONSegmentationV1.h
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 // Revision of includes 07/05/2004
8
9 #include "AliSegmentation.h"
10
11 class AliMUONSegmentationV1 : public AliSegmentation 
12 {
13  public:
14     AliMUONSegmentationV1();
15     virtual ~AliMUONSegmentationV1(){}
16     //    
17     // Set Chamber Segmentation Parameters
18     // Set Number of zones
19     void SetNzone(Int_t N) {fNzone = N;};
20     // Pad size Dx*Dy 
21     virtual  void    SetPadSize(Float_t p1, Float_t p2);
22     // Set Sense wire offset
23     void SetSensOffset(Float_t Offset) {fSensOffset = Offset;};
24     // Anod Pitch
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);
29     // Apply default cut
30     virtual void DefaultCut(void);
31     //
32     // Initialisation
33     virtual void Init(Int_t id);
34     //
35     // Get member data
36     //
37     // Pad size in x
38     virtual Float_t Dpx() const {return fDpx;}
39      // Pad size in y 
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;}
49     //
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);
53     //
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);}
66     // Set pad position
67     virtual void     SetPad(Int_t ix, Int_t iy);
68     // Set hit position
69     virtual void     SetHit(Float_t xhit, Float_t yhit);
70     virtual void     SetHit(Float_t xhit, Float_t yhit, Float_t /*zhit*/)
71          {SetHit(xhit, yhit);}
72     //
73     // Iterate over pads
74     // Set Pad coordinates
75     virtual void SetPadCoord(Int_t iX, Int_t iY);
76     // Initialiser
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);}
80     // Stepper
81     virtual void  NextPad();
82     // Condition
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);
92     //
93     // Current pad cursor during disintegration
94     // x-coordinate
95     virtual Int_t Ix(Int_t trueX, Int_t trueY);
96     virtual Int_t Ix();
97     // y-coordinate
98     virtual Int_t Iy() {return fIy;}
99     // current sector
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;
110     //
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);
116     //
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;}
133     //
134     ClassDef(AliMUONSegmentationV1,1) // Implementation of the Lyon type chamber segmentation with parallel read-out
135
136   protected:
137     AliMUONSegmentationV1(const AliMUONSegmentationV1 & segmentation);
138     AliMUONSegmentationV1& operator=(const AliMUONSegmentationV1& rhs);
139
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     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           
148
149     //  geometry
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)
162     
163     // Chamber region consideres during disintegration (lower left and upper right corner)
164     //
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 
169     //
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
175     //
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
181     Float_t fXt;    // x
182     Float_t fYt;    // y
183     Float_t fXhit;  // x-position of hit
184     Float_t fYhit;  // y-position of hit
185     Float_t fZ;     // z-position of chamber
186     
187     TF1* fCorr;     // correction function
188 };
189
190 #endif
191
192