1
2
3
4
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
23
24
25 public class HitIdentifier {
26 private List<String> _special;
27
28
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
59 while (de.getParent().getParent() != null) de = de.getParent();
60
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
75 IIdentifier id = de.getIdentifier();
76
77 layer = dehlp.getLayerValue(id);
78
79 for (String name : _special) {
80 if (getName(de).equals(name)) {
81
82
83
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
99 while (de.getParent().getParent().getParent() != null) de = de.getParent();
100
101 IIdentifierHelper hlp = de.getIdentifierHelper();
102 if (hlp instanceof DetectorIdentifierHelper) {
103 DetectorIdentifierHelper dehlp = (DetectorIdentifierHelper) hlp;
104
105 IIdentifier id = de.getIdentifier();
106
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 }