Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:31:01

0001 #include "DataFormats/GeometryVector/interface/GlobalPoint.h"
0002 #include "DataFormats/GeometryVector/interface/GlobalVector.h"
0003 #include "FWCore/Framework/interface/Event.h"
0004 #include "MagneticField/Engine/interface/MagneticField.h"
0005 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
0006 #include "SimTracker/TrackAssociation/interface/ParametersDefinerForTP.h"
0007 #include "TrackingTools/PatternTools/interface/TSCBLBuilderNoMaterial.h"
0008 #include "TrackingTools/PatternTools/interface/TSCPBuilderNoMaterial.h"
0009 #include "TrackingTools/TrajectoryState/interface/FreeTrajectoryState.h"
0010 class TrajectoryStateClosestToBeamLineBuilder;
0011 
0012 ParametersDefinerForTP::ParametersDefinerForTP(const edm::InputTag &beamspot, edm::ConsumesCollector iC)
0013     : bsToken_(iC.consumes(beamspot)), mfToken_(iC.esConsumes()) {}
0014 
0015 ParametersDefinerForTP::~ParametersDefinerForTP() = default;
0016 
0017 TrackingParticle::Vector ParametersDefinerForTP::momentum(const edm::Event &iEvent,
0018                                                           const edm::EventSetup &iSetup,
0019                                                           const Charge charge,
0020                                                           const Point &vtx,
0021                                                           const LorentzVector &lv) const {
0022   // to add a new implementation for cosmic. For the moment, it is just as for
0023   // the base class:
0024 
0025   using namespace edm;
0026 
0027   auto const &bs = iEvent.get(bsToken_);
0028   auto const &mf = iSetup.getData(mfToken_);
0029 
0030   TrackingParticle::Vector momentum(0, 0, 0);
0031 
0032   FreeTrajectoryState ftsAtProduction(
0033       GlobalPoint(vtx.x(), vtx.y(), vtx.z()), GlobalVector(lv.x(), lv.y(), lv.z()), TrackCharge(charge), &mf);
0034 
0035   TSCBLBuilderNoMaterial tscblBuilder;
0036   TrajectoryStateClosestToBeamLine tsAtClosestApproach =
0037       tscblBuilder(ftsAtProduction, bs);  // as in TrackProducerAlgorithm
0038   if (tsAtClosestApproach.isValid()) {
0039     GlobalVector p = tsAtClosestApproach.trackStateAtPCA().momentum();
0040     momentum = TrackingParticle::Vector(p.x(), p.y(), p.z());
0041   }
0042   return momentum;
0043 }
0044 
0045 TrackingParticle::Point ParametersDefinerForTP::vertex(const edm::Event &iEvent,
0046                                                        const edm::EventSetup &iSetup,
0047                                                        const Charge charge,
0048                                                        const Point &vtx,
0049                                                        const LorentzVector &lv) const {
0050   // to add a new implementation for cosmic. For the moment, it is just as for
0051   // the base class:
0052   using namespace edm;
0053 
0054   auto const &bs = iEvent.get(bsToken_);
0055   auto const &mf = iSetup.getData(mfToken_);
0056 
0057   TrackingParticle::Point vertex(0, 0, 0);
0058 
0059   FreeTrajectoryState ftsAtProduction(
0060       GlobalPoint(vtx.x(), vtx.y(), vtx.z()), GlobalVector(lv.x(), lv.y(), lv.z()), TrackCharge(charge), &mf);
0061 
0062   TSCBLBuilderNoMaterial tscblBuilder;
0063   TrajectoryStateClosestToBeamLine tsAtClosestApproach =
0064       tscblBuilder(ftsAtProduction, bs);  // as in TrackProducerAlgorithm
0065   if (tsAtClosestApproach.isValid()) {
0066     GlobalPoint v = tsAtClosestApproach.trackStateAtPCA().position();
0067     vertex = TrackingParticle::Point(v.x(), v.y(), v.z());
0068   } else {
0069     // to preserve old behaviour
0070     // would be better to flag this somehow to allow ignoring in downstream
0071     vertex = TrackingParticle::Point(bs.x0(), bs.y0(), bs.z0());
0072   }
0073   return vertex;
0074 }
0075 
0076 std::tuple<TrackingParticle::Vector, TrackingParticle::Point> ParametersDefinerForTP::momentumAndVertex(
0077     const edm::Event &iEvent,
0078     const edm::EventSetup &iSetup,
0079     const Charge charge,
0080     const Point &vtx,
0081     const LorentzVector &lv) const {
0082   using namespace edm;
0083 
0084   auto const &bs = iEvent.get(bsToken_);
0085   auto const &mf = iSetup.getData(mfToken_);
0086 
0087   TrackingParticle::Point vertex(bs.x0(), bs.y0(), bs.z0());
0088   TrackingParticle::Vector momentum(0, 0, 0);
0089 
0090   FreeTrajectoryState ftsAtProduction(
0091       GlobalPoint(vtx.x(), vtx.y(), vtx.z()), GlobalVector(lv.x(), lv.y(), lv.z()), TrackCharge(charge), &mf);
0092 
0093   TSCBLBuilderNoMaterial tscblBuilder;
0094   TrajectoryStateClosestToBeamLine tsAtClosestApproach =
0095       tscblBuilder(ftsAtProduction, bs);  // as in TrackProducerAlgorithm
0096   if (tsAtClosestApproach.isValid()) {
0097     GlobalPoint v = tsAtClosestApproach.trackStateAtPCA().position();
0098     vertex = TrackingParticle::Point(v.x(), v.y(), v.z());
0099     GlobalVector p = tsAtClosestApproach.trackStateAtPCA().momentum();
0100     momentum = TrackingParticle::Vector(p.x(), p.y(), p.z());
0101     ;
0102   }
0103 
0104   return std::make_tuple(momentum, vertex);
0105 }