00001 #include "FastSimulation/TrackingRecHitProducer/interface/GSRecHitMatcher.h"
00002
00003 #include "DataFormats/DetId/interface/DetId.h"
00004 #include "Geometry/CommonDetUnit/interface/GeomDetUnit.h"
00005 #include "Geometry/CommonTopologies/interface/StripTopology.h"
00006 #include "Geometry/TrackerGeometryBuilder/interface/GluedGeomDet.h"
00007 #include <cfloat>
00008
00009 SiTrackerGSMatchedRecHit2D * GSRecHitMatcher::match(const SiTrackerGSRecHit2D *monoRH,
00010 const SiTrackerGSRecHit2D *stereoRH,
00011 const GluedGeomDet* gluedDet,
00012 LocalVector& trackdirection) const
00013 {
00014
00015
00016
00017
00018 const GeomDetUnit* stripdet = gluedDet->monoDet();
00019 const GeomDetUnit* partnerstripdet = gluedDet->stereoDet();
00020 const StripTopology& topol=(const StripTopology&)stripdet->topology();
00021
00022 LocalPoint position;
00023
00024
00025 MeasurementPoint RPHIpoint=topol.measurementPosition(monoRH->localPosition());
00026 MeasurementPoint RPHIpointini=MeasurementPoint(RPHIpoint.x(),-0.5);
00027 MeasurementPoint RPHIpointend=MeasurementPoint(RPHIpoint.x(),0.5);
00028
00029
00030 StripPosition stripmono=StripPosition(topol.localPosition(RPHIpointini),topol.localPosition(RPHIpointend));
00031
00032 if(trackdirection.mag2()<FLT_MIN){
00033 LocalPoint lcenterofstrip=monoRH->localPosition();
00034 GlobalPoint gcenterofstrip=(stripdet->surface()).toGlobal(lcenterofstrip);
00035 GlobalVector gtrackdirection=gcenterofstrip-GlobalPoint(0,0,0);
00036 trackdirection=(gluedDet->surface()).toLocal(gtrackdirection);
00037 }
00038
00039
00040 StripPosition projectedstripmono=project(stripdet,gluedDet,stripmono,trackdirection);
00041 const StripTopology& partnertopol=(const StripTopology&)partnerstripdet->topology();
00042
00043
00044 LocalVector RPHIpositiononGluedendvector=projectedstripmono.second-projectedstripmono.first;
00045 double c1=sin(RPHIpositiononGluedendvector.phi());
00046 double s1=-cos(RPHIpositiononGluedendvector.phi());
00047 MeasurementError errormonoRH=topol.measurementError(monoRH->localPosition(),monoRH->localPositionError());
00048 double pitch=topol.localPitch(monoRH->localPosition());
00049 double sigmap12=errormonoRH.uu()*pitch*pitch;
00050
00051
00052 MeasurementPoint STEREOpoint=partnertopol.measurementPosition(stereoRH->localPosition());
00053
00054 MeasurementPoint STEREOpointini=MeasurementPoint(STEREOpoint.x(),-0.5);
00055 MeasurementPoint STEREOpointend=MeasurementPoint(STEREOpoint.x(),0.5);
00056
00057
00058 StripPosition stripstereo(partnertopol.localPosition(STEREOpointini),partnertopol.localPosition(STEREOpointend));
00059
00060
00061 StripPosition projectedstripstereo=project(partnerstripdet,gluedDet,stripstereo,trackdirection);
00062
00063
00064
00065 AlgebraicMatrix22 m; AlgebraicVector2 c, solution;
00066 m(0,0)=-(projectedstripmono.second.y()-projectedstripmono.first.y()); m(0,1)=(projectedstripmono.second.x()-projectedstripmono.first.x());
00067 m(1,0)=-(projectedstripstereo.second.y()-projectedstripstereo.first.y()); m(1,1)=(projectedstripstereo.second.x()-projectedstripstereo.first.x());
00068 c(0)=m(0,1)*projectedstripmono.first.y()+m(0,0)*projectedstripmono.first.x();
00069 c(1)=m(1,1)*projectedstripstereo.first.y()+m(1,0)*projectedstripstereo.first.x();
00070 m.Invert(); solution = m * c;
00071 position=LocalPoint(solution(0),solution(1));
00072
00073
00074
00075
00076
00077
00078
00079 LocalError tempError (100,0,100);
00080
00081
00082 LocalVector stereopositiononGluedendvector=projectedstripstereo.second-projectedstripstereo.first;
00083 double c2=sin(stereopositiononGluedendvector.phi()); double s2=-cos(stereopositiononGluedendvector.phi());
00084 MeasurementError errorstereoRH=partnertopol.measurementError(stereoRH->localPosition(), stereoRH->localPositionError());
00085 pitch=partnertopol.localPitch(stereoRH->localPosition());
00086 double sigmap22=errorstereoRH.uu()*pitch*pitch;
00087 double diff=(c1*s2-c2*s1);
00088 double invdet2=1/(diff*diff);
00089 float xx=invdet2*(sigmap12*s2*s2+sigmap22*s1*s1);
00090 float xy=-invdet2*(sigmap12*c2*s2+sigmap22*c1*s1);
00091 float yy=invdet2*(sigmap12*c2*c2+sigmap22*c1*c1);
00092 LocalError error=LocalError(xx,xy,yy);
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102 DetId det(monoRH->geographicalId());
00103 if(det.subdetId() > 2) {
00104 SiTrackerGSRecHit2D *adjustedMonoRH = new SiTrackerGSRecHit2D(LocalPoint(monoRH->localPosition().x(),0,0),
00105 monoRH->localPositionError(),
00106 monoRH->geographicalId(),
00107 monoRH->simhitId(),
00108 monoRH->simtrackId(),
00109 monoRH->eeId(),
00110 monoRH->cluster(),
00111 monoRH->simMultX(),
00112 monoRH->simMultY()
00113 );
00114
00115 SiTrackerGSRecHit2D *adjustedStereoRH = new SiTrackerGSRecHit2D(LocalPoint(stereoRH->localPosition().x(),0,0),
00116 stereoRH->localPositionError(),
00117 stereoRH->geographicalId(),
00118 stereoRH->simhitId(),
00119 stereoRH->simtrackId(),
00120 stereoRH->eeId(),
00121 stereoRH->cluster(),
00122 stereoRH->simMultX(),
00123 stereoRH->simMultY()
00124 );
00125
00126 SiTrackerGSMatchedRecHit2D *rV= new SiTrackerGSMatchedRecHit2D(position, error,gluedDet->geographicalId(), monoRH->simhitId(),
00127 monoRH->simtrackId(), monoRH->eeId(), monoRH->cluster(),
00128 monoRH->simMultX(), monoRH->simMultY(),
00129 true, adjustedMonoRH, adjustedStereoRH);
00130 delete adjustedMonoRH;
00131 delete adjustedStereoRH;
00132 return rV;
00133 }
00134
00135 else {
00136 throw cms::Exception("GSRecHitMatcher") << "Matched Pixel!?";
00137 }
00138 }
00139
00140
00141 GSRecHitMatcher::StripPosition
00142 GSRecHitMatcher::project(const GeomDetUnit *det,
00143 const GluedGeomDet* glueddet,
00144 const StripPosition& strip,
00145 const LocalVector& trackdirection)const
00146 {
00147
00148 GlobalPoint globalpointini=(det->surface()).toGlobal(strip.first);
00149 GlobalPoint globalpointend=(det->surface()).toGlobal(strip.second);
00150
00151
00152 LocalPoint positiononGluedini=(glueddet->surface()).toLocal(globalpointini);
00153 LocalPoint positiononGluedend=(glueddet->surface()).toLocal(globalpointend);
00154
00155
00156
00157 float scale=-positiononGluedini.z()/trackdirection.z();
00158
00159 LocalPoint projpositiononGluedini= positiononGluedini + scale*trackdirection;
00160 LocalPoint projpositiononGluedend= positiononGluedend + scale*trackdirection;
00161
00162 return StripPosition(projpositiononGluedini,projpositiononGluedend);
00163 }
00164
00165
00166
00167 SiTrackerGSMatchedRecHit2D * GSRecHitMatcher::projectOnly( const SiTrackerGSRecHit2D *monoRH,
00168 const GeomDet * monoDet,
00169 const GluedGeomDet* gluedDet,
00170 LocalVector& ldir) const
00171 {
00172 LocalPoint position(monoRH->localPosition().x(), 0.,0.);
00173 const BoundPlane& gluedPlane = gluedDet->surface();
00174 const BoundPlane& hitPlane = monoDet->surface();
00175
00176 double delta = gluedPlane.localZ( hitPlane.position());
00177
00178 LocalPoint lhitPos = gluedPlane.toLocal( monoDet->surface().toGlobal(position ) );
00179 LocalPoint projectedHitPos = lhitPos - ldir * delta/ldir.z();
00180
00181 LocalVector hitXAxis = gluedPlane.toLocal( hitPlane.toGlobal( LocalVector(1,0,0)));
00182 LocalError hitErr = monoRH->localPositionError();
00183
00184 if (gluedPlane.normalVector().dot( hitPlane.normalVector()) < 0) {
00185
00186 hitErr = LocalError( hitErr.xx(), -hitErr.xy(), hitErr.yy());
00187 }
00188 LocalError rotatedError = hitErr.rotate( hitXAxis.x(), hitXAxis.y());
00189
00190
00191 const GeomDetUnit *gluedMonoDet = gluedDet->monoDet();
00192 const GeomDetUnit *gluedStereoDet = gluedDet->stereoDet();
00193 int isMono = 0;
00194 int isStereo = 0;
00195
00196 if(monoDet->geographicalId()==gluedMonoDet->geographicalId()) isMono = 1;
00197 if(monoDet->geographicalId()==gluedStereoDet->geographicalId()) isStereo = 1;
00198
00199
00200
00201
00202
00203
00204 SiTrackerGSRecHit2D *adjustedRH = new SiTrackerGSRecHit2D(LocalPoint(monoRH->localPosition().x(),0,0),
00205 monoRH->localPositionError(),
00206 monoRH->geographicalId(),
00207 monoRH->simhitId(),
00208 monoRH->simtrackId(),
00209 monoRH->eeId(),
00210 monoRH->cluster(),
00211 monoRH->simMultX(),
00212 monoRH->simMultY()
00213 );
00214
00215
00216 SiTrackerGSRecHit2D *otherRH = new SiTrackerGSRecHit2D(LocalPoint(-10000,-10000,-10000), LocalError(0,0,0),DetId(000000000), 0,0,0,monoRH->cluster(),0,0);
00217 if ((isMono && isStereo)||(!isMono&&!isStereo)) throw cms::Exception("GSRecHitMatcher") << "Something wrong with DetIds.";
00218 else if (isMono) {
00219 SiTrackerGSMatchedRecHit2D *rV= new SiTrackerGSMatchedRecHit2D(projectedHitPos, rotatedError, gluedDet->geographicalId(),
00220 monoRH->simhitId(), monoRH->simtrackId(), monoRH->eeId(), monoRH->cluster(),
00221 monoRH->simMultX(), monoRH->simMultY(), false, adjustedRH, otherRH);
00222 delete adjustedRH;
00223 delete otherRH;
00224 return rV;
00225 }
00226
00227 else{
00228 SiTrackerGSMatchedRecHit2D *rV=new SiTrackerGSMatchedRecHit2D(projectedHitPos, rotatedError, gluedDet->geographicalId(),
00229 monoRH->simhitId(), monoRH->simtrackId(), monoRH->eeId(), monoRH->cluster(),
00230 monoRH->simMultX(), monoRH->simMultY(), false, otherRH, adjustedRH);
00231 delete adjustedRH;
00232 delete otherRH;
00233 return rV;
00234 }
00235 }