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.HepRepType;
7 import hep.graphics.heprep.HepRepTypeTree;
8 import hep.physics.vec.Hep3Vector;
9
10 import java.util.List;
11
12 import org.lcsim.constants.Constants;
13 import org.lcsim.event.EventHeader;
14 import org.lcsim.event.EventHeader.LCMetaData;
15 import org.lcsim.event.Track;
16 import org.lcsim.event.TrackState;
17 import org.lcsim.geometry.Detector;
18 import org.lcsim.util.swim.HelixSwimmer;
19
20
21
22
23
24
25
26
27 class TrackConverter implements HepRepCollectionConverter {
28
29 public boolean canHandle(Class k) {
30 return Track.class.isAssignableFrom(k);
31 }
32
33 public void convert(EventHeader event, List collection, HepRepFactory factory, HepRepTypeTree typeTree, HepRepInstanceTree instanceTree) {
34 try {
35 event.getDetector();
36 } catch (Exception x) {
37 return;
38 }
39
40 if (collection.size() == 0)
41 return;
42
43 List<Track> trackList = (List<Track>) collection;
44 Track firstTrack = trackList.get(0);
45
46 LCMetaData meta = event.getMetaData(collection);
47 String name = meta.getName();
48 Detector detector = event.getDetector();
49
50 double trackingRMax = detector.getConstants().get("tracking_region_radius").getValue();
51 double trackingZMax = detector.getConstants().get("tracking_region_zmax").getValue();
52
53 double[] origin = TrackUtil.getOrigin(firstTrack);
54 double[] field = detector.getFieldMap().getField(origin);
55
56 HelixSwimmer helix = TrackUtil.getHelixSwimmer(trackList, field);
57
58
59 HepRepType typeX = factory.createHepRepType(typeTree, name);
60 typeX.addAttValue("layer", LCSimHepRepConverter.PARTICLES_LAYER);
61 typeX.addAttValue("drawAs", "Line");
62
63 typeX.addAttDef("pT", "Transverse momentum", "physics", "");
64 typeX.addAttDef("dedX", "de/Dx", "physics", "GeV");
65 typeX.addAttDef("dedX error", "", "physics", "GeV");
66 typeX.addAttDef("Charge", "", "physics", "");
67 typeX.addAttDef("Chi2", "", "physics", "");
68 typeX.addAttDef("pX", "Momentum X", "physics", "GeV");
69 typeX.addAttDef("pY", "Momentum Y", "physics", "GeV");
70 typeX.addAttDef("pZ", "Momentum Z", "physics", "GeV");
71 typeX.addAttDef("NDF", "Number Degrees Freedom", "physics", "");
72 typeX.addAttDef("Reference Point X", "Reference Point X", "physics", "mm");
73 typeX.addAttDef("Reference Point Y", "Reference Point Y", "physics", "mm");
74 typeX.addAttDef("Reference Point Z", "Reference Point Z", "physics", "mm");
75 typeX.addAttDef("d0", "d0", "physics", "");
76 typeX.addAttDef("phi0", "phi0", "physics", "");
77 typeX.addAttDef("omega", "omega", "physics", "");
78 typeX.addAttDef("z0", "z0", "physics", "");
79 typeX.addAttDef("s", "s", "physics", "");
80
81 for (Track track : trackList) {
82
83 helix.setTrack(track);
84 double distanceToCylinder = helix.getDistanceToCylinder(trackingRMax, trackingZMax);
85
86 TrackState ts = track.getTrackStates().get(0);
87 double[] referencePoint = ts.getReferencePoint();
88 double[] momentum = ts.getMomentum();
89
90 HepRepInstance instanceX = factory.createHepRepInstance(instanceTree, typeX);
91 double pt = field[2] * Constants.fieldConversion / Math.abs(ts.getParameter(2));
92
93 instanceX.addAttValue("pT", pt);
94 instanceX.addAttValue("dedX", track.getdEdx());
95 instanceX.addAttValue("dedX error", track.getdEdxError());
96 instanceX.addAttValue("Charge", track.getCharge());
97 instanceX.addAttValue("Chi2", track.getChi2());
98 instanceX.addAttValue("pX", momentum[0]);
99 instanceX.addAttValue("pY", momentum[1]);
100 instanceX.addAttValue("pZ", momentum[2]);
101 instanceX.addAttValue("NDF", track.getNDF());
102 instanceX.addAttValue("Reference Point X", referencePoint[0]);
103 instanceX.addAttValue("Reference Point Y", referencePoint[1]);
104 instanceX.addAttValue("Reference Point Z", referencePoint[2]);
105 instanceX.addAttValue("d0", ts.getParameter(0));
106 instanceX.addAttValue("phi0", ts.getParameter(1));
107 instanceX.addAttValue("omega", ts.getParameter(2));
108 instanceX.addAttValue("z0", ts.getParameter(3));
109 instanceX.addAttValue("s", ts.getParameter(4));
110
111 double dAlpha = 10;
112
113 for (int k = 0; k < 200; k++) {
114 double d = k * dAlpha;
115 if (d > distanceToCylinder)
116 break;
117 Hep3Vector point = helix.getPointAtDistance(d);
118 factory.createHepRepPoint(instanceX, point.x(), point.y(), point.z());
119 }
120 }
121 }
122 }