00001
00011 #include <DQM/RPCMonitorDigi/interface/RPCMonitorEfficiency.h>
00012
00014 #include "FWCore/Framework/interface/ESHandle.h"
00015
00016 #include "Geometry/DTGeometry/interface/DTGeometry.h"
00017 #include "Geometry/RPCGeometry/interface/RPCGeometry.h"
00018 #include "Geometry/CommonTopologies/interface/RectangularStripTopology.h"
00019 #include "Geometry/CommonDetUnit/interface/GeomDet.h"
00020 #include "Geometry/Records/interface/MuonGeometryRecord.h"
00021
00023 #include "DataFormats/RPCDigi/interface/RPCDigi.h"
00024 #include "DataFormats/RPCDigi/interface/RPCDigiCollection.h"
00025 #include "DataFormats/MuonDetId/interface/RPCDetId.h"
00026 #include "DataFormats/DTRecHit/interface/DTRecSegment4DCollection.h"
00027 #include "DataFormats/MuonDetId/interface/DTChamberId.h"
00028 #include "DataFormats/GeometryVector/interface/LocalPoint.h"
00029
00030
00031
00032 #include <cmath>
00033
00034
00035 class DTStationIndex{
00036 public:
00037 DTStationIndex():_region(0),_wheel(0),_sector(0),_station(0){}
00038 DTStationIndex(int region, int wheel, int sector, int station) :
00039 _region(region),
00040 _wheel(wheel),
00041 _sector(sector),
00042 _station(station){}
00043 ~DTStationIndex(){}
00044 int region() const {return _region;}
00045 int wheel() const {return _wheel;}
00046 int sector() const {return _sector;}
00047 int station() const {return _station;}
00048 bool operator<(const DTStationIndex& dtind) const{
00049 if(dtind.region()!=this->region())
00050 return dtind.region()<this->region();
00051 else if(dtind.wheel()!=this->wheel())
00052 return dtind.wheel()<this->wheel();
00053 else if(dtind.sector()!=this->sector())
00054 return dtind.sector()<this->sector();
00055 else if(dtind.station()!=this->station())
00056 return dtind.station()<this->station();
00057 return false;
00058 }
00059 private:
00060 int _region;
00061 int _wheel;
00062 int _sector;
00063 int _station;
00064 };
00065
00066
00067
00068
00069
00070
00071 RPCMonitorEfficiency::RPCMonitorEfficiency( const edm::ParameterSet& pset ){
00072 std::map<RPCDetId, int> buff;
00073 counter.clear();
00074 counter.reserve(3);
00075
00076 counter.push_back(buff);
00077
00078 counter.push_back(buff);
00079
00080 counter.push_back(buff);
00081 totalcounter.clear();
00082 totalcounter.reserve(3);
00083 totalcounter[0]=0;
00084 totalcounter[1]=0;
00085 totalcounter[2]=0;
00086 theRecHits4DLabel = pset.getParameter<std::string>("recHits4DLabel");
00087 digiLabel=pset.getParameter<std::string>("digiLabel");
00088 EffSaveRootFile = pset.getUntrackedParameter<bool>("EffSaveRootFile", false);
00089 EffSaveRootFileEventsInterval = pset.getUntrackedParameter<int>("EffEventsInterval", 10000);
00090 EffRootFileName = pset.getUntrackedParameter<std::string>("EffRootFileName", "RPCEfficiency.root");
00091
00093 dbe = edm::Service<DQMStore>().operator->();
00094
00095
00096 dbe->showDirStructure();
00097
00098 _idList.clear();
00099
00100 }
00101
00102 void RPCMonitorEfficiency::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup ){
00103 std::map<RPCDetId, int> buff;
00104 char layerLabel[128];
00105 char meIdRPC [128];
00106 char meIdDT [128];
00107 float dx=0.,dy=0.,dz=0.,Xo=0.,Yo=0.,X=0.,Y=0.,Z=0.,p1x=0.,p2x=0.,p3x=0.,p4x=0.,p1z=0.,p2z=0.,p3z=0.,p4z=0.,dx3=0.,dy3=0.,dz3=0.,Xo3=0.,Yo3=0.,x3=0.,x4=0.,z3=0.,z4=0.,m3=0.,m4=0.,xc=0.,zc=0.,b3=0.,b4=0.,w3=0.,w4=0.;
00108
00109 float widestrip=5.;
00110 float widestripsRB4=8.;
00111 float circError=3.;
00112 float angle=0.01;
00113
00114 edm::ESHandle<DTGeometry> dtGeo;
00115 iSetup.get<MuonGeometryRecord>().get(dtGeo);
00116
00117 edm::ESHandle<RPCGeometry> rpcGeo;
00118 iSetup.get<MuonGeometryRecord>().get(rpcGeo);
00119
00120 edm::Handle<DTRecSegment4DCollection> all4DSegments;
00121 iEvent.getByLabel(theRecHits4DLabel, all4DSegments);
00122
00123 edm::Handle<RPCDigiCollection> rpcDigis;
00124 iEvent.getByLabel(digiLabel, rpcDigis);
00125
00126 std::map<DTStationIndex,std::set<RPCDetId> > rollstore;
00127 for (TrackingGeometry::DetContainer::const_iterator it=rpcGeo->dets().begin();it<rpcGeo->dets().end();it++){
00128 RPCRoll* ir = dynamic_cast<RPCRoll*>(*it);
00129 RPCDetId rpcId = ir->id();
00130 int region=rpcId.region();
00131 int wheel=rpcId.ring();
00132 int sector=rpcId.sector();
00133 int station=rpcId.station();
00134
00135 DTStationIndex ind(region,wheel,sector,station);
00136
00137 std::set<RPCDetId> myrolls;
00138 if (rollstore.find(ind)!=rollstore.end()){
00139 myrolls=rollstore[ind];
00140 }
00141 myrolls.insert(rpcId);
00142 rollstore[ind]=myrolls;
00143 }
00144
00145
00146 if(all4DSegments->size()>0){
00147
00148
00149
00150 std::map<DTChamberId,int> scounter;
00151 DTRecSegment4DCollection::const_iterator segment;
00152
00153
00154 for (segment = all4DSegments->begin();segment!=all4DSegments->end(); ++segment){
00155 scounter[segment->chamberId()]++;
00156 }
00157
00158
00159
00160
00161 for (segment = all4DSegments->begin(); segment != all4DSegments->end(); ++segment){
00162 DTChamberId DTId = segment->chamberId();
00163
00164
00165
00166
00167
00168
00169 if(scounter[DTId] == 1){
00170
00171 int dtWheel = DTId.wheel();
00172 int dtStation = DTId.station();
00173 int dtSector = DTId.sector();
00174
00175 LocalPoint segmentPosition= segment->localPosition();
00176 LocalVector segmentDirection=segment->localDirection();
00177
00178 const GeomDet* gdet=dtGeo->idToDet(segment->geographicalId());
00179 const BoundPlane & DTSurface = gdet->surface();
00180
00181
00182
00183 if(segment->dimension()==4){
00184 Xo=segmentPosition.x();
00185 Yo=segmentPosition.y();
00186 dx=segmentDirection.x();
00187 dy=segmentDirection.y();
00188 dz=segmentDirection.z();
00189
00190 std::set<RPCDetId> rollsForThisDT =
00191 rollstore[DTStationIndex(0,dtWheel,dtSector,dtStation)];
00192
00193 for (std::set<RPCDetId>::iterator iteraRoll = rollsForThisDT.begin();iteraRoll != rollsForThisDT.end(); iteraRoll++){
00194 const RPCRoll* rollasociated = rpcGeo->roll(*iteraRoll);
00195
00196 const BoundPlane & RPCSurface = rollasociated->surface();
00197
00198
00199
00200
00201
00202 GlobalPoint CenterPointRollGlobal = RPCSurface.toGlobal(LocalPoint(0,0,0));
00203
00204
00205 LocalPoint CenterRollinDTFrame = DTSurface.toLocal(CenterPointRollGlobal);
00206
00207
00208 float D=CenterRollinDTFrame.z();
00209
00210
00211 X=Xo+dx*D/dz;
00212 Y=Yo+dy*D/dz;
00213 Z=D;
00214
00215 const RectangularStripTopology* top_= dynamic_cast<const RectangularStripTopology*> (&(rollasociated->topology()));
00216 LocalPoint xmin = top_->localPosition(0.);
00217 LocalPoint xmax = top_->localPosition((float)rollasociated->nstrips());
00218 float rsize = fabs( xmax.x()-xmin.x() )*0.5;
00219 float stripl = top_->stripLength();
00220
00221
00222
00223
00224
00225 GlobalPoint GlobalPointExtrapolated =
00226 DTSurface.toGlobal(LocalPoint(X,Y,Z));
00227
00228
00229 LocalPoint PointExtrapolatedRPCFrame =
00230 RPCSurface.toLocal(GlobalPointExtrapolated);
00231
00232
00233
00234
00235 if(fabs(PointExtrapolatedRPCFrame.z()) < 0.01 && fabs(PointExtrapolatedRPCFrame.x()) < rsize && fabs(PointExtrapolatedRPCFrame.y()) < stripl*0.5){
00236
00237
00238 const float stripPredicted =
00239 rollasociated->strip(LocalPoint(PointExtrapolatedRPCFrame.x(),PointExtrapolatedRPCFrame.y(),0.));
00240
00241
00242
00243
00244
00245 RPCDetId rollId = rollasociated->id();
00246 uint32_t id = rollId.rawId();
00247
00248 RPCDetId otherRollId1,otherRollId2;
00249
00250 if(rollId.roll() == 1){
00251 RPCDetId tempRollId1(rollId.region(),rollId.ring(),rollId.station(),rollId.sector(),rollId.layer(),rollId.subsector(),2);
00252 RPCDetId tempRollId2(rollId.region(),rollId.ring(),rollId.station(),rollId.sector(),rollId.layer(),rollId.subsector(),3);
00253 otherRollId1 = tempRollId1;
00254 otherRollId2 = tempRollId2;
00255 }
00256 else if(rollId.roll() == 2){
00257
00258 RPCDetId tempRollId1(rollId.region(),rollId.ring(),rollId.station(),rollId.sector(),rollId.layer(),rollId.subsector(),1);
00259 RPCDetId tempRollId2(rollId.region(),rollId.ring(),rollId.station(),rollId.sector(),rollId.layer(),rollId.subsector(),3);
00260 otherRollId1 = tempRollId1;
00261 otherRollId2 = tempRollId2;
00262 }
00263 else if(rollId.roll() == 3){
00264 RPCDetId tempRollId1(rollId.region(),rollId.ring(),rollId.station(),rollId.sector(),rollId.layer(),rollId.subsector(),1);
00265 RPCDetId tempRollId2(rollId.region(),rollId.ring(),rollId.station(),rollId.sector(),rollId.layer(),rollId.subsector(),2);
00266 otherRollId1 = tempRollId1;
00267 otherRollId2 = tempRollId2;
00268 }
00269
00270 RPCDigiCollection::Range rpcRangeDigi1=rpcDigis->get(otherRollId1);
00271 RPCDigiCollection::Range rpcRangeDigi2=rpcDigis->get(otherRollId2);
00272
00273 _idList.push_back(id);
00274
00275 char detUnitLabel[128];
00276 sprintf(detUnitLabel ,"%d",id);
00277 sprintf(layerLabel ,"layer%d_subsector%d_roll%d",rollId.layer(),rollId.subsector(),rollId.roll());
00278
00279 std::map<uint32_t, std::map<std::string,MonitorElement*> >::iterator meItr = meCollection.find(id);
00280 if (meItr == meCollection.end()){
00281 meCollection[id] = bookDetUnitMEEff(rollId);
00282
00283 }
00284
00285 std::map<std::string, MonitorElement*> meMap=meCollection[id];
00286 sprintf(meIdDT,"ExpectedOccupancyFromDT_%s",detUnitLabel);
00287 meMap[meIdDT]->Fill(stripPredicted);
00288
00289 sprintf(meIdDT,"ExpectedOccupancy2DFromDT_%s",detUnitLabel);
00290 meMap[meIdDT]->Fill(stripPredicted,Y);
00291
00292
00293 totalcounter[0]++;
00294 buff=counter[0];
00295 buff[rollId]++;
00296 counter[0]=buff;
00297
00298
00299
00300
00301 bool anycoincidence=false;
00302 int stripDetected = 0;
00303 RPCDigiCollection::Range rpcRangeDigi=rpcDigis->get(rollasociated->id());
00304
00305 int stripCounter = 0;
00306
00307 for (RPCDigiCollection::const_iterator digiIt = rpcRangeDigi.first;digiIt!=rpcRangeDigi.second;++digiIt){
00308 stripCounter++;
00309
00310 stripDetected=digiIt->strip();
00311
00312 float res = (float)(stripDetected) - stripPredicted;
00313 sprintf(meIdRPC,"RPCResiduals_%s",detUnitLabel);
00314 meMap[meIdRPC]->Fill(res);
00315
00316 sprintf(meIdRPC,"RPCResiduals2D_%s",detUnitLabel);
00317 meMap[meIdRPC]->Fill(res,Y);
00318
00319 if(res > 7)
00320 std::cout<<"STRANGE "<<"EVENTO NUM = "<<iEvent.id().event()<<" Residuo = "<<res<<" Strip Num = "<<stripDetected<<" Strip totali = "<<stripCounter<<std::endl;
00321
00322 if(fabs((float)(stripDetected) - stripPredicted) < widestrip){
00323
00324
00325
00326 anycoincidence=true;
00327
00328
00329 }
00330 }
00331 if (anycoincidence) {
00332 sprintf(meIdRPC,"ExpectedOccupancyFromDT_forCrT_%s",detUnitLabel);
00333 meMap[meIdRPC]->Fill(stripPredicted);
00334 sprintf(meIdRPC,"RealDetectedOccupancy_%s",detUnitLabel);
00335 meMap[meIdRPC]->Fill(stripDetected);
00336 sprintf(meIdRPC,"YExpectedOccupancyFromDT_%s",detUnitLabel);
00337 meMap[meIdRPC]->Fill(Y);
00338
00339 for (RPCDigiCollection::const_iterator digiIt1 = rpcRangeDigi1.first;digiIt1!=rpcRangeDigi1.second;++digiIt1){
00340
00341 if(fabs(stripDetected - digiIt1->strip()) <= 1){
00342
00343 sprintf(meIdRPC,"XCrossTalk_1_%s",detUnitLabel);
00344 meMap[meIdRPC]->Fill(stripPredicted);
00345
00346 sprintf(meIdRPC,"XDetectCrossTalk_1_%s",detUnitLabel);
00347 meMap[meIdRPC]->Fill(stripDetected);
00348
00349 sprintf(meIdRPC,"YCrossTalk_1_%s",detUnitLabel);
00350 meMap[meIdRPC]->Fill(Y);
00351 break;
00352 }
00353 }
00354
00355 for (RPCDigiCollection::const_iterator digiIt2 = rpcRangeDigi2.first;digiIt2!=rpcRangeDigi2.second;++digiIt2){
00356
00357 if(fabs(stripDetected - digiIt2->strip()) <= 1){
00358
00359 sprintf(meIdRPC,"XCrossTalk_2_%s",detUnitLabel);
00360 meMap[meIdRPC]->Fill(stripPredicted);
00361
00362 sprintf(meIdRPC,"XDetectCrossTalk_2_%s",detUnitLabel);
00363 meMap[meIdRPC]->Fill(stripDetected);
00364
00365 sprintf(meIdRPC,"YCrossTalk_2_%s",detUnitLabel);
00366 meMap[meIdRPC]->Fill(Y);
00367 break;
00368 }
00369 }
00370
00371 sprintf(meIdRPC,"RPCDataOccupancy_%s",detUnitLabel);
00372 meMap[meIdRPC]->Fill(stripPredicted);
00373
00374 sprintf(meIdRPC,"RPCDataOccupancy2D_%s",detUnitLabel);
00375 meMap[meIdRPC]->Fill(stripPredicted,Y);
00376
00377 totalcounter[1]++;
00378 buff=counter[1];
00379 buff[rollId]++;
00380 counter[1]=buff;
00381 }
00382 else {
00383
00384 totalcounter[2]++;
00385 buff=counter[2];
00386 buff[rollId]++;
00387 counter[2]=buff;
00388
00389
00390
00391
00392 }
00393 }
00394 else {
00395
00396 }
00397 }
00398
00399
00400
00401
00402
00403 }else if(segment->dimension()==2&&dtStation==4){
00404
00405 LocalVector segmentDirectionMB4=segmentDirection;
00406 LocalPoint segmentPositionMB4=segmentPosition;
00407
00408
00409
00410 bool compatiblesegments=false;
00411 Xo=segmentPositionMB4.x();
00412 dx=segmentDirectionMB4.x();
00413 dz=segmentDirectionMB4.z();
00414
00415 DTRecSegment4DCollection::const_iterator segMB3;
00416
00417 const BoundPlane& DTSurface4 = dtGeo->idToDet(DTId)->surface();
00418 w4 = DTSurface4.bounds().thickness()*0.5;
00419
00420 for(segMB3=all4DSegments->begin();segMB3!=all4DSegments->end();++segMB3){
00421 DTChamberId dtid = segMB3->chamberId();
00422 if(dtid.station()==3){
00423 const GeomDet* gdet3=dtGeo->idToDet(segMB3->geographicalId());
00424 const BoundPlane & DTSurface3 = gdet3->surface();
00425 w3 = DTSurface3.bounds().thickness()*0.5;
00426
00427 dx3=segMB3->localDirection().x();
00428 dy3=segMB3->localDirection().y();
00429 dz3=segMB3->localDirection().z();
00430
00431
00432
00433 if(fabs(dx-dx3)<=angle&&fabs(dz-dz3)<=angle){
00434 compatiblesegments=true;
00435 }else{
00436
00437 Xo3=segMB3->localPosition().x();
00438 Yo3=segMB3->localPosition().y();
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449 compatiblesegments=false;
00450
00451
00452
00453 p1x=Xo3+dx3*w3/dz3;
00454 p1z=w3;
00455
00456 p2x=Xo3-dx3*w3/dz3;
00457 p2z=-w3;
00458
00459
00460
00461 p3x=Xo+dx*w4/dz;
00462 p3z=w4;
00463
00464 p4x=Xo-dx*w4/dz;
00465 p4z=-w4;
00466
00467 LocalPoint P1=LocalPoint(p1x,0,p1z);
00468 LocalPoint P2=LocalPoint(p2x,0,p2z);
00469 LocalPoint P3=LocalPoint(p3x,0,p3z);
00470 LocalPoint P4=LocalPoint(p4x,0,p4z);
00471
00472
00473
00474
00475
00476
00477 LocalPoint P1g=P1;
00478 LocalPoint P2g=P2;
00479
00480 LocalPoint P3g=DTSurface3.toLocal(DTSurface.toGlobal(P3));
00481 LocalPoint P4g=DTSurface3.toLocal(DTSurface.toGlobal(P4));
00482
00483
00484
00485
00486
00487 float dx3g=P1g.x()-P2g.x();
00488 float dz3g=P1g.z()-P2g.z();
00489
00490 float dxg=P3g.x()-P4g.x();
00491 float dzg=P3g.z()-P4g.z();
00492
00493
00494
00495
00496 m3=-dx3g/dz3g;
00497 m4=-dxg/dzg;
00498
00499 x3=(P1g.x()+P2g.x())*0.5;
00500 z3=(P1g.z()+P2g.z())*0.5;
00501
00502 x4=(P3g.x()+P4g.x())*0.5;
00503 z4=(P3g.z()+P4g.z())*0.5;
00504
00505 b3=z3-m3*x3;
00506 b4=z4-m4*x4;
00507
00508 if(m3!=m4){
00509 xc=(b4-b3)/(m3-m4);
00510 zc=m3*xc+b3;
00511
00512 GlobalPoint Pc=GlobalPoint(xc,0,zc);
00513
00514
00515
00516 float distance=fabs((GlobalPoint(P2g.x(),0,P2g.z())-GlobalPoint(Pc.x(),0,Pc.z())).mag()-(GlobalPoint(P3g.x(),0,P3g.z())-GlobalPoint(Pc.x(),0,Pc.z())).mag());
00517
00518 if(distance<circError){
00519 compatiblesegments=true;
00520
00521 }
00522 else{
00523
00524 compatiblesegments=false;
00525 }
00526 }
00527 else{
00528
00529 if(fabs(b3-b4)<=circError){
00530 compatiblesegments=true;
00531
00532 }else{std::cout<<"But we don't have the same intercept b3="<<b3<<" b4="<<b4<<std::endl;}
00533 compatiblesegments=false;
00534 system("sleep 30");
00535 }
00536 }
00537
00538
00539 if(scounter[dtid]==1 && compatiblesegments){
00540
00541
00542 std::set<RPCDetId> rollsForThisDT =
00543 rollstore[DTStationIndex(0,dtWheel,dtSector,dtStation)];
00544
00545 for (std::set<RPCDetId>::iterator iteraRoll=rollsForThisDT.begin();iteraRoll != rollsForThisDT.end(); iteraRoll++){
00546 const RPCRoll* rollasociated = rpcGeo->roll(*iteraRoll);
00547
00548 const BoundPlane & RPCSurfaceRB4 = rollasociated->surface();
00549
00550 const GeomDet* gdet=dtGeo->idToDet(segMB3->geographicalId());
00551 const BoundPlane & DTSurfaceMB3 = gdet->surface();
00552
00553
00554
00555
00556
00557
00558 GlobalPoint CenterPointRollGlobal=RPCSurfaceRB4.toGlobal(LocalPoint(0,0,0));
00559
00560
00561 LocalPoint CenterRollinDTFrame = DTSurfaceMB3.toLocal(CenterPointRollGlobal);
00562
00563
00564 float D=CenterRollinDTFrame.z();
00565
00566
00567 X=Xo3+dx3*D/dz3;
00568 Y=Yo3+dy3*D/dz3;
00569 Z=D;
00570
00571 const RectangularStripTopology* top_=dynamic_cast<const RectangularStripTopology*>(&(rollasociated->topology()));
00572 LocalPoint xmin = top_->localPosition(0.);
00573 LocalPoint xmax = top_->localPosition((float)rollasociated->nstrips());
00574 float rsize = fabs( xmax.x()-xmin.x() )*0.5;
00575 float stripl = top_->stripLength();
00576
00577
00578
00579
00580
00581 GlobalPoint GlobalPointExtrapolated = DTSurfaceMB3.toGlobal(LocalPoint(X,Y,Z));
00582
00583
00584 LocalPoint PointExtrapolatedRPCFrame = RPCSurfaceRB4.toLocal(GlobalPointExtrapolated);
00585
00586
00587
00588
00589 if(fabs(PointExtrapolatedRPCFrame.z()) < 0.01 &&
00590 fabs(PointExtrapolatedRPCFrame.x()) < rsize &&
00591 fabs(PointExtrapolatedRPCFrame.y()) < stripl*0.5){
00592
00593
00594
00595 const float stripPredicted=
00596 rollasociated->strip(LocalPoint(PointExtrapolatedRPCFrame.x(),PointExtrapolatedRPCFrame.y(),0.));
00597
00598
00599
00600
00601
00602 RPCDetId rollId = rollasociated->id();
00603 uint32_t id = rollId.rawId();
00604
00605 RPCDetId otherRollId1,otherRollId2;
00606
00607 if(rollId.roll() == 1){
00608 RPCDetId tempRollId1(rollId.region(),rollId.ring(),rollId.station(),rollId.sector(),rollId.layer(),rollId.subsector(),2);
00609 RPCDetId tempRollId2(rollId.region(),rollId.ring(),rollId.station(),rollId.sector(),rollId.layer(),rollId.subsector(),3);
00610 otherRollId1 = tempRollId1;
00611 otherRollId2 = tempRollId2;
00612 }
00613 else if(rollId.roll() == 2){
00614
00615 RPCDetId tempRollId1(rollId.region(),rollId.ring(),rollId.station(),rollId.sector(),rollId.layer(),rollId.subsector(),1);
00616 RPCDetId tempRollId2(rollId.region(),rollId.ring(),rollId.station(),rollId.sector(),rollId.layer(),rollId.subsector(),3);
00617 otherRollId1 = tempRollId1;
00618 otherRollId2 = tempRollId2;
00619 }
00620 else if(rollId.roll() == 3){
00621 RPCDetId tempRollId1(rollId.region(),rollId.ring(),rollId.station(),rollId.sector(),rollId.layer(),rollId.subsector(),1);
00622 RPCDetId tempRollId2(rollId.region(),rollId.ring(),rollId.station(),rollId.sector(),rollId.layer(),rollId.subsector(),2);
00623 otherRollId1 = tempRollId1;
00624 otherRollId2 = tempRollId2;
00625 }
00626 RPCDigiCollection::Range rpcRangeDigi1=rpcDigis->get(otherRollId1);
00627 RPCDigiCollection::Range rpcRangeDigi2=rpcDigis->get(otherRollId2);
00628
00629 _idList.push_back(id);
00630
00631 char detUnitLabel[128];
00632 sprintf(detUnitLabel ,"%d",id);
00633 sprintf(layerLabel ,"layer%d_subsector%d_roll%d",rollId.layer(),rollId.subsector(),rollId.roll());
00634
00635 std::map<uint32_t, std::map<std::string,MonitorElement*> >::iterator meItr = meCollection.find(id);
00636 if (meItr == meCollection.end()){
00637 meCollection[id] = bookDetUnitMEEff(rollId);
00638 std::cout << "\t \t \t \t Create new histograms for "<<layerLabel<<std::endl;
00639 }
00640
00641 std::map<std::string, MonitorElement*> meMap=meCollection[id];
00642 sprintf(meIdDT,"ExpectedOccupancyFromDT_%s",detUnitLabel);
00643 meMap[meIdDT]->Fill(stripPredicted);
00644
00645 sprintf(meIdDT,"ExpectedOccupancy2DFromDT_%s",detUnitLabel);
00646 meMap[meIdDT]->Fill(stripPredicted,Y);
00647
00648
00649 totalcounter[0]++;
00650 buff=counter[0];
00651 buff[rollId]++;
00652 counter[0]=buff;
00653
00654 bool anycoincidence=false;
00655 int stripDetected = 0;
00656 RPCDigiCollection::Range rpcRangeDigi =
00657 rpcDigis->get(rollasociated->id());
00658
00659 int stripCounter = 0;
00660
00661
00662 for (RPCDigiCollection::const_iterator digiIt = rpcRangeDigi.first;digiIt!=rpcRangeDigi.second;++digiIt){
00663 stripCounter++;
00664
00665 stripDetected=digiIt->strip();
00666
00667 stripCounter++;
00668 float res = (float)(stripDetected) - stripPredicted;
00669 sprintf(meIdRPC,"RPCResiduals_%s",detUnitLabel);
00670 meMap[meIdRPC]->Fill(res);
00671
00672 sprintf(meIdRPC,"RPCResiduals2D_%s",detUnitLabel);
00673 meMap[meIdRPC]->Fill(res,Y);
00674
00675 if(res > 7)
00676 std::cout<<"STRANGE "<<"EVENTO NUM = "<<iEvent.id().event()<<" Residuo = "<<res<<" Strip Num = "<<stripDetected<<" Strip totali = "<<stripCounter<<std::endl;
00677 if(fabs((float)(stripDetected) - stripPredicted)<widestripsRB4){
00678
00679 anycoincidence=true;
00680
00681 }
00682 }
00683 if (anycoincidence){
00684
00685 sprintf(meIdRPC,"ExpectedOccupancyFromDT_forCrT_%s",detUnitLabel);
00686 meMap[meIdRPC]->Fill(stripPredicted);
00687 sprintf(meIdRPC,"RealDetectedOccupancy_%s",detUnitLabel);
00688 meMap[meIdRPC]->Fill(stripDetected);
00689 sprintf(meIdRPC,"YExpectedOccupancyFromDT_%s",detUnitLabel);
00690 meMap[meIdRPC]->Fill(Y);
00691
00692 for (RPCDigiCollection::const_iterator digiIt1 = rpcRangeDigi1.first;digiIt1!=rpcRangeDigi1.second;++digiIt1){
00693
00694 if(fabs(stripDetected - digiIt1->strip()) <= 1){
00695
00696 sprintf(meIdRPC,"XCrossTalk_1_%s",detUnitLabel);
00697 meMap[meIdRPC]->Fill(stripPredicted);
00698
00699 sprintf(meIdRPC,"XDetectCrossTalk_1_%s",detUnitLabel);
00700 meMap[meIdRPC]->Fill(stripDetected);
00701
00702 sprintf(meIdRPC,"YCrossTalk_1_%s",detUnitLabel);
00703 meMap[meIdRPC]->Fill(Y);
00704 break;
00705 }
00706 }
00707
00708 for (RPCDigiCollection::const_iterator digiIt2 = rpcRangeDigi2.first;digiIt2!=rpcRangeDigi2.second;++digiIt2){
00709
00710 if(fabs(stripDetected - digiIt2->strip()) <= 1){
00711
00712 sprintf(meIdRPC,"XCrossTalk_2_%s",detUnitLabel);
00713 meMap[meIdRPC]->Fill(stripPredicted);
00714
00715 sprintf(meIdRPC,"XDetectCrossTalk_2_%s",detUnitLabel);
00716 meMap[meIdRPC]->Fill(stripDetected);
00717
00718 sprintf(meIdRPC,"YCrossTalk_2_%s",detUnitLabel);
00719 meMap[meIdRPC]->Fill(Y);
00720 break;
00721 }
00722 }
00723
00724 sprintf(meIdRPC,"RPCDataOccupancy_%s",detUnitLabel);
00725 meMap[meIdRPC]->Fill(stripPredicted);
00726
00727 sprintf(meIdRPC,"RPCDataOccupancy2D_%s",detUnitLabel);
00728 meMap[meIdRPC]->Fill(stripPredicted,Y);
00729
00730 totalcounter[1]++;
00731 buff=counter[1];
00732 buff[rollId]++;
00733 counter[1]=buff;
00734 }
00735 else{
00736 totalcounter[2]++;
00737 buff=counter[2];
00738 buff[rollId]++;
00739 counter[2]=buff;
00740
00741
00742
00743
00744
00745
00746 }
00747 }
00748 else{
00749
00750 }
00751
00752 }
00753 }
00754 }
00755 }
00756 }
00757 else{
00758
00759 }
00760 }
00761 else {
00762
00763 }
00764 }
00765 }else {
00766
00767 }
00768
00769 }
00770
00771 void RPCMonitorEfficiency::endJob(void){
00772 std::map<RPCDetId, int> pred = counter[0];
00773 std::map<RPCDetId, int> obse = counter[1];
00774 std::map<RPCDetId, int> reje = counter[2];
00775
00776 std::map<RPCDetId, int>::iterator irpc;
00777 for (irpc=pred.begin(); irpc!=pred.end();irpc++){
00778 RPCDetId id=irpc->first;
00779 int p=pred[id];
00780 int o=obse[id];
00781 int r=reje[id];
00782 assert(p==o+r);
00783 float ef = float(o)/float(p);
00784 float er = sqrt(ef*(1.-ef)/float(p));
00785 std::cout <<"\n "<<id<<"\t Predicted "<<p<<"\t Observed "<<o<<"\t Eff = "<<ef*100.<<" % +/- "<<er*100.<<" %";
00786 if(ef<0.8){
00787 std::cout<<"\t \t Warning!";
00788 }
00789 }
00790
00791 float tote = float(totalcounter[1])/float(totalcounter[0]);
00792 float totr = sqrt(tote*(1.-tote)/float(totalcounter[0]));
00793 std::cout <<"\n\n \t \t TOTAL EFFICIENCY \t Predicted "<<totalcounter[1]<<"\t Observed "<<totalcounter[0]<<"\t Eff = "<<tote*100.<<"\t +/- \t"<<totr*100.<<"%"<<std::endl;
00794 std::cout <<totalcounter[1]<<" "<<totalcounter[0]<<" flagcode"<<std::endl;
00795
00796
00797 std::vector<uint32_t>::iterator meIt;
00798 for(meIt = _idList.begin(); meIt != _idList.end(); ++meIt){
00799
00800 char detUnitLabel[128];
00801 char meIdRPC [128];
00802 char meIdDT [128];
00803 char meIdDTCrT [128];
00804 char effIdRPC [128];
00805 char meIdRPCCrT [128];
00806
00807 char XCrTalkId_1 [128];
00808 char XCrTalkId_2 [128];
00809 char effXCrTalkId_1 [128];
00810 char effXCrTalkId_2 [128];
00811
00812 char XCrTalkDetId_1 [128];
00813 char XCrTalkDetId_2 [128];
00814 char effXCrTalkDetId_1 [128];
00815 char effXCrTalkDetId_2 [128];
00816
00817 char YCrTalkId_1 [128];
00818 char YCrTalkId_2 [128];
00819 char effYCrTalkId_1 [128];
00820 char effYCrTalkId_2 [128];
00821
00822 char YCrTalkDTId [128];
00823
00824 char meIdRPC_2D [128];
00825 char meIdDT_2D [128];
00826 char effIdRPC_2D [128];
00827
00828 sprintf(detUnitLabel ,"%d",*meIt);
00829 sprintf(meIdRPC,"RPCDataOccupancy_%s",detUnitLabel);
00830 sprintf(meIdDT,"ExpectedOccupancyFromDT_%s",detUnitLabel);
00831 sprintf(meIdDTCrT,"ExpectedOccupancyFromDT_forCrT_%s",detUnitLabel);
00832 sprintf(YCrTalkDTId,"YExpectedOccupancyFromDT_%s",detUnitLabel);
00833 sprintf(meIdRPCCrT,"RealDetectedOccupancy_%s",detUnitLabel);
00834
00835 sprintf(effIdRPC,"EfficienyFromDTExtrapolation_%s",detUnitLabel);
00836
00837 sprintf(meIdRPC_2D,"RPCDataOccupancy2D_%s",detUnitLabel);
00838 sprintf(meIdDT_2D,"ExpectedOccupancy2DFromDT_%s",detUnitLabel);
00839 sprintf(effIdRPC_2D,"EfficienyFromDT2DExtrapolation_%s",detUnitLabel);
00840
00841 sprintf(XCrTalkId_1,"XCrossTalk_1_%s",detUnitLabel);
00842 sprintf(XCrTalkId_2,"XCrossTalk_2_%s",detUnitLabel);
00843 sprintf(YCrTalkId_1,"YCrossTalk_1_%s",detUnitLabel);
00844 sprintf(YCrTalkId_2,"YCrossTalk_2_%s",detUnitLabel);
00845 sprintf(XCrTalkDetId_1,"XDetectCrossTalk_1_%s",detUnitLabel);
00846 sprintf(XCrTalkDetId_2,"XDetectCrossTalk_2_%s",detUnitLabel);
00847
00848 sprintf(effXCrTalkId_1,"XCrossTalkFromDTExtrapolation_1_%s",detUnitLabel);
00849 sprintf(effXCrTalkId_2,"XCrossTalkFromDTExtrapolation_2_%s",detUnitLabel);
00850 sprintf(effXCrTalkDetId_1,"XCrossTalkFromDetectedStrip_1_%s",detUnitLabel);
00851 sprintf(effXCrTalkDetId_2,"XCrossTalkFromDetectedStrip_2_%s",detUnitLabel);
00852 sprintf(effYCrTalkId_1,"YCrossTalkFromDTExtrapolation_1_%s",detUnitLabel);
00853 sprintf(effYCrTalkId_2,"YCrossTalkFromDTExtrapolation_2_%s",detUnitLabel);
00854
00855 std::map<std::string, MonitorElement*> meMap=meCollection[*meIt];
00856
00857 for(unsigned int i=1;i<=100;++i){
00858
00859 if(meMap[meIdDT]->getBinContent(i) != 0){
00860 float eff = meMap[meIdRPC]->getBinContent(i)/meMap[meIdDT]->getBinContent(i);
00861 float erreff = sqrt(eff*(1-eff)/meMap[meIdDT]->getBinContent(i));
00862 meMap[effIdRPC]->setBinContent(i,eff*100.);
00863 meMap[effIdRPC]->setBinError(i,erreff*100.);
00864 }
00865 }
00866 for(unsigned int i=1;i<=100;++i){
00867 for(unsigned int j=1;j<=200;++j){
00868 if(meMap[meIdDT_2D]->getBinContent(i,j) != 0){
00869 float eff = meMap[meIdRPC_2D]->getBinContent(i,j)/meMap[meIdDT_2D]->getBinContent(i,j);
00870 float erreff = sqrt(eff*(1-eff)/meMap[meIdDT_2D]->getBinContent(i,j));
00871 meMap[effIdRPC_2D]->setBinContent(i,j,eff*100.);
00872 meMap[effIdRPC_2D]->setBinError(i,j,erreff*100.);
00873 }
00874 }
00875 }
00876
00877
00878
00879
00880
00881 for(unsigned int i=1;i<=100;++i){
00882
00883 if(meMap[meIdDTCrT]->getBinContent(i) != 0){
00884 float crt = meMap[XCrTalkId_1]->getBinContent(i)/meMap[meIdDTCrT]->getBinContent(i);
00885 float errcrt = sqrt(crt*(1-crt)/meMap[meIdDTCrT]->getBinContent(i));
00886 meMap[effXCrTalkId_1]->setBinContent(i,crt*100.);
00887 meMap[effXCrTalkId_1]->setBinError(i,errcrt*100.);
00888 }
00889 }
00890
00891 for(unsigned int i=1;i<=100;++i){
00892
00893 if(meMap[meIdDTCrT]->getBinContent(i) != 0){
00894 float crt = meMap[XCrTalkId_2]->getBinContent(i)/meMap[meIdDTCrT]->getBinContent(i);
00895 float errcrt = sqrt(crt*(1-crt)/meMap[meIdDTCrT]->getBinContent(i));
00896 meMap[effXCrTalkId_2]->setBinContent(i,crt*100.);
00897 meMap[effXCrTalkId_2]->setBinError(i,errcrt*100.);
00898 }
00899 }
00900
00901
00902
00903 for(unsigned int i=1;i<=100;++i){
00904 if(meMap[meIdRPCCrT]->getBinContent(i) != 0){
00905 float crt = meMap[XCrTalkDetId_1]->getBinContent(i)/meMap[meIdRPCCrT]->getBinContent(i);
00906 float errcrt = sqrt(crt*(1-crt)/meMap[meIdRPCCrT]->getBinContent(i));
00907 meMap[effXCrTalkDetId_1]->setBinContent(i,crt*100.);
00908 meMap[effXCrTalkDetId_1]->setBinError(i,errcrt*100.);
00909 }
00910 }
00911
00912 for(unsigned int i=1;i<=100;++i){
00913
00914 if(meMap[meIdRPCCrT]->getBinContent(i) != 0){
00915 float crt = meMap[XCrTalkDetId_2]->getBinContent(i)/meMap[meIdRPCCrT]->getBinContent(i);
00916 float errcrt = sqrt(crt*(1-crt)/meMap[meIdRPCCrT]->getBinContent(i));
00917 meMap[effXCrTalkDetId_2]->setBinContent(i,crt*100.);
00918 meMap[effXCrTalkDetId_2]->setBinError(i,errcrt*100.);
00919 }
00920 }
00921
00922
00923
00924 for(unsigned int i=1;i<=200;++i){
00925
00926 if(meMap[YCrTalkDTId]->getBinContent(i) != 0){
00927 float crt = meMap[YCrTalkId_1]->getBinContent(i)/meMap[YCrTalkDTId]->getBinContent(i);
00928 float errcrt = sqrt(crt*(1-crt)/meMap[YCrTalkDTId]->getBinContent(i));
00929 meMap[effYCrTalkId_1]->setBinContent(i,crt*100.);
00930 meMap[effYCrTalkId_1]->setBinError(i,errcrt*100.);
00931 }
00932 }
00933
00934 for(unsigned int i=1;i<=200;++i){
00935
00936 if(meMap[YCrTalkDTId]->getBinContent(i) != 0){
00937 float crt = meMap[YCrTalkId_2]->getBinContent(i)/meMap[YCrTalkDTId]->getBinContent(i);
00938 float errcrt = sqrt(crt*(1-crt)/meMap[YCrTalkDTId]->getBinContent(i));
00939 meMap[effYCrTalkId_2]->setBinContent(i,crt*100.);
00940 meMap[effYCrTalkId_2]->setBinError(i,errcrt*100.);
00941 }
00942 }
00943 }
00944
00945 if(EffSaveRootFile) dbe->save(EffRootFileName);
00946
00947
00948 std::cout<<"End Job"<<std::endl;
00949 }
00950
00951 RPCMonitorEfficiency::~RPCMonitorEfficiency(){}
00952
00953
00954
00955
00956
00957