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
14
15
16
17
18 public class SimGroup {
19
20
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
32
33
34 public boolean contains(SimTrackerHit hit) {return _simList.contains(hit);}
35
36
37 public boolean contains(DigiTrackerHit hit) {return _digiList.contains(hit);}
38
39
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
54 public double getSignal() {
55 double sig = 0.;
56 for (SimTrackerHit hit : _simList) {
57 sig += hit.getdEdx();
58 }
59 return sig;
60 }
61
62
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
73 public MCParticle getMCParticle() {
74 return _simList.get(0).getMCParticle();
75 }
76
77
78 public List<SimTrackerHit> getSimTrackerHits() {return _simList;}
79
80
81 public List<DigiTrackerHit> getDigiTrackerHits() {return _digiList;}
82
83
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 }