File indexing completed on 2024-04-06 12:22:47
0001 #ifndef MuonAnalysis_MuonAssociators_interface_PropagateToMuonSetup_h
0002 #define MuonAnalysis_MuonAssociators_interface_PropagateToMuonSetup_h
0003
0004
0005
0006
0007
0008
0009
0010 #include "FWCore/Framework/interface/ESHandle.h"
0011 #include "FWCore/Framework/interface/EventSetup.h"
0012 #include "FWCore/Framework/interface/ConsumesCollector.h"
0013 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0014 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0015 #include "FWCore/Utilities/interface/Transition.h"
0016 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
0017 #include "MuonAnalysis/MuonAssociators/interface/PropagateToMuon.h"
0018 #include "MuonAnalysis/MuonAssociators/interface/trackStateEnums.h"
0019 #include "RecoMuon/Records/interface/MuonRecoGeometryRecord.h"
0020 #include "TrackingTools/Records/interface/TrackingComponentsRecord.h"
0021
0022 template <edm::Transition Tr>
0023 class PropagateToMuonSetupT {
0024 public:
0025 explicit PropagateToMuonSetupT(const edm::ParameterSet &iConfig, edm::ConsumesCollector);
0026 ~PropagateToMuonSetupT() = default;
0027
0028
0029
0030 PropagateToMuon init(const edm::EventSetup &iSetup) const;
0031 static void fillPSetDescription(edm::ParameterSetDescription &desc) {
0032 desc.add<bool>("useSimpleGeometry", true);
0033 desc.add<bool>("useStation2", true);
0034 desc.add<bool>("fallbackToME1", false);
0035 desc.add<bool>("cosmicPropagationHypothesis", false);
0036 desc.add<bool>("useMB2InOverlap", false);
0037 desc.add<std::string>("useTrack", "tracker");
0038 desc.add<std::string>("useState", "atVertex");
0039 desc.add<edm::ESInputTag>("propagatorAlong", edm::ESInputTag("", "hltESPSteppingHelixPropagatorAlong"));
0040 desc.add<edm::ESInputTag>("propagatorAny", edm::ESInputTag("", "SteppingHelixPropagatorAny"));
0041 desc.add<edm::ESInputTag>("propagatorOpposite", edm::ESInputTag("", "hltESPSteppingHelixPropagatorOpposite"));
0042 }
0043
0044 private:
0045
0046 const bool useSimpleGeometry_;
0047
0048
0049 const bool useMB2_;
0050
0051
0052 const bool fallbackToME1_;
0053
0054
0055 WhichTrack whichTrack_;
0056 WhichState whichState_;
0057
0058
0059 const bool cosmicPropagation_;
0060
0061 const bool useMB2InOverlap_;
0062
0063 const edm::ESGetToken<MagneticField, IdealMagneticFieldRecord> magfieldToken_;
0064 const edm::ESGetToken<Propagator, TrackingComponentsRecord> propagatorToken_, propagatorAnyToken_,
0065 propagatorOppositeToken_;
0066 const edm::ESGetToken<MuonDetLayerGeometry, MuonRecoGeometryRecord> muonGeometryToken_;
0067 };
0068
0069 template <edm::Transition Tr>
0070 PropagateToMuonSetupT<Tr>::PropagateToMuonSetupT(const edm::ParameterSet &iConfig, edm::ConsumesCollector iC)
0071 : useSimpleGeometry_(iConfig.getParameter<bool>("useSimpleGeometry")),
0072 useMB2_(iConfig.getParameter<bool>("useStation2")),
0073 fallbackToME1_(iConfig.getParameter<bool>("fallbackToME1")),
0074 whichTrack_(None),
0075 whichState_(AtVertex),
0076 cosmicPropagation_(iConfig.getParameter<bool>("cosmicPropagationHypothesis")),
0077 useMB2InOverlap_(iConfig.getParameter<bool>("useMB2InOverlap")),
0078 magfieldToken_(iC.esConsumes<Tr>()),
0079 propagatorToken_(iC.esConsumes<Tr>(iConfig.getParameter<edm::ESInputTag>("propagatorAlong"))),
0080 propagatorAnyToken_(iC.esConsumes<Tr>(iConfig.getParameter<edm::ESInputTag>("propagatorAny"))),
0081 propagatorOppositeToken_(iC.esConsumes<Tr>(iConfig.getParameter<edm::ESInputTag>("propagatorOpposite"))),
0082 muonGeometryToken_(iC.esConsumes<Tr>()) {
0083 std::string whichTrack = iConfig.getParameter<std::string>("useTrack");
0084 if (whichTrack == "none") {
0085 whichTrack_ = None;
0086 } else if (whichTrack == "tracker") {
0087 whichTrack_ = TrackerTk;
0088 } else if (whichTrack == "muon") {
0089 whichTrack_ = MuonTk;
0090 } else if (whichTrack == "global") {
0091 whichTrack_ = GlobalTk;
0092 } else
0093 throw cms::Exception("Configuration") << "Parameter 'useTrack' must be 'none', 'tracker', 'muon', 'global'\n";
0094 if (whichTrack_ != None) {
0095 std::string whichState = iConfig.getParameter<std::string>("useState");
0096 if (whichState == "atVertex") {
0097 whichState_ = AtVertex;
0098 } else if (whichState == "innermost") {
0099 whichState_ = Innermost;
0100 } else if (whichState == "outermost") {
0101 whichState_ = Outermost;
0102 } else
0103 throw cms::Exception("Configuration") << "Parameter 'useState' must be 'atVertex', 'innermost', "
0104 "'outermost'\n";
0105 }
0106 if (cosmicPropagation_ && (whichTrack_ == None || whichState_ == AtVertex)) {
0107 throw cms::Exception("Configuration") << "When using 'cosmicPropagationHypothesis' useTrack must not be "
0108 "'none', and the state must not be 'atVertex'\n";
0109 }
0110 }
0111
0112 template <edm::Transition Tr>
0113 PropagateToMuon PropagateToMuonSetupT<Tr>::init(const edm::EventSetup &iSetup) const {
0114 auto const magfield = iSetup.getHandle(magfieldToken_);
0115 auto const propagator = iSetup.getHandle(propagatorToken_);
0116 auto const propagatorOpposite = iSetup.getHandle(propagatorOppositeToken_);
0117 auto const propagatorAny = iSetup.getHandle(propagatorAnyToken_);
0118 auto const muonGeometry = iSetup.getHandle(muonGeometryToken_);
0119
0120 return PropagateToMuon(magfield,
0121 propagator,
0122 propagatorAny,
0123 propagatorOpposite,
0124 muonGeometry,
0125 useSimpleGeometry_,
0126 useMB2_,
0127 fallbackToME1_,
0128 whichTrack_,
0129 whichState_,
0130 cosmicPropagation_,
0131 useMB2InOverlap_);
0132 }
0133
0134 using PropagateToMuonSetup = PropagateToMuonSetupT<edm::Transition::Event>;
0135
0136 #endif