93 StatusCode VertexDecoratorAlg ::execute()
95 const EventContext &ctx = Gaudi::Hive::currentContext();
130 std::map< const xAOD::Vertex*, std::vector<ElementLink<xAOD::JetContainer>> > jetsInVertex;
131 std::map< const xAOD::Jet*, std::map< const xAOD::Vertex*, int> > jetVertexPt;
135 jetsInVertex[vertex] = {};
137 jetVertexPt[
jet][vertex] = 0;
147 if( !jtrk )
continue;
149 if(jetTrackVertex) jetVertexPt[
jet][*jetTrackVertex] += jtrk->pt();
153 float maxPtFrac = -1;
157 if(jetVertexPt[
jet][vertex] > maxPtFrac){
158 maxPtFrac = jetVertexPt[
jet][vertex];
159 uniqueVertexAddress = vertex;
167 jetsInVertex[uniqueVertexAddress].push_back(jetLink);
175 dec_actualInterPerXing(*vertex) = eventInfo->actualInteractionsPerCrossing();
182 float weighted_sumDZ = 0;
183 float weighted_deltaZ = 0;
184 float weighted_modsumDZ = 0;
185 float weighted_z_asym = 0;
188 std::vector<float> track_deltaZ;
190 for (
size_t i = 0; i < vertex->nTrackParticles(); i++) {
194 if(!trackTmp)
continue;
196 deltaZ = trackTmp->
z0() + trackTmp->
vz() - vertex->z();
197 track_deltaZ.push_back(deltaZ);
199 float trk_weight = vertex->trackWeight(i);
200 weighted_deltaZ = deltaZ * trk_weight;
203 modsumDZ += std::abs(deltaZ);
204 weighted_sumDZ += weighted_deltaZ;
205 weighted_modsumDZ += std::abs(weighted_deltaZ);
209 z_asym = sumDZ / modsumDZ;
211 if (weighted_modsumDZ > 0) {
212 weighted_z_asym = weighted_sumDZ / weighted_modsumDZ;
215 float mean_Dz = sumDZ / track_deltaZ.size();
216 float number_tracks = track_deltaZ.size();
222 for (
auto i : track_deltaZ)
224 float z_zbar = (i - mean_Dz);
225 z_var += std::pow(z_zbar, 2);
226 z_skew += std::pow(z_zbar, 3);
227 z_kurt += std::pow(z_zbar, 4);
229 if (number_tracks > 1 && z_var > 0) {
230 z_var /= (number_tracks - 1);
231 float z_sd = std::sqrt(z_var);
232 z_skew /= (number_tracks - 1) * std::pow(z_sd, 3);
233 z_kurt /= (number_tracks - 1) * std::pow(z_sd, 4);
242 dec_ntrk(*vertex) = number_tracks;
247 dec_chi2Over_ndf(*vertex) = vertex->chiSquared() / vertex->numberDoF();
248 dec_z_asym(*vertex) = z_asym;
249 dec_weighted_z_asym(*vertex) = weighted_z_asym;
250 dec_z_kurt(*vertex) = z_kurt;
251 dec_z_skew(*vertex) = z_skew;
255 if (std::isnan(acc_deltaZ(*vertex))) {
257 dec_photon_deltaz(*vertex) = 0;
260 dec_photon_deltaz(*vertex) = acc_deltaZ(*vertex);
264 dec_photon_deltaz(*vertex) = 0;
267 if (std::isnan(acc_deltaPhi(*vertex))) {
269 dec_photon_deltaPhi(*vertex) = 0;
272 dec_photon_deltaPhi(*vertex) = acc_deltaPhi(*vertex);
276 dec_photon_deltaPhi(*vertex) = 0;
280 std::vector<ElementLink<xAOD::ElectronContainer>> electronLinks;
283 if(!id_trk)
continue;
285 if(!eleVertex)
continue;
287 if(*eleVertex == vertex){
290 electronLinks.push_back(elLink);
293 dec_electronLinks(*vertex) = electronLinks;
295 std::vector<ElementLink<xAOD::PhotonContainer>> photonLinks;
300 photonLinks.push_back(phLink);
302 dec_photonLinks(*vertex) = photonLinks;
305 dec_jetLinks(*vertex) = jetsInVertex[vertex];
307 std::vector<ElementLink<xAOD::MuonContainer>> muonLinks;
309 const auto *tp = muon->trackParticle(xAOD::Muon::InnerDetectorTrackParticle);
313 if(!muonVertex)
continue;
315 if(*muonVertex == vertex){
318 muonLinks.push_back(muonLink);
321 ATH_MSG_DEBUG(
"Skipping muon as the track is not associated to any PV ");
322 ATH_MSG_DEBUG(
"Muon pT, eta = " << muon->pt() <<
" " << muon->eta());
326 dec_muonLinks(*vertex) = muonLinks;
332 return StatusCode::SUCCESS;
float vz() const
The z origin for the parameters.