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