1 package org.lcsim.geometry.util;
2
3 import java.util.HashMap;
4 import java.util.Map;
5 import java.util.regex.Matcher;
6 import java.util.regex.Pattern;
7 import org.lcsim.conditions.ConditionsManager;
8 import org.lcsim.conditions.ConditionsSet;
9 import org.lcsim.conditions.ConditionsConverter;
10 import org.lcsim.geometry.Subdetector;
11
12
13
14
15
16
17
18
19 public class SamplingFractionManager
20 {
21 private static SamplingFractionManager theSamplingFractionManager = new SamplingFractionManager();
22 private ConditionsManager manager;
23
24 private SamplingFractionManager()
25 {
26 manager = ConditionsManager.defaultInstance();
27 manager.registerConditionsConverter(new SamplingFractionConverter());
28 }
29
30 public static SamplingFractionManager defaultInstance()
31 {
32 return theSamplingFractionManager;
33 }
34
35 public double getCorrectedEnergy(double rawEnergy, int layer, Subdetector detector)
36 {
37 SamplingFraction sf = manager.getCachedConditions(SamplingFraction.class,"SamplingFractions/" + detector.getName()).getCachedData();
38 return sf.getCorrectedEnergy(rawEnergy,layer);
39 }
40
41 public double getSamplingFraction(Subdetector detector, int layern)
42 {
43 SamplingFraction sf = manager.getCachedConditions(SamplingFraction.class,"SamplingFractions/" + detector.getName()).getCachedData();
44 return sf.getLayerSamplingFraction(layern);
45 }
46
47 private static class SamplingFraction
48 {
49 private final double defaultSamplingFraction;
50 private final boolean digital;
51 private final Map<Integer,Double> layerMap = new HashMap<Integer,Double>();
52
53 private SamplingFraction(ConditionsSet set)
54 {
55 defaultSamplingFraction = set.getDouble("samplingFraction");
56 digital = set.getBoolean("digital",false);
57 Pattern pattern = Pattern.compile("samplingFraction\\[((\\d+(-\\d+)?)(,\\d+(-\\d+)?)*)\\]");
58 Pattern p2 = Pattern.compile(",?(\\d+)(-(\\d+))?");
59
60 for (Object o : set.keySet())
61 {
62 String key = o.toString();
63
64
65 Matcher matcher = pattern.matcher(key.replaceAll("\\s",""));
66 if (matcher.matches())
67 {
68 double s = set.getDouble(key);
69 String layers = matcher.group(1);
70 Matcher m2 = p2.matcher(layers);
71 while (m2.find())
72 {
73 int start = Integer.parseInt(m2.group(1));
74 int end = m2.group(3) == null ? -1 : Integer.parseInt(m2.group(3));
75 if (end > start)
76 {
77 for (int i=start; i<=end; i++)
78 {
79 layerMap.put(i,s);
80 }
81 }
82 else
83 {
84 layerMap.put(start,s);
85 }
86 }
87 }
88 }
89 }
90 double getCorrectedEnergy(double rawEnergy, int layer)
91 {
92 Double layerSF = layerMap.get(layer);
93 double samplingFraction = layerSF == null ? defaultSamplingFraction : layerSF;
94 return (digital ? 1 : rawEnergy)/samplingFraction;
95 }
96
97 public double getLayerSamplingFraction(int layern)
98 {
99 Double layerSF = layerMap.get(layern);
100 return layerSF == null ? defaultSamplingFraction : layerSF;
101 }
102 }
103 private static class SamplingFractionConverter implements ConditionsConverter<SamplingFraction>
104 {
105 public Class<SamplingFractionManager.SamplingFraction> getType()
106 {
107 return SamplingFraction.class;
108 }
109
110 public SamplingFractionManager.SamplingFraction getData(ConditionsManager manager, String name)
111 {
112 ConditionsSet conditions = manager.getConditions(name);
113 return new SamplingFraction(conditions);
114 }
115 }
116 }