2 added + 1 modified, total 3 files
GeomConverter/src/org/lcsim/detector/converter/heprep
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
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
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