View Javadoc

1   /*
2    * HitIdentifier.java
3    *
4    * Created on July 1, 2008, 11:33 AM
5    *
6    */
7   
8   package org.lcsim.fit.helicaltrack;
9   
10  import java.util.ArrayList;
11  import java.util.List;
12  
13  import org.lcsim.detector.DetectorIdentifierHelper;
14  import org.lcsim.detector.IDetectorElement;
15  import org.lcsim.detector.identifier.IIdentifier;
16  import org.lcsim.detector.identifier.IIdentifierHelper;
17  import org.lcsim.event.SimTrackerHit;
18  import org.lcsim.geometry.subdetector.BarrelEndcapFlag;
19  
20  /**
21   *
22   * @author Richard Partridge
23   * @version 1.0
24   */
25  public class HitIdentifier {
26      private List<String> _special;
27      
28      /** Creates a new instance of HitIdentifier */
29      public HitIdentifier() {
30          _special = new ArrayList<String>();
31      }
32      
33      public HitIdentifier(List<String> special) {
34          this();
35          _special.addAll(special);
36      }
37      
38      public String Identifier(IDetectorElement de) {
39          String detname = getName(de);
40          BarrelEndcapFlag beflag = getBarrelEndcapFlag(de);
41          int layer = getLayer(de);
42          return Identifier(detname, layer, beflag);
43      }
44  
45      public String Identifier(SimTrackerHit hit) {
46          String detname = getName(hit);
47          BarrelEndcapFlag beflag = getBarrelEndcapFlag(hit);
48          int layer = getLayer(hit);
49          return Identifier(detname, layer, beflag);
50      }
51  
52      public static String Identifier(String detname, int layer, BarrelEndcapFlag beflag) {
53          String identifier = detname + layer + beflag;
54          return identifier;
55      }
56      
57      public String getName(IDetectorElement de) {
58          //  Find the first level down from the top of the de tree
59          while (de.getParent().getParent() != null) de = de.getParent();
60          //  Find the name of this detector
61          String detname = de.getName();
62          return detname;
63      }
64  
65      public String getName(SimTrackerHit hit) {
66          return hit.getSubdetector().getName();
67      }
68  
69      public int getLayer(IDetectorElement de) {
70          int layer = -1;
71          IIdentifierHelper hlp = de.getIdentifierHelper();
72          if (hlp instanceof DetectorIdentifierHelper) {
73              DetectorIdentifierHelper dehlp = (DetectorIdentifierHelper) hlp;
74              //  Get the identifier
75              IIdentifier id = de.getIdentifier();
76              //  Get the layer number
77              layer = dehlp.getLayerValue(id);
78              //  See if it needs "special" treatment
79              for (String name : _special) {
80                  if (getName(de).equals(name)) {
81                      //  Special layers have stereo layers with distinct layer numbers
82                      //  on the two stereo sensor planes, whereas the seedtracker
83                      //  convention is that both planes have the same layer number
84                      layer /= 2;
85                      break;
86                  }
87              }
88          }
89          return layer;
90      }
91  
92      public int getLayer(SimTrackerHit hit) {
93          return hit.getLayer();
94      }
95  
96      public BarrelEndcapFlag getBarrelEndcapFlag(IDetectorElement de) {
97          BarrelEndcapFlag beflag = BarrelEndcapFlag.UNKNOWN;
98          //  Find the second level down from the top of the de tree
99          while (de.getParent().getParent().getParent() != null) de = de.getParent();
100         //  Get the DetectorIdentifierHelper
101         IIdentifierHelper hlp = de.getIdentifierHelper();
102         if (hlp instanceof DetectorIdentifierHelper) {
103             DetectorIdentifierHelper dehlp = (DetectorIdentifierHelper) hlp;
104             //  Get the identifier
105             IIdentifier id = de.getIdentifier();
106             //  Get the BarrelEndcapFlag
107             if (dehlp.isBarrel(id)) beflag = BarrelEndcapFlag.BARREL;
108             else if (dehlp.isEndcapPositive(id)) beflag = BarrelEndcapFlag.ENDCAP_NORTH;
109             else if (dehlp.isEndcapNegative(id)) beflag = BarrelEndcapFlag.ENDCAP_SOUTH;
110         }
111         return beflag;
112     }
113 
114     public BarrelEndcapFlag getBarrelEndcapFlag(SimTrackerHit hit) {
115         return hit.getBarrelEndcapFlag();
116     }
117 
118     public void setNonStandardLayering(String name) {
119         _special.add(name);
120         return;
121     }
122     
123     public static List<String> getSpecialLayers(String detectorName) {
124         
125         List<String> returnMe = new ArrayList<String>(); 
126         if (detectorName.equals("sid02")) {
127             returnMe.add("TrackerEndcap"); 
128         } else if (detectorName.equals("sid01")) {
129             returnMe.add("TrackerForward");
130             returnMe.add("TrackerEndcap"); 
131         }
132         
133         return returnMe; 
134     }
135     
136 }