001 #include "GaudiKernel/ToolFactory.h"
002 #include "GaudiKernel/SmartDataPtr.h"
003 #include "GaudiKernel/IDataProviderSvc.h"
004
005
006 #include "TrkParameters/MeasuredPerigee.h"
007
008
009 #include "STACOTools/StacoCombineTool.h"
010
011 StacoCombineTool::StacoCombineTool(const std::string& t,
012 const std::string& n,
013 const IInterface* p ):AthAlgTool(t,n,p)
014 {
015 declareInterface<IStacoCombineTool>(this);
016
017 declareProperty("PreSelOpt1" , m_PreSelOpt1 = 1 ) ;
018 declareProperty("PreSelOpt1DeltaR" , m_PreSelOpt1DeltaR = 0.5 ) ;
019
020 declareProperty("PreSelOpt2" , m_PreSelOpt2 = 0 ) ;
021 declareProperty("PreSelOpt2DeltaZ0CTE" , m_PreSelOpt2DeltaZ0CTE = 800. ) ;
022 declareProperty("PreSelOpt2DeltaZ0SLOPE" , m_PreSelOpt2DeltaZ0SLOPE = 0. ) ;
023 declareProperty("PreSelOpt2DeltaEtaCTE" , m_PreSelOpt2DeltaEtaCTE = 0.25 ) ;
024 declareProperty("PreSelOpt2DeltaEtaSLOPE" , m_PreSelOpt2DeltaEtaSLOPE = 0. ) ;
025
026 }
027
028 StacoCombineTool::~StacoCombineTool(){}
029
030
031 StatusCode StacoCombineTool::initialize(){
032
033 msg(MSG::INFO) << "Initialisation started " << endreq;
034
035 StatusCode sc = AthAlgTool::initialize();
036 if ( sc.isFailure() ) {
037 msg(MSG::FATAL) << " AthAlgTool::initialize() failed" << endreq;
038 return( StatusCode::FAILURE );
039 }
040
041 msg(MSG::INFO) << "================================" << endreq;
042 msg(MSG::INFO) << "=Proprieties are " << endreq;
043 msg(MSG::INFO) << "= PreSelOpt1 " << m_PreSelOpt1 << endreq;
044 msg(MSG::INFO) << "= PreSelOpt1DeltaR " << m_PreSelOpt1DeltaR << endreq;
045 msg(MSG::INFO) << "= " << endreq;
046 msg(MSG::INFO) << "= PreSelOpt2 " << m_PreSelOpt2 << endreq;
047 msg(MSG::INFO) << "= PreSelOpt2DeltaZ0CTE " << m_PreSelOpt2DeltaZ0CTE << endreq;
048 msg(MSG::INFO) << "= PreSelOpt2DeltaZ0SLOPE " << m_PreSelOpt2DeltaZ0SLOPE << endreq;
049 msg(MSG::INFO) << "= PreSelOpt2DeltaEtaCTE " << m_PreSelOpt2DeltaEtaCTE << endreq;
050 msg(MSG::INFO) << "= PreSelOpt2DeltaEtaSLOPE " << m_PreSelOpt2DeltaEtaSLOPE << endreq;
051 msg(MSG::INFO) << "================================" << endreq;
052
053
054 msg(MSG::INFO) << "Initialisation ended " << endreq;
055 return StatusCode::SUCCESS;
056
057 }
058
059 StatusCode StacoCombineTool::finalize(){return StatusCode::SUCCESS;}
060
061 bool StacoCombineTool::TheCombIdMu(
062 const Trk::MeasuredPerigee* pMeasuredPerigeeID,
063 const Trk::MeasuredPerigee* pMeasuredPerigeeMS,
064 double& Xi2,
065 double& ThePT
066 ){
067
068 ThePT = 1e20;
069 double Xi2Mu = 0. ;
070 double Xi2ID = 0. ;
071 double ParCB[5],covCB[15];
072
073 if (!TheCombIdMu(pMeasuredPerigeeID, pMeasuredPerigeeMS,
074 Xi2, Xi2Mu, Xi2ID, ParCB, covCB
075 )) return false;
076
077 ThePT =ParCB[4]/sin(ParCB[3]);
078
079 return true;
080
081 }
082
083 bool StacoCombineTool::TheCombIdMu(
084 const Trk::MeasuredPerigee* pMeasuredPerigeeID,
085 const Trk::MeasuredPerigee* pMeasuredPerigeeMS,
086 double& Xi2,double& Xi2ID,double& Xi2Mu,
087 double* ParCB,double* covCB
088 ){
089
090 Xi2 = 1e20 ;
091 Xi2Mu = 0. ;
092 Xi2ID = 0. ;
093
094 if ( pMeasuredPerigeeID == 0 ) return false;
095
096 if ( pMeasuredPerigeeMS == 0 ) return false;
097
098 if ( !Preselection(pMeasuredPerigeeID,pMeasuredPerigeeMS) ) return false;
099
100
101 double hid[22];
102 GetPar_TrackParticle(pMeasuredPerigeeID, hid);
103
104
105 double hmu[22];
106 GetPar_TrackParticle(pMeasuredPerigeeMS, hmu);
107
108
109
110 Xi2 = 0. ;
111 Xi2Mu = 0. ;
112 Xi2ID = 0. ;
113 double hcomb[22] ;
114
115 if(!(TheCombIdMu(hmu, hid, hcomb,Xi2, Xi2Mu, Xi2ID))){
116
117 Xi2 = 1e20;
118 return false;
119 }else{
120
121 HelToPar(hcomb, ParCB, covCB);
122 return true;
123 }
124
125 return true;
126
127 }
128
129 void StacoCombineTool::GetPar_TrackParticle(
130 const Trk::MeasuredPerigee* pMeasuredPerigee,
131 double* Param,double* CovMat
132 ){
133
134 for(int i=0; i<5; i++) {Param[i]=0.;}
135 for(int i=0; i<15; i++) {CovMat[i]=0.;}
136
137 if ( pMeasuredPerigee == 0 ) return ;
138
139
140
141
142 Param[0] = pMeasuredPerigee->parameters()[Trk::d0];
143 Param[1] = pMeasuredPerigee->parameters()[Trk::z0];
144 Param[2] = pMeasuredPerigee->parameters()[Trk::phi];
145 Param[3] = pMeasuredPerigee->parameters()[Trk::theta];
146 Param[4] = pMeasuredPerigee->parameters()[Trk::qOverP];
147
148
149 const Trk::ErrorMatrix& ermatrix=pMeasuredPerigee->localErrorMatrix();
150
151 CovMat[0] = ermatrix.covValue(Trk::d0,Trk::d0);
152 CovMat[1] = ermatrix.covValue(Trk::z0,Trk::d0);
153 CovMat[2] = ermatrix.covValue(Trk::z0,Trk::z0);
154 CovMat[3] = ermatrix.covValue(Trk::phi,Trk::d0);
155 CovMat[4] = ermatrix.covValue(Trk::phi,Trk::z0);
156 CovMat[5] = ermatrix.covValue(Trk::phi,Trk::phi);
157 CovMat[6] = ermatrix.covValue(Trk::theta,Trk::d0);
158 CovMat[7] = ermatrix.covValue(Trk::theta,Trk::z0);
159 CovMat[8] = ermatrix.covValue(Trk::theta,Trk::phi);
160 CovMat[9] = ermatrix.covValue(Trk::theta,Trk::theta);
161 CovMat[10] = ermatrix.covValue(Trk::qOverP,Trk::d0);
162 CovMat[11] = ermatrix.covValue(Trk::qOverP,Trk::z0);
163 CovMat[12] = ermatrix.covValue(Trk::qOverP,Trk::phi);
164 CovMat[13] = ermatrix.covValue(Trk::qOverP,Trk::theta);
165 CovMat[14] = ermatrix.covValue(Trk::qOverP,Trk::qOverP);
166
167 }
168
169
170
171
172
173
174
175
176
177
178 bool StacoCombineTool::TheCombIdMu(double* h1,double* h2,double* ht, double& Xi2,double& Xi21,double& Xi22)
179 {
180
181 const double pi2 = 6.2831853, pi = 3.1415927;
182
183
184
185
186
187
188
189 double w1[15];
190 if(!Invert55(&h1[7],w1))
191 {
192
193 h1[8] = 0.;
194 h1[10] = 0.;
195 h1[11] = 0.;
196 h1[13] = 0.;
197 h1[14] = 0.;
198 h1[15] = 0.;
199 h1[17] = 0.;
200 h1[18] = 0.;
201 h1[19] = 0.;
202 h1[20] = 0.;
203 if(!Invert55(&h1[7],w1)) return false;
204 }
205 double w2[15];
206 if(!Invert55(&h2[7],w2))
207 {
208
209 h2[8] = 0.;
210 h2[10] = 0.;
211 h2[11] = 0.;
212 h2[13] = 0.;
213 h2[14] = 0.;
214 h2[15] = 0.;
215 h2[17] = 0.;
216 h2[18] = 0.;
217 h2[19] = 0.;
218 h2[20] = 0.;
219 if(!Invert55(&h2[7],w2)) return false;
220 }
221
222 double vt[15];
223 for(int i=0; i<15; i++) {vt[i]=w1[i]+w2[i];}
224 if(!(Invert55(vt,vt))) return false;
225
226 double d1 = h1[0]-h2[0];
227 double d2 = h1[1]-h2[1];
228 double d3 = h1[2]-h2[2]; d3>pi ? d3-=pi2 : d3<-pi ? d3+=pi2 : d3=d3;
229 double d4 = h1[3]-h2[3];
230 double d5 = h1[4]-h2[4];
231
232 double e1 = w1[ 0]*d1+w1[ 1]*d2+w1[ 3]*d3+w1[ 6]*d4+w1[10]*d5;
233 double e2 = w1[ 1]*d1+w1[ 2]*d2+w1[ 4]*d3+w1[ 7]*d4+w1[11]*d5;
234 double e3 = w1[ 3]*d1+w1[ 4]*d2+w1[ 5]*d3+w1[ 8]*d4+w1[12]*d5;
235 double e4 = w1[ 6]*d1+w1[ 7]*d2+w1[ 8]*d3+w1[ 9]*d4+w1[13]*d5;
236 double e5 = w1[10]*d1+w1[11]*d2+w1[12]*d3+w1[13]*d4+w1[14]*d5;
237
238 double s1 = vt[ 0]*e1+vt[ 1]*e2+vt[ 3]*e3+vt[ 6]*e4+vt[10]*e5;
239 double s2 = vt[ 1]*e1+vt[ 2]*e2+vt[ 4]*e3+vt[ 7]*e4+vt[11]*e5;
240 double s3 = vt[ 3]*e1+vt[ 4]*e2+vt[ 5]*e3+vt[ 8]*e4+vt[12]*e5;
241 double s4 = vt[ 6]*e1+vt[ 7]*e2+vt[ 8]*e3+vt[ 9]*e4+vt[13]*e5;
242 double s5 = vt[10]*e1+vt[11]*e2+vt[12]*e3+vt[13]*e4+vt[14]*e5;
243
244
245
246 ht[0] = h2[0]+s1; d1=s1-d1;
247 ht[1] = h2[1]+s2; d2=s2-d2;
248 ht[2] = h2[2]+s3; d3=s3-d3;
249 ht[3] = h2[3]+s4; d4=s4-d4;
250 ht[4] = h2[4]+s5; d5=s5-d5;
251 ht[5] = h1[5];
252 ht[6] = h1[6];
253
254 for(int i=0;i<15;i++){
255 ht[i+7]=vt[i];
256 }
257
258
259
260 Xi22 = (s1*w2[ 0]+s2*w2[ 1]+s3*w2[ 3]+s4*w2[ 6]+s5*w2[10])*s1+
261 (s1*w2[ 1]+s2*w2[ 2]+s3*w2[ 4]+s4*w2[ 7]+s5*w2[11])*s2+
262 (s1*w2[ 3]+s2*w2[ 4]+s3*w2[ 5]+s4*w2[ 8]+s5*w2[12])*s3+
263 (s1*w2[ 6]+s2*w2[ 7]+s3*w2[ 8]+s4*w2[ 9]+s5*w2[13])*s4+
264 (s1*w2[10]+s2*w2[11]+s3*w2[12]+s4*w2[13]+s5*w2[14])*s5;
265
266 Xi21 = (d1*w1[ 0]+d2*w1[ 1]+d3*w1[ 3]+d4*w1[ 6]+d5*w1[10])*d1+
267 (d1*w1[ 1]+d2*w1[ 2]+d3*w1[ 4]+d4*w1[ 7]+d5*w1[11])*d2+
268 (d1*w1[ 3]+d2*w1[ 4]+d3*w1[ 5]+d4*w1[ 8]+d5*w1[12])*d3+
269 (d1*w1[ 6]+d2*w1[ 7]+d3*w1[ 8]+d4*w1[ 9]+d5*w1[13])*d4+
270 (d1*w1[10]+d2*w1[11]+d3*w1[12]+d4*w1[13]+d5*w1[14])*d5;
271
272 Xi2 = (Xi21+Xi22)/5.;
273 Xi21 = Xi21/5.;
274 Xi22 = Xi22/5.;
275
276
277 return true;
278 }
279
280
281
282
283
284
285
286
287
288
289
290
291
292 bool StacoCombineTool::Invert55 (double* a,double* b) {
293
294 double x1, x2, x3, x4, x5, y1, y2, y3, y4, y5;
295
296 if (a[ 0] <= 0. ) return (false);
297 x1 = 1./a[ 0],
298 x2 =-a[ 1]*x1,
299 x3 =-a[ 3]*x1,
300 x4 =-a[ 6]*x1,
301 x5 =-a[10]*x1;
302 if ((b[ 0] = a[ 2]+a[ 1]*x2)<=0.) return false;
303 b[ 1] = a[ 4]+a[ 3]*x2;
304 b[ 2] = a[ 5]+a[ 3]*x3;
305 b[ 3] = a[ 7]+a[ 6]*x2;
306 b[ 4] = a[ 8]+a[ 6]*x3;
307 b[ 5] = a[ 9]+a[ 6]*x4;
308 b[ 6] = a[11]+a[10]*x2;
309 b[ 7] = a[12]+a[10]*x3;
310 b[ 8] = a[13]+a[10]*x4;
311 b[ 9] = a[14]+a[10]*x5;
312 y1 = 1./b[ 0],
313 y2 =-b[ 1]*y1,
314 y3 =-b[ 3]*y1,
315 y4 =-b[ 6]*y1,
316 y5 = x2 *y1;
317 if ((b[ 0] = b[ 2]+b[ 1]*y2)<=0.) return false;
318 b[ 1] = b[ 4]+b[ 3]*y2;
319 b[ 2] = b[ 5]+b[ 3]*y3;
320 b[ 3] = b[ 7]+b[ 6]*y2;
321 b[ 4] = b[ 8]+b[ 6]*y3;
322 b[ 5] = b[ 9]+b[ 6]*y4;
323 b[ 6] = x3 +x2 *y2;
324 b[ 7] = x4 +x2 *y3;
325 b[ 8] = x5 +x2 *y4;
326 b[ 9] = x1 +x2 *y5;
327 x2 =-b[ 1]*(x1 = 1./b[ 0]);
328 x3 =-b[ 3]* x1;
329 x4 = b[ 6]* x1;
330 x5 = y2 * x1;
331 if ((b[ 0] = b[ 2]+b[ 1]*x2)<=0.) return false;
332 b[ 1] = b[ 4]+b[ 3]*x2;
333 b[ 2] = b[ 5]+b[ 3]*x3;
334 b[ 3] = b[ 7]+b[ 6]*x2;
335 b[ 4] = b[ 8]+b[ 6]*x3;
336 b[ 5] = b[ 9]+b[ 6]*x4;
337 b[ 6] = y3 +y2 *x2;
338 b[ 7] = y4 +y2 *x3;
339 b[ 8] = y5 +y2 *x4;
340 b[ 9] = y1 +y2 *x5;
341 y2 =-b[ 1]*(y1 = 1./b[ 0]);
342 y3 = b[ 3]* y1;
343 y4 = b[ 6]* y1;
344 y5 = x2 * y1;
345 if ((b[ 0] = b[ 2]+b[ 1]*y2)<=0.) return false;
346 b[ 1] = b[ 4]+b[ 3]*y2;
347 b[ 2] = b[ 5]+b[ 3]*y3;
348 b[ 3] = b[ 7]+b[ 6]*y2;
349 b[ 4] = b[ 8]+b[ 6]*y3;
350 b[ 5] = b[ 9]+b[ 6]*y4;
351 b[ 6] = x3 +x2 *y2;
352 b[ 7] = x4 +x2 *y3;
353 b[ 8] = x5 +x2 *y4;
354 b[ 9] = x1 +x2 *y5;
355 b[10] = b[ 1]*(b[14] = 1./b[ 0]);
356 b[11] = b[ 3]* b[14];
357 b[12] = b[ 6]* b[14];
358 b[13] = y2 * b[14];
359 b[ 0] = b[ 2]+b[ 1]*b[10];
360 b[ 1] = b[ 4]+b[ 3]*b[10];
361 b[ 2] = b[ 5]+b[ 3]*b[11];
362 b[ 3] = b[ 7]+b[ 6]*b[10];
363 b[ 4] = b[ 8]+b[ 6]*b[11];
364 b[ 5] = b[ 9]+b[ 6]*b[12];
365 b[ 6] = y3 +y2 *b[10];
366 b[ 7] = y4 +y2 *b[11];
367 b[ 8] = y5 +y2 *b[12];
368 b[ 9] = y1 +y2 *b[13];
369 return true;
370 }
371
372
373
374
375
376
377 void StacoCombineTool::HelToPar (double* helix ,double* Param,double* CovMat )
378 {
379 for (int i= 0; i <5; ++i) {
380 Param[i] = helix[i];
381 }
382 CovMat[0] = helix[7];
383 CovMat[1] = helix[8];
384 CovMat[2] = helix[9];
385 CovMat[3] = helix[10];
386 CovMat[4] = helix[11];
387 CovMat[5] = helix[12];
388 CovMat[6] = helix[13];
389 CovMat[7] = helix[14];
390 CovMat[8] = helix[15];
391 CovMat[9] = helix[16];
392 CovMat[10] = helix[17];
393 CovMat[11] = helix[18];
394 CovMat[12] = helix[19];
395 CovMat[13] = helix[20];
396 CovMat[14] = helix[21];
397 }
398
399 void StacoCombineTool::GetPar_TrackParticle(const Trk::MeasuredPerigee* pMeasuredPerigee,double* hpe)
400 {
401
402
403 double Param[5],CovMat[15];
404 GetPar_TrackParticle(pMeasuredPerigee,Param,CovMat);
405
406
407
408 hpe[0] = Param[0];
409 hpe[1] = Param[1];
410 hpe[2] = Param[2];
411 hpe[3] = Param[3];
412 hpe[4] = Param[4];
413 hpe[5] = 0.;
414 hpe[6] = 0.;
415 hpe[7] = CovMat[0];
416 hpe[8] = CovMat[1];
417 hpe[9] = CovMat[2];
418 hpe[10] = CovMat[3];
419 hpe[11] = CovMat[4];
420 hpe[12] = CovMat[5];
421 hpe[13] = CovMat[6];
422 hpe[14] = CovMat[7];
423 hpe[15] = CovMat[8];
424 hpe[16] = CovMat[9];
425 hpe[17] = CovMat[10];
426 hpe[18] = CovMat[11];
427 hpe[19] = CovMat[12];
428 hpe[20] = CovMat[13];
429 hpe[21] = CovMat[14];
430
431 }
432
433
434
435 bool StacoCombineTool::Preselection(
436 const Trk::MeasuredPerigee* pMeasuredPerigeeID,
437 const Trk::MeasuredPerigee* pMeasuredPerigeeMS
438 ){
439
440 if ( m_PreSelOpt1 == 1 ){
441 if ( !Preselection01(pMeasuredPerigeeID,pMeasuredPerigeeMS) ) return false;
442 }
443 if ( m_PreSelOpt2 == 1 ){
444 if ( !Preselection02(pMeasuredPerigeeID,pMeasuredPerigeeMS) ) return false;
445 }
446
447 return true ;
448 }
449
450 bool StacoCombineTool::Preselection01(
451 const Trk::MeasuredPerigee* pMeasuredPerigeeID,
452 const Trk::MeasuredPerigee* pMeasuredPerigeeMS
453 ){
454
455 double EtaID = asinh(1./tan(pMeasuredPerigeeID->parameters()[Trk::theta]));
456 double EtaMS = asinh(1./tan(pMeasuredPerigeeMS->parameters()[Trk::theta]));
457 double dEta = fabs(EtaID-EtaMS);
458
459 double PhiID = pMeasuredPerigeeID->parameters()[Trk::phi] ;
460 double PhiMS = pMeasuredPerigeeMS->parameters()[Trk::phi] ;
461 double dPhi = fabs(PhiID-PhiMS) ;
462 if (dPhi > M_PI) dPhi = 2.*M_PI - dPhi;
463
464 double DeltaR2 = dEta*dEta+dPhi*dPhi;
465
466 double DeltaRCut = m_PreSelOpt1DeltaR ;
467 if (DeltaR2>DeltaRCut*DeltaRCut) return false;
468
469 return true ;
470 }
471
472 bool StacoCombineTool::Preselection02(
473 const Trk::MeasuredPerigee* pMeasuredPerigeeID,
474 const Trk::MeasuredPerigee* pMeasuredPerigeeMS
475 ){
476
477 double TheInvPID = fabs(1./pMeasuredPerigeeID->parameters()[Trk::qOverP]) ;
478
479 double Z0ID = pMeasuredPerigeeID->parameters()[Trk::z0] ;
480 double Z0MS = pMeasuredPerigeeMS->parameters()[Trk::z0] ;
481 double dZ0 = fabs( Z0ID - Z0MS );
482
483 double DeltaZ0Cut = m_PreSelOpt2DeltaZ0CTE + TheInvPID * m_PreSelOpt2DeltaZ0SLOPE ;
484 if (dZ0>DeltaZ0Cut) return false;
485
486 double EtaID = asinh(1./tan(pMeasuredPerigeeID->parameters()[Trk::theta]));
487 double EtaMS = asinh(1./tan(pMeasuredPerigeeMS->parameters()[Trk::theta]));
488 double dEta = fabs( EtaID - EtaMS );
489
490 double DeltaEtaCut = m_PreSelOpt2DeltaEtaCTE + TheInvPID * m_PreSelOpt2DeltaEtaSLOPE ;
491 if (dEta>DeltaEtaCut) return false;
492
493 return true ;
494 }
| Due to the LXR bug, the updates fail sometimes to remove references to deleted files. The Saturday's full rebuilds fix these problems |
|
This page was automatically generated by the
LXR engine.
|
|