#include <DQM/DTMonitorModule/src/DTEfficiencyTask.h>
Public Member Functions | |
void | analyze (const edm::Event &event, const edm::EventSetup &setup) |
void | beginJob (const edm::EventSetup &c) |
BeginJob. | |
void | beginLuminosityBlock (edm::LuminosityBlock const &lumiSeg, edm::EventSetup const &context) |
To reset the MEs. | |
DTEfficiencyTask (const edm::ParameterSet &pset) | |
Constructor. | |
void | endJob () |
Endjob. | |
virtual | ~DTEfficiencyTask () |
Destructor. | |
Private Member Functions | |
void | bookHistos (DTLayerId lId, int fisrtWire, int lastWire) |
void | fillHistos (DTLayerId lId, int firstWire, int lastWire, int missingWire, bool UnassHit) |
void | fillHistos (DTLayerId lId, int firstWire, int lastWire, int numWire) |
Private Attributes | |
bool | debug |
std::map< DTLayerId, std::vector< MonitorElement * > > | histosPerL |
edm::ParameterSet | parameters |
DQMStore * | theDbe |
std::string | theRecHitLabel |
std::string | theRecHits4DLabel |
Definition at line 31 of file DTEfficiencyTask.h.
DTEfficiencyTask::DTEfficiencyTask | ( | const edm::ParameterSet & | pset | ) |
Constructor.
Definition at line 43 of file DTEfficiencyTask.cc.
References debug, edm::ParameterSet::getUntrackedParameter(), parameters, and theDbe.
00043 { 00044 00045 debug = pset.getUntrackedParameter<bool>("debug","false"); 00046 00047 // Get the DQM needed services 00048 theDbe = edm::Service<DQMStore>().operator->(); 00049 theDbe->setCurrentFolder("DT/DTEfficiencyTask"); 00050 00051 parameters = pset; 00052 }
DTEfficiencyTask::~DTEfficiencyTask | ( | ) | [virtual] |
void DTEfficiencyTask::analyze | ( | const edm::Event & | event, | |
const edm::EventSetup & | setup | |||
) | [virtual] |
Implements edm::EDAnalyzer.
Definition at line 89 of file DTEfficiencyTask.cc.
References edmNew::copy(), funct::cos(), GenMuonPlsPt100GeV_cfg::cout, debug, lat::endl(), fillHistos(), edm::EventSetup::get(), i, iter, DTChamber::layer(), DTWireId::layerId(), DTRangeMapAccessor::layersBySuperLayer(), range, DTRecSegment2D::specificRecHits(), DTSuperLayerId::superlayer(), DTLayerId::superlayerId(), DTChamber::superLayers(), theRecHitLabel, theRecHits4DLabel, PV3DBase< T, PVType, FrameType >::theta(), GeomDet::toGlobal(), GeomDet::toLocal(), PV3DBase< T, PVType, FrameType >::x(), PV3DBase< T, PVType, FrameType >::y(), and PV3DBase< T, PVType, FrameType >::z().
00089 { 00090 00091 00092 if(debug) 00093 cout << "[DTEfficiencyTask] Analyze #Run: " << event.id().run() 00094 << " #Event: " << event.id().event() << endl; 00095 00096 00097 // Get the 4D segment collection from the event 00098 edm::Handle<DTRecSegment4DCollection> all4DSegments; 00099 event.getByLabel(theRecHits4DLabel, all4DSegments); 00100 00101 // Get the rechit collection from the event 00102 Handle<DTRecHitCollection> dtRecHits; 00103 event.getByLabel(theRecHitLabel, dtRecHits); 00104 00105 // Get the DT Geometry 00106 ESHandle<DTGeometry> dtGeom; 00107 setup.get<MuonGeometryRecord>().get(dtGeom); 00108 00109 // Loop over all chambers containing a segment 00110 DTRecSegment4DCollection::id_iterator chamberId; 00111 for (chamberId = all4DSegments->id_begin(); 00112 chamberId != all4DSegments->id_end(); 00113 ++chamberId) { 00114 00115 // Get the chamber 00116 const DTChamber* chamber = dtGeom->chamber(*chamberId); 00117 00118 // Get all 1D RecHits to be used for searches of hits not associated to segments and map them by wire 00119 const vector<const DTSuperLayer*> SLayers = chamber->superLayers(); 00120 map<DTWireId, int> wireAnd1DRecHits; 00121 for(vector<const DTSuperLayer*>::const_iterator superlayer = SLayers.begin(); 00122 superlayer != SLayers.end(); 00123 superlayer++) { 00124 DTRecHitCollection::range range = dtRecHits->get(DTRangeMapAccessor::layersBySuperLayer((*superlayer)->id())); 00125 // Loop over the rechits of this ChamberId 00126 for (DTRecHitCollection::const_iterator rechit = range.first; 00127 rechit!=range.second; 00128 ++rechit){ 00129 wireAnd1DRecHits[(*rechit).wireId()] = (*rechit).wireId().wire(); 00130 } 00131 } 00132 00133 00134 // Get the 4D segment range for the corresponding ChamerId 00135 DTRecSegment4DCollection::range range = all4DSegments->get(*chamberId); 00136 int nsegm = distance(range.first, range.second); 00137 if(debug) 00138 cout << " Chamber: " << *chamberId << " has " << nsegm 00139 << " 4D segments" << endl; 00140 00141 00142 // Loop over the rechits of this ChamerId 00143 for (DTRecSegment4DCollection::const_iterator segment4D = range.first; 00144 segment4D!=range.second; 00145 ++segment4D) { 00146 if(debug) 00147 cout << " == RecSegment dimension: " << (*segment4D).dimension() << endl; 00148 00149 // If Statio != 4 skip RecHits with dimension != 4 00150 // For the Station 4 consider 2D RecHits 00151 if((*chamberId).station() != 4 && (*segment4D).dimension() != 4) { 00152 if(debug) 00153 cout << "[DTEfficiencyTask]***Warning: RecSegment dimension is not 4 but " 00154 << (*segment4D).dimension() << ", skipping!" << endl; 00155 continue; 00156 } else if((*chamberId).station() == 4 && (*segment4D).dimension() != 2) { 00157 if(debug) 00158 cout << "[DTEfficiencyTask]***Warning: RecSegment dimension is not 2 but " 00159 << (*segment4D).dimension() << ", skipping!" << endl; 00160 continue; 00161 } 00162 00163 vector<DTRecHit1D> recHits1D; 00164 bool rPhi = false; 00165 bool rZ = false; 00166 00167 // Get 1D RecHits and select only events with 7 or 8 hits in phi and 3 or 4 hits in theta (if any) 00168 const DTChamberRecSegment2D* phiSeg = (*segment4D).phiSegment(); 00169 vector<DTRecHit1D> phiRecHits = phiSeg->specificRecHits(); 00170 rPhi = true; 00171 if(phiRecHits.size() < 7 || phiRecHits.size() > 8 ) { 00172 if(debug) 00173 cout << "[DTEfficiencyTask] Phi segments has: " << phiRecHits.size() 00174 << " hits, skipping" << endl; // FIXME: info output 00175 continue; 00176 } 00177 copy(phiRecHits.begin(), phiRecHits.end(), back_inserter(recHits1D)); 00178 const DTSLRecSegment2D* zSeg; 00179 if((*segment4D).dimension() == 4) { 00180 rZ = true; 00181 zSeg = (*segment4D).zSegment(); 00182 vector<DTRecHit1D> zRecHits = zSeg->specificRecHits(); 00183 if(zRecHits.size() < 3 || zRecHits.size() > 4 ) { 00184 if(debug) 00185 cout << "[DTEfficiencyTask] Theta segments has: " << zRecHits.size() 00186 << " hits, skipping" << endl; // FIXME: info output 00187 continue; 00188 } 00189 copy(zRecHits.begin(), zRecHits.end(), back_inserter(recHits1D)); 00190 } 00191 00192 // Skip the segment if it has more than 1 hit on the same layer 00193 vector<DTWireId> wireMap; 00194 for(vector<DTRecHit1D>::const_iterator recHit1D = recHits1D.begin(); 00195 recHit1D != recHits1D.end(); 00196 recHit1D++) { 00197 wireMap.push_back((*recHit1D).wireId()); 00198 } 00199 00200 bool hitsOnSameLayer = false; 00201 for(vector<DTWireId>::const_iterator channelId = wireMap.begin(); 00202 channelId != wireMap.end(); channelId++) { 00203 vector<DTWireId>::const_iterator next = channelId; 00204 next++; 00205 for(vector<DTWireId>::const_iterator ite = next; ite != wireMap.end(); ite++) { 00206 if((*channelId).layerId() == (*ite).layerId()) { 00207 hitsOnSameLayer = true; 00208 } 00209 } 00210 } 00211 if(hitsOnSameLayer) { 00212 if(debug) 00213 cout << "[DTEfficiencyTask] This RecHit has 2 hits on the same layer, skipping!" << endl; 00214 continue; 00215 } 00216 00217 00218 // Select 2D segments with angle smaller than 45 deg 00219 LocalVector phiDirectionInChamber = (*phiSeg).localDirection(); 00220 if(rPhi && fabs(phiDirectionInChamber.x()/phiDirectionInChamber.z()) > 1) { 00221 if(debug) { 00222 cout << " RPhi segment has angle > 45 deg, skipping! " << endl; 00223 cout << " Theta = " << phiDirectionInChamber.theta() << endl; 00224 } 00225 continue; 00226 } 00227 if(rZ) { 00228 LocalVector zDirectionInChamber = (*zSeg).localDirection(); 00229 if(fabs(zDirectionInChamber.y()/zDirectionInChamber.z()) > 1) { 00230 if(debug){ 00231 cout << " RZ segment has angle > 45 deg, skipping! " << endl; 00232 cout << " Theta = " << zDirectionInChamber.theta() << endl; 00233 } 00234 continue; 00235 } 00236 } 00237 00238 00239 // Skip if the 4D segment has only 10 hits 00240 if(recHits1D.size() == 10) { 00241 if(debug) 00242 cout << "[DTEfficiencyTask] 4D Segment with only 10 hits, skipping!" << endl; 00243 continue; 00244 } 00245 00246 00247 // Analyse the case of 11 recHits for MB1,MB2,MB3 and of 7 recHits for MB4 00248 if((rPhi && recHits1D.size() == 7) || (rZ && recHits1D.size() == 11)) { 00249 00250 if(debug) { 00251 if(rPhi && recHits1D.size() == 7) 00252 cout << "[DTEfficiencyTask] MB4 Segment with only 7 hits!" << endl; 00253 if(rZ && recHits1D.size() == 11) 00254 cout << "[DTEfficiencyTask] 4D Segment with only 11 hits!" << endl; 00255 } 00256 00257 // Find the layer without RecHits ---------------------------------------- 00258 const vector<const DTSuperLayer*> SupLayers = chamber->superLayers(); 00259 map<DTLayerId, bool> layerMap; 00260 map<DTWireId, float> wireAndPosInChamberAtLayerZ; 00261 // Loop over layers and wires to fill a map 00262 for(vector<const DTSuperLayer*>::const_iterator superlayer = SupLayers.begin(); 00263 superlayer != SupLayers.end(); 00264 superlayer++) { 00265 const vector<const DTLayer*> Layers = (*superlayer)->layers(); 00266 for(vector<const DTLayer*>::const_iterator layer = Layers.begin(); 00267 layer != Layers.end(); 00268 layer++) { 00269 layerMap.insert(make_pair((*layer)->id(), false)); 00270 const int firstWire = dtGeom->layer((*layer)->id())->specificTopology().firstChannel(); 00271 const int lastWire = dtGeom->layer((*layer)->id())->specificTopology().lastChannel(); 00272 for(int i=firstWire; i <= lastWire; i++) { 00273 DTWireId wireId((*layer)->id(), i); 00274 float wireX = (*layer)->specificTopology().wirePosition(wireId.wire()); 00275 LocalPoint wirePosInLay(wireX,0,0); 00276 GlobalPoint wirePosGlob = (*layer)->toGlobal(wirePosInLay); 00277 LocalPoint wirePosInChamber = chamber->toLocal(wirePosGlob); 00278 if((*superlayer)->id().superlayer() == 1 || (*superlayer)->id().superlayer() == 3) { 00279 wireAndPosInChamberAtLayerZ.insert(make_pair(wireId, wirePosInChamber.x())); 00280 } else { 00281 wireAndPosInChamberAtLayerZ.insert(make_pair(wireId, wirePosInChamber.y())); 00282 } 00283 } 00284 } 00285 } 00286 00287 // Loop over segment 1D RecHit 00288 map<DTLayerId, int> NumWireMap; 00289 for(vector<DTRecHit1D>::const_iterator recHit = recHits1D.begin(); 00290 recHit != recHits1D.end(); 00291 recHit++) { 00292 layerMap[(*recHit).wireId().layerId()]= true; 00293 NumWireMap[(*recHit).wireId().layerId()]= (*recHit).wireId().wire(); 00294 } 00295 00296 DTLayerId missLayerId; 00297 //Loop over the map and find the layer without hits 00298 for(map<DTLayerId, bool>::const_iterator iter = layerMap.begin(); 00299 iter != layerMap.end(); iter++) { 00300 if(!(*iter).second) missLayerId = (*iter).first; 00301 } 00302 if(debug) 00303 cout << "[DTEfficiencyTask] Layer without recHits is: " << missLayerId << endl; 00304 // ------------------------------------------------------- 00305 00306 00307 00308 const DTLayer* missLayer = chamber->layer(missLayerId); 00309 00310 LocalPoint missLayerPosInChamber = chamber->toLocal(missLayer->toGlobal(LocalPoint(0,0,0))); 00311 00312 // Segment position at Wire z in chamber local frame 00313 LocalPoint segPosAtZLayer = (*segment4D).localPosition() 00314 + (*segment4D).localDirection()*missLayerPosInChamber.z()/cos((*segment4D).localDirection().theta()); 00315 00316 DTWireId missWireId; 00317 00318 // Find the id of the cell without hit --------------------------------------------------- 00319 for(map<DTWireId, float>::const_iterator wireAndPos = wireAndPosInChamberAtLayerZ.begin(); 00320 wireAndPos != wireAndPosInChamberAtLayerZ.end(); 00321 wireAndPos++) { 00322 DTWireId wireId = (*wireAndPos).first; 00323 if(wireId.layerId() == missLayerId) { 00324 if(missLayerId.superlayerId().superlayer() == 1 || missLayerId.superlayerId().superlayer() == 3 ) { 00325 if(fabs(segPosAtZLayer.x() - (*wireAndPos).second) < 2.1) 00326 missWireId = wireId; 00327 } else { 00328 if(fabs(segPosAtZLayer.y() - (*wireAndPos).second) < 2.1) 00329 missWireId = wireId; 00330 } 00331 } 00332 } 00333 if(debug) 00334 cout << "[DTEfficiencyTask] Cell without hit is: " << missWireId << endl; 00335 // ---------------------------------------------------------- 00336 00337 00338 bool foundUnAssRechit = false; 00339 00340 // Look for unassociated hits in this cell 00341 if(wireAnd1DRecHits.find(missWireId) != wireAnd1DRecHits.end()) { 00342 if(debug) 00343 cout << "[DTEfficiencyTask] Unassociated Hit found!" << endl; 00344 foundUnAssRechit = true; 00345 } 00346 00347 00348 for(map<DTLayerId, bool>::const_iterator iter = layerMap.begin(); 00349 iter != layerMap.end(); iter++) { 00350 if((*iter).second) 00351 fillHistos((*iter).first, dtGeom->layer((*iter).first)->specificTopology().firstChannel(), dtGeom->layer((*iter).first)->specificTopology().lastChannel(), NumWireMap[(*iter).first]); 00352 else 00353 fillHistos((*iter).first, dtGeom->layer((*iter).first)->specificTopology().firstChannel(), dtGeom->layer((*iter).first)->specificTopology().lastChannel(), missWireId.wire(), foundUnAssRechit); 00354 } 00355 00356 } // End of the loop for segment with 7 or 11 recHits 00357 00358 if((rPhi && recHits1D.size() == 8) || (rZ && recHits1D.size() == 12)) { 00359 map<DTLayerId, int> NumWireMap; 00360 DTLayerId LayerID; 00361 for(vector<DTRecHit1D>::const_iterator recHit = recHits1D.begin(); 00362 recHit != recHits1D.end(); 00363 recHit++) { 00364 LayerID = (*recHit).wireId().layerId(); 00365 NumWireMap[LayerID]= (*recHit).wireId().wire(); 00366 } 00367 for(map<DTLayerId, int>::const_iterator iter = NumWireMap.begin(); 00368 iter != NumWireMap.end(); iter++) { 00369 fillHistos((*iter).first, dtGeom->layer((*iter).first)->specificTopology().firstChannel(), dtGeom->layer((*iter).first)->specificTopology().lastChannel(), NumWireMap[(*iter).first]); 00370 } 00371 } 00372 00373 } // End of loop over the 4D segments inside a sigle chamber 00374 } // End of loop over all tha chamber with at least a 4D segment in the event 00375 }
void DTEfficiencyTask::beginJob | ( | const edm::EventSetup & | c | ) | [virtual] |
BeginJob.
Reimplemented from edm::EDAnalyzer.
Definition at line 59 of file DTEfficiencyTask.cc.
References edm::ParameterSet::getParameter(), parameters, theRecHitLabel, and theRecHits4DLabel.
00059 { 00060 // the name of the 4D rec hits collection 00061 theRecHits4DLabel = parameters.getParameter<string>("recHits4DLabel"); 00062 // the name of the rechits collection 00063 theRecHitLabel = parameters.getParameter<string>("recHitLabel"); 00064 }
void DTEfficiencyTask::beginLuminosityBlock | ( | edm::LuminosityBlock const & | lumiSeg, | |
edm::EventSetup const & | context | |||
) | [virtual] |
To reset the MEs.
Reimplemented from edm::EDAnalyzer.
Definition at line 67 of file DTEfficiencyTask.cc.
References edm::ParameterSet::getUntrackedParameter(), histo, histosPerL, i, edm::LuminosityBlock::id(), edm::LuminosityBlockID::luminosityBlock(), parameters, and size.
00067 { 00068 00069 00070 if(lumiSeg.id().luminosityBlock()%parameters.getUntrackedParameter<int>("ResetCycle", 3) == 0) { 00071 for(map<DTLayerId, vector<MonitorElement*> > ::const_iterator histo = histosPerL.begin(); 00072 histo != histosPerL.end(); 00073 histo++) { 00074 int size = (*histo).second.size(); 00075 for(int i=0; i<size; i++){ 00076 (*histo).second[i]->Reset(); 00077 } 00078 } 00079 } 00080 00081 }
Definition at line 379 of file DTEfficiencyTask.cc.
References DQMStore::book1D(), DTSuperLayerId::chamberId(), GenMuonPlsPt100GeV_cfg::cout, debug, lat::endl(), combine::histos, histosPerL, DTLayerId::layer(), DTChamberId::sector(), DQMStore::setCurrentFolder(), DTChamberId::station(), DTSuperLayerId::superlayer(), DTLayerId::superlayerId(), theDbe, muonGeometry::wheel, and DTChamberId::wheel().
Referenced by fillHistos().
00379 { 00380 if(debug) 00381 cout << " Booking histos for L: " << lId << endl; 00382 00383 // Compose the chamber name 00384 stringstream wheel; wheel << lId.superlayerId().chamberId().wheel(); 00385 stringstream station; station << lId.superlayerId().chamberId().station(); 00386 stringstream sector; sector << lId.superlayerId().chamberId().sector(); 00387 stringstream superLayer; superLayer << lId.superlayerId().superlayer(); 00388 stringstream layer; layer << lId.layer(); 00389 00390 string lHistoName = 00391 "_W" + wheel.str() + 00392 "_St" + station.str() + 00393 "_Sec" + sector.str() + 00394 "_SL" + superLayer.str()+ 00395 "_L" + layer.str(); 00396 00397 theDbe->setCurrentFolder("DT/DTEfficiencyTask/Wheel" + wheel.str() + 00398 "/Station" + station.str() + 00399 "/Sector" + sector.str() + 00400 "/SuperLayer" +superLayer.str()); 00401 // Create the monitor elements 00402 vector<MonitorElement *> histos; 00403 // histo for hits associated to the 4D reconstructed segment 00404 histos.push_back(theDbe->book1D("hEffOccupancy"+lHistoName, "4D segments recHits occupancy",lastWire-firstWire+1, firstWire-0.5, lastWire+0.5)); 00405 // histo for hits not associated to the segment 00406 histos.push_back(theDbe->book1D("hEffUnassOccupancy"+lHistoName, "4D segments recHits and Hits not associated occupancy",lastWire-firstWire+1, firstWire-0.5, lastWire+0.5)); 00407 // histo for cells associated to the 4D reconstructed segment 00408 histos.push_back(theDbe->book1D("hRecSegmOccupancy"+lHistoName, "4D segments cells occupancy",lastWire-firstWire+1, firstWire-0.5, lastWire+0.5)); 00409 00410 histosPerL[lId] = histos; 00411 }
Endjob.
Reimplemented from edm::EDAnalyzer.
Definition at line 84 of file DTEfficiencyTask.cc.
References DQMStore::rmdir(), and theDbe.
void DTEfficiencyTask::fillHistos | ( | DTLayerId | lId, | |
int | firstWire, | |||
int | lastWire, | |||
int | missingWire, | |||
bool | UnassHit | |||
) | [private] |
Definition at line 428 of file DTEfficiencyTask.cc.
References bookHistos(), combine::histos, and histosPerL.
00431 { 00432 if(histosPerL.find(lId) == histosPerL.end()){ 00433 bookHistos(lId, firstWire, lastWire); 00434 } 00435 vector<MonitorElement *> histos = histosPerL[lId]; 00436 if(unassHit) 00437 histos[1]->Fill(missingWire); 00438 histos[2]->Fill(missingWire); 00439 }
void DTEfficiencyTask::fillHistos | ( | DTLayerId | lId, | |
int | firstWire, | |||
int | lastWire, | |||
int | numWire | |||
) | [private] |
Definition at line 415 of file DTEfficiencyTask.cc.
References bookHistos(), combine::histos, and histosPerL.
Referenced by analyze().
00417 { 00418 if(histosPerL.find(lId) == histosPerL.end()){ 00419 bookHistos(lId, firstWire, lastWire); 00420 } 00421 vector<MonitorElement *> histos = histosPerL[lId]; 00422 histos[0]->Fill(numWire); 00423 histos[1]->Fill(numWire); 00424 histos[2]->Fill(numWire); 00425 }
bool DTEfficiencyTask::debug [private] |
Definition at line 58 of file DTEfficiencyTask.h.
Referenced by analyze(), bookHistos(), and DTEfficiencyTask().
std::map<DTLayerId, std::vector<MonitorElement*> > DTEfficiencyTask::histosPerL [private] |
Definition at line 75 of file DTEfficiencyTask.h.
Referenced by beginLuminosityBlock(), bookHistos(), and fillHistos().
Definition at line 66 of file DTEfficiencyTask.h.
Referenced by beginJob(), beginLuminosityBlock(), and DTEfficiencyTask().
DQMStore* DTEfficiencyTask::theDbe [private] |
Definition at line 55 of file DTEfficiencyTask.h.
Referenced by bookHistos(), DTEfficiencyTask(), and endJob().
std::string DTEfficiencyTask::theRecHitLabel [private] |
std::string DTEfficiencyTask::theRecHits4DLabel [private] |