1 package org.lcsim.util.heprep;
2
3 import hep.graphics.heprep.HepRepFactory;
4 import hep.graphics.heprep.HepRepInstance;
5 import hep.graphics.heprep.HepRepInstanceTree;
6 import hep.graphics.heprep.HepRepPoint;
7 import hep.graphics.heprep.HepRepType;
8 import hep.graphics.heprep.HepRepTypeTree;
9 import hep.physics.vec.Hep3Vector;
10
11 import java.awt.Color;
12 import java.util.ArrayList;
13 import java.util.List;
14
15 import org.lcsim.event.CalorimeterHit;
16 import org.lcsim.event.Cluster;
17 import org.lcsim.event.EventHeader;
18 import org.lcsim.event.ReconstructedParticle;
19 import org.lcsim.event.Track;
20 import org.lcsim.geometry.Detector;
21 import org.lcsim.util.swim.HelixSwimmer;
22
23
24
25
26
27
28
29
30
31 class ReconstructedParticleConverterNew implements HepRepCollectionConverter
32 {
33 RandomColorMap rcolorMap;
34
35 private static final double[] zero = { 0, 0, 0 };
36
37 public ReconstructedParticleConverterNew()
38 {
39 rcolorMap = new RandomColorMap(50);
40 }
41
42 public boolean canHandle(Class k)
43 {
44 return ReconstructedParticle.class.isAssignableFrom(k);
45 }
46
47 public void convert(EventHeader event, List collection, HepRepFactory factory, HepRepTypeTree typeTree, HepRepInstanceTree instanceTree)
48 {
49 rcolorMap.reset(collection.size());
50
51 String pfoName = event.getMetaData(collection).getName();
52
53
54 HepRepType rpType = factory.createHepRepType(typeTree, pfoName);
55 rpType.addAttValue("layer", LCSimHepRepConverter.PARTICLES_LAYER);
56
57
58 HepRepType neutralTracksType = factory.createHepRepType(rpType, "NeutralTracks");
59 neutralTracksType.addAttValue("layer", LCSimHepRepConverter.PARTICLES_LAYER);
60 neutralTracksType.addAttValue("drawAs","Line");
61
62
63
64
65 HepRepType chargedTracksType = factory.createHepRepType(rpType, "ChargedTracks");
66 chargedTracksType.addAttValue("layer", LCSimHepRepConverter.PARTICLES_LAYER);
67 chargedTracksType.addAttValue("drawAs","Line");
68
69
70 HepRepType clustersType = factory.createHepRepType(rpType, "CalClusters");
71 clustersType.addAttValue("color",Color.RED);
72 clustersType.addAttValue("fill",true);
73 clustersType.addAttValue("fillColor",Color.RED);
74 clustersType.addAttValue("layer", LCSimHepRepConverter.HITS_LAYER);
75
76
77
78
79
80
81
82
83
84 int rpCnt = 0;
85 for (ReconstructedParticle rp : (List<ReconstructedParticle>) collection)
86 {
87
88 Color rpColor = rcolorMap.getColor(rpCnt % rcolorMap.size());
89
90 List<Cluster> clusters = rp.getClusters();
91 List<Track> tracks = rp.getTracks();
92
93 convertClusters(event, clusters, factory, typeTree, instanceTree, rpColor, clustersType);
94 convertTracks(event, tracks, factory, typeTree, instanceTree, rpColor, chargedTracksType);
95
96 if (rp.getCharge() == 0)
97 {
98 convertNeutralParticle(event.getDetector(), rp, instanceTree, factory, neutralTracksType, rpColor);
99 }
100
101 ++rpCnt;
102 }
103 }
104
105 private void convertClusters(EventHeader event, List<Cluster> collection, HepRepFactory factory, HepRepTypeTree typeTree, HepRepInstanceTree instanceTree, Color clusterColor, HepRepType type)
106 {
107 List<CalorimeterHit> hits = new ArrayList<CalorimeterHit>();
108
109 HepRepInstance instanceC = factory.createHepRepInstance(instanceTree, type);
110
111 for (Cluster cluster : collection)
112 {
113 if (cluster.getCalorimeterHits().size() != 0) {
114 hits.addAll(cluster.getCalorimeterHits());
115 }
116 }
117
118 if (hits != null)
119 {
120 for (CalorimeterHit hit : hits)
121 {
122 if (hit != null) {
123 double[] pos = hit.getPosition();
124 HepRepInstance instanceX = factory.createHepRepInstance(instanceC, type);
125 instanceX.addAttValue("MarkSize", 5);
126 instanceX.addAttValue("color", clusterColor);
127 instanceX.addAttValue("showparentattributes", true);
128 instanceX.addAttValue("pickparent", true);
129
130 factory.createHepRepPoint(instanceX, pos[0], pos[1], pos[2]);
131 }
132 }
133 }
134 }
135
136 private void convertTracks(EventHeader event, List<Track> collection, HepRepFactory factory, HepRepTypeTree typeTree, HepRepInstanceTree instanceTree, Color trackColor, HepRepType type)
137 {
138 if (collection.size() == 0)
139 return;
140
141 Detector detector = event.getDetector();
142
143 double trackingRMax = detector.getConstants().get("tracking_region_radius").getValue();
144 double trackingZMax = detector.getConstants().get("tracking_region_zmax").getValue();
145
146 double[] origin = TrackUtil.getOrigin(collection.get(0));
147 double[] field = detector.getFieldMap().getField(origin);
148 HelixSwimmer helix = TrackUtil.getHelixSwimmer(collection, field);
149
150 for (Track t : (List<Track>) collection)
151 {
152 helix.setTrack(t);
153 double distanceToCylinder = helix.getDistanceToCylinder(trackingRMax, trackingZMax);
154
155 HepRepInstance instanceX = factory.createHepRepInstance(instanceTree, type);
156 instanceX.addAttValue("color", trackColor);
157
158 double dAlpha = 10;
159 for (int k = 0; k < 200; k++)
160 {
161 double d = k * dAlpha;
162 if (d > distanceToCylinder)
163 break;
164 Hep3Vector point = helix.getPointAtDistance(d);
165 factory.createHepRepPoint(instanceX, point.x(), point.y(), point.z());
166 }
167 }
168 }
169
170
171 public void convertNeutralParticle(Detector detector, ReconstructedParticle p, HepRepInstanceTree tree, HepRepFactory factory, HepRepType type, Color rpColor)
172 {
173 HepRepInstance instanceX = factory.createHepRepInstance(tree, type);
174
175 double trackingRMax = detector.getConstants().get("tracking_region_radius").getValue();
176 double trackingZMax = detector.getConstants().get("tracking_region_zmax").getValue();
177
178 double[] field = detector.getFieldMap().getField(zero);
179 HelixSwimmer helix = new HelixSwimmer(field[2]);
180
181 double charge = p.getCharge();
182 Hep3Vector start = p.getReferencePoint();
183 Hep3Vector momentum = p.getMomentum();
184 helix.setTrack(momentum, start, (int) charge);
185 double distanceToCylinder = helix.getDistanceToCylinder(trackingRMax,trackingZMax);
186
187 Hep3Vector stop = helix.getPointAtDistance(distanceToCylinder);
188
189 factory.createHepRepPoint(instanceX,start.x(),start.y(),start.z());
190 factory.createHepRepPoint(instanceX,stop.x(),stop.y(),stop.z());
191 instanceX.addAttValue("color", rpColor);
192 instanceX.addAttValue("momentum",p.getEnergy());
193 instanceX.addAttValue("type",p.getType());
194 }
195 }