File indexing completed on 2024-04-06 12:05:29
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019 #include <memory>
0020
0021 #include "FWCore/Framework/interface/EventSetupRecordIntervalFinder.h"
0022 #include "FWCore/Framework/interface/SourceFactory.h"
0023 #include "FWCore/Framework/interface/ESProducer.h"
0024 #include "FWCore/Framework/interface/ESHandle.h"
0025 #include "FWCore/Concurrency/interface/SharedResourceNames.h"
0026 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0027 #include "CondFormats/Common/interface/FileBlob.h"
0028 #include "CondFormats/DataRecord/interface/MFGeometryFileRcd.h"
0029
0030 #include "Geometry/Records/interface/IdealGeometryRecord.h"
0031 #include "Geometry/Records/interface/GeometryFileRcd.h"
0032 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
0033 #include "DetectorDescription/DDCMS/interface/DDDetector.h"
0034 #include "DD4hep/Detector.h"
0035
0036 using namespace std;
0037 using namespace cms;
0038 using namespace edm;
0039
0040 class DDDetectorESProducer : public ESProducer, public EventSetupRecordIntervalFinder {
0041 public:
0042 DDDetectorESProducer(const ParameterSet&);
0043 ~DDDetectorESProducer() override;
0044
0045 using ReturnType = unique_ptr<DDDetector>;
0046 using Detector = dd4hep::Detector;
0047
0048 ReturnType produceGeom(const IdealGeometryRecord&);
0049 ReturnType produceMagField(const IdealMagneticFieldRecord&);
0050 ReturnType produce();
0051 static void fillDescriptions(ConfigurationDescriptions&);
0052
0053 protected:
0054 void setIntervalFor(const eventsetup::EventSetupRecordKey&, const IOVSyncValue&, ValidityInterval&) override;
0055
0056 private:
0057 const bool fromDB_;
0058 const string appendToDataLabel_;
0059 const string confGeomXMLFiles_;
0060 const string rootDDName_;
0061 const string label_;
0062 edm::ESGetToken<FileBlob, MFGeometryFileRcd> mfToken_;
0063 edm::ESGetToken<FileBlob, GeometryFileRcd> geomToken_;
0064 };
0065
0066 DDDetectorESProducer::DDDetectorESProducer(const ParameterSet& iConfig)
0067 : fromDB_(iConfig.getParameter<bool>("fromDB")),
0068 appendToDataLabel_(iConfig.getParameter<string>("appendToDataLabel")),
0069 confGeomXMLFiles_(fromDB_ ? "none" : iConfig.getParameter<FileInPath>("confGeomXMLFiles").fullPath()),
0070 rootDDName_(iConfig.getParameter<string>("rootDDName")),
0071 label_(iConfig.getParameter<string>("label")) {
0072 usesResources({edm::ESSharedResourceNames::kDD4hep});
0073 edm::LogVerbatim("Geometry") << "DDDetectorESProducer::fromDB " << fromDB_ << " appendToDataLabel "
0074 << appendToDataLabel_ << " rootDDName " << rootDDName_ << " label " << label_
0075 << " confGeomXMLFiles " << confGeomXMLFiles_;
0076 if (rootDDName_ == "MagneticFieldVolumes:MAGF" || rootDDName_ == "cmsMagneticField:MAGF") {
0077 auto c = setWhatProduced(this,
0078 &DDDetectorESProducer::produceMagField,
0079 edm::es::Label(iConfig.getParameter<std::string>("@module_label")));
0080 if (fromDB_) {
0081 mfToken_ = c.consumes(edm::ESInputTag("", label_));
0082 }
0083 findingRecord<IdealMagneticFieldRecord>();
0084 } else {
0085 auto c = setWhatProduced(this, &DDDetectorESProducer::produceGeom);
0086 if (fromDB_) {
0087 geomToken_ = c.consumes(edm::ESInputTag("", label_));
0088 }
0089 findingRecord<IdealGeometryRecord>();
0090 }
0091 }
0092
0093 DDDetectorESProducer::~DDDetectorESProducer() {}
0094
0095 void DDDetectorESProducer::fillDescriptions(ConfigurationDescriptions& descriptions) {
0096 ParameterSetDescription desc;
0097
0098 desc.addOptional<FileInPath>("confGeomXMLFiles");
0099 desc.add<string>("rootDDName", "cms:OCMS");
0100 desc.add<string>("label", "");
0101 desc.add<bool>("fromDB", false);
0102 descriptions.add("DDDetectorESProducer", desc);
0103
0104 edm::ParameterSetDescription descDB;
0105 descDB.add<string>("rootDDName", "cms:OCMS");
0106 descDB.add<string>("label", "Extended");
0107 descDB.add<bool>("fromDB", true);
0108 descriptions.add("DDDetectorESProducerFromDB", descDB);
0109 }
0110
0111 void DDDetectorESProducer::setIntervalFor(const eventsetup::EventSetupRecordKey& iKey,
0112 const IOVSyncValue& iTime,
0113 ValidityInterval& oInterval) {
0114 oInterval = ValidityInterval(IOVSyncValue::beginOfTime(), IOVSyncValue::endOfTime());
0115 }
0116
0117 DDDetectorESProducer::ReturnType DDDetectorESProducer::produceMagField(const IdealMagneticFieldRecord& iRecord) {
0118 LogVerbatim("Geometry") << "DDDetectorESProducer::Produce MF " << appendToDataLabel_;
0119 if (fromDB_) {
0120 edm::ESTransientHandle<FileBlob> gdd = iRecord.getTransientHandle(mfToken_);
0121 unique_ptr<vector<unsigned char> > tb = (*gdd).getUncompressedBlob();
0122
0123 return make_unique<cms::DDDetector>(label_, string(tb->begin(), tb->end()), true);
0124 } else {
0125 return make_unique<DDDetector>(appendToDataLabel_, confGeomXMLFiles_);
0126 }
0127 }
0128
0129 DDDetectorESProducer::ReturnType DDDetectorESProducer::produceGeom(const IdealGeometryRecord& iRecord) {
0130 LogVerbatim("Geometry") << "DDDetectorESProducer::Produce " << appendToDataLabel_;
0131 if (fromDB_) {
0132 edm::ESTransientHandle<FileBlob> gdd = iRecord.getTransientHandle(geomToken_);
0133 unique_ptr<vector<unsigned char> > tb = (*gdd).getUncompressedBlob();
0134
0135 return make_unique<cms::DDDetector>(label_, string(tb->begin(), tb->end()), true);
0136 } else {
0137 return make_unique<DDDetector>(appendToDataLabel_, confGeomXMLFiles_, false);
0138 }
0139 }
0140
0141 DDDetectorESProducer::ReturnType DDDetectorESProducer::produce() {
0142 LogVerbatim("Geometry") << "DDDetectorESProducer::Produce " << appendToDataLabel_;
0143 return make_unique<DDDetector>(appendToDataLabel_, confGeomXMLFiles_, false);
0144 }
0145
0146 DEFINE_FWK_EVENTSETUP_SOURCE(DDDetectorESProducer);