00001
00002
00003
00004
00005
00006 #include <TRandom.h>
00007 #include <string>
00008 #include <sstream>
00009 #include <set>
00010 #include "DQM/RPCMonitorDigi/interface/RPCMonitorDigi.h"
00011 #include "DQM/RPCMonitorDigi/interface/utils.h"
00013 #include "DataFormats/RPCDigi/interface/RPCDigi.h"
00014 #include "DataFormats/RPCDigi/interface/RPCDigiCollection.h"
00015 #include "DataFormats/MuonDetId/interface/RPCDetId.h"
00016 #include "DataFormats/RPCRecHit/interface/RPCRecHitCollection.h"
00017 #include "DataFormats/GeometrySurface/interface/LocalError.h"
00018 #include "DataFormats/GeometryVector/interface/LocalPoint.h"
00020 #include "Geometry/RPCGeometry/interface/RPCGeometry.h"
00021 #include "Geometry/Records/interface/MuonGeometryRecord.h"
00022 #include "Geometry/CommonDetUnit/interface/GeomDet.h"
00023 #include "Geometry/RPCGeometry/interface/RPCGeomServ.h"
00025 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00026
00027 using namespace std;
00028 using namespace edm;
00029 RPCMonitorDigi::RPCMonitorDigi( const ParameterSet& pset ):counter(0){
00030 foundHitsInChamber.clear();
00031 nameInLog = pset.getUntrackedParameter<string>("moduleLogName", "RPC_DQM");
00032
00033 saveRootFile = pset.getUntrackedParameter<bool>("DigiDQMSaveRootFile", false);
00034 mergeRuns_ = pset.getUntrackedParameter<bool>("MergeDifferentRuns", false);
00035 saveRootFileEventsInterval = pset.getUntrackedParameter<int>("DigiEventsInterval", 10000);
00036 RootFileName = pset.getUntrackedParameter<string>("RootFileNameDigi", "RPCMonitor.root");
00037
00038 dqmshifter = pset.getUntrackedParameter<bool>("dqmshifter", false);
00039 dqmexpert = pset.getUntrackedParameter<bool>("dqmexpert", false);
00040 dqmsuperexpert = pset.getUntrackedParameter<bool>("dqmsuperexpert", false);
00041 }
00042
00043 RPCMonitorDigi::~RPCMonitorDigi(){}
00044
00045 void RPCMonitorDigi::beginJob(EventSetup const&){
00046 LogInfo (nameInLog) <<"[RPCMonitorDigi]: Begin job" ;
00047
00049 dbe = Service<DQMStore>().operator->();
00050
00051 GlobalHistogramsFolder="RPC/RecHits/SummaryHistograms";
00052 dbe->setCurrentFolder(GlobalHistogramsFolder);
00053
00054 ClusterSize_for_Barrel = dbe->book1D("ClusterSize_for_Barrel", "ClusterSize for Barrel", 20, 0.5, 20.5);
00055 ClusterSize_for_EndcapPositive = dbe->book1D("ClusterSize_for_EndcapPositive", "ClusterSize for PositiveEndcap", 20, 0.5, 20.5);
00056 ClusterSize_for_EndcapNegative = dbe->book1D("ClusterSize_for_EndcapNegative", "ClusterSize for NegativeEndcap", 20, 0.5, 20.5);
00057
00058 ClusterSize_for_BarrelandEndcaps = dbe->book1D("ClusterSize_for_BarrelandEndcap", "ClusterSize for Barrel&Endcaps", 20, 0.5, 20.5);
00059
00060 NumberOfDigis_for_Barrel = dbe -> book1D("NumberOfDigi_for_Barrel", "NumberOfDigis for Barrel", 200, 0.5, 200.5);
00061 NumberOfDigis_for_EndcapPositive = dbe -> book1D("NumberOfDigi_for_EndcapPositive", "NumberOfDigis for Endcap Positive", 200, 0.5, 200.5);
00062 NumberOfDigis_for_EndcapNegative = dbe -> book1D("NumberOfDigi_for_EndcapNegative", "NumberOfDigis for Endcap Negative", 200, 0.5, 200.5);
00063
00064 NumberOfClusters_for_Barrel = dbe -> book1D("NumberOfClusters_for_Barrel", "NumberOfClusters for Barrel", 20, 0.5, 20.5);
00065 NumberOfClusters_for_EndcapPositive = dbe -> book1D("NumberOfClusters_for_EndcapPositive", "NumberOfClusters for Endcap Positive", 20, 0.5, 20.5);
00066 NumberOfClusters_for_EndcapNegative = dbe -> book1D("NumberOfClusters_for_EndcapNegative", "NumberOfClusters for Endcap Negative", 20, 0.5, 20.5);
00067
00068 SameBxDigisMeBarrel_ = dbe->book1D("SameBXDigis_Barrel", "Digis with same bx", 20, 0.5, 20.5);
00069
00070
00071
00072 BarrelOccupancy = dbe -> book2D("Occupancy_for_Barrel", "Barrel Occupancy Wheel vs Sector", 12, 0.5, 12.5, 5, -2.5, 2.5);
00073 EndcapPositiveOccupancy = dbe -> book2D("Occupancy_for_EndcapPositive", "Endcap Positive Occupancy Disk vs Sector", 6, 0.5, 6.5, 8, -4, 4);
00074 EndcapNegativeOccupancy = dbe -> book2D("Occupancy_for_EndcapNegative", "Endcap Negative Occupancy Disk vs Sector", 6, 0.5, 6.5, 8, -4, 4);
00075
00076 stringstream binLabel;
00077 for (int i = 1; i<13; i++){
00078 binLabel.str("");
00079 binLabel<<"Sec"<<i;
00080 BarrelOccupancy -> setBinLabel(i, binLabel.str(), 1);
00081 if(i<6){
00082 binLabel.str("");
00083 binLabel<<"Wheel"<<i-3;
00084 BarrelOccupancy -> setBinLabel(i, binLabel.str(), 2);
00085 }
00086 if(i<7) {
00087 binLabel.str("");
00088 binLabel<<"Sec"<<i;
00089 EndcapPositiveOccupancy -> setBinLabel(i, binLabel.str(), 1);
00090 EndcapNegativeOccupancy -> setBinLabel(i, binLabel.str(), 1);
00091 }
00092 if(i<9){
00093 binLabel.str("");
00094 if (i<5) binLabel<<"Disk"<<(i-1)-4; else binLabel<<"Disk"<<i-4;
00095 EndcapPositiveOccupancy -> setBinLabel(i, binLabel.str(), 2);
00096 EndcapNegativeOccupancy -> setBinLabel(i, binLabel.str(), 2);
00097 }
00098 }
00099 }
00100
00101 void RPCMonitorDigi::beginRun(const Run& r, const EventSetup& c){
00102 LogInfo (nameInLog) <<"Begin Run " ;
00103
00104
00105 if (mergeRuns_) return;
00106
00107
00108
00109 for (map<uint32_t, map<string,MonitorElement*> >::const_iterator meItr = meCollection.begin();
00110 meItr!= meCollection.end(); meItr++){
00111 for (map<string,MonitorElement*>::const_iterator Itr = (*meItr).second.begin();
00112 Itr!= (*meItr).second.end(); Itr++){
00113 (*Itr).second->Reset();
00114 }
00115 }
00116
00117 for (map<pair<int,int>, map<string, MonitorElement*> >::const_iterator meItr = meWheelDisk.begin();
00118 meItr!= meWheelDisk.end(); meItr++){
00119 for (map<string,MonitorElement*>::const_iterator Itr = (*meItr).second.begin();
00120 Itr!= (*meItr).second.end(); Itr++){
00121 (*Itr).second->Reset();
00122 }
00123 }
00124
00125
00126 ClusterSize_for_Barrel->Reset();
00127 ClusterSize_for_EndcapPositive ->Reset();
00128 ClusterSize_for_EndcapNegative->Reset();
00129 ClusterSize_for_BarrelandEndcaps->Reset();
00130
00131 NumberOfDigis_for_Barrel ->Reset();
00132 NumberOfDigis_for_EndcapPositive ->Reset();
00133 NumberOfDigis_for_EndcapNegative->Reset();
00134
00135 NumberOfClusters_for_Barrel ->Reset();
00136 NumberOfClusters_for_EndcapPositive->Reset();
00137 NumberOfClusters_for_EndcapNegative ->Reset();
00138
00139
00140 SameBxDigisMeBarrel_->Reset();
00141
00142
00143
00144 BarrelOccupancy ->Reset();
00145 EndcapPositiveOccupancy ->Reset();
00146 EndcapNegativeOccupancy->Reset();
00147 }
00148
00149 void RPCMonitorDigi::endJob(void)
00150 {
00151 if(saveRootFile) dbe->save(RootFileName);
00152 dbe = 0;
00153 }
00154
00155 void RPCMonitorDigi::analyze(const Event& iEvent,const EventSetup& iSetup ){
00156 counter++;
00157 LogInfo (nameInLog) <<"[RPCMonitorDigi]: Beginning analyzing event " << counter;
00158
00159 map<uint32_t, bool >::iterator mapItrReset;
00160 for (mapItrReset = foundHitsInChamber.begin(); mapItrReset != foundHitsInChamber.end(); ++ mapItrReset) {
00161 mapItrReset->second=false;
00162 }
00163
00165 ESHandle<RPCGeometry> rpcGeo;
00166 iSetup.get<MuonGeometryRecord>().get(rpcGeo);
00167
00169 Handle<RPCDigiCollection> rpcdigis;
00170 iEvent.getByType(rpcdigis);
00171
00173 Handle<RPCRecHitCollection> rpcHits;
00174 iEvent.getByType(rpcHits);
00175
00176 map<int,int> bxMap;
00177 int totalNumberDigi[3][1];
00178
00179 for (int k=1; k<=3;k++){
00180 totalNumberDigi[k][1]=0;
00181 }
00182
00183 RPCDigiCollection::DigiRangeIterator collectionItr;
00184
00185 for(collectionItr=rpcdigis->begin(); collectionItr!=rpcdigis->end(); ++collectionItr){
00186
00187 RPCDetId detId=(*collectionItr ).first;
00188 uint32_t id=detId();
00189
00190 const GeomDet* gdet=rpcGeo->idToDet(detId);
00191 const BoundPlane & surface = gdet->surface();
00192
00193
00194 RPCGeomServ RPCname(detId);
00195 string nameRoll = RPCname.name();
00196
00197 stringstream os;
00198
00199 rpcdqm::utils prova;
00200 int nr = prova.detId2RollNr(detId);
00201
00202 std::map<uint32_t, std::map<std::string,MonitorElement*> >::iterator meItr = meCollection.find(id);
00203
00204 if (meItr == meCollection.end() || (meCollection.size()==0)) {
00205 meCollection[id]=bookDetUnitME(detId,iSetup );
00206 }
00207
00208 std::map<std::string, MonitorElement*> meMap=meCollection[id];
00209
00210 int region=detId.region();
00211 int ring;
00212 string regionName;
00213 string ringType;
00214 if(detId.region() == 0) {
00215 regionName="Barrel";
00216 ringType = "Wheel";
00217 ring = detId.ring();
00218 }else if (detId.region() == -1){
00219 regionName="Encap-";
00220 ringType = "Disk";
00221 ring = detId.region()*detId.station();
00222 }else{
00223 regionName="Encap+";
00224 ringType = "Disk";
00225 ring = detId.station();
00226 }
00227 std::pair<int,int> regionRing(region,ring);
00228 std::map<std::pair<int,int>, std::map<std::string,MonitorElement*> >::iterator meRingItr = meWheelDisk.find(regionRing);
00229 if (meRingItr == meWheelDisk.end() || (meWheelDisk.size()==0)) {
00230 meWheelDisk[regionRing]=bookRegionRing(region,ring);
00231 }
00232
00233 map<std::string, MonitorElement*> meRingMap=meWheelDisk[regionRing];
00234
00235 vector<int> strips;
00236 vector<int> bxs;
00237 strips.clear();
00238 bxs.clear();
00239
00240
00241 typedef pair<RPCRecHitCollection::const_iterator, RPCRecHitCollection::const_iterator> rangeRecHits;
00242 rangeRecHits recHitCollection = rpcHits->get(detId);
00243
00244 int numberOfDigi= 0;
00245
00246
00247 RPCDigiCollection::const_iterator digiItr;
00248
00249 for (digiItr =(*collectionItr ).second.first;digiItr != (*collectionItr ).second.second; ++digiItr){
00250 int strip= (*digiItr).strip();
00251 int bx=(*digiItr).bx();
00252
00253
00254
00255 vector<int>::const_iterator itrStrips = find(strips.begin(),strips.end(),strip);
00256 if(itrStrips!=strips.end() && strips.size()!=0) continue;
00257 ++numberOfDigi;
00258 strips.push_back(strip);
00259
00260
00261 vector<int>::const_iterator existingBX = find(bxs.begin(),bxs.end(),bx);
00262 if(existingBX==bxs.end())bxs.push_back(bx);
00263
00264
00265 map<int,int>::const_iterator bxItr = bxMap.find((*digiItr).bx());
00266 if (bxItr == bxMap.end()|| bxMap.size()==0 )bxMap[(*digiItr).bx()]=1;
00267 else bxMap[(*digiItr).bx()]++;
00268
00269
00270 os.str("");
00271 os<<"1DOccupancy_"<<ringType<<"_"<<ring;
00272 string meId = os.str();
00273 meRingMap[meId]->Fill(detId.sector());
00274 os.str("");
00275 os<<"Sec"<<detId.sector();
00276 meRingMap[meId] -> setBinLabel(detId.sector(), os.str(), 1);
00277
00278 os.str("");
00279 os<<"BxDistribution_"<<ringType<<"_"<<ring<<"_Sector_"<<detId.sector();
00280 meMap[os.str()]->Fill(bx);
00281
00282 os.str("");
00283 os<<"BxDistribution_"<<ringType<<"_"<<ring;
00284 meRingMap[os.str()]->Fill(bx);
00285
00286 if(detId.region()==0)
00287 BarrelOccupancy -> Fill(detId.sector(), ring);
00288 else if(detId.region()==1)
00289 EndcapPositiveOccupancy -> Fill(detId.sector(), ring);
00290 else if(detId.region()==-1)
00291 EndcapNegativeOccupancy -> Fill(detId.sector(), ring);
00292
00293 os.str("");
00294 os<<"Occupancy_"<<ringType<<"_"<<ring<<"_Sector_"<<detId.sector();
00295 meMap[os.str()]->Fill(strip, nr);
00296
00297 string Yaxis=nameRoll;
00298 if (detId.region()==0){
00299 Yaxis.erase (1,1);
00300 Yaxis.erase(0,3);
00301 Yaxis.replace(Yaxis.find("S"),4,"");
00302 Yaxis.erase(Yaxis.find("_")+2,8);
00303 }else{
00304 Yaxis.erase(0,8);
00305 }
00306 meMap[os.str()]->setBinLabel(nr, Yaxis, 2);
00307
00308 os.str("");
00309 os<<"Occupancy_"<<nameRoll;
00310 meMap[os.str()]->Fill(strip);
00311
00312 if(dqmexpert){
00313 os.str("");
00314 os<<"BXN_"<<nameRoll;
00315 meMap[os.str()]->Fill(bx);
00316 }
00317
00318 if (dqmsuperexpert) {
00319 os.str("");
00320 os<<"BXN_vs_strip_"<<nameRoll;
00321 meMap[os.str()]->Fill(strip,bx);
00322 }
00323 }
00324
00325 if (dqmexpert){
00326
00327 for(unsigned int stripIter=0;stripIter<strips.size(); ++stripIter){
00328 if(stripIter< (strips.size()-1) && strips[stripIter+1]==strips[stripIter]+1) {
00329 os.str("");
00330 os<<"CrossTalkHigh_"<<nameRoll;
00331 meMap[os.str()]->Fill(strips[stripIter]);
00332 }
00333 if(stripIter >0 && strips[stripIter-1]==strips[stripIter]-1) {
00334 os.str("");
00335 os<<"CrossTalkLow_"<<nameRoll;
00336 meMap[os.str()]->Fill(strips[stripIter]);
00337 }
00338 }
00339
00340 os.str("");
00341 os<<"NumberOfDigi_"<<nameRoll;
00342 meMap[os.str()]->Fill(numberOfDigi);
00343
00344 os.str("");
00345 os<<"BXWithData_"<<nameRoll;
00346 meMap[os.str()]->Fill(bxs.size());
00347 }
00348
00349 os.str("");
00350 os<<"BXWithData_"<<ringType<<"_"<<ring<<"_Sector_"<<detId.sector();
00351 meMap[os.str()]->Fill(bxs.size());
00352
00353 os.str("");
00354 os<<"NumberOfDigi_"<<ringType<<"_"<<ring<<"_Sector_"<<detId.sector();
00355 meMap[os.str()]->Fill(numberOfDigi);
00356
00357 totalNumberDigi[detId.region()+2][1]+= numberOfDigi;
00358
00359
00360 if(recHitCollection.first==recHitCollection.second ){
00361
00362 if(dqmsuperexpert) {
00363 os.str("");
00364 os<<"MissingHits_"<<nameRoll;
00365 meMap[os.str()]->Fill((int)(counter), 1.0);
00366 }
00367 }else{
00368 foundHitsInChamber[id]=true;
00369
00370 RPCRecHitCollection::const_iterator it;
00371 int numberOfHits=0;
00372 int numbOfClusters=0;
00373
00374 for (it = recHitCollection.first; it != recHitCollection.second ; it++) {
00375 numbOfClusters++;
00376 RPCDetId detIdRecHits=it->rpcId();
00377 LocalError error=it->localPositionError();
00378 LocalPoint point=it->localPosition();
00379 GlobalPoint globalHitPoint=surface.toGlobal(point);
00380
00381 os.str("");
00382 os<<"OccupancyXY_"<<ringType<<"_"<<ring;
00383 meRingMap[os.str()]->Fill(globalHitPoint.x(),globalHitPoint.y());
00384
00385 int mult=it->clusterSize();
00386 int firstStrip=it->firstClusterStrip();
00387 float xposition=point.x();
00388
00389 ClusterSize_for_BarrelandEndcaps -> Fill(mult);
00390
00391 if(detId.region() == 0) {
00392 ClusterSize_for_Barrel -> Fill(mult);
00393 } else if (detId.region() == -1) {
00394 if(mult<=10) ClusterSize_for_EndcapNegative -> Fill(mult);
00395 else ClusterSize_for_EndcapNegative -> Fill(11);
00396 } else if (detId.region() == 1) {
00397 if(mult<=10) ClusterSize_for_EndcapPositive -> Fill(mult);
00398 else ClusterSize_for_EndcapPositive -> Fill(11);
00399 }
00400
00401
00402 os.str("");
00403 os<<"ClusterSize_"<<ringType<<"_"<<ring;
00404 meRingMap[os.str()] -> Fill(mult);
00405
00406 os.str("");
00407 os<<"ClusterSize_"<<ringType<<"_"<<ring<<"_Sector_"<<detId.sector();
00408 meMap[os.str()] -> Fill(mult);
00409
00410 if (dqmsuperexpert) {
00411 int centralStrip=firstStrip;
00412 if(mult%2) {
00413 centralStrip+= mult/2;
00414 }else{
00415 float x = gRandom->Uniform(2);
00416 centralStrip+=(x<1)? (mult/2)-1 : (mult/2);
00417 }
00418 os.str("");
00419 os<<"ClusterSize_vs_CentralStrip_"<<nameRoll;
00420 meMap[os.str()]->Fill(centralStrip,mult);
00421
00422 for(int index=0; index<mult; ++index){
00423 os.str("");
00424 os<<"ClusterSize_vs_Strip_"<<nameRoll;
00425 meMap[os.str()]->Fill(firstStrip+index,mult);
00426 }
00427
00428 os.str("");
00429 os<<"ClusterSize_vs_LowerSrip_"<<nameRoll;
00430 meMap[os.str()]->Fill(firstStrip,mult);
00431
00432 os.str("");
00433 os<<"ClusterSize_vs_HigherStrip_"<<nameRoll;
00434 meMap[os.str()]->Fill(firstStrip+mult-1,mult);
00435
00436 os.str("");
00437 os<<"RecHitX_vs_dx_"<<nameRoll;
00438 meMap[os.str()]->Fill(xposition,error.xx());
00439 }
00440
00441 if(dqmexpert) {
00442 os.str("");
00443 os<<"ClusterSize_"<<nameRoll;
00444 meMap[os.str()]->Fill(mult);
00445
00446 os.str("");
00447 os<<"RecHitXPosition_"<<nameRoll;
00448 meMap[os.str()]->Fill(xposition);
00449
00450 os.str("");
00451 os<<"RecHitDX_"<<nameRoll;
00452 meMap[os.str()]->Fill(error.xx());
00453 }
00454 numberOfHits++;
00455 }
00456
00457
00458 if(dqmexpert) {
00459 os.str("");
00460 os<<"NumberOfClusters_"<<nameRoll;
00461 meMap[os.str()]->Fill(numbOfClusters);
00462
00463 if(numberOfHits>5) numberOfHits=16;
00464 os.str("");
00465 os<<"RecHitCounter_"<<nameRoll;
00466 meMap[os.str()]->Fill(numberOfHits);
00467 }
00468
00469 if(detId.region()==0)
00470 NumberOfClusters_for_Barrel -> Fill(numbOfClusters);
00471 else if (detId.region()==1)
00472 NumberOfClusters_for_EndcapPositive -> Fill(numbOfClusters);
00473 else if(detId.region()==-1)
00474 NumberOfClusters_for_EndcapNegative -> Fill(numbOfClusters);
00475 os.str("");
00476 os<<"NumberOfClusters_"<<ringType<<"_"<<ring<<"_Sector_"<<detId.sector();
00477 meMap[os.str()]->Fill(numbOfClusters);
00478 }
00479 }
00480
00481
00482 NumberOfDigis_for_Barrel ->Fill(totalNumberDigi[2][1]);
00483 NumberOfDigis_for_EndcapPositive ->Fill(totalNumberDigi[3][1]);
00484 NumberOfDigis_for_EndcapNegative ->Fill(totalNumberDigi[1][1]);
00485
00486
00487 for (map<int, int>::const_iterator myItr= bxMap.begin();
00488 myItr!=bxMap.end(); myItr++){
00489 SameBxDigisMeBarrel_ ->Fill((*myItr).second);
00490 }
00491 }