View Javadoc

1   package org.lcsim.recon.util;
2   
3   // This driver fills the vector of subdetector hit numbers for each track
4   // according to the convention used by ILD. At the moment this
5   // information is used by the LCFIPlus flavour tagging package.
6   //
7   // WARNING: This code is dependent on the detector geometry and was
8   // only tested for the sidloi3 model!
9   //
10  // Specifically it requires the "SiVertexEndcap","SiVertexBarrel" and "SiTrackerForward" subdetectors to be present
11  // It will almost certainly do the wrong thing if your detector is too unlike sidloi3
12  //
13  // Changed by Oliver Reardon-Smith
14  // Last change 29/08/2014
15  //
16  // Author: Philipp Roloff
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          // get all tracks
73          List<Track> tracks = event.get(Track.class, trackCollection);
74  
75  	// loop over all tracks
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              // loop over all hits
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)){ //for some reason tracker forward hits come labelled with 1
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             } // end loop over all hits
114 
115             int[] subdetector_hits;
116             subdetector_hits = new int[12];
117 
118             // fill hit numbers in ILD style array
119             subdetector_hits[0] = number_vertex_barrel_hits; // "VTX"
120             subdetector_hits[1] = number_vertex_disk_hits; // "FTD"
121             subdetector_hits[2] = 0; // "SIT"
122             subdetector_hits[3] = number_tracker_hits; // "TPC"
123             subdetector_hits[4] = 0; // "SET"
124             subdetector_hits[5] = 0; // "ETD"
125             subdetector_hits[6] = number_vertex_barrel_hits; // "VTX"
126             subdetector_hits[7] = number_vertex_disk_hits; // "FTD"
127             subdetector_hits[8] = 0; // "SIT"
128             subdetector_hits[9] = number_tracker_hits; // "TPC"
129             subdetector_hits[10] = 0; // "SET"
130             subdetector_hits[11] = 0; // "ETD"
131 
132             ((BaseTrack)track).setSubdetectorHitNumbers(subdetector_hits);
133         }
134 
135     }
136 }