View Javadoc

1   package org.lcsim.recon.tracking.vsegment.mctruth;
2   
3   import java.util.*;
4   
5   import hep.physics.vec.BasicHep3Vector;
6   import hep.physics.vec.Hep3Vector;
7   import org.lcsim.event.MCParticle;
8   import org.lcsim.event.SimTrackerHit;
9   
10  import org.lcsim.recon.tracking.vsegment.hit.DigiTrackerHit;
11  
12  /**
13   * Group of {@link SimTrackerHit} objects created in a single sensor-particle crossing.
14   *
15   * @author D. Onoprienko
16   * @version $Id: SimGroup.java,v 1.1 2008/12/06 21:53:44 onoprien Exp $
17   */
18  public class SimGroup {
19    
20  // -- Constructors :  ----------------------------------------------------------
21    
22    public SimGroup(Collection<SimTrackerHit> simTrackerHits, Collection<DigiTrackerHit> digiTrackerHits) {
23      _simList = new ArrayList<SimTrackerHit>(simTrackerHits.size());
24      _simList.addAll(simTrackerHits);
25      Collections.sort(_simList, _compSimHit);
26      _digiList = new ArrayList<DigiTrackerHit>(digiTrackerHits.size());
27      _digiList.addAll(digiTrackerHits);
28      Collections.sort(_digiList);
29    }
30    
31  // -- Getters :  ---------------------------------------------------------------
32    
33    /** Returns <tt>true</tt> if this group contains the given <tt>SimTrackerHit</tt>. */
34    public boolean contains(SimTrackerHit hit) {return _simList.contains(hit);}
35    
36    /** Returns <tt>true</tt> if the diven elemental <tt>DigiTrackerHit</tt> was produced from this group. */
37    public boolean contains(DigiTrackerHit hit) {return _digiList.contains(hit);}
38    
39    /** Returns an average energy deposition weighted position of <tt>SimTrackerHits</tt> in this group. */
40    public Hep3Vector getPosition() {
41      double[] pos = {0.,0.,0.};
42      double sig = 0.;
43      double totalSig = getSignal();
44      for (SimTrackerHit hit : _simList) {
45        double[] p = hit.getPoint();
46        double s = (totalSig > Float.MIN_VALUE) ? hit.getdEdx() : 1.;
47        for (int i=0; i<3; i++) pos[i] += p[i]*s;
48        sig += s;
49      }
50      return new BasicHep3Vector(pos[0]/sig, pos[1]/sig, pos[2]/sig);
51    }
52    
53    /** Returns combined energy deposition of all <tt>SimTrackerHits</tt> in this group. */
54    public double getSignal() {
55      double sig = 0.;
56      for (SimTrackerHit hit : _simList) {
57        sig += hit.getdEdx();
58      }
59      return sig;
60    }
61    
62    /** Returns average time for <tt>SimTrackerHits</tt> in this group. */
63    public double getTime() {
64      double time = 0.;
65      for (SimTrackerHit hit : _simList) {
66        time += hit.getTime();
67      }
68      time /= _simList.size();
69      return time;
70    }
71    
72    /** Returns <tt>MCParticle</tt> that produced <tt>SimTrackerHits</tt> in this group. */
73    public MCParticle getMCParticle() {
74      return _simList.get(0).getMCParticle();
75    }
76    
77    /** Returns a list of <tt>SimTrackerHits</tt> in this group. */
78    public List<SimTrackerHit> getSimTrackerHits() {return _simList;}
79    
80    /** Returns a list of elemental <tt>DigiTrackerHit</tt> produced from <tt>SimTrackerHits</tt> in this group. */
81    public List<DigiTrackerHit> getDigiTrackerHits() {return _digiList;}
82    
83  // -- Private parts :  ---------------------------------------------------------
84    
85    ArrayList<SimTrackerHit> _simList;
86    ArrayList<DigiTrackerHit> _digiList;
87    
88    static Comparator<SimTrackerHit> _compSimHit = new Comparator<SimTrackerHit>() {
89      public int compare(SimTrackerHit s1, SimTrackerHit s2) {
90        return (int)Math.signum(s1.getTime() - s2.getTime());
91      }
92    };
93  }