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
147
148
|
///
/// An ESProducer that fills the MuonDigiGeometryRcd with a misaligned Muon
///
/// This should replace the standard DTGeometry and CSCGeometry producers
/// when producing Misalignment scenarios.
///
/// \file
/// $Date: 2009/03/26 09:56:51 $
/// $Revision: 1.11 $
/// \author Andre Sznajder - UERJ(Brazil)
///
// Framework
#include "FWCore/Framework/interface/one/EDAnalyzer.h"
#include "FWCore/Framework/interface/MakerMacros.h"
#include "FWCore/Utilities/interface/Exception.h"
#include "FWCore/Framework/interface/ESHandle.h"
#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "FWCore/MessageLogger/interface/MessageLogger.h"
// Conditions database
#include "FWCore/ServiceRegistry/interface/Service.h"
#include "CondCore/DBOutputService/interface/PoolDBOutputService.h"
// Alignment
#include "Alignment/MuonAlignment/interface/AlignableMuon.h"
#include "Geometry/CSCGeometry/interface/CSCGeometry.h"
#include "Geometry/DTGeometry/interface/DTGeometry.h"
#include "Geometry/GEMGeometry/interface/GEMGeometry.h"
#include "Alignment/MuonAlignment/interface/MuonScenarioBuilder.h"
#include "Alignment/CommonAlignment/interface/Alignable.h"
#include "Geometry/GeometryAligner/interface/GeometryAligner.h"
#include "Geometry/Records/interface/MuonGeometryRecord.h"
#include <memory>
#include <iostream>
class MuonMisalignedProducer : public edm::one::EDAnalyzer<> {
public:
/// Constructor
MuonMisalignedProducer(const edm::ParameterSet&);
/// Destructor
~MuonMisalignedProducer() override;
/// Produce the misaligned Muon geometry and store iti
void analyze(const edm::Event&, const edm::EventSetup&) override;
/// Save alignemnts and error to database
void saveToDB();
private:
const bool theSaveToDB; /// whether or not writing to DB
const edm::ParameterSet theScenario; /// misalignment scenario
std::string theDTAlignRecordName, theDTErrorRecordName;
std::string theCSCAlignRecordName, theCSCErrorRecordName;
std::string theGEMAlignRecordName, theGEMErrorRecordName;
edm::ESGetToken<DTGeometry, MuonGeometryRecord> esTokenDT_;
edm::ESGetToken<CSCGeometry, MuonGeometryRecord> esTokenCSC_;
edm::ESGetToken<GEMGeometry, MuonGeometryRecord> esTokenGEM_;
Alignments dt_Alignments;
AlignmentErrorsExtended dt_AlignmentErrorsExtended;
Alignments csc_Alignments;
AlignmentErrorsExtended csc_AlignmentErrorsExtended;
Alignments gem_Alignments;
AlignmentErrorsExtended gem_AlignmentErrorsExtended;
};
//__________________________________________________________________________________________________
MuonMisalignedProducer::MuonMisalignedProducer(const edm::ParameterSet& p)
: theSaveToDB(p.getUntrackedParameter<bool>("saveToDbase")),
theScenario(p.getParameter<edm::ParameterSet>("scenario")),
theDTAlignRecordName("DTAlignmentRcd"),
theDTErrorRecordName("DTAlignmentErrorExtendedRcd"),
theCSCAlignRecordName("CSCAlignmentRcd"),
theCSCErrorRecordName("CSCAlignmentErrorExtendedRcd"),
theGEMAlignRecordName("GEMAlignmentRcd"),
theGEMErrorRecordName("GEMAlignmentErrorExtendedRcd"),
esTokenDT_(esConsumes(edm::ESInputTag("", "idealForMuonMisalignedProducer"))),
esTokenCSC_(esConsumes(edm::ESInputTag("", "idealForMuonMisalignedProducer"))),
esTokenGEM_(esConsumes(edm::ESInputTag("", "idealForMuonMisalignedProducer"))) {}
//__________________________________________________________________________________________________
MuonMisalignedProducer::~MuonMisalignedProducer() = default;
//__________________________________________________________________________________________________
void MuonMisalignedProducer::analyze(const edm::Event& event, const edm::EventSetup& eventSetup) {
edm::LogInfo("MisalignedMuon") << "Producer called";
// Create the Muon geometry from ideal geometry
edm::ESHandle<DTGeometry> theDTGeometry = eventSetup.getHandle(esTokenDT_);
edm::ESHandle<CSCGeometry> theCSCGeometry = eventSetup.getHandle(esTokenCSC_);
edm::ESHandle<GEMGeometry> theGEMGeometry = eventSetup.getHandle(esTokenGEM_);
// Create the alignable hierarchy
AlignableMuon* theAlignableMuon = new AlignableMuon(&(*theDTGeometry), &(*theCSCGeometry), &(*theGEMGeometry));
// Create misalignment scenario
MuonScenarioBuilder scenarioBuilder(theAlignableMuon);
scenarioBuilder.applyScenario(theScenario);
// Get alignments and errors
dt_Alignments = *(theAlignableMuon->dtAlignments());
dt_AlignmentErrorsExtended = *(theAlignableMuon->dtAlignmentErrorsExtended());
csc_Alignments = *(theAlignableMuon->cscAlignments());
csc_AlignmentErrorsExtended = *(theAlignableMuon->cscAlignmentErrorsExtended());
gem_Alignments = *(theAlignableMuon->gemAlignments());
gem_AlignmentErrorsExtended = *(theAlignableMuon->gemAlignmentErrorsExtended());
// Misalign the EventSetup geometry
/* GeometryAligner aligner;
aligner.applyAlignments<DTGeometry>(&(*theDTGeometry), dt_Alignments, dt_AlignmentErrorsExtended, AlignTransform());
aligner.applyAlignments<CSCGeometry>(
&(*theCSCGeometry), csc_Alignments, csc_AlignmentErrorsExtended, AlignTransform());
aligner.applyAlignments<GEMGeometry>(
&(*theGEMGeometry), gem_Alignments, gem_AlignmentErrorsExtended, AlignTransform());
*/
// Write alignments to DB
if (theSaveToDB)
this->saveToDB();
edm::LogInfo("MisalignedMuon") << "Producer done";
}
//__________________________________________________________________________________________________
void MuonMisalignedProducer::saveToDB(void) {
// Call service
edm::Service<cond::service::PoolDBOutputService> poolDbService;
if (!poolDbService.isAvailable()) // Die if not available
throw cms::Exception("NotAvailable") << "PoolDBOutputService not available";
// Store DT alignments and errors
poolDbService->writeOneIOV<Alignments>(dt_Alignments, poolDbService->beginOfTime(), theDTAlignRecordName);
poolDbService->writeOneIOV<AlignmentErrorsExtended>(
dt_AlignmentErrorsExtended, poolDbService->beginOfTime(), theDTErrorRecordName);
// Store CSC alignments and errors
poolDbService->writeOneIOV<Alignments>(csc_Alignments, poolDbService->beginOfTime(), theCSCAlignRecordName);
poolDbService->writeOneIOV<AlignmentErrorsExtended>(
csc_AlignmentErrorsExtended, poolDbService->beginOfTime(), theCSCErrorRecordName);
poolDbService->writeOneIOV<Alignments>(gem_Alignments, poolDbService->beginOfTime(), theGEMAlignRecordName);
poolDbService->writeOneIOV<AlignmentErrorsExtended>(
gem_AlignmentErrorsExtended, poolDbService->beginOfTime(), theGEMErrorRecordName);
}
//____________________________________________________________________________________________
DEFINE_FWK_MODULE(MuonMisalignedProducer);
|