51 return StatusCode::FAILURE;
65 return StatusCode::FAILURE;
72 return StatusCode::FAILURE;
84 for(
const auto* track:*tracks) {
89 bool isFromPV =
false;
93 for (
size_t ivx = 0; ivx < vertices->size(); ++ivx) {
95 const std::vector<ElementLink<xAOD::TrackParticleContainer>>& trkLinks = vx->
trackParticleLinks();
97 for (
const auto& trkLink : trkLinks) {
98 if (trkLink.isValid() && *trkLink == track) {
99 vertexIndex =
static_cast<int>(ivx);
106 if (vertexIndex >= 0)
break;
109 vertexIndexDecorator(*track) = vertexIndex;
112 float chi2ToPV = -999.0;
116 chi2ToPV = fittedVertex->chiSquared();
121 chi2Decorator(*track) = chi2ToPV;
124 float covD0 = -999.0;
125 float covZ0 = -999.0;
126 float covTheta = -999.0;
128 auto covMatrix = track->definingParametersCovMatrix();
129 covD0 = covMatrix(0, 0);
130 covZ0 = covMatrix(1, 1);
131 covTheta = covMatrix(3, 3);
135 covD0Decorator(*track) = covD0;
136 covZ0Decorator(*track) = covZ0;
137 covThetaDecorator(*track) = covTheta;
140 decorator(*track) = 0;
141 chi2Decorator(*track) = -1.0;
142 vertexIndexDecorator(*track) = -1;
143 covD0Decorator(*track) = -999.0;
144 covZ0Decorator(*track) = -999.0;
145 covThetaDecorator(*track) = -999.0;
149 return StatusCode::SUCCESS;
156 int n_sct_hits = acc_n_sct_hits(*track);
159 float d0 = track->d0();
160 float z0_wrtPV= track->z0()+track->vz()-pv->z();
161 float theta = track->theta();
164 bool pass_min_bias=
false;
168 bool pass_hi_loose=
false;
172 bool pass_hi_loose_additional_SCT_hit=
true;
173 if(!pass_hi_loose || n_sct_hits<7) pass_hi_loose_additional_SCT_hit=
false;
176 bool pass_hi_loose_tight_d0_z0=
true;
177 if(!pass_hi_loose || fabs(d0)>1.0 || fabs(z0_wrtPV*sin(
theta))>1.0) pass_hi_loose_tight_d0_z0=
false;
180 bool pass_hi_loose_tighter_d0_z0=
true;
181 if(!pass_hi_loose || fabs(d0)>0.5 || fabs(z0_wrtPV*sin(
theta))>0.5) pass_hi_loose_tighter_d0_z0=
false;
184 bool pass_hi_tight=
false;
188 bool pass_hi_tight_loose_d0_z0=
true;
189 if(pass_hi_tight==
false){
192 static const auto d0Index = taccept.getCutPosition(
"D0");
193 static const auto z0Index = taccept.getCutPosition(
"Z0SinTheta");
194 static const auto nCuts = taccept.getNCuts();
196 cutBitset |= (1 << d0Index) | (1 << z0Index);
197 if(cutBitset.count() != nCuts ) pass_hi_tight_loose_d0_z0=
false;
198 if(fabs(d0)>1.5 || fabs(z0_wrtPV*sin(
theta))>1.5) pass_hi_tight_loose_d0_z0=
false;
202 bool pass_hi_tight_tighter_d0_z0=
true;
203 if(!pass_hi_tight || fabs(d0)>0.5 || fabs(z0_wrtPV*sin(
theta))>0.5) pass_hi_tight_tighter_d0_z0=
false;
206 unsigned short quality =0;
208 if(pass_hi_loose ) quality+=
HI_LOOSE;
213 if(pass_hi_tight ) quality+=
HI_TIGHT;
222 float pt = track->pt();
223 float eta = track->eta();
237 int n_Ipix_hits = acc_n_Ipix_hits(*track);
238 int n_Ipix_expected = acc_n_Ipix_expected(*track);
239 int n_NIpix_hits = acc_n_NIpix_hits(*track);
240 int n_NIpix_expected = acc_n_NIpix_expected(*track);
241 int n_sct_hits = acc_n_sct_hits(*track);
242 int n_pix_hits = acc_n_pix_hits(*track);
243 int n_sct_holes = acc_n_sct_holes(*track);
244 int n_sct_dead = acc_n_sct_dead(*track);
245 int n_pix_dead = acc_n_pix_dead(*track);
248 float chi2=track->chiSquared();
249 float ndof=track->numberDoF();
251 float d0 = track->d0();
252 float z0_wrtPV= track->z0()+track->vz()-z_vtx;
253 float theta = track->theta();
258 bool pass_min_bias=
true;
260 if(fabs(
eta)>2.5) pass_min_bias=
false;
261 if(n_Ipix_expected>0){
262 if (n_Ipix_hits==0) pass_min_bias=
false;
265 if(n_NIpix_expected>0 && n_NIpix_hits==0) pass_min_bias=
false;
268 int n_sct=n_sct_hits+n_sct_dead;
269 if (pt<=300) {
if (n_sct <2) pass_min_bias=
false;}
270 else if(pt<=400) {
if (n_sct <4) pass_min_bias=
false;}
271 else if(pt> 400) {
if (n_sct <6) pass_min_bias=
false;}
273 int n_pix=n_pix_hits+n_pix_dead;
274 if(n_pix<=0) pass_min_bias=
false;
276 if(fabs(d0)>1.5) pass_min_bias=
false;
277 if(fabs(z0_wrtPV*sin(
theta))>1.5) pass_min_bias=
false;
279 if(pt>10000 && TMath::Prob(
chi2,ndof)<=0.01) pass_min_bias=
false;
288 bool pass_hi_loose=
true;
290 if(fabs(
eta)>2.5) pass_hi_loose=
false;
291 if(n_Ipix_expected>0){
292 if (n_Ipix_hits==0) pass_hi_loose=
false;
295 if(n_NIpix_expected>0 && n_NIpix_hits==0) pass_hi_loose=
false;
298 if(n_pix_hits==0) pass_hi_loose=
false;
299 if(n_sct_hits< 6) pass_hi_loose=
false;
300 if(pt>10000 && TMath::Prob(
chi2,ndof)<=0.01) pass_hi_loose=
false;
301 if(fabs(d0) >1.5) pass_hi_loose=
false;
302 if(fabs(z0_wrtPV*sin(
theta))>1.5) pass_hi_loose=
false;
309 bool pass_hi_loose_additional_SCT_hit=
true;
310 if(!pass_hi_loose) pass_hi_loose_additional_SCT_hit=
false;
312 if(n_sct_hits<7) pass_hi_loose_additional_SCT_hit=
false;
319 bool pass_hi_loose_tight_d0_z0=
true;
320 if(!pass_hi_loose || fabs(d0)>1.0 || fabs(z0_wrtPV*sin(
theta))>1.0) pass_hi_loose_tight_d0_z0=
false;
326 bool pass_hi_loose_tighter_d0_z0=
true;
327 if(!pass_hi_loose || fabs(d0)>0.5 || fabs(z0_wrtPV*sin(
theta))>0.5) pass_hi_loose_tighter_d0_z0=
false;
333 bool pass_hi_tight_loose_d0_z0=
true;
334 if(!pass_hi_loose) pass_hi_tight_loose_d0_z0=
false;
336 if(n_pix_hits <2 ) pass_hi_tight_loose_d0_z0=
false;
337 if(n_sct_hits <8 ) pass_hi_tight_loose_d0_z0=
false;
338 if(n_sct_holes>1 ) pass_hi_tight_loose_d0_z0=
false;
339 if(ndof==0) pass_hi_tight_loose_d0_z0=
false;
340 else if(
chi2/ndof>6) pass_hi_tight_loose_d0_z0=
false;
347 bool pass_hi_tight=
true;
348 if(!pass_hi_loose) pass_hi_tight=
false;
350 if(n_pix_hits <2 ) pass_hi_tight=
false;
351 if(n_sct_hits <8 ) pass_hi_tight=
false;
352 if(n_sct_holes>1 ) pass_hi_tight=
false;
353 if(fabs(d0) >1.0) pass_hi_tight=
false;
354 if(fabs(z0_wrtPV*sin(
theta))>1.0) pass_hi_tight=
false;
355 if(ndof==0) pass_hi_tight=
false;
356 else if(
chi2/ndof>6) pass_hi_tight=
false;
363 bool pass_hi_tight_tighter_d0_z0=
true;
364 if(!pass_hi_tight) pass_hi_tight_tighter_d0_z0=
false;
366 if(fabs(d0)>0.5 || fabs(z0_wrtPV*sin(
theta))>0.5) pass_hi_tight_tighter_d0_z0=
false;
374 unsigned short quality =0;
376 if(pass_hi_loose ) quality+=
HI_LOOSE;
381 if(pass_hi_tight ) quality+=
HI_TIGHT;