CMS 3D CMS Logo

Public Member Functions | Private Member Functions | Private Attributes | Friends

OffsetRadialStripTopology Class Reference

#include <OffsetRadialStripTopology.h>

Inheritance diagram for OffsetRadialStripTopology:
RadialStripTopology StripTopology Topology CSCStripTopology CSCGangedStripTopology CSCUngangedStripTopology

List of all members.

Public Member Functions

virtual int channel (int strip) const =0
virtual int channel (const LocalPoint &lp) const =0
virtual LocalPoint localPosition (const MeasurementPoint &) const
virtual LocalPoint localPosition (float strip) const
virtual MeasurementPoint measurementPosition (const LocalPoint &) const
 OffsetRadialStripTopology (int numberOfStrips, float stripPhiPitch, float detectorHeight, float radialDistance, float stripOffset, float yCentre)
virtual float strip (const LocalPoint &) const
float stripAngle (float strip) const
virtual float stripOffset (void) const
virtual ~OffsetRadialStripTopology ()

Private Member Functions

LocalPoint toLocal (float xprime, float yprime) const
LocalPoint toPrime (const LocalPoint &) const

Private Attributes

float theCosOff
float theSinOff
float theStripOffset

Friends

std::ostream & operator<< (std::ostream &, const OffsetRadialStripTopology &)

Detailed Description

ABC defining RadialStripTopology with shifted offset so that it is not centred on local y (of parent chamber)

The offset is specified as a fraction of the strip angular width.

Author:
Tim Cox

Definition at line 17 of file OffsetRadialStripTopology.h.


Constructor & Destructor Documentation

OffsetRadialStripTopology::OffsetRadialStripTopology ( int  numberOfStrips,
float  stripPhiPitch,
float  detectorHeight,
float  radialDistance,
float  stripOffset,
float  yCentre 
)

Constructor Note that yCentre is local y of symmetry centre of strip plane _before_ the rotation shift: it is passed directly to RST base.

Definition at line 26 of file OffsetRadialStripTopology.cc.

References RadialStripTopology::angularWidth(), funct::cos(), LogTrace, funct::sin(), theCosOff, and theSinOff.

                                     :
  RadialStripTopology( numberOfStrips, stripPhiPitch, detectorHeight, radialDistance, +1, yCentre),
             theStripOffset( stripOffset )
{ 
  float rotate_by = stripOffset * angularWidth(); // now in angular units (radians, I hope)
  theCosOff = cos(rotate_by);
  theSinOff = sin(rotate_by);

  LogTrace("CSCStripTopology|CSC") << "fractional strip offset = " << stripOffset <<
    "\n angle = " << rotate_by << 
    " cos = " << theCosOff << " sin = " << theSinOff;
}
virtual OffsetRadialStripTopology::~OffsetRadialStripTopology ( ) [inline, virtual]

Definition at line 28 of file OffsetRadialStripTopology.h.

{};

Member Function Documentation

virtual int OffsetRadialStripTopology::channel ( int  strip) const [pure virtual]

Channel number corresponding to a strip or a LocalPoint. Sometimes more than one strip is OR'ed into one channel.

Implemented in CSCGangedStripTopology, and CSCUngangedStripTopology.

Referenced by CSCLayerGeometry::channel().

virtual int OffsetRadialStripTopology::channel ( const LocalPoint lp) const [pure virtual]

Channel number corresponding to a given LocalPoint.
This is effectively an integer version of strip(), with range 0 to nstrips-1.
LocalPoints outside the detector strip plane will be considered as contributing to the edge channels 0 or nstrips-1.

Reimplemented from RadialStripTopology.

Implemented in CSCGangedStripTopology, and CSCUngangedStripTopology.

virtual LocalPoint OffsetRadialStripTopology::localPosition ( float  strip) const [inline, virtual]

LocalPoint for a given strip

Reimplemented from RadialStripTopology.

Definition at line 37 of file OffsetRadialStripTopology.h.

                                                      {
    // Pass through to base class since otherwise it is shadowed by the localPosition(const MP&).
    // Note that base class version is OK because it uses stripAngle() which is overridden in ORST!
    // Also note that xOfStrip from base class RST also works for ORST for the same reason.
    return RadialStripTopology::localPosition( strip );
  }
LocalPoint OffsetRadialStripTopology::localPosition ( const MeasurementPoint mp) const [virtual]

LocalPoint for a given MeasurementPoint

What's a MeasurementPoint?
A MeasurementPoint is a 2-dim object, with the 1st dim specifying the angular position in strip widths, and the 2nd dim specifying the fractional distance alone a strip.

Thus the 1st dimension measures the angular position wrt central line of symmetry of detector, in units of strip (angular) widths (range 0 to total angle subtended by a detector). The 2nd dimension measures the fractional position along the strip (range -0.5 to +0.5).

BEWARE! The components are not Cartesian.
BEWARE! Neither coordinate may correspond to either local x or local y.
BEWARE! This involves ONLY strip-related measurements, not CSC wires!

Reimplemented from RadialStripTopology.

Definition at line 42 of file OffsetRadialStripTopology.cc.

References RadialStripTopology::angularWidth(), RadialStripTopology::detHeight(), RadialStripTopology::originToIntersection(), phi, RadialStripTopology::phiOfOneEdge(), funct::tan(), toLocal(), PV2DBase< T, PVType, FrameType >::x(), PV2DBase< T, PVType, FrameType >::y(), and RadialStripTopology::yCentreOfStripPlane().

                                                                                     {
  // Local coordinates are (x,y). Coordinates along symmetry axes of strip
  // plane are (x',y'). These are rotated w.r.t. (x,y)

  // You might first think you could implement this as follows (cf. measurementPosition below):
  //  LocalPoint lpp = RST::localPosition(MP);
  //  return this->toLocal(lpp);
  // But this does not work because RST::localPosition makes use of stripAngle() - virtual - and thus
  // this is not the appropriate angle - it has the offset added, which is unwanted in this case!
  // So have to implement it directly...

  // 1st component of MP measures angular position within strip plane
  float phi = phiOfOneEdge() + mp.x() * angularWidth();
  // 2nd component of MP is fractional position along strip, with range +/-0.5,
  // so distance along strip, measured from mid-point of length of strip, is
  //     mp.y() * (length of strip). 
  // Distance in direction of coordinate y' is
  //    mp.y() * (length of strip) * cos(phi)
  // where phi is angle between strip and y' axis.
  // But (length of strip) = detHeight/cos(phi), so
  float yprime =  mp.y() * detHeight() + yCentreOfStripPlane();
  float xprime = ( originToIntersection() + yprime ) * tan ( phi );
  //  Rotate to (x,y)
  return toLocal(xprime, yprime);
}
MeasurementPoint OffsetRadialStripTopology::measurementPosition ( const LocalPoint lp) const [virtual]

MeasurementPoint corresponding to given LocalPoint

Reimplemented from RadialStripTopology.

Definition at line 68 of file OffsetRadialStripTopology.cc.

References toPrime().

                                                                                            {
  LocalPoint lpp = this->toPrime(lp); // in prime system, aligned with strip plane sym axes
  return RadialStripTopology::measurementPosition(lpp); // now can use the base class method
}
float OffsetRadialStripTopology::strip ( const LocalPoint lp) const [virtual]

Strip in which a given LocalPoint lies. This is a float which represents the fractional strip position within the detector.
Returns zero if the LocalPoint falls at the extreme low edge of the detector or BELOW, and float(nstrips) if it falls at the extreme high edge or ABOVE.

Reimplemented from RadialStripTopology.

Definition at line 73 of file OffsetRadialStripTopology.cc.

References RadialStripTopology::angularWidth(), RadialStripTopology::nstrips(), RadialStripTopology::originToIntersection(), phi, RadialStripTopology::phiOfOneEdge(), toPrime(), PV3DBase< T, PVType, FrameType >::x(), and PV3DBase< T, PVType, FrameType >::y().

Referenced by CSCGangedStripTopology::channel(), CSCUngangedStripTopology::channel(), CSCLayerGeometry::inside(), and CSCLayerGeometry::strip().

                                                                 {
  LocalPoint pnt = toPrime(lp);
  float phi = atan2( pnt.x(), pnt.y()+originToIntersection() );
  float fstrip = ( phi - phiOfOneEdge() ) / angularWidth();
  fstrip = ( fstrip>=0. ? fstrip : 0. );
  fstrip = ( fstrip<=nstrips() ? fstrip : nstrips() );
  return fstrip;
}
float OffsetRadialStripTopology::stripAngle ( float  strip) const [virtual]

Angle between strip and local y axis (measured clockwise from y axis)

Reimplemented from RadialStripTopology.

Definition at line 82 of file OffsetRadialStripTopology.cc.

References RadialStripTopology::angularWidth(), RadialStripTopology::phiOfOneEdge(), and theStripOffset.

Referenced by CSCStripTopology::equationOfStrip(), and CSCLayerGeometry::stripAngle().

                                                             {
  return ( phiOfOneEdge() + (strip+theStripOffset)*angularWidth() );
}
virtual float OffsetRadialStripTopology::stripOffset ( void  ) const [inline, virtual]

Fraction of a strip offset of layer relative to symmetry axis (local y). (This is an _angular_ value)

Definition at line 33 of file OffsetRadialStripTopology.h.

References theStripOffset.

Referenced by FWRecoGeometryESProducer::addCSCGeometry(), operator<<(), CSCLayerGeometry::stripOffset(), and ValidateGeometry::validateCSCLayerGeometry().

{ return theStripOffset; }
LocalPoint OffsetRadialStripTopology::toLocal ( float  xprime,
float  yprime 
) const [private]

Transform from coordinates wrt strip plane symmetry axes to local coordinates

Definition at line 86 of file OffsetRadialStripTopology.cc.

References RadialStripTopology::originToIntersection(), theCosOff, theSinOff, x, and detailsBasic3DVector::y.

Referenced by localPosition().

                                                                              {
  float x =  theCosOff * xprime + theSinOff * yprime
             + originToIntersection() * theSinOff;
  float y = -theSinOff * xprime + theCosOff * yprime
             - originToIntersection() * (1. - theCosOff);
  return LocalPoint(x, y);
}
LocalPoint OffsetRadialStripTopology::toPrime ( const LocalPoint lp) const [private]

Transform from local coordinates to coordinates wrt strip plane symmetry axes

Definition at line 94 of file OffsetRadialStripTopology.cc.

References RadialStripTopology::originToIntersection(), theCosOff, theSinOff, PV3DBase< T, PVType, FrameType >::x(), and PV3DBase< T, PVType, FrameType >::y().

Referenced by measurementPosition(), and strip().

                                                                        {
  float xprime = theCosOff * lp.x() - theSinOff * lp.y()
                  - originToIntersection() * theSinOff;
  float yprime = theSinOff * lp.x() + theCosOff * lp.y()
                  - originToIntersection() * (1. - theCosOff);
  return LocalPoint(xprime, yprime);
}

Friends And Related Function Documentation

std::ostream& operator<< ( std::ostream &  os,
const OffsetRadialStripTopology orst 
) [friend]

Definition at line 102 of file OffsetRadialStripTopology.cc.

{
  os << "OffsetRadialStripTopology isa "
     <<  static_cast<const RadialStripTopology&>( orst )
     << "fractional strip offset   " << orst.stripOffset()
     << "\ncos(angular offset)       " << orst.theCosOff
     << "\nsin(angular offset)       " << orst.theSinOff << std::endl;
  return os;
}

Member Data Documentation

Definition at line 102 of file OffsetRadialStripTopology.h.

Referenced by stripAngle(), and stripOffset().