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
|
/** \file GEMCSCSegment.cc
*
* Based on CSCSegment class
* \author Raffaella Radogna
*/
#include "DataFormats/GEMRecHit/interface/GEMCSCSegment.h"
#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include <iostream>
namespace {
// Get CSCDetId from one of the rechits, but then remove the layer part so it's a _chamber_ id
inline DetId buildDetId(CSCDetId id) { return CSCDetId(id.endcap(), id.station(), id.ring(), id.chamber(), 0); }
} // 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); }
};
GEMCSCSegment::GEMCSCSegment(const CSCSegment* csc_segment,
const std::vector<const GEMRecHit*> gem_rhs,
LocalPoint origin,
LocalVector direction,
AlgebraicSymMatrix errors,
double chi2)
:
RecSegment(buildDetId(csc_segment->cscDetId())),
theOrigin(origin),
theLocalDirection(direction),
theCovMatrix(errors),
theChi2(chi2) {
for (unsigned int i = 0; i < gem_rhs.size(); ++i) {
theGEMRecHits.push_back((*gem_rhs[i]));
}
theCSCSegment = *csc_segment;
// LogDebug
edm::LogVerbatim("GEMCSCSegment")
<< "[GEMCSCSegment :: ctor] CSCDetId: " << csc_segment->cscDetId()
<< " CSC RecHits: " << csc_segment->specificRecHits().size() << " GEM RecHits: " << gem_rhs.size()
<< "\n" // << " Fit chi2: "<<chi2<<" Position: "<<origin<<" Direction: "<<direction
<< " CSC Segment Details: \n"
<< *csc_segment << "\n"
<< " GEMCSC Segment Details: \n"
<< *this << "\n"
<< "[GEMCSCSegment :: ctor] ------------------------------------------------------------";
}
GEMCSCSegment::~GEMCSCSegment() {}
std::vector<const TrackingRecHit*> GEMCSCSegment::recHits() const {
std::vector<const TrackingRecHit*> pointersOfRecHits;
for (std::vector<GEMRecHit>::const_iterator irh = theGEMRecHits.begin(); irh != theGEMRecHits.end(); ++irh) {
pointersOfRecHits.push_back(&(*irh));
}
for (std::vector<CSCRecHit2D>::const_iterator irh = theCSCSegment.specificRecHits().begin();
irh != theCSCSegment.specificRecHits().end();
++irh) {
pointersOfRecHits.push_back(&(*irh));
}
return pointersOfRecHits;
}
std::vector<TrackingRecHit*> GEMCSCSegment::recHits() {
std::vector<TrackingRecHit*> pointersOfRecHits;
for (std::vector<GEMRecHit>::iterator irh = theGEMRecHits.begin(); irh != theGEMRecHits.end(); ++irh) {
pointersOfRecHits.push_back(&(*irh));
}
return pointersOfRecHits;
}
LocalError GEMCSCSegment::localPositionError() const {
return LocalError(theCovMatrix[2][2], theCovMatrix[2][3], theCovMatrix[3][3]);
}
LocalError GEMCSCSegment::localDirectionError() const {
return LocalError(theCovMatrix[0][0], theCovMatrix[0][1], theCovMatrix[1][1]);
}
AlgebraicVector GEMCSCSegment::parameters() const {
// For consistency with DT, 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 GEMCSCSegment::projectionMatrix() const {
static const ProjectionMatrixDiag theProjectionMatrix;
return (theProjectionMatrix.getMatrix());
}
std::ostream& operator<<(std::ostream& os, const GEMCSCSegment& seg) {
os << "GEMCSCSegment: 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.0)
<< " #rechits = " << seg.nRecHits();
return os;
}
|