File indexing completed on 2024-04-06 11:58:27
0001
0002
0003
0004
0005
0006 #include "DTT0WireInChamberReferenceCorrection.h"
0007 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0008 #include "FWCore/Framework/interface/EventSetup.h"
0009 #include "FWCore/Framework/interface/ESHandle.h"
0010 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0011
0012 #include "Geometry/Records/interface/MuonGeometryRecord.h"
0013 #include "Geometry/DTGeometry/interface/DTGeometry.h"
0014 #include "Geometry/DTGeometry/interface/DTSuperLayer.h"
0015
0016 #include "DataFormats/MuonDetId/interface/DTWireId.h"
0017 #include "CondFormats/DTObjects/interface/DTT0.h"
0018 #include "CondFormats/DataRecord/interface/DTT0Rcd.h"
0019 #include "FWCore/Framework/interface/ConsumesCollector.h"
0020
0021 #include <string>
0022 #include <sstream>
0023
0024 using namespace std;
0025 using namespace edm;
0026
0027 namespace dtCalibration {
0028
0029 DTT0WireInChamberReferenceCorrection::DTT0WireInChamberReferenceCorrection(const ParameterSet& pset,
0030 edm::ConsumesCollector cc)
0031 : calibChamber_(pset.getParameter<string>("calibChamber")),
0032 t0Token_(cc.esConsumes<edm::Transition::BeginRun>()),
0033 dtGeomToken_(cc.esConsumes<edm::Transition::BeginRun>()) {
0034
0035 if (!calibChamber_.empty() && calibChamber_ != "None" && calibChamber_ != "All") {
0036 stringstream linestr;
0037 int selWheel, selStation, selSector;
0038 linestr << calibChamber_;
0039 linestr >> selWheel >> selStation >> selSector;
0040 chosenChamberId_ = DTChamberId(selWheel, selStation, selSector);
0041 LogVerbatim("Calibration") << "[DTT0WireInChamberReferenceCorrection] Chosen chamber: " << chosenChamberId_
0042 << endl;
0043 }
0044
0045 }
0046
0047 DTT0WireInChamberReferenceCorrection::~DTT0WireInChamberReferenceCorrection() {}
0048
0049 void DTT0WireInChamberReferenceCorrection::setES(const EventSetup& setup) {
0050
0051 ESHandle<DTT0> t0H = setup.getHandle(t0Token_);
0052 t0Map_ = &*t0H;
0053 LogVerbatim("Calibration") << "[DTT0WireInChamberReferenceCorrection] T0 version: " << t0H->version();
0054
0055
0056 dtGeom_ = setup.getHandle(dtGeomToken_);
0057 }
0058
0059 DTT0Data DTT0WireInChamberReferenceCorrection::correction(const DTWireId& wireId) {
0060
0061
0062 DTChamberId chamberId = wireId.layerId().superlayerId().chamberId();
0063
0064 if (calibChamber_.empty() || calibChamber_ == "None")
0065 return defaultT0(wireId);
0066 if (calibChamber_ != "All" && chamberId != chosenChamberId_)
0067 return defaultT0(wireId);
0068
0069
0070 float t0Mean, t0RMS;
0071 int status = t0Map_->get(wireId, t0Mean, t0RMS, DTTimeUnits::counts);
0072 if (status != 0)
0073 throw cms::Exception("[DTT0WireInChamberReferenceCorrection]")
0074 << "Could not find t0 entry in DB for" << wireId << endl;
0075
0076
0077 DTSuperLayerId slId = wireId.layerId().superlayerId();
0078
0079 DTLayerId layerRef1(slId, 1);
0080
0081
0082 const DTTopology& dtTopoLayerRef1 = dtGeom_->layer(layerRef1)->specificTopology();
0083 const int firstWireLayerRef1 = dtTopoLayerRef1.firstChannel();
0084 const int refWireLayerRef1 = firstWireLayerRef1;
0085 DTWireId wireIdRefLayerRef1(layerRef1, refWireLayerRef1);
0086
0087 float t0MeanRef1, t0RMSRef1;
0088 int statusRef1 = t0Map_->get(wireIdRefLayerRef1, t0MeanRef1, t0RMSRef1, DTTimeUnits::counts);
0089
0090
0091 if (!statusRef1) {
0092 float t0MeanNew = t0Mean - t0MeanRef1;
0093 float t0RMSNew = t0RMS;
0094 return DTT0Data(t0MeanNew, t0RMSNew);
0095 } else {
0096
0097
0098 throw cms::Exception("[DTT0WireInChamberReferenceCorrection]")
0099 << "Could not find t0 entry in DB for" << wireIdRefLayerRef1 << endl;
0100 }
0101 }
0102
0103 DTT0Data DTT0WireInChamberReferenceCorrection::defaultT0(const DTWireId& wireId) {
0104
0105 float t0Mean, t0RMS;
0106 int status = t0Map_->get(wireId, t0Mean, t0RMS, DTTimeUnits::counts);
0107 if (!status) {
0108 return DTT0Data(t0Mean, t0RMS);
0109 } else {
0110
0111 throw cms::Exception("[DTT0WireInChamberReferenceCorrection]")
0112 << "Could not find t0 entry in DB for" << wireId << endl;
0113 }
0114 }
0115
0116 }