00001 #include "DQMOffline/Muon/interface/MuonIdDQM.h"
00002
00003 MuonIdDQM::MuonIdDQM(const edm::ParameterSet& iConfig)
00004 {
00005 inputMuonCollection_ = iConfig.getParameter<edm::InputTag>("inputMuonCollection");
00006 inputDTRecSegment4DCollection_ = iConfig.getParameter<edm::InputTag>("inputDTRecSegment4DCollection");
00007 inputCSCSegmentCollection_ = iConfig.getParameter<edm::InputTag>("inputCSCSegmentCollection");
00008 useTrackerMuons_ = iConfig.getUntrackedParameter<bool>("useTrackerMuons");
00009 useGlobalMuons_ = iConfig.getUntrackedParameter<bool>("useGlobalMuons");
00010 useTrackerMuonsNotGlobalMuons_ = iConfig.getUntrackedParameter<bool>("useTrackerMuonsNotGlobalMuons");
00011 useGlobalMuonsNotTrackerMuons_ = iConfig.getUntrackedParameter<bool>("useGlobalMuonsNotTrackerMuons");
00012 baseFolder_ = iConfig.getUntrackedParameter<std::string>("baseFolder");
00013
00014 dbe_ = 0;
00015 dbe_ = edm::Service<DQMStore>().operator->();
00016 }
00017
00018 MuonIdDQM::~MuonIdDQM() {}
00019
00020 void
00021 MuonIdDQM::beginJob()
00022 {
00023 char name[100], title[200];
00024
00025
00026 for (unsigned int i = 0; i < 4; i++) {
00027 if ((i == 0 && ! useTrackerMuons_) || (i == 1 && ! useGlobalMuons_)) continue;
00028 if ((i == 2 && ! useTrackerMuonsNotGlobalMuons_) || (i == 3 && ! useGlobalMuonsNotTrackerMuons_)) continue;
00029 if (i == 0) dbe_->setCurrentFolder(baseFolder_+"/TrackerMuons");
00030 if (i == 1) dbe_->setCurrentFolder(baseFolder_+"/GlobalMuons");
00031 if (i == 2) dbe_->setCurrentFolder(baseFolder_+"/TrackerMuonsNotGlobalMuons");
00032 if (i == 3) dbe_->setCurrentFolder(baseFolder_+"/GlobalMuonsNotTrackerMuons");
00033
00034 hNumChambers[i] = dbe_->book1D("hNumChambers", "Number of Chambers", 11, -0.5, 10.5);
00035 hNumMatches[i] = dbe_->book1D("hNumMatches", "Number of Matches", 11, -0.5, 10.5);
00036
00037
00038 for(int station = 0; station < 4; ++station)
00039 {
00040 sprintf(name, "hDT%iNumSegments", station+1);
00041 sprintf(title, "DT Station %i Number of Segments (No Arbitration)", station+1);
00042 hDTNumSegments[i][station] = dbe_->book1D(name, title, 11, -0.5, 10.5);
00043
00044 sprintf(name, "hDT%iDx", station+1);
00045 sprintf(title, "DT Station %i Delta X", station+1);
00046 hDTDx[i][station] = dbe_->book1D(name, title, 100, -100., 100.);
00047
00048 sprintf(name, "hDT%iPullx", station+1);
00049 sprintf(title, "DT Station %i Pull X", station+1);
00050 hDTPullx[i][station] = dbe_->book1D(name, title, 100, -20., 20.);
00051
00052 sprintf(name, "hDT%iDdXdZ", station+1);
00053 sprintf(title, "DT Station %i Delta DxDz", station+1);
00054 hDTDdXdZ[i][station] = dbe_->book1D(name, title, 100, -1., 1.);
00055
00056 sprintf(name, "hDT%iPulldXdZ", station+1);
00057 sprintf(title, "DT Station %i Pull DxDz", station+1);
00058 hDTPulldXdZ[i][station] = dbe_->book1D(name, title, 100, -20., 20.);
00059
00060 if (station < 3) {
00061 sprintf(name, "hDT%iDy", station+1);
00062 sprintf(title, "DT Station %i Delta Y", station+1);
00063 hDTDy[i][station] = dbe_->book1D(name, title, 100, -150., 150.);
00064
00065 sprintf(name, "hDT%iPully", station+1);
00066 sprintf(title, "DT Station %i Pull Y", station+1);
00067 hDTPully[i][station] = dbe_->book1D(name, title, 100, -20., 20.);
00068
00069 sprintf(name, "hDT%iDdYdZ", station+1);
00070 sprintf(title, "DT Station %i Delta DyDz", station+1);
00071 hDTDdYdZ[i][station] = dbe_->book1D(name, title, 100, -2., 2.);
00072
00073 sprintf(name, "hDT%iPulldYdZ", station+1);
00074 sprintf(title, "DT Station %i Pull DyDz", station+1);
00075 hDTPulldYdZ[i][station] = dbe_->book1D(name, title, 100, -20., 20.);
00076 }
00077
00078 sprintf(name, "hCSC%iNumSegments", station+1);
00079 sprintf(title, "CSC Station %i Number of Segments (No Arbitration)", station+1);
00080 hCSCNumSegments[i][station] = dbe_->book1D(name, title, 11, -0.5, 10.5);
00081
00082 sprintf(name, "hCSC%iDx", station+1);
00083 sprintf(title, "CSC Station %i Delta X", station+1);
00084 hCSCDx[i][station] = dbe_->book1D(name, title, 100, -50., 50.);
00085
00086 sprintf(name, "hCSC%iPullx", station+1);
00087 sprintf(title, "CSC Station %i Pull X", station+1);
00088 hCSCPullx[i][station] = dbe_->book1D(name, title, 100, -20., 20.);
00089
00090 sprintf(name, "hCSC%iDdXdZ", station+1);
00091 sprintf(title, "CSC Station %i Delta DxDz", station+1);
00092 hCSCDdXdZ[i][station] = dbe_->book1D(name, title, 100, -1., 1.);
00093
00094 sprintf(name, "hCSC%iPulldXdZ", station+1);
00095 sprintf(title, "CSC Station %i Pull DxDz", station+1);
00096 hCSCPulldXdZ[i][station] = dbe_->book1D(name, title, 100, -20., 20.);
00097
00098 sprintf(name, "hCSC%iDy", station+1);
00099 sprintf(title, "CSC Station %i Delta Y", station+1);
00100 hCSCDy[i][station] = dbe_->book1D(name, title, 100, -50., 50.);
00101
00102 sprintf(name, "hCSC%iPully", station+1);
00103 sprintf(title, "CSC Station %i Pull Y", station+1);
00104 hCSCPully[i][station] = dbe_->book1D(name, title, 100, -20., 20.);
00105
00106 sprintf(name, "hCSC%iDdYdZ", station+1);
00107 sprintf(title, "CSC Station %i Delta DyDz", station+1);
00108 hCSCDdYdZ[i][station] = dbe_->book1D(name, title, 100, -1., 1.);
00109
00110 sprintf(name, "hCSC%iPulldYdZ", station+1);
00111 sprintf(title, "CSC Station %i Pull DyDz", station+1);
00112 hCSCPulldYdZ[i][station] = dbe_->book1D(name, title, 100, -20., 20.);
00113 }
00114 }
00115
00116 dbe_->setCurrentFolder(baseFolder_);
00117 hSegmentIsAssociatedBool = dbe_->book1D("hSegmentIsAssociatedBool", "Segment Is Associated Boolean", 2, -0.5, 1.5);
00118 }
00119
00120 void
00121 MuonIdDQM::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup)
00122 {
00123 using namespace edm;
00124 using namespace reco;
00125
00126 iEvent.getByLabel(inputMuonCollection_, muonCollectionH_);
00127 iEvent.getByLabel(inputDTRecSegment4DCollection_, dtSegmentCollectionH_);
00128 iEvent.getByLabel(inputCSCSegmentCollection_, cscSegmentCollectionH_);
00129 iSetup.get<GlobalTrackingGeometryRecord>().get(geometry_);
00130
00131 for(MuonCollection::const_iterator muon = muonCollectionH_->begin();
00132 muon != muonCollectionH_->end(); ++muon)
00133 {
00134
00135 for (unsigned int i = 0; i < 4; i++) {
00136 if (i == 0 && (! useTrackerMuons_ || ! muon->isTrackerMuon())) continue;
00137 if (i == 1 && (! useGlobalMuons_ || ! muon->isGlobalMuon())) continue;
00138 if (i == 2 && (! useTrackerMuonsNotGlobalMuons_ || (! (muon->isTrackerMuon() && ! muon->isGlobalMuon())))) continue;
00139 if (i == 3 && (! useGlobalMuonsNotTrackerMuons_ || (! (muon->isGlobalMuon() && ! muon->isTrackerMuon())))) continue;
00140
00141 hNumChambers[i]->Fill(muon->numberOfChambers());
00142 hNumMatches[i]->Fill(muon->numberOfMatches(Muon::SegmentAndTrackArbitration));
00143
00144
00145 for(int station = 0; station < 4; ++station)
00146 {
00147
00148 if (muon->trackX(station+1, MuonSubdetId::DT, Muon::NoArbitration) < 900000)
00149 hDTNumSegments[i][station]->Fill(muon->numberOfSegments(station+1, MuonSubdetId::DT, Muon::NoArbitration));
00150 Fill(hDTDx[i][station], muon->dX(station+1, MuonSubdetId::DT, Muon::SegmentAndTrackArbitration));
00151 Fill(hDTPullx[i][station], muon->pullX(station+1, MuonSubdetId::DT, Muon::SegmentAndTrackArbitration, true));
00152 Fill(hDTDdXdZ[i][station], muon->dDxDz(station+1, MuonSubdetId::DT, Muon::SegmentAndTrackArbitration));
00153 Fill(hDTPulldXdZ[i][station], muon->pullDxDz(station+1, MuonSubdetId::DT, Muon::SegmentAndTrackArbitration, true));
00154
00155 if (station < 3) {
00156 Fill(hDTDy[i][station], muon->dY(station+1, MuonSubdetId::DT, Muon::SegmentAndTrackArbitration));
00157 Fill(hDTPully[i][station], muon->pullY(station+1, MuonSubdetId::DT, Muon::SegmentAndTrackArbitration, true));
00158 Fill(hDTDdYdZ[i][station], muon->dDyDz(station+1, MuonSubdetId::DT, Muon::SegmentAndTrackArbitration));
00159 Fill(hDTPulldYdZ[i][station], muon->pullDyDz(station+1, MuonSubdetId::DT, Muon::SegmentAndTrackArbitration, true));
00160 }
00161
00162
00163 if (muon->trackX(station+1, MuonSubdetId::CSC, Muon::NoArbitration) < 900000)
00164 hCSCNumSegments[i][station]->Fill(muon->numberOfSegments(station+1, MuonSubdetId::CSC, Muon::NoArbitration));
00165 Fill(hCSCDx[i][station], muon->dX(station+1, MuonSubdetId::CSC, Muon::SegmentAndTrackArbitration));
00166 Fill(hCSCPullx[i][station], muon->pullX(station+1, MuonSubdetId::CSC, Muon::SegmentAndTrackArbitration, true));
00167 Fill(hCSCDdXdZ[i][station], muon->dDxDz(station+1, MuonSubdetId::CSC, Muon::SegmentAndTrackArbitration));
00168 Fill(hCSCPulldXdZ[i][station], muon->pullDxDz(station+1, MuonSubdetId::CSC, Muon::SegmentAndTrackArbitration, true));
00169 Fill(hCSCDy[i][station], muon->dY(station+1, MuonSubdetId::CSC, Muon::SegmentAndTrackArbitration));
00170 Fill(hCSCPully[i][station], muon->pullY(station+1, MuonSubdetId::CSC, Muon::SegmentAndTrackArbitration, true));
00171 Fill(hCSCDdYdZ[i][station], muon->dDyDz(station+1, MuonSubdetId::CSC, Muon::SegmentAndTrackArbitration));
00172 Fill(hCSCPulldYdZ[i][station], muon->pullDyDz(station+1, MuonSubdetId::CSC, Muon::SegmentAndTrackArbitration, true));
00173 }
00174 }
00175 }
00176
00177 for(DTRecSegment4DCollection::const_iterator segment = dtSegmentCollectionH_->begin();
00178 segment != dtSegmentCollectionH_->end(); ++segment)
00179 {
00180 LocalPoint segmentLocalPosition = segment->localPosition();
00181 LocalVector segmentLocalDirection = segment->localDirection();
00182 LocalError segmentLocalPositionError = segment->localPositionError();
00183 LocalError segmentLocalDirectionError = segment->localDirectionError();
00184 bool segmentFound = false;
00185
00186 for(MuonCollection::const_iterator muon = muonCollectionH_->begin();
00187 muon != muonCollectionH_->end(); ++muon)
00188 {
00189 if (! muon->isMatchesValid())
00190 continue;
00191
00192 for(std::vector<MuonChamberMatch>::const_iterator chamberMatch = muon->matches().begin();
00193 chamberMatch != muon->matches().end(); ++chamberMatch) {
00194 for(std::vector<MuonSegmentMatch>::const_iterator segmentMatch = chamberMatch->segmentMatches.begin();
00195 segmentMatch != chamberMatch->segmentMatches.end(); ++segmentMatch)
00196 {
00197 if (fabs(segmentMatch->x - segmentLocalPosition.x() ) < 1E-6 &&
00198 fabs(segmentMatch->y - segmentLocalPosition.y() ) < 1E-6 &&
00199 fabs(segmentMatch->dXdZ - segmentLocalDirection.x()/segmentLocalDirection.z()) < 1E-6 &&
00200 fabs(segmentMatch->dYdZ - segmentLocalDirection.y()/segmentLocalDirection.z()) < 1E-6 &&
00201 fabs(segmentMatch->xErr - sqrt(segmentLocalPositionError.xx()) ) < 1E-6 &&
00202 fabs(segmentMatch->yErr - sqrt(segmentLocalPositionError.yy()) ) < 1E-6 &&
00203 fabs(segmentMatch->dXdZErr - sqrt(segmentLocalDirectionError.xx()) ) < 1E-6 &&
00204 fabs(segmentMatch->dYdZErr - sqrt(segmentLocalDirectionError.yy()) ) < 1E-6)
00205 {
00206 segmentFound = true;
00207 break;
00208 }
00209 }
00210 if (segmentFound) break;
00211 }
00212 if (segmentFound) break;
00213 }
00214
00215 if (segmentFound)
00216 hSegmentIsAssociatedBool->Fill(1.);
00217 else
00218 hSegmentIsAssociatedBool->Fill(0.);
00219 }
00220
00221 for(CSCSegmentCollection::const_iterator segment = cscSegmentCollectionH_->begin();
00222 segment != cscSegmentCollectionH_->end(); ++segment)
00223 {
00224 LocalPoint segmentLocalPosition = segment->localPosition();
00225 LocalVector segmentLocalDirection = segment->localDirection();
00226 LocalError segmentLocalPositionError = segment->localPositionError();
00227 LocalError segmentLocalDirectionError = segment->localDirectionError();
00228 bool segmentFound = false;
00229
00230 for(MuonCollection::const_iterator muon = muonCollectionH_->begin();
00231 muon != muonCollectionH_->end(); ++muon)
00232 {
00233 if (! muon->isMatchesValid())
00234 continue;
00235
00236 for(std::vector<MuonChamberMatch>::const_iterator chamberMatch = muon->matches().begin();
00237 chamberMatch != muon->matches().end(); ++chamberMatch) {
00238 for(std::vector<MuonSegmentMatch>::const_iterator segmentMatch = chamberMatch->segmentMatches.begin();
00239 segmentMatch != chamberMatch->segmentMatches.end(); ++segmentMatch)
00240 {
00241 if (fabs(segmentMatch->x - segmentLocalPosition.x() ) < 1E-6 &&
00242 fabs(segmentMatch->y - segmentLocalPosition.y() ) < 1E-6 &&
00243 fabs(segmentMatch->dXdZ - segmentLocalDirection.x()/segmentLocalDirection.z()) < 1E-6 &&
00244 fabs(segmentMatch->dYdZ - segmentLocalDirection.y()/segmentLocalDirection.z()) < 1E-6 &&
00245 fabs(segmentMatch->xErr - sqrt(segmentLocalPositionError.xx()) ) < 1E-6 &&
00246 fabs(segmentMatch->yErr - sqrt(segmentLocalPositionError.yy()) ) < 1E-6 &&
00247 fabs(segmentMatch->dXdZErr - sqrt(segmentLocalDirectionError.xx()) ) < 1E-6 &&
00248 fabs(segmentMatch->dYdZErr - sqrt(segmentLocalDirectionError.yy()) ) < 1E-6)
00249 {
00250 segmentFound = true;
00251 break;
00252 }
00253 }
00254 if (segmentFound) break;
00255 }
00256 if (segmentFound) break;
00257 }
00258
00259 if (segmentFound)
00260 hSegmentIsAssociatedBool->Fill(1.);
00261 else
00262 hSegmentIsAssociatedBool->Fill(0.);
00263 }
00264 }
00265
00266 void
00267 MuonIdDQM::endJob() {}
00268
00269 void MuonIdDQM::Fill(MonitorElement* me, float f) {
00270 if (fabs(f) > 900000) return;
00271
00272 me->Fill(f);
00273 }
00274
00275
00276 DEFINE_FWK_MODULE(MuonIdDQM);