1 |
#ifndef RECOTRACKER_TRANSIENTRACKINGRECHIT_TSiStripRecHit1D_H
|
2 |
#define RECOTRACKER_TRANSIENTRACKINGRECHIT_TSiStripRecHit1D_H
|
3 |
|
4 |
#include "DataFormats/TrackerRecHit2D/interface/SiStripRecHit1D.h"
|
5 |
#include "TrackingTools/TransientTrackingRecHit/interface/TransientTrackingRecHit.h"
|
6 |
#include "RecoLocalTracker/ClusterParameterEstimator/interface/StripClusterParameterEstimator.h"
|
7 |
#include "TrackingTools/TransientTrackingRecHit/interface/HelpertRecHit2DLocalPos.h"
|
8 |
#include "DataFormats/Common/interface/RefGetter.h"
|
9 |
#include "Geometry/CommonDetUnit/interface/GeomDetUnit.h"
|
10 |
#include "FWCore/MessageLogger/interface/MessageLogger.h"
|
11 |
|
12 |
|
13 |
class TSiStripRecHit1D : public TransientTrackingRecHit{
|
14 |
public:
|
15 |
|
16 |
typedef SiStripRecHit1D::ClusterRef SiStripClusterRef;
|
17 |
|
18 |
typedef edm::LazyGetter<SiStripCluster>::value_ref SiStripRegionalClusterRef;
|
19 |
|
20 |
virtual ~TSiStripRecHit1D() {}
|
21 |
|
22 |
|
23 |
virtual void getKfComponents( KfComponentsHolder & holder ) const {
|
24 |
HelpertRecHit2DLocalPos().getKfComponents(holder, theHitData, *det());
|
25 |
}
|
26 |
|
27 |
|
28 |
virtual AlgebraicVector parameters() const {return theHitData.parameters();}
|
29 |
|
30 |
|
31 |
virtual AlgebraicSymMatrix parametersError() const {
|
32 |
return HelpertRecHit2DLocalPos().parError( theHitData.localPositionError(), *det());
|
33 |
// return theHitData->parametersError();
|
34 |
}
|
35 |
|
36 |
|
37 |
virtual AlgebraicMatrix projectionMatrix() const {return theHitData.projectionMatrix();}
|
38 |
virtual int dimension() const {return theHitData.dimension();}
|
39 |
|
40 |
virtual LocalPoint localPosition() const {return theHitData.localPosition();}
|
41 |
virtual LocalError localPositionError() const {return theHitData.localPositionError();}
|
42 |
|
43 |
virtual const TrackingRecHit * hit() const {return &theHitData;};
|
44 |
|
45 |
virtual std::vector<const TrackingRecHit*> recHits() const {
|
46 |
return hit()->recHits();
|
47 |
}
|
48 |
virtual std::vector<TrackingRecHit*> recHits() {
|
49 |
return theHitData.recHits();
|
50 |
}
|
51 |
|
52 |
virtual const GeomDetUnit* detUnit() const;
|
53 |
|
54 |
virtual bool canImproveWithTrack() const {return true;}
|
55 |
|
56 |
//RC virtual TSiStripRecHit2DLocalPos* clone(const TrajectoryStateOnSurface& ts) const;
|
57 |
virtual RecHitPointer clone(const TrajectoryStateOnSurface& ts) const;
|
58 |
|
59 |
// Extension of the TransientTrackingRecHit interface
|
60 |
|
61 |
const SiStripRecHit1D* specificHit() const {return &theHitData;};
|
62 |
const StripClusterParameterEstimator* cpe() const {return theCPE;}
|
63 |
|
64 |
static RecHitPointer build( const GeomDet * geom, const SiStripRecHit1D* rh,
|
65 |
const StripClusterParameterEstimator* cpe,
|
66 |
float weight=1., float annealing=1.,
|
67 |
bool computeCoarseLocalPosition=false) {
|
68 |
return RecHitPointer( new TSiStripRecHit1D( geom, rh, cpe, weight, annealing,computeCoarseLocalPosition));
|
69 |
}
|
70 |
|
71 |
static RecHitPointer build( const LocalPoint& pos, const LocalError& err,
|
72 |
const GeomDet* det,
|
73 |
const SiStripClusterRef clust,
|
74 |
const StripClusterParameterEstimator* cpe,
|
75 |
float weight=1., float annealing=1.) {
|
76 |
return RecHitPointer( new TSiStripRecHit1D( pos, err, det, clust, cpe, weight, annealing));
|
77 |
}
|
78 |
|
79 |
static RecHitPointer build( const LocalPoint& pos, const LocalError& err,
|
80 |
const GeomDet* det,
|
81 |
const SiStripRegionalClusterRef clust,
|
82 |
const StripClusterParameterEstimator* cpe,
|
83 |
float weight=1., float annealing=1.) {
|
84 |
return RecHitPointer( new TSiStripRecHit1D( pos, err, det, clust, cpe, weight, annealing));
|
85 |
}
|
86 |
|
87 |
|
88 |
|
89 |
private:
|
90 |
|
91 |
SiStripRecHit1D theHitData;
|
92 |
const StripClusterParameterEstimator* theCPE;
|
93 |
|
94 |
TSiStripRecHit1D (const GeomDet * geom, const SiStripRecHit1D* rh,
|
95 |
const StripClusterParameterEstimator* cpe,
|
96 |
float weight, float annealing,
|
97 |
bool computeCoarseLocalPosition) :
|
98 |
TransientTrackingRecHit(geom, weight, annealing), theCPE(cpe)
|
99 |
{
|
100 |
if (rh->hasPositionAndError() || !computeCoarseLocalPosition)
|
101 |
theHitData = SiStripRecHit1D(*rh);
|
102 |
else{
|
103 |
const GeomDetUnit* gdu = dynamic_cast<const GeomDetUnit*>(geom);
|
104 |
LogDebug("TSiStripRecHit2DLocalPos")<<"calculating coarse position/error.";
|
105 |
if (gdu){
|
106 |
if (rh->cluster().isNonnull()){
|
107 |
StripClusterParameterEstimator::LocalValues lval= theCPE->localParameters(*rh->cluster(), *gdu);
|
108 |
LocalError le(lval.second.xx(),0.,DBL_MAX); //Correct??
|
109 |
theHitData = SiStripRecHit1D(lval.first, le, geom->geographicalId(),rh->cluster());
|
110 |
}else{
|
111 |
StripClusterParameterEstimator::LocalValues lval= theCPE->localParameters(*rh->cluster_regional(), *gdu);
|
112 |
LocalError le(lval.second.xx(),0.,DBL_MAX); //Correct??
|
113 |
theHitData = SiStripRecHit1D(lval.first, le, geom->geographicalId(),rh->cluster_regional());
|
114 |
}
|
115 |
}else{
|
116 |
edm::LogError("TSiStripRecHit2DLocalPos")<<" geomdet does not cast into geomdet unit. cannot create strip local parameters.";
|
117 |
theHitData = SiStripRecHit1D(*rh);
|
118 |
}
|
119 |
}
|
120 |
}
|
121 |
|
122 |
/// Creates the TrackingRecHit internally, avoids redundent cloning
|
123 |
TSiStripRecHit1D( const LocalPoint& pos, const LocalError& err,
|
124 |
const GeomDet* det,
|
125 |
const SiStripClusterRef clust,
|
126 |
const StripClusterParameterEstimator* cpe,
|
127 |
float weight, float annealing) :
|
128 |
TransientTrackingRecHit(det, weight, annealing), theHitData(pos, err, det->geographicalId(), clust),
|
129 |
theCPE(cpe){}
|
130 |
|
131 |
// TSiStripRecHit2DLocalPos( const TSiStripRecHit2DLocalPos& other ) :
|
132 |
// TransientTrackingRecHit( other.det()),
|
133 |
// theHitData( other.specificHit()->clone()),
|
134 |
// theCPE( other.cpe()) {}
|
135 |
|
136 |
TSiStripRecHit1D( const LocalPoint& pos, const LocalError& err,
|
137 |
const GeomDet* det,
|
138 |
const SiStripRegionalClusterRef clust,
|
139 |
const StripClusterParameterEstimator* cpe,
|
140 |
float weight, float annealing) :
|
141 |
TransientTrackingRecHit(det, weight, annealing), theHitData(pos, err, det->geographicalId(), clust),
|
142 |
theCPE(cpe){}
|
143 |
|
144 |
|
145 |
|
146 |
virtual TSiStripRecHit1D* clone() const {
|
147 |
return new TSiStripRecHit1D(*this);
|
148 |
}
|
149 |
|
150 |
};
|
151 |
|
152 |
#endif
|