File indexing completed on 2024-04-06 12:22:29
0001
0002
0003
0004
0005
0006
0007 #include "FWCore/Framework/interface/ESTransientHandle.h"
0008 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0009 #include "FWCore/Framework/interface/EventSetupRecordIntervalFinder.h"
0010 #include "FWCore/Framework/interface/ESProducer.h"
0011 #include "FWCore/Framework/interface/ModuleFactory.h"
0012
0013 #include "MagneticField/VolumeBasedEngine/interface/VolumeBasedMagneticField.h"
0014 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
0015 #include "MagneticField/Engine/interface/MagneticField.h"
0016
0017 #include "DetectorDescription/Core/interface/DDCompactView.h"
0018 #include "MagneticField/GeomBuilder/src/MagGeoBuilderFromDDD.h"
0019 #include "CondFormats/MFObjects/interface/MagFieldConfig.h"
0020
0021 #include <string>
0022 #include <vector>
0023 #include <iostream>
0024
0025 namespace magneticfield {
0026 class VolumeBasedMagneticFieldESProducer : public edm::ESProducer {
0027 public:
0028 VolumeBasedMagneticFieldESProducer(const edm::ParameterSet& iConfig);
0029
0030 std::unique_ptr<MagneticField> produce(const IdealMagneticFieldRecord& iRecord);
0031
0032
0033 VolumeBasedMagneticFieldESProducer(const VolumeBasedMagneticFieldESProducer&) = delete;
0034 const VolumeBasedMagneticFieldESProducer& operator=(const VolumeBasedMagneticFieldESProducer&) = delete;
0035
0036 private:
0037 const bool debug_;
0038 const bool useParametrizedTrackerField_;
0039 const MagFieldConfig conf_;
0040 const std::string version_;
0041 edm::ESGetToken<DDCompactView, IdealMagneticFieldRecord> cpvToken_;
0042 edm::ESGetToken<MagneticField, IdealMagneticFieldRecord> paramFieldToken_;
0043 };
0044 }
0045
0046 using namespace std;
0047 using namespace magneticfield;
0048
0049 VolumeBasedMagneticFieldESProducer::VolumeBasedMagneticFieldESProducer(const edm::ParameterSet& iConfig)
0050 : debug_{iConfig.getUntrackedParameter<bool>("debugBuilder", false)},
0051 useParametrizedTrackerField_{iConfig.getParameter<bool>("useParametrizedTrackerField")},
0052 conf_{iConfig, debug_},
0053 version_{iConfig.getParameter<std::string>("version")} {
0054 auto cc = setWhatProduced(this, iConfig.getUntrackedParameter<std::string>("label", ""));
0055 cpvToken_ = cc.consumes(edm::ESInputTag{"", "magfield"});
0056 if (useParametrizedTrackerField_) {
0057 paramFieldToken_ = cc.consumes(edm::ESInputTag{"", iConfig.getParameter<string>("paramLabel")});
0058 }
0059 }
0060
0061
0062 std::unique_ptr<MagneticField> VolumeBasedMagneticFieldESProducer::produce(const IdealMagneticFieldRecord& iRecord) {
0063 LogTrace("MagGeoBuilder") << "VolumeBasedMagneticFieldESProducer::produce() " << version_;
0064
0065 auto cpv = iRecord.getTransientHandle(cpvToken_);
0066 MagGeoBuilderFromDDD builder(conf_.version, conf_.geometryVersion, debug_);
0067
0068
0069 if (!conf_.keys.empty()) {
0070 builder.setScaling(conf_.keys, conf_.values);
0071 }
0072
0073
0074 if (!conf_.gridFiles.empty()) {
0075 builder.setGridFiles(conf_.gridFiles);
0076 }
0077
0078 builder.build(*cpv);
0079
0080
0081 const MagneticField* paramField = nullptr;
0082 if (useParametrizedTrackerField_) {
0083 paramField = &iRecord.get(paramFieldToken_);
0084 }
0085 return std::make_unique<VolumeBasedMagneticField>(conf_.geometryVersion,
0086 builder.barrelLayers(),
0087 builder.endcapSectors(),
0088 builder.barrelVolumes(),
0089 builder.endcapVolumes(),
0090 builder.maxR(),
0091 builder.maxZ(),
0092 paramField,
0093 false);
0094 }
0095
0096 DEFINE_FWK_EVENTSETUP_MODULE(VolumeBasedMagneticFieldESProducer);