00001
00002
00003
00004
00005
00006
00007
00008
00009 #define Conv4HitsReco2_cxx
00010
00011
00012
00013 #include "RecoTracker/ConversionSeedGenerators/interface/Conv4HitsReco2.h"
00014 #include <time.h>
00015
00016 Conv4HitsReco2::Conv4HitsReco2(math::XYZVector &vPhotVertex, math::XYZVector &h1, math::XYZVector &h2, math::XYZVector &h3, math::XYZVector &h4)
00017 {
00018 Refresh(vPhotVertex, h1, h2, h3, h4);
00019 }
00020
00021 Conv4HitsReco2::~Conv4HitsReco2() { }
00022
00023
00024 void Conv4HitsReco2::Refresh(math::XYZVector &vPhotVertex, math::XYZVector &h1, math::XYZVector &h2, math::XYZVector &h3, math::XYZVector &h4)
00025 {
00026
00027 fPV = vPhotVertex; fPV.SetZ(0.);
00028 fHitv11 = h3; fHitv11.SetZ(0.); fHitv11 = fHitv11 - fPV;
00029 fHitv21 = h4; fHitv21.SetZ(0.); fHitv21 = fHitv21 - fPV;
00030 fHitv12 = h2; fHitv12.SetZ(0.); fHitv12 = fHitv12 - fPV;
00031 fHitv22 = h1; fHitv22.SetZ(0.); fHitv22 = fHitv22 - fPV;
00032
00033
00034 fMaxNumberOfIterations = 40;
00035 fFixedNumberOfIterations = 0;
00036 fRadiusECut = 10.0;
00037 fPhiECut = 0.03;
00038 fRECut = 0.5;
00039 fBField = 3.8;
00040
00041
00042 fCutSatisfied = 0;
00043 fSignSatisfied = 0;
00044 fSolved = 0;
00045
00046 fRecPhi = 0.;
00047 fRecR = 0.;
00048 fRecR1 = 0.;
00049 fRecR2 = 0.;
00050 fRadiusE = 0.;
00051 fRE = 0.;
00052 fPhiE = 0.;
00053 }
00054
00055 void Conv4HitsReco2::LocalTransformation(math::XYZVector v11, math::XYZVector v12, math::XYZVector v21, math::XYZVector v22,
00056 math::XYZVector &V11, math::XYZVector &V12, math::XYZVector &V21, math::XYZVector &V22,
00057 double NextPhi)
00058 {
00059 double x11,x12,x21,x22,y11,y12,y21,y22;
00060
00061 x11 = v11.X(); y11 = v11.Y();
00062 x12 = v12.X(); y12 = v12.Y();
00063 x21 = v21.X(); y21 = v21.Y();
00064 x22 = v22.X(); y22 = v22.Y();
00065
00066 double SINP = std::sin(NextPhi);
00067 double COSP = std::cos(NextPhi);
00068 double SignCOSP = 1.; if(COSP < 0.) SignCOSP = -1.;
00069 double AbsCOSP = std::fabs(COSP);
00070
00071 double X11 = -std::fabs(x11*SINP*SignCOSP - y11*AbsCOSP);
00072 double Y11 = std::fabs(y11*SINP*SignCOSP + x11*AbsCOSP);
00073
00074 double X21 = -std::fabs(x21*SINP*SignCOSP - y21*AbsCOSP);
00075 double Y21 = std::fabs(y21*SINP*SignCOSP + x21*AbsCOSP);
00076
00077 double X12 = std::fabs(x12*SINP*SignCOSP - y12*AbsCOSP);
00078 double Y12 = std::fabs(y12*SINP*SignCOSP + x12*AbsCOSP);
00079
00080 double X22 = std::fabs(x22*SINP*SignCOSP - y22*AbsCOSP);
00081 double Y22 = std::fabs(y22*SINP*SignCOSP + x22*AbsCOSP);
00082
00083 V11.SetXYZ(X11,Y11,0.);
00084 V12.SetXYZ(X12,Y12,0.);
00085 V21.SetXYZ(X21,Y21,0.);
00086 V22.SetXYZ(X22,Y22,0.);
00087 }
00088
00089
00090 int Conv4HitsReco2::ConversionCandidate(math::XYZVector &vtx, double &ptplus, double &ptminus)
00091 {
00092 Reconstruct();
00093
00094 ptplus = fRecR2 * fBField * 0.01 * 0.3;
00095 ptminus = fRecR1 * fBField * 0.01 * 0.3;
00096 vtx = fRecV;
00097
00098 return fLoop;
00099 }
00100
00101
00102 void Conv4HitsReco2::Reconstruct()
00103 {
00104 double x11,x12,x21,x22,y11,y12,y21,y22;
00105
00106 x11 = fHitv11.X(); y11 = fHitv11.Y();
00107 x12 = fHitv12.X(); y12 = fHitv12.Y();
00108 x21 = fHitv21.X(); y21 = fHitv21.Y();
00109 x22 = fHitv22.X(); y22 = fHitv22.Y();
00110
00111 if (fFixedNumberOfIterations==0)
00112 fLoop = fMaxNumberOfIterations;
00113 else fLoop = fFixedNumberOfIterations;
00114
00115
00116 double tempr1 = std::sqrt(y11*y11 + x11*x11);
00117 double tempr2 = std::sqrt(y12*y12 + x12*x12);
00118
00119 double Phi1 = 2.0 * std::atan(y11 / (x11+tempr1));
00120 double Phi2 = 2.0 * std::atan(y12 / (x12+tempr2));
00121
00122 if (Phi1<Phi2) Phi1 += 2.0 * 3.141592653;
00123
00124 fPhiE = std::fabs((Phi1-Phi2)) / std::pow(2.0, fLoop + 1);
00125
00126 double NextPhi = ( Phi1 + Phi2 ) / 2.0;
00127 double D1, D2 = 0.0;
00128 double prevR1 = 0; double prevR2 = 0;
00129 double R1 = 0; double R2 = 0;
00130
00131
00132 for (int i=0; i<fLoop; i++) {
00133
00134
00135 double SINP = std::sin(NextPhi);
00136 double COSP = std::cos(NextPhi);
00137 double SignCOSP = 1.; if(COSP < 0.) SignCOSP = -1.;
00138 double AbsCOSP = std::fabs(COSP);
00139
00140 double X11 = -std::fabs(x11*SINP*SignCOSP - y11*AbsCOSP);
00141 double Y11 = std::fabs(y11*SINP*SignCOSP + x11*AbsCOSP);
00142
00143 double X21 = -std::fabs(x21*SINP*SignCOSP - y21*AbsCOSP);
00144 double Y21 = std::fabs(y21*SINP*SignCOSP + x21*AbsCOSP);
00145
00146 double X12 = std::fabs(x12*SINP*SignCOSP - y12*AbsCOSP);
00147 double Y12 = std::fabs(y12*SINP*SignCOSP + x12*AbsCOSP);
00148
00149 double X22 = std::fabs(x22*SINP*SignCOSP - y22*AbsCOSP);
00150 double Y22 = std::fabs(y22*SINP*SignCOSP + x22*AbsCOSP);
00151
00152
00153
00154
00155
00156
00157 double d1 = Y21 - Y11;
00158 double d2 = Y22 - Y12;
00159
00160 if ( ( (X11*X11*d1*d1/(X21-X11)/(X21-X11) + X11*X21 + X11*d1*d1/(X21-X11)) < 0 ) ||
00161 ( (X12*X12*d2*d2/(X22-X12)/(X22-X12) + X12*X22 + X12*d2*d2/(X22-X12)) < 0 ) )
00162 { fSolved = -1; fLoop = i; return; }
00163
00164 else {
00165 fSolved = 1;
00166 D1 = X11*d1/(X21-X11);
00167 D1 = D1 + std::sqrt(X11*X11*d1*d1/(X21-X11)/(X21-X11) + X11*X21 + X11*d1*d1/(X21-X11));
00168 D2 = X12*d2/(X22-X12);
00169 D2 = D2 + std::sqrt(X12*X12*d2*d2/(X22-X12)/(X22-X12) + X12*X22 + X12*d2*d2/(X22-X12));
00170
00171 R1 = std::fabs((X11+X21)/2.0+(D1+d1/2.0)*d1/(X21-X11));
00172 R2 = std::fabs((X12+X22)/2.0+(D2+d2/2.0)*d2/(X22-X12));
00173
00174 if ((Y11-D1)>=(Y12-D2)) {
00175 Phi1 = NextPhi;
00176 Phi2 = Phi2;
00177 NextPhi = (Phi1+Phi2)/2.0;
00178 }
00179 else if ((Y11-D1)<(Y12-D2)) {
00180 Phi1 = Phi1;
00181 Phi2 = NextPhi;
00182 NextPhi = (Phi1+Phi2)/2.0;
00183 }
00184
00185
00186 double tmpPhiE = std::fabs(Phi1-Phi2);
00187 double tmpRE = std::fabs( (Y11 - D1) - (Y12 - D2) );
00188 double tmpRadiusE = ( std::fabs(R1-prevR1) + std::fabs(R2-prevR2) ) / 2.;
00189
00190
00191 if (( tmpPhiE <= fPhiECut ) && ( tmpRE <= fRECut ) && ( tmpRadiusE <= fRadiusECut ) && ( fFixedNumberOfIterations ==0 ))
00192 {
00193 fSolved = 1;
00194 fCutSatisfied = 1;
00195 fLoop = i+1;
00196 fPhiE = tmpPhiE;
00197 fRE = tmpRE;
00198 fRadiusE = tmpRadiusE;
00199 fRecR1 = R1;
00200 fRecR2 = R2;
00201 fRecR = ( (Y11 - D1) + (Y12 - D2) ) / 2.0;
00202 fRecPhi = NextPhi;
00203 fRecV.SetX( fRecR * cos(fRecPhi) );
00204 fRecV.SetY( fRecR * sin(fRecPhi) );
00205 fRecC1.SetXYZ( fRecV.X()-fRecR1*sin(fRecPhi), fRecV.Y()+fRecR1*cos(fRecPhi), 0.);
00206 fRecC2.SetXYZ( fRecV.X()+fRecR2*sin(fRecPhi), fRecV.Y()-fRecR2*cos(fRecPhi), 0.);
00207 fRecV = fRecV + fPV;
00208 fRecC1 = fRecC1 + fPV;
00209 fRecC2 = fRecC2 + fPV;
00210 fCutSatisfied = 1;
00211 if ( (R1>0)&&(R2>0)&&(D1>0)&&(D2>0)&&((Y11-D1)>0)&&((Y12-D2)>0) ) fSignSatisfied = 1;
00212 else fSignSatisfied = 0;
00213 }
00214 else if (i==fLoop-1) {
00215 fSolved = 1;
00216 fCutSatisfied = 1;
00217 fLoop = i+1;
00218 fPhiE = tmpPhiE;
00219 fRE = tmpRE;
00220 fRadiusE = tmpRadiusE;
00221 fRecR1 = R1;
00222 fRecR2 = R2;
00223 fRecR = ( (Y11 - D1) + (Y12 - D2) ) / 2.0;
00224 fRecPhi = NextPhi;
00225 fRecV.SetX( fRecR * cos(fRecPhi) );
00226 fRecV.SetY( fRecR * sin(fRecPhi) );
00227 fRecC1.SetXYZ( fRecV.X()-fRecR1*sin(fRecPhi), fRecV.Y()+fRecR1*cos(fRecPhi), 0.);
00228 fRecC2.SetXYZ( fRecV.X()+fRecR2*sin(fRecPhi), fRecV.Y()-fRecR2*cos(fRecPhi), 0.);
00229 fRecV = fRecV + fPV;
00230 fRecC1 = fRecC1 + fPV;
00231 fRecC2 = fRecC2 + fPV;
00232 fCutSatisfied = 0;
00233 if ( (R1>0)&&(R2>0)&&(D1>0)&&(D2>0)&&((Y11-D1)>0)&&((Y12-D2)>0) ) fSignSatisfied = 1;
00234 else fSignSatisfied = 0;
00235 }
00236
00237 prevR1 = R1; prevR2 = R2;
00238
00239 }
00240 }
00241 }
00242
00243
00244 void Conv4HitsReco2::Dump()
00245 {
00246 std::cout << std::endl<< "================================================" << std::endl;
00247 std::cout << " Nothing happend here.";
00248 if (fSolved==1) std::cout << "Solved.";
00249 if (fCutSatisfied==1) std::cout << "Cut good.";
00250 if (fSignSatisfied==1) std::cout << "Sign good.";
00251
00252 }
00253
00254 math::XYZVector Conv4HitsReco2::GetPlusCenter(double &plusR)
00255 {
00256 plusR = fRecR1;
00257 return fRecC1;
00258
00259 }
00260 math::XYZVector Conv4HitsReco2::GetMinusCenter(double &minusR)
00261 {
00262 minusR = fRecR2;
00263 return fRecC2;
00264 }