The problem: the EEmcSmdGeom class has a getIntersection() method which returns a vector pointing to the crossing point of two specified SMD strips. The class made the simplifying assumption that both SMD planes are coplanar. This leads to parralax errors in the reconstructed position of hits in the SMD which are on the order of one strip.

Solution: do it right. Over the summer, a student at VU (Noah Schroeder) wrote a more generalized version of the getIntersection method. Given the two points on an SMD strip and a vertex position, he defines a plane in space. Given a second SMD strip, two planes have been defined. The line of intersection between the two planes defines a vector in space, which is returned.

Math details: Noah provided a detailed derivation.

User interface: The interface remains the same.

  EEmcSmdGeom *esmd = EEmcSmdGeom::instance(); // get an instance of the geometry class
  TVector3 vertex = ... ; // get the event vertex 
  Int_t iu = ... ; // get the SMD-u strip at the center of an EM shower
  Int_t iv = ... ; // get the SMD-v strip at the center of an EM shower
  TVector3 cross = esmd->getIntersection( sector, iu, iv, vertex );
  

Other changes:

  1. Not every U,V pair forms a valid intersection. Invalid intersections are flagged with cross.Z() = -999.
  2. A warning is issued (LOG_WARN) when an invalid U,V pair is entered.