1 package org.lcsim.util.heprep;
2
3 import hep.graphics.heprep.HepRepFactory;
4 import hep.graphics.heprep.HepRepInstance;
5 import hep.graphics.heprep.HepRepType;
6 import hep.graphics.heprep.HepRepTypeTree;
7 import hep.graphics.heprep.HepRepInstanceTree;
8 import hep.physics.vec.Hep3Vector;
9 import java.awt.Color;
10 import java.util.List;
11 import org.lcsim.event.EventHeader;
12 import org.lcsim.event.EventHeader.LCMetaData;
13 import org.lcsim.event.ReconstructedParticle;
14 import org.lcsim.geometry.Detector;
15 import org.lcsim.util.swim.HelixSwimmer;
16
17
18
19
20
21
22 class ReconstructedParticleConverter implements HepRepCollectionConverter
23 {
24 private static final double[] IP = { 0,0,0 };
25 private Color[] colors;
26 private double zField;
27 private HelixSwimmer helix;
28 private double trackingRMax;
29 private double trackingZMax;
30
31 ReconstructedParticleConverter()
32 {
33 ColorMap cm = new RainbowColorMap();
34 colors = new Color[10];
35 for (int i=0; i<colors.length; i++) colors[i] = cm.getColor(((double) i)/colors.length,1);
36 }
37 public boolean canHandle(Class k)
38 {
39 return ReconstructedParticle.class.isAssignableFrom(k);
40 }
41 public void convert(EventHeader event, List collection, HepRepFactory factory, HepRepTypeTree typeTree, HepRepInstanceTree instanceTree)
42 {
43 LCMetaData meta = event.getMetaData(collection);
44 String name = meta.getName();
45 int flags = meta.getFlags();
46
47 try {
48 event.getDetector();
49 }
50 catch (Exception x)
51 {
52 return;
53 }
54
55 Detector detector = event.getDetector();
56
57 trackingRMax = detector.getConstants().get("tracking_region_radius").getValue();
58 trackingZMax = detector.getConstants().get("tracking_region_zmax").getValue();
59
60 zField = detector.getFieldMap().getField(IP)[2];
61 helix = new HelixSwimmer(zField);
62
63 HepRepType typeX = factory.createHepRepType(typeTree, name);
64 typeX.addAttValue("layer",LCSimHepRepConverter.PARTICLES_LAYER);
65 typeX.addAttValue("drawAs","Line");
66 typeX.addAttValue("width",2);
67 typeX.addAttDef("momentum","Particle Momentum", "physics", "");
68 typeX.addAttDef("type","Particle Type", "physics", "");
69
70 boolean jets = name.toLowerCase().contains("jets");
71 if (jets)
72 {
73 HepRepType jetTypeX = factory.createHepRepType(typeX, name+"Particles");
74 jetTypeX.addAttValue("layer",LCSimHepRepConverter.PARTICLES_LAYER);
75 jetTypeX.addAttValue("drawAs","Line");
76 jetTypeX.addAttDef("momentum","Particle Momentum", "physics", "");
77 jetTypeX.addAttDef("type","Particle Type", "physics", "");
78
79 int i = 0;
80 for (ReconstructedParticle jet : (List<ReconstructedParticle>) collection)
81 {
82 Color jetColor = colors[i%colors.length];
83 i += 3;
84
85 HepRepInstance instanceX = factory.createHepRepInstance(instanceTree, typeX);
86 instanceX.addAttValue("color",jetColor);
87 drawParticle(factory, jet,instanceX, 0);
88
89 for (ReconstructedParticle p : jet.getParticles())
90 {
91 HepRepInstance jetParticleX = factory.createHepRepInstance(instanceX, jetTypeX);
92 jetParticleX.addAttValue("color",jetColor);
93 drawParticle(factory, p, jetParticleX, p.getCharge());
94 }
95 }
96 }
97 else
98 {
99 HepRepType neutralType = factory.createHepRepType(typeX, "Neutral");
100 neutralType.addAttValue("color",Color.GREEN);
101
102 HepRepType chargedType = factory.createHepRepType(typeX, "Charged");
103 chargedType.addAttValue("color",Color.ORANGE);
104
105 HepRepInstance charged = factory.createHepRepInstance(instanceTree, typeX);
106 HepRepInstance neutral = factory.createHepRepInstance(instanceTree, typeX);
107
108 for (ReconstructedParticle p : (List<ReconstructedParticle>) collection)
109 {
110 double charge = p.getCharge();
111 HepRepInstance instanceX = factory.createHepRepInstance(charge == 0 ? neutral : charged, charge == 0 ? neutralType : chargedType);
112 drawParticle(factory, p, instanceX, charge);
113 }
114 }
115
116
117 }
118 private void drawParticle(HepRepFactory factory, ReconstructedParticle p, HepRepInstance instanceX, double charge)
119 {
120 Hep3Vector start = p.getReferencePoint();
121 Hep3Vector momentum = p.getMomentum();
122 helix.setTrack(momentum, start, (int) charge);
123 double distanceToCylinder = helix.getDistanceToCylinder(trackingRMax,trackingZMax);
124
125 if (charge == 0 || zField == 0)
126 {
127 Hep3Vector stop = helix.getPointAtDistance(distanceToCylinder);
128
129 factory.createHepRepPoint(instanceX,start.x(),start.y(),start.z());
130 factory.createHepRepPoint(instanceX,stop.x(),stop.y(),stop.z());
131 instanceX.addAttValue("momentum",p.getEnergy());
132 instanceX.addAttValue("type",p.getType());
133 }
134 else
135 {
136 double dAlpha = 10;
137
138 instanceX.addAttValue("momentum",p.getEnergy());
139 instanceX.addAttValue("type",p.getType());
140 factory.createHepRepPoint(instanceX,start.x(),start.y(),start.z());
141
142 for (int k = 1;k<200;k++)
143 {
144 double d = k*dAlpha;
145 if (d>distanceToCylinder) break;
146 Hep3Vector point = helix.getPointAtDistance(d);
147 factory.createHepRepPoint(instanceX,point.x(),point.y(),point.z());
148 }
149 }
150 }
151 }