ProjectionMatrixDiag

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
/** \file GEMegment.cc
 *
 *  \author Piet Verwilligen
 */
#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include "DataFormats/GEMRecHit/interface/GEMSegment.h"
#include <iostream>

namespace {
  // create reference GEM Chamber ID for segment
  inline DetId buildDetId(GEMDetId id) { return GEMDetId(id.superChamberId()); }
}  // namespace

class ProjectionMatrixDiag {
  // Aider class to make the return of the projection Matrix thread-safe
protected:
  AlgebraicMatrix theProjectionMatrix;

public:
  ProjectionMatrixDiag() : theProjectionMatrix(4, 5, 0) {
    theProjectionMatrix[0][1] = 1;
    theProjectionMatrix[1][2] = 1;
    theProjectionMatrix[2][3] = 1;
    theProjectionMatrix[3][4] = 1;
  }
  const AlgebraicMatrix& getMatrix() const { return (theProjectionMatrix); }
};

GEMSegment::GEMSegment(const std::vector<const GEMRecHit*>& proto_segment,
                       const LocalPoint& origin,
                       const LocalVector& direction,
                       const AlgebraicSymMatrix& errors,
                       double chi2)
    : RecSegment(buildDetId(proto_segment.front()->gemId())),
      theOrigin(origin),
      theLocalDirection(direction),
      theCovMatrix(errors),
      theChi2(chi2) {
  theBX = -10.0;
  theDeltaPhi = -10.0;
  for (unsigned int i = 0; i < proto_segment.size(); ++i)
    theGEMRecHits.push_back(*proto_segment[i]);
}

GEMSegment::GEMSegment(const std::vector<const GEMRecHit*>& proto_segment,
                       const LocalPoint& origin,
                       const LocalVector& direction,
                       const AlgebraicSymMatrix& errors,
                       double chi2,
                       float bx)
    : RecSegment(buildDetId(proto_segment.front()->gemId())),
      theOrigin(origin),
      theLocalDirection(direction),
      theCovMatrix(errors),
      theChi2(chi2),
      theBX(bx) {
  theDeltaPhi = -10.0;
  for (unsigned int i = 0; i < proto_segment.size(); ++i)
    theGEMRecHits.push_back(*proto_segment[i]);
}

GEMSegment::GEMSegment(const std::vector<const GEMRecHit*>& proto_segment,
                       const LocalPoint& origin,
                       const LocalVector& direction,
                       const AlgebraicSymMatrix& errors,
                       double chi2,
                       float bx,
                       float deltaPhi)
    : RecSegment(buildDetId(proto_segment.front()->gemId())),
      theOrigin(origin),
      theLocalDirection(direction),
      theCovMatrix(errors),
      theChi2(chi2),
      theBX(bx),
      theDeltaPhi(deltaPhi) {
  for (unsigned int i = 0; i < proto_segment.size(); ++i)
    theGEMRecHits.push_back(*proto_segment[i]);
}

GEMSegment::~GEMSegment() {}

std::vector<const TrackingRecHit*> GEMSegment::recHits() const {
  std::vector<const TrackingRecHit*> pointersOfRecHits;
  for (std::vector<GEMRecHit>::const_iterator irh = theGEMRecHits.begin(); irh != theGEMRecHits.end(); ++irh) {
    pointersOfRecHits.push_back(&(*irh));
  }
  return pointersOfRecHits;
}

std::vector<TrackingRecHit*> GEMSegment::recHits() {
  std::vector<TrackingRecHit*> pointersOfRecHits;
  for (std::vector<GEMRecHit>::iterator irh = theGEMRecHits.begin(); irh != theGEMRecHits.end(); ++irh) {
    pointersOfRecHits.push_back(&(*irh));
  }
  return pointersOfRecHits;
}

LocalError GEMSegment::localPositionError() const {
  return LocalError(theCovMatrix[2][2], theCovMatrix[2][3], theCovMatrix[3][3]);
}

LocalError GEMSegment::localDirectionError() const {
  return LocalError(theCovMatrix[0][0], theCovMatrix[0][1], theCovMatrix[1][1]);
}

AlgebraicVector GEMSegment::parameters() const {
  // For consistency with DT and CSC  and what we require for the TrackingRecHit interface,
  // the order of the parameters in the returned vector should be (dx/dz, dy/dz, x, z)

  AlgebraicVector result(4);

  if (theLocalDirection.z() != 0) {
    result[0] = theLocalDirection.x() / theLocalDirection.z();
    result[1] = theLocalDirection.y() / theLocalDirection.z();
  }
  result[2] = theOrigin.x();
  result[3] = theOrigin.y();

  return result;
}

AlgebraicMatrix GEMSegment::projectionMatrix() const {
  static const ProjectionMatrixDiag theProjectionMatrix;
  return (theProjectionMatrix.getMatrix());
}

//
void GEMSegment::print() const { LogDebug("GEMSegment") << *this; }

std::ostream& operator<<(std::ostream& os, const GEMSegment& seg) {
  os << "GEMSegment: local pos = " << seg.localPosition() << " posErr = (" << sqrt(seg.localPositionError().xx()) << ","
     << sqrt(seg.localPositionError().yy()) << "0,)\n"
     << "            dir = " << seg.localDirection() << " dirErr = (" << sqrt(seg.localDirectionError().xx()) << ","
     << sqrt(seg.localDirectionError().yy()) << "0,)\n"
     << "            chi2/ndf = " << ((seg.degreesOfFreedom() != 0.) ? seg.chi2() / double(seg.degreesOfFreedom()) : 0)
     << " #rechits = " << seg.specificRecHits().size() << " bx = " << seg.bunchX() << " deltaPhi = " << seg.deltaPhi();

  return os;
}