File indexing completed on 2023-10-25 09:32:25
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021 #include <memory>
0022
0023
0024 #include "FWCore/Framework/interface/Frameworkfwd.h"
0025 #include "FWCore/Framework/interface/one/EDProducer.h"
0026 #include "FWCore/Framework/interface/Event.h"
0027 #include "FWCore/Framework/interface/EventSetup.h"
0028 #include "FWCore/Framework/interface/ESHandle.h"
0029 #include "FWCore/Framework/interface/MakerMacros.h"
0030 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0031 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0032
0033
0034 #include "DataFormats/TrackReco/interface/Track.h"
0035 #include "DataFormats/TrackReco/interface/TrackFwd.h"
0036 #include "Geometry/CSCGeometry/interface/CSCGeometry.h"
0037 #include "DataFormats/MuonDetId/interface/MuonSubdetId.h"
0038 #include "DataFormats/MuonDetId/interface/CSCDetId.h"
0039 #include "Geometry/Records/interface/MuonGeometryRecord.h"
0040 #include "MagneticField/Engine/interface/MagneticField.h"
0041 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
0042 #include "DataFormats/TrackingRecHit/interface/TrackingRecHitFwd.h"
0043 #include "DataFormats/TrackingRecHit/interface/TrackingRecHit.h"
0044 #include "RecoMuon/TransientTrackingRecHit/interface/MuonTransientTrackingRecHitBuilder.h"
0045 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateTransform.h"
0046 #include "Geometry/CommonDetUnit/interface/GlobalTrackingGeometry.h"
0047 #include "Geometry/Records/interface/GlobalTrackingGeometryRecord.h"
0048 #include "CondFormats/Alignment/interface/Definitions.h"
0049 #include "DataFormats/GeometrySurface/interface/Surface.h"
0050
0051 #include "FWCore/ServiceRegistry/interface/Service.h"
0052 #include "CommonTools/UtilAlgos/interface/TFileService.h"
0053 #include "TTree.h"
0054
0055
0056 #include "TrackingTools/PatternTools/interface/Trajectory.h"
0057 #include "TrackingTools/PatternTools/interface/TrajTrackAssociation.h"
0058
0059
0060
0061
0062
0063 class CSCOverlapsTrackPreparation : public edm::one::EDProducer<> {
0064 public:
0065 explicit CSCOverlapsTrackPreparation(const edm::ParameterSet&);
0066 ~CSCOverlapsTrackPreparation() override = default;
0067 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0068
0069 private:
0070 enum { kNothing, kSimpleFit, kAllButOne, kExtrapolate };
0071
0072 void beginJob() override;
0073 void produce(edm::Event&, const edm::EventSetup&) override;
0074 void endJob() override;
0075
0076
0077 const edm::InputTag m_src;
0078
0079 const edm::ESGetToken<CSCGeometry, MuonGeometryRecord> cscGeomToken_;
0080 const edm::ESGetToken<MagneticField, IdealMagneticFieldRecord> magneticFieldToken_;
0081 const edm::ESGetToken<GlobalTrackingGeometry, GlobalTrackingGeometryRecord> globalGeomToken_;
0082 const edm::EDGetTokenT<reco::TrackCollection> trackToken_;
0083 };
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096 CSCOverlapsTrackPreparation::CSCOverlapsTrackPreparation(const edm::ParameterSet& iConfig)
0097 : m_src(iConfig.getParameter<edm::InputTag>("src")),
0098 cscGeomToken_(esConsumes<edm::Transition::BeginRun>()),
0099 magneticFieldToken_(esConsumes<edm::Transition::BeginRun>()),
0100 globalGeomToken_(esConsumes<edm::Transition::BeginRun>()),
0101 trackToken_(consumes<reco::TrackCollection>(m_src)) {
0102 produces<std::vector<Trajectory>>();
0103 produces<TrajTrackAssociationCollection>();
0104 }
0105
0106
0107
0108
0109 void CSCOverlapsTrackPreparation::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0110 edm::ParameterSetDescription desc;
0111 desc.add<edm::InputTag>("src", edm::InputTag("ALCARECOMuAlBeamHaloOverlaps"));
0112 descriptions.add("cscOverlapsTrackPreparation", desc);
0113 }
0114
0115
0116 void CSCOverlapsTrackPreparation::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
0117 const edm::Handle<reco::TrackCollection>& tracks = iEvent.getHandle(trackToken_);
0118
0119 const CSCGeometry* cscGeometry = &iSetup.getData(cscGeomToken_);
0120 const MagneticField* magneticField = &iSetup.getData(magneticFieldToken_);
0121 const GlobalTrackingGeometry* globalGeometry = &iSetup.getData(globalGeomToken_);
0122
0123 MuonTransientTrackingRecHitBuilder muonTransBuilder;
0124
0125
0126 auto trajectoryCollection = std::make_unique<std::vector<Trajectory>>();
0127
0128
0129 std::map<edm::Ref<std::vector<Trajectory>>::key_type, edm::Ref<reco::TrackCollection>::key_type> reference_map;
0130 edm::Ref<std::vector<Trajectory>>::key_type trajCounter = 0;
0131 edm::Ref<reco::TrackCollection>::key_type trackCounter = 0;
0132
0133 for (reco::TrackCollection::const_iterator track = tracks->begin(); track != tracks->end(); ++track) {
0134 trackCounter++;
0135
0136
0137
0138 edm::OwnVector<TrackingRecHit> clonedHits;
0139 std::vector<TrajectoryMeasurement::ConstRecHitPointer> transHits;
0140 std::vector<TrajectoryStateOnSurface> TSOSes;
0141
0142 for (auto const& hit : track->recHits()) {
0143 DetId id = hit->geographicalId();
0144 if (id.det() == DetId::Muon && id.subdetId() == MuonSubdetId::CSC) {
0145 const Surface& layerSurface = cscGeometry->idToDet(id)->surface();
0146 TrajectoryMeasurement::ConstRecHitPointer hitPtr(muonTransBuilder.build(hit, globalGeometry));
0147
0148 AlgebraicVector5 params;
0149 params[0] = 1.;
0150 params[1] = 0.;
0151 params[2] = 0.;
0152 params[3] = 0.;
0153 params[4] = 0.;
0154 LocalTrajectoryParameters localTrajectoryParameters(params, 1., false);
0155 LocalTrajectoryError localTrajectoryError(0.001, 0.001, 0.001, 0.001, 0.001);
0156
0157
0158 clonedHits.push_back(hit->clone());
0159 transHits.push_back(hitPtr);
0160 TSOSes.push_back(
0161 TrajectoryStateOnSurface(localTrajectoryParameters, localTrajectoryError, layerSurface, &*magneticField));
0162 }
0163 }
0164
0165 assert(clonedHits.size() == transHits.size());
0166 assert(transHits.size() == TSOSes.size());
0167
0168
0169 if (!clonedHits.empty()) {
0170 PTrajectoryStateOnDet const PTraj =
0171 trajectoryStateTransform::persistentState(*(TSOSes.begin()), clonedHits.begin()->geographicalId().rawId());
0172 TrajectorySeed trajectorySeed(PTraj, clonedHits, alongMomentum);
0173 Trajectory trajectory(trajectorySeed, alongMomentum);
0174
0175 edm::OwnVector<TrackingRecHit>::const_iterator clonedHit = clonedHits.begin();
0176 std::vector<TrajectoryMeasurement::ConstRecHitPointer>::const_iterator transHitPtr = transHits.begin();
0177 std::vector<TrajectoryStateOnSurface>::const_iterator TSOS = TSOSes.begin();
0178 for (; clonedHit != clonedHits.end(); ++clonedHit, ++transHitPtr, ++TSOS) {
0179 trajectory.push(TrajectoryMeasurement(*TSOS, *TSOS, *TSOS, (*transHitPtr)));
0180 }
0181
0182 trajectoryCollection->push_back(trajectory);
0183
0184
0185 trajCounter++;
0186 reference_map[trajCounter] = trackCounter;
0187
0188 }
0189 }
0190
0191 unsigned int numTrajectories = trajectoryCollection->size();
0192
0193
0194 edm::OrphanHandle<std::vector<Trajectory>> ohTrajs = iEvent.put(std::move(trajectoryCollection));
0195
0196
0197 auto trajTrackMap = std::make_unique<TrajTrackAssociationCollection>();
0198
0199 for (trajCounter = 0; trajCounter < numTrajectories; trajCounter++) {
0200 edm::Ref<reco::TrackCollection>::key_type trackCounter = reference_map[trajCounter];
0201
0202 trajTrackMap->insert(edm::Ref<std::vector<Trajectory>>(ohTrajs, trajCounter),
0203 edm::Ref<reco::TrackCollection>(tracks, trackCounter));
0204 }
0205
0206 iEvent.put(std::move(trajTrackMap));
0207 }
0208
0209
0210 void CSCOverlapsTrackPreparation::beginJob() {}
0211
0212
0213 void CSCOverlapsTrackPreparation::endJob() {}
0214
0215
0216 DEFINE_FWK_MODULE(CSCOverlapsTrackPreparation);