CMS 3D CMS Logo

Conv4HitsReco.cc
Go to the documentation of this file.
1 #define Conv4HitsReco_cxx
2 #include "Conv4HitsReco.h"
4 #include <sstream>
5 // 1 -> 4
6 // 2 -> 3
7 // 3 -> 2
8 // 4 -> 1
9 
11  return (Tq * O0 - T0 * Oq) / (Tq * Om - Tm * Oq); //dm
12 }
13 
15  return (Tm * O0 - T0 * Om) / (Tm * Oq - Tq * Om); //dq
16 }
17 
18 void Conv4HitsReco::SetLinSystCoeff(double m, double q) {
19  // dq*Tq + dm*Tm = T0 // Tangent condition
20  // dq*Oq + dm*Om = O0 // Orthogonality condition
21 
22  double sqrtEta2mm = sqrt(_eta2 + m * m);
23  double sqrtPi2qq = sqrt(_pi2 + q * q);
24 
25  double signT = 1.;
26 
27  Tq = -2. * pPN + 2. * m * pn + signT * 2. * q * sqrtEta2mm / sqrtPi2qq;
28  Tm = 2. * nPN + 2. * q * pn + signT * 2. * m * sqrtPi2qq / sqrtEta2mm;
29  T0 = PN2 - _eta2 - _pi2 - 2. * q * m * pn + 2. * q * pPN - 2. * m * nPN - signT * 2. * sqrtEta2mm * sqrtPi2qq;
30 
31  TVector3 vQminusM = q * unitVp - m * unitVn + vPminusN;
32  double QM = vQminusM.Mag();
33  double pQM = unitVp * vQminusM;
34  double nQM = unitVn * vQminusM;
35  double NVQM = vNminusV * vQminusM;
36 
37  double signO = 1.;
38 
39  Oq = sqrtEta2mm * pQM / QM + m * pn + pNV;
40  Om = m * QM / sqrtEta2mm - signO * sqrtEta2mm * nQM / QM + nQM - nNV - m;
41  O0 = -signO * sqrtEta2mm * QM - m * nQM - NVQM;
42 }
43 
45  std::stringstream ss;
46  TVector3 vPminusM = vPminusN - m * unitVn;
47  double m2 = m * m;
48  double nPM = unitVn * vPminusM;
49  double pPM = unitVp * vPminusM;
50  double NVPM = vNminusV * vPminusM;
51 
52  double alpha = (m * pn + pNV) * (m * pn + pNV) - _eta2 - m2;
53  double beta = m2 * pn * nPM + m * pn * NVPM + m * nPM * pNV - pPM * (_eta2 + m2) + pNV * NVPM;
54  double gamma = m2 * nPM * nPM + NVPM * NVPM + 2. * m * nPM * NVPM - vPminusM.Mag2() * (_eta2 + m2);
55 
56  double disc = sqrt(beta * beta - alpha * gamma);
57 
58  double q01 = (-beta + disc) / alpha;
59  double q02 = (-beta - disc) / alpha;
60 
61  ss << " m: " << m << " q01: " << std::setw(20) << q01 << " q02: " << std::setw(20) << q02 << "/n";
62  return ss.str();
63 }
64 
65 double Conv4HitsReco::qFromM(double m) {
66  LogDebug("Conv4HitsReco") << qFromM_print(m);
67  return 0.;
68 }
69 
71  radius = plusRadius;
72  return plusCenter;
73 }
74 
76  radius = minusRadius;
77  return minusCenter;
78 }
79 
80 //
81 //Point of intersection between two lines (each identified by a vector and a point)
82 TVector3 Conv4HitsReco::GetIntersection(TVector3 &V1, TVector3 &p1, TVector3 &V2, TVector3 &p2) {
83  TVector3 v1 = V1.Unit();
84  TVector3 v2 = V2.Unit();
85 
86  double v1v2 = v1 * v2;
87  return v2 * ((p1 - p2) * (v1v2 * v1 - v2) / (v1v2 * v1v2 - 1.)) + p2;
88 }
89 
90 double Conv4HitsReco::GetPtFromParamAndHitPair(double &m, double &eta) {
91  return 0.01 * 0.3 * 3.8 * sqrt(m * m + eta * eta);
92 }
93 
95 
97 
98 TVector3 Conv4HitsReco::GetConvVertexFromParams(double &m, double &q) {
99  TVector3 unitVQminusM = (plusCenter - minusCenter).Unit();
100  TVector3 vtxViaPlus = vP + q * unitVp - plusRadius * unitVQminusM;
101  TVector3 vtxViaMinus = vN + m * unitVn + minusRadius * unitVQminusM;
102 
103  // return 0.5*(vN+m*unitVn+m*unitVQminusM+vP+q*unitVp-q*unitVQminusM);
104  LogDebug("Conv4HitsReco") << ">>>>>>>> Conversion vertex computed via Plus pair\n"
105  << vtxViaPlus.x() << "," << vtxViaPlus.y() << "," << vtxViaPlus.z()
106  << ">>>>>>>> Conversion vertex computed via Minus pair\n"
107  << vtxViaMinus.x() << "," << vtxViaMinus.y() << "," << vtxViaMinus.z();
108 
109  return 0.5 * (vtxViaPlus + vtxViaMinus);
110 }
111 
112 int Conv4HitsReco::ConversionCandidate(TVector3 &vtx, double &ptplus, double &ptminus) {
113  double m;
114  double q;
115  int nits = 0;
116 
117  int isNotValidBefore = ComputeMaxLimits() + ComputeMinLimits();
118  int isNotValidAfter = 0;
119  if (!isNotValidBefore) {
120  GuessStartingValues(m, q);
121  nits = mqFindByIteration(m, q);
122 
123  if (q > qMaxLimit || q < qMinLimit) {
124  isNotValidAfter = 1;
125  LogDebug("Conv4HitsReco") << ">>>>>>>> quad result not valid for q: qMin= " << qMinLimit << " q= " << q
126  << " qMax= " << qMaxLimit << "\n";
127  }
128  if (m > mMaxLimit || m < mMinLimit) {
129  isNotValidAfter = 1;
130  LogDebug("Conv4HitsReco") << ">>>>>>>> quad result not valid for m: mMin= " << mMinLimit << " m= " << m
131  << " mMax= " << mMaxLimit << "\n";
132  }
133 
134  ptminus = GetPtMinusFromParam(m);
135  ptplus = GetPtPlusFromParam(q);
136  minusCenter = vN + m * unitVn;
137  minusRadius = (hit4 - minusCenter).Mag();
138  plusCenter = vP + q * unitVp;
139  plusRadius = (hit1 - plusCenter).Mag();
141  vtx = convVtx;
142  }
143 
144  if (isNotValidBefore)
145  return 0;
147  return -1000;
149  return -2000;
150  if (isNotValidAfter)
151  return -1 * nits;
152  return nits;
153 }
154 
155 int Conv4HitsReco::mqFindByIteration(double &m, double &q) {
156  int maxIte = maxNumberOfIterations;
158  double edm = 1.;
159  double edq = 1.;
160  int i = 0;
161  while (((edq > err) || (edm > err)) && (i < maxIte)) {
162  SetLinSystCoeff(m, q);
163  double dm = GetDm();
164  double dq = GetDq();
165  /*
166  while( m+dm > mMaxLimit || m+dm < mMinLimit || q+dq > qMaxLimit || q+dq < qMinLimit ){
167 
168  LogDebug("Conv4HitsReco")<<">>>>>>>> Going outside limits, reducing increments \n";
169  dm=dm/2.;
170  dq=dq/2.;
171  }
172  */
173  m += dm;
174  q += dq;
175  edm = fabs(dm / m);
176  edq = fabs(dq / q);
177  LogDebug("Conv4HitsReco") << ">>>>>>>> Iteration " << i << " m: " << m << " q: " << q << " dm: " << dm
178  << " dq: " << dq << " edm: " << edm << " edq: " << edq << "\n";
179  i++;
180  }
181 
182  return i;
183 }
184 
186  // Q max limit
187  TVector3 vVminusHit2Orthogonal = (vV - hit2).Orthogonal();
188  TVector3 medianPointHit2V = 0.5 * (vV + hit2);
189  vQMaxLimit = GetIntersection(vVminusHit2Orthogonal, medianPointHit2V, unitVp, vP);
190  qMaxLimit = (vQMaxLimit - vP).Mag();
191 
192  // M max limit
193  TVector3 vVminusHit3Orthogonal = (vV - hit3).Orthogonal();
194  TVector3 medianPointHit3V = 0.5 * (vV + hit3);
195  vMMaxLimit = GetIntersection(vVminusHit3Orthogonal, medianPointHit3V, unitVn, vN);
196  mMaxLimit = (vMMaxLimit - vN).Mag();
197 
198  LogDebug("Conv4HitsReco") << " >>>>>> Limits: qMax= " << qMaxLimit << " ==>pt "
199  << GetPtFromParamAndHitPair(qMaxLimit, _pi) << " mMax= " << mMaxLimit << " ==>pt "
201 
202  return IsNotValidForPtLimit(mMaxLimit, qMaxLimit, ptLegMinCut, 100000.); //Max limit not applied here
203 }
204 
205 int Conv4HitsReco::IsNotValidForPtLimit(double m, double q, double ptmin, double ptmax) {
206  if (GetPtFromParamAndHitPair(q, _pi) < ptmin)
207  return 1;
208  if (GetPtFromParamAndHitPair(m, _eta) < ptmin)
209  return 1;
210  if (GetPtFromParamAndHitPair(q, _pi) > ptmax)
211  return 1;
212  if (GetPtFromParamAndHitPair(m, _eta) > ptmax)
213  return 1;
214  return 0;
215 }
216 
218  TVector3 hitAve = 0.25 * (hit1 + hit2 + hit3 + hit4);
219  if ((convVtx - hitAve).Mag() > maxDist)
220  return 1;
221  return 0;
222 }
223 
225  //Evaluate if quad is valid and compute min limits
226  if (((vV - vQMaxLimit).Cross(vMMaxLimit - vQMaxLimit)).Z() > 0.) {
227  //
228  //Quad is invalid
229  LogDebug("Conv4HitsReco") << " >>>>>> Quad is invalid\n";
230  return 1;
231  } else {
232  //
233  // Compute q and m Min limits
234  TVector3 vQMinLimit = GetIntersection(v1minus2, vMMaxLimit, unitVp, vP);
235  qMinLimit = (vQMinLimit - vP) * unitVp;
236  TVector3 vMMinLimit = GetIntersection(v3minus4, vQMaxLimit, unitVn, vN);
237  mMinLimit = (vMMinLimit - vN) * unitVn;
238  if (mMinLimit > mMaxLimit || qMinLimit > qMaxLimit) {
239  LogDebug("Conv4HitsReco") << " >>>>>> Quad is invalid. qMin= " << qMinLimit << " mMin= " << mMinLimit << "\n";
240  return 2;
241  }
242  if (IsNotValidForPtLimit(mMinLimit, qMinLimit, -1000., ptLegMaxCut)) { //Min limit not applied here
243  return 2;
244  }
245 
246  LogDebug("Conv4HitsReco") << " >>>>>> Quad is valid. qMin= " << qMinLimit << " mMin= " << mMinLimit << "\n";
247  return 0;
248  }
249 }
250 
251 int Conv4HitsReco::GuessStartingValues(double &m, double &q) {
252  /*
253  m = 0.5*(mMinLimit+mMaxLimit);
254  q = 0.5*(qMinLimit+qMaxLimit);
255  */
256 
257  m = mMaxLimit;
258  q = qMaxLimit;
259 
260  LogDebug("Conv4HitsReco") << " >>>>>> Starting values: q= " << q << " m= " << m << "\n";
261 
262  return 0;
263 }
264 
266  LogDebug("Conv4HitsReco") << " ======================================= "
267  << "\n"
268  << " Photon Vertex: " << vV.x() << "," << vV.y() << "," << vV.z() << " Hit1: " << hit1.x()
269  << "," << hit1.y() << "," << hit1.z() << " Hit2: " << hit2.x() << "," << hit2.y() << ","
270  << hit2.z() << " Hit3: " << hit3.x() << "," << hit3.y() << "," << hit3.z()
271  << " Hit4: " << hit4.x() << "," << hit4.y() << "," << hit4.z() << " N: " << vN.x() << ","
272  << vN.y() << "," << vN.z() << " P: " << vP.x() << "," << vP.y() << "," << vP.z()
273  << " P-N: " << vPminusN.x() << "," << vP.y() << "," << vP.z() << " n: " << unitVn.x() << ","
274  << unitVn.y() << "," << unitVn.z() << " p: " << unitVp.x() << "," << unitVp.y() << ","
275  << unitVp.z() << " eta: " << _eta << " pi: " << _pi << "\n";
276 }
#define LogDebug(id)
TVector3 GetMinusCenter(double &)
int IsNotValidForPtLimit(double, double, double, double)
double minusRadius
Definition: Conv4HitsReco.h:50
TVector3 unitVp
Definition: Conv4HitsReco.h:28
TVector3 vNminusV
Definition: Conv4HitsReco.h:26
TVector3 vMMaxLimit
Definition: Conv4HitsReco.h:40
TVector3 hit3
Definition: Conv4HitsReco.h:15
double ptLegMaxCut
Definition: Conv4HitsReco.h:56
double GetPtMinusFromParam(double &)
double GetDm()
double mMaxLimit
Definition: Conv4HitsReco.h:43
double GetPtPlusFromParam(double &)
int GuessStartingValues(double &, double &)
int ComputeMinLimits()
double GetPtFromParamAndHitPair(double &, double &)
double qMaxLimit
Definition: Conv4HitsReco.h:42
TVector3 hit2
Definition: Conv4HitsReco.h:16
int IsNotValidForVtxPosition(double &)
double plusRadius
Definition: Conv4HitsReco.h:49
T sqrt(T t)
Definition: SSEVec.h:19
double GetDq()
TVector3 GetIntersection(TVector3 &, TVector3 &, TVector3 &, TVector3 &)
TVector3 hit4
Definition: Conv4HitsReco.h:14
int maxNumberOfIterations
Definition: Conv4HitsReco.h:53
TVector3 hit1
Definition: Conv4HitsReco.h:17
int mqFindByIteration(double &, double &)
TVector3 vPminusN
Definition: Conv4HitsReco.h:24
double p2[4]
Definition: TauolaWrapper.h:90
TVector3 vQMaxLimit
Definition: Conv4HitsReco.h:41
TVector3 minusCenter
Definition: Conv4HitsReco.h:47
int ComputeMaxLimits()
TVector3 convVtx
Definition: Conv4HitsReco.h:48
double mMinLimit
Definition: Conv4HitsReco.h:45
void SetLinSystCoeff(double, double)
double ptLegMinCut
Definition: Conv4HitsReco.h:55
TVector3 GetConvVertexFromParams(double &, double &)
TVector3 plusCenter
Definition: Conv4HitsReco.h:46
int ConversionCandidate(TVector3 &, double &, double &)
double ptmin
Definition: HydjetWrapper.h:84
HLT enums.
double p1[4]
Definition: TauolaWrapper.h:89
double qFromM(double)
TVector3 v1minus2
Definition: Conv4HitsReco.h:21
TVector3 GetPlusCenter(double &)
alpha
zGenParticlesMatch = cms.InputTag(""),
TVector3 unitVn
Definition: Conv4HitsReco.h:27
double qMinLimit
Definition: Conv4HitsReco.h:44
double maxVtxDistance
Definition: Conv4HitsReco.h:54
Definition: Tm.h:13
TVector3 v3minus4
Definition: Conv4HitsReco.h:20
double iterationStopRelThreshold
Definition: Conv4HitsReco.h:52
std::string qFromM_print(double m)