1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
// -*- C++ -*-
//
// Package: DetectorDescription/DDDetectorESProducer
// Class: DDDetectorESProducer
//
/**\class DDDetectorESProducer
Description: Produce Detector description
Implementation:
Detector is described in XML
*/
//
// Original Author: Ianna Osborne
// Created: Fri, 07 Dec 2018 11:20:52 GMT
//
//
#include <memory>
#include "FWCore/Framework/interface/EventSetupRecordIntervalFinder.h"
#include "FWCore/Framework/interface/SourceFactory.h"
#include "FWCore/Framework/interface/ESProducer.h"
#include "FWCore/Framework/interface/ESHandle.h"
#include "FWCore/Concurrency/interface/SharedResourceNames.h"
#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include "CondFormats/Common/interface/FileBlob.h"
#include "CondFormats/DataRecord/interface/MFGeometryFileRcd.h"
#include "Geometry/Records/interface/IdealGeometryRecord.h"
#include "Geometry/Records/interface/GeometryFileRcd.h"
#include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
#include "DetectorDescription/DDCMS/interface/DDDetector.h"
#include "DD4hep/Detector.h"
using namespace std;
using namespace cms;
using namespace edm;
class DDDetectorESProducer : public ESProducer, public EventSetupRecordIntervalFinder {
public:
DDDetectorESProducer(const ParameterSet&);
~DDDetectorESProducer() override;
using ReturnType = unique_ptr<DDDetector>;
using Detector = dd4hep::Detector;
ReturnType produceGeom(const IdealGeometryRecord&);
ReturnType produceMagField(const IdealMagneticFieldRecord&);
ReturnType produce();
static void fillDescriptions(ConfigurationDescriptions&);
protected:
void setIntervalFor(const eventsetup::EventSetupRecordKey&, const IOVSyncValue&, ValidityInterval&) override;
private:
const bool fromDB_;
const string appendToDataLabel_;
const string confGeomXMLFiles_;
const string rootDDName_;
const string label_;
edm::ESGetToken<FileBlob, MFGeometryFileRcd> mfToken_;
edm::ESGetToken<FileBlob, GeometryFileRcd> geomToken_;
};
DDDetectorESProducer::DDDetectorESProducer(const ParameterSet& iConfig)
: fromDB_(iConfig.getParameter<bool>("fromDB")),
appendToDataLabel_(iConfig.getParameter<string>("appendToDataLabel")),
confGeomXMLFiles_(fromDB_ ? "none" : iConfig.getParameter<FileInPath>("confGeomXMLFiles").fullPath()),
rootDDName_(iConfig.getParameter<string>("rootDDName")),
label_(iConfig.getParameter<string>("label")) {
usesResources({edm::ESSharedResourceNames::kDD4hep});
edm::LogVerbatim("Geometry") << "DDDetectorESProducer::fromDB " << fromDB_ << " appendToDataLabel "
<< appendToDataLabel_ << " rootDDName " << rootDDName_ << " label " << label_
<< " confGeomXMLFiles " << confGeomXMLFiles_;
if (rootDDName_ == "MagneticFieldVolumes:MAGF" || rootDDName_ == "cmsMagneticField:MAGF") {
auto c = setWhatProduced(this,
&DDDetectorESProducer::produceMagField,
edm::es::Label(iConfig.getParameter<std::string>("@module_label")));
if (fromDB_) {
mfToken_ = c.consumes(edm::ESInputTag("", label_));
}
findingRecord<IdealMagneticFieldRecord>();
} else {
auto c = setWhatProduced(this, &DDDetectorESProducer::produceGeom);
if (fromDB_) {
geomToken_ = c.consumes(edm::ESInputTag("", label_));
}
findingRecord<IdealGeometryRecord>();
}
}
DDDetectorESProducer::~DDDetectorESProducer() {}
void DDDetectorESProducer::fillDescriptions(ConfigurationDescriptions& descriptions) {
ParameterSetDescription desc;
desc.addOptional<FileInPath>("confGeomXMLFiles");
desc.add<string>("rootDDName", "cms:OCMS");
desc.add<string>("label", "");
desc.add<bool>("fromDB", false);
descriptions.add("DDDetectorESProducer", desc);
edm::ParameterSetDescription descDB;
descDB.add<string>("rootDDName", "cms:OCMS");
descDB.add<string>("label", "Extended");
descDB.add<bool>("fromDB", true);
descriptions.add("DDDetectorESProducerFromDB", descDB);
}
void DDDetectorESProducer::setIntervalFor(const eventsetup::EventSetupRecordKey& iKey,
const IOVSyncValue& iTime,
ValidityInterval& oInterval) {
oInterval = ValidityInterval(IOVSyncValue::beginOfTime(), IOVSyncValue::endOfTime()); //infinite
}
DDDetectorESProducer::ReturnType DDDetectorESProducer::produceMagField(const IdealMagneticFieldRecord& iRecord) {
LogVerbatim("Geometry") << "DDDetectorESProducer::Produce MF " << appendToDataLabel_;
if (fromDB_) {
edm::ESTransientHandle<FileBlob> gdd = iRecord.getTransientHandle(mfToken_);
unique_ptr<vector<unsigned char> > tb = (*gdd).getUncompressedBlob();
return make_unique<cms::DDDetector>(label_, string(tb->begin(), tb->end()), true);
} else {
return make_unique<DDDetector>(appendToDataLabel_, confGeomXMLFiles_);
}
}
DDDetectorESProducer::ReturnType DDDetectorESProducer::produceGeom(const IdealGeometryRecord& iRecord) {
LogVerbatim("Geometry") << "DDDetectorESProducer::Produce " << appendToDataLabel_;
if (fromDB_) {
edm::ESTransientHandle<FileBlob> gdd = iRecord.getTransientHandle(geomToken_);
unique_ptr<vector<unsigned char> > tb = (*gdd).getUncompressedBlob();
return make_unique<cms::DDDetector>(label_, string(tb->begin(), tb->end()), true);
} else {
return make_unique<DDDetector>(appendToDataLabel_, confGeomXMLFiles_, false);
}
}
DDDetectorESProducer::ReturnType DDDetectorESProducer::produce() {
LogVerbatim("Geometry") << "DDDetectorESProducer::Produce " << appendToDataLabel_;
return make_unique<DDDetector>(appendToDataLabel_, confGeomXMLFiles_, false);
}
DEFINE_FWK_EVENTSETUP_SOURCE(DDDetectorESProducer);
|