View Javadoc

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   * Convert RawTrackerHit objects into HepRep line segments.
30   * @author Jeremy McCormick <jeremym@slac.stanford.edu>
31   * @version $Id: RawTrackerHitConverter.java,v 1.2 2012/06/14 00:02:39 jeremy Exp $
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            // Setup links to SiSensor objects in detector geometry.
50            setSensors(meta, (List<RawTrackerHit>)collection);
51              
52            // Loop over hits and draw them as lines.
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         // Get the ID dictionary and field information.
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             // The "side" and "strip" fields needs to be stripped from the ID for sensor lookup.
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             // Find the sensor DetectorElement.
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                 // Use first sensor found, which should work unless there are sensors with duplicate IDs.
100                for (IDetectorElement de : des) {
101                    if (de instanceof SiSensor) {
102                        hit.setDetectorElement((SiSensor)de);
103                        break;
104                    }
105                }
106            }   
107            
108            // No sensor was found.
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 }