]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - MUON/AliMUONSegmentationV1.h
Code from MUON-dev joined
[u/mrichter/AliRoot.git] / MUON / AliMUONSegmentationV1.h
diff --git a/MUON/AliMUONSegmentationV1.h b/MUON/AliMUONSegmentationV1.h
new file mode 100644 (file)
index 0000000..fdf9289
--- /dev/null
@@ -0,0 +1,179 @@
+#ifndef ALIMUONSEGMENTATIONV1_H
+#define ALIMUONSEGMENTATIONV1_H
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * See cxx source for full Copyright notice                               */
+
+/* $Id$ */
+
+#include "AliMUONSegmentation.h"
+
+const Int_t kNzone = 3;                // Specific for chamber with equal pads
+const Int_t kNzonem1 = 2;              // kNzone - 1
+const Int_t kNzoneCUT = 30;            
+
+class AliMUONSegmentationV1 :
+public AliMUONSegmentation {
+ public:
+    AliMUONSegmentationV1();
+    AliMUONSegmentationV1(const AliMUONSegmentationV1 & segmentation);
+    virtual ~AliMUONSegmentationV1(){}
+    //    
+    // Set Chamber Segmentation Parameters
+    // Set Number of zones
+    void SetNzone(Int_t N) {fNzone = N;};
+    // Pad size Dx*Dy 
+    virtual  void    SetPadSize(Float_t p1, Float_t p2);
+    // Set Sense wire offset
+    void SetSensOffset(Float_t Offset) {fSensOffset = Offset;};
+    // Anod Pitch
+    void SetDAnod(Float_t D) {fDAnod = D;};
+    // max x and y for the zone in number of pads units 
+    //(WARNING : first pad is labelled 0 !!) 
+    virtual void AddCut(Int_t Zone, Int_t nX, Int_t nY);
+    // Apply default cut
+    virtual void DefaultCut(void);
+    //
+    // Initialisation
+    virtual void Init(AliMUONChamber* chamber);
+    //
+    // Get member data
+    //
+    // Pad size in x
+    virtual Float_t Dpx(){return fDpx;}
+     // Pad size in y 
+    virtual Float_t Dpy(){return fDpy;}
+    // Pad size in x by Sector
+    virtual Float_t Dpx(Int_t i){return fDpx;}
+    // Pad size in y by Sector 
+    virtual Float_t Dpy(Int_t i){return fDpy;}
+    // Maximum number of Pads in x
+    virtual Int_t   Npx(){return fNpx;}
+    // Maximum number of Pads in y
+    virtual Int_t   Npy(){return fNpy;}
+    //
+    // Get  the zone of segmentation
+    virtual Int_t GetZone(Float_t X, Float_t Y);
+    virtual Int_t GetZone(Int_t X, Int_t Y);
+    //
+    // Transform from pad (wire) to real coordinates and vice versa  
+    virtual Int_t GetiAnod(Float_t xhit);
+    // Anod wire coordinate closest to xhit
+    virtual Float_t GetAnod(Float_t xhit);
+    // Transform from pad to real coordinates
+    virtual void    GetPadIxy(Float_t x ,Float_t y ,Int_t   &ix,Int_t   &iy);
+    // Transform from real to pad coordinates
+    virtual void    GetPadCxy(Int_t   ix,Int_t   iy,Float_t &x ,Float_t &y );
+    // Set pad position
+    virtual void     SetPad(Int_t ix, Int_t iy);
+    // Set hit position
+    virtual void     SetHit(Float_t xhit, Float_t yhit);
+    //
+    // Iterate over pads
+    // Set Pad coordinates
+    virtual void SetPadCoord(Int_t iX, Int_t iY);
+    // Initialiser
+    virtual void  FirstPad(Float_t xhit, Float_t yhit, Float_t dx, Float_t dy);
+    // Stepper
+    virtual void  NextPad();
+    // Condition
+    virtual Int_t MorePads();
+    // Get next neighbours 
+    virtual void Neighbours // implementation Neighbours function
+       (Int_t iX, Int_t iY, Int_t* Nlist, Int_t *Xlist, Int_t *Ylist);
+    virtual void NeighboursDiag // with diagonal elements
+       (Int_t iX, Int_t iY, Int_t* Nlist, Int_t *Xlist, Int_t *Ylist);
+    virtual void NeighboursNonDiag // without diagonal elements
+       (Int_t iX, Int_t iY, Int_t* Nlist, Int_t *Xlist, Int_t *Ylist);
+    void CleanNeighbours(Int_t* Nlist, Int_t *Xlist, Int_t *Ylist);
+    //
+    // Current pad cursor during disintegration
+    // x-coordinate
+    virtual Int_t Ix(Int_t trueX, Int_t trueY);
+    virtual Int_t Ix();
+    // y-coordinate
+    virtual Int_t Iy(){return fiy;}
+    // current sector
+    virtual Int_t ISector();
+    // calculate sector from pad coordinates
+    virtual Int_t Sector(Int_t ix, Int_t iy) {return 1;}
+    // Position of pad in perellel read-out
+    virtual Int_t IsParallel2(Int_t iX, Int_t iY);
+    virtual Int_t IsParallel3(Int_t iX, Int_t iY);
+    // Number of pads read in parallel
+    virtual Int_t NParallel2(Int_t iX, Int_t iY);
+    virtual Int_t NParallel3(Int_t iX, Int_t iY);
+    //
+    // Number of pads read in parallel and offset to add to x
+    virtual void GetNParallelAndOffset(Int_t iX, Int_t iY,
+       Int_t *Nparallel, Int_t *Offset);
+    // Minimum distance between 1 pad and a position
+    virtual Float_t Distance2AndOffset(Int_t iX, Int_t iY, Float_t X, Float_t Y, Int_t *Offset);
+    //
+    // Signal Generation Condition during Stepping
+    Int_t SigGenCond(Float_t x, Float_t y, Float_t z);
+    // Initialise signal generation at coord (x,y,z)
+    void  SigGenInit(Float_t x, Float_t y, Float_t z);
+    // Test points for auto calibration
+    void  GiveTestPoints(Int_t &n, Float_t *x, Float_t *y);
+    // Current integration limits 
+    virtual void IntegrationLimits
+       (Float_t& x1, Float_t& x2, Float_t& y1, Float_t& y2);
+    // Draw the segmentation zones
+    virtual void Draw(){;}
+    // Function for systematic corrections
+    // Set the correction function
+    virtual void SetCorrFunc(Int_t dum, TF1* func) {fCorr=func;}
+    // Get the correction function
+    virtual TF1* CorrFunc(Int_t) {return fCorr;}
+    //
+    AliMUONSegmentationV1& operator=(const AliMUONSegmentationV1& rhs);
+    ClassDef(AliMUONSegmentationV1,1) // Implementation of the Lyon type chamber segmentation with parallel read-out
+ protected:
+    //
+    // Implementation of the segmentation data
+    // Version This models rectangular pads with the same dimensions all
+    // over the cathode plane but let the possibilit for different design.
+    //
+    //  geometry
+    Int_t fNzone; // Number of differents sensitive zones
+    Float_t fDpx;         // X pad width
+    Float_t fDpy;         // Y pad width
+    Int_t   fNZoneCut[kNzonem1];    // Number of cuts for given zone 
+    Int_t fZoneX[kNzonem1][kNzoneCUT]; // X descriptor of zone segmentations
+    Int_t fZoneY[kNzonem1][kNzoneCUT]; // Y descriptor of zone segmentations
+    Float_t frSensMax2; // square of maximum sensitive radius
+    Float_t frSensMin2; // square of minimum sensitive radius
+    Int_t   fNpx;         // Maximum number of pads along x
+    Int_t   fNpy;         // Maximum number of pads along y
+    Float_t fDAnod;       // Anod gap
+    Float_t fSensOffset;  // Offset of sensitive zone with respect to quadrant (positive)
+    
+    // Chamber region consideres during disintegration (lower left and upper right corner)
+    //
+    Int_t fixmin; // lower left  x
+    Int_t fixmax; // lower left  y
+    Int_t fiymin; // upper right x
+    Int_t fiymax; // upper right y 
+    //
+    // Current pad during integration (cursor for disintegration)
+    Int_t fix;   // pad coord.  x
+    Int_t fiy;   // pad coord.  y
+    Float_t fx;  // real coord. x
+    Float_t fy;  // real ccord. y
+    //
+    // Current pad and wire during tracking (cursor at hit centre)
+    Int_t fixt;  // x-position of hit
+    Int_t fiyt;  // y-position of hit
+    // Reference point to define signal generation condition
+    Int_t fiwt;     // wire number
+    Float_t fxt;    // x
+    Float_t fyt;    // y
+    Float_t fxhit;  // x-position of hit
+    Float_t fyhit;  // y-position of hit
+    
+    TF1* fCorr;     // correction function
+};
+
+#endif
+
+