File indexing completed on 2023-03-17 11:26:44
0001 #include "TrackPropagation/SteppingHelixPropagator/interface/SteppingHelixPropagator.h"
0002 #include "MagneticField/Engine/interface/MagneticField.h"
0003 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
0004 #include "MagneticField/VolumeBasedEngine/interface/VolumeBasedMagneticField.h"
0005
0006 #include "FWCore/Framework/interface/EventSetup.h"
0007 #include "FWCore/Framework/interface/ESHandle.h"
0008 #include "FWCore/Framework/interface/ModuleFactory.h"
0009 #include "FWCore/Framework/interface/ESProducer.h"
0010
0011 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0012
0013 #include <string>
0014 #include <memory>
0015
0016 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0017 #include "TrackingTools/Records/interface/TrackingComponentsRecord.h"
0018
0019 class SteppingHelixPropagatorESProducer : public edm::ESProducer {
0020 public:
0021 SteppingHelixPropagatorESProducer(const edm::ParameterSet& p);
0022 ~SteppingHelixPropagatorESProducer() override;
0023 std::unique_ptr<Propagator> produce(const TrackingComponentsRecord&);
0024
0025 private:
0026 const edm::ParameterSet pset_;
0027 edm::ESGetToken<MagneticField, IdealMagneticFieldRecord> magToken_;
0028 edm::ESGetToken<MagneticField, IdealMagneticFieldRecord> vbMagToken_;
0029 const bool setVBFPointer_;
0030 };
0031
0032 using namespace edm;
0033
0034 SteppingHelixPropagatorESProducer::SteppingHelixPropagatorESProducer(const edm::ParameterSet& p)
0035 : pset_{p}, setVBFPointer_{pset_.getParameter<bool>("SetVBFPointer")} {
0036 std::string myname = p.getParameter<std::string>("ComponentName");
0037 auto c = setWhatProduced(this, myname);
0038 magToken_ = c.consumes();
0039 if (setVBFPointer_) {
0040 vbMagToken_ = c.consumes(edm::ESInputTag("", pset_.getParameter<std::string>("VBFName")));
0041 }
0042 }
0043
0044 SteppingHelixPropagatorESProducer::~SteppingHelixPropagatorESProducer() {}
0045
0046 std::unique_ptr<Propagator> SteppingHelixPropagatorESProducer::produce(const TrackingComponentsRecord& iRecord) {
0047
0048
0049
0050
0051 auto const& magfield = iRecord.get(magToken_);
0052
0053 std::string pdir = pset_.getParameter<std::string>("PropagationDirection");
0054
0055 PropagationDirection dir = alongMomentum;
0056
0057 if (pdir == "oppositeToMomentum")
0058 dir = oppositeToMomentum;
0059 if (pdir == "alongMomentum")
0060 dir = alongMomentum;
0061 if (pdir == "anyDirection")
0062 dir = anyDirection;
0063
0064 std::unique_ptr<SteppingHelixPropagator> shProp;
0065 shProp = std::make_unique<SteppingHelixPropagator>(&magfield, dir);
0066
0067 bool useInTeslaFromMagField = pset_.getParameter<bool>("useInTeslaFromMagField");
0068 bool useMagVolumes = pset_.getParameter<bool>("useMagVolumes");
0069
0070
0071
0072 if (useMagVolumes == true && !useInTeslaFromMagField && !setVBFPointer_ && magfield.nominalValue() == 0) {
0073 const VolumeBasedMagneticField* vbfCPtr = dynamic_cast<const VolumeBasedMagneticField*>(&magfield);
0074 if (vbfCPtr == nullptr) {
0075 edm::LogWarning("SteppingHelixPropagator")
0076 << "Config specifies useMagVolumes==True but no VBF field available: SHP has no access to yoke material "
0077 "properties. Use setVBFPointer=true and VBFName cards to set a VBF field, otherwise set "
0078 "useMagVolumes==False."
0079 << std::endl;
0080 } else {
0081 edm::LogInfo("SteppingHelixPropagator")
0082 << "Config specifies useMagVolumes==true and VBF field available: Forcing useInTeslaFromMagField = True."
0083 << std::endl;
0084 useInTeslaFromMagField = true;
0085 }
0086 }
0087
0088 if (setVBFPointer_) {
0089 auto const& vbfField = iRecord.get(vbMagToken_);
0090 const VolumeBasedMagneticField* vbfCPtr = dynamic_cast<const VolumeBasedMagneticField*>(&vbfField);
0091 shProp->setVBFPointer(vbfCPtr);
0092 }
0093
0094 shProp->setUseInTeslaFromMagField(useInTeslaFromMagField);
0095
0096 bool haveX0Corr = pset_.getParameter<bool>("ApplyRadX0Correction");
0097 shProp->applyRadX0Correction(haveX0Corr);
0098
0099 bool assumeNoMaterial = pset_.getParameter<bool>("AssumeNoMaterial");
0100 shProp->setMaterialMode(assumeNoMaterial);
0101
0102 bool noErrorPropagation = pset_.getParameter<bool>("NoErrorPropagation");
0103 shProp->setNoErrorPropagation(noErrorPropagation);
0104
0105 bool debugMode = pset_.getParameter<bool>("debug");
0106 shProp->setDebug(debugMode);
0107
0108 shProp->setUseMagVolumes(useMagVolumes);
0109
0110 bool useMatVolumes = pset_.getParameter<bool>("useMatVolumes");
0111 shProp->setUseMatVolumes(useMatVolumes);
0112
0113 bool useIsYokeFlag = pset_.getParameter<bool>("useIsYokeFlag");
0114 shProp->setUseIsYokeFlag(useIsYokeFlag);
0115
0116 bool returnTangentPlane = pset_.getParameter<bool>("returnTangentPlane");
0117 shProp->setReturnTangentPlane(returnTangentPlane);
0118
0119 bool sendLogWarning = pset_.getParameter<bool>("sendLogWarning");
0120 shProp->setSendLogWarning(sendLogWarning);
0121
0122 bool useTuningForL2Speed = pset_.getParameter<bool>("useTuningForL2Speed");
0123 shProp->setUseTuningForL2Speed(useTuningForL2Speed);
0124
0125 bool useECoffsets = pset_.getParameter<bool>("useEndcapShiftsInZ");
0126 if (useECoffsets) {
0127 double valPos = pset_.getParameter<double>("endcapShiftInZPos");
0128 double valNeg = pset_.getParameter<double>("endcapShiftInZNeg");
0129 shProp->setEndcapShiftsInZPosNeg(valPos, valNeg);
0130 }
0131
0132 return shProp;
0133 }
0134
0135 #include "FWCore/Utilities/interface/typelookup.h"
0136
0137 DEFINE_FWK_EVENTSETUP_MODULE(SteppingHelixPropagatorESProducer);