View Javadoc

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   * This is copied from the lcsim class so it is accessible from GeomConverter.
15   *
16   * @author tonyj
17   * @author jeremym
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              // Get rid of embedded whitespace, and match
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 }