Back to home page

Project CMSSW displayed by LXR

 
 

    


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   //   if (_propagator){
0047   //     delete _propagator;
0048   //     _propagator = 0;
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   // if useMagVolumes == true and an alternate VBF field is not specified with setVBFPointer_,
0070   // Force "useInTeslaFromMagField=true" for a B=0 VBF map.
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);