00001 #include <Geometry/RPCGeometry/interface/RPCGeometry.h>
00002 #include <Geometry/DTGeometry/interface/DTGeometry.h>
00003 #include <DataFormats/DTRecHit/interface/DTRecSegment4DCollection.h>
00004 #include <Geometry/CommonDetUnit/interface/GeomDet.h>
00005 #include <Geometry/Records/interface/MuonGeometryRecord.h>
00006 #include <Geometry/CommonTopologies/interface/RectangularStripTopology.h>
00007 #include <FWCore/Framework/interface/EDAnalyzer.h>
00008 #include "FWCore/Framework/interface/ESHandle.h"
00009 #include <Geometry/RPCGeometry/interface/RPCGeomServ.h>
00010 #include <DataFormats/RPCRecHit/interface/RPCRecHit.h>
00011 #include <DataFormats/RPCRecHit/interface/RPCRecHitCollection.h>
00012 #include <RecoLocalMuon/RPCRecHit/interface/DTSegtoRPC.h>
00013 #include <ctime>
00014
00015 ObjectMap* ObjectMap::mapInstance = NULL;
00016
00017 ObjectMap* ObjectMap::GetInstance(const edm::EventSetup& iSetup){
00018 if (mapInstance == NULL){
00019 mapInstance = new ObjectMap(iSetup);
00020 }
00021 return mapInstance;
00022 }
00023
00024 ObjectMap::ObjectMap(const edm::EventSetup& iSetup){
00025 edm::ESHandle<RPCGeometry> rpcGeo;
00026 edm::ESHandle<DTGeometry> dtGeo;
00027
00028 iSetup.get<MuonGeometryRecord>().get(rpcGeo);
00029 iSetup.get<MuonGeometryRecord>().get(dtGeo);
00030
00031 for (TrackingGeometry::DetContainer::const_iterator it=rpcGeo->dets().begin();it<rpcGeo->dets().end();it++){
00032 if(dynamic_cast< RPCChamber* >( *it ) != 0 ){
00033 RPCChamber* ch = dynamic_cast< RPCChamber* >( *it );
00034 std::vector< const RPCRoll*> roles = (ch->rolls());
00035 for(std::vector<const RPCRoll*>::const_iterator r = roles.begin();r != roles.end(); ++r){
00036 RPCDetId rpcId = (*r)->id();
00037 int region=rpcId.region();
00038 if(region==0){
00039 int wheel=rpcId.ring();
00040 int sector=rpcId.sector();
00041 int station=rpcId.station();
00042 DTStationIndex ind(region,wheel,sector,station);
00043 std::set<RPCDetId> myrolls;
00044 if (rollstoreDT.find(ind)!=rollstoreDT.end()) myrolls=rollstoreDT[ind];
00045 myrolls.insert(rpcId);
00046 rollstoreDT[ind]=myrolls;
00047 }
00048 }
00049 }
00050 }
00051 }
00052
00053 int distsector(int sector1,int sector2){
00054 if(sector1==13) sector1=4;
00055 if(sector1==14) sector1=10;
00056
00057 if(sector2==13) sector2=4;
00058 if(sector2==14) sector2=10;
00059
00060 int distance = std::abs(sector1 - sector2);
00061 if(distance>6) distance = 12-distance;
00062 return distance;
00063 }
00064
00065 int distwheel(int wheel1,int wheel2){
00066 int distance = std::abs(wheel1 - wheel2);
00067 return distance;
00068 }
00069
00070 DTSegtoRPC::DTSegtoRPC(edm::Handle<DTRecSegment4DCollection> all4DSegments, const edm::EventSetup& iSetup,const edm::Event& iEvent,bool debug,double eyr){
00071
00072
00073
00074
00075
00076
00077 incldt=true;
00078 incldtMB4=true;
00079
00080
00081 MinCosAng=0.85;
00082 MaxD=80.;
00083 MaxDrb4=150.;
00084 MaxDistanceBetweenSegments = 150;
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100 _ThePoints = new RPCRecHitCollection();
00101
00102 if(all4DSegments->size()>8){
00103 if(debug) std::cout<<"Too many segments in this event we are not doing the extrapolation"<<std::endl;
00104 }else{
00105 edm::ESHandle<RPCGeometry> rpcGeo;
00106 edm::ESHandle<DTGeometry> dtGeo;
00107
00108 iSetup.get<MuonGeometryRecord>().get(rpcGeo);
00109 iSetup.get<MuonGeometryRecord>().get(dtGeo);
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121 std::map<DTChamberId,int> DTSegmentCounter;
00122 DTRecSegment4DCollection::const_iterator segment;
00123
00124 for (segment = all4DSegments->begin();segment!=all4DSegments->end(); ++segment){
00125 DTSegmentCounter[segment->chamberId()]++;
00126 }
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139 if(incldt){
00140 for (segment = all4DSegments->begin(); segment != all4DSegments->end(); ++segment){
00141
00142 DTChamberId DTId = segment->chamberId();
00143
00144 if(debug) std::cout<<"DT \t \t This Segment is in Chamber id: "<<DTId<<std::endl;
00145 if(debug) std::cout<<"DT \t \t Number of segments in this DT = "<<DTSegmentCounter[DTId]<<std::endl;
00146 if(debug) std::cout<<"DT \t \t Is the only one in this DT? and is not in the 4th Station?"<<std::endl;
00147
00148 if(DTSegmentCounter[DTId]!=1 || DTId.station()==4){
00149 if(debug) std::cout<<"DT \t \t More than one segment in this chamber, or we are in Station 4"<<std::endl;
00150 continue;
00151 }
00152
00153 int dtWheel = DTId.wheel();
00154 int dtStation = DTId.station();
00155 int dtSector = DTId.sector();
00156
00157 LocalPoint segmentPosition= segment->localPosition();
00158 LocalVector segmentDirection=segment->localDirection();
00159
00160 const GeomDet* gdet=dtGeo->idToDet(segment->geographicalId());
00161 const BoundPlane & DTSurface = gdet->surface();
00162
00163
00164
00165 if(debug) std::cout<<"DT \t \t Is the segment 4D?"<<std::endl;
00166
00167 if(segment->dimension()!=4){
00168 if(debug) std::cout<<"DT \t \t no"<<std::endl;
00169 continue;
00170 }
00171
00172 if(debug) std::cout<<"DT \t \t yes"<<std::endl;
00173 if(debug) std::cout<<"DT \t \t DT Segment Dimension "<<segment->dimension()<<std::endl;
00174
00175 float Xo=segmentPosition.x();
00176 float Yo=segmentPosition.y();
00177 float Zo=segmentPosition.z();
00178 float dx=segmentDirection.x();
00179 float dy=segmentDirection.y();
00180 float dz=segmentDirection.z();
00181
00182 if(debug) std::cout<<"Calling to Object Map class"<<std::endl;
00183 ObjectMap* TheObject = ObjectMap::GetInstance(iSetup);
00184 if(debug) std::cout<<"Creating the DTIndex"<<std::endl;
00185 DTStationIndex theindex(0,dtWheel,dtSector,dtStation);
00186 if(debug) std::cout<<"Getting the Rolls for the given index"<<std::endl;
00187
00188 std::set<RPCDetId> rollsForThisDT = TheObject->GetInstance(iSetup)->GetRolls(theindex);
00189
00190 if(debug) std::cout<<"DT \t \t Number of rolls for this DT = "<<rollsForThisDT.size()<<std::endl;
00191
00192 assert(rollsForThisDT.size()>=1);
00193
00194 if(debug) std::cout<<"DT \t \t Loop over all the rolls asociated to this DT"<<std::endl;
00195 for (std::set<RPCDetId>::iterator iteraRoll = rollsForThisDT.begin();iteraRoll != rollsForThisDT.end(); iteraRoll++){
00196 const RPCRoll* rollasociated = rpcGeo->roll(*iteraRoll);
00197 RPCDetId rpcId = rollasociated->id();
00198 const BoundPlane & RPCSurface = rollasociated->surface();
00199
00200 RPCGeomServ rpcsrv(rpcId);
00201 std::string nameRoll = rpcsrv.name();
00202
00203 if(debug) std::cout<<"DT \t \t \t RollName: "<<nameRoll<<std::endl;
00204 if(debug) std::cout<<"DT \t \t \t Doing the extrapolation to this roll"<<std::endl;
00205 if(debug) std::cout<<"DT \t \t \t DT Segment Direction in DTLocal "<<segmentDirection<<std::endl;
00206 if(debug) std::cout<<"DT \t \t \t DT Segment Point in DTLocal "<<segmentPosition<<std::endl;
00207
00208 GlobalPoint CenterPointRollGlobal = RPCSurface.toGlobal(LocalPoint(0,0,0));
00209
00210 LocalPoint CenterRollinDTFrame = DTSurface.toLocal(CenterPointRollGlobal);
00211
00212 if(debug) std::cout<<"DT \t \t \t Center (0,0,0) Roll In DTLocal"<<CenterRollinDTFrame<<std::endl;
00213 if(debug) std::cout<<"DT \t \t \t Center (0,0,0) of the Roll in Global"<<CenterPointRollGlobal<<std::endl;
00214
00215 float D=CenterRollinDTFrame.z();
00216
00217 float X=Xo+dx*D/dz;
00218 float Y=Yo+dy*D/dz;
00219 float Z=D;
00220
00221 const RectangularStripTopology* top_= dynamic_cast<const RectangularStripTopology*> (&(rollasociated->topology()));
00222 LocalPoint xmin = top_->localPosition(0.);
00223 if(debug) std::cout<<"DT \t \t \t xmin of this Roll "<<xmin<<"cm"<<std::endl;
00224 LocalPoint xmax = top_->localPosition((float)rollasociated->nstrips());
00225 if(debug) std::cout<<"DT \t \t \t xmax of this Roll "<<xmax<<"cm"<<std::endl;
00226 float rsize = fabs( xmax.x()-xmin.x() );
00227 if(debug) std::cout<<"DT \t \t \t Roll Size "<<rsize<<"cm"<<std::endl;
00228 float stripl = top_->stripLength();
00229
00230 float stripw = top_->pitch();
00231
00232 if(debug) std::cout<<"DT \t \t \t Strip Lenght "<<stripl<<"cm"<<std::endl;
00233 if(debug) std::cout<<"DT \t \t \t Strip Width "<<stripw<<"cm"<<std::endl;
00234 if(debug) std::cout<<"DT \t \t \t X Predicted in DTLocal= "<<X<<"cm"<<std::endl;
00235 if(debug) std::cout<<"DT \t \t \t Y Predicted in DTLocal= "<<Y<<"cm"<<std::endl;
00236 if(debug) std::cout<<"DT \t \t \t Z Predicted in DTLocal= "<<Z<<"cm"<<std::endl;
00237
00238 float extrapolatedDistance = sqrt((X-Xo)*(X-Xo)+(Y-Yo)*(Y-Yo)+(Z-Zo)*(Z-Zo));
00239
00240 if(debug) std::cout<<"DT \t \t \t Is the distance of extrapolation less than MaxD? ="<<extrapolatedDistance<<"cm"<<"MaxD="<<MaxD<<"cm"<<std::endl;
00241
00242 if(extrapolatedDistance<=MaxD){
00243 if(debug) std::cout<<"DT \t \t \t yes"<<std::endl;
00244 GlobalPoint GlobalPointExtrapolated = DTSurface.toGlobal(LocalPoint(X,Y,Z));
00245 if(debug) std::cout<<"DT \t \t \t Point ExtraPolated in Global"<<GlobalPointExtrapolated<< std::endl;
00246 LocalPoint PointExtrapolatedRPCFrame = RPCSurface.toLocal(GlobalPointExtrapolated);
00247
00248 if(debug) std::cout<<"DT \t \t \t Point Extrapolated in RPCLocal"<<PointExtrapolatedRPCFrame<< std::endl;
00249 if(debug) std::cout<<"DT \t \t \t Corner of the Roll = ("<<rsize*eyr<<","<<stripl*eyr<<")"<<std::endl;
00250 if(debug) std::cout<<"DT \t \t \t Info About the Point Extrapolated in X Abs ("<<fabs(PointExtrapolatedRPCFrame.x())<<","
00251 <<fabs(PointExtrapolatedRPCFrame.y())<<","<<fabs(PointExtrapolatedRPCFrame.z())<<")"<<std::endl;
00252 if(debug) std::cout<<"DT \t \t \t Does the extrapolation go inside this roll?"<<std::endl;
00253
00254 if(fabs(PointExtrapolatedRPCFrame.z()) < 1. &&
00255 fabs(PointExtrapolatedRPCFrame.x()) < rsize*eyr &&
00256 fabs(PointExtrapolatedRPCFrame.y()) < stripl*eyr){
00257 if(debug) std::cout<<"DT \t \t \t \t yes"<<std::endl;
00258 if(debug) std::cout<<"DT \t \t \t \t Creating the RecHit"<<std::endl;
00259 RPCRecHit RPCPoint(rpcId,0,PointExtrapolatedRPCFrame);
00260 if(debug) std::cout<<"DT \t \t \t \t Clearing the vector"<<std::endl;
00261 RPCPointVector.clear();
00262 if(debug) std::cout<<"DT \t \t \t \t Pushing back"<<std::endl;
00263 RPCPointVector.push_back(RPCPoint);
00264 if(debug) std::cout<<"DT \t \t \t \t Putting the vector"<<std::endl;
00265 _ThePoints->put(rpcId,RPCPointVector.begin(),RPCPointVector.end());
00266
00267 if(debug) std::cout<<"DT \t \t \t \t Filling container with "<<nameRoll
00268 <<" Point.x="<<PointExtrapolatedRPCFrame.x()<<" Point.y="<<PointExtrapolatedRPCFrame.y()<<" size="<<RPCPointVector.size()<<std::endl;
00269
00270 }else {
00271 if(debug) std::cout<<"DT \t \t \t \t No the prediction is outside of this roll"<<std::endl;
00272 }
00273 }else{
00274 if(debug) std::cout<<"DT \t \t \t No, Exrtrapolation too long!, canceled"<<std::endl;
00275 }
00276 }
00277 }
00278 }
00279
00280 if(incldtMB4){
00281 if(all4DSegments->size()>0){
00282 if(debug) std::cout<<"MB4 \t \t Loop Over all4DSegments "<<all4DSegments->size()<<std::endl;
00283 extrapolatedRolls.clear();
00284 for (segment = all4DSegments->begin(); segment != all4DSegments->end(); ++segment){
00285
00286 DTChamberId DTId = segment->chamberId();
00287
00288 if(debug) std::cout<<"MB4 \t \t This Segment is in Chamber id: "<<DTId<<std::endl;
00289 if(debug) std::cout<<"MB4 \t \t Number of segments in this DT = "<<DTSegmentCounter[DTId]<<std::endl;
00290 if(debug) std::cout<<"MB4 \t \t \t Is the only one in this DT? and is in the Station 4?"<<std::endl;
00291
00292 if(DTSegmentCounter[DTId] == 1 && DTId.station()==4){
00293
00294 if(debug) std::cout<<"MB4 \t \t \t yes"<<std::endl;
00295 int dtWheel = DTId.wheel();
00296 int dtStation = DTId.station();
00297 int dtSector = DTId.sector();
00298
00299 LocalPoint segmentPosition= segment->localPosition();
00300 LocalVector segmentDirection=segment->localDirection();
00301
00302 if(debug) std::cout<<"MB4 \t \t \t \t The Segment in MB4 is 2D?"<<std::endl;
00303 if(segment->dimension()==2){
00304 if(debug) std::cout<<"MB4 \t \t \t \t yes"<<std::endl;
00305 LocalVector segmentDirectionMB4=segmentDirection;
00306 LocalPoint segmentPositionMB4=segmentPosition;
00307
00308 const BoundPlane& DTSurface4 = dtGeo->idToDet(DTId)->surface();
00309
00310 DTRecSegment4DCollection::const_iterator segMB3;
00311
00312 if(debug) std::cout<<"MB4 \t \t \t \t Loop on segments in =sector && MB3 && adjacent sectors && y dim=4"<<std::endl;
00313 for(segMB3=all4DSegments->begin();segMB3!=all4DSegments->end();++segMB3){
00314
00315 DTChamberId dtid3 = segMB3->chamberId();
00316
00317 if(debug) std::cout<<"MB4 \t \t \t \t Segment in Chamber ="<<dtid3<<std::endl;
00318
00319
00320 if(distsector(dtid3.sector(),DTId.sector())<=1
00321 && distwheel(dtid3.wheel(),DTId.wheel())<=1
00322 && dtid3.station()==3
00323 && DTSegmentCounter[dtid3] == 1
00324 && segMB3->dimension()==4){
00325
00326 if(debug) std::cout<<"MB4 \t \t \t \t distsector ="<<distsector(dtid3.sector(),DTId.sector())<<std::endl;
00327 if(debug) std::cout<<"MB4 \t \t \t \t distwheel ="<<distwheel(dtid3.wheel(),DTId.wheel())<<std::endl;
00328
00329 const GeomDet* gdet3=dtGeo->idToDet(segMB3->geographicalId());
00330 const BoundPlane & DTSurface3 = gdet3->surface();
00331
00332 LocalVector segmentDirectionMB3 = segMB3->localDirection();
00333 GlobalPoint segmentPositionMB3inGlobal = DTSurface3.toGlobal(segMB3->localPosition());
00334 GlobalPoint segmentPositionMB4inGlobal = DTSurface4.toGlobal(segmentPosition);
00335
00336
00337 LocalVector segDirMB3inMB4Frame=DTSurface4.toLocal(DTSurface3.toGlobal(segmentDirectionMB3));
00338
00339 GlobalVector segDirMB4inGlobalFrame=DTSurface4.toGlobal(segmentDirectionMB4);
00340 GlobalVector segDirMB3inGlobalFrame=DTSurface3.toGlobal(segmentDirectionMB3);
00341
00342 float dx=segDirMB4inGlobalFrame.x();
00343 float dy=segDirMB4inGlobalFrame.y();
00344
00345 float dx3=segDirMB3inGlobalFrame.x();
00346 float dy3=segDirMB3inGlobalFrame.y();
00347
00348 double cosAng=fabs(dx*dx3+dy*dy3/sqrt((dx3*dx3+dy3*dy3)*(dx*dx+dy*dy)));
00349
00350 if(debug) std::cout<<"MB4 \t \t \t \t cosAng"<<cosAng<<"Beetween "<<dtid3<<" and "<<DTId<<std::endl;
00351
00352 if(debug){
00353 std::cout<<"MB4 \t \t \t \t dx="<<dx<<" dy="<<dy<<std::endl;
00354 std::cout<<"MB4 \t \t \t \t dx3="<<dx3<<" dy3="<<dy<<std::endl;
00355 std::cout<<"MB4 \t \t \t \t cosAng="<<cosAng<<std::endl;
00356 }
00357
00358 float DistanceBetweenSegments = ((segmentPositionMB3inGlobal) - (segmentPositionMB4inGlobal)).mag();
00359
00360 if(cosAng>MinCosAng && DistanceBetweenSegments < MaxDistanceBetweenSegments){
00361
00362 if(debug) std::cout<<"MB4 \t \t \t \t Distance between segments="<<DistanceBetweenSegments<<std::endl;
00363
00364 if(debug) std::cout<<"MB4 \t \t We found compatible Segments (similar direction and close enough) in "<<dtid3<<" and "<<DTId<<std::endl;
00365
00366 if(dtSector==13){
00367 dtSector=4;
00368 }
00369 if(dtSector==14){
00370 dtSector=10;
00371 }
00372
00373 if(debug) std::cout<<"Calling to Object Map class"<<std::endl;
00374 ObjectMap* TheObject = ObjectMap::GetInstance(iSetup);
00375 if(debug) std::cout<<"Creating the DTIndex"<<std::endl;
00376 DTStationIndex theindex(0,dtWheel,dtSector,dtStation);
00377 if(debug) std::cout<<"Getting the Rolls for the given index"<<std::endl;
00378
00379 std::set<RPCDetId> rollsForThisDT = TheObject->GetInstance(iSetup)->GetRolls(theindex);
00380
00381 if(debug) std::cout<<"MB4 \t \t Number of rolls for this DT = "<<rollsForThisDT.size()<<std::endl;
00382
00383 assert(rollsForThisDT.size()>=1);
00384
00385 if(debug) std::cout<<"MB4 \t \t Loop over all the rolls asociated to this DT"<<std::endl;
00386 for (std::set<RPCDetId>::iterator iteraRoll=rollsForThisDT.begin();iteraRoll != rollsForThisDT.end(); iteraRoll++){
00387 const RPCRoll* rollasociated = rpcGeo->roll(*iteraRoll);
00388 RPCDetId rpcId = rollasociated->id();
00389 const BoundPlane & RPCSurfaceRB4 = rollasociated->surface();
00390
00391 RPCGeomServ rpcsrv(rpcId);
00392 std::string nameRoll = rpcsrv.name();
00393
00394 if(debug) std::cout<<"MB4 \t \t \t RollName: "<<nameRoll<<std::endl;
00395 if(debug) std::cout<<"MB4 \t \t \t Doing the extrapolation to this roll"<<std::endl;
00396
00397 GlobalPoint CenterPointRollGlobal=RPCSurfaceRB4.toGlobal(LocalPoint(0,0,0));
00398 LocalPoint CenterRollinMB4Frame = DTSurface4.toLocal(CenterPointRollGlobal);
00399 LocalPoint segmentPositionMB3inMB4Frame = DTSurface4.toLocal(segmentPositionMB3inGlobal);
00400
00401 LocalVector segmentDirectionMB3inMB4Frame = DTSurface4.toLocal(segDirMB3inGlobalFrame);
00402
00403
00404 float Dxz=CenterRollinMB4Frame.z();
00405 float Xo4=segmentPositionMB4.x();
00406 float dxl=segmentDirectionMB4.x();
00407 float dzl=segmentDirectionMB4.z();
00408
00409 float X=Xo4+dxl*Dxz/dzl;
00410 float Z=Dxz;
00411
00412
00413 float Yo34 = segmentPositionMB3inMB4Frame.y();
00414 float dy34 = segmentDirectionMB3inMB4Frame.y();
00415 float dz34 = segmentDirectionMB3inMB4Frame.z();
00416 float Dy=Dxz-(segmentPositionMB3inMB4Frame.z());
00417
00418 if(debug) std::cout<<"MB4 \t \t \t The distance to extrapolate in Y from MB3 is "<<Dy<<"cm"<<std::endl;
00419
00420 float Y=Yo34+dy34*Dy/dz34;
00421
00422 const RectangularStripTopology* top_
00423 =dynamic_cast<const RectangularStripTopology*>(&(rollasociated->topology()));
00424 LocalPoint xmin = top_->localPosition(0.);
00425 LocalPoint xmax = top_->localPosition((float)rollasociated->nstrips());
00426 float rsize = fabs( xmax.x()-xmin.x() );
00427 float stripl = top_->stripLength();
00428 float stripw = top_->pitch();
00429
00430
00431 if(debug) std::cout<<"MB4 \t \t \t Strip Lenght "<<stripl<<"cm"<<std::endl;
00432 if(debug) std::cout<<"MB4 \t \t \t Strip Width "<<stripw<<"cm"<<std::endl;
00433
00434 if(debug) std::cout<<"MB4 \t \t \t X Predicted in MB4DTLocal= "<<X<<"cm"<<std::endl;
00435 if(debug) std::cout<<"MB4 \t \t \t Y Predicted in MB4DTLocal= "<<Y<<"cm"<<std::endl;
00436 if(debug) std::cout<<"MB4 \t \t \t Z Predicted in MB4DTLocal= "<<Z<<"cm"<<std::endl;
00437
00438 float extrapolatedDistance = sqrt((Y-Yo34)*(Y-Yo34)+Dy*Dy);
00439
00440 if(debug) std::cout<<"MB4 \t \t \t segmentPositionMB3inMB4Frame"<<segmentPositionMB3inMB4Frame<<std::endl;
00441 if(debug) std::cout<<"MB4 \t \t \t segmentPositionMB4inMB4Frame"<<segmentPosition<<std::endl;
00442
00443 if(debug) std::cout<<"MB4 \t \t \t segmentDirMB3inMB4Frame"<<segDirMB3inMB4Frame<<std::endl;
00444 if(debug) std::cout<<"MB4 \t \t \t segmentDirMB4inMB4Frame"<<segmentDirectionMB4<<std::endl;
00445
00446 if(debug) std::cout<<"MB4 \t \t \t CenterRB4PositioninMB4Frame"<<CenterRollinMB4Frame<<std::endl;
00447
00448 if(debug) std::cout<<"MB4 \t \t \t Is the extrapolation distance ="<<extrapolatedDistance<<"less than "<<MaxDrb4<<std::endl;
00449
00450
00451 if(extrapolatedDistance<=MaxDrb4){
00452 if(debug) std::cout<<"MB4 \t \t \t yes"<<std::endl;
00453
00454 GlobalPoint GlobalPointExtrapolated = DTSurface4.toGlobal(LocalPoint(X,Y,Z));
00455
00456 if(debug) std::cout<<"MB4 \t \t \t Point ExtraPolated in Global"<<GlobalPointExtrapolated<< std::endl;
00457
00458 LocalPoint PointExtrapolatedRPCFrame = RPCSurfaceRB4.toLocal(GlobalPointExtrapolated);
00459
00460 if(debug) std::cout<<"MB4 \t \t \t Point Extrapolated in RPCLocal"<<PointExtrapolatedRPCFrame<< std::endl;
00461 if(debug) std::cout<<"MB4 \t \t \t Corner of the Roll = ("<<rsize*eyr<<","<<stripl*eyr<<")"<<std::endl;
00462 if(debug) std::cout<<"MB4 \t \t \t Info About the Point Extrapolated in X Abs ("<<fabs(PointExtrapolatedRPCFrame.x())<<","
00463 <<fabs(PointExtrapolatedRPCFrame.y())<<","<<fabs(PointExtrapolatedRPCFrame.z())<<")"<<std::endl;
00464
00465 if(debug) std::cout<<"MB4 \t \t \t Does the extrapolation go inside this roll?"<<std::endl;
00466
00467 if(fabs(PointExtrapolatedRPCFrame.z()) < 5. &&
00468 fabs(PointExtrapolatedRPCFrame.x()) < rsize*eyr &&
00469 fabs(PointExtrapolatedRPCFrame.y()) < stripl*eyr){
00470 if(debug) std::cout<<"MB4 \t \t \t \t yes"<<std::endl;
00471 if(debug) std::cout<<"MB4 \t \t \t \t Creating the RecHit"<<std::endl;
00472 RPCRecHit RPCPointMB4(rpcId,0,PointExtrapolatedRPCFrame);
00473 if(debug) std::cout<<"MB4 \t \t \t \t Clearing the RPCPointVector"<<std::endl;
00474 RPCPointVector.clear();
00475 if(debug) std::cout<<"MB4 \t \t \t \t Pushing Back"<<std::endl;
00476 RPCPointVector.push_back(RPCPointMB4);
00477 if(debug) std::cout<<"MB4 \t \t \t \t Putting for "<<rpcId<<std::endl;
00478 if(debug) std::cout<<"MB4 \t \t \t \t Filling container with "<<nameRoll
00479 <<" Point.x="<<PointExtrapolatedRPCFrame.x()<<" Point.y="<<PointExtrapolatedRPCFrame.y()<<" size="<<RPCPointVector.size()<<std::endl;
00480 if(debug) std::cout<<"MB4 \t \t \t \t Number of rolls already extrapolated in RB4 = "<<extrapolatedRolls.size()<<std::endl;
00481 if(find (extrapolatedRolls.begin(),extrapolatedRolls.end(),rpcId.rawId()) == extrapolatedRolls.end()){
00482 extrapolatedRolls.push_back(rpcId.rawId());
00483 _ThePoints->put(rpcId,RPCPointVector.begin(),RPCPointVector.end());
00484 }else{
00485 if(debug) std::cout<<"MB4 \t \t \t \t roll already extrapolated "<<rpcId<<std::endl;
00486 }
00487 if(debug) std::cout<<"MB4 \t \t \t \t Extrapolations done after this point = "<<extrapolatedRolls.size()<<std::endl;
00488 if(debug) for(uint32_t m=0;m<extrapolatedRolls.size();m++) std::cout<<"MB4 \t \t \t \t"<< extrapolatedRolls.at(m)<<std::endl;
00489 }else{
00490 if(debug) std::cout<<"MB4 \t \t \t \t No the prediction is outside of this roll"<<std::endl;
00491 }
00492 }
00493 else{
00494 if(debug) std::cout<<"MB4 \t \t \t No, Exrtrapolation too long!, canceled"<<std::endl;
00495 }
00496 }
00497 }else{
00498 if(debug) std::cout<<"MB4 \t \t \t \t I found segments in MB4 and MB3 adjacent wheel and/or sector but not compatibles, Diferent Directions"<<std::endl;
00499 }
00500 }else{
00501 if(debug) std::cout<<"MB4 \t \t \t No the same station or same wheel or segment dim in mb3 not 4D"<<std::endl;
00502 }
00503 }
00504 }else{
00505 if(debug) std::cout<<"MB4 \t \t \t Is NOT a 2D Segment"<<std::endl;
00506 }
00507 }else{
00508 if(debug) std::cout<<"MB4 \t \t \t \t There is not just one segment or is not in station 4"<<std::endl;
00509 }
00510 }
00511 }else{
00512 if(debug) std::cout<<"MB4 \t This event doesn't have 4D Segment"<<std::endl;
00513 }
00514 }
00515 }
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528 }
00529
00530
00531
00532 DTSegtoRPC::~DTSegtoRPC(){
00533 }