Skip to content

Commit 32cdb80

Browse files
authored
Merge pull request #217 from JeffersonLab/iss135
Iss135: create SiliconResolutionModel for use in strip making
2 parents fdc83e2 + be43d72 commit 32cdb80

4 files changed

Lines changed: 153 additions & 98 deletions

File tree

tracking/src/main/java/org/hps/recon/tracking/DataTrackerHitDriver.java

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ public class DataTrackerHitDriver extends Driver {
4949
private double threeClusterErr = clusterErrorMultiplier / 3.0;
5050
private double fourClusterErr = clusterErrorMultiplier / 2.0;
5151
private double fiveClusterErr = clusterErrorMultiplier / 1.0;
52+
// weight the hits in a cluster by charge? (if not, all hits have equal weight)
53+
private boolean useWeights = true;
5254
// Various data lists required by digitization.
5355
private List<String> processPaths = new ArrayList<String>();
5456
private List<IDetectorElement> processDEs = new ArrayList<IDetectorElement>();
@@ -127,6 +129,10 @@ public void setFiveClusterErr(double fiveClusterErr) {
127129
this.fiveClusterErr = fiveClusterErr;
128130
}
129131

132+
public void setUseWeights(boolean useWeights){
133+
this.useWeights = useWeights;
134+
}
135+
130136
/**
131137
* Creates a new instance of TrackerHitDriver.
132138
*/
@@ -180,11 +186,18 @@ public void detectorChanged(Detector detector) {
180186
stripClusterer.setCentralStripAveragingThreshold(clusterCentralStripAveragingThreshold);
181187

182188
// Set the cluster errors.
183-
stripClusterer.SetOneClusterErr(oneClusterErr);
184-
stripClusterer.SetTwoClusterErr(twoClusterErr);
185-
stripClusterer.SetThreeClusterErr(threeClusterErr);
186-
stripClusterer.SetFourClusterErr(fourClusterErr);
187-
stripClusterer.SetFiveClusterErr(fiveClusterErr);
189+
190+
DefaultSiliconResolutionModel model = new DefaultSiliconResolutionModel();
191+
192+
model.setOneClusterErr(oneClusterErr);
193+
model.setTwoClusterErr(twoClusterErr);
194+
model.setThreeClusterErr(threeClusterErr);
195+
model.setFourClusterErr(fourClusterErr);
196+
model.setFiveClusterErr(fiveClusterErr);
197+
model.setUseWeights(useWeights);
198+
199+
stripClusterer.setResolutionModel(model);
200+
188201

189202
// Set the detector to process.
190203
processPaths.add(subdetectorName);
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
package org.hps.recon.tracking;
2+
3+
import java.util.List;
4+
import java.util.Map;
5+
6+
import org.lcsim.detector.tracker.silicon.SiSensor;
7+
import org.lcsim.detector.tracker.silicon.SiSensorElectrodes;
8+
import org.lcsim.detector.tracker.silicon.SiStrips;
9+
10+
import hep.physics.vec.BasicHep3Vector;
11+
import hep.physics.vec.Hep3Vector;
12+
import hep.physics.vec.VecOp;
13+
14+
public class DefaultSiliconResolutionModel implements SiliconResolutionModel{
15+
16+
@Override
17+
public double getMeasuredResolution(List<FittedRawTrackerHit> cluster, SiSensorElectrodes electrodes)
18+
19+
{
20+
double measured_resolution;
21+
22+
double sense_pitch = ((SiSensor) electrodes.getDetectorElement()).getSenseElectrodes(electrodes.getChargeCarrier()).getPitch(0);
23+
24+
// double readout_pitch = electrodes.getPitch(0);
25+
// double noise =
26+
// _readout_chip.getChannel(strip_number).computeNoise(electrodes.getCapacitance(strip_number));
27+
// double signal_expected = (0.000280/DopedSilicon.ENERGY_EHPAIR) *
28+
// ((SiSensor)electrodes.getDetectorElement()).getThickness(); // ~280 KeV/mm for thick Si
29+
// sensors
30+
if (cluster.size() == 1) {
31+
measured_resolution = sense_pitch * _oneClusterErr;
32+
} else if (cluster.size() == 2) {
33+
measured_resolution = sense_pitch * _twoClusterErr;
34+
} else if (cluster.size() == 3) {
35+
measured_resolution = sense_pitch * _threeClusterErr;
36+
} else if (cluster.size() == 4) {
37+
measured_resolution = sense_pitch * _fourClusterErr;
38+
} else {
39+
measured_resolution = sense_pitch * _fiveClusterErr;
40+
}
41+
42+
return measured_resolution;
43+
}
44+
45+
public double getUnmeasuredResolution(List<FittedRawTrackerHit> cluster, SiSensorElectrodes electrodes, Map<FittedRawTrackerHit, Integer> strip_map) {
46+
// Get length of longest strip in hit
47+
double hit_length = 0;
48+
for (FittedRawTrackerHit hit : cluster) {
49+
hit_length = Math.max(hit_length, ((SiStrips) electrodes).getStripLength(strip_map.get(hit)));
50+
}
51+
return hit_length / Math.sqrt(12);
52+
}
53+
54+
55+
//perhaps the best values for these are .19, .12 and .2?
56+
private double _oneClusterErr = 1 / Math.sqrt(12);
57+
private double _twoClusterErr = 1 / 5.;
58+
private double _threeClusterErr = 1 / 3.;
59+
private double _fourClusterErr = 1 / 2.;
60+
private double _fiveClusterErr = 1;
61+
62+
private boolean _useWeights = true;
63+
64+
public void setOneClusterErr(double err) {
65+
_oneClusterErr = err;
66+
}
67+
68+
public void setTwoClusterErr(double err) {
69+
_twoClusterErr = err;
70+
}
71+
72+
public void setThreeClusterErr(double err) {
73+
_threeClusterErr = err;
74+
}
75+
76+
public void setFourClusterErr(double err) {
77+
_fourClusterErr = err;
78+
}
79+
80+
public void setFiveClusterErr(double err) {
81+
_fiveClusterErr = err;
82+
}
83+
84+
public void setUseWeights(boolean useWeights){
85+
_useWeights = useWeights;
86+
}
87+
88+
@Override
89+
public Hep3Vector weightedAveragePosition(List<Double> signals, List<Hep3Vector> positions) {
90+
double total_weight = 0;
91+
Hep3Vector position = new BasicHep3Vector(0, 0, 0);
92+
93+
for (int istrip = 0; istrip < signals.size(); istrip++) {
94+
double signal = signals.get(istrip);
95+
96+
double weight = _useWeights ? signal : 1;
97+
total_weight += weight;
98+
position = VecOp.add(position, VecOp.mult(weight, positions.get(istrip)));
99+
/*if (_debug) {
100+
System.out.println(this.getClass().getSimpleName() + "strip " + istrip + ": signal " + signal + " position " + positions.get(istrip) + " -> total_position " + position.toString() + " ( total charge " + total_charge + ")");
101+
}*/
102+
103+
}
104+
105+
return VecOp.mult(1 / total_weight, position);
106+
}
107+
108+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package org.hps.recon.tracking;
2+
3+
import java.util.List;
4+
import java.util.Map;
5+
6+
import org.lcsim.detector.tracker.silicon.SiSensorElectrodes;
7+
8+
import hep.physics.vec.Hep3Vector;
9+
10+
public interface SiliconResolutionModel {
11+
public double getMeasuredResolution(List<FittedRawTrackerHit> cluster, SiSensorElectrodes electrodes);
12+
public double getUnmeasuredResolution(List<FittedRawTrackerHit> cluster, SiSensorElectrodes electrodes, Map<FittedRawTrackerHit, Integer> strip_map);
13+
public Hep3Vector weightedAveragePosition(List<Double> signals, List<Hep3Vector> positions);
14+
}

tracking/src/main/java/org/hps/recon/tracking/StripMaker.java

Lines changed: 13 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
package org.hps.recon.tracking;
22

33
import hep.physics.matrix.SymmetricMatrix;
4-
import hep.physics.vec.BasicHep3Vector;
54
import hep.physics.vec.Hep3Vector;
6-
import hep.physics.vec.VecOp;
75

86
import java.util.ArrayList;
97
import java.util.HashMap;
@@ -46,14 +44,15 @@ public class StripMaker {
4644
SiTrackerIdentifierHelper _sid_helper;
4745
// Temporary map connecting hits to strip numbers for sake of speed (reset once per sensor)
4846
Map<FittedRawTrackerHit, Integer> _strip_map = new HashMap<FittedRawTrackerHit, Integer>();
49-
double _oneClusterErr = 1 / Math.sqrt(12);
50-
double _twoClusterErr = 1 / 5;
51-
double _threeClusterErr = 1 / 3;
52-
double _fourClusterErr = 1 / 2;
53-
double _fiveClusterErr = 1;
47+
5448

5549
boolean _debug = false;
50+
private SiliconResolutionModel _res_model = new DefaultSiliconResolutionModel();
5651

52+
public void setResolutionModel(SiliconResolutionModel model){
53+
_res_model = model;
54+
}
55+
5756
public StripMaker(ClusteringAlgorithm algo) {
5857
_clustering = algo;
5958
}
@@ -154,25 +153,7 @@ public List<SiTrackerHit> makeHits(SiSensor sensor, SiSensorElectrodes electrode
154153
return hits;
155154
}
156155

157-
public void SetOneClusterErr(double err) {
158-
_oneClusterErr = err;
159-
}
160-
161-
public void SetTwoClusterErr(double err) {
162-
_twoClusterErr = err;
163-
}
164-
165-
public void SetThreeClusterErr(double err) {
166-
_threeClusterErr = err;
167-
}
168-
169-
public void SetFourClusterErr(double err) {
170-
_fourClusterErr = err;
171-
}
172-
173-
public void SetFiveClusterErr(double err) {
174-
_fiveClusterErr = err;
175-
}
156+
176157

177158
public void setCentralStripAveragingThreshold(int max_noaverage_nstrips) {
178159
_max_noaverage_nstrips = max_noaverage_nstrips;
@@ -242,20 +223,9 @@ private Hep3Vector getPosition(List<FittedRawTrackerHit> cluster, SiSensorElectr
242223
System.out.println(this.getClass().getSimpleName() + " Calculate charge weighted mean for " + signals.size() + " signals");
243224
}
244225

245-
double total_charge = 0;
246-
Hep3Vector position = new BasicHep3Vector(0, 0, 0);
247-
248-
for (int istrip = 0; istrip < signals.size(); istrip++) {
249-
double signal = signals.get(istrip);
250-
251-
total_charge += signal;
252-
position = VecOp.add(position, VecOp.mult(signal, positions.get(istrip)));
253-
if (_debug) {
254-
System.out.println(this.getClass().getSimpleName() + "strip " + istrip + ": signal " + signal + " position " + positions.get(istrip) + " -> total_position " + position.toString() + " ( total charge " + total_charge + ")");
255-
}
256-
257-
}
258-
position = VecOp.mult(1 / total_charge, position);
226+
227+
Hep3Vector position = _res_model.weightedAveragePosition(signals, positions);
228+
259229
if (_debug) {
260230
System.out.println(this.getClass().getSimpleName() + " charge weighted position " + position.toString() + " (before trans)");
261231
}
@@ -303,8 +273,8 @@ private double getTime(List<FittedRawTrackerHit> cluster) {
303273

304274
private SymmetricMatrix getCovariance(List<FittedRawTrackerHit> cluster, SiSensorElectrodes electrodes) {
305275
SymmetricMatrix covariance = new SymmetricMatrix(3);
306-
covariance.setElement(0, 0, Math.pow(getMeasuredResolution(cluster, electrodes), 2));
307-
covariance.setElement(1, 1, Math.pow(getUnmeasuredResolution(cluster, electrodes), 2));
276+
covariance.setElement(0, 0, Math.pow(_res_model.getMeasuredResolution(cluster, electrodes), 2));
277+
covariance.setElement(1, 1, Math.pow(_res_model.getUnmeasuredResolution(cluster, electrodes, _strip_map), 2));
308278
covariance.setElement(2, 2, 0.0);
309279

310280
SymmetricMatrix covariance_global = electrodes.getLocalToGlobal().transformed(covariance);
@@ -329,57 +299,7 @@ private SymmetricMatrix getCovariance(List<FittedRawTrackerHit> cluster, SiSenso
329299
// return new SymmetricMatrix((Matrix)covariance_global);
330300
}
331301

332-
private double getMeasuredResolution(List<FittedRawTrackerHit> cluster, SiSensorElectrodes electrodes) // should
333-
// replace
334-
// this
335-
// by
336-
// a
337-
// ResolutionModel
338-
// class
339-
// that
340-
// gives
341-
// expected
342-
// resolution.
343-
// This
344-
// could
345-
// be
346-
// a
347-
// big
348-
// job.
349-
{
350-
double measured_resolution;
351-
352-
double sense_pitch = ((SiSensor) electrodes.getDetectorElement()).getSenseElectrodes(electrodes.getChargeCarrier()).getPitch(0);
353-
354-
// double readout_pitch = electrodes.getPitch(0);
355-
// double noise =
356-
// _readout_chip.getChannel(strip_number).computeNoise(electrodes.getCapacitance(strip_number));
357-
// double signal_expected = (0.000280/DopedSilicon.ENERGY_EHPAIR) *
358-
// ((SiSensor)electrodes.getDetectorElement()).getThickness(); // ~280 KeV/mm for thick Si
359-
// sensors
360-
if (cluster.size() == 1) {
361-
measured_resolution = sense_pitch * _oneClusterErr;
362-
} else if (cluster.size() == 2) {
363-
measured_resolution = sense_pitch * _twoClusterErr;
364-
} else if (cluster.size() == 3) {
365-
measured_resolution = sense_pitch * _threeClusterErr;
366-
} else if (cluster.size() == 4) {
367-
measured_resolution = sense_pitch * _fourClusterErr;
368-
} else {
369-
measured_resolution = sense_pitch * _fiveClusterErr;
370-
}
371-
372-
return measured_resolution;
373-
}
374-
375-
private double getUnmeasuredResolution(List<FittedRawTrackerHit> cluster, SiSensorElectrodes electrodes) {
376-
// Get length of longest strip in hit
377-
double hit_length = 0;
378-
for (FittedRawTrackerHit hit : cluster) {
379-
hit_length = Math.max(hit_length, ((SiStrips) electrodes).getStripLength(_strip_map.get(hit)));
380-
}
381-
return hit_length / Math.sqrt(12);
382-
}
302+
383303

384304
private double getEnergy(List<FittedRawTrackerHit> cluster) {
385305
double total_charge = 0.0;

0 commit comments

Comments
 (0)