View Javadoc

1   /*
2    * DisplayHitModules.java
3    *
4    * Created on December 14, 2007, 1:43 PM
5    *
6    * To change this template, choose Tools | Template Manager
7    * and open the template in the editor.
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   * Converter that draws modules and sensors that have hits in them. 
41   * Everything is drawn in the event layer. 
42   *
43   */
44  public class DisplayHitModules implements HepRepCollectionConverter{
45  
46  
47  	/** Creates a new instance of DisplayHitModules */
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  			//ignore older detectors
63  			if (!(sub instanceof SiTrackerBarrel || sub instanceof SiTrackerEndcap || sub instanceof SiTrackerEndcap2|| sub instanceof SiTrackerFixedTarget|| sub instanceof SiTrackerFixedTarget2))
64  				return; 
65  		} 
66  		// ignore additional SimTrackerHit collections
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  		//sensor type    
78  		HepRepType typeS = getSensorType(factory, typeTree, collection_name);
79  
80  		//module type
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  			// find sensor
88  			IDetectorElement sensor = h.getDetectorElement(); 
89  
90  			//make sure we don't have repeats
91  			if (!alreadyMade.add(sensor)) 
92  				continue; 
93  
94  			//get the module from the sensor 
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 }