From a88380db41b22d41b277f722a8998fbe55da6897 Mon Sep 17 00:00:00 2001 From: Dinko Ferencek Date: Tue, 9 Jun 2015 22:25:24 -0500 Subject: [PATCH 1/2] degridifying unpacked phi to break degeneracies in angular separations --- DataFormats/PatCandidates/src/PackedCandidate.cc | 7 +++++-- DataFormats/PatCandidates/src/PackedGenParticle.cc | 4 +++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/DataFormats/PatCandidates/src/PackedCandidate.cc b/DataFormats/PatCandidates/src/PackedCandidate.cc index eda529dd883af..13d577906e714 100644 --- a/DataFormats/PatCandidates/src/PackedCandidate.cc +++ b/DataFormats/PatCandidates/src/PackedCandidate.cc @@ -61,9 +61,12 @@ void pat::PackedCandidate::packVtx(bool unpackAfterwards) { } void pat::PackedCandidate::unpack() const { - p4_ = PolarLorentzVector(MiniFloatConverter::float16to32(packedPt_), + float pt = MiniFloatConverter::float16to32(packedPt_); + double shift = (pt<1. ? 0.1*pt : 0.1/pt); // shift particle phi to break degeneracies in angular separations + double phi = int16_t(packedPhi_)*3.2f/std::numeric_limits::max() + shift*3.2/std::numeric_limits::max(); + p4_ = PolarLorentzVector(pt, int16_t(packedEta_)*6.0f/std::numeric_limits::max(), - int16_t(packedPhi_)*3.2f/std::numeric_limits::max(), + phi, MiniFloatConverter::float16to32(packedM_)); p4c_ = p4_; unpacked_ = true; diff --git a/DataFormats/PatCandidates/src/PackedGenParticle.cc b/DataFormats/PatCandidates/src/PackedGenParticle.cc index 026a5f8d3af3e..3d3c0e3bafd2e 100644 --- a/DataFormats/PatCandidates/src/PackedGenParticle.cc +++ b/DataFormats/PatCandidates/src/PackedGenParticle.cc @@ -19,7 +19,9 @@ void pat::PackedGenParticle::unpack() const { float m=MiniFloatConverter::float16to32(packedM_); float pz = std::tanh(y)*std::sqrt((m*m+pt*pt)/(1.-std::tanh(y)*std::tanh(y))); float eta = std::asinh(pz/pt); - p4_ = PolarLorentzVector(pt,eta,int16_t(packedPhi_)*3.2f/std::numeric_limits::max(),m); + double shift = (pt<1. ? 0.1*pt : 0.1/pt); // shift particle phi to break degeneracies in angular separations + double phi = int16_t(packedPhi_)*3.2f/std::numeric_limits::max() + shift*3.2/std::numeric_limits::max(); + p4_ = PolarLorentzVector(pt,eta,phi,m); p4c_ = p4_; unpacked_ = true; } From 2c753b3199e948272c0438316786b8d942a983f9 Mon Sep 17 00:00:00 2001 From: Dinko Ferencek Date: Fri, 12 Jun 2015 13:34:20 -0500 Subject: [PATCH 2/2] introduced a pseudo-random sign of the phi shift --- DataFormats/PatCandidates/src/PackedCandidate.cc | 3 ++- DataFormats/PatCandidates/src/PackedGenParticle.cc | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/DataFormats/PatCandidates/src/PackedCandidate.cc b/DataFormats/PatCandidates/src/PackedCandidate.cc index 13d577906e714..8660ec8a75462 100644 --- a/DataFormats/PatCandidates/src/PackedCandidate.cc +++ b/DataFormats/PatCandidates/src/PackedCandidate.cc @@ -63,7 +63,8 @@ void pat::PackedCandidate::packVtx(bool unpackAfterwards) { void pat::PackedCandidate::unpack() const { float pt = MiniFloatConverter::float16to32(packedPt_); double shift = (pt<1. ? 0.1*pt : 0.1/pt); // shift particle phi to break degeneracies in angular separations - double phi = int16_t(packedPhi_)*3.2f/std::numeric_limits::max() + shift*3.2/std::numeric_limits::max(); + double sign = ( ( int(pt*10) % 2 == 0 ) ? 1 : -1 ); // introduce a pseudo-random sign of the shift + double phi = int16_t(packedPhi_)*3.2f/std::numeric_limits::max() + sign*shift*3.2/std::numeric_limits::max(); p4_ = PolarLorentzVector(pt, int16_t(packedEta_)*6.0f/std::numeric_limits::max(), phi, diff --git a/DataFormats/PatCandidates/src/PackedGenParticle.cc b/DataFormats/PatCandidates/src/PackedGenParticle.cc index 3d3c0e3bafd2e..9d68ca0f29e3a 100644 --- a/DataFormats/PatCandidates/src/PackedGenParticle.cc +++ b/DataFormats/PatCandidates/src/PackedGenParticle.cc @@ -20,7 +20,8 @@ void pat::PackedGenParticle::unpack() const { float pz = std::tanh(y)*std::sqrt((m*m+pt*pt)/(1.-std::tanh(y)*std::tanh(y))); float eta = std::asinh(pz/pt); double shift = (pt<1. ? 0.1*pt : 0.1/pt); // shift particle phi to break degeneracies in angular separations - double phi = int16_t(packedPhi_)*3.2f/std::numeric_limits::max() + shift*3.2/std::numeric_limits::max(); + double sign = ( ( int(pt*10) % 2 == 0 ) ? 1 : -1 ); // introduce a pseudo-random sign of the shift + double phi = int16_t(packedPhi_)*3.2f/std::numeric_limits::max() + sign*shift*3.2/std::numeric_limits::max(); p4_ = PolarLorentzVector(pt,eta,phi,m); p4c_ = p4_; unpacked_ = true;