1
2
3
4
5
6
7
8
9
10 package org.lcsim.util.heprep;
11
12 import hep.graphics.heprep.HepRepFactory;
13 import hep.graphics.heprep.HepRepInstance;
14 import hep.graphics.heprep.HepRepInstanceTree;
15 import hep.graphics.heprep.HepRepType;
16 import hep.graphics.heprep.HepRepTypeTree;
17 import hep.physics.vec.Hep3Vector;
18
19 import java.awt.Color;
20 import java.util.HashSet;
21 import java.util.List;
22 import java.util.Set;
23
24 import org.lcsim.detector.DetectorElementStore;
25 import org.lcsim.detector.IDetectorElement;
26 import org.lcsim.detector.solids.IPolyhedron;
27 import org.lcsim.detector.solids.ISolid;
28 import org.lcsim.detector.solids.Point3D;
29 import org.lcsim.event.EventHeader;
30 import org.lcsim.event.SimTrackerHit;
31 import org.lcsim.event.EventHeader.LCMetaData;
32 import org.lcsim.geometry.Subdetector;
33 import org.lcsim.geometry.subdetector.SiTrackerBarrel;
34 import org.lcsim.geometry.subdetector.SiTrackerEndcap;
35 import org.lcsim.geometry.subdetector.SiTrackerEndcap2;
36 import org.lcsim.geometry.subdetector.SiTrackerFixedTarget;
37 import org.lcsim.geometry.subdetector.SiTrackerFixedTarget2;
38
39
40
41
42
43
44 public class DisplayHitModules implements HepRepCollectionConverter{
45
46
47
48 public DisplayHitModules() {
49 }
50
51
52 public boolean canHandle(Class k) {
53 return (SimTrackerHit.class.isAssignableFrom(k));
54 }
55
56 public void convert(EventHeader event, List collection, HepRepFactory factory, HepRepTypeTree typeTree, HepRepInstanceTree instanceTree) {
57
58 try
59 {
60 LCMetaData data = event.getMetaData(collection);
61 Subdetector sub = data.getIDDecoder().getSubdetector();
62
63 if (!(sub instanceof SiTrackerBarrel || sub instanceof SiTrackerEndcap || sub instanceof SiTrackerEndcap2|| sub instanceof SiTrackerFixedTarget|| sub instanceof SiTrackerFixedTarget2))
64 return;
65 }
66
67 catch (RuntimeException x)
68 {
69 return;
70 }
71
72 if (DetectorElementStore.getInstance().isEmpty())
73 return;
74
75 String collection_name = event.getMetaData(collection).getName();
76
77
78 HepRepType typeS = getSensorType(factory, typeTree, collection_name);
79
80
81 HepRepType typeM = getModuleType(factory, typeTree, collection_name);
82
83 Set<IDetectorElement> alreadyMade = new HashSet<IDetectorElement>();
84
85 for (SimTrackerHit h : (List<SimTrackerHit>) collection)
86 {
87
88 IDetectorElement sensor = h.getDetectorElement();
89
90
91 if (!alreadyMade.add(sensor))
92 continue;
93
94
95 IDetectorElement module = sensor.getParent();
96
97 drawPolyhedron(sensor,typeS,instanceTree,factory);
98 drawPolyhedron(module,typeM,instanceTree,factory);
99 }
100 }
101
102 public static void drawPolyhedron(IDetectorElement detelem, HepRepType type, HepRepInstanceTree instanceTree, HepRepFactory factory) {
103
104 ISolid solid = detelem.getGeometry().getLogicalVolume().getSolid();
105 if (!(solid instanceof IPolyhedron))
106 return;
107 IPolyhedron poly = (IPolyhedron) solid;
108
109 List<Point3D> points = poly.getVertices();
110 int[] point_ordering = poly.getHepRepVertexOrdering();
111
112 HepRepInstance instance = factory.createHepRepInstance(instanceTree,type);
113
114 for (int i = 0; i< point_ordering.length; i++) {
115 Hep3Vector p = detelem.getGeometry().transformLocalToGlobal(points.get(point_ordering[i]));
116 factory.createHepRepPoint(instance,p.x(),p.y(),p.z());
117 }
118 }
119
120 public static HepRepType getSensorType(HepRepFactory factory, HepRepTypeTree typeTree, String collection_name){
121
122 HepRepType typeS = factory.createHepRepType(typeTree,"HitSensor"+collection_name);
123 typeS.addAttValue("layer",LCSimHepRepConverter.HITS_LAYER);
124 typeS.addAttValue("drawAs","prism");
125 typeS.addAttValue("color",Color.WHITE);
126 return typeS;
127 }
128
129 public static HepRepType getModuleType(HepRepFactory factory, HepRepTypeTree typeTree, String collection_name){
130
131 HepRepType typeM = factory.createHepRepType(typeTree,"HitModule"+collection_name);
132 typeM.addAttValue("layer",LCSimHepRepConverter.HITS_LAYER);
133 typeM.addAttValue("drawAs","prism");
134 typeM.addAttValue("color",Color.WHITE);
135 return typeM;
136 }
137 }