CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups 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  theCategory = "MuonErrorMatrixAdjuster";
21  theInstanceName = iConfig.getParameter<std::string>("instanceName");
22  //register your products
23  produces<reco::TrackCollection>(theInstanceName);
24  produces<TrackingRecHitCollection>();
25  produces<reco::TrackExtraCollection>();
26 
27  theTrackLabel = iConfig.getParameter<edm::InputTag>("trackLabel");
28  theRescale = iConfig.getParameter<bool>("rescale");
29 
30  theMatrixProvider_pset = iConfig.getParameter<edm::ParameterSet>("errorMatrix_pset");
31 }
32 
34  // do anything here that needs to be done at desctruction time
35  // (e.g. close files, deallocate resources etc.)
36 }
37 
38 //
39 // member functions
40 //
41 
42 //take the error matrix and rescale it or just replace it
44  const reco::TrackBase::CovarianceMatrix& error_matrix, const GlobalVector& momentum) {
45  //CovarianceMatrix is template for SMatrix
46  reco::TrackBase::CovarianceMatrix revised_matrix(theMatrixProvider->get(momentum));
47 
48  if (theRescale) {
49  //rescale old error matrix up by a factor
50  multiply(revised_matrix, error_matrix);
51  }
52  return revised_matrix;
53 }
54 
56  const reco::TrackBase::CovarianceMatrix& scale_matrix) {
57  //scale term by term the matrix
58  // 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
59  // need to loop only on i:0-5, j:i-5
60  for (int i = 0; i != 5; i++) {
61  for (int j = i; j != 5; j++) {
62  revised_matrix(i, j) *= scale_matrix(i, j);
63  }
64  }
65 }
67  const reco::TrackBase::CovarianceMatrix& denom_matrix) {
68  //divide term by term the matrix
69  // 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
70  // need to loop only on i:0-5, j:i-5
71  for (int i = 0; i != 5; i++) {
72  for (int j = i; j != 5; j++) {
73  if (denom_matrix(i, j) == 0)
74  return false;
75  num_matrix(i, j) /= denom_matrix(i, j);
76  }
77  }
78  return true;
79 }
80 
82  //get the parameters of the track so I can reconstruct it
83  double chi2 = recotrack_orig.chi2();
84  double ndof = recotrack_orig.ndof();
85  const math::XYZPoint& refpos = recotrack_orig.referencePoint();
86  const math::XYZVector& mom = recotrack_orig.momentum();
87  int charge = recotrack_orig.charge();
88 
89  reco::TrackBase::CovarianceMatrix covariance_matrix =
90  fix_cov_matrix(recotrack_orig.covariance(), PCAstate.momentum());
91 
92  LogDebug(theCategory) << "chi2: " << chi2 << "\n ndof: " << ndof << "\n refpos: " << refpos << "\n mom: " << mom
93  << "\n charge: " << charge << "\n covariance:\n"
94  << recotrack_orig.covariance() << "\n replaced by:\n"
95  << covariance_matrix;
96 
97  return reco::Track(chi2, ndof, refpos, mom, charge, covariance_matrix);
98 }
99 
103  //get the 5x5 matrix of recotrack/recotrack_orig
104  reco::TrackBase::CovarianceMatrix scale_matrix(recotrack.covariance());
105  if (!divide(scale_matrix, recotrack_orig.covariance())) {
106  edm::LogError(theCategory) << "original track error matrix has term ==0... skipping.";
107  return nullptr;
108  }
109 
110  const reco::TrackExtraRef& trackExtra_orig = recotrack_orig.extra();
111  if (trackExtra_orig.isNull()) {
112  edm::LogError(theCategory) << "original track has no track extra... skipping.";
113  return nullptr;
114  }
115 
116  //copy the outer state. rescaling the error matrix
117  reco::TrackBase::CovarianceMatrix outerCov(trackExtra_orig->outerStateCovariance());
118  multiply(outerCov, scale_matrix);
119 
120  //copy the inner state, rescaling the error matrix
121  reco::TrackBase::CovarianceMatrix innerCov(trackExtra_orig->innerStateCovariance());
122  multiply(innerCov, scale_matrix);
123 
124  //put the trackExtra
125  TEcol.push_back(reco::TrackExtra(trackExtra_orig->outerPosition(),
126  trackExtra_orig->outerMomentum(),
127  true,
128  trackExtra_orig->innerPosition(),
129  trackExtra_orig->innerMomentum(),
130  true,
131  outerCov,
132  trackExtra_orig->outerDetId(),
133  innerCov,
134  trackExtra_orig->innerDetId(),
135  trackExtra_orig->seedDirection()));
136 
137  //add a reference to the trackextra on the track
139 
140  //return the reference to the last inserted then
141  return &(TEcol.back());
142 }
143 
146  reco::TrackExtra& trackextra,
148  const TrackerTopology& ttopo) {
149  //loop over the hits of the original track
150  trackingRecHit_iterator recHit = recotrack_orig.recHitsBegin();
151  auto const firstHitIndex = theRHi;
152  for (; recHit != recotrack_orig.recHitsEnd(); ++recHit) {
153  //clone it. this is meandatory
154  TrackingRecHit* hit = (*recHit)->clone();
155 
156  //put it on the new track
157  recotrack.appendHitPattern(*hit, ttopo);
158  //copy them in the new collection
159  RHcol.push_back(hit);
160  ++theRHi;
161 
162  } //loop over original rechits
163  //do something with the trackextra
164  trackextra.setHits(theRefprodRH, firstHitIndex, theRHi - firstHitIndex);
165 
166  return true; //if nothing fails
167 }
168 
169 bool MuonErrorMatrixAdjuster::selectTrack(const reco::Track& recotrack_orig) { return true; }
170 
171 // ------------ method called to produce the data ------------
173  using namespace edm;
174 
175  //open a collection of track
178  LogDebug(theCategory) << "considering: " << tracks->size() << " uncorrected reco::Track from the event.("
179  << theTrackLabel << ")";
180 
181  //get the mag field
182  iSetup.get<IdealMagneticFieldRecord>().get(theField);
183 
185  iSetup.get<TrackerTopologyRcd>().get(httopo);
186  const TrackerTopology& ttopo = *httopo;
187 
188  //prepare the output collection
189  auto Toutput = std::make_unique<reco::TrackCollection>();
190  auto TRHoutput = std::make_unique<TrackingRecHitCollection>();
191  auto TEoutput = std::make_unique<reco::TrackExtraCollection>();
193  theTEi = 0;
195  theRHi = 0;
196 
197  for (unsigned int it = 0; it != tracks->size(); it++) {
198  const reco::Track& recotrack_orig = (*tracks)[it];
200  if (PCAstate.position().mag() == 0) {
201  edm::LogError(theCategory) << "invalid state from track initial state in " << theTrackLabel << ". skipping.";
202  continue;
203  }
204 
205  //create a reco::Track
206  reco::Track recotrack = makeTrack(recotrack_orig, PCAstate);
207 
208  //make a selection on the create reco::Track
209  if (!selectTrack(recotrack))
210  continue;
211 
212  Toutput->push_back(recotrack);
213  reco::Track& recotrackref = Toutput->back();
214 
215  //build the track extra
216  reco::TrackExtra* extra = makeTrackExtra(recotrack_orig, recotrackref, *TEoutput);
217  if (!extra) {
218  edm::LogError(theCategory) << "cannot create the track extra for this track.";
219  //pop the inserted track
220  Toutput->pop_back();
221  continue;
222  }
223 
224  //attach the collection of rechits
225  if (!attachRecHits(recotrack_orig, recotrackref, *extra, *TRHoutput, ttopo)) {
226  edm::LogError(theCategory) << "cannot attach any rechits on this track";
227  //pop the inserted track
228  Toutput->pop_back();
229  //pop the track extra
230  TEoutput->pop_back();
231  theTEi--;
232  continue;
233  }
234 
235  } //loop over the original reco tracks
236 
237  LogDebug(theCategory) << "writing: " << Toutput->size() << " corrected reco::Track to the event.";
238 
239  iEvent.put(std::move(Toutput), theInstanceName);
240  iEvent.put(std::move(TEoutput));
241  iEvent.put(std::move(TRHoutput));
242 }
243 
244 // ------------ method called once each job just before starting event loop ------------
246 
247 // ------------ method called once each job just after ending the event loop ------------
249  if (theMatrixProvider)
250  delete theMatrixProvider;
251 }
void produce(edm::Event &, const edm::EventSetup &) override
const Point & referencePoint() const
Reference point on the track.
Definition: TrackBase.h:667
void beginJob() override
framework method
edm::RefProd< reco::TrackExtraCollection > theRefprodTE
get reference before put track extra to the event, in order to create edm::Ref
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:133
const TrackExtraRef & extra() const
reference to &quot;extra&quot; object
Definition: Track.h:139
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)
CurvilinearTrajectoryError get(GlobalVector momentum, bool convolute=true)
main method to be used. Retrieve a 5x5 symetrical matrix according to parametrization of error or sca...
auto const & tracks
cannot be loose
std::string theInstanceName
instrance name of the created track collecion. rechit and trackextra have no instance name ...
const Vector & momentum() const
track momentum vector
Definition: TrackBase.h:664
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
void push_back(D *&d)
Definition: OwnVector.h:326
MuonErrorMatrix * theMatrixProvider
int iEvent
Definition: GenABIO.cc:224
T mag() const
Definition: PV3DBase.h:64
double chi2() const
chi-squared of the fit
Definition: TrackBase.h:587
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
double ndof() const
number of degrees of freedom of the fit
Definition: TrackBase.h:590
CovarianceMatrix covariance() const
return track covariance matrix
Definition: TrackBase.h:716
~MuonErrorMatrixAdjuster() override
destructor
def move
Definition: eostools.py:511
edm::Ref< reco::TrackExtraCollection >::key_type theTEi
edm::RefProd< TrackingRecHitCollection > theRefprodRH
get reference before put rechit to the event, in order to create edm::Ref
trackingRecHit_iterator recHitsBegin() const
Iterator to first hit on the track.
Definition: Track.h:88
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:500
bool isNull() const
Checks for null.
Definition: Ref.h:235
GlobalVector momentum() const
RefProd< PROD > getRefBeforePut()
Definition: Event.h:158
edm::ParameterSet theMatrixProvider_pset
holds the error matrix parametrization
GlobalPoint position() const
std::vector< TrackExtra > TrackExtraCollection
collection of TrackExtra objects
Definition: TrackExtraFwd.h:10
void setExtra(const TrackExtraRef &ref)
set reference to &quot;extra&quot; object
Definition: Track.h:136
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...
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
T const * product() const
Definition: ESHandle.h:86
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
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) ...
bool theRescale
select the rescaling or replacing method to correct the error matrix
T get() const
Definition: EventSetup.h:82
int charge() const
track electric charge
Definition: TrackBase.h:596
FreeTrajectoryState initialFreeState(const reco::Track &tk, const MagneticField *field, bool withErr=true)
math::Error< dimension >::type CovarianceMatrix
5 parameter covariance matrix
Definition: TrackBase.h:74
#define LogDebug(id)
edm::Ref< TrackingRecHitCollection >::key_type theRHi
trackingRecHit_iterator recHitsEnd() const
Iterator to last hit on the track.
Definition: Track.h:91