7 added + 15 removed + 7 modified, total 29 files
GeomConverter/sandbox/identifier
diff -u -r1.1 -r1.2
--- IIdHelper.java 23 Feb 2007 20:53:02 -0000 1.1
+++ IIdHelper.java 28 Feb 2007 19:50:47 -0000 1.2
@@ -1,4 +1,6 @@
-interface IIdHelper
+public interface IIdHelper
{
+ //getIdentifierDictionary();
+ //
}
GeomConverter/sandbox/identifier
diff -u -r1.1 -r1.2
--- IIdentifiable.java 23 Feb 2007 20:53:02 -0000 1.1
+++ IIdentifiable.java 28 Feb 2007 19:50:47 -0000 1.2
@@ -1,6 +1,6 @@
interface IIdentifiable
{
IIdentifier identify();
- //IdentifierHash identifyHash();
+ IdentifierHash identifyHash();
IIdHelper getHelper();
}
GeomConverter/sandbox/identifier
diff -u -r1.1 -r1.2
--- IIdentifier.java 23 Feb 2007 20:53:02 -0000 1.1
+++ IIdentifier.java 28 Feb 2007 19:50:47 -0000 1.2
@@ -3,33 +3,38 @@
interface IIdentifier
{
// comparison operations against other ids
- boolean equals(IIdentifier id);
+ boolean equals(IIdentifier id);
boolean nequals(IIdentifier id);
boolean greater(IIdentifier id);
- boolean less(IIdentifier id);
+ boolean less(IIdentifier id);
+
+ // what should this return code represent?
+ // seems like lattitude here could be helpful
+ // for implementations/subclasses but maybe
+ // this isn't needed
int compare(IIdentifier id);
// size in bits
- int nbits();
+ int sizeBits();
// size in 32-bit words
- int nwords();
+ int sizeWords();
// size in bytes
- int nbytes();
+ int sizeBytes();
// hex rep
- String hex();
+ String hexString();
// set from hex string
- void setHex(String hexRep);
+ void setHexString(String hexRep);
// set value from another IIdentifier
- void setId(IIdentifier id);
+ void setIdentifier(IIdentifier id);
// clear state
void clear();
// is id in valid state
boolean isValid();
-}
+}
\ No newline at end of file
GeomConverter/sandbox/identifier
diff -u -r1.1 -r1.2
--- IIdentifier32.java 23 Feb 2007 20:53:02 -0000 1.1
+++ IIdentifier32.java 28 Feb 2007 19:50:47 -0000 1.2
@@ -1,10 +1,10 @@
interface IIdentifier32 extends IIdentifier
{
- boolean equals(int id);
- boolean nequals(int id);
- boolean less(int id);
- boolean greater(int id);
- int compare(int id);
- int value();
- void set(int newValue);
+ public boolean equals(IIdentifier32 id);
+ public boolean nequals(IIdentifier32 id);
+ public boolean less(IIdentifier32 id);
+ public boolean greater(IIdentifier32 id);
+ public int compare(IIdentifier32 id);
+ public int value();
+ public void set(int newValue);
}
GeomConverter/sandbox/identifier
diff -u -r1.1 -r1.2
--- IIdentifier64.java 23 Feb 2007 20:53:02 -0000 1.1
+++ IIdentifier64.java 28 Feb 2007 19:50:47 -0000 1.2
@@ -1,6 +1,10 @@
interface IIdentifier64 extends IIdentifier
{
+ public boolean equals(IIdentifier64 id);
+ public boolean nequals(IIdentifier64 id);
+ public boolean less(IIdentifier64 id);
+ public boolean greater(IIdentifier64 id);
+
long value();
void set(long newValue);
- boolean equals(long id);
}
GeomConverter/sandbox/identifier
diff -u -r1.1 -r1.2
--- IIdentifierExpanded.java 23 Feb 2007 20:53:02 -0000 1.1
+++ IIdentifierExpanded.java 28 Feb 2007 19:50:48 -0000 1.2
@@ -1,15 +1,22 @@
interface IIdentifierExpanded extends IIdentifier
{
- // e.g. "1 2 3"
+ boolean less_prefix(IIdentifier id);
+
+ // e.g. "1 / 2 / 3"
void setFromText(String text);
void set(IIdentifierExpanded id);
- int[] values();
+ int[] getFieldValues();
int get(int idx);
- int fields();
+ int size();
- int append(int value);
+ int addFieldValue(int value);
+
+ int getNumberOfFields();
+
+ //int getValue(int idx);
+ //int compareTo(ExpandedIdentifier id);
}
GeomConverter/sandbox/identifier
diff -u -r1.1 -r1.2
--- IdentifierHash.java 23 Feb 2007 20:53:02 -0000 1.1
+++ IdentifierHash.java 28 Feb 2007 19:50:48 -0000 1.2
@@ -2,5 +2,6 @@
public interface IdentifierHash
{
+ // ???
long getHashValue();
-}
+}
\ No newline at end of file
GeomConverter/sandbox/calorimeter
diff -N BaseCalorimeterCell.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ BaseCalorimeterCell.java 28 Feb 2007 19:50:48 -0000 1.1
@@ -0,0 +1,533 @@
+package org.lcsim.identifier;
+
+import static java.lang.Math.PI;
+import static java.lang.Math.atan;
+import static java.lang.Math.sqrt;
+import static org.lcsim.geometry.subdetector.CalorimeterType.ECAL;
+import static org.lcsim.geometry.subdetector.CalorimeterType.FCAL;
+import static org.lcsim.geometry.subdetector.CalorimeterType.HCAL;
+import static org.lcsim.geometry.subdetector.CalorimeterType.LUMI;
+import static org.lcsim.geometry.subdetector.CalorimeterType.MUON;
+
+import java.util.List;
+
+import org.lcsim.event.MCParticle;
+import org.lcsim.event.EventHeader.LCMetaData;
+import org.lcsim.geometry.Calorimeter;
+import org.lcsim.geometry.IDDecoder;
+import org.lcsim.geometry.Subdetector;
+import org.lcsim.geometry.segmentation.GridXYZ;
+import org.lcsim.geometry.segmentation.ProjectiveCylinder;
+import org.lcsim.geometry.subdetector.CalorimeterType;
+import org.lcsim.spacegeom.CartesianPoint;
+import org.lcsim.spacegeom.SpacePoint;
+import org.lcsim.util.event.SamplingFractionManager;
+import org.lcsim.util.event.SubdetectorLocator;
+
+public class BaseCalorimeterCell implements CalorimeterCell
+{
+ // TODO implement
+ // TODO first requires DetectorElement interface
+ //public DetectorElement detectorElement()
+ //{
+ // return null;
+ //}
+
+ //public int hashCode()
+ //{
+ // return super.hashCode();
+ //}
+
+ IDDecoder decoder;
+ LCMetaData data;
+ CalorimeterType calType;
+ long id;
+ double energy;
+ double time;
+ double gain;
+ double quality;
+
+ // Other possible parameters ...
+ //
+ // deta
+ // dphi
+ // dx
+ // dy
+ // dz
+ // eta
+ // phi
+ // r
+ // x
+ // y
+ // z
+ // SpacePoint (covers x,y,z,r,theta,phi)
+ BaseCalorimeterCell(IDDecoder decoder,
+ LCMetaData data,
+ long id,
+ double energy,
+ double time,
+ double gain,
+ double quality)
+ {
+ this.decoder = decoder;
+ this.data = data;
+ this.id = id;
+ this.energy = energy;
+ this.time = time;
+ this.gain = gain;
+ this.quality = quality;
+ this.calType = ((Calorimeter)decoder.getSubdetector()).getCalorimeterType();
+ }
+
+ void setCartesian(double x, double y, double z)
+ {}
+
+ void setSpherical(double eta, double phi, double r)
+ {}
+
+ public long cellId()
+ {
+ return id;
+ }
+
+ public double quality()
+ {
+ return this.quality;
+ }
+
+ public double gain()
+ {
+ return this.gain;
+ }
+
+ public double e()
+ {
+ return this.energy;
+ }
+
+ public double time()
+ {
+ return this.time;
+ }
+
+ public int compareTo(CalorimeterCell cell)
+ {
+ if (cell.cellId() == cellId()) return 0; else return -1;
+ }
+
+ public double distanceToCenter(SpacePoint point)
+ {
+ double x = point.x() - x();
+ double y = point.y() - y();
+ double z = point.z() - z();
+ return sqrt(x*x + y*y + z*z);
+ }
+
+ // Uses cylindrical approximation to see if within theta, phi, r
+ public boolean isInside(SpacePoint point)
+ {
+ double x = point.x();
+ double y = point.y();
+ double z = point.z();
+ double r = sqrt(x * x + y * y);
+ double theta = atan(r / z);
+ if (theta < 0) theta += PI;
+ double phi = point.phi();
+ return (phi > phiMin() && phi < phiMax()) &&
+ (theta > etaMin() && theta < etaMax()) &&
+ (r > rMin() && r < rMax());
+ }
+
+ public boolean isNear(SpacePoint point, double tolerance)
+ {
+ return distanceToCenter(point) <= tolerance;
+ }
+
+ // Checks if point is within 10 cm of the cell center
+ static private double distance_tolerance = 100.0;
+ public boolean isNear(SpacePoint point)
+ {
+ return isNear(point, distance_tolerance);
+ }
+
+ // FIXME: Only works for decoders with explicit absorber field (which isn't currently set)
+ public boolean isAbsorber()
+ {
+ return decoder.getValue("absorber") != 0;
+ }
+
+ public IDDecoder decoder()
+ {
+ return decoder;
+ }
+
+ public boolean isBarrel()
+ {
+ return decoder.getBarrelEndcapFlag().isBarrel();
+ }
+
+ public boolean isEndcap()
+ {
+ return decoder.getBarrelEndcapFlag().isEndcap();
+ }
+
+ public boolean isPositiveEndcap() {
+ return decoder.getBarrelEndcapFlag().isEndcapNorth();
+ }
+
+ public boolean isNegativeEndcap() {
+ return decoder.getBarrelEndcapFlag().isEndcapSouth();
+ }
+
+ public boolean isECAL()
+ {
+ return calType == ECAL;
+ }
+
+ public boolean isMUON()
+ {
+ return calType == MUON;
+ }
+
+ public boolean isFCAL()
+ {
+ return calType == FCAL;
+ }
+
+ public boolean isHCAL()
+ {
+ return calType == HCAL;
+ }
+
+ public boolean isLUMI()
+ {
+ return calType == LUMI;
+ }
+
+ public boolean hasHit()
+ {
+ return e() != 0;
+ }
+
+ // FIXME: Only works for decoders with explicit phi field.
+ // Non-projective segmentations should still be able
+ // to calculate this based on phi from xyz.
+ public int iphi()
+ {
+ return decoder.getValue("phi");
+ }
+
+ // FIXME: Only works for decoders with explicit theta field
+ // Non-projective segmentations should still be able
+ // to calculate this based on theta from xyz.
+ public int ieta()
+ {
+ return decoder.getValue("eta");
+ }
+
+ // FIXME: Only works for decoders with explicit x field
+ public int ix()
+ {
+ return decoder.getValue("x");
+ }
+
+ // FIXME: Only works for decoders with explicit y field
+ public int iy()
+ {
+ return decoder.getValue("y");
+ }
+
+ // FIXME: Only works for decoders with explicit z field
+ public int iz()
+ {
+ return decoder.getValue("z");
+ }
+
+ // FIXME: Only works for decoders with explicit layer field
+ public int layer()
+ {
+ return decoder.getValue("layer");
+ }
+
+ // FIXME: Only works for decoders with explicit module field
+ public int module()
+ {
+ return decoder.getValue("module");
+ }
+
+ // FIXME: Only works for decoders with explicit row field
+ public int row()
+ {
+ return decoder.getValue("row");
+ }
+
+ // FIXME: Only works for decoders with explicit section field
+ public int section()
+ {
+ return decoder.getValue("section");
+ }
+
+ // FIXME: Only works for decoders with explicit stave field
+ public int stave()
+ {
+ return decoder.getValue("stave");
+ }
+
+ // FIXME: Only works for decoders with explicit column field
+ public int column()
+ {
+ return decoder.getValue("column");
+ }
+
+ public double phi()
+ {
+ return decoder.getPhi();
+ }
+
+ public double phiMax()
+ {
+ return phi() + dphi() / 2;
+ }
+
+ public double phiMin()
+ {
+ return phi() - dphi() / 2;
+ }
+
+ // FIXME: Only works for ProjectiveCylinder segmentation
+ public double dphi()
+ {
+ ProjectiveCylinder prjCyl = (ProjectiveCylinder)decoder;
+ return (2 * PI) / prjCyl.getPhiBins();
+ }
+
+ public double p()
+ {
+ return sqrt(x() * x() + y() * y() + z() * z());
+ }
+
+ public double pt()
+ {
+ return sqrt(x() * x() + y() * y());
+ }
+
+ public double ipt()
+ {
+ return 1.0 / pt();
+ }
+
+ public SpacePoint position()
+ {
+ double[] parr = decoder.getPosition();
+ SpacePoint p = new CartesianPoint(parr[0],parr[1],parr[2]);
+ return p;
+ }
+
+ public double r()
+ {
+ return p();
+ }
+
+ public double rMax()
+ {
+ // FIXME: Just an approximation and will be wrong for non-cylindrical
+ return pt() + width() / 2;
+ }
+
+ public double rMin()
+ {
+ // FIXME: Just an approximation and will be wrong for non-cylindrical
+ return pt() - width() / 2;
+ }
+
+ public double width()
+ {
+ return decoder.getSubdetector().getLayering().getLayer(layer()).getSensorThickness();
+ }
+
+ public Subdetector subdetector()
+ {
+ return decoder.getSubdetector();
+ }
+
+ public int system()
+ {
+ return decoder.getSystemID();
+ }
+
+ public double eta()
+ {
+ return decoder.getTheta();
+ }
+
+ public double etaMax()
+ {
+ return eta() + deta() / 2;
+ }
+
+ public double etaMin()
+ {
+ return eta() - deta() / 2;
+ }
+
+ public double deta()
+ {
+ // FIXME: Only works for ProjectiveCylinder
+ ProjectiveCylinder seg = (ProjectiveCylinder)decoder;
+ return (2 * PI) / seg.getThetaBins();
+ }
+
+ public int tower()
+ {
+ return decoder.getValue("tower");
+ }
+
+ public double x()
+ {
+ return decoder.getX();
+ }
+
+ public double y()
+ {
+ return decoder.getY();
+ }
+
+ public double z()
+ {
+ return decoder.getZ();
+ }
+
+ // FIXME: Only works for GridXYZ
+ public double dx()
+ {
+ return ((GridXYZ)decoder).getGridSizeX();
+ }
+
+ // FIXME: Only works for GridXYZ.
+ public double dy()
+ {
+ GridXYZ seg = (GridXYZ)decoder;
+ return seg.getGridSizeY();
+ }
+
+ // FIXME: Only works for GridXYZ
+ public double dz()
+ {
+ GridXYZ seg = (GridXYZ)decoder;
+ return seg.getGridSizeZ();
+ }
+
+ public double phiCircumference()
+ {
+ return 2 * PI * pt();
+ }
+
+ public double thetaCircumference()
+ {
+ return 2 * PI * z();
+ }
+
+ public double phiFraction()
+ {
+ return dphi() / (2 * PI);
+ }
+
+ public double etaFraction()
+ {
+ return deta() / (2 * PI);
+ }
+
+ public double phiArc()
+ {
+ return phiCircumference() * phiFraction();
+ }
+
+ public double etaArc()
+ {
+ return thetaCircumference() * etaFraction();
+ }
+
+ public double samplingFraction()
+ {
+ //return SamplingFractionManager.defaultInstance().getSamplingFraction(SubdetectorLocator.locateSubdetector(data,cellId()));
+ return 1.0;
+ }
+
+ // http://alxr.usatlas.bnl.gov/lxr/source/atlas/Calorimeter/CaloEvent/src/CaloCell.cxx#039
+ public double cosTheta()
+ {
+ double aux = sqrt(1. - sinTheta() * sinTheta());
+ if (eta() < 0) aux = -aux;
+ return aux;
+ }
+
+ public double cotTheta()
+ {
+ double aux = sqrt(1. - sinTheta() * sinTheta());
+ if (eta() < 0) aux = -aux;
+ return aux / sinTheta();
+ }
+
+ // http://www.math.com/tables/trig/identities.htm
+ public double sinTheta()
+ {
+ double sinTh = y() / p();
+ if ( p() < 0.001)
+ sinTh = 0;
+ return sinTh;
+ }
+
+ public MCParticle getMCParticle(int index)
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public int getMCParticleCount()
+ {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public int getPDG(int index)
+ {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public List<SpacePoint> getCellPointData()
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ // should get this from a compact parameter on the detector
+ public boolean isAnalog()
+ {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ // should get this from a compact parameter on the detector
+ public boolean isDigital()
+ {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ public CalorimeterCellNeighborhood neighbors(CalorimeterNeighborOptions opts)
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public boolean inCalorimeter(Calorimeter cal)
+ {
+ return cal.getSystemID() == decoder.getSystemID();
+ }
+
+ public int density()
+ {
+ return 0;
+ }
+}
GeomConverter/sandbox/calorimeter
diff -N CalorimeterCell.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ CalorimeterCell.java 28 Feb 2007 19:50:48 -0000 1.1
@@ -0,0 +1,621 @@
+package org.lcsim.identifier;
+
+import java.util.List;
+
+import org.lcsim.event.MCParticle;
+import org.lcsim.geometry.Calorimeter;
+import org.lcsim.geometry.IDDecoder;
+import org.lcsim.geometry.Subdetector;
+import org.lcsim.spacegeom.SpacePoint;
+
+/**
+ *
+ * An interface to Calorimeter cell detector description and hit data.
+ *
+ * CalorimeterCell uses, wraps, refers to, or replaces the following classes.
+ *
+ * @see org.lcsim.geometry.subdetector.BarrelEndcapFlag
+ * @see org.lcsim.geometry.subdetector.Calorimeter
+ * @see org.lcsim.geometry.subdetector.CalorimeterType
+ * @see org.lcsim.event.CalorimeterHit
+ * @see org.lcsim.event.RawCalorimeterHit
+ * @see org.lcsim.event.SimCalorimeterHit
+ * @see org.lcsim.geometry.Subdetector
+ * @see org.lcsim.geometry.IDDecoder
+ * @see org.lcsim.geometry.util.BaseIDDecoder
+ * @see org.lcsim.geometry.CalorimeterIDDecoder
+ * @see org.lcsim.geometry.segmentation
+ * @see org.lcsim.geometry.subdetector.AbstractPolyhedraCalorimeter
+ * @see org.lcsim.geometry.subdetector.EcalBarrel
+ * @see org.lcsim.geometry.subdetector.AbstractTestBeam
+ * @see org.lcsim.geometry.subdetector.CylindricalBarrelCalorimeter
+ * @see org.lcsim.geometry.subdetector.CylindricalEndcapCalorimeter
+ * @see org.lcsim.geometry.subdetector.PolyhedraBarrelCalorimeter
+ * @see org.lcsim.geometry.subdetector.PolyhedraEndcapCalorimeter
+ * @see org.lcsim.geometry.TestBeamCalorimeter
+ *
+ * For convenience, CalorimeterCell cell combines functionality
+ * from these classes into a single "flattened" API so that users can avoid
+ * lots of subcasting and/or method chaining in order to access the information
+ * required for their analysis. It also replaces calls using "magic" field
+ * strings, primarily from IDDecoder, with proper interface methods.
+ *
+ * Measurements, such as the position, are within a global coordinate
+ * system based at (0,0,0), unless otherwise noted. Indices, however,
+ * may refer to a local or global system. For instance, ix would probably
+ * translate to local coordinates in a readout plate, while iphi is most
+ * likely a global phi index.
+ *
+ * @author Jeremy McCormick
+ *
+ * FIXME: Many of the geometrical methods in CalorimeterCell should be moved to a DD object.
+ *
+ */
+public interface CalorimeterCell
+//extends IDetectorElement
+{
+ /**
+ * 64-bit identifier of this cell
+ *
+ * This is used as a hash by our current system, but it isn't one, really.
+ * The interface should probably include a hashCode method, too.
+ *
+ * @see org.lcsim.event.CalorimeterHit.getCellId()
+ */
+ long cellId();
+
+
+ /**
+ * Hash code uniquely identifying the CalorimeterCell object
+ *
+ * Can be based on ATLAS's IdentifierHash
+ *
+ * (Java provides built-in hashing, but this needs support for hash back to id.)
+ *
+ */
+ int hashCode();
+
+ /**
+ * This method returns 0 if the cells have matching ids. Otherwise, it
+ * returns -1.
+ */
+ int compareTo(CalorimeterCell cell);
+
+
+ /**
+ * Energy deposition in the cell (GeV)
+ *
+ * @see CalorimeterHit.getRawEnergy()
+ */
+ double e();
+
+ /**
+ * Shortcut for energy != 0
+ */
+ boolean hasHit();
+
+ /**
+ * Time (nanoseconds)
+ *
+ * @see org.lcsim.event.CalorimeterHit.getTime()
+ *
+ */
+ double time();
+
+ /**
+ * Quality of signal (time only?)
+ */
+ double quality();
+
+ /**
+ * Gain (in ADC counts?)
+ */
+ double gain();
+
+ /**
+ * Center position (mm)
+ *
+ * @see org.lcsim.event.CalorimeterHit.getPosition()
+ * @see org.lcsim.geometry.IDDecoder.getPosition()
+ */
+ SpacePoint position();
+
+ /**
+ * X at cell center (mm)
+ *
+ * @see org.lcsim.geometry.IDDecoder.getX()
+ *
+ */
+ double x();
+
+ /**
+ * Y at cell center (mm)
+ *
+ * @see org.lcsim.geometry.IDDecoder.getY()
+ *
+ */
+ double y();
+
+ /**
+ * Z at cell center (mm)
+ *
+ * @see org.lcsim.geometry.IDDecoder.getZ()
+ *
+ */
+ double z();
+
+ /**
+ * Theta at cell center (radians)
+ *
+ * @see IDDecoder.getTheta()
+ *
+ */
+ double eta();
+
+ /**
+ * Phi at cell center (radians)
+ *
+ * @see IDDecoder.getPhi()
+ *
+ */
+ double phi();
+
+ /**
+ * Size of the cell in x dim
+ */
+ public double dx();
+
+ /**
+ * Size of the cell in y dim
+ */
+ public double dy();
+
+ /**
+ * Size of the cell in z dim
+ */
+ public double dz();
+
+ /**
+ * Angle subtended in theta (radians)
+ */
+ double deta();
+
+ /**
+ * Angle subtended in theta (radians)
+ */
+ double dphi();
+
+ /**
+ * Distance to the cell from origin
+ */
+ double p();
+
+ /**
+ * Transverse distance (XY) to the cell from origin
+ */
+ double pt();
+
+ /**
+ * Inverse of pt
+ *
+ * Norman: "Related to curvature. High pT gives low curvature.
+ * the errors are gaussian distributed if you plot it in terms of 1/pT."
+ */
+ double ipt();
+
+ /**
+ * Corner points of the cell's solid, in a LOCAL coordinate frame
+ * (as if cell was at 0,0,0).
+ *
+ * FIXME: Put into DE
+ *
+ */
+ public List<SpacePoint> getCellPointData();
+
+
+ /**
+ * Is the given point within tolerance of the cell center? (mm)
+ */
+ boolean isNear(SpacePoint point, double tolerance);
+
+ /**
+ * Version of isNear with a default tolerance of 10 cm.
+ */
+ boolean isNear(SpacePoint point);
+
+ /**
+ * Distance to cell center from point (mm)
+ */
+ double distanceToCenter(SpacePoint point);
+
+ /**
+ * Is the given point inside this cell? (mm)
+ */
+ boolean isInside(SpacePoint point);
+
+ /**
+ * sin of eta
+ */
+ double sinTheta();
+
+ /**
+ * cosine of eta
+ */
+ double cosTheta();
+
+ /**
+ * cotangent of eta
+ */
+ double cotTheta();
+
+ /**
+ * Minimum theta of the cell (radians)
+ */
+ double etaMin();
+
+ /**
+ * Maximum theta of the cell (radians)
+ */
+ double etaMax();
+
+ /**
+ * Distance along circumference in phi (cylindrical radius) covered by this cell (mm)
+ */
+ double etaArc();
+
+ /**
+ * Fraction of theta (360 degrees) covered by this cell
+ */
+ double etaFraction();
+
+ /**
+ * Minimum phi measurement of the cell (radians)
+ */
+ double phiMin();
+
+ /**
+ * Maximum phi measurement of the cell (radians)
+ */
+ double phiMax();
+
+ /**
+ * Distance along circumference covered by this cell in phi
+ */
+ double phiArc();
+
+ /**
+ * Fraction of full phi (360) covered by this cell
+ */
+ double phiFraction();
+
+ /**
+ * Radius to the cell midpoint (mm)
+ */
+ double r();
+
+ /**
+ * Minimum radius measurement (mm)
+ */
+ double rMin();
+
+ /**
+ * Maximum radius measurement (mm)
+ */
+ double rMax();
+
+ /**
+ * Width of the cell along the layering axis (mm)
+ */
+ double width();
+
+ /**
+ * Circumference of the circle defined by r and phi (mm)
+ */
+ double phiCircumference();
+
+ /**
+ * Circumference of the circle defined by r and theta (mm)
+ */
+ double thetaCircumference();
+
+ /**
+ * X bin value
+ *
+ * @see org.lcsim.geometry.IDDecoder.getValue()
+ * @see org.lcsim.geometry.segmentation.GridXYZ.getXBin()
+ *
+ */
+ int ix();
+
+ /**
+ * Y bin value
+ *
+ * @see org.lcsim.geometry.IDDecoder.getValue()
+ * @see org.lcsim.geometry.segmentation.GridXYZ.getYBin()
+ *
+ */
+ int iy();
+
+ /**
+ * Z bin value
+ *
+ * @see org.lcsim.geometry.IDDecoder.getValue()
+ * @see org.lcsim.geometry.segmentation.GridXYZ.getZBin()
+ *
+ */
+ int iz();
+
+ /**
+ * Theta bin value
+ *
+ * @see org.lcsim.geometry.IDDecoder.getValue()
+ *
+ */
+ int ieta();
+
+ /**
+ * Phi bin value
+ *
+ * @see org.lcsim.geometry.IDDecoder.getValue()
+ *
+ */
+ int iphi();
+
+ /**
+ * System number uniquely identifying the cell's Subdetector
+ *
+ * @see org.lcsim.geometry.IDDecoder.getSystemID()
+ *
+ */
+ int system();
+
+ /**
+ * Section number of the calorimeter along the z axis
+ *
+ * @see org.lcsim.geometry.subdetector.AbstractPolyhedraCalorimeter
+ * @see org.lcsim.geometry.subdetector.EcalBarrel
+ *
+ * Also see Mokka's HCAL models for an example of a calorimeter with sections along z.
+ *
+ * section applies directly only to those calorimeters that have some subdivision of their
+ * envelope in the z direction, though basic cylindrical types could "fake it" based on
+ * the value of iz() or z().
+ *
+ */
+ int section();
+
+ /**
+ * Module number in calorimeter section
+ *
+ * @see org.lcsim.geometry.subdetector.AbstractPolyhedraCalorimeter
+ * @see org.lcsim.geometry.subdetector.EcalBarrel
+ *
+ * Usually, there are as many modules as sides in the calorimeter's polyhedra envelope.
+ *
+ * Only applies to realistic polyhedra calorimeters, though cylindrical types
+ * could "fake it" based on the value of iphi() or phi().
+ *
+ */
+ int module();
+
+ /**
+ * Stave number in the module
+ *
+ * @see org.lcsim.geometry.subdetector.AbstractPolyhedraCalorimeter
+ * @see org.lcsim.geometry.subdetector.EcalBarrel
+ *
+ * Mokka's current RPC HCAL is an example of a calorimeter with multiple staves per module.
+ *
+ */
+ int stave();
+
+ /**
+ * Row number in a plate of cells
+ *
+ * This is primarily applicable to calorimeters with planar readout volumes,
+ * such as those within trapezoidal staves. It could also apply to testbeams.
+ */
+ int row();
+
+ /**
+ * Column number in a plate of cells
+ *
+ * This is primarily applicable to calorimeters with planar readout volumes,
+ * such as those within trapezoidal staves. It could also apply to testbeams.
+ *
+ */
+ int column();
+
+ /**
+ *
+ * Projective tower number, spanning all the calorimeter subsystems
+ *
+ * FIXME: Is tower a deprecated/superceded concept?
+ *
+ */
+ int tower();
+
+ /**
+ * Is the cell flagged as an absorber layer that was made sensitive for debugging?
+ *
+ * There are possibly other ways to know whether a cell is actually from an absorber,
+ * but an interface method is the most straightforward way for user's to access this
+ * information.
+ *
+ */
+ boolean isAbsorber();
+
+ /**
+ * Is the cell in a barrel?
+ *
+ * @see org.lcsim.geometry.IDDecoder.getBarrelEndcapFlag()
+ * @see org.lcsim.geometry.subdetector.BarrelEndcapFlag.isBarrel()
+ *
+ */
+ boolean isBarrel();
+
+ /**
+ * Is the cell in an endcap?
+ *
+ * @see org.lcsim.geometry.IDDecoder.getBarrelEndcapFlag()
+ * @see org.lcsim.geometry.subdetector.BarrelEndcapFlag.isEndcap()
+ */
+ boolean isEndcap();
+
+ /**
+ *
+ * Is the cell in the positive endcap?
+ *
+ * @see org.lcsim.geometry.IDDecoder.getBarrelEndcapFlag()
+ * @see org.lcsim.geometry.subdetector.BarrelEndcapFlag.isEndcapNorth()
+ *
+ */
+ boolean isPositiveEndcap();
+
+ /**
+ * Is the cell in the negative endcap?
+ *
+ * @see org.lcsim.geometry.IDDecoder.getBarrelEndcapFlag()
+ * @see org.lcsim.geometry.subdetector.BarrelEndcapFlag.isEndcapNorth()
+ *
+ */
+ boolean isNegativeEndcap();
+
+ /**
+ * Is the cell from an ECAL subdetector?
+ *
+ * @see org.lcsim.geometry.Calorimeter.getCalorimeterType()
+ * @see org.lcsim.geometry.subdetector.CalorimeterType
+ *
+ */
+ boolean isECAL();
+
+ /**
+ * Is the cell from an HCAL subdetector?
+ *
+ * @see org.lcsim.geometry.Calorimeter.getCalorimeterType()
+ * @see org.lcsim.geometry.subdetector.CalorimeterType
+ *
+ */
+ boolean isHCAL();
+
+ /**
+ * Is the cell from a MUON subdetector?
+ *
+ * @see org.lcsim.geometry.Calorimeter.getCalorimeterType()
+ * @see org.lcsim.geometry.subdetector.CalorimeterType
+ *
+ */
+ boolean isMUON();
+
+ /**
+ * Is the cell from a FWD subdetector? (forward calorimeter)
+ *
+ * @see org.lcsim.geometry.Calorimeter.getCalorimeterType()
+ * @see org.lcsim.geometry.subdetector.CalorimeterType
+ *
+ */
+ boolean isFCAL();
+
+ /**
+ * Is this cell from a LUMI subdetector? (luminosity monitor)
+ *
+ * @see org.lcsim.geometry.Calorimeter.getCalorimeterType()
+ * @see org.lcsim.geometry.subdetector.CalorimeterType
+ *
+ */
+ boolean isLUMI();
+
+ /**
+ * Is this cell from the given Calorimeter?
+ * It checks that the SystemIDs are the same.
+ */
+ boolean inCalorimeter(Calorimeter cal);
+
+ /**
+ * Subdetector associated with this CalorimeterCell
+ *
+ * @see org.lcsim.geometry.Calorimeter.getCalorimeterType()
+ * @see org.lcsim.geometry.subdetector.CalorimeterType
+ *
+ * FIXME: This breaks the usual OO heuristic that a contained object should not
+ * reference its container.
+ *
+ * FIXME: Need to make sure that a Subdetector reference is not stored with each CalorimeterCell.
+ *
+ */
+ Subdetector subdetector();
+
+ /**
+ * IDDecoder associated with this CalorimeterCell
+ *
+ * @see org.lcsim.event.CalorimeterHit.getIDDecoder()
+ *
+ * FIXME: Need to make sure that an IDDecoder reference is not stored with each CalorimeterCell.
+ *
+ */
+ IDDecoder decoder();
+
+ /**
+ * Sampling fraction associated with this cell
+ *
+ * FIXME: Is this an appropriate per-cell measurement or should it be external functionality only?
+ *
+ */
+ double samplingFraction();
+
+ /**
+ * Is this cell from a digital calorimeter?
+ */
+ boolean isDigital();
+
+ /**
+ * Is this cell from an analog calorimeter?
+ */
+ boolean isAnalog();
+
+ /**
+ * Layer number
+ *
+ * @see org.lcsim.geometry.IDDecoder.getLayer()
+ *
+ */
+ int layer();
+
+ /**
+ * 4-vec functionality
+ *
+ * @see p()
+ * @see pt()
+ * @see ipt()
+ *
+ * http://alxr.usatlas.bnl.gov/lxr/source/atlas/Event/FourMom/FourMom/P4EEtaPhiMBase.h
+ *
+ */
+
+ /**
+ * Interface to MCParticles / MCTruth
+ *
+ * @see org.lcsim.event.SimCalorimeterHit
+ *
+ * FIXME: Maybe MCParticle relationships are best done with a derived class
+ * or using an external relation or map.
+ *
+ */
+ MCParticle getMCParticle(int index);
+ int getMCParticleCount();
+ int getPDG(int index);
+
+ /**
+ * Stub for neighbor finding
+ *
+ * http://alxr.usatlas.bnl.gov/lxr/source/atlas/Calorimeter/CaloIdentifier/CaloIdentifier/CaloNeighbours.h
+ *
+ */
+ CalorimeterCellNeighborhood neighbors(CalorimeterNeighborOptions opts);
+
+ /**
+ * Measure of cell density
+ */
+ int density();
+}
GeomConverter/sandbox/calorimeter
diff -N CalorimeterCellNeighborhood.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ CalorimeterCellNeighborhood.java 28 Feb 2007 19:50:48 -0000 1.1
@@ -0,0 +1,6 @@
+package org.lcsim.identifier;
+
+public interface CalorimeterCellNeighborhood
+{
+
+}
GeomConverter/sandbox/calorimeter
diff -N CalorimeterNeighborOptions.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ CalorimeterNeighborOptions.java 28 Feb 2007 19:50:48 -0000 1.1
@@ -0,0 +1,23 @@
+package org.lcsim.identifier;
+// http://alxr.usatlas.bnl.gov/lxr/source/atlas/Calorimeter/CaloIdentifier/CaloIdentifier/LArNeighbours.h
+enum CalorimeterNeighborOptions
+{ /*
+ prevInPhi = 0x0001,
+ nextInPhi = 0x0002,
+ prevInEta = 0x0004,
+ nextInEta = 0x0008,
+ faces2D = prevInPhi | nextInPhi | prevInEta | nextInEta,
+ corners2D = 0x0010,
+ all2D = corners2D|faces2D,
+ prevInSamp = 0x0020,
+ nextInSamp = 0x0040,
+ upAndDown = prevInSamp|nextInSamp,
+ prevSubDet = 0x0080,
+ nextSubDet = 0x0100,
+ all3D = all2D|prevInSamp|nextInSamp|upAndDown|prevSubDet|nextSubDet,
+ corners3D = 0x0200,
+ all3DwithCorners = all3D|corners3D,
+ prevSuperCalo = 0x0400,
+ nextSuperCalo = 0x0800,
+ super3D = all3D|prevSuperCalo|nextSuperCalo*/
+};
GeomConverter/sandbox/calorimeter
diff -N PadLayout2D.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ PadLayout2D.java 28 Feb 2007 19:50:48 -0000 1.1
@@ -0,0 +1,100 @@
+package org.lcsim.contrib.JeremyMcCormick;
+
+public interface PadLayout2D
+{
+ enum CoordinateSystem
+ {
+ CARTESIAN, // (x, y)
+ POLAR, // (r, phi)
+ CYLINDRICAL // (r, z)
+ }
+
+ enum PadShape
+ {
+ RECTANGLE,
+ DIAMOND,
+ HEXAGON,
+ CHEVRON
+ }
+
+ // The type of coordinate system.
+ CoordinateSystem getCoordinateSystem();
+
+ // The pad shape.
+ PadShape getPadShape();
+
+ // The 2D corner points of this pad's bounding shape.
+ double[][] getCorners(int padIndex);
+
+ // Total number of pads.
+ int getNumberOfPads();
+
+ // Number of rows.
+ int getNumberOfRows();
+
+ // Number of columns.
+ int getNumberOfColumns();
+
+ // Pad height at a row.
+ double getRowHeight(int rowNumber);
+
+ // Width of a pad pad.
+ double getPadWidth(int padIndex);
+
+ // Height of pad at a pad index.
+ double getPadHeight(int padIndex);
+
+ // Extent of the sensitive plane:
+ // [xmin,xmax,ymin,ymax] for CARTESIAN,
+ // [rmin,rmax,phimin,phimax] for POLAR, and
+ // [rmin,rmax,zmin,zmax] for CYLINDRICAL.
+ double[] getPlaneExtent();
+
+ // Row number from pad index.
+ int getRowNumber(int padIndex);
+
+ // Column number from pad index.
+ int getColumnNumber(int padIndex);
+
+ // Nearest pad from a 2D coordinate.
+ int getNearestPad(double c0, double c1);
+
+ // Pad center coordinate from index.
+ double[] getPadCenter(int padIndex);
+
+ // True if the 2D coordinate is inside the given pad.
+ boolean isInsidePad(double c0, double c1, int padIndex);
+
+ // True if the 2D coordinate is inside any pad.
+ boolean isInsidePad(double c0, double c1);
+
+ // All pads in a row.
+ int[] getPadsInRow(int rowNumber);
+
+ // All pads in a column.
+ int[] getPadsInColumn(int columnNumber);
+
+ // Left neighbor.
+ int getLeftNeighbor(int padIndex);
+
+ // Right Neighbor.
+ int getRightNeighbor(int padIndex);
+
+ // Top neighbor.
+ int getTopNeighbor(int padIndex);
+
+ // Bottom Neighbor.
+ int getBottomNeighbor(int padIndex);
+
+ // Row neighbors.
+ double[] getRowNeighbors(int padIndex);
+
+ // Column neighbors.
+ double[] getColumnNeighbors(int padIndex);
+
+ // Row and column neighbors.
+ double[] getRowColumnNeighbors(int padIndex);
+
+ // All 2D neighbors, including row, columm, and diagonals.
+ double[] get2DNeighbors(int padIndex);
+}
GeomConverter/sandbox/calorimeter
diff -N PadRowLayout2D.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ PadRowLayout2D.java 28 Feb 2007 19:50:48 -0000 1.1
@@ -0,0 +1,133 @@
+package org.lcsim.contrib.JeremyMcCormick;
+
+import hep.physics.vec.Hep3Vector;
+
+import java.util.List;
+
+/**
+ * Interface for PadRowLayout2D, copied from GEAR's PadRowLayout2D by Frank Gaede.
+ */
+public interface PadRowLayout2D
+{
+ /**
+ * The type of the coordinate system.
+ */
+ public enum PadLayoutType
+ {
+ CARTESIAN,
+ POLAR
+ }
+
+ /**
+ * The shape of the readout pad.
+ */
+ public enum PadShape
+ {
+ RECTANGLE,
+ DIAMOND,
+ HEXAGON,
+ CHEVRON
+ }
+
+ /**
+ * The type of the row labout: CARTESIAN or POLAR.
+ */
+ PadLayoutType getPadLayoutType();
+
+ /**
+ * The shape of the pads: RECTANGLE, DIAMOND, HEXGON, or CHEVRON.
+ */
+ PadShape getPadShape();
+
+ /**
+ * The total number of pads.
+ */
+ int getNPads();
+
+ /**
+ * The number of rows.
+ */
+ int getNRows();
+
+ /**
+ * The row heigh in mm.
+ */
+ double getRowHeight(int rowNumber);
+
+ /**
+ * The width of the pad at padIndex in mm (CARTESIAN) or radians (POLAR).
+ */
+ double getPadWidth(int padIndex);
+
+ /**
+ * Center of the pad at padIndex.
+ */
+ // FIXME: Should return a class representing a 2D point rather than 3D.
+ // Could use spacegeom's CartesianTwoPoint but GeomConverter cannot
+ // depend on lcsim!
+ Hep3Vector getPadCenter(int padIndex);
+
+ /**
+ * The height of the pad in mm.
+ */
+ double getPadHeight(int padIndex);
+
+ /**
+ * Indices of all pads in row rowNumber.
+ */
+ List<Integer> getPadsInRow(int rowNumber);
+
+ /**
+ * Extent of the geometric readout plane:
+ * [xmin,xmax,ymin,ymax] for cartesian or
+ * [rmin,rmax,phimin,phimax] for polar.
+ */
+ List<Double> getPlaneExtent();
+
+ /**
+ * The number of the row that contains the pad at padIndex.
+ */
+ int getRowNumber(int padIndex);
+
+ /**
+ * The pad number within the row.
+ */
+ int getPadNumber(int padIndex);
+
+ /**
+ * The index of the pad at row number rowNum and column number padNum.
+ */
+ int getPadIndex(int rowNum, int padNum);
+
+ /**
+ * The index of the pad nearest to the given point in 2d coordinates (x,y) or (r,phi).
+ */
+ int getNearestPad(double u, double v);
+
+ /**
+ * The index of the right neighbor pad.
+ */
+ int getRightNeighbor(int padIndex);
+
+ /**
+ * The index of the left neighbor pad.
+ */
+ int getLeftNeighbor(int padIndex);
+
+ /**
+ * The indices of the full set of 2D neighbors,
+ * e.g. 8 for a rectangular cell not at any edge.
+ */
+ // NOTE: This method is not in the GEAR version.
+ int getAllNeighbors(int padIndex);
+
+ /**
+ * True if coordinate (c1,c2) is within the given pad.
+ */
+ boolean isInsidePad(double c1, double c2, int padIndex);
+
+ /**
+ * True if coordinate (c1,c2) is within any pad.
+ */
+ boolean isInsidePad(double u, double v);
+}
\ No newline at end of file
GeomConverter/sandbox/tracker
diff -N SiTrackerBarrelLayerVolume.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ SiTrackerBarrelLayerVolume.java 28 Feb 2007 19:50:48 -0000 1.1
@@ -0,0 +1,64 @@
+/*
+ * SiTrackerBarrelLayerVolume.java
+ *
+ * Created on October 9, 2006, 3:15 PM
+ *
+ * To change this template, choose Tools | Template Manager
+ * and open the template in the editor.
+ */
+
+package org.lcsim.contrib.subdetector.tracker.silicon;
+
+import org.lcsim.material.Material;
+import org.lcsim.material.MaterialManager;
+import org.lcsim.material.MaterialNotFoundException;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.jdom.Element;
+import org.jdom.JDOMException;
+
+/**
+ *
+ * @author tknelson
+ */
+public class SiTrackerBarrelLayerVolume extends LVolume
+{
+
+ public SiTrackerBarrelLayerVolume(Element layer) throws JDOMException
+ {
+ super(layer);
+ buildFromXML(layer);
+ }
+
+ public void buildFromXML(Element lvolume)
+ {
+ // Create name
+ _name = lvolume.getAttributeValue("name");
+
+ // Create material
+ try
+ {
+ _material = MaterialManager.findMaterial(lvolume.getAttributeValue("material"));
+ }
+ catch (MaterialNotFoundException mnfe)
+ {
+ throw new RuntimeException(mnfe);
+ }
+
+ // Create solid
+ Element solid = lvolume.getChild("solid");
+ String shape = solid.getAttributeValue("shape");
+ if (shape=="box") _solid = new Box(solid);
+ if (shape=="tubesegment") _solid = new TubeSegment(solid);
+
+ // Add physical volumes
+ for (Iterator i = lvolume.getChildren("pvolume").iterator(); i.hasNext();)
+ {
+ _pvolumes.add( new PVolume((Element)i.next()) ) ;
+ }
+
+ }
+
+}
\ No newline at end of file
GeomConverter/sandbox
diff -N CoordinateTransformation3D.java
--- CoordinateTransformation3D.java 23 Feb 2007 20:53:01 -0000 1.1
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,100 +0,0 @@
-/*
- * CoordinateTransformation3D.java
- */
-
-package org.lcsim.detector.kernel;
-
-import hep.physics.vec.Hep3Vector;
-import hep.physics.vec.BasicHep3Vector;
-import hep.physics.vec.VecOp;
-
-/**
- *
- * @author tknelson
- */
-public class CoordinateTransformation3D
-{
-
- // Fields
- Hep3Vector _translation = new BasicHep3Vector(0.0,0.0,0.0);
- RotationMatrix3D _rotation = new RotationMatrix3D();
-
- /**
- * Creates a new instance of CoordinateTransformation3D
- */
- public CoordinateTransformation3D()
- {
- }
-
- public CoordinateTransformation3D(RotationMatrix3D rotation)
- {
- this._rotation = rotation;
- }
-
- public CoordinateTransformation3D(Hep3Vector translation)
- {
- this._translation = translation;
- }
-
- public CoordinateTransformation3D(Hep3Vector translation, RotationMatrix3D rotation)
- {
- _translation = translation;
- _rotation = rotation;
- }
-
- // Access to translation and rotation
- public Hep3Vector getTranslation()
- {
- return _translation;
- }
-
- public RotationMatrix3D getRotation()
- {
- return _rotation;
- }
-
- // Transformations
- public Hep3Vector transform(Hep3Vector coordinates)
- {
- translate(coordinates);
- rotate(coordinates);
- return coordinates;
- }
-
- public Hep3Vector translate(Hep3Vector coordinates)
- {
- return VecOp.add(coordinates,_translation);
- }
-
- public Hep3Vector rotate(Hep3Vector coordinates)
- {
- //return VecOp.mult(_rotation,coordinates);
- return VecOp.mult(_rotation.getMatrix(),coordinates);
- }
-
- // Invert the transformation
- public void invert()
- {
- _translation = VecOp.mult(-1.0,VecOp.mult(_rotation.getMatrix(),_translation));
- _rotation.invert(); // Need to assure that transpose is used
- }
-
- // FIXME: Talk to Tony about supporting this pattern
-
-// public CoordinateTransformation3D inverse()
-// {
-// CoordinateTransformation3D transform = new CoordinateTransformation3D(
-// VecOp.mult(-1.0,VecOp.mult(_rotation,_translation)),
-// _rotation.inverse()); // FIXME: Need to assure that transpose is used
-// return transform;
-// }
-
- // Static functions
- public static CoordinateTransformation3D mult(CoordinateTransformation3D transformation1, CoordinateTransformation3D transformation2)
- {
- RotationMatrix3D rotation = new RotationMatrix3D(VecOp.mult(transformation1.getRotation().getMatrix(),transformation2.getRotation().getMatrix()));
- Hep3Vector translation = VecOp.add(VecOp.mult(transformation1.getRotation().getMatrix(),transformation2.getTranslation()),transformation1.getTranslation());
- return new CoordinateTransformation3D(translation,rotation);
- }
-
-}
GeomConverter/sandbox
diff -N DetectorElement.java
--- DetectorElement.java 23 Feb 2007 20:53:01 -0000 1.1
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,35 +0,0 @@
-/*
- * IDetectorElement.java
- *
- * Created on November 2, 2006, 4:51 PM
- *
- * To change this template, choose Tools | Template Manager
- * and open the template in the editor.
- */
-
-package org.lcsim.contrib.JeremyMcCormick;
-
-import java.util.List;
-
-/**
- *
- * @author tknelson
- */
-// SlowControl
-// FastControl
-// Calibration
-// ReadOut
-public interface DetectorElement
-{
- public IGeometryInfo geometry();
-
- public void createGeometry();
-
- public DetectorElement parent();
-
- public DetectorElementCollection getChildren();
-
- void initialize();
-
- String name();
-}
GeomConverter/sandbox
diff -N DetectorElementCollection.java
--- DetectorElementCollection.java 23 Feb 2007 20:53:01 -0000 1.1
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,2 +0,0 @@
-class DetectorElementCollection extends Collection<DetectorElement>
-{}
GeomConverter/sandbox
diff -N DetectorElementMixin.java
--- DetectorElementMixin.java 23 Feb 2007 20:53:01 -0000 1.1
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,8 +0,0 @@
-package org.lcsim.contrib.JeremyMcCormick;
-
-public interface DetectorElementMixin
-{
- DetectorElement getDetectorElement();
- void setDetectorElement(DetectorElement detelem);
- boolean hasValidDetectorElement();
-}
GeomConverter/sandbox
diff -N DetectorID.java
--- DetectorID.java 23 Feb 2007 20:53:01 -0000 1.1
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,80 +0,0 @@
-package org.lcsim.contrib.JeremyMcCormick;
-
-import org.lcsim.contrib.JeremyMcCormick.identifier.Identifier;
-
-/**
- * Idea for global detector identifier based on AtlasDetectorID.
- * @author jeremym
- *
- */
-public interface DetectorID
-{
- public boolean isVertexBarrel(Identifier i);
- public boolean isVertexEndcap(Identifier i);
- public boolean isForwardCalorimter(Identifier i);
- public boolean isLuminosityMonitor(Identifier i);
- public boolean isGammaCal(Identifier i);
- public boolean isTrackerBarrel(Identifier i);
- public boolean isTrackerEndcap(Identifier i);
- public boolean isTPC(Identifier i);
- public boolean isEcalBarrel(Identifier i);
- public boolean isEcalEndcap(Identifier i);
- public boolean isHadBarrel(Identifier i);
- public boolean isHadEndcap(Identifier i);
- public boolean isMuonBarrel(Identifier i);
- public boolean isMuonEndcap(Identifier i);
-
- public Identifier getVertexBarrelID();
- public Identifier getVertexEndcapID();
- public Identifier getForwardCalorimeterID();
- public Identifier getLuminosityMonitorID();
- public Identifier getGammaCalID();
- public Identifier getTrackerBarrelID();
- public Identifier getTrackerEndcapID();
- public Identifier getTPCID();
- public Identifier getEcalBarrelID();
- public Identifier getEcalEndcapID();
- public Identifier getHadBarrelID();
- public Identifier getHadEndcapID();
- public Identifier getMuonBarrelID();
- public Identifier getMuonEndcapID();
-
- public int getVertexBarrelValue();
- public int getVertexEndcapValue();
- public int getForwardCalorimeterValue();
- public int getLuminosityMonitorValue();
- public int getGammaCalValue();
- public int getTrackerBarrelValue();
- public int getTrackerEndcapValue();
- public int getTPCValue();
- public int getEcalBarrelValue();
- public int getEcalEndcapValue();
- public int getHadBarrelValue();
- public int getHadEndcapValue();
- public int getMuonBarrelValue();
- public int getMuonEndcapValue();
-
-
-
-
- /*
-
- VertexBarrel
- VertexEndcap
- ForwardCalorimeter
- LuminosityMonitor
- GammaCal
- TrackerBarrel
- TrackerEndcap
- TPC
- EcalBarrel
- EcalEndcap
- HadBarrel
- HadEndcap
- MuonBarrel
- MuonEndcap
-
- */
-
-
-}
GeomConverter/sandbox
diff -N GeometryCatalog.java
--- GeometryCatalog.java 23 Feb 2007 20:53:01 -0000 1.1
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,62 +0,0 @@
-/*
- * GeometryCatalog.java
- *
- * Created on November 9, 2006, 2:42 PM
- *
- * To change this template, choose Tools | Template Manager
- * and open the template in the editor.
- */
-
-package org.lcsim.contrib.subdetector.tracker.silicon;
-
-import java.util.Map;
-import java.util.HashMap;
-
-/**
- *
- * @author tknelson
- */
-public class GeometryCatalog
-{
-
- // Singleton implementation
- static private GeometryCatalog _instance;
-
- /**
- * Creates a new instance of GeometryCatalog
- */
- private GeometryCatalog()
- {
- }
-
- static public GeometryCatalog getInstance()
- {
- if (_instance == null)
- {
- _instance = new GeometryCatalog();
- }
- return _instance;
- }
-
-
- // Storage of LVolumes
- //====================
- private Map<String,LVolume> _lvolumes = new HashMap<String,LVolume>();
-
- public LVolume getLVolume(String name)
- {
- return _lvolumes.get(name);
- }
-
- public void addLVolume(String name, LVolume lvolume)
- {
- _lvolumes.put(name,lvolume);
- }
-
- public void clearLVolumes()
- {
- _lvolumes.clear();
- }
-
-
-}
GeomConverter/sandbox
diff -N GeometryInfo.java
--- GeometryInfo.java 23 Feb 2007 20:53:01 -0000 1.1
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,103 +0,0 @@
-/*
- * GeometryInfo.java
- *
- * Created on November 6, 2006, 11:12 AM
- *
- * To change this template, choose Tools | Template Manager
- * and open the template in the editor.
- */
-
-package org.lcsim.contrib.subdetector.tracker.silicon;
-
-import hep.physics.vec.Hep3Vector;
-import java.util.List;
-
-/**
- *
- * @author tknelson
- */
-public class GeometryInfo implements IGeometryInfo
-{
-
- // Fields
- //=======
- CoordinateTransformation3D _global_to_local;
- CoordinateTransformation3D _local_to_global;
- LVolume _logical_volume;
- List<PVolume> _daughter_volumes;
-
- /** Creates a new instance of GeometryInfo */
- public GeometryInfo(CoordinateTransformation3D global_to_local, LVolume logical_volume)
- {
- _global_to_local = global_to_local;
- _local_to_global = global_to_local.inverse();
- _logical_volume = logical_volume;
- }
-
- // Accessors
- public CoordinateTransformation3D getGlobalToLocal()
- {
- return _global_to_local;
- }
-
- public CoordinateTransformation3D getLocalToGlobal()
- {
- return _local_to_global;
- }
-
- public Hep3Vector globalToLocal(Hep3Vector global_point)
- {
- return _global_to_local.transform(global_point);
- }
-
- public Hep3Vector localToGlobal(Hep3Vector local_point)
- {
- return _local_to_global.transform(local_point);
- }
-
- public String childVolumeName(Hep3Vector global_point)
- {
- Hep3Vector parent_point = globalToLocal(global_point);
- List<PVolume> daughter_volumes = getLogicalVolume().getDaughters();
-
- String volume_name = "";
- for (PVolume daughter_volume : _daughter_volumes)
- {
- if (daughter_volume.getLogicalVolume().getSolid().isInside(daughter_volume.parentToLocal(parent_point)));
- {
- volume_name = daughter_volume.getLogicalVolume().getName();
- break;
- }
- }
- return volume_name;
- }
-
- public PVolume childVolume(Hep3Vector global_point)
- {
- Hep3Vector parent_point = globalToLocal(global_point);
- List<PVolume> daughter_volumes = getLogicalVolume().getDaughters();
-
- PVolume volume = null;
- for (PVolume daughter_volume : _daughter_volumes)
- {
- if (daughter_volume.getLogicalVolume().getSolid().isInside(daughter_volume.parentToLocal(parent_point)));
- {
- volume = daughter_volume;
- break;
- }
- }
- return volume;
- }
-
- public boolean isInside(Hep3Vector global_point)
- {
- return getLogicalVolume().getSolid().isInside(globalToLocal(global_point));
- }
-
- public LVolume getLogicalVolume()
- {
- return _logical_volume;
- }
-
-
-}
\ No newline at end of file
GeomConverter/sandbox
diff -N IDetectorElement.java
--- IDetectorElement.java 23 Feb 2007 20:53:01 -0000 1.1
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,36 +0,0 @@
-/*
- * IDetectorElement.java
- *
- * Created on November 2, 2006, 4:51 PM
- *
- * To change this template, choose Tools | Template Manager
- * and open the template in the editor.
- */
-
-package org.lcsim.contrib.JeremyMcCormick;
-
-import java.util.List;
-
-/**
- *
- * @author tknelson
- * @author Jeremy McCormick <[log in to unmask]>
- */
-// SlowControl
-// FastControl
-// Calibration
-// ReadOut
-public interface IDetectorElement
-{
- public IGeometryInfo geometry();
-
- public void createGeometry();
-
- public DetectorElement parent();
-
- public DetectorElementCollection children();
-
- void initialize();
-
- String name();
-}
GeomConverter/sandbox
diff -N IGeometryInfo.java
--- IGeometryInfo.java 23 Feb 2007 20:53:01 -0000 1.1
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,49 +0,0 @@
-/*
- * IGeometryInfo.java
- *
- * Created on November 2, 2006, 4:51 PM
- *
- * To change this template, choose Tools | Template Manager
- * and open the template in the editor.
- */
-
-package org.lcsim.contrib.JeremyMcCormick;
-
-import hep.physics.vec.Hep3Vector;
-
-/**
- *
- * @author tknelson
- */
-public interface IGeometryInfo
-{
-
- // global to local transformation
- public CoordinateTransformation3D getGlobalToLocal();
-
- // local to global transformation
- public CoordinateTransformation3D getLocalToGlobal();
-
- // transform a point in local coordinates to global coordinates
- public Hep3Vector localToGlobal(Hep3Vector local_point);
-
- // transform a point in global coordinates to local coordinates
- public Hep3Vector globalToLocal(Hep3Vector global_point);
-
- // get name of daughter volume containing a point in global coordinates
- public String childVolumeName(Hep3Vector global_point);
-
- // get daughter volume containing a point in global coordinates
- public PVolume childVolume(Hep3Vector global_point);
-
- // Gaudi has "get the exact full geometry location" What does this mean???
- // One interpretation, entire heirarchy as map of LVolumes to
- // positions in coordinates of each volume
- // public Map<ILVolume,Hep3Vector>
-
- // determine whether a point is inside the logical volume
- public boolean isInside(Hep3Vector global_point);
-
- // get the associated logical volume
- public LVolume getLogicalVolume();
-}
GeomConverter/sandbox
diff -N ISolid.java
--- ISolid.java 23 Feb 2007 20:53:01 -0000 1.1
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,35 +0,0 @@
-/*
- * ISolid.java
- *
- * Created on October 9, 2006, 3:44 PM
- *
- * To change this template, choose Tools | Template Manager
- * and open the template in the editor.
- */
-
-package org.lcsim.contrib.subdetector.tracker.silicon;
-
-import hep.physics.vec.Hep3Vector;
-import org.jdom.Element;
-import org.jdom.DataConversionException;
-
-/**
- *
- * @author tknelson
- */
-public interface ISolid
-{
-
- // Return dimensions
- public double[] getDimensions();
-
- // Calculate volume
- public double getVolume();
-
- // Is a particular point inside?
- public boolean isInside(Hep3Vector point);
-
- // Must be buildable from xml
- public void buildFromXML(Element solid);
-
-}
GeomConverter/sandbox
diff -N LVolume.java
--- LVolume.java 23 Feb 2007 20:53:01 -0000 1.1
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,102 +0,0 @@
-/*
- * LVolume.java
- *
- * Created on October 9, 2006, 3:15 PM
- *
- * To change this template, choose Tools | Template Manager
- * and open the template in the editor.
- */
-
-package org.lcsim.contrib.subdetector.tracker.silicon;
-
-import org.lcsim.material.Material;
-import org.lcsim.material.MaterialManager;
-import org.lcsim.material.MaterialNotFoundException;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.jdom.Element;
-import org.jdom.JDOMException;
-
-/**
- *
- * @author tknelson
- */
-public class LVolume
-{
- // Fields
- protected String _name;
- protected Material _material;
- protected ISolid _solid;
- protected List<PVolume> _pvolumes = new ArrayList<PVolume>();
-
- public LVolume(String name, ISolid solid, Material material)
- {
- _name = name;
- _solid = solid;
- _material = material;
- }
-
- public LVolume(Element lvolume) throws JDOMException
- {
- buildFromXML(lvolume);
- }
-
- // Accessors
- //==========
- public String getName()
- {
- return _name;
- }
-
- public Material getMaterial()
- {
- return _material;
- }
-
- public ISolid getSolid()
- {
- return _solid;
- }
-
- public List<PVolume> getPVolumes()
- {
- return _pvolumes;
- }
-
- public void addPVolume(PVolume pvolume)
- {
- _pvolumes.add(pvolume);
- }
-
- public void buildFromXML(Element lvolume)
- {
- // Create name
- _name = lvolume.getAttributeValue("name");
-
- // Create material
- try
- {
- _material = MaterialManager.findMaterial(lvolume.getAttributeValue("material"));
- }
- catch (MaterialNotFoundException mnfe)
- {
- throw new RuntimeException(mnfe);
- }
-
- // Create solid
- Element solid = lvolume.getChild("solid");
- String shape = solid.getAttributeValue("shape");
- if (shape=="box") _solid = new Box(solid);
- if (shape=="tubesegment") _solid = new TubeSegment(solid);
-
- // Add physical volumes
- for (Iterator i = lvolume.getChildren("pvolume").iterator(); i.hasNext();)
- {
- addPVolume( new PVolume((Element)i.next()) ) ;
- }
-
- }
-
-}
\ No newline at end of file
GeomConverter/sandbox
diff -N PVolume.java
--- PVolume.java 23 Feb 2007 20:53:01 -0000 1.1
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,107 +0,0 @@
-/*
- * PVolume.java
- *
- * Created on November 2, 2006, 5:17 PM
- *
- * To change this template, choose Tools | Template Manager
- * and open the template in the editor.
- */
-
-package org.lcsim.contrib.subdetector.tracker.silicon;
-
-import hep.physics.vec.Hep3Vector;
-import hep.physics.vec.BasicHep3Vector;
-import org.jdom.Element;
-import org.jdom.DataConversionException;
-
-/**
- *
- * @author tknelson
- */
-public class PVolume
-{
-
- private String _name;
- private String _lvolume_name;
- private CoordinateTransformation3D _parent_to_local = new CoordinateTransformation3D();
-
- /** Creates a new instance of PVolume */
- public PVolume(String name, String lvolume_name, CoordinateTransformation3D parent_to_local)
- {
- _name = name;
- _lvolume_name = lvolume_name;
- _parent_to_local = parent_to_local;
- }
-
- public PVolume(Element pvolume)
- {
- buildFromXML(pvolume);
- }
-
- // Accessors
- //==========
- public String getName()
- {
- return _name;
- }
-
- public String getLVolumeName()
- {
- return _lvolume_name;
- }
-
- public LVolume getLVolume(String name)
- {
- return GeometryCatalog.getInstance().getLVolume(_lvolume_name);
- }
-
- public CoordinateTransformation3D getParentToLocal()
- {
- return _parent_to_local;
- }
-
- public Hep3Vector parentToLocal(Hep3Vector parent_point)
- {
- return _parent_to_local.transform(parent_point);
- }
-
- public void buildFromXML(Element pvolume)
- {
- // Create name
- _name = pvolume.getAttributeValue("name");
-
- // Create lvolume name
- _lvolume_name = pvolume.getAttributeValue("lvolume");
-
- // Create CoordinateTransformation3D
- Element trans = pvolume.getChild("posXYZ");
- Hep3Vector translation = null;
- try
- {
- translation = new BasicHep3Vector(trans.getAttribute("x").getDoubleValue(),
- trans.getAttribute("y").getDoubleValue(),
- trans.getAttribute("z").getDoubleValue());
- }
- catch (DataConversionException dce)
- {
- System.out.println("Cannot convert translation to double!");
- }
-
- Element rot = pvolume.getChild("rotXYZ");
- Hep3Rotation rotation = null;
- try
- {
- rotation = Hep3Rotation.passiveTaitBryan(rot.getAttribute("rot_x").getDoubleValue(),
- rot.getAttribute("rot_y").getDoubleValue(),
- rot.getAttribute("rot_z").getDoubleValue());
- }
- catch (DataConversionException dce)
- {
- System.out.println("Cannot convert rotation to double!");
- }
-
- _parent_to_local = new CoordinateTransformation3D(translation,rotation);
-
- }
-
-}
GeomConverter/sandbox
diff -N PadRowLayout2D.java
--- PadRowLayout2D.java 23 Feb 2007 20:53:01 -0000 1.1
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,133 +0,0 @@
-package org.lcsim.contrib.JeremyMcCormick;
-
-import hep.physics.vec.Hep3Vector;
-
-import java.util.List;
-
-/**
- * Interface for PadRowLayout2D, copied from GEAR's PadRowLayout2D by Frank Gaede.
- */
-public interface PadRowLayout2D
-{
- /**
- * The type of the coordinate system.
- */
- public enum PadLayoutType
- {
- CARTESIAN,
- POLAR
- }
-
- /**
- * The shape of the readout pad.
- */
- public enum PadShape
- {
- RECTANGLE,
- DIAMOND,
- HEXAGON,
- CHEVRON
- }
-
- /**
- * The type of the row labout: CARTESIAN or POLAR.
- */
- PadLayoutType getPadLayoutType();
-
- /**
- * The shape of the pads: RECTANGLE, DIAMOND, HEXGON, or CHEVRON.
- */
- PadShape getPadShape();
-
- /**
- * The total number of pads.
- */
- int getNPads();
-
- /**
- * The number of rows.
- */
- int getNRows();
-
- /**
- * The row heigh in mm.
- */
- double getRowHeight(int rowNumber);
-
- /**
- * The width of the pad at padIndex in mm (CARTESIAN) or radians (POLAR).
- */
- double getPadWidth(int padIndex);
-
- /**
- * Center of the pad at padIndex.
- */
- // FIXME: Should return a class representing a 2D point rather than 3D.
- // Could use spacegeom's CartesianTwoPoint but GeomConverter cannot
- // depend on lcsim!
- Hep3Vector getPadCenter(int padIndex);
-
- /**
- * The height of the pad in mm.
- */
- double getPadHeight(int padIndex);
-
- /**
- * Indices of all pads in row rowNumber.
- */
- List<Integer> getPadsInRow(int rowNumber);
-
- /**
- * Extent of the geometric readout plane:
- * [xmin,xmax,ymin,ymax] for cartesian or
- * [rmin,rmax,phimin,phimax] for polar.
- */
- List<Double> getPlaneExtent();
-
- /**
- * The number of the row that contains the pad at padIndex.
- */
- int getRowNumber(int padIndex);
-
- /**
- * The pad number within the row.
- */
- int getPadNumber(int padIndex);
-
- /**
- * The index of the pad at row number rowNum and column number padNum.
- */
- int getPadIndex(int rowNum, int padNum);
-
- /**
- * The index of the pad nearest to the given point in 2d coordinates (x,y) or (r,phi).
- */
- int getNearestPad(double u, double v);
-
- /**
- * The index of the right neighbor pad.
- */
- int getRightNeighbor(int padIndex);
-
- /**
- * The index of the left neighbor pad.
- */
- int getLeftNeighbor(int padIndex);
-
- /**
- * The indices of the full set of 2D neighbors,
- * e.g. 8 for a rectangular cell not at any edge.
- */
- // NOTE: This method is not in the GEAR version.
- int getAllNeighbors(int padIndex);
-
- /**
- * True if coordinate (c1,c2) is within the given pad.
- */
- boolean isInsidePad(double c1, double c2, int padIndex);
-
- /**
- * True if coordinate (c1,c2) is within any pad.
- */
- boolean isInsidePad(double u, double v);
-}
\ No newline at end of file
GeomConverter/sandbox
diff -N Trapezoid.java
--- Trapezoid.java 23 Feb 2007 20:53:01 -0000 1.1
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,80 +0,0 @@
-/*
- * Trapezoid.java
- *
- * Created on October 6, 2006, 4:41 PM
- *
- * To change this template, choose Tools | Template Manager
- * and open the template in the editor.
- */
-
-package org.lcsim.contrib.subdetector.tracker.silicon;
-
-import hep.physics.vec.Hep3Vector;
-import org.jdom.Element;
-import org.jdom.DataConversionException;
-
-/**
- *
- * @author tknelson
- */
-public class Trapezoid implements ISolid
-{
-
- // Fields
- //=======
- private double _dimensions[] = new double[4];
-
- /** Creates a new instance of Box */
- public Trapezoid(double[] dimensions)
- {
- _dimensions = dimensions;
- }
-
- public Trapezoid(double x1, double x2, double y, double z)
- {
- _dimensions[0] = x1;
- _dimensions[1] = x2;
- _dimensions[2] = y;
- _dimensions[3] = z;
- }
-
- // Public methods
- //===============
- public double[] getDimensions()
- {
- return _dimensions;
- }
-
- public double getVolume()
- {
- return (_dimensions[0]+_dimensions[1])/2.0 * _dimensions[2] * _dimensions[3];
- }
-
- public boolean isInside(Hep3Vector point)
- {
- double inverse_slope = (_dimensions[1]-_dimensions[0])/(2.0*_dimensions[2]);
- double x_intercept = (_dimensions[0]+_dimensions[1]/4.0);
-
- double x_limit = inverse_slope*point.y()+x_intercept;
-
- return ( Math.abs(point.x()) < x_limit &&
- Math.abs(point.y()) < _dimensions[2]/2.0 &&
- Math.abs(point.z()) < _dimensions[3]/2.0 );
- }
-
- public void buildFromXML(Element trapezoid)
- {
- try
- {
- _dimensions[0] = trapezoid.getAttribute("size_x1").getDoubleValue();
- _dimensions[1] = trapezoid.getAttribute("size_x2").getDoubleValue();
- _dimensions[2] = trapezoid.getAttribute("size_y").getDoubleValue();
- _dimensions[3] = trapezoid.getAttribute("size_z").getDoubleValue();
- }
- catch (DataConversionException dce)
- {
- System.out.println("Cannot convert Trapezoid dimensions to double!");
- }
- }
-
-}
GeomConverter/sandbox
diff -N TubeSegment.java
--- TubeSegment.java 23 Feb 2007 20:53:01 -0000 1.1
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,85 +0,0 @@
-/*
- * TubeSegment.java
- *
- * Created on November 3, 2006, 2:41 PM
- *
- * To change this template, choose Tools | Template Manager
- * and open the template in the editor.
- */
-
-package org.lcsim.contrib.subdetector.tracker.silicon;
-
-import hep.physics.vec.Hep3Vector;
-import org.jdom.Element;
-import org.jdom.DataConversionException;
-
-/**
- *
- * @author tknelson
- */
-public class TubeSegment implements ISolid
-{
-
- // Fields
- //=======
- private double _dimensions[] = new double[3];
-
- /** Creates a new instance of Box */
- public TubeSegment(Element tubesegment)
- {
- buildFromXML(tubesegment);
- }
-
- // Accessors
- //==========
- public double getInnerRadius()
- {
- return _dimensions[0];
- }
-
- public double getOuterRadius()
- {
- return _dimensions[1];
- }
-
- public double getZLength()
- {
- return _dimensions[2];
- }
-
- // Implementation of ISolid
- //=========================
- public double[] getDimensions()
- {
- return _dimensions;
- }
-
- public double getVolume()
- {
- return Math.PI*(_dimensions[1]*_dimensions[1] - _dimensions[0]*_dimensions[0])*_dimensions[2];
- }
-
- public boolean isInside(Hep3Vector point)
- {
- double r_xy = Math.sqrt(point.x()*point.x() + point.y()*point.y());
-
- return ( r_xy > _dimensions[0] &&
- r_xy < _dimensions[1] &&
- Math.abs(point.z()) < _dimensions[2]/2.0 );
- }
-
- public void buildFromXML(Element tubesegment)
- {
- try
- {
- _dimensions[0] = tubesegment.getAttribute("r_inner").getDoubleValue();
- _dimensions[1] = tubesegment.getAttribute("r_outer").getDoubleValue();
- _dimensions[2] = tubesegment.getAttribute("z_length").getDoubleValue();
- }
- catch (DataConversionException dce)
- {
- System.out.println("Cannot convert TubeSegment dimensions to double!");
- }
- }
-
-}
CVSspam 0.2.8