1 package org.lcsim.recon.util;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 import hep.physics.vec.BasicHep3Vector;
19 import hep.physics.vec.Hep3Vector;
20
21 import java.util.List;
22 import java.util.Set;
23 import java.util.logging.Level;
24
25 import org.lcsim.detector.IDetectorElement;
26 import org.lcsim.event.EventHeader;
27 import org.lcsim.event.RawTrackerHit;
28 import org.lcsim.event.Track;
29 import org.lcsim.event.TrackerHit;
30 import org.lcsim.event.base.BaseTrack;
31 import org.lcsim.geometry.Detector;
32 import org.lcsim.geometry.compact.Subdetector;
33 import org.lcsim.util.Driver;
34
35 public class TrackSubdetectorHitNumbersDriver extends Driver {
36
37 protected String trackCollection;
38 protected IDetectorElement siVertexEndcapIDetectorElement;
39 protected IDetectorElement siVertexBarrelIDetectorElement;
40 protected IDetectorElement siTrackerForwardIDetectorElement;
41
42 @Override
43 protected void startOfData() {
44 trackCollection = "Tracks";
45 }
46
47 public void setTrackCollection(String trackCollection) {
48 this.trackCollection = trackCollection;
49 }
50
51 @Override
52 protected void detectorChanged(Detector detector) {
53
54 Set<String> subDetectorNames = detector.getSubdetectorNames();
55
56 if( !(subDetectorNames.contains("SiVertexEndcap") && subDetectorNames.contains("SiTrackerForward") && subDetectorNames.contains("SiVertexBarrel")) ){
57 throw new RuntimeException("The detector must contain subdetectors named SiVertexBarrel, SiVertexEndcap and SiTrackerForward otherwise the \"" + this.getName() + "\" driver will fail.");
58 }
59
60 Subdetector siVertexEndcapSubdetector = detector.getSubdetector("SiVertexEndcap");
61 Subdetector siTrackerForwardSubdetector = detector.getSubdetector("SiTrackerForward");
62 Subdetector siVertexBarrelSubdetector = detector.getSubdetector("SiVertexBarrel");
63
64 this.siVertexEndcapIDetectorElement = siVertexEndcapSubdetector.getDetectorElement();
65 this.siTrackerForwardIDetectorElement = siTrackerForwardSubdetector.getDetectorElement();
66 this.siVertexBarrelIDetectorElement = siVertexBarrelSubdetector.getDetectorElement();
67 }
68
69 @Override
70 protected void process(EventHeader event) {
71
72
73 List<Track> tracks = event.get(Track.class, trackCollection);
74
75
76 for (Track track : tracks) {
77 List<TrackerHit> hits = track.getTrackerHits();
78
79 Integer number_vertex_barrel_hits = 0;
80 Integer number_vertex_disk_hits = 0;
81 Integer number_tracker_hits = 0;
82
83
84 for (TrackerHit hit : hits) {
85 if (hit.getType() == 1) {
86 Hep3Vector hitPosition = new BasicHep3Vector(hit.getPosition());
87
88 List<RawTrackerHit> rawTrackerHits = hit.getRawHits();
89
90 if(rawTrackerHits.size() < 1){
91 throw new RuntimeException("A tracker hit was encountered with no raw tracker hits associated");
92 }
93
94 RawTrackerHit firstRawTrackerHit = rawTrackerHits.get(0);
95 IDetectorElement trackerHitIDetectorElement = firstRawTrackerHit.getDetectorElement();
96
97 if( this.siVertexBarrelIDetectorElement.isDescendant(trackerHitIDetectorElement) ){
98 number_vertex_barrel_hits++;
99 }
100 else if( this.siVertexEndcapIDetectorElement.isDescendant(trackerHitIDetectorElement) ){
101 number_vertex_disk_hits++;
102 }
103 else if (this.siTrackerForwardIDetectorElement.isDescendant(trackerHitIDetectorElement)){
104 number_tracker_hits++;
105 }else{
106 this.getLogger().log(Level.WARNING, "A vertex detector hit was found not in the vertex barrel, not in the vertex endcap and not in the tracker forward. This is probably a problem.");
107 }
108 }
109 else if(hit.getType() == 2 || hit.getType() == 3){
110 number_tracker_hits++;
111 }
112
113 }
114
115 int[] subdetector_hits;
116 subdetector_hits = new int[12];
117
118
119 subdetector_hits[0] = number_vertex_barrel_hits;
120 subdetector_hits[1] = number_vertex_disk_hits;
121 subdetector_hits[2] = 0;
122 subdetector_hits[3] = number_tracker_hits;
123 subdetector_hits[4] = 0;
124 subdetector_hits[5] = 0;
125 subdetector_hits[6] = number_vertex_barrel_hits;
126 subdetector_hits[7] = number_vertex_disk_hits;
127 subdetector_hits[8] = 0;
128 subdetector_hits[9] = number_tracker_hits;
129 subdetector_hits[10] = 0;
130 subdetector_hits[11] = 0;
131
132 ((BaseTrack)track).setSubdetectorHitNumbers(subdetector_hits);
133 }
134
135 }
136 }