34 {
35
36 const double probVrtMergeLimit=0.01;
37
39 int inpNPart=xAODwrk->inpTrk.size();
40 std::vector<const xAOD::NeutralParticle*> neutralPartDummy(0);
41 ATH_MSG_DEBUG(
"getVrtSecMulti() called with NPart=" << inpNPart);
42
43 std::vector<xAOD::Vertex*> finalVertices(0);
44
45 if( inpNPart < 2 ) { return finalVertices;}
46
48 int nTracks = xAODwrk->listSelTracks.size();
49
50 if( nTracks < 2 ) { return finalVertices;}
51
53
56 h.m_hb_ntrksel->Fill( (
double) nTracks,
m_w_1);
57 }
58
59
60
61
62
63
64
65
66
67 std::map<long int,std::vector<double>> foundVrt2t;
68 select2TrVrt(ctx, xAODwrk->listSelTracks, primVrt, foundVrt2t, compatibilityGraph);
69
70
71 ATH_MSG_DEBUG(
" Defined edges in the graph="<< num_edges(compatibilityGraph));
72 if(num_edges(compatibilityGraph)==0){ return finalVertices;}
73
74
75
76
77
78
79
80
81
82 std::unique_ptr<std::vector<WrkVrt>> wrkVrtSet = std::make_unique<std::vector<WrkVrt>>();
84 std::unique_ptr<Trk::IVKalState> state =
m_fitSvc->makeState(ctx);
86 long int NPTR=0, nth=2;
87
88
89 std::vector< std::vector<int> > allCliques;
90 bron_kerbosch_all_cliques(compatibilityGraph, clique_visitor(allCliques));
91 for(
int cq=0; cq<(
int)allCliques.size();cq++){
92 newvrt.selTrk.clear();
93 NPTR=allCliques[cq].size();
94 for(i=0;
i<NPTR;
i++){ newvrt.selTrk.push_back(allCliques[cq][i]);}
95
96 xAODwrk->tmpListTracks.clear();
97 TLorentzVector vpsum;
99 xAODwrk->tmpListTracks.push_back( xAODwrk->listSelTracks.at(newvrt.selTrk[i]) );
100 vpsum += xAODwrk->listSelTracks.at(newvrt.selTrk[i])->p4();
101 }
102 std::vector<double> iniVrtPos=
estimVrtPos(nTracks,newvrt.selTrk,foundVrt2t);
103 m_fitSvc->setApproximateVertex(iniVrtPos[0], iniVrtPos[1], iniVrtPos[2], *state);
104 sc=
m_fitSvc->VKalVrtFit(xAODwrk->tmpListTracks, neutralPartDummy,
105 newvrt.vertex, newvrt.vertexMom, newvrt.vertexCharge, newvrt.vertexCov,
106 newvrt.chi2PerTrk, newvrt.trkAtVrt, newvrt.chi2,
107 *state, false);
108 if(
sc.isFailure() )
continue;
109 ATH_MSG_VERBOSE(
"Found IniVertex="<<newvrt.vertex[0]<<
", "<<newvrt.vertex[1]<<
", "<<newvrt.vertex[2]);
110 ATH_MSG_VERBOSE(
"with Chi2="<<newvrt.chi2<<
" Ntrk="<<NPTR<<
" trk1,2="<<newvrt.selTrk[0]<<
", "<<newvrt.selTrk[1]);
111 if(NPTR==2 && newvrt.chi2>10.) continue;
112 if(newvrt.chi2PerTrk.size()==2) newvrt.chi2PerTrk[0]=newvrt.chi2PerTrk[1]=newvrt.chi2/2.;
113 newvrt.Good = true;
114 newvrt.projectedVrt=
MomProjDist(newvrt.vertex, primVrt, newvrt.vertexMom);
115 wrkVrtSet->push_back(newvrt);
116 }
117 std::sort(wrkVrtSet->begin(),wrkVrtSet->end(),[](
const WrkVrt&
a,
const WrkVrt& b){return a.selTrk.size()>b.selTrk.size();});
118
119
120
121
122
123
124
125
126 if((*wrkVrtSet).empty())return finalVertices;
128
129
130 std::vector<int> trkNPairs(nTracks,0);
131 for(auto &vrt : (*wrkVrtSet)){
132 int ntInV=vrt.selTrk.size()-1;
133 for(auto &trk : vrt.selTrk)trkNPairs.at(trk) += ntInV;
134 }
135
136
137
139 std::multimap<double,std::pair<int,int>> vrtWithCommonTrk;
140 while(true){
141 int nSoluI=(*wrkVrtSet).size();
142 vrtWithCommonTrk.clear();
143 unsigned int nTComMax=0;
144 for(int iv=0; iv<nSoluI-1; iv++ ){
145 if(!(*wrkVrtSet)[iv].Good) continue;
146 if( (*wrkVrtSet)[iv].selTrk.size()<nTComMax) continue;
147 for(int jv=iv+1; jv<nSoluI; jv++){
148 if(!(*wrkVrtSet)[jv].Good) continue;
149 if( (*wrkVrtSet)[jv].selTrk.size()<nTComMax) continue;
150 unsigned int nTCom=
nTrkCommon( wrkVrtSet.get(), iv, jv);
151 if(!nTCom) continue;
152 if(nTCom<nTComMax) continue;
153 double sumChi2=(*wrkVrtSet)[iv].chi2+(*wrkVrtSet)[jv].chi2;
154 sumChi2=std::min(sumChi2,999.)*1.e-3;
155 vrtWithCommonTrk.emplace(nTCom+sumChi2,std::make_pair(iv,jv));
156 nTComMax=std::max(nTComMax,nTCom);
157 } }
158 if(vrtWithCommonTrk.empty())break;
159
160
161
162
163 for( const auto& ov : std::ranges::reverse_view(vrtWithCommonTrk)) {
164 WrkVrt & v1 = (*wrkVrtSet)[
ov.second.first];
166 if(!v1.Good)continue;
167 if(!
v2.Good)
continue;
168
169 unsigned int nTCom=
nTrkCommon( wrkVrtSet.get(),
ov.second.first,
ov.second.second);
170 if(nTCom<nTComMax)continue;
171
172 if( nTCom==v1.selTrk.size() || nTCom==
v2.selTrk.size() ){
173 if(nTCom==v1.selTrk.size()){v1.Good = false; continue;}
174 if(nTCom==
v2.selTrk.size()){
v2.Good =
false;
continue;}
175 }
176
177 if( nTCom>1 && TMath::Prob( v1.chi2, 2*v1.selTrk.size()-3) > probVrtMergeLimit
178 && TMath::Prob(
v2.chi2, 2*
v2.selTrk.size()-3) > probVrtMergeLimit){
180 if(prbV>probVrtMergeLimit){
181 v1.Good =
false;
v2.Good =
false;
182 newvrt.Good = true;
183 newvrt.projectedVrt=
MomProjDist(newvrt.vertex, primVrt, newvrt.vertexMom);
185 continue;
186 } }
187
189 }
190 }
192 int cvgood=0; for(const auto& vrt:(*wrkVrtSet)) if(vrt.Good)cvgood++;
194 h.m_hb_rawVrtN->Fill( (
float)cvgood,
m_w_1);
195 }
196
197
198
200 for(auto &v1t : (*wrkVrtSet)){
201 if(v1t.selTrk.size()!=1 || !v1t.Good)continue;
202 int ind_t=v1t.selTrk[0];
203 if(trkNPairs[ind_t]<2){ v1t.Good=false; continue; }
204 if( xAODwrk->listSelTracks[ind_t]->pt()<
m_cutPt*2){ v1t.Good=
false;
continue; };
205 for(auto &vrt :(*wrkVrtSet)){
206 if(!vrt.Good || &v1t==&vrt)continue;
207 if(std::find(vrt.selTrk.begin(),vrt.selTrk.end(),ind_t) != vrt.selTrk.end()){ v1t.Good=false; break; }
208 } }
209 }
210
211
212
213 int tmpV=0; while( tmpV<(int)(*wrkVrtSet).size() )if( !(*wrkVrtSet)[tmpV].Good ) { (*wrkVrtSet).erase((*wrkVrtSet).begin()+tmpV);} else {tmpV++;}
214 if((*wrkVrtSet).empty())return finalVertices;
216 for(
auto &tmpV : (*wrkVrtSet) ) tmpV.projectedVrt=
MomProjDist(tmpV.vertex, primVrt, tmpV.vertexMom );
217
218
219
220
221
222
223 int foundV1=-1, foundV2=-1;
224 std::vector<double> checkedDst(0);
225 double minDistVV=
minVrtVrtDist( wrkVrtSet.get(), foundV1, foundV2, checkedDst);
228 h.m_hb_distVV->Fill( minDistVV,
m_w_1);
229 }
231 if(foundV1<foundV2) {
int tmp=foundV1; foundV1=foundV2; foundV2=
tmp;}
232 double probV=
mergeAndRefitVertices( (*wrkVrtSet)[foundV1], (*wrkVrtSet)[foundV2], newvrt, xAODwrk->listSelTracks, *state, 0);
233 ATH_MSG_DEBUG(
"Merged vertex prob=" << probV<<
" Vrt1="<<foundV1<<
" Vrt2="<<foundV2<<
" dst="<<minDistVV);
234 if(probV<probVrtMergeLimit){
235 int pos=std::max_element(newvrt.chi2PerTrk.begin(),newvrt.chi2PerTrk.end())-newvrt.chi2PerTrk.begin();
236 newvrt.detachedTrack=newvrt.selTrk[
pos];
237 newvrt.selTrk.erase(newvrt.selTrk.begin()+pos);
238 probV =
refitVertex( newvrt, xAODwrk->listSelTracks, *state,
false);
240 }
241 if(probV>probVrtMergeLimit && newvrt.vertexMom.M()<
m_vrtMassLimit){
242 newvrt.projectedVrt=
MomProjDist(newvrt.vertex, primVrt, newvrt.vertexMom);
244 (*wrkVrtSet)[foundV2].Good=false;
245 (*wrkVrtSet)[foundV2].selTrk.clear();
246 } else checkedDst.push_back(minDistVV);
247 minDistVV=
minVrtVrtDist( wrkVrtSet.get(), foundV1, foundV2, checkedDst);
248 }
249
250
251 for(
int iv=0; iv<(
int)wrkVrtSet->size(); iv++) {
252 if(!(*wrkVrtSet)[iv].Good ) continue;
253 if( (*wrkVrtSet)[iv].selTrk.size()<3 ) continue;
254 double tmpProb=TMath::Prob( (*wrkVrtSet)[iv].
chi2, 2*(*wrkVrtSet)[iv].selTrk.size()-3 );
257 tmpProb=
improveVertexChi2( (*wrkVrtSet)[iv], xAODwrk->listSelTracks, *state,
false);
258 (*wrkVrtSet)[iv].projectedVrt=
MomProjDist((*wrkVrtSet)[iv].vertex, primVrt, (*wrkVrtSet)[iv].vertexMom);
259 }
260 }
261
262
263 for(auto & iv : (*wrkVrtSet)){
265 ATH_MSG_DEBUG(
"Heavy vertex found Mass=" << iv.vertexMom.M());
267 if(it_bad>-1){
268 iv.selTrk.erase( iv.selTrk.begin() + it_bad );
269 refitVertex(iv, xAODwrk->listSelTracks, *state,
false);
270 iv.projectedVrt=
MomProjDist(iv.vertex, primVrt, iv.vertexMom);
271 } } }
272
273
274
275 double signif3D=0., signif2D=0.;
276
277
278 for(
int iv=0; iv<(
int)wrkVrtSet->size(); iv++) {
279 WrkVrt & curVrt=(*wrkVrtSet)[iv];
280 nth=(*wrkVrtSet)[iv].
selTrk.size();
281 if(nth == 1) continue;
282 if(!curVrt.Good ) continue;
283 (*wrkVrtSet)[iv].Good = false;
284 if(nth < 1) continue;
285 if((*wrkVrtSet)[iv].projectedVrt<0.) continue;
287
288 vrtVrtDist(primVrt,curVrt.vertex, curVrt.vertexCov, signif3D);
291 if(nth==2 && curVrt.vertexCharge==0)
h.m_hb_massPiPi1->Fill(curVrt.vertexMom.M(),
m_w_1);
292 h.m_hb_sig3DTot->Fill( signif3D,
m_w_1);
293 if(nth==2)
h.m_hb_sig3D2tr->Fill( signif3D,
m_w_1);
294 if(nth >2)
h.m_hb_sig3DNtr->Fill( signif3D,
m_w_1);
295 }
296
297
298#if 0
299 if(nth==2 && curVrt.vertexCharge==0 && curVrt.detachedTrack<0){
300 double mass_PiPi = curVrt.vertexMom.M();
305 h.m_hb_massPiPi->Fill( mass_PiPi,
m_w_1);
306 h.m_hb_massPPi ->Fill( mass_PPi,
m_w_1);
307 if( curVrt.vertex.perp()>20.)
h.m_hb_massEE ->Fill( mass_EE,
m_w_1);
308 }
309 if( std::abs(mass_PiPi-
m_massK0) < 22.)
continue;
310 if( std::abs(mass_PPi-
m_massLam) < 8.)
continue;
311 if( mass_EE < 60. && curVrt.vertex.perp() > 20.) continue;
312 }
313#endif
314
317 curVrt.Good = true;
318 }
320
321
322
323 std::vector<double> impact,impactError;
324 for(
int iv=0; iv<(
int)wrkVrtSet->size(); iv++) {
325 WrkVrt & curVrt=(*wrkVrtSet)[iv];
327 if(!curVrt.Good || nth<2) continue;
328 double minPtT=1.e6, minSig3DT=1.e6, maxSig3DT=0.;
329 int ntrkBC=0,ntrkI=0,sumIBLHits=0,sumBLHits=0;
332 minPtT=std::min( minPtT, xAODwrk->listSelTracks[j]->pt());
333 m_fitSvc->VKalGetImpact(xAODwrk->listSelTracks[j], primVrt.
position(), 1, impact, impactError, *state);
334 double SigR2 = impact[0]*impact[0]/impactError[0];
335 double SigZ2 = impact[1]*impact[1]/impactError[2];
336 minSig3DT=std::min( minSig3DT, sqrt( SigR2 + SigZ2) );
337 maxSig3DT=std::max( maxSig3DT, sqrt( SigR2 + SigZ2) );
338 sumIBLHits += std::max(
getIBLHit(xAODwrk->listSelTracks[j]),0);
339 sumBLHits += std::max(
getBLHit(xAODwrk->listSelTracks[j]),0);
341 ntrkBC +=
getIdHF(xAODwrk->listSelTracks[j]);
342 ntrkI +=
getG4Inter(xAODwrk->listSelTracks[j]);
343 }
344 }
345 float vProb=TMath::Prob(curVrt.chi2, 2*nth-3);
346 float cosSVPVM=
projSV_PV(curVrt.vertex, primVrt, curVrt.vertexMom);
347 float vrtR=curVrt.vertex.perp();
348 TLorentzVector SVPV(curVrt.vertex.x()-primVrt.
x(),curVrt.vertex.y()-primVrt.
y(),curVrt.vertex.z()-primVrt.
z(), 10.);
351 if( nth>1 ){
352 vrtVrtDist(primVrt,curVrt.vertex, curVrt.vertexCov, signif3D);
353 float Dist2D=
vrtVrtDist2D(primVrt,curVrt.vertex, curVrt.vertexCov, signif2D);
354 h.m_curTup->NVrtTrk [
h.m_curTup->nNVrt] = nth;
355 h.m_curTup->NVrtTrkHF [
h.m_curTup->nNVrt] = ntrkBC;
356 h.m_curTup->NVrtTrkI [
h.m_curTup->nNVrt] = ntrkI;
357 h.m_curTup->NVrtProb [
h.m_curTup->nNVrt] = vProb;
358 h.m_curTup->NVrtSig3D [
h.m_curTup->nNVrt] = signif3D;
359 h.m_curTup->NVrtSig2D [
h.m_curTup->nNVrt] = signif2D;
360 h.m_curTup->NVrtDist2D[
h.m_curTup->nNVrt] = vrtR<20. ? Dist2D : vrtR;
361 h.m_curTup->NVrtM [
h.m_curTup->nNVrt] = curVrt.vertexMom.M();
362 h.m_curTup->NVrtPt [
h.m_curTup->nNVrt] = curVrt.vertexMom.Pt();
363 h.m_curTup->NVrtEta [
h.m_curTup->nNVrt] = SVPV.Eta();
364 h.m_curTup->NVrtIBL [
h.m_curTup->nNVrt] = sumIBLHits;
365 h.m_curTup->NVrtBL [
h.m_curTup->nNVrt] = sumBLHits;
366 h.m_curTup->NVrtCosSPM[
h.m_curTup->nNVrt] = cosSVPVM;
367 h.m_curTup->NVrtCh [
h.m_curTup->nNVrt] = curVrt.vertexCharge;
368 h.m_curTup->NVMinPtT [
h.m_curTup->nNVrt] = minPtT;
369 h.m_curTup->NVMinS3DT [
h.m_curTup->nNVrt] = minSig3DT;
370 h.m_curTup->NVrtBDT [
h.m_curTup->nNVrt] = 1.1;
371 h.m_curTup->NVrtHR1 [
h.m_curTup->nNVrt] = xAODwrk->listSelTracks[curVrt.selTrk[0]]->radiusOfFirstHit();
372 h.m_curTup->NVrtHR2 [
h.m_curTup->nNVrt] = xAODwrk->listSelTracks[curVrt.selTrk[1]]->radiusOfFirstHit();
374 }
375 }
376
377
378
379 if(nth==2){
380 float wgtSelect=-1.1;
382 testV.makePrivateStore();
384 std::vector<float> testVcov(curVrt.vertexCov.begin(),curVrt.vertexCov.end());
388 std::make_pair(xAODwrk->listSelTracks[curVrt.selTrk[0]],
389 xAODwrk->listSelTracks[curVrt.selTrk[1]]),
390 testV,
391 std::make_pair(
momAtVrt(curVrt.trkAtVrt[0]),
momAtVrt(curVrt.trkAtVrt[1])), primVrt, wgtSelect);
392 curVrt.BDT=wgtSelect;
395 h.m_hb_fakeSVBDT->Fill(wgtSelect,1.);
396 h.m_curTup->NVrtBDT[
h.m_curTup->nNVrt-1] = wgtSelect;
397 }
398 if(!acceptV){
399 curVrt.Good = false;
401 for(auto it : curVrt.selTrk){
402 for(auto &vtmp : (*wrkVrtSet)){
403 if(vtmp.selTrk.size()!=1 || (!vtmp.Good)) continue;
404 if(it==vtmp.detachedTrack)vtmp.Good=false;
405 } } }
406 }
407 }
408 }
409
410
411
414 for(auto & vrt : (*wrkVrtSet)) {
415 if( !vrt.Good || vrt.selTrk.size() != 1 ) continue;
416 const auto *xaodtp=xAODwrk->listSelTracks[vrt.selTrk[0]];
417 m_fitSvc->VKalGetImpact(ctx, xaodtp, primVrt.
position(), 1, impact, impactError);
418 double SigR2 = std::abs(impact[0]*impact[0]/impactError[0]);
419 double SigZ2 = std::abs(impact[1]*impact[1]/impactError[2]);
420 float dist2D=
vrtVrtDist2D(primVrt,vrt.vertex, vrt.vertexCov, signif2D);
421 h.m_curTup->NVrtTrk [
h.m_curTup->nNVrt] = 1;
422 h.m_curTup->NVrtTrkHF [
h.m_curTup->nNVrt] =
getIdHF(xaodtp);
423 h.m_curTup->NVrtProb [
h.m_curTup->nNVrt] = trkNPairs[vrt.selTrk[0]];
424 h.m_curTup->NVrtSig3D [
h.m_curTup->nNVrt] = 0.;
425 h.m_curTup->NVrtSig2D [
h.m_curTup->nNVrt] = signif2D;
426 h.m_curTup->NVrtDist2D[
h.m_curTup->nNVrt] = dist2D;
427 h.m_curTup->NVrtM [
h.m_curTup->nNVrt] = vrt.vertexMom.M();
428 h.m_curTup->NVrtPt [
h.m_curTup->nNVrt] = vrt.vertexMom.Pt();
429 h.m_curTup->NVrtCosSPM[
h.m_curTup->nNVrt] = 0.;
430 h.m_curTup->NVrtCh [
h.m_curTup->nNVrt] = vrt.vertexCharge;
431 h.m_curTup->NVMinPtT [
h.m_curTup->nNVrt] = xaodtp->pt();
432 h.m_curTup->NVMinS3DT [
h.m_curTup->nNVrt] = sqrt(SigR2 + SigZ2);
433 h.m_curTup->NVrtBDT [
h.m_curTup->nNVrt] = 1.1;
434 h.m_curTup->NVrtIBL [
h.m_curTup->nNVrt] = std::max(
getIBLHit(xaodtp),0);
435 h.m_curTup->NVrtBL [
h.m_curTup->nNVrt] = std::max(
getBLHit (xaodtp),0);
437 } }
438
439
440 std::multimap<double,WrkVrt,std::greater<double>> goodVertexMap;
441 int nNtrVrt=0;
442 for(auto & iv : (*wrkVrtSet) ) {
443 nth=iv.selTrk.size();
444 if(nth==1)iv.BDT=-2.;
446 if(nth==1)
selector=iv.BDT+std::min(iv.vertexMom.Pt()*1.e-5,1.);
447 else if(nth>2)
selector=iv.BDT+iv.vertexMom.M()*1.e-5;
448 if( iv.Good && nth>0 ) {
449 goodVertexMap.emplace(selector,iv);
450 if(nth>1)nNtrVrt++;
451 }
452 }
453 if(nNtrVrt==0){
457 }
458 return finalVertices;
459 }
460
461
462
463
464 static const SG::AuxElement::Decorator<float> wgtBDT("wgtBDT");
465 static const SG::AuxElement::Decorator<int> nTrksDec("nTracks");
466 static const SG::AuxElement::Decorator<int> vChrgTot("vCharge");
467 int n1trVrt=0;
468 for(auto & iv : goodVertexMap){
469 WrkVrt & curVrt=iv.second;
471 xAODwrk->tmpListTracks.clear();
472 for(auto t : curVrt.selTrk)xAODwrk->tmpListTracks.push_back( xAODwrk->listSelTracks[t] );
475 h.m_hb_totmass->Fill(curVrt.vertexMom.M(),
m_w_1);
476 h.m_hb_r2d->Fill( curVrt.vertex.perp(),
m_w_1);
477 }
478
479 std::unique_ptr<xAOD::Vertex> tmpVertex;
480 if(nth>1){
481 tmpVertex=
m_fitSvc->fit(xAODwrk->tmpListTracks,curVrt.vertex,*state);
482 } else if(nth==1){
483 tmpVertex=std::make_unique<xAOD::Vertex>();
484 if(!tmpVertex)continue;
485 tmpVertex->makePrivateStore();
486 tmpVertex->setPosition(curVrt.vertex);
487 std::vector<float> floatErrMtx(6);
488 for(
int i=0;
i<6;
i++) floatErrMtx[i]=curVrt.vertexCov[i];
489 tmpVertex->setCovariance(floatErrMtx);
490 tmpVertex->setFitQuality(curVrt.chi2, (float)(nth*2-3));
491 std::vector<Trk::VxTrackAtVertex> & tmpVTAV=tmpVertex->vxTrackAtVertex(); tmpVTAV.clear();
493 CovMtxP.setIdentity();
494 Trk::
Perigee * tmpMeasPer = new (std::nothrow) Trk::
Perigee( 0.,0.,
495 curVrt.trkAtVrt[0][0],
496 curVrt.trkAtVrt[0][1],
497 curVrt.trkAtVrt[0][2],
498 Trk::PerigeeSurface(curVrt.vertex),
499 std::move(CovMtxP) );
500 tmpVTAV.emplace_back( 1., tmpMeasPer );
504 tmpVertex->addTrackAtVertex(TEL,1.);
505 n1trVrt++;
506 }
508 wgtBDT (*tmpVertex) =curVrt.BDT;
509 nTrksDec(*tmpVertex) =curVrt.selTrk.size();
510 vChrgTot(*tmpVertex) =curVrt.vertexCharge;
512
513 finalVertices.push_back(tmpVertex.release());
514 for (
int ind=0;
ind<nth;
ind++) {
515 m_chi2_toSV(*xAODwrk->listSelTracks[curVrt.selTrk[ind]]) = curVrt.chi2PerTrk[
ind] > FLT_MAX ? FLT_MAX : curVrt.chi2PerTrk[
ind];
516 }
517 }
518 }
521 h.m_hb_goodvrtN->Fill( finalVertices.size()+0.1,
m_w_1);
522 h.m_hb_goodvrt1N->Fill( n1trVrt+0.1,
m_w_1);
523 }
524
525
526
527 return finalVertices;
528
529 }
bool setStorableObject(BaseConstReference data, bool replace=false, IProxyDict *sg=0)
Set link to point to a new container (storable).
ElementLink()
Default constructor.
bool setElement(ElementType element)
Set to point to an element.
#define AmgSymMatrix(dim)
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".
bool msgLvl(const MSG::Level lvl) const
float z() const
Returns the z position.
float y() const
Returns the y position.
void setCovariance(const std::vector< float > &value)
Sets the covariance matrix as a simple vector of values.
void setPosition(const Amg::Vector3D &position)
Sets the 3-position.
void setFitQuality(float chiSquared, float numberDoF)
Set the 'Fit Quality' information.
const Amg::Vector3D & position() const
Returns the 3-pos.
float x() const
Returns the x position.
double chi2(TH1 *h0, TH1 *h1)
::StatusCode StatusCode
StatusCode definition for legacy code.
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
void swap(ElementLinkVector< DOBJ > &lhs, ElementLinkVector< DOBJ > &rhs)
@ SecVtx
Secondary vertex.
Vertex_v1 Vertex
Define the latest version of the vertex class.