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.awt.Color;
11 import java.util.Collection;
12 import java.util.List;
13
14 import org.lcsim.detector.DetectorElementStore;
15 import org.lcsim.detector.IDetectorElement;
16 import org.lcsim.detector.ITransform3D;
17 import org.lcsim.detector.identifier.IExpandedIdentifier;
18 import org.lcsim.detector.identifier.IIdentifier;
19 import org.lcsim.detector.identifier.IIdentifierDictionary;
20 import org.lcsim.detector.solids.LineSegment3D;
21 import org.lcsim.detector.tracker.silicon.SiSensor;
22 import org.lcsim.detector.tracker.silicon.SiSensorElectrodes;
23 import org.lcsim.detector.tracker.silicon.SiStrips;
24 import org.lcsim.event.EventHeader;
25 import org.lcsim.event.EventHeader.LCMetaData;
26 import org.lcsim.event.RawTrackerHit;
27
28
29
30
31
32
33 class RawTrackerHitConverter implements HepRepCollectionConverter
34 {
35 public boolean canHandle(Class k) {
36 return RawTrackerHit.class.isAssignableFrom(k);
37 }
38
39 public void convert(EventHeader event, List collection, HepRepFactory factory, HepRepTypeTree typeTree, HepRepInstanceTree instanceTree) {
40 LCMetaData meta = event.getMetaData(collection);
41 String name = meta.getName();
42
43 HepRepType typeX = factory.createHepRepType(typeTree, name);
44 typeX.addAttValue("layer", LCSimHepRepConverter.HITS_LAYER);
45 typeX.addAttValue("drawAs", "Line");
46 typeX.addAttValue("color", Color.GREEN);
47
48 try {
49
50 setSensors(meta, (List<RawTrackerHit>)collection);
51
52
53 for (RawTrackerHit hit : (List<RawTrackerHit>)collection) {
54 try {
55 SiSensor sensor = (SiSensor)hit.getDetectorElement();
56 Collection<SiSensorElectrodes> trodes = sensor.getReadoutElectrodes();
57 SiStrips strips = (SiStrips)trodes.toArray()[0];
58 LineSegment3D line = strips.getStrip(hit.getIdentifierFieldValue("strip"));
59 ITransform3D transform = strips.getLocalToGlobal();
60 Hep3Vector startPoint = transform.transformed(line.getStartPoint());
61 Hep3Vector endPoint = transform.transformed(line.getEndPoint());
62 HepRepInstance instance = factory.createHepRepInstance(instanceTree, typeX);
63 factory.createHepRepPoint(instance, startPoint.x(), startPoint.y(), startPoint.z());
64 factory.createHepRepPoint(instance, endPoint.x(), endPoint.y(), endPoint.z());
65 } catch (Exception e) {
66 e.printStackTrace();
67 }
68 }
69 }
70 catch (Exception e) {
71 e.printStackTrace();
72 }
73 }
74
75 private void setSensors(LCMetaData meta, List<RawTrackerHit> hits) {
76
77
78 IIdentifierDictionary dict = meta.getIDDecoder().getSubdetector().getDetectorElement().getIdentifierHelper().getIdentifierDictionary();
79 int fieldIdx = dict.getFieldIndex("side");
80 int sideIdx = dict.getFieldIndex("strip");
81
82 for (RawTrackerHit hit : hits) {
83
84
85 IExpandedIdentifier expId = dict.unpack(hit.getIdentifier());
86 expId.setValue(fieldIdx, 0);
87 expId.setValue(sideIdx, 0);
88 IIdentifier strippedId = dict.pack(expId);
89
90
91 List<IDetectorElement> des = DetectorElementStore.getInstance().find(strippedId);
92 if (des == null || des.size() == 0) {
93 throw new RuntimeException("Failed to find any DetectorElements with stripped ID <0x" + Long.toHexString(strippedId.getValue()) + ">.");
94 }
95 else if (des.size() == 1) {
96 hit.setDetectorElement((SiSensor)des.get(0));
97 }
98 else {
99
100 for (IDetectorElement de : des) {
101 if (de instanceof SiSensor) {
102 hit.setDetectorElement((SiSensor)de);
103 break;
104 }
105 }
106 }
107
108
109 if (hit.getDetectorElement() == null) {
110 throw new RuntimeException("No sensor was found for hit with stripped ID <0x" + Long.toHexString(strippedId.getValue()) + ">.");
111 }
112 }
113 }
114 }