|
||||
File indexing completed on 2024-04-06 12:14:22
0001 #ifndef _RADIAL_STRIP_TOPOLOGY_H_ 0002 #define _RADIAL_STRIP_TOPOLOGY_H_ 0003 0004 #include "Geometry/CommonTopologies/interface/StripTopology.h" 0005 0006 /** 0007 * \class RadialStripTopology 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 * now is an abstract class to allow different specialization for tracker and muon 0026 */ 0027 0028 class RadialStripTopology : public StripTopology { 0029 public: 0030 /** 0031 * Destructor 0032 */ 0033 ~RadialStripTopology() override {} 0034 0035 // ========================================================= 0036 // StripTopology interface - implement pure virtual methods 0037 // ========================================================= 0038 0039 /** 0040 * LocalPoint on x axis for given 'strip' 0041 * 'strip' is a float in units of the strip (angular) width 0042 */ 0043 LocalPoint localPosition(float strip) const override = 0; 0044 0045 using StripTopology::localPosition; 0046 /** 0047 * LocalPoint for a given MeasurementPoint <BR> 0048 * What's a MeasurementPoint? <BR> 0049 * In analogy with that used with TrapezoidalStripTopology objects, 0050 * a MeasurementPoint is a 2-dim object.<BR> 0051 * The first dimension measures the 0052 * angular position wrt central line of symmetry of detector, 0053 * in units of strip (angular) widths (range 0 to total angle subtended 0054 * by a detector).<BR> 0055 * The second dimension measures 0056 * the fractional position along the strip (range -0.5 to +0.5).<BR> 0057 * BEWARE! The components are not Cartesian.<BR> 0058 */ 0059 LocalPoint localPosition(const MeasurementPoint&) const override = 0; 0060 0061 using StripTopology::localError; 0062 /** 0063 * LocalError for a pure strip measurement, where 'strip' 0064 * is the (float) position (a 'phi' angle wrt y axis) and 0065 * stripErr2 is the sigma-squared. Both quantities are expressed in 0066 * units of theAngularWidth of a strip. 0067 */ 0068 LocalError localError(float strip, float stripErr2) const override = 0; 0069 0070 /** 0071 * LocalError for a given MeasurementPoint with known MeasurementError. 0072 * This may be used in Kalman filtering and hence must allow possible 0073 * correlations between the components. 0074 */ 0075 LocalError localError(const MeasurementPoint&, const MeasurementError&) const override = 0; 0076 0077 /** 0078 * Strip in which a given LocalPoint lies. This is a float which 0079 * represents the fractional strip position within the detector.<BR> 0080 * Returns zero if the LocalPoint falls at the extreme low edge of the 0081 * detector or BELOW, and float(nstrips) if it falls at the extreme high 0082 * edge or ABOVE. 0083 */ 0084 float strip(const LocalPoint&) const override = 0; 0085 0086 /** 0087 * BEWARE: calling pitch() throws an exception.<BR> 0088 * Pitch is conventional name for width of something, but this is 0089 * not sensible for a RadialStripTopology since strip widths vary with local y. 0090 * Use localPitch(.) instead. 0091 */ 0092 float pitch() const final; 0093 0094 /** 0095 * Pitch (strip width) at a given LocalPoint. <BR> 0096 * BEWARE: are you sure you really want to call this for a RadialStripTopology? 0097 */ 0098 float localPitch(const LocalPoint&) const override = 0; 0099 0100 /** 0101 * Angle between strip and symmetry axis (=local y axis) 0102 * for given strip. <BR> 0103 * This is like a phi angle but measured clockwise from y axis 0104 * rather than counter clockwise from x axis. 0105 * Note that 'strip' is a float with a continuous range from 0 to 0106 * float(nstrips) to cover the whole detector, and the centres of 0107 * strips correspond to half-integer values 0.5, 1.5, ..., nstrips-0.5 0108 * whereas values 1, 2, ... nstrips correspond to the upper phi edges of 0109 * the strips. 0110 */ 0111 float stripAngle(float strip) const override = 0; 0112 0113 /** 0114 * Total number of strips 0115 */ 0116 int nstrips() const override = 0; 0117 0118 /** 0119 * Height of detector (= length of long symmetry axis of the plane of strips). 0120 */ 0121 float stripLength() const override = 0; 0122 0123 /** 0124 * Length of a strip passing through a given LocalPpoint 0125 */ 0126 float localStripLength(const LocalPoint&) const override = 0; 0127 0128 // ========================================================= 0129 // Topology interface (not already implemented for 0130 // StripTopology interface) 0131 // ========================================================= 0132 0133 MeasurementPoint measurementPosition(const LocalPoint&) const override = 0; 0134 0135 MeasurementError measurementError(const LocalPoint&, const LocalError&) const override = 0; 0136 0137 /** 0138 * Channel number corresponding to a given LocalPoint.<BR> 0139 * This is effectively an integer version of strip(), with range 0 to 0140 * nstrips-1. <BR> 0141 * LocalPoints outside the detector strip plane will be considered 0142 * as contributing to the edge channels 0 or nstrips-1. 0143 */ 0144 int channel(const LocalPoint&) const override = 0; 0145 0146 // ========================================================= 0147 // RadialStripTopology interface itself 0148 // ========================================================= 0149 0150 /** 0151 * Angular width of a each strip 0152 */ 0153 virtual float angularWidth() const = 0; 0154 0155 /** 0156 * Phi pitch of each strip (= angular width!) 0157 */ 0158 virtual float phiPitch(void) const = 0; 0159 0160 /** 0161 * Length of long symmetry axis of plane of strips 0162 */ 0163 virtual float detHeight() const = 0; 0164 0165 /** 0166 * y extent of strip plane 0167 */ 0168 virtual float yExtentOfStripPlane() const = 0; // same as detHeight() 0169 0170 /** 0171 * Distance from the intersection of the projections of 0172 * the extreme edges of the two extreme strips to the symmetry 0173 * centre of the plane of strips. 0174 */ 0175 virtual float centreToIntersection() const = 0; 0176 /** 0177 * (y) distance from intersection of the projections of the strips 0178 * to the local coordinate origin. Same as centreToIntersection() 0179 * if symmetry centre of strip plane coincides with local origin. 0180 */ 0181 virtual float originToIntersection() const = 0; 0182 /** 0183 * Convenience function to access azimuthal angle of extreme edge of first strip 0184 * measured relative to long symmetry axis of the plane of strips. <BR> 0185 * 0186 * WARNING! This angle is measured clockwise from the local y axis 0187 * which means it is in the conventional azimuthal phi plane, 0188 * but azimuth is of course measured from local x axis not y. 0189 * The range of this angle is 0190 * -(full angle)/2 to +(full angle)/2. <BR> 0191 * where (full angle) = nstrips() * angularWidth(). <BR> 0192 * 0193 */ 0194 virtual float phiOfOneEdge() const = 0; 0195 0196 /** 0197 * Local x where centre of strip intersects input local y <BR> 0198 * 'strip' should be in range 1 to nstrips() <BR> 0199 */ 0200 virtual float xOfStrip(int strip, float y) const = 0; 0201 0202 /** 0203 * Nearest strip to given LocalPoint 0204 */ 0205 virtual int nearestStrip(const LocalPoint&) const = 0; 0206 0207 /** 0208 * y axis orientation, 1 means detector width increases with local y 0209 */ 0210 virtual float yAxisOrientation() const = 0; 0211 0212 /** 0213 * Offset in local y between midpoint of detector (strip plane) extent and local origin 0214 */ 0215 virtual float yCentreOfStripPlane() const = 0; 0216 0217 /** 0218 * Distance in local y from a hit to the point of intersection of projected strips 0219 */ 0220 virtual float yDistanceToIntersection(float y) const = 0; 0221 0222 friend std::ostream& operator<<(std::ostream&, const RadialStripTopology&); 0223 }; 0224 0225 #endif
[ Source navigation ] | [ Diff markup ] | [ Identifier search ] | [ general search ] |
This page was automatically generated by the 2.2.1 LXR engine. The LXR team |