lcsim/src/org/lcsim/fit/helicaltrack
diff -u -r1.16 -r1.17
--- HelicalTrackHitDriver.java 10 Jul 2008 22:05:03 -0000 1.16
+++ HelicalTrackHitDriver.java 12 Jul 2008 01:25:41 -0000 1.17
@@ -15,11 +15,14 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
+
import org.lcsim.contrib.SiStripSim.SiTrackerHit;
import org.lcsim.contrib.SiStripSim.SiTrackerHitStrip1D;
import org.lcsim.contrib.SiStripSim.TrackerHitType.CoordinateSystem;
import org.lcsim.contrib.onoprien.tracking.geom.SegmentationManager;
import org.lcsim.contrib.onoprien.tracking.geom.Sensor;
+import org.lcsim.contrib.onoprien.tracking.geom.SensorType;
+import org.lcsim.contrib.onoprien.tracking.geom.sensortypes.Cylinder;
import org.lcsim.contrib.onoprien.tracking.hit.DigiTrackerHit;
import org.lcsim.contrib.onoprien.tracking.hit.TrackerCluster;
import org.lcsim.detector.DetectorElementStore;
@@ -34,6 +37,7 @@
import org.lcsim.event.TrackerHit;
import org.lcsim.event.base.BaseTrackerHitMC;
import org.lcsim.geometry.subdetector.BarrelEndcapFlag;
+import org.lcsim.spacegeom.SpacePointVector;
import org.lcsim.util.Driver;
/**
@@ -106,14 +110,14 @@
SymmetricMatrix cov = new SymmetricMatrix(3, hit.getCovMatrix(), true);
try {
- SimTrackerHit simhit = ((BaseTrackerHitMC)hit).getSimHits().get(0);
- IDetectorElementContainer cont = DetectorElementStore.getInstance().find(simhit.getIdentifier());
+ SimTrackerHit simhit = ((BaseTrackerHitMC)hit).getSimHits().get(0);
+ IDetectorElementContainer cont = DetectorElementStore.getInstance().find(simhit.getIdentifier());
if (cont.isEmpty()) {
throw new RuntimeException("Detector Container is empty!");
} else {
- IDetectorElement de = cont.get(0);
+ IDetectorElement de = cont.get(0);
String detname = ID.getName(de);
- int lyr = ID.getLayer(de);
+ int lyr = ID.getLayer(de);
HelicalTrackHit hthit = new HelicalTrack3DHit(pos, cov, hit.getdEdx(), hit.getTime(), hit.getRawHits(),
detname, lyr, ID.getBarrelEndcapFlag(de));
@@ -122,15 +126,11 @@
}
} catch(Exception e) {
- System.out.println("Warning, could not complete Identification for smeared hits. Reason: "+e.getMessage());
+ System.out.println("Warning, could not complete Identification for smeared hits. Reason: "+e.getMessage());
HelicalTrackHit hthit = new HelicalTrack3DHit(pos, cov, hit.getdEdx(), hit.getTime(),
- hit.getRawHits(), "Unknown", 0, BarrelEndcapFlag.BARREL);
+ hit.getRawHits(), "Unknown", 0, BarrelEndcapFlag.BARREL);
helhits.add(hthit);
}
-
-
-
-
}
}
@@ -178,38 +178,35 @@
for (String colname : _digcol) {
-
- List<SiTrackerHit> hitlist = (List<SiTrackerHit>) event.get(colname);
- List<HelicalTrackStrip> strips = new ArrayList<HelicalTrackStrip>();
+
+ List<SiTrackerHit> hitlist = (List<SiTrackerHit>) event.get(colname);
+ List<HelicalTrackStrip> strips = new ArrayList<HelicalTrackStrip>();
for (SiTrackerHit hit : hitlist) {
-
+
if (hit instanceof SiTrackerHitStrip1D) {
//determine if the hit is stereoed or not
- SiTrackerHitStrip1D h = (SiTrackerHitStrip1D) hit;
- SiTrackerModule m = (SiTrackerModule) hit.getSensor().getParent();
+ SiTrackerHitStrip1D h = (SiTrackerHitStrip1D) hit;
+ SiTrackerModule m = (SiTrackerModule) hit.getSensor().getParent();
if (m.getChildren().size()==2) //stereo hit
strips.add(makeDigiStrip(h));
else helhits.add(makeDigiAxialHit(h)); //isolated hit
}
//for other types, make 3d hits
- else helhits.add(makeDigi3DHit(hit));
+ else helhits.add(makeDigi3DHit(hit));
}
//generate Stereo hits
- List<HelicalTrackCross> stereohits = _crosser.MakeHits(strips);
-// System.out.println(stereohits.size());
+ List<HelicalTrackCross> stereohits = _crosser.MakeHits(strips);
- helhits.addAll(stereohits);
- }
+ helhits.addAll(stereohits);
+ }
// Put the HelicalTrackHits back into the event
event.put(_outname, helhits,HelicalTrackHit.class,0);
return;
- }
-
-
+ }
/**
* Add a TrackerHit collection to be processed.
@@ -223,7 +220,7 @@
_smcol.add(name);
} else if (type == HitType.Digitized)
_digcol.add(name);
- return;
+ return;
}
/**
@@ -235,7 +232,6 @@
return;
}
-
private HelicalTrackHit MakeAxialHit(org.lcsim.contrib.onoprien.tracking.hit.TrackerHit hit) {
HelicalTrackStrip strip = MakeStrip(hit);
if (VecOp.cross(strip.v(), _zhat).magnitude() > _eps) return null;
@@ -244,7 +240,6 @@
HelicalTrackHit axialhit = new HelicalTrack2DHit(strip.origin(), HitUtils.StripCov(strip),
strip.dEdx(), strip.time(), strip.rawhits(), strip.detector(), strip.layer(), strip.BarrelEndcapFlag(),
zmin, zmax);
- System.out.println("Hit position: "+axialhit.toString());
List<MCParticle> mcplist = getMCParticles(hit.getCluster());
for (MCParticle mcp : mcplist) {
axialhit.addMCParticle(mcp);
@@ -253,24 +248,41 @@
}
private HelicalTrackStrip MakeStrip(org.lcsim.contrib.onoprien.tracking.hit.TrackerHit hit) {
+ Hep3Vector u;
+ Hep3Vector v;
+ Hep3Vector org;
+ double umeas;
+ double du;
+ double vmin;
+ double vmax;
Sensor s = hit.getSensor();
- System.out.println("Global position: "+hit.getPosition().toString());
- Hep3Vector org = s.localToGlobal(_orgloc);
- System.out.println("Origin position: "+org.toString());
- Hep3Vector u = VecOp.sub(s.localToGlobal(_uloc), org);
- System.out.println("u: "+u.toString());
- Hep3Vector v = VecOp.sub(s.localToGlobal(_vloc), org);
- double umeas = hit.getLocalPosition().x();
- System.out.println("u measured: "+umeas);
- double du = Math.sqrt(hit.getLocalCovMatrix().diagonal(0));
- double vmin = hit.getLocalSegment().getStartPoint().y();
- double vmax = hit.getLocalSegment().getEndPoint().y();
+ SensorType stype = s.getType();
+ if (stype instanceof Cylinder) {
+ SpacePointVector seg = hit.getSegment();
+ v = VecOp.unit(seg.getDirection());
+ Hep3Vector r = new BasicHep3Vector(hit.getPosition().x(), hit.getPosition().y(), 0.0);
+ u = VecOp.unit(VecOp.cross(v, r));
+ umeas = 0.;
+ du = r.magnitude() * Math.sqrt(hit.getLocalCovMatrix().diagonal(0));
+ org = VecOp.mult(0.5, VecOp.add(seg.getStartPoint(), seg.getEndPoint()));
+ vmax = seg.getDirection().magnitude() / 2.;
+ vmin = -vmax;
+ } else {
+ org = s.localToGlobal(_orgloc);
+ u = VecOp.sub(s.localToGlobal(_uloc), org);
+ v = VecOp.sub(s.localToGlobal(_vloc), org);
+ umeas = hit.getLocalPosition().x();
+ du = Math.sqrt(hit.getLocalCovMatrix().diagonal(0));
+ vmin = hit.getLocalSegment().getStartPoint().y();
+ vmax = hit.getLocalSegment().getEndPoint().y();
+ }
+
double dEdx = hit.getSignal();
double time = hit.getTime();
IDetectorElement de = s.getDetectorElement();
String det = ID.getName(de);
- // Divide the layer number by 2 to get the stereo layer number
- int lyr = ID.getLayer(de) / 2;
+ int lyr = ID.getLayer(de);
+ if (_segman.getStereoPartners(s) != null) lyr = lyr / 2;
BarrelEndcapFlag beflag = ID.getBarrelEndcapFlag(de);
HelicalTrackStrip strip = new HelicalTrackStrip(org, u, v, umeas, du, vmin, vmax, dEdx, time, null,
@@ -306,192 +318,69 @@
}
return mcplist;
}
-
-
-
-
-// private static final int[] LAYER_MAP = new int[]{0,1,2,0,1,2,3};
+
private HelicalTrackHit makeDigi3DHit(SiTrackerHit h) {
- IDetectorElement de = h.getSensor();
- int lyr = ID.getLayer(de);
- BarrelEndcapFlag be = ID.getBarrelEndcapFlag(de);
+ IDetectorElement de = h.getSensor();
+ int lyr = ID.getLayer(de);
+ BarrelEndcapFlag be = ID.getBarrelEndcapFlag(de);
- HelicalTrackHit hit = new HelicalTrack3DHit(h.getPositionAsVector(),
- h.getCovarianceAsMatrix(), h.getdEdx(), h.getTime(),
+ HelicalTrackHit hit = new HelicalTrack3DHit(h.getPositionAsVector(),
+ h.getCovarianceAsMatrix(), h.getdEdx(), h.getTime(),
h.getRawHits(), ID.getName(de), lyr, be);
for (MCParticle p : h.getMCParticles()) hit.addMCParticle(p);
- return hit;
+ return hit;
}
private HelicalTrackHit makeDigiAxialHit(SiTrackerHitStrip1D h){
- double z1 = h.getHitSegment().getEndPoint().z();
- double z2 = h.getHitSegment().getStartPoint().z();
- double zmin = Math.min(z1,z2);
- double zmax = Math.max(z1,z2);
- IDetectorElement de = h.getSensor();
-
- HelicalTrackHit hit = new HelicalTrack2DHit(h.getPositionAsVector(),
- h.getCovarianceAsMatrix(), h.getdEdx(), h.getTime(),
- h.getRawHits(), ID.getName(de), ID.getLayer(de),
+ double z1 = h.getHitSegment().getEndPoint().z();
+ double z2 = h.getHitSegment().getStartPoint().z();
+ double zmin = Math.min(z1,z2);
+ double zmax = Math.max(z1,z2);
+ IDetectorElement de = h.getSensor();
+
+ HelicalTrackHit hit = new HelicalTrack2DHit(h.getPositionAsVector(),
+ h.getCovarianceAsMatrix(), h.getdEdx(), h.getTime(),
+ h.getRawHits(), ID.getName(de), ID.getLayer(de),
ID.getBarrelEndcapFlag(de), zmin, zmax);
-
- for (MCParticle p : h.getMCParticles()) hit.addMCParticle(p);
-// System.out.println("DigiAxialHit made at "+h.getPositionAsVector().toString());
- return hit;
+ for (MCParticle p : h.getMCParticles()) hit.addMCParticle(p);
+ return hit;
}
-
+
private HelicalTrackStrip makeDigiStrip(SiTrackerHitStrip1D h){
- SiTrackerHitStrip1D local = h.getTransformedHit(CoordinateSystem.SENSOR);
- SiTrackerHitStrip1D global = h.getTransformedHit(CoordinateSystem.GLOBAL);
-
- ITransform3D trans = local.getLocalToGlobal();
- Hep3Vector org = trans.transformed(_orgloc);
- Hep3Vector u = global.getMeasuredCoordinate();
- Hep3Vector v = global.getUnmeasuredCoordinate();
-
-// System.out.println(local.getPositionAsVector().toString());
-// System.out.println("start: "+local.getHitSegment().getStartPoint().toString());
-// System.out.println("end: " + local.getHitSegment().getEndPoint().toString());
-// System.out.println("measured: "+local.getMeasuredCoordinate().toString());
-// System.out.println("unmeasured: "+local.getUnmeasuredCoordinate().toString());
-// System.out.println("length: "+local.getHitLength());
-// System.out.println("start dot measured: "+VecOp.dot(local.getUnmeasuredCoordinate(),local.getHitSegment().getStartPoint()));
-// System.out.println("end dot measured: "+VecOp.dot(local.getUnmeasuredCoordinate(),local.getHitSegment().getEndPoint()));
-// System.out.println();
-
- double umeas = local.getPosition()[0];
- double vmin = VecOp.dot(local.getUnmeasuredCoordinate(),local.getHitSegment().getStartPoint());
- double vmax = VecOp.dot(local.getUnmeasuredCoordinate(),local.getHitSegment().getEndPoint());
- double du = Math.sqrt(local.getCovarianceAsMatrix().diagonal(0));
-
- IDetectorElement de = h.getSensor();
- String det = ID.getName(de);
- int lyr = ID.getLayer(de);
- BarrelEndcapFlag be = ID.getBarrelEndcapFlag(de);
-
- double dEdx = h.getdEdx();
- double time = h.getTime();
- List<RawTrackerHit> rawhits = h.getRawHits();
- HelicalTrackStrip strip = new HelicalTrackStrip(org, u, v, umeas, du,
- vmin, vmax, dEdx, time, rawhits, det, lyr, be);
-
- for (MCParticle p : h.getMCParticles()) strip.addMCParticle(p);
- return strip;
- }
-
-
- // Get the hits for this collection and loop over the hits
-// List<TrackerHit> hitlist = (List<TrackerHit>) event.get(colname);
-// for (TrackerHit hit : hitlist) {
-// double[] ps = hit.getPosition();
-// double[] cov = hit.getCovMatrix();
-//
- // Check that these hits are actually instances of OldTrackerHit and cast accordingly
-// if (hit instanceof OldTrackerHit) {
-// OldTrackerHit vshit = (OldTrackerHit) hit;
-
- // Get the cluster(s) and a sensor for this hit
-// List<TrackerCluster> clist = vshit.getClusters();
-// MCParticle mcp = clist.get(0).getDigiHits().get(0).getElementalHits().get(0).getMCParticle();
-// Sensor sensor = clist.get(0).getSensor();
-
- // Check if this is a barrel or endcap hit by transforming the sensor
- // normal in local coordinates to the global coordniate system
-// Hep3Vector gz = sensor.getRotation().transformFrom(lz);
-// BarrelEndcapFlag beflag = BarrelEndcapFlag.BARREL;
-// if (Math.pow(gz.z(),2) > 0.5) {
-
- // If the sensor normal mostly points in the z direction call it
- // an endcap hit. Check which endcap we are in.
-// if (hit.getPosition()[2]>0) beflag = BarrelEndcapFlag.ENDCAP_NORTH;
-// else beflag = BarrelEndcapFlag.ENDCAP_SOUTH;
-// }
-
- // If there are more than one (i.e., two) clusters for this hit, we
- // have a cross formed from two stereo layers
-// if (vshit.isStereo()) {
-// if (clist.size() != 2) throw new RuntimeException("More than 2 clusters on a stereo hit");
-// List<HelicalTrackStrip> strips = new ArrayList<HelicalTrackStrip>();
-// for (TrackerCluster cl : clist) {
-// if (cl.getTrackerHits().size() == 0) cl.addTrackerHit(_hitmaker.make(cl));
-// Sensor s = cl.getSensor();
-// Hep3Vector org = s.localToGlobal(_orgloc);
-// Hep3Vector uhat = VecOp.sub(s.localToGlobal(_uloc), org);
-// Hep3Vector vhat = VecOp.sub(s.localToGlobal(_vloc), org);
-// org.lcsim.contrib.onoprien.tracking.hit.TrackerHit dhit = cl.getTrackerHits().get(0);
-// double umeas = dhit.getLocalPosition().x();
-// double vmin = dhit.getLocalSegment().getStartPoint().y();
-// double vmax = dhit.getLocalSegment().getEndPoint().y();
-// double du = Math.sqrt(dhit.getLocalCovMatrix().diagonal(0));
-
-// Hep3Vector loc = dhit.getLocalPosition();
-// strips.add(new HelicalTrackStrip(org, uhat, vhat, umeas, du, vmin, vmax));
-// }
-// HelicalTrackHit hthit = new HelicalTrackCross(strips.get(0), strips.get(1));
-// addMCParticles(hit, hthit);
-// helhits.add(hthit);
-// } else {
-
- // Check the number of readout dimensions (1 = strip, 2 = pixel)
-// SensorType stype = sensor.getType();
-// if (stype.getHitDimension() == 2) {
-
- // Pixel hit found - make a HelicalTrack3DHit
-// HelicalTrackHit hthit = new HelicalTrack3DHit(hit, beflag);
-// addMCParticles(hit, hthit);
-// helhits.add(hthit);
-// } else if (stype.getHitDimension() == 1 && beflag == BarrelEndcapFlag.BARREL) {
-
- // Barrel strip hit found - find the ends of the strip in z
-// Hep3Vector pos = new BasicHep3Vector(hit.getPosition());
-// Hep3Vector stripgeom = stype.getChannelDimensions(stype.getChannelID(pos));
-// double zmin = pos.z() - 0.5 * stripgeom.y();
-// double zmax = pos.z() + 0.5 * stripgeom.y();
-
- // Make a HelicalTrack2DHit
-// HelicalTrackHit hthit = new HelicalTrack2DHit(hit, zmin, zmax);
-// addMCParticles(hit, hthit);
-// helhits.add(hthit);
-// }
-// }
-// }
-// }
-// }
-// private void addMCParticles(TrackerHit hit, HelicalTrackHit hthit) {
-// // First check if we have a BaseTrackerHitMC
-// if (hit instanceof BaseTrackerHitMC) {
- // Loop over the MCParticles for this hit
-// for (MCParticle mcp : ((BaseTrackerHitMC) hit).mcParticles()) {
- // Add an MCParticle to the hit
-// hthit.addMCParticle(mcp);
-// }
-// }
-
- // Check if we have an OldTrackerHit
-// else if (hit instanceof OldTrackerHit) {
-// OldTrackerHit oth = (OldTrackerHit) hit;
- // Loop over clusters associated with this hit
-// for (TrackerCluster cluster : oth.getClusters()) {
- // Loop over the digitized hits
-// for (DigiTrackerHit dhit : cluster.getDigiHits()) {
- // Get the elemental hits - not sure what the dif is...
-// for (DigiTrackerHit dhit2 : dhit.getElementalHits()) {
- // Get the MCParticle and add it to the hit
-// MCParticle mcp = dhit2.getMCParticle();
-// if (mcp != null) hthit.addMCParticle(mcp);
-// }
-// }
-// }
-// }
-// return;
-// }
+ SiTrackerHitStrip1D local = h.getTransformedHit(CoordinateSystem.SENSOR);
+ SiTrackerHitStrip1D global = h.getTransformedHit(CoordinateSystem.GLOBAL);
+
+ ITransform3D trans = local.getLocalToGlobal();
+ Hep3Vector org = trans.transformed(_orgloc);
+ Hep3Vector u = global.getMeasuredCoordinate();
+ Hep3Vector v = global.getUnmeasuredCoordinate();
+
+ double umeas = local.getPosition()[0];
+ double vmin = VecOp.dot(local.getUnmeasuredCoordinate(),local.getHitSegment().getStartPoint());
+ double vmax = VecOp.dot(local.getUnmeasuredCoordinate(),local.getHitSegment().getEndPoint());
+ double du = Math.sqrt(local.getCovarianceAsMatrix().diagonal(0));
+
+ IDetectorElement de = h.getSensor();
+ String det = ID.getName(de);
+ int lyr = ID.getLayer(de);
+ BarrelEndcapFlag be = ID.getBarrelEndcapFlag(de);
+
+ double dEdx = h.getdEdx();
+ double time = h.getTime();
+ List<RawTrackerHit> rawhits = h.getRawHits();
+ HelicalTrackStrip strip = new HelicalTrackStrip(org, u, v, umeas, du,
+ vmin, vmax, dEdx, time, rawhits, det, lyr, be);
+
+ for (MCParticle p : h.getMCParticles()) strip.addMCParticle(p);
+ return strip;
+ }
}