lcsim/src/org/lcsim/contrib/SteveMagill
diff -N TrkXPosDriver.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ TrkXPosDriver.java 29 May 2008 21:34:01 -0000 1.1
@@ -0,0 +1,215 @@
+package org.lcsim.contrib.compile.SteveMagill;
+
+// This driver extrapolates tracks to selected points in the calorimeter,
+// layer 0 of ECAL, Shower Max of ECAL (layer 7), and layer 0 of HCAL. It
+// links the track with a SpacePoint at each position. (Not stored is
+// whether this is in the barrel or endcap).
+
+import java.util.*;
+import org.lcsim.event.CalorimeterHit;
+import org.lcsim.event.Track;
+import org.lcsim.event.base.BaseTrackMC;
+import org.lcsim.event.EventHeader;
+import org.lcsim.util.Driver;
+import org.lcsim.util.swim.*;
+import org.lcsim.util.lcio.LCIOConstants;
+import org.lcsim.recon.cluster.util.*;
+import org.lcsim.util.aida.*;
+import org.lcsim.geometry.*;
+import hep.physics.vec.Hep3Vector;
+import hep.physics.vec.BasicHep3Vector;
+import org.lcsim.geometry.subdetector.CylindricalCalorimeter;
+import org.lcsim.mc.fast.tracking.*;
+import hep.aida.*;
+import org.lcsim.spacegeom.*;
+
+public class TrkXPosDriver extends Driver
+{
+ ITree tree;
+ IHistogramFactory histogramFactory;
+ IAnalysisFactory analysisFactory = IAnalysisFactory.create();
+ private AIDA aida = AIDA.defaultInstance();
+ private boolean _initialized = false;
+// The number of layers in the EM Calorimeter Barrel, Endcap
+ private int _numbemlayers;
+ private int _numecemlayers;
+// The number of layers in the Hadronic Calorimeter Barrel, Endcap
+ private int _numbhadlayers;
+ private int _numechadlayers;
+// The EM calorimeter hits, by layer in barrel, endcap
+ private List[] _emBLayerHits;
+ private List[] _emECLayerHits;
+// The HAD calorimeter hits, by layer in barrel, endcap
+ private List[] _hadBLayerHits;
+ private List[] _hadECLayerHits;
+// The radii of the barrel calorimeter layers
+ private double[] _emBRadii;
+ private double[] _hadBRadii;
+ private double[] BRadii = new double[100];
+ private double[] ECZs = new double[100];
+// modified Barrel helix swimmer for org.lcsim test
+// private Helix[] _emBSwimmers; //EM
+// private Helix[] _hadBSwimmers; //HAD
+// Z extent of the central barrel calorimeters.
+ private double _embZ; //EM Barrel Z
+ private double[] _emecZ; //EM Endcap Z
+ private double _hadbZ; //HAD barrel z
+ private double[] _hadecZ; // HAD endcap z
+// The central magnetic field strength
+// private double[] _fieldStrength;
+ private double zField;
+ private String _trklist;
+
+ public TrkXPosDriver()
+ {
+ // add arguments if needed
+ }
+
+ protected void process(EventHeader event)
+ {
+ super.process(event); // executes all added drivers
+
+// Initialize things here
+ if(!_initialized)
+ {
+ // setup specific detector stuff here
+ Detector det = event.getDetector();
+// double[] zero = {0, 0, 0};
+ // gets field value at IP (origin) - gives warning - how else to do it?
+// _fieldStrength = det.getFieldMap().getField(zero);
+ // try this
+ Hep3Vector ip = new BasicHep3Vector();
+ zField = det.getFieldMap().getField(ip).z();
+// System.out.println("B Field " + zField + " Tesla");
+
+ // Setup layer counts and distances for barrel, endcap
+ CylindricalCalorimeter emb = ((CylindricalCalorimeter) det.getSubdetectors().get("EMBarrel"));
+ _embZ = emb.getZMin();
+ _numbemlayers = emb.getLayering().getLayerCount();
+// System.out.println("EM Barrel Layers " +_numbemlayers);
+ for (int i=0; i<_numbemlayers; ++i)
+ {
+ BRadii[i]=emb.getLayering().getDistanceToLayerSensorMid(i);
+// System.out.println("EM Barrel Layer Number " +i+ " EM Barrel Radius " +_emBRadii[i]);
+ }
+
+ CylindricalCalorimeter emec = ((CylindricalCalorimeter) det.getSubdetectors().get("EMEndcap"));
+ _numecemlayers = emec.getLayering().getLayerCount();
+// System.out.println("EM EC Layers " +_numecemlayers);
+ for (int i=0; i<_numecemlayers; ++i)
+ {
+ ECZs[i] = emec.getLayering().getDistanceToLayerSensorMid(i);
+// System.out.println("EM Endcap Layer Number " +i+ " EM Endcap Z " +_emecZ[i]);
+ }
+
+ CylindricalCalorimeter hadb = ((CylindricalCalorimeter) det.getSubdetectors().get("HADBarrel"));
+ _hadbZ = hadb.getZMin();
+ _numbhadlayers = hadb.getLayering().getLayerCount();
+// System.out.println("HAD Barrel Layers " +_numbhadlayers);
+ for (int i=0; i<_numbhadlayers; ++i)
+ {
+ BRadii[i+_numbemlayers]=hadb.getLayering().getDistanceToLayerSensorMid(i);
+// System.out.println("HAD Barrel Layer Number " +i+ " HAD Barrel Radius " +_hadBRadii[i]);
+ }
+
+ CylindricalCalorimeter hadec = ((CylindricalCalorimeter) det.getSubdetectors().get("HADEndcap"));
+ _numechadlayers = hadec.getLayering().getLayerCount();
+// System.out.println("HAD Endcap Layers " +_numechadlayers);
+ for (int i=0; i<_numechadlayers; ++i)
+ {
+ ECZs[i+_numecemlayers] = hadec.getLayering().getDistanceToLayerSensorMid(i);
+// System.out.println("HAD Endcap Layer Number " +i+ " HAD Endcap Z " +_hadecZ[i]);
+ }
+
+ _initialized = true;
+ } // end of initialization section
+
+ // Get tracks from event
+ List<Track> evtracks = event.get(Track.class, _trklist); // for perfect (cheated) tracks
+
+ // Define new maps for tracks and links
+ Map<Track, SpacePoint> trkE0map = new HashMap<Track, SpacePoint>(); // Pos at ECAL layer 0
+ Map<Track, SpacePoint> trkEsmmap = new HashMap<Track, SpacePoint>(); // Pos at ECAL shower max (layer 7)
+ Map<Track, SpacePoint> trkH0map = new HashMap<Track, SpacePoint>(); // Pos at HCAL layer 0 (layer 30 in swimmer)
+
+ double[] trmclth = new double[100];
+ double[] trmclph = new double[100];
+ for (Track itr : evtracks)
+ {
+ double trpt = Math.sqrt(itr.getPX()*itr.getPX()+itr.getPY()*itr.getPY());
+ double[] trp = itr.getMomentum();
+ Hep3Vector trp3 = new BasicHep3Vector(trp);
+ double[] trrp = itr.getReferencePoint();
+ double[] trpar = itr.getTrackParameters();
+ double[] tror = new double[3];
+ tror[0] = -trpar[0]*Math.sin(trpar[1])+trrp[0];
+ tror[1] = trpar[0]*Math.cos(trpar[1])+trrp[1];
+ tror[2] = trpar[3]+trrp[2];
+ Hep3Vector tror3 = new BasicHep3Vector(tror);
+ int trq = itr.getCharge();
+// System.out.println("Track Charge " + trq + " Track P " + trp3 + " Origin " + tror3);
+ double TrP = Math.sqrt(itr.getPX()*itr.getPX()+itr.getPY()*itr.getPY()+itr.getPZ()*itr.getPZ());
+ HelixSwimmer tswim = new HelixSwimmer(zField); // assume z-component only
+ // swim track to positions, arguments are momentum, origin, and charge
+ tswim.setTrack(trp3, tror3, trq);
+
+ // get swim distances to selected points (hard coded for now)
+ double tobrad0 = tswim.getDistanceToRadius(BRadii[0]); // layer 0 of ECAL Barrel
+ double toecz0 = tswim.getDistanceToZ(ECZs[0]); // layer 0 of ECAL Endcap
+ double tobrad7 = tswim.getDistanceToRadius(BRadii[7]); // layer 7 of ECAL Barrel
+ double toecz7 = tswim.getDistanceToZ(ECZs[7]); // layer 7 of ECAL Endcap
+ double tobrad30 = tswim.getDistanceToRadius(BRadii[_numbemlayers]); // layer 0 of HCAL Barrel
+ double toecz30 = tswim.getDistanceToZ(ECZs[_numbemlayers]); // layer 0 of HCAL Endcap
+
+ // make map for ECAL layer 0
+ if (tobrad0<Math.abs(toecz0)) // in barrel
+ {
+// SpacePoint trSP = tswim.getPointAtDistance(tobrad0); // old way
+ SpacePoint trSP = tswim.getPointAtLength(tobrad0);
+ trkE0map.put(itr, trSP);
+
+ } else // in endcap
+ {
+ SpacePoint trSP = tswim.getPointAtLength(toecz0);
+ trkE0map.put(itr, trSP);
+ }
+
+ // make map for ECAL layer 7
+ if (tobrad7<Math.abs(toecz7)) // in barrel
+ {
+ SpacePoint trSP = tswim.getPointAtLength(tobrad7);
+ trkEsmmap.put(itr, trSP);
+
+ } else // in endcap
+ {
+ SpacePoint trSP = tswim.getPointAtLength(toecz7);
+ trkEsmmap.put(itr, trSP);
+ }
+
+ // make map for HCAL layer 0
+ if (tobrad30<Math.abs(toecz30)) // in barrel
+ {
+ SpacePoint trSP = tswim.getPointAtLength(tobrad30);
+ trkH0map.put(itr, trSP);
+
+ } else // in endcap
+ {
+ SpacePoint trSP = tswim.getPointAtLength(toecz30);
+ trkH0map.put(itr, trSP);
+ }
+
+ }
+
+ event.put("TrackXE0Map",trkE0map);
+ event.put("TrackXEShMaxMap",trkEsmmap);
+ event.put("TrackXH0Map",trkH0map);
+
+ }
+
+ public void setInputTrackList(String name)
+ {
+ _trklist = name;
+ }
+
+}
+