lcsim/src/org/lcsim/event/base
diff -u -r1.7 -r1.8
--- BaseHit.java 18 Mar 2009 03:52:06 -0000 1.7
+++ BaseHit.java 22 Apr 2009 18:50:14 -0000 1.8
@@ -4,6 +4,7 @@
import org.lcsim.detector.DetectorIdentifierHelper;
import org.lcsim.detector.IDetectorElement;
+import org.lcsim.detector.IDetectorElementContainer;
import org.lcsim.detector.identifier.IExpandedIdentifier;
import org.lcsim.detector.identifier.IIdentifier;
import org.lcsim.detector.identifier.IIdentifierHelper;
@@ -60,12 +61,15 @@
/**
* Get the deepest {@see org.lcsim.detector.IDetectorElement} associated with this hit.
* If this is not set manually using {@see #setDetectorElement(IDetectorElement)}
- * then the subdetector's DetectorElement is searched using the hit's position
- * from {@see #getPositionVec()}.
+ * then the subdetector's DetectorElement is searched using the hit's identifier.
* @return The IDetectorElement for this hit.
*/
public IDetectorElement getDetectorElement()
{
+ if (de == null)
+ {
+ findDetectorElementByIdentifier();
+ }
return de;
}
@@ -168,4 +172,36 @@
{
return getIdentifierHelper().getValue(getIdentifier(), field);
}
+
+ private final void findDetectorElementByIdentifier()
+ {
+ if (this.de == null)
+ {
+ IDetectorElementContainer srch = getSubdetector().getDetectorElement().findDetectorElement(getIdentifier());
+
+ if (srch.size() == 0)
+ {
+ throw new RuntimeException("No DetectorElement found for SimTrackerHit with id <" + getIdentifier().toHexString() + ">.");
+ }
+
+ if (srch.size() == 1)
+ {
+ this.de = srch.get(0);
+ }
+
+ if (srch.size() > 1)
+ {
+ // Pick the first leaf DetectorElement that is found.
+ for (IDetectorElement xde : srch)
+ {
+ if (!xde.hasChildren())
+ {
+ this.de = xde;
+ break;
+ }
+ }
+ }
+ }
+ }
+
}
\ No newline at end of file
lcsim/src/org/lcsim/event/base
diff -u -r1.10 -r1.11
--- BaseSimTrackerHit.java 20 Apr 2009 23:37:30 -0000 1.10
+++ BaseSimTrackerHit.java 22 Apr 2009 18:50:14 -0000 1.11
@@ -161,14 +161,33 @@
}
public IDetectorElement getDetectorElement()
- {
- if (de == null)
+ {
+ if (this.de == null)
{
- de = getSubdetector().getDetectorElement().findDetectorElement(getPositionVec());
- if (de == null)
- {
- throw new RuntimeException("No DetectorElement found for SimTrackerHit with position " + this.getPositionVec() + ".");
- }
+ IDetectorElementContainer srch = getSubdetector().getDetectorElement().findDetectorElement(getIdentifier());
+
+ if (srch.size() == 0)
+ {
+ throw new RuntimeException("No DetectorElement found for SimTrackerHit with id <" + getIdentifier().toHexString() + ">.");
+ }
+
+ if (srch.size() == 1)
+ {
+ this.de = srch.get(0);
+ }
+
+ if (srch.size() > 1)
+ {
+ // Pick the first leaf DetectorElement that is found.
+ for (IDetectorElement xde : srch)
+ {
+ if (!xde.hasChildren())
+ {
+ this.de = xde;
+ break;
+ }
+ }
+ }
}
return de;
}