Commit in GeomConverter on MAIN
src/org/lcsim/detector/converter/heprep/DetectorElementToHepRepConverter.java+49-161.6 -> 1.7
src/org/lcsim/detector/solids/Trd.java+100added 1.1
test/org/lcsim/detector/solids/TrdTest.java+181added 1.1
+330-16
2 added + 1 modified, total 3 files
JM: Add a Trd solid similar to G4Trd to org.lcsim.detector with HepRep conversion.

GeomConverter/src/org/lcsim/detector/converter/heprep
DetectorElementToHepRepConverter.java 1.6 -> 1.7
diff -u -r1.6 -r1.7
--- DetectorElementToHepRepConverter.java	10 Apr 2007 03:34:47 -0000	1.6
+++ DetectorElementToHepRepConverter.java	24 Jul 2007 19:58:18 -0000	1.7
@@ -13,23 +13,19 @@
 import org.lcsim.detector.IGeometryInfo;
 import org.lcsim.detector.solids.Box;
 import org.lcsim.detector.solids.ISolid;
+import org.lcsim.detector.solids.Trd;
 import org.lcsim.detector.solids.Tube;
 
 public class DetectorElementToHepRepConverter
 {
     public static void convert(IDetectorElement detelem, HepRepFactory factory, HepRep heprep, boolean recurse)
-    {
-        //System.out.println("convert - " + detelem.getName());
-        
+    {            	
         HepRepInstanceTree instanceTree = heprep.getInstanceTreeTop("Detector","1.0");
         HepRepTypeTree typeTree = heprep.getTypeTree("DetectorType","1.0");
 
         if ( detelem.hasGeometryInfo() )
-        {
-            //System.out.println("hasGeometryInfo");
-            
+        {            
             IGeometryInfo geo = detelem.getGeometry();				
-
             ISolid solid = geo.getLogicalVolume().getSolid();
 
             if ( solid instanceof Box )
@@ -106,21 +102,58 @@
                 instance2.addAttValue("radius",tube.getOuterRadius());
                 factory.createHepRepPoint(instance2,point1.x(),point1.y(),point1.z());
                 factory.createHepRepPoint(instance2,point2.x(),point2.y(),point2.z());
-            }				
-            else {
-                System.err.println("IDetectorElementToHepRepConverter - Don't know how to convert shape : " + solid.getName());
+            }		
+            else if ( solid instanceof Trd )
+            {            	
+            	Trd trd = (Trd)geo.getLogicalVolume().getSolid();
+            	
+            	HepRepType ec = typeTree.getType("Barrel");
+                HepRepType type = factory.createHepRepType(ec, detelem.getName());		
+                type.addAttValue("drawAs","Prism");
+
+                HepRepInstance instance = factory.createHepRepInstance(instanceTree, type);
+            	            	
+            	Hep3Vector points[] = new BasicHep3Vector[8];
+            	
+            	double x1 = trd.getXHalfLength1();
+            	double x2 = trd.getXHalfLength2();
+            	double y1 = trd.getYHalfLength1();
+            	double y2 = trd.getYHalfLength2();
+            	double z = trd.getZHalfLength();
+
+            	points[0] = new BasicHep3Vector(-x1,-y1,z);
+            	points[1] = new BasicHep3Vector(-x1,y1,z);
+            	points[2] = new BasicHep3Vector(x1,y1,z);
+            	points[3] = new BasicHep3Vector(x1,-y1,z);
+            	
+            	points[4] = new BasicHep3Vector(-x2,-y2,-z);
+            	points[5] = new BasicHep3Vector(-x2,y2,-z);
+            	points[6] = new BasicHep3Vector(x2,y2,-z);
+            	points[7] = new BasicHep3Vector(x2,-y2,-z);
+            	            
+            	for (int i=0; i<points.length; i++)
+                {                                    
+                    Hep3Vector vec = geo.transformLocalToGlobal(points[i]);
+                    points[i] = vec;                    
+                }
+
+                for (int i=0; i<points.length; i++)
+                {
+                    Hep3Vector vec = points[i];
+                    factory.createHepRepPoint(
+                            instance, 
+                            vec.x(), 
+                            vec.y(), 
+                            vec.z()
+                    );
+                }              
+            	            	            	
             }
         }
-        /*
-        else {
-            System.out.println("!!!!! no geometry info for " + detelem.getName() + " !!!!!");
-        }*/
-        
         if ( detelem.hasChildren() )
         {
             for ( IDetectorElement child : detelem.getChildren() )
             {
-                //System.out.println("recursing to " + child.getName());
                 DetectorElementToHepRepConverter.convert(child, factory, heprep, true);
             }
         }

GeomConverter/src/org/lcsim/detector/solids
Trd.java added at 1.1
diff -N Trd.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ Trd.java	24 Jul 2007 19:58:18 -0000	1.1
@@ -0,0 +1,100 @@
+package org.lcsim.detector.solids;
+
+import hep.physics.vec.Hep3Vector;
+import static java.lang.Math.abs;
+
+/**
+ * A Trapezoid based on Geant4's 
+ * <a href="http://www.lcsim.org/software/geant4/doxygen/html/classG4Trd.html">G4Trd class</a>.
+ * 
+ * @author Jeremy McCormick
+ * @version $Id: Trd.java,v 1.1 2007/07/24 19:58:18 jeremy Exp $
+ */
+public class Trd
+extends AbstractSolid
+{
+	double dx1,dx2,dy1,dy2,dz;
+	double volume;
+	private static final double tolerance=1E-9;
+
+	public Trd(
+			String name,
+			double dx1,  
+			double dx2,
+			double dy1,  
+			double dy2,
+			double dz)
+	{
+		super(name);
+
+		this.dx1=dx1;
+		this.dx2=dx2;
+		this.dy1=dy1;
+		this.dy2=dy2;
+		this.dz=dz;		
+	}
+
+	public double getCubicVolume() 
+	{		
+		if(volume != 0.)
+		{;}
+		else
+		{
+		  volume = 2*dz*( (dx1+dx2)*(dy1+dy2) + (dx2-dx1)*(dy2-dy1)/3 );
+		}
+		return volume;
+	}
+	
+	/**
+	 * True if point <code>p</code> is inside the shape.
+	 * False if the point is outside the shape or on the surface.
+	 */
+	public boolean isInside(Hep3Vector p)
+	{  
+		boolean in=false;
+
+		double x,y,zbase1,zbase2;
+
+		if (abs(p.z())<=dz-tolerance/2)
+		{
+			zbase1=p.z()+dz;  
+			zbase2=dz-p.z();  
+
+			x=0.5*(dx2*zbase1+dx1*zbase2)/dz - tolerance/2;
+			if (abs(p.x())<=x)
+			{
+				y=0.5*((dy2*zbase1+dy1*zbase2))/dz - tolerance/2;
+				if (abs(p.y())<=y)
+				{
+					in=true;
+				}
+			}
+		}
+		return in;
+	}
+	
+	public double getXHalfLength1()
+	{
+		return dx1;
+	}
+	
+	public double getXHalfLength2()
+	{
+		return dx2;
+	}
+	
+	public double getYHalfLength1()
+	{
+		return dy1;
+	}
+	
+	public double getYHalfLength2()
+	{
+		return dy2;
+	}
+	
+	public double getZHalfLength() 
+	{
+		return dz;
+	}	
+}
\ No newline at end of file

GeomConverter/test/org/lcsim/detector/solids
TrdTest.java added at 1.1
diff -N TrdTest.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ TrdTest.java	24 Jul 2007 19:58:18 -0000	1.1
@@ -0,0 +1,181 @@
+package org.lcsim.detector.solids;
+
+import static org.lcsim.units.clhep.SystemOfUnits.m;
+import hep.graphics.heprep.HepRep;
+import hep.graphics.heprep.HepRepFactory;
+import hep.graphics.heprep.HepRepInstance;
+import hep.graphics.heprep.HepRepInstanceTree;
+import hep.graphics.heprep.HepRepTreeID;
+import hep.graphics.heprep.HepRepType;
+import hep.graphics.heprep.HepRepTypeTree;
+import hep.graphics.heprep.HepRepWriter;
+
+import java.awt.Color;
+import java.io.FileOutputStream;
+
+import junit.framework.TestCase;
+
+import org.lcsim.detector.DetectorElement;
+import org.lcsim.detector.DetectorElementStore;
+import org.lcsim.detector.IDetectorElement;
+import org.lcsim.detector.IPhysicalVolume;
+import org.lcsim.detector.IPhysicalVolumeNavigator;
+import org.lcsim.detector.LogicalVolume;
+import org.lcsim.detector.PhysicalVolume;
+import org.lcsim.detector.PhysicalVolumeNavigatorStore;
+import org.lcsim.detector.Transform3D;
+import org.lcsim.detector.converter.heprep.DetectorElementToHepRepConverter;
+import org.lcsim.detector.material.IMaterial;
+import org.lcsim.detector.material.MaterialElement;
+
+/**
+ * Test that writes out the HepRep for a {@link org.lcsim.detector.solids.Trd}.
+ *
+ * @author Jeremy McCormick
+ * @version $Id: TrdTest.java,v 1.1 2007/07/24 19:58:18 jeremy Exp $
+ */
+
+public class TrdTest 
+extends TestCase
+{	
+	private static IMaterial dummymat = new MaterialElement("dummymat",1,1,1.0);
+	IPhysicalVolumeNavigator nav;
+	IPhysicalVolume world;
+	
+	public void testTrd() throws Exception
+	{
+		createGeometry();
+		writeHepRep("trd.heprep");
+	}
+	
+	public IPhysicalVolume createGeometry()
+	{
+		world = createWorld();
+    	nav = PhysicalVolumeNavigatorStore.getInstance().createDefault(world);
+		createSolids(world);
+		return world;
+	}
+	
+	public final void createSolids(IPhysicalVolume mom)
+	{
+		double x1=760.8757065043884/2;
+		double x2=1272.6157921770439/2;
+		double y1=5544.0/2;
+		double y2=5544.0/2;
+		double z=954.7200000000001/2;
+		
+		Trd trd = new Trd("trd",x1,x2,y1,y2,z);
+		LogicalVolume lvTest = new LogicalVolume("lvtrd",trd,dummymat);
+		new PhysicalVolume(
+				new Transform3D(),
+				"pvtrd",
+				lvTest,
+				mom.getLogicalVolume(),
+				0);	
+		
+		new DetectorElement("dummy",null,nav.getPath("/pvtrd"));
+	}
+	
+	public final IPhysicalVolume createWorld()
+	{		
+		Box boxWorld = new Box(
+				"world_box",
+				10.0*m,
+				10.0*m,
+				10.0*m);
+		
+		LogicalVolume lvWorld = 
+			new LogicalVolume(
+					"world",
+					boxWorld,
+					dummymat);
+		
+		IPhysicalVolume pvTop = 
+			new PhysicalVolume(
+					null,
+					"world",
+					lvWorld,
+					null,
+					0);
+		
+		return pvTop;
+	}   
+	
+	public final static String HITS_LAYER = "Hits";
+	public final static String PARTICLES_LAYER = "Particles";
+
+    private void writeHepRep(String filepath) throws Exception
+    {
+        HepRepFactory factory = HepRepFactory.create();
+        HepRep root = factory.createHepRep();        
+
+        // detector
+        HepRepTreeID treeID = factory.createHepRepTreeID("DetectorType", "1.0");
+        HepRepTypeTree typeTree = factory.createHepRepTypeTree(treeID);
+        root.addTypeTree(typeTree);
+
+        HepRepInstanceTree instanceTree = factory.createHepRepInstanceTree("Detector", "1.0", typeTree);
+        root.addInstanceTree(instanceTree);
+
+        String detectorLayer = "Detector";
+        root.addLayer(detectorLayer);
+
+        HepRepType barrel = factory.createHepRepType(typeTree, "Barrel");
+        barrel.addAttValue("layer", detectorLayer);
+        HepRepType endcap = factory.createHepRepType(typeTree, "Endcap");
+        endcap.addAttValue("layer", detectorLayer);
+              
+        for (IDetectorElement de : DetectorElementStore.getInstance())
+        {        	
+        	DetectorElementToHepRepConverter.convert(de, factory, root, false);
+        }
+        // end detector
+
+        root.addLayer(PARTICLES_LAYER);
+        root.addLayer(HITS_LAYER);
+        root.addLayer("axis");
+
+        treeID = factory.createHepRepTreeID("EventType", "1.0");
+        typeTree = factory.createHepRepTypeTree(treeID);
+        root.addTypeTree(typeTree);
+        instanceTree = factory.createHepRepInstanceTree("Event", "1.0", typeTree);
+        root.addInstanceTree(instanceTree);  
+
+        // axis
+
+        HepRepType axis = factory.createHepRepType(typeTree, "axis");
+        axis.addAttValue("drawAs","Line");
+        axis.addAttValue("layer", "axis");
+
+        HepRepType xaxis = factory.createHepRepType(axis, "xaxis");
+        xaxis.addAttValue("color",Color.RED);
+        xaxis.addAttValue("fill",true);
+        xaxis.addAttValue("fillColor",Color.RED);
+        HepRepInstance x = factory.createHepRepInstance(instanceTree, xaxis);
+        factory.createHepRepPoint(x,0,0,0);
+        factory.createHepRepPoint(x,1000,0,0);
+
+        HepRepType yaxis = factory.createHepRepType(axis, "yaxis");
+        yaxis.addAttValue("color",Color.GREEN);
+        yaxis.addAttValue("fill",true);
+        yaxis.addAttValue("fillColor",Color.GREEN);
+        HepRepInstance y = factory.createHepRepInstance(instanceTree, yaxis);
+        factory.createHepRepPoint(y,0,0,0);
+        factory.createHepRepPoint(y,0,1000,0);
+
+        HepRepType zaxis = factory.createHepRepType(axis, "zaxis");
+        zaxis.addAttValue("color",Color.BLUE);
+        zaxis.addAttValue("fill",true);
+        zaxis.addAttValue("fillColor",Color.BLUE);
+        HepRepInstance z = factory.createHepRepInstance(instanceTree, zaxis);
+        factory.createHepRepPoint(z,0,0,0);
+        factory.createHepRepPoint(z,0,0,1000);
+
+        // done axis                              
+
+        HepRepWriter writer = 
+            HepRepFactory.create().createHepRepWriter(new FileOutputStream(filepath),false,false);
+        writer.write(root,"test");
+        writer.close();
+    }    
+}
CVSspam 0.2.8