Print

Print


Commit in lcsim/src/org/lcsim/contrib/SteveMagill on MAIN
TrkXPosDriver.java+215added 1.1


lcsim/src/org/lcsim/contrib/SteveMagill
TrkXPosDriver.java added at 1.1
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;
+    }
+
+}
+
CVSspam 0.2.8