CMS 3D CMS Logo

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
MuonErrorMatrixAdjuster.cc
Go to the documentation of this file.
2 
3 #include "TString.h"
4 #include "TMath.h"
7 
10 
12 
15 
18 
20  : theFieldToken{esConsumes()}, theHttopoToken{esConsumes()} {
21  theCategory = "MuonErrorMatrixAdjuster";
22  theInstanceName = iConfig.getParameter<std::string>("instanceName");
23  //register your products
24  produces<reco::TrackCollection>(theInstanceName);
25  produces<TrackingRecHitCollection>();
26  produces<reco::TrackExtraCollection>();
27 
28  theTrackLabel = iConfig.getParameter<edm::InputTag>("trackLabel");
29  consumes<reco::TrackCollection>(theTrackLabel);
30  theRescale = iConfig.getParameter<bool>("rescale");
31 
32  auto matrixProvider_pset = iConfig.getParameter<edm::ParameterSet>("errorMatrix_pset");
33 
34  theMatrixProvider = std::make_unique<MuonErrorMatrix>(matrixProvider_pset);
35 }
36 
38  // do anything here that needs to be done at desctruction time
39  // (e.g. close files, deallocate resources etc.)
40 }
41 
42 //
43 // member functions
44 //
45 
46 //take the error matrix and rescale it or just replace it
48  const reco::TrackBase::CovarianceMatrix& error_matrix, const GlobalVector& momentum) {
49  //CovarianceMatrix is template for SMatrix
50  reco::TrackBase::CovarianceMatrix revised_matrix(theMatrixProvider->get(momentum));
51 
52  if (theRescale) {
53  //rescale old error matrix up by a factor
54  multiply(revised_matrix, error_matrix);
55  }
56  return revised_matrix;
57 }
58 
60  const reco::TrackBase::CovarianceMatrix& scale_matrix) {
61  //scale term by term the matrix
62  // the true type of the matrix is such that [i][j] is the same memory object as [j][i]: looping i:0-5, j:0-5 double multiply the terms
63  // need to loop only on i:0-5, j:i-5
64  for (int i = 0; i != 5; i++) {
65  for (int j = i; j != 5; j++) {
66  revised_matrix(i, j) *= scale_matrix(i, j);
67  }
68  }
69 }
71  const reco::TrackBase::CovarianceMatrix& denom_matrix) {
72  //divide term by term the matrix
73  // the true type of the matrix is such that [i][j] is the same memory object as [j][i]: looping i:0-5, j:0-5 double multiply the terms
74  // need to loop only on i:0-5, j:i-5
75  for (int i = 0; i != 5; i++) {
76  for (int j = i; j != 5; j++) {
77  if (denom_matrix(i, j) == 0)
78  return false;
79  num_matrix(i, j) /= denom_matrix(i, j);
80  }
81  }
82  return true;
83 }
84 
86  //get the parameters of the track so I can reconstruct it
87  double chi2 = recotrack_orig.chi2();
88  double ndof = recotrack_orig.ndof();
89  const math::XYZPoint& refpos = recotrack_orig.referencePoint();
90  const math::XYZVector& mom = recotrack_orig.momentum();
91  int charge = recotrack_orig.charge();
92 
93  reco::TrackBase::CovarianceMatrix covariance_matrix =
94  fix_cov_matrix(recotrack_orig.covariance(), PCAstate.momentum());
95 
96  LogDebug(theCategory) << "chi2: " << chi2 << "\n ndof: " << ndof << "\n refpos: " << refpos << "\n mom: " << mom
97  << "\n charge: " << charge << "\n covariance:\n"
98  << recotrack_orig.covariance() << "\n replaced by:\n"
99  << covariance_matrix;
100 
101  return reco::Track(chi2, ndof, refpos, mom, charge, covariance_matrix);
102 }
103 
105  reco::Track& recotrack,
107  //get the 5x5 matrix of recotrack/recotrack_orig
108  reco::TrackBase::CovarianceMatrix scale_matrix(recotrack.covariance());
109  if (!divide(scale_matrix, recotrack_orig.covariance())) {
110  edm::LogError(theCategory) << "original track error matrix has term ==0... skipping.";
111  return nullptr;
112  }
113 
114  const reco::TrackExtraRef& trackExtra_orig = recotrack_orig.extra();
115  if (trackExtra_orig.isNull()) {
116  edm::LogError(theCategory) << "original track has no track extra... skipping.";
117  return nullptr;
118  }
119 
120  //copy the outer state. rescaling the error matrix
121  reco::TrackBase::CovarianceMatrix outerCov(trackExtra_orig->outerStateCovariance());
122  multiply(outerCov, scale_matrix);
123 
124  //copy the inner state, rescaling the error matrix
125  reco::TrackBase::CovarianceMatrix innerCov(trackExtra_orig->innerStateCovariance());
126  multiply(innerCov, scale_matrix);
127 
128  //put the trackExtra
129  TEcol.push_back(reco::TrackExtra(trackExtra_orig->outerPosition(),
130  trackExtra_orig->outerMomentum(),
131  true,
132  trackExtra_orig->innerPosition(),
133  trackExtra_orig->innerMomentum(),
134  true,
135  outerCov,
136  trackExtra_orig->outerDetId(),
137  innerCov,
138  trackExtra_orig->innerDetId(),
139  trackExtra_orig->seedDirection()));
140 
141  //add a reference to the trackextra on the track
143 
144  //return the reference to the last inserted then
145  return &(TEcol.back());
146 }
147 
149  reco::Track& recotrack,
150  reco::TrackExtra& trackextra,
152  const TrackerTopology& ttopo) {
153  //loop over the hits of the original track
154  trackingRecHit_iterator recHit = recotrack_orig.recHitsBegin();
155  auto const firstHitIndex = theRHi;
156  for (; recHit != recotrack_orig.recHitsEnd(); ++recHit) {
157  //clone it. this is meandatory
158  TrackingRecHit* hit = (*recHit)->clone();
159 
160  //put it on the new track
161  recotrack.appendHitPattern(*hit, ttopo);
162  //copy them in the new collection
163  RHcol.push_back(hit);
164  ++theRHi;
165 
166  } //loop over original rechits
167  //do something with the trackextra
168  trackextra.setHits(theRefprodRH, firstHitIndex, theRHi - firstHitIndex);
169 
170  return true; //if nothing fails
171 }
172 
173 bool MuonErrorMatrixAdjuster::selectTrack(const reco::Track& recotrack_orig) { return true; }
174 
175 // ------------ method called to produce the data ------------
177  using namespace edm;
178 
179  //open a collection of track
181  iEvent.getByLabel(theTrackLabel, tracks);
182  LogDebug(theCategory) << "considering: " << tracks->size() << " uncorrected reco::Track from the event.("
183  << theTrackLabel << ")";
184 
185  //get the mag field
186  theField = iSetup.getHandle(theFieldToken);
187 
188  const TrackerTopology& ttopo = iSetup.getData(theHttopoToken);
189 
190  //prepare the output collection
191  auto Toutput = std::make_unique<reco::TrackCollection>();
192  auto TRHoutput = std::make_unique<TrackingRecHitCollection>();
193  auto TEoutput = std::make_unique<reco::TrackExtraCollection>();
194  theRefprodTE = iEvent.getRefBeforePut<reco::TrackExtraCollection>();
195  theTEi = 0;
196  theRefprodRH = iEvent.getRefBeforePut<TrackingRecHitCollection>();
197  theRHi = 0;
198 
199  for (unsigned int it = 0; it != tracks->size(); it++) {
200  const reco::Track& recotrack_orig = (*tracks)[it];
202  if (PCAstate.position().mag() == 0) {
203  edm::LogError(theCategory) << "invalid state from track initial state in " << theTrackLabel << ". skipping.";
204  continue;
205  }
206 
207  //create a reco::Track
208  reco::Track recotrack = makeTrack(recotrack_orig, PCAstate);
209 
210  //make a selection on the create reco::Track
211  if (!selectTrack(recotrack))
212  continue;
213 
214  Toutput->push_back(recotrack);
215  reco::Track& recotrackref = Toutput->back();
216 
217  //build the track extra
218  reco::TrackExtra* extra = makeTrackExtra(recotrack_orig, recotrackref, *TEoutput);
219  if (!extra) {
220  edm::LogError(theCategory) << "cannot create the track extra for this track.";
221  //pop the inserted track
222  Toutput->pop_back();
223  continue;
224  }
225 
226  //attach the collection of rechits
227  if (!attachRecHits(recotrack_orig, recotrackref, *extra, *TRHoutput, ttopo)) {
228  edm::LogError(theCategory) << "cannot attach any rechits on this track";
229  //pop the inserted track
230  Toutput->pop_back();
231  //pop the track extra
232  TEoutput->pop_back();
233  theTEi--;
234  continue;
235  }
236 
237  } //loop over the original reco tracks
238 
239  LogDebug(theCategory) << "writing: " << Toutput->size() << " corrected reco::Track to the event.";
240 
241  iEvent.put(std::move(Toutput), theInstanceName);
242  iEvent.put(std::move(TEoutput));
243  iEvent.put(std::move(TRHoutput));
244 }
void produce(edm::Event &, const edm::EventSetup &) override
framework method
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
edm::RefProd< reco::TrackExtraCollection > theRefprodTE
get reference before put track extra to the event, in order to create edm::Ref
reco::TrackBase::CovarianceMatrix fix_cov_matrix(const reco::TrackBase::CovarianceMatrix &error_matrix, const GlobalVector &momentum)
return a corrected error matrix
void setHits(TrackingRecHitRefProd const &prod, unsigned firstH, unsigned int nH)
std::unique_ptr< MuonErrorMatrix > theMatrixProvider
holds the error matrix parametrization
const Point & referencePoint() const
Reference point on the track.
Definition: TrackBase.h:667
std::string theInstanceName
instrance name of the created track collecion. rechit and trackextra have no instance name ...
Log< level::Error, false > LogError
edm::InputTag theTrackLabel
input tag of the reco::Track collection to be corrected
bool attachRecHits(const reco::Track &recotrack_orig, reco::Track &recotrack, reco::TrackExtra &trackextra, TrackingRecHitCollection &RHcol, const TrackerTopology &ttopo)
attached rechits to the newly created reco::Track and reco::TrackExtra
std::string theCategory
log category: MuonErrorMatrixAdjuster
void multiply(reco::TrackBase::CovarianceMatrix &revised_matrix, const reco::TrackBase::CovarianceMatrix &scale_matrix)
mutliply revised_matrix (first argument) by second matrix TERM by TERM
edm::ESHandle< MagneticField > theField
hold on to the magnetic field
MuonErrorMatrixAdjuster(const edm::ParameterSet &)
constructor
GlobalPoint position() const
double ndof() const
number of degrees of freedom of the fit
Definition: TrackBase.h:590
void push_back(D *&d)
Definition: OwnVector.h:326
int charge() const
track electric charge
Definition: TrackBase.h:596
int iEvent
Definition: GenABIO.cc:224
T const * product() const
Definition: ESHandle.h:86
CovarianceMatrix covariance() const
return track covariance matrix
Definition: TrackBase.h:716
bool divide(reco::TrackBase::CovarianceMatrix &num_matrix, const reco::TrackBase::CovarianceMatrix &denom_matrix)
divide the num_matrix (first argument) by second matrix, TERM by TERM
~MuonErrorMatrixAdjuster() override
destructor
T mag() const
Definition: PV3DBase.h:64
GlobalVector momentum() const
edm::Ref< reco::TrackExtraCollection >::key_type theTEi
trackingRecHit_iterator recHitsEnd() const
Iterator to last hit on the track.
Definition: Track.h:91
bool getData(T &iHolder) const
Definition: EventSetup.h:122
edm::RefProd< TrackingRecHitCollection > theRefprodRH
get reference before put rechit to the event, in order to create edm::Ref
bool isNull() const
Checks for null.
Definition: Ref.h:235
ESHandle< T > getHandle(const ESGetToken< T, R > &iToken) const
Definition: EventSetup.h:151
trackingRecHit_iterator recHitsBegin() const
Iterator to first hit on the track.
Definition: Track.h:88
std::vector< TrackExtra > TrackExtraCollection
collection of TrackExtra objects
Definition: TrackExtraFwd.h:10
void setExtra(const TrackExtraRef &ref)
set reference to "extra" object
Definition: Track.h:136
auto const & tracks
cannot be loose
reco::TrackExtra * makeTrackExtra(const reco::Track &recotrack_orig, reco::Track &recotrack, reco::TrackExtraCollection &TEcol)
create a track extra for the newly created recotrack, scaling the outer/inner measurment error matrix...
const edm::ESGetToken< TrackerTopology, TrackerTopologyRcd > theHttopoToken
XYZVectorD XYZVector
spatial vector with cartesian internal representation
Definition: Vector3D.h:31
XYZPointD XYZPoint
point in space with cartesian internal representation
Definition: Point3D.h:12
double chi2() const
chi-squared of the fit
Definition: TrackBase.h:587
bool selectTrack(const reco::Track &recotrack_orig)
make a selection on the reco:Track. (dummy for the moment)
bool appendHitPattern(const TrackingRecHit &hit, const TrackerTopology &ttopo)
append a single hit to the HitPattern
Definition: TrackBase.h:510
reco::Track makeTrack(const reco::Track &recotrack_orig, const FreeTrajectoryState &PCAstate)
create a corrected reco::Track from itself and trajectory state (redundant information) ...
const Vector & momentum() const
track momentum vector
Definition: TrackBase.h:664
bool theRescale
select the rescaling or replacing method to correct the error matrix
HLT enums.
const edm::ESGetToken< MagneticField, IdealMagneticFieldRecord > theFieldToken
FreeTrajectoryState initialFreeState(const reco::Track &tk, const MagneticField *field, bool withErr=true)
def move(src, dest)
Definition: eostools.py:511
math::Error< dimension >::type CovarianceMatrix
5 parameter covariance matrix
Definition: TrackBase.h:74
#define LogDebug(id)
const TrackExtraRef & extra() const
reference to "extra" object
Definition: Track.h:139
edm::Ref< TrackingRecHitCollection >::key_type theRHi