9f039be9dddac735aa5f8677c9bc6da5ce5389cb
[u/mrichter/AliRoot.git] / MUON / AliMUONSegmentationV01.h
1 #ifndef ALIMUONSEGMENTATIONV01_H
2 #define ALIMUONSEGMENTATIONV01_H
3
4 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
5  * See cxx source for full Copyright notice                               */
6
7 /* $Id$ */
8
9 /////////////////////////////////////////////////////
10 //  Segmentation and Response classes version 01   //
11 /////////////////////////////////////////////////////
12 class AliMUON;
13 class TArrayF;
14 class TArrayI;
15 class TObjArray;
16
17
18
19 #include "AliMUONSegmentationV0.h"
20 #include "TArrayI.h"
21 #include "TArrayF.h"
22
23 class AliMUONSegmentationV01 :
24 public AliMUONSegmentationV0 {
25  public:
26     AliMUONSegmentationV01();
27     AliMUONSegmentationV01(const AliMUONSegmentationV01 & segmentation);
28     
29     virtual ~AliMUONSegmentationV01(){}
30     //    
31     // Set Chamber Segmentation Parameters
32     // 
33     virtual  void    SetPadDivision(Int_t ndiv[4]);
34     // Radii
35     virtual  void    SetSegRadii(Float_t  r[4]);
36     //
37     // Transform from pad (wire) to real coordinates and vice versa
38     //
39     // Transform from pad to real coordinates
40     virtual void    GetPadI(Float_t x ,Float_t y ,Int_t   &ix,Int_t &iy);
41     virtual void    GetPadI(Float_t x, Float_t y , Float_t z, Int_t &ix, Int_t &iy)
42         {GetPadI(x, y, ix, iy);}
43     // Transform from real to pad coordinates
44     virtual void    GetPadC(Int_t   ix,Int_t   iy,Float_t &x ,Float_t &y );
45     virtual void    GetPadC(Int_t ix, Int_t iy, Float_t &x, Float_t &y, Float_t &z)
46         {z=0; GetPadC(ix, iy, x , y);}
47     //
48     // Initialisation
49     virtual void Init(Int_t chamber);
50     //
51     // Get member data
52     //
53     // Pad size in x by Sector
54     virtual Float_t Dpx(Int_t isec) const;
55     // Pad size in y by Sector
56     virtual Float_t Dpy(Int_t isec) const;
57     // Max number of Pads in x
58     virtual Int_t   Npx() const {return fNpxS[fNsec-1][1]+1;}
59     //
60     virtual void    SetPad(Int_t ix,Int_t iy);
61     //
62     // Iterate over pads
63     // Initialiser
64     virtual void  FirstPad(Float_t xhit, Float_t yhit, Float_t dx, Float_t dy);
65     virtual void  FirstPad(Float_t xhit, Float_t yhit, Float_t zhit, Float_t dx, Float_t dy)
66         {FirstPad(xhit, yhit, dx, dy);}
67     // Stepper
68     virtual void  NextPad();
69     // Condition
70     virtual Int_t MorePads();
71     // Get next neighbours 
72     virtual void Neighbours
73         (Int_t iX, Int_t iY, Int_t* Nlist, Int_t Xlist[10], Int_t Ylist[10]);
74     //
75     // Current Pad during Integration
76     // current sector
77     virtual Int_t ISector()  {return fSector;}
78     // calculate sector from pad coordinates
79     virtual Int_t Sector(Int_t ix, Int_t iy);
80     //
81     // Integration
82     // Current integration limits
83      virtual void IntegrationLimits
84         (Float_t& x1, Float_t& x2, Float_t& y1, Float_t& y2);
85     // Test points for auto calibration
86     void GiveTestPoints(Int_t &n, Float_t *x, Float_t *y);
87     //
88     // Draw segmentation zones
89     virtual void Draw(const char *opt="");
90     // Function for systematic corrections
91     // Set the correction function
92     virtual void SetCorrFunc(Int_t dum, TF1* func);
93     // Get the correction function
94     virtual TF1* CorrFunc(Int_t iZone);
95     // assignment operator
96     AliMUONSegmentationV01& operator=(const AliMUONSegmentationV01& rhs);
97     ClassDef(AliMUONSegmentationV01,1) // Segmentation approximating circular zones with different pad size
98  protected:
99     //  Geometry
100     //
101     Int_t      fNsec;           // Number of sectors
102     TArrayF    fRSec;           // Sector outer radia
103     TArrayI    fNDiv;           // Pad size division
104     TArrayF    fDpxD;           // y pad width per sector
105     // Segmentation map
106     Int_t      fNpxS[10][1000]; // Number of pads per sector in x
107     Float_t    fCx[10][1000];   // pad-sector contour x vs y  
108     // Chamber region consideres during disintegration
109     // (lower left and upper right corner)
110     //
111     Float_t fXmin; // lower left  x
112     Float_t fXmax; // lower left  y
113     Float_t fYmin; // upper right x
114     Float_t fYmax; // upper right y 
115
116     //
117     // Current pad during integration (cursor for disintegration)
118     Int_t   fSector; // Current sector
119     //
120     TObjArray *fCorr; // Correction functions
121 };
122 #endif
123
124
125
126
127
128
129
130