CMS 3D CMS Logo

Public Member Functions | Private Attributes

CSCWireGeometry Class Reference

#include <CSCWireGeometry.h>

Inheritance diagram for CSCWireGeometry:
CSCNonslantedWireGeometry CSCSlantedWireGeometry

List of all members.

Public Member Functions

virtual CSCWireGeometryclone () const =0
 CSCWireGeometry (double wireSpacing, double yOfFirstWire, double narrowWidthOfPlane, double wideWidthOfPlane, double lengthOfPlane)
std::pair< float, float > equationOfWire (float wire) const
LocalPoint intersection (float m1, float c1, float m2, float c2) const
double lengthOfPlane () const
double narrowWidthOfPlane () const
virtual int nearestWire (const LocalPoint &lp) const =0
double wideWidthOfPlane () const
virtual float wireAngle () const =0
std::pair< LocalPoint, LocalPointwireEnds (float wire) const
double wireSpacing () const
std::vector< float > wireValues (float wire) const
std::pair< float, float > yLimitsOfWirePlane () const
double yOfFirstWire () const
virtual float yOfWire (float wire, float x=0.) const =0
virtual ~CSCWireGeometry ()

Private Attributes

double theLengthOfPlane
double theNarrowWidthOfPlane
double theWideWidthOfPlane
double theWireSpacing
double theYOfFirstWire

Detailed Description

An ABC defining interface for geometry related to angle which wires of a detector modelled by a WireTopology make with the local x axis.

Author:
Tim Cox

Definition at line 17 of file CSCWireGeometry.h.


Constructor & Destructor Documentation

virtual CSCWireGeometry::~CSCWireGeometry ( ) [inline, virtual]

Definition at line 19 of file CSCWireGeometry.h.

{}
CSCWireGeometry::CSCWireGeometry ( double  wireSpacing,
double  yOfFirstWire,
double  narrowWidthOfPlane,
double  wideWidthOfPlane,
double  lengthOfPlane 
) [inline]

Member Function Documentation

virtual CSCWireGeometry* CSCWireGeometry::clone ( ) const [pure virtual]

Allow proper copying of derived classes via base pointer

Implemented in CSCNonslantedWireGeometry, and CSCSlantedWireGeometry.

Referenced by CSCWireTopology::CSCWireTopology(), and CSCWireTopology::operator=().

std::pair< float, float > CSCWireGeometry::equationOfWire ( float  wire) const

Return slope and intercept of straight line representing a wire in 2-dim local coordinates.

The return value is a pair p with p.first = m, p.second = c, where y=mx+c.

Definition at line 176 of file CSCWireGeometry.cc.

References LogTrace, funct::tan(), wireAngle(), and yOfWire().

Referenced by CSCWireTopology::equationOfWire().

                                                                        {
  
  const float fprec = 1.E-06;

  // slope of wire
  float wangle = wireAngle(); 
  float mw = 0;
  if ( fabs(wangle) > fprec ) mw = tan( wangle );

  // intercept of wire
  float cw = yOfWire( wire );

  LogTrace("CSCWireGeometry|CSC") << "CSCWireGeometry: wire=" << wire <<
    ", wire angle = " << wangle <<
    ", intercept on y axis=" << cw;

  return std::pair<float,float>(mw, cw);
}
LocalPoint CSCWireGeometry::intersection ( float  m1,
float  c1,
float  m2,
float  c2 
) const

2D point of intersection of two straight lines defined by
y = m1*x + c1 and y = m2*x + c2
(in local coordinates x, y)

Definition at line 7 of file CSCWireGeometry.cc.

References alignmentValidation::c1, x, and detailsBasic3DVector::y.

Referenced by wireEnds().

                                                                     {

  // Calculate the point of intersection of two straight lines (in 2-dim)
  // BEWARE! Do not call with m1 = m2 ! No trapping !

  float x = (c2-c1)/(m1-m2);
  float y = (m1*c2-m2*c1)/(m1-m2);
  return LocalPoint( x, y );
}
double CSCWireGeometry::lengthOfPlane ( ) const [inline]

Extent of wire plane along long axis of trapezoid

Definition at line 57 of file CSCWireGeometry.h.

References theLengthOfPlane.

Referenced by CSCWireTopology::lengthOfPlane(), wireEnds(), and yLimitsOfWirePlane().

                               {
    return theLengthOfPlane; }
double CSCWireGeometry::narrowWidthOfPlane ( ) const [inline]

Extent of wire plane at narrow end of trapezoid

Definition at line 45 of file CSCWireGeometry.h.

References theNarrowWidthOfPlane.

Referenced by CSCWireTopology::narrowWidthOfPlane(), wireEnds(), and yLimitsOfWirePlane().

                                    {
    return theNarrowWidthOfPlane; }
virtual int CSCWireGeometry::nearestWire ( const LocalPoint lp) const [pure virtual]

The nearest (virtual) wire to a given LocalPoint. Beware that this wire might not exist or be read out!

Implemented in CSCNonslantedWireGeometry, and CSCSlantedWireGeometry.

Referenced by CSCWireTopology::channel(), and CSCWireTopology::nearestWire().

double CSCWireGeometry::wideWidthOfPlane ( ) const [inline]

Extent of wire plane at wide end of trapezoid

Definition at line 51 of file CSCWireGeometry.h.

References theWideWidthOfPlane.

Referenced by CSCWireTopology::wideWidthOfPlane(), and wireEnds().

                                  {
    return theWideWidthOfPlane; }
virtual float CSCWireGeometry::wireAngle ( ) const [pure virtual]

The angle of the wires w.r.t local x axis (in radians)

Implemented in CSCNonslantedWireGeometry, and CSCSlantedWireGeometry.

Referenced by equationOfWire(), CSCWireTopology::wireAngle(), wireEnds(), and yLimitsOfWirePlane().

std::pair< LocalPoint, LocalPoint > CSCWireGeometry::wireEnds ( float  wire) const

Return 2-dim local coords of the two ends of a wire

The returned value is a pair of LocalPoints.

Definition at line 35 of file CSCWireGeometry.cc.

References alignmentValidation::c1, i, intersection(), j, lengthOfPlane(), LogTrace, narrowWidthOfPlane(), funct::tan(), wideWidthOfPlane(), wireAngle(), PV3DBase< T, PVType, FrameType >::x(), PV3DBase< T, PVType, FrameType >::y(), yOfFirstWire(), and yOfWire().

Referenced by CSCWireTopology::wireEnds(), and wireValues().

                                                                              {

  // return local (x, y) of each end of wire.
  // If wire does not intersect active area set all values to 0.
  
  const float fprec = 1.E-06;

  // slope of wire
  float wangle = wireAngle();
  float mw = 0;
  if ( fabs(wangle) > fprec ) mw = tan( wireAngle() );

  // intercept of wire
  float cw = yOfWire( wire );
  
  LogTrace("CSCWireGeometry|CSC") << "CSCWireGeometry: wire=" << wire <<
    ", wire angle = " << wangle <<
    ", intercept on y axis=" << cw;
  
  // Find extent of wire plane
  double ww = wideWidthOfPlane();
  double nw = narrowWidthOfPlane();
  double len = lengthOfPlane();
  
  // slope & intercept of line defining one non-parallel edge of wire-plane trapezoid
  float m1 = 2.*len/(ww-nw);
  float c1 = 0.;
  if ( fabs(wangle) < fprec ) {
    c1 = yOfFirstWire() - nw*len/(ww-nw) ; // non-ME11
  }
  else {
    c1 = -len/2. - nw*len/(ww-nw); // ME11
  }

  // slope & intercept of other non-parallel edge of wire-plane trapezoid
  float m2 = -m1;
  float c2 =  c1;

  // wire intersects edge 1 at
  LocalPoint pw1 = intersection(mw, cw, m1, c1);
  // wire intersects edge 2 at
  LocalPoint pw2 = intersection(mw, cw, m2, c2);

  float x1 = pw1.x();
  float y1 = pw1.y();

  float x2 = pw2.x();
  float y2 = pw2.y();

  LogTrace("CSCWireGeometry|CSC") << "CSCWireGeometry: wire intersects edges of plane at " <<
    "\n  x1=" << x1 << " y1=" << y1 <<
    " x2=" << x2 << " y2=" << y2;
  
  // WIRES ARE NOT TILTED?

  if ( fabs(wangle) < fprec ) {

    LogTrace("CSCWireGeometry|CSC") << "CSCWireGeometry: wires are not tilted ";
    return std::pair< LocalPoint, LocalPoint >( LocalPoint(x1,y1), LocalPoint(x2,y2) );  
  }
  
  // WIRES ARE TILTED

  // ht and hb will be used to check where wire intersects edges of wire plane
  float ht = ww/2. ;
  float hb = nw/2. ;
  float mt = 0.; // slope of top edge
  float mb = 0.; //slope of bottom edge
  float cb = -len/2.; // intercept bottom edge of wire plane
  float ct =  len/2.; // intercept top edge of wire plane
  
  LogTrace("CSCWireGeometry|CSC") <<  "CSCWireGeometry: slopes & intercepts " <<
    "\n  mt=" << mt << " ct=" << ct << " mb=" << mb << " cb=" << cb <<
    "\n  m1=" << m1 << " c1=" << c1 << " m2=" << m2 << " c2=" << c2 <<
    "\n  mw=" << mw << " cw=" << cw;
  
  // wire intersects top edge at
  LocalPoint pwt = intersection(mw, cw, mt, ct);
  // wire intersects bottom edge at
  LocalPoint pwb = intersection(mw, cw, mb, cb);
  
  // get the local coordinates
  float xt = pwt.x();
  float yt = pwt.y();
  
  float xb = pwb.x();
  float yb = pwb.y();
  
  LogTrace("CSCWireGeometry|CSC") << "CSCWireGeometry: wire intersects top & bottom of wire plane at " <<
    "\n  xt=" << xt << " yt=" << yt <<
    " xb=" << xb << " yb=" << yb ;
  
  float xWireEnd[4], yWireEnd[4];
  
  int i = 0;
  if ( fabs(x1) >= hb && fabs(x1) <= ht ) {
    // wire does intersect side edge 1 of wire plane
    xWireEnd[i] = x1;
    yWireEnd[i] = y1;
    i++;
  }
  if ( fabs(xb) <= hb ) {
    // wire does intersect bottom edge of wire plane
    xWireEnd[i] = xb;
    yWireEnd[i] = yb;
    i++;
  }
  if ( fabs(x2) >= hb && fabs(x2) <= ht ) {
    // wire does intersect side edge 2 of wire plane
    xWireEnd[i] = x2;
    yWireEnd[i] = y2;
    i++;
  }
  if ( fabs(xt) <= ht ) {
    // wire does intersect top edge of wire plane
    xWireEnd[i] = xt;
    yWireEnd[i] = yt;
    i++;
  }
  
  if ( i != 2 ) {
    // the wire does not intersect the wire plane (!)

    LogTrace("CSCWireGeometry|CSC") << "CSCWireGeometry: wire does not intersect wire plane!!";
    //     throw cms::Exception("BadCSCGeometry") << "the wire has " << i <<
    //       " ends!" << "\n";

    return std::pair< LocalPoint, LocalPoint >( LocalPoint(0.,0.), LocalPoint(0.,0.) ); 
  }
  
  LogTrace("CSCWireGeometry|CSC") << "CSCWireGeometry: ME11 wire ends ";
  for ( int j = 0; j<i; j++ ) {
    LogTrace("CSCWireGeometry|CSC") << "  x = " << xWireEnd[j] << " y = " << yWireEnd[j];
  }

  return std::pair< LocalPoint, LocalPoint >
   ( LocalPoint(xWireEnd[0],yWireEnd[0]), LocalPoint(xWireEnd[1],yWireEnd[1]) );  
}
double CSCWireGeometry::wireSpacing ( ) const [inline]
std::vector< float > CSCWireGeometry::wireValues ( float  wire) const

Return mid-point of a wire in local coordinates, and its length across the chamber volume, in a vector as x, y, length

Definition at line 18 of file CSCWireGeometry.cc.

References mathSSE::sqrt(), and wireEnds().

Referenced by CSCWireTopology::wireValues().

                                                               {

  // return x and y of mid-point of wire, and length of wire, as 3-dim vector.
  // If wire does not intersect active area the returned vector is filled with 0's.

  std::pair< LocalPoint, LocalPoint > ends = wireEnds( wire );

  std::vector<float> buf(3); // note all elem init to 0
  
  buf[0] = (ends.first.x() + ends.second.x())/2.; // x is first elem of first & second pairs
  buf[1] = (ends.first.y() + ends.second.y())/2.; // y is second elem of first & second pairs
  float d2 = (ends.first.x() - ends.second.x()) * (ends.first.x() - ends.second.x()) +
             (ends.first.y() - ends.second.y()) * (ends.first.y() - ends.second.y());
  buf[2] = sqrt(d2) ;
  return buf;
}
std::pair< float, float > CSCWireGeometry::yLimitsOfWirePlane ( ) const

Return pair containing y extremes of wire-plane: p.first = low y, p.second= high y

This is supposed to approximate the 'sensitive' region covered by wires (and strips) but there is no sophisticated handling of edge effects, or attempt to estimate a precise region overlapped by both wires and strips.

Definition at line 197 of file CSCWireGeometry.cc.

References lengthOfPlane(), narrowWidthOfPlane(), funct::tan(), wireAngle(), and yOfFirstWire().

Referenced by CSCWireTopology::insideYOfWirePlane(), and CSCWireTopology::restrictToYOfWirePlane().

                                                               {

  const float fprec = 0.1; // wire angle is either 0 or 29 degrees = 0.506 rads
  float ylow = yOfFirstWire(); // non-ME11 chambers
  float wangle = wireAngle();  
  if ( fabs(wangle) > fprec ) {
    ylow += tan( wangle ) * narrowWidthOfPlane()/2.; // correction for ME11
  }
  float yhigh = ylow + lengthOfPlane(); // add extent of wire plane in y
  
  return std::pair<float, float>(ylow, yhigh);
}
double CSCWireGeometry::yOfFirstWire ( ) const [inline]

The local y of the first wire

Definition at line 39 of file CSCWireGeometry.h.

References theYOfFirstWire.

Referenced by CSCNonslantedWireGeometry::nearestWire(), wireEnds(), yLimitsOfWirePlane(), and CSCNonslantedWireGeometry::yOfWire().

                              {
    return theYOfFirstWire; }
virtual float CSCWireGeometry::yOfWire ( float  wire,
float  x = 0. 
) const [pure virtual]

Local y of a given wire 'number' (float) at given x

Implemented in CSCNonslantedWireGeometry, and CSCSlantedWireGeometry.

Referenced by equationOfWire(), wireEnds(), CSCWireTopology::yOfWire(), and CSCWireTopology::yOfWireGroup().


Member Data Documentation

Definition at line 119 of file CSCWireGeometry.h.

Referenced by lengthOfPlane().

Definition at line 117 of file CSCWireGeometry.h.

Referenced by narrowWidthOfPlane().

Definition at line 118 of file CSCWireGeometry.h.

Referenced by wideWidthOfPlane().

Definition at line 115 of file CSCWireGeometry.h.

Referenced by wireSpacing().

Definition at line 116 of file CSCWireGeometry.h.

Referenced by yOfFirstWire().