Back to home page

Project CMSSW displayed by LXR

 
 

    


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

0001 #ifndef _TkRADIAL_STRIP_TOPOLOGY_H_
0002 #define _TkRADIAL_STRIP_TOPOLOGY_H_
0003 
0004 #include "Geometry/CommonTopologies/interface/RadialStripTopology.h"
0005 
0006 /**
0007  * \class TkRadialStripTopology
0008  * A StripTopology in which the component strips subtend a constant
0009  * angular width, and, if projected, intersect at a point.
0010  *
0011  * \author Tim Cox
0012  *
0013  * WARNING! Wherever 'float strip' is used the units of 'strip' are angular
0014  * widths of each strip. The range is from 0.0 at the extreme edge of the
0015  * 'first' strip at one edge of the detector, to nstrip*angular width
0016  * at the other edge. <BR>
0017  * The centre of the first strip is at strip = 0.5 <BR>
0018  * The centre of the last strip is at strip = 0.5 + (nstrip-1) <BR>
0019  * This is for consistency with CommonDet usage of 'float strip' (but
0020  * where units are strip pitch rather than strip angular width.)<BR>
0021  *
0022  * WARNING! If the mid-point along local y of the plane of strips does not correspond
0023  * to the local coordinate origin, set the final ctor argument appropriately. <BR>
0024  *
0025  * this version is optimized for tracker and is FINAL
0026  */
0027 
0028 class TkRadialStripTopology final : public RadialStripTopology {
0029 public:
0030   /** 
0031    * Constructor from:
0032    *    \param ns number of strips
0033    *    \param aw angular width of a strip
0034    *    \param dh detector height (usually 2 x apothem of TrapezoidalPlaneBounds)
0035    *    \param r radial distance from symmetry centre of detector to the point at which 
0036    *    the outer edges of the two extreme strips (projected) intersect.
0037    *    \param yAx orientation of local y axis: 1 means pointing from the smaller side of
0038    *    the module to the larger side (along apothem), and -1 means in the 
0039    *    opposite direction, i.e. from the larger side along the apothem to the 
0040    *    smaller side. Default value is 1. 
0041    *    \param yMid local y offset if mid-point of detector (strip plane) does not coincide with local origin.
0042    *    This decouples the extent of strip plane from the boundary of the detector in which the RST is embedded.
0043    */
0044   TkRadialStripTopology(int ns, float aw, float dh, float r, int yAx = 1, float yMid = 0.);
0045 
0046   /** 
0047    * Destructor
0048    */
0049   ~TkRadialStripTopology() override {}
0050 
0051   // =========================================================
0052   // StripTopology interface - implement pure methods
0053   // =========================================================
0054 
0055   /** 
0056    * LocalPoint on x axis for given 'strip'
0057    * 'strip' is a float in units of the strip (angular) width
0058    */
0059   LocalPoint localPosition(float strip) const override;
0060 
0061   /** 
0062    * LocalPoint for a given MeasurementPoint <BR>
0063    * What's a MeasurementPoint?  <BR>
0064    * In analogy with that used with TrapezoidalStripTopology objects,
0065    * a MeasurementPoint is a 2-dim object.<BR>
0066    * The first dimension measures the
0067    * angular position wrt central line of symmetry of detector,
0068    * in units of strip (angular) widths (range 0 to total angle subtended
0069    * by a detector).<BR>
0070    * The second dimension measures
0071    * the fractional position along the strip (range -0.5 to +0.5).<BR>
0072    * BEWARE! The components are not Cartesian.<BR>
0073    */
0074   LocalPoint localPosition(const MeasurementPoint&) const override;
0075 
0076   /** 
0077    * LocalError for a pure strip measurement, where 'strip'
0078    * is the (float) position (a 'phi' angle wrt y axis) and
0079    * stripErr2 is the sigma-squared. Both quantities are expressed in
0080    * units of theAngularWidth of a strip.
0081    */
0082   LocalError localError(float strip, float stripErr2) const override;
0083 
0084   /** 
0085    * LocalError for a given MeasurementPoint with known MeasurementError.
0086    * This may be used in Kalman filtering and hence must allow possible
0087    * correlations between the components.
0088    */
0089   LocalError localError(const MeasurementPoint&, const MeasurementError&) const override;
0090 
0091   /** 
0092    * Strip in which a given LocalPoint lies. This is a float which
0093    * represents the fractional strip position within the detector.<BR>
0094    * Returns zero if the LocalPoint falls at the extreme low edge of the
0095    * detector or BELOW, and float(nstrips) if it falls at the extreme high
0096    * edge or ABOVE.
0097    */
0098   float strip(const LocalPoint&) const override;
0099 
0100   // the number of strip span by the segment between the two points..
0101   float coveredStrips(const LocalPoint& lp1, const LocalPoint& lp2) const override;
0102 
0103   /** 
0104    * Pitch (strip width) at a given LocalPoint. <BR>
0105    * BEWARE: are you sure you really want to call this for a RadialStripTopology?
0106    */
0107   float localPitch(const LocalPoint&) const override;
0108 
0109   /** 
0110    * Angle between strip and symmetry axis (=local y axis)
0111    * for given strip. <BR>
0112    * This is like a phi angle but measured clockwise from y axis 
0113    * rather than counter clockwise from x axis.
0114    * Note that 'strip' is a float with a continuous range from 0 to 
0115    * float(nstrips) to cover the whole detector, and the centres of
0116    * strips correspond to half-integer values 0.5, 1.5, ..., nstrips-0.5
0117    * whereas values 1, 2, ... nstrips correspond to the upper phi edges of
0118    * the strips.
0119    */
0120   float stripAngle(float strip) const override {
0121     return yAxisOrientation() * (phiOfOneEdge() + strip * angularWidth());
0122   }
0123 
0124   /** 
0125    * Total number of strips 
0126    */
0127   int nstrips() const override { return theNumberOfStrips; }
0128 
0129   /** 
0130    * Height of detector (= length of long symmetry axis of the plane of strips).
0131    */
0132   float stripLength() const override { return theDetHeight; }
0133 
0134   /** 
0135    * Length of a strip passing through a given LocalPpoint
0136    */
0137   float localStripLength(const LocalPoint&) const override;
0138 
0139   // =========================================================
0140   // Topology interface (not already implemented for
0141   // StripTopology interface)
0142   // =========================================================
0143 
0144   MeasurementPoint measurementPosition(const LocalPoint&) const override;
0145 
0146   MeasurementError measurementError(const LocalPoint&, const LocalError&) const override;
0147 
0148   /** 
0149    * Channel number corresponding to a given LocalPoint.<BR>
0150    * This is effectively an integer version of strip(), with range 0 to
0151    * nstrips-1.  <BR>
0152    * LocalPoints outside the detector strip plane will be considered
0153    * as contributing to the edge channels 0 or nstrips-1.
0154    */
0155   int channel(const LocalPoint&) const override;
0156 
0157   // =========================================================
0158   // RadialStripTopology interface itself
0159   // =========================================================
0160 
0161   /** 
0162    * Angular width of a each strip
0163    */
0164   float angularWidth() const override { return theAngularWidth; }
0165 
0166   /** 
0167    * Phi pitch of each strip (= angular width!)
0168    */
0169   float phiPitch(void) const override { return angularWidth(); }
0170 
0171   /** 
0172    * Length of long symmetry axis of plane of strips
0173    */
0174   float detHeight() const override { return theDetHeight; }
0175 
0176   /** 
0177    * y extent of strip plane
0178    */
0179   float yExtentOfStripPlane() const override { return theDetHeight; }  // same as detHeight()
0180 
0181   /** 
0182    * Distance from the intersection of the projections of
0183    * the extreme edges of the two extreme strips to the symmetry
0184    * centre of the plane of strips. 
0185    */
0186   float centreToIntersection() const override { return theCentreToIntersection; }
0187 
0188   /** 
0189    * (y) distance from intersection of the projections of the strips
0190    * to the local coordinate origin. Same as centreToIntersection()
0191    * if symmetry centre of strip plane coincides with local origin.
0192    */
0193   float originToIntersection() const override { return (theCentreToIntersection - yCentre); }
0194 
0195   /**
0196    * Convenience function to access azimuthal angle of extreme edge of first strip 
0197    * measured relative to long symmetry axis of the plane of strips. <BR>
0198    *
0199    * WARNING! This angle is measured clockwise from the local y axis 
0200    * which means it is in the conventional azimuthal phi plane, 
0201    * but azimuth is of course measured from local x axis not y. 
0202    * The range of this angle is
0203    *  -(full angle)/2 to +(full angle)/2. <BR>
0204    * where (full angle) = nstrips() * angularWidth(). <BR>
0205    *
0206    */
0207   float phiOfOneEdge() const override { return thePhiOfOneEdge; }
0208 
0209   /**
0210    * Local x where centre of strip intersects input local y <BR>
0211    * 'strip' should be in range 1 to nstrips() <BR>
0212    */
0213   float xOfStrip(int strip, float y) const override;
0214 
0215   /**
0216    * Nearest strip to given LocalPoint
0217    */
0218   int nearestStrip(const LocalPoint&) const override;
0219 
0220   /** 
0221    * y axis orientation, 1 means detector width increases with local y
0222    */
0223   float yAxisOrientation() const override { return theYAxisOrientation; }
0224 
0225   /**
0226    * Offset in local y between midpoint of detector (strip plane) extent and local origin
0227    */
0228   float yCentreOfStripPlane() const override { return yCentre; }
0229 
0230   /**
0231    * Distance in local y from a hit to the point of intersection of projected strips
0232    */
0233   float yDistanceToIntersection(float y) const override;
0234 
0235 private:
0236   int theNumberOfStrips;          // total no. of strips in plane of strips
0237   float theAngularWidth;          // angle subtended by each strip = phi pitch
0238   float theAWidthInverse;         // inverse of above
0239   float theTanAW;                 // its tangent
0240   float theDetHeight;             // length of long symmetry axis = twice the apothem of the enclosing trapezoid
0241   float theCentreToIntersection;  // distance centre of detector face to intersection of edge strips (projected)
0242   float thePhiOfOneEdge;          // local 'phi' of one edge of plane of strips (I choose it negative!)
0243   float theTanOfOneEdge;          // the positive tangent of the above...
0244   float theYAxisOrientation;      // 1 means y axis going from smaller to larger side, -1 means opposite direction
0245   float yCentre;  // Non-zero if offset in local y between midpoint of detector (strip plane) extent and local origin.
0246   double theRadialSigma;  // radial sigma^2( uniform prob density along strip)
0247 };
0248 
0249 #endif