Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:14:24

0001 #ifndef ABS_OFFSET_RADIAL_STRIP_TOPOLOGY_H
0002 #define ABS_OFFSET_RADIAL_STRIP_TOPOLOGY_H
0003 
0004 /** \class OffsetRadialStripTopology
0005  *  ABC defining  RadialStripTopology with shifted offset so that it
0006  *  is not centred on local y (of parent chamber)
0007  *
0008  *  The offset is specified as a fraction of the strip angular width.
0009  *
0010  *  \author Tim Cox
0011  * 
0012  */
0013 
0014 #include "Geometry/CommonTopologies/interface/CSCRadialStripTopology.h"
0015 #include <iosfwd>
0016 
0017 class OffsetRadialStripTopology : public CSCRadialStripTopology {
0018 public:
0019   /** Constructor
0020    *  Note that yCentre is local y of symmetry centre of strip plane
0021    *  _before_ the rotation shift: it is passed directly to RST base.
0022    */
0023   OffsetRadialStripTopology(int numberOfStrips,
0024                             float stripPhiPitch,
0025                             float detectorHeight,
0026                             float radialDistance,
0027                             float stripOffset,
0028                             float yCentre);
0029 
0030   ~OffsetRadialStripTopology() override{};
0031 
0032   /** Fraction of a strip offset of layer relative to
0033    *  symmetry axis (local y). (This is an _angular_ value)
0034    */
0035   virtual float stripOffset(void) const { return theStripOffset; }
0036 
0037   /** LocalPoint for a given strip
0038    */
0039   LocalPoint localPosition(float strip) const override {
0040     // Pass through to base class since otherwise it is shadowed by the localPosition(const MP&).
0041     // Note that base class version is OK because it uses stripAngle() which is overridden in ORST!
0042     // Also note that xOfStrip from base class RST also works for ORST for the same reason.
0043     return CSCRadialStripTopology::localPosition(strip);
0044   }
0045 
0046   /** LocalPoint for a given MeasurementPoint <BR>
0047    *
0048    * What's a MeasurementPoint?  <BR>
0049    * A MeasurementPoint is a 2-dim object, with the 1st dim specifying the angular position
0050    * in strip widths, and the 2nd dim specifying the fractional distance alone a strip.<BR>
0051    *
0052    * Thus the 1st dimension measures the
0053    * angular position wrt central line of symmetry of detector,
0054    * in units of strip (angular) widths (range 0 to total angle subtended
0055    * by a detector).
0056    * The 2nd dimension measures
0057    * the fractional position along the strip (range -0.5 to +0.5).<BR>
0058    *
0059    * BEWARE! The components are not Cartesian.<BR>
0060    * BEWARE! Neither coordinate may correspond to either local x or local y.<BR>
0061    * BEWARE! This involves ONLY strip-related measurements, not CSC wires!
0062    */
0063   LocalPoint localPosition(const MeasurementPoint&) const override;
0064 
0065   /**
0066    * MeasurementPoint corresponding to given LocalPoint
0067    */
0068   MeasurementPoint measurementPosition(const LocalPoint&) const override;
0069 
0070   /** Strip in which a given LocalPoint lies. This is a float which
0071    * represents the fractional strip position within the detector.<BR>
0072    * Returns zero if the LocalPoint falls at the extreme low edge of the
0073    * detector or BELOW, and float(nstrips) if it falls at the extreme high
0074    * edge or ABOVE.
0075    */
0076   float strip(const LocalPoint&) const override;
0077 
0078   /**
0079    * Angle between strip and local y axis (measured clockwise from y axis)
0080    */
0081   float stripAngle(float strip) const override;
0082 
0083   /**
0084    * Channel number corresponding to a strip or a LocalPoint.
0085    * Sometimes more than one strip is OR'ed into one channel.
0086    */
0087   virtual int channel(int strip) const = 0;
0088   int channel(const LocalPoint& lp) const override = 0;
0089 
0090   friend std::ostream& operator<<(std::ostream&, const OffsetRadialStripTopology&);
0091 
0092 private:
0093   /**
0094    * Transform from coordinates wrt strip plane symmetry axes to
0095    * local coordinates
0096    */
0097   LocalPoint toLocal(float xprime, float yprime) const;
0098   /**
0099    * Transform from local coordinates to coordinates wrt strip plane
0100    * symmetry axes
0101    */
0102   LocalPoint toPrime(const LocalPoint&) const;
0103 
0104   float theStripOffset;  // fraction of a strip offset from sym about y
0105   float theCosOff;       // cosine of angular offset
0106   float theSinOff;       // sine of angular offset
0107 };
0108 
0109 #endif