Skip to content

Commit c46119f

Browse files
committed
Adding names and color
1 parent 696484f commit c46119f

3 files changed

Lines changed: 198 additions & 43 deletions

File tree

packages/phoenix-event-display/src/loaders/edm4hep-json-loader.ts

Lines changed: 50 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -664,15 +664,12 @@ export class Edm4hepJsonLoader extends PhoenixLoader {
664664
momentum.push(rawParticle.momentum.y);
665665
momentum.push(rawParticle.momentum.z);
666666

667-
console.log('------------ Particle -----------');
668-
console.log(' - origin:', origin);
669-
console.log(' - momentum:', momentum);
670-
console.log(' - status:', rawParticle.generatorStatus);
671-
672667
const particle = {
673668
origin: origin,
674669
momentum: momentum,
675-
color: '#ffff00',
670+
pdgid: rawParticle.PDG,
671+
status: rawParticle.generatorStatus,
672+
color: this.mcParticleColor(rawParticle.PDG),
676673
};
677674
particles.push(particle);
678675
});
@@ -691,6 +688,53 @@ export class Edm4hepJsonLoader extends PhoenixLoader {
691688
.toUpperCase();
692689
}
693690

691+
/** Return a random colour */
692+
private mcParticleColor(mcParticlePDGid) {
693+
switch (Math.abs(mcParticlePDGid)) {
694+
case 1:
695+
case 2:
696+
case 3:
697+
case 4:
698+
case 5:
699+
case 6:
700+
return '#aa0000';
701+
case 11:
702+
return '#00aa00';
703+
case 12:
704+
return '#00aa00';
705+
case 13:
706+
return '#00aa00';
707+
case 14:
708+
return '#00aa00';
709+
case 15:
710+
return '#00aa00';
711+
case 16:
712+
return '#00aa00';
713+
case 21:
714+
return '#0000aa';
715+
case 22:
716+
return '#0000aa';
717+
case 23:
718+
return '#0000aa';
719+
case 24:
720+
return '#0000aa';
721+
case 25:
722+
return '#00aaaa';
723+
case 111:
724+
return '#aa00aa';
725+
case 211:
726+
return '#aa00aa';
727+
case 221:
728+
return '#aa00aa';
729+
case 311:
730+
return '#aa00aa';
731+
case 321:
732+
return '#aa00aa';
733+
default:
734+
return '#aaaa00';
735+
}
736+
}
737+
694738
/** Helper conversion of HSL to hexadecimal */
695739
private convHSLtoHEX(h: number, s: number, l: number): string {
696740
l /= 100;

packages/phoenix-event-display/src/loaders/objects/phoenix-objects.ts

Lines changed: 120 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,11 @@ import {
2323
LineSegments,
2424
LineDashedMaterial,
2525
CanvasTexture,
26-
ArrowHelper,
2726
} from 'three';
2827
import { ConvexGeometry } from 'three/examples/jsm/geometries/ConvexGeometry.js';
28+
import { TextGeometry } from 'three/examples/jsm/geometries/TextGeometry.js';
29+
import { Font } from 'three/examples/jsm/loaders/FontLoader.js';
30+
import HelvetikerFont from '../../managers/three-manager/fonts/helvetiker_regular.typeface.json';
2931
import { EVENT_DATA_TYPE_COLORS } from '../../helpers/constants';
3032
import { RKHelper } from '../../helpers/rk-helper';
3133
import { CoordinateHelper } from '../../helpers/coordinate-helper';
@@ -912,12 +914,12 @@ export class PhoenixObjects {
912914
public static getMCParticle(mcParticleParams: {
913915
origin: number[];
914916
momentum: number[];
917+
pdgid: number;
915918
status?: number;
916919
color?: string;
917920
uuid: string;
918921
}): Object3D {
919922
const defaultColor: string = '#ffff00';
920-
const defaultStatus = 0;
921923

922924
const origin = new Vector3(
923925
mcParticleParams.origin[0],
@@ -934,18 +936,16 @@ export class PhoenixObjects {
934936
direction.normalize();
935937

936938
const lineLength = 0.85 * length;
937-
let lineWidth = Math.log(length * 100) / 10;
938-
console.log(lineWidth);
939+
let lineWidth = Math.log(length * 1000) / 100;
939940
if (lineWidth < 0) {
940941
lineWidth = 0.00001;
941942
}
942-
if (lineWidth > 0.4) {
943-
lineWidth = 0.4;
943+
if (lineWidth > 0.1) {
944+
lineWidth = 0.1;
944945
}
945946
const coneLength = 0.15 * length;
946947
const coneWidth = 2.5 * lineWidth;
947948

948-
// const lineGeometry = new CylinderGeometry(2, 2, lineLength, 16, 2);
949949
const lineGeometry = new CylinderGeometry(
950950
lineWidth,
951951
lineWidth,
@@ -955,7 +955,6 @@ export class PhoenixObjects {
955955
lineGeometry.rotateZ(Math.PI / 2);
956956
lineGeometry.translate(lineLength / 2, 0, 0);
957957

958-
// const coneGeometry = new ConeGeometry(2, coneLength, 16, 2);
959958
const coneGeometry = new ConeGeometry(coneWidth, coneLength, 16);
960959
coneGeometry.rotateZ(-Math.PI / 2);
961960
coneGeometry.translate(length - coneLength / 2, 0, 0);
@@ -969,32 +968,129 @@ export class PhoenixObjects {
969968
quaternion.setFromUnitVectors(buildDirection, direction);
970969
mergedGeometry.applyQuaternion(quaternion);
971970

972-
mergedGeometry.translate(origin.x, origin.y, origin.z);
973-
mergedGeometry.computeBoundingBox();
974-
975971
const material = new MeshPhongMaterial({
976972
color: mcParticleParams.color ?? defaultColor,
977973
});
978974

979975
const arrowObject = new Mesh(mergedGeometry, material);
980976

981-
// const arrowHelper = new ArrowHelper(direction, origin, length);
982-
// arrowHelper.position.copy(origin);
983-
// arrowHelper.setDirection(direction);
977+
const font = new Font(HelvetikerFont);
978+
const labelGeometry = new TextGeometry(
979+
PhoenixObjects.getMCParticleName(mcParticleParams.pdgid),
980+
{
981+
font: font,
982+
size: 80,
983+
height: 2,
984+
curveSegments: 12,
985+
bevelEnabled: true,
986+
bevelThickness: 4,
987+
bevelSize: 4,
988+
bevelOffset: 0,
989+
bevelSegments: 5,
990+
}
991+
);
992+
labelGeometry.scale(0.01, 0.01, 0.01);
993+
994+
labelGeometry.rotateX(Math.PI / 2);
995+
labelGeometry.translate(length, 0, 0);
996+
997+
labelGeometry.applyQuaternion(quaternion);
998+
999+
const labelObject = new Mesh(labelGeometry, material);
9841000

985-
// const arrowObject = new Group();
986-
// arrowObject.add(arrowHelper.line);
987-
// arrowObject.add(arrowHelper.cone);
1001+
const arrowContainer = new Group();
1002+
arrowContainer.position.x = origin.x;
1003+
arrowContainer.position.y = origin.y;
1004+
arrowContainer.position.z = origin.z;
9881005

989-
// console.log(arrowHelper.line);
990-
// console.log(arrowHelper.cone);
1006+
arrowContainer.add(arrowObject);
1007+
arrowContainer.add(labelObject);
9911008

992-
mcParticleParams.uuid = arrowObject.uuid;
993-
// mcParticleParams.uuid = arrowHelper.uuid;
1009+
mcParticleParams.uuid = arrowContainer.uuid;
1010+
arrowContainer.userData = Object.assign({}, mcParticleParams);
9941011

995-
arrowObject.name = 'MCParticle';
996-
// arrowHelper.name = 'MCParticle';
1012+
arrowContainer.name = 'MCParticle';
9971013

998-
return arrowObject;
1014+
return arrowContainer;
1015+
}
1016+
1017+
/**
1018+
* Return a Monte Carlo particle name from PDG ID.
1019+
* @param mcParticlePDGid PDG ID.
1020+
* @returns MCParticle name.
1021+
*/
1022+
public static getMCParticleName(mcParticlePDGid: number): string {
1023+
switch (mcParticlePDGid) {
1024+
case 1:
1025+
return 'd';
1026+
case -1:
1027+
return '!d';
1028+
case 2:
1029+
return 'u';
1030+
case -2:
1031+
return '!u';
1032+
case 3:
1033+
return 's';
1034+
case -3:
1035+
return '!s';
1036+
case 4:
1037+
return 'c';
1038+
case -4:
1039+
return '!c';
1040+
case 5:
1041+
return 'b';
1042+
case -5:
1043+
return '!b';
1044+
case 6:
1045+
return 't';
1046+
case -6:
1047+
return '!t';
1048+
case 11:
1049+
return 'e-';
1050+
case -11:
1051+
return 'e+';
1052+
case 12:
1053+
return 'νe';
1054+
case 13:
1055+
return 'μ-';
1056+
case -13:
1057+
return 'μ+';
1058+
case 14:
1059+
return 'νμ';
1060+
case 15:
1061+
return 'τ';
1062+
case -15:
1063+
return 'τ-';
1064+
case 16:
1065+
return 'ντ';
1066+
case 21:
1067+
return 'g';
1068+
case 22:
1069+
return 'γ';
1070+
case 23:
1071+
return 'Z';
1072+
case 24:
1073+
return 'W+';
1074+
case -24:
1075+
return 'W-';
1076+
case 25:
1077+
return 'H';
1078+
case 111:
1079+
return 'π0';
1080+
case 211:
1081+
return 'π+';
1082+
case -211:
1083+
return 'π-';
1084+
case 221:
1085+
return 'η';
1086+
case 311:
1087+
return 'K0';
1088+
case 321:
1089+
return 'K+';
1090+
case -321:
1091+
return 'K-';
1092+
default:
1093+
return mcParticlePDGid.toString();
1094+
}
9991095
}
10001096
}

packages/phoenix-event-display/src/loaders/phoenix-loader.ts

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -435,28 +435,43 @@ export class PhoenixLoader implements EventDataLoader {
435435
}
436436

437437
if (eventData.MCParticles) {
438-
const cuts = [
439-
// new Cut('status', 0, 200, 20, 29),
440-
];
438+
const cuts = [new Cut('status', 21, 29, 200)];
441439

442-
const scaleMCParticles = (value: number) => {
443-
this.graphicsLibrary
444-
.getSceneManager()
445-
.scaleChildObjects('MCParticles', value);
440+
const addMCParticlesSizeOption = (
441+
typeFolder: GUI,
442+
typeFolderPM: PhoenixMenuNode
443+
) => {
444+
const scaleMCParticles = (value: number) => {
445+
this.graphicsLibrary
446+
.getSceneManager()
447+
.scaleChildObjects('MCParticles', value / 100);
448+
};
449+
if (typeFolder) {
450+
const sizeMenu = typeFolder
451+
.add({ particleScale: 100 }, 'particleScale', 1, 400)
452+
.name('Size (%)');
453+
sizeMenu.onChange(scaleMCParticles);
454+
}
455+
// Phoenix menu
456+
if (typeFolderPM) {
457+
typeFolderPM.addConfig('slider', {
458+
label: 'Size (%)',
459+
value: 100,
460+
min: 1,
461+
max: 400,
462+
allowCustomValue: true,
463+
onChange: scaleMCParticles,
464+
});
465+
}
446466
};
447-
const addMCParticlesOptions = this.addScaleOptions(
448-
'mcParticlesScale',
449-
'MCParticles Scale',
450-
scaleMCParticles
451-
);
452467

453468
this.addObjectType(
454469
eventData.MCParticles,
455470
PhoenixObjects.getMCParticle,
456471
'MCParticles',
457472
false,
458473
cuts,
459-
addMCParticlesOptions
474+
addMCParticlesSizeOption
460475
);
461476
}
462477
}

0 commit comments

Comments
 (0)