00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "DTResolutionAnalysisTask.h"
00011
00012
00013 #include "FWCore/Framework/interface/Event.h"
00014 #include "FWCore/Framework/interface/EventSetup.h"
00015 #include "FWCore/ServiceRegistry/interface/Service.h"
00016 #include <FWCore/Framework/interface/LuminosityBlock.h>
00017
00018 #include "DQMServices/Core/interface/DQMStore.h"
00019 #include "DQMServices/Core/interface/MonitorElement.h"
00020
00021
00022 #include "Geometry/DTGeometry/interface/DTGeometry.h"
00023 #include "Geometry/Records/interface/MuonGeometryRecord.h"
00024
00025
00026 #include "DataFormats/DTRecHit/interface/DTRecSegment4DCollection.h"
00027 #include "DataFormats/DTRecHit/interface/DTRecHitCollection.h"
00028
00029
00030 #include <iterator>
00031
00032 using namespace edm;
00033 using namespace std;
00034
00035 DTResolutionAnalysisTask::DTResolutionAnalysisTask(const ParameterSet& pset) {
00036
00037 edm::LogVerbatim ("DTDQM|DTMonitorModule|DTResolutionAnalysisTask") << "[DTResolutionAnalysisTask] Constructor called!" << endl;
00038
00039
00040 theRecHits4DLabel = pset.getParameter<string>("recHits4DLabel");
00041
00042 theRecHitLabel = pset.getParameter<string>("recHitLabel");
00043
00044 prescaleFactor = pset.getUntrackedParameter<int>("diagnosticPrescale", 1);
00045 resetCycle = pset.getUntrackedParameter<int>("ResetCycle", -1);
00046 }
00047
00048
00049 DTResolutionAnalysisTask::~DTResolutionAnalysisTask(){
00050
00051 edm::LogVerbatim ("DTDQM|DTMonitorModule|DTResolutionAnalysisTask") << "[DTResolutionAnalysisTask] Destructor called!" << endl;
00052
00053 }
00054
00055
00056 void DTResolutionAnalysisTask::beginJob(const edm::EventSetup& setup){
00057
00058 theDbe = edm::Service<DQMStore>().operator->();
00059
00060
00061
00062 setup.get<MuonGeometryRecord>().get(dtGeom);
00063
00064
00065
00066 vector<DTChamber*> chambers = dtGeom->chambers();
00067 for(vector<DTChamber*>::const_iterator chamber = chambers.begin();
00068 chamber != chambers.end(); ++chamber) {
00069 DTChamberId dtChId = (*chamber)->id();
00070 for(int sl = 1; sl <= 3; ++sl) {
00071 if(dtChId.station() == 4 && sl == 2) continue;
00072 const DTSuperLayerId dtSLId(dtChId,sl);
00073 bookHistos(dtSLId);
00074 }
00075 }
00076
00077 }
00078
00079
00080
00081
00082 void DTResolutionAnalysisTask::beginLuminosityBlock(const LuminosityBlock& lumiSeg,
00083 const EventSetup& context) {
00084
00085 edm::LogVerbatim ("DTDQM|DTMonitorModule|DTResolutionAnalysisTask") << "[DTResolutionTask]: Begin of LS transition"<<endl;
00086
00087 if(resetCycle != -1 && lumiSeg.id().luminosityBlock() % resetCycle == 0) {
00088 for(map<DTSuperLayerId, vector<MonitorElement*> > ::const_iterator histo = histosPerSL.begin();
00089 histo != histosPerSL.end();
00090 histo++) {
00091 int size = (*histo).second.size();
00092 for(int i=0; i<size; i++){
00093 (*histo).second[i]->Reset();
00094 }
00095 }
00096 }
00097 }
00098
00099
00100 void DTResolutionAnalysisTask::endJob(){
00101
00102 edm::LogVerbatim ("DTDQM|DTMonitorModule|DTResolutionAnalysisTask") << "[DTResolutionAnalysisTask] endjob called!"<<endl;
00103
00104 }
00105
00106
00107
00108 void DTResolutionAnalysisTask::analyze(const edm::Event& event, const edm::EventSetup& setup) {
00109
00110 edm::LogVerbatim ("DTDQM|DTMonitorModule|DTResolutionAnalysisTask") << "[DTResolutionAnalysisTask] Analyze #Run: " << event.id().run()
00111 << " #Event: " << event.id().event() << endl;
00112
00113
00114
00115 edm::Handle<DTRecSegment4DCollection> all4DSegments;
00116 event.getByLabel(theRecHits4DLabel, all4DSegments);
00117
00118
00119 Handle<DTRecHitCollection> dtRecHits;
00120 event.getByLabel(theRecHitLabel, dtRecHits);
00121
00122
00123 DTRecSegment4DCollection::id_iterator chamberId;
00124 for (chamberId = all4DSegments->id_begin();
00125 chamberId != all4DSegments->id_end();
00126 ++chamberId) {
00127
00128 DTRecSegment4DCollection::range range = all4DSegments->get(*chamberId);
00129 int nsegm = distance(range.first, range.second);
00130
00131
00132
00133 const DTChamber* chamber = dtGeom->chamber(*chamberId);
00134
00135
00136 for (DTRecSegment4DCollection::const_iterator segment4D = range.first;
00137 segment4D!=range.second;
00138 ++segment4D) {
00139
00140
00141
00142
00143 if((*chamberId).station() != 4 && (*segment4D).dimension() != 4) {
00144 edm::LogVerbatim ("DTDQM|DTMonitorModule|DTResolutionAnalysisTask") << "[DTResolutionAnalysisTask]***Warning: RecSegment dimension is not 4 but "
00145 << (*segment4D).dimension() << "!" << endl;
00146 continue;
00147 } else if((*chamberId).station() == 4 && (*segment4D).dimension() != 2) {
00148 edm::LogVerbatim ("DTDQM|DTMonitorModule|DTResolutionAnalysisTask") << "[DTResolutionAnalysisTask]***Warning: RecSegment dimension is not 2 but "
00149 << (*segment4D).dimension() << "!" << endl;
00150 continue;
00151 }
00152
00153
00154
00155 vector<DTRecHit1D> recHits1D_S3;
00156
00157
00158
00159
00160
00161 if((*segment4D).hasPhi()) {
00162 const DTChamberRecSegment2D* phiSeg = (*segment4D).phiSegment();
00163 vector<DTRecHit1D> phiRecHits = phiSeg->specificRecHits();
00164
00165 if(phiRecHits.size() != 8) {
00166
00167
00168 continue;
00169 }
00170 copy(phiRecHits.begin(), phiRecHits.end(), back_inserter(recHits1D_S3));
00171 } else {
00172
00173 }
00174
00175 if((*segment4D).hasZed()) {
00176 const DTSLRecSegment2D* zSeg = (*segment4D).zSegment();
00177 vector<DTRecHit1D> zRecHits = zSeg->specificRecHits();
00178 if(zRecHits.size() != 4) {
00179
00180
00181 continue;
00182 }
00183 copy(zRecHits.begin(), zRecHits.end(), back_inserter(recHits1D_S3));
00184 }
00185
00186
00187 for(vector<DTRecHit1D>::const_iterator recHit1D = recHits1D_S3.begin();
00188 recHit1D != recHits1D_S3.end();
00189 recHit1D++) {
00190 const DTWireId wireId = (*recHit1D).wireId();
00191
00192
00193 const DTLayer* layer = chamber->superLayer(wireId.superlayerId())->layer(wireId.layerId());
00194 float wireX = layer->specificTopology().wirePosition(wireId.wire());
00195
00196
00197 float distRecHitToWire = fabs(wireX - (*recHit1D).localPosition().x());
00198
00199
00200
00201
00202 LocalPoint wirePosInLay(wireX,0,0);
00203 GlobalPoint wirePosGlob = layer->toGlobal(wirePosInLay);
00204 LocalPoint wirePosInChamber = chamber->toLocal(wirePosGlob);
00205
00206
00207 LocalPoint segPosAtZWire = (*segment4D).localPosition()
00208 + (*segment4D).localDirection()*wirePosInChamber.z()/cos((*segment4D).localDirection().theta());
00209
00210
00211 int sl = wireId.superlayer();
00212
00213 double distSegmToWire = -1;
00214 if(sl == 1 || sl == 3) {
00215
00216 distSegmToWire = fabs(wirePosInChamber.x() - segPosAtZWire.x());
00217 } else if(sl == 2) {
00218
00219 distSegmToWire = fabs(wirePosInChamber.y() - segPosAtZWire.y());
00220 }
00221
00222 if(distSegmToWire > 2.1)
00223 edm::LogVerbatim ("DTDQM|DTMonitorModule|DTResolutionAnalysisTask") << " Warning: dist segment-wire: " << distSegmToWire << endl;
00224
00225 double residual = distRecHitToWire - distSegmToWire;
00226
00227 fillHistos(wireId.superlayerId(), distSegmToWire, residual);
00228
00229
00230
00231
00232
00233
00234 }
00235 }
00236 }
00237
00238 }
00239
00240
00241
00242 void DTResolutionAnalysisTask::bookHistos(DTSuperLayerId slId) {
00243
00244 edm::LogVerbatim ("DTDQM|DTMonitorModule|DTResolutionAnalysisTask") << " Booking histos for SL: " << slId << endl;
00245
00246
00247 stringstream wheel; wheel << slId.wheel();
00248 stringstream station; station << slId.station();
00249 stringstream sector; sector << slId.sector();
00250 stringstream superLayer; superLayer << slId.superlayer();
00251
00252
00253 string slHistoName =
00254 "_W" + wheel.str() +
00255 "_St" + station.str() +
00256 "_Sec" + sector.str() +
00257 "_SL" + superLayer.str();
00258
00259 theDbe->setCurrentFolder("DT/02-Segments/Wheel" + wheel.str() +
00260 "/Sector" + sector.str() +
00261 "/Station" + station.str());
00262
00263 vector<MonitorElement *> histos;
00264
00265 histos.push_back(theDbe->book1D("hResDist"+slHistoName,
00266 "Residuals on the distance from wire (rec_hit - segm_extr) (cm)",
00267 200, -0.4, 0.4));
00268
00269
00270
00271
00272 histosPerSL[slId] = histos;
00273 }
00274
00275
00276
00277 void DTResolutionAnalysisTask::fillHistos(DTSuperLayerId slId,
00278 float distExtr,
00279 float residual) {
00280 vector<MonitorElement *> histos = histosPerSL[slId];
00281 histos[0]->Fill(residual);
00282
00283
00284
00285 }
00286
00287
00288