forked from cms-sw/cmssw
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request cms-sw#200 from jshlee/trackerGEM-GEMGeo
Tracker gem gem geo
- Loading branch information
Showing
64 changed files
with
3,143 additions
and
301 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,119 @@ | ||
#ifndef GEMRecHit_GEMSegment_h | ||
#define GEMRecHit_GEMSegment_h | ||
|
||
/** \class GEMSegment derived by the CSC segment | ||
* Describes a reconstructed track segment in the 2+ layers of a GEM chamber. | ||
* This is 4-dimensional since it has an origin (x,y) and a direction (x,y) | ||
* in the local coordinate system of the chamber. | ||
* | ||
* \author Piet Verwilligen | ||
*/ | ||
|
||
#include <DataFormats/TrackingRecHit/interface/RecSegment.h> | ||
#include <DataFormats/GEMRecHit/interface/GEMRecHitCollection.h> | ||
|
||
#include <iosfwd> | ||
|
||
class GEMDetId; | ||
|
||
class GEMSegment GCC11_FINAL : public RecSegment { | ||
|
||
public: | ||
|
||
/// Default constructor | ||
GEMSegment() : theChi2(0.){} | ||
|
||
/// Constructor | ||
GEMSegment(const std::vector<const GEMRecHit*>& proto_segment, LocalPoint origin, | ||
LocalVector direction, AlgebraicSymMatrix errors, double chi2); | ||
|
||
GEMSegment(const std::vector<const GEMRecHit*>& proto_segment, LocalPoint origin, | ||
LocalVector direction, AlgebraicSymMatrix errors, double chi2, float bx); | ||
|
||
GEMSegment(const std::vector<const GEMRecHit*>& proto_segment, LocalPoint origin, | ||
LocalVector direction, AlgebraicSymMatrix errors, double chi2, double time, double timeErr); | ||
|
||
/// Destructor | ||
virtual ~GEMSegment(); | ||
|
||
//--- Base class interface | ||
GEMSegment* clone() const { return new GEMSegment(*this); } | ||
|
||
LocalPoint localPosition() const { return theOrigin; } | ||
LocalError localPositionError() const ; | ||
|
||
LocalVector localDirection() const { return theLocalDirection; } | ||
LocalError localDirectionError() const ; | ||
|
||
/// Parameters of the segment, for the track fit in the order (dx/dz, dy/dz, x, y ) | ||
AlgebraicVector parameters() const; | ||
|
||
/// Covariance matrix of parameters() | ||
AlgebraicSymMatrix parametersError() const { return theCovMatrix; } | ||
|
||
/// The projection matrix relates the trajectory state parameters to the segment parameters(). | ||
virtual AlgebraicMatrix projectionMatrix() const; | ||
|
||
virtual std::vector<const TrackingRecHit*> recHits() const; | ||
|
||
virtual std::vector<TrackingRecHit*> recHits(); | ||
|
||
double chi2() const { return theChi2; }; | ||
|
||
virtual int dimension() const { return 4; } | ||
|
||
virtual int degreesOfFreedom() const { return 2*nRecHits() - 4;} | ||
|
||
//--- Extension of the interface | ||
|
||
const std::vector<GEMRecHit>& specificRecHits() const { return theGEMRecHits; } | ||
|
||
int nRecHits() const { return theGEMRecHits.size(); } | ||
|
||
GEMDetId gemDetId() const { | ||
DetId detid = geographicalId(); | ||
GEMDetId rollid = GEMDetId(detid); | ||
GEMDetId chamid = rollid.superChamberId(); | ||
return chamid; | ||
} | ||
|
||
/* | ||
GEMDetId gemDetId() const { | ||
// this geographical id comes from the RecSegment. | ||
// in .cc we have defined to choose always ST3 for GE2/1 | ||
// and always choose Layer 1 in general | ||
DetId detid = geographicalId(); | ||
GEMDetId rollid = GEMDetId(detid); | ||
GEMDetId chamid = rollid.chamberId(); | ||
// for GE1/1 this chamber id is fine | ||
// for GE2/1 the station can be 2 or 3 and we want to fix it to 3 | ||
if(chamid.station()==1) return chamid; | ||
else if(chamid.station()==2) { | ||
// GEMDetId:: Re Ri St La Ch Ro | ||
return GEMDetId(chamid.region(),1,3,1,chamid.chamber(),0); | ||
} | ||
else if(chamid.station()==3) return chamid; | ||
else return chamid; | ||
} | ||
*/ | ||
|
||
float time() const { return theTimeValue; } | ||
float timeErr() const { return theTimeUncrt; } | ||
float BunchX() const { return theBX; } | ||
void print() const; | ||
|
||
private: | ||
|
||
std::vector<GEMRecHit> theGEMRecHits; | ||
LocalPoint theOrigin; // in chamber frame - the GeomDet local coordinate system | ||
LocalVector theLocalDirection; // in chamber frame - the GeomDet local coordinate system | ||
AlgebraicSymMatrix theCovMatrix; // the covariance matrix | ||
double theChi2; // the Chi squared of the segment fit | ||
double theTimeValue; // the best time estimate of the segment | ||
double theTimeUncrt; // the uncertainty on the time estimation | ||
float theBX; // the bunch crossing | ||
}; | ||
|
||
std::ostream& operator<<(std::ostream& os, const GEMSegment& seg); | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
#ifndef DataFormats_GEMSegmentCollection_H | ||
#define DataFormats_GEMSegmentCollection_H | ||
|
||
/** \class GEMSegmentCollection | ||
* | ||
* The collection of GEMSegment's. See \ref CSCSegmentCollection.h for details from which is derived. | ||
* | ||
* \author Piet Verwilligen | ||
*/ | ||
|
||
#include <DataFormats/MuonDetId/interface/GEMDetId.h> | ||
#include <DataFormats/GEMRecHit/interface/GEMSegment.h> | ||
|
||
#include <DataFormats/Common/interface/RangeMap.h> | ||
#include <DataFormats/Common/interface/ClonePolicy.h> | ||
#include <DataFormats/Common/interface/OwnVector.h> | ||
|
||
typedef edm::RangeMap <GEMDetId, edm::OwnVector<GEMSegment> > GEMSegmentCollection; | ||
|
||
#include <DataFormats/Common/interface/Ref.h> | ||
typedef edm::Ref<GEMSegmentCollection> GEMSegmentRef; | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,147 @@ | ||
/** \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) { | ||
// GE1/1 => station 1 | ||
// GE2/1 => station 2 & 3 => combine Short & Long to mimick future technology that can have 4+ layers | ||
int station, layer; | ||
if (id.station()==1) station = 1; | ||
else if (id.station()==2 || id.station()==3) station = 3; | ||
else station = 0; | ||
layer = 0; | ||
return GEMDetId(id.region(),id.ring(),station,layer,id.chamber(),id.roll()); | ||
} | ||
} | ||
|
||
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, LocalPoint origin, | ||
LocalVector direction, AlgebraicSymMatrix errors, double chi2) : | ||
RecSegment(buildDetId(proto_segment.front()->gemId())), | ||
theOrigin(origin), | ||
theLocalDirection(direction), theCovMatrix(errors), theChi2(chi2){ | ||
theTimeValue = 0.0; | ||
theTimeUncrt = 0.0; | ||
theBX = -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, LocalPoint origin, | ||
LocalVector direction, AlgebraicSymMatrix errors, double chi2, float bx) : | ||
RecSegment(buildDetId(proto_segment.front()->gemId())), | ||
theOrigin(origin), | ||
theLocalDirection(direction), theCovMatrix(errors), theChi2(chi2){ | ||
theTimeValue = 0.0; | ||
theTimeUncrt = 0.0; | ||
theBX = bx; | ||
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, LocalPoint origin, | ||
LocalVector direction, AlgebraicSymMatrix errors, double chi2, double time, double timeErr) : | ||
RecSegment(buildDetId(proto_segment.front()->gemId())), | ||
theOrigin(origin), | ||
theLocalDirection(direction), theCovMatrix(errors), theChi2(chi2){ | ||
theTimeValue = time; | ||
theTimeUncrt = timeErr; | ||
theBX = -10.0; | ||
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() << | ||
" time = "<< seg.time() << " +/- " << seg.timeErr() << " ns"; | ||
|
||
return os; | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.