From 90e6269f71e301517344fe89756d6c76236cb1d8 Mon Sep 17 00:00:00 2001 From: Sajal Kumar Jana Date: Fri, 2 Oct 2026 02:23:18 +0000 Subject: [PATCH] fix(event-display): keep jivexml backward track theta and charge JiveXML gives a track's polar angle as cotTheta, and the loader turns it into theta with atan(1 / cotTheta). For a backward track (cotTheta < 0, eta < 0) that is negative, and the shift into (0, PI) only happened after dparams had already been built from it. So backward tracks were stored with a negative theta in dparams[3] and, since |p| = pT / sin(theta) came out negative, with the sign of q/p in dparams[4] flipped. That gave every backward track the wrong charge wherever it is read from dparams (the q shown for a track, "Color by Charge", the kinematics panel), a wrong theta/angle, and made the Runge-Kutta extrapolation of tracks without polylines bend the wrong way. Shift theta into (0, PI) before dparams is built, and add tests for forward and backward tracks. --- .../src/loaders/jivexml-loader.ts | 7 ++- .../src/tests/loaders/jivexml-loader.test.ts | 48 +++++++++++++++++++ 2 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 packages/phoenix-event-display/src/tests/loaders/jivexml-loader.test.ts diff --git a/packages/phoenix-event-display/src/loaders/jivexml-loader.ts b/packages/phoenix-event-display/src/loaders/jivexml-loader.ts index 1b4f58d68..0c69da1e6 100644 --- a/packages/phoenix-event-display/src/loaders/jivexml-loader.ts +++ b/packages/phoenix-event-display/src/loaders/jivexml-loader.ts @@ -299,6 +299,9 @@ export class JiveXMLLoader extends PhoenixLoader { track.author = trackAuthor[i]; let theta = Math.atan(1 / cotTheta[i]); + if (theta < 0) { + theta += Math.PI; + } track.pT = Math.abs(pT[i]) * 1000; // JiveXML uses GeV const momentum = track.pT / Math.sin(theta); @@ -318,10 +321,6 @@ export class JiveXMLLoader extends PhoenixLoader { // storeTrack = true; // } - if (theta < 0) { - theta += Math.PI; - // TODO - check if we need to flip phi here? - } // FIXME - should probably handle this better ... what if phi = 4PI for example? if (track.phi > Math.PI) { track.phi -= 2.0 * Math.PI; diff --git a/packages/phoenix-event-display/src/tests/loaders/jivexml-loader.test.ts b/packages/phoenix-event-display/src/tests/loaders/jivexml-loader.test.ts new file mode 100644 index 000000000..3b453b7c5 --- /dev/null +++ b/packages/phoenix-event-display/src/tests/loaders/jivexml-loader.test.ts @@ -0,0 +1,48 @@ +/** + * @jest-environment jsdom + */ +import { JiveXMLLoader } from '../../loaders/jivexml-loader'; + +describe('JiveXMLLoader', () => { + describe('getTracks', () => { + const getTracks = () => { + const xml = ` + + 1.0 1.0 + 3 3 + 10.0 10.0 + 0.1 0.1 + 1.0 1.0 + 0.5 0.5 + 1.0 -1.0 + + `; + + const loader = new JiveXMLLoader(); + loader.process(xml); + return loader.getEventData().Tracks.SomeTracks; + }; + + it('should give forward and backward tracks a theta in (0, PI)', () => { + const [forward, backward] = getTracks(); + + expect(forward.dparams[3]).toBeCloseTo(Math.PI / 4); + expect(backward.dparams[3]).toBeCloseTo((3 * Math.PI) / 4); + }); + + it('should keep the charge of backward tracks', () => { + const [forward, backward] = getTracks(); + const momentum = 10000 / Math.sin(Math.PI / 4); + + expect(forward.dparams[4]).toBeCloseTo(1 / momentum, 10); + expect(backward.dparams[4]).toBeCloseTo(1 / momentum, 10); + }); + + it('should give backward tracks a negative eta', () => { + const [forward, backward] = getTracks(); + + expect(forward.eta).toBeCloseTo(0.8814, 4); + expect(backward.eta).toBeCloseTo(-0.8814, 4); + }); + }); +});