View Javadoc

1   package org.lcsim.util.heprep;
2   
3   import hep.graphics.heprep.HepRepFactory;
4   import hep.graphics.heprep.HepRepInstance;
5   import hep.graphics.heprep.HepRepInstanceTree;
6   import hep.graphics.heprep.HepRepType;
7   import hep.graphics.heprep.HepRepTypeTree;
8   import hep.physics.vec.Hep3Vector;
9   
10  import java.util.List;
11  
12  import org.lcsim.constants.Constants;
13  import org.lcsim.event.EventHeader;
14  import org.lcsim.event.EventHeader.LCMetaData;
15  import org.lcsim.event.Track;
16  import org.lcsim.event.TrackState;
17  import org.lcsim.geometry.Detector;
18  import org.lcsim.util.swim.HelixSwimmer;
19  
20  /**
21   * Convert a Track to a Wired representation by swimming it in the B-field using
22   * a helix approximation.
23   * @author tonyj
24   * @author Jeremy McCormick <jeremym@slac.stanford.edu>
25   * @version $Id: TrackConverter.java,v 1.7 2012/10/18 19:32:49 jeremy Exp $
26   */
27  class TrackConverter implements HepRepCollectionConverter {
28  
29      public boolean canHandle(Class k) {
30          return Track.class.isAssignableFrom(k);
31      }
32  
33      public void convert(EventHeader event, List collection, HepRepFactory factory, HepRepTypeTree typeTree, HepRepInstanceTree instanceTree) {
34          try {
35              event.getDetector();
36          } catch (Exception x) {
37              return;
38          }
39          
40          if (collection.size() == 0)
41              return;
42          
43          List<Track> trackList = (List<Track>) collection;
44          Track firstTrack = trackList.get(0);
45          
46          LCMetaData meta = event.getMetaData(collection);
47          String name = meta.getName();
48          Detector detector = event.getDetector();
49  
50          double trackingRMax = detector.getConstants().get("tracking_region_radius").getValue();
51          double trackingZMax = detector.getConstants().get("tracking_region_zmax").getValue();
52  
53          double[] origin = TrackUtil.getOrigin(firstTrack);
54          double[] field = detector.getFieldMap().getField(origin);
55          
56          HelixSwimmer helix = TrackUtil.getHelixSwimmer(trackList, field);
57          //System.out.println("swimming with helix of type " + helix.getClass().getCanonicalName());
58          
59          HepRepType typeX = factory.createHepRepType(typeTree, name);
60          typeX.addAttValue("layer", LCSimHepRepConverter.PARTICLES_LAYER);
61          typeX.addAttValue("drawAs", "Line");
62  
63          typeX.addAttDef("pT", "Transverse momentum", "physics", "");
64          typeX.addAttDef("dedX", "de/Dx", "physics", "GeV");
65          typeX.addAttDef("dedX error", "", "physics", "GeV");
66          typeX.addAttDef("Charge", "", "physics", "");
67          typeX.addAttDef("Chi2", "", "physics", "");
68          typeX.addAttDef("pX", "Momentum X", "physics", "GeV");
69          typeX.addAttDef("pY", "Momentum Y", "physics", "GeV");
70          typeX.addAttDef("pZ", "Momentum Z", "physics", "GeV");
71          typeX.addAttDef("NDF", "Number Degrees Freedom", "physics", "");
72          typeX.addAttDef("Reference Point X", "Reference Point X", "physics", "mm");
73          typeX.addAttDef("Reference Point Y", "Reference Point Y", "physics", "mm");
74          typeX.addAttDef("Reference Point Z", "Reference Point Z", "physics", "mm");
75          typeX.addAttDef("d0", "d0", "physics", "");
76          typeX.addAttDef("phi0", "phi0", "physics", "");
77          typeX.addAttDef("omega", "omega", "physics", "");
78          typeX.addAttDef("z0", "z0", "physics", "");
79          typeX.addAttDef("s", "s", "physics", "");
80  
81          for (Track track : trackList) {
82              
83              helix.setTrack(track);
84              double distanceToCylinder = helix.getDistanceToCylinder(trackingRMax, trackingZMax);
85  
86              TrackState ts = track.getTrackStates().get(0);
87              double[] referencePoint = ts.getReferencePoint();
88              double[] momentum = ts.getMomentum();
89  
90              HepRepInstance instanceX = factory.createHepRepInstance(instanceTree, typeX);
91              double pt = field[2] * Constants.fieldConversion / Math.abs(ts.getParameter(2));
92  
93              instanceX.addAttValue("pT", pt);
94              instanceX.addAttValue("dedX", track.getdEdx());
95              instanceX.addAttValue("dedX error", track.getdEdxError());
96              instanceX.addAttValue("Charge", track.getCharge());
97              instanceX.addAttValue("Chi2", track.getChi2());
98              instanceX.addAttValue("pX", momentum[0]);
99              instanceX.addAttValue("pY", momentum[1]);
100             instanceX.addAttValue("pZ", momentum[2]);
101             instanceX.addAttValue("NDF", track.getNDF());
102             instanceX.addAttValue("Reference Point X", referencePoint[0]);
103             instanceX.addAttValue("Reference Point Y", referencePoint[1]);
104             instanceX.addAttValue("Reference Point Z", referencePoint[2]);
105             instanceX.addAttValue("d0", ts.getParameter(0));
106             instanceX.addAttValue("phi0", ts.getParameter(1));
107             instanceX.addAttValue("omega", ts.getParameter(2));
108             instanceX.addAttValue("z0", ts.getParameter(3));
109             instanceX.addAttValue("s", ts.getParameter(4));
110 
111             double dAlpha = 10; // 1cm
112 
113             for (int k = 0; k < 200; k++) {
114                 double d = k * dAlpha;
115                 if (d > distanceToCylinder)
116                     break;
117                 Hep3Vector point = helix.getPointAtDistance(d);
118                 factory.createHepRepPoint(instanceX, point.x(), point.y(), point.z());
119             }
120         }
121     }       
122 }