2 added + 4 removed + 6 modified, total 12 files
lcsim/src/org/lcsim/recon/tracking/digitization/sistripsim
diff -N Clusterer.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ Clusterer.java 24 Apr 2009 00:16:51 -0000 1.1
@@ -0,0 +1,37 @@
+/*
+ * Clusterer.java
+ *
+ * Created on April 2, 2008, 6:51 AM
+ *
+ * To change this template, choose Tools | Template Manager
+ * and open the template in the editor.
+ */
+
+package org.lcsim.recon.tracking.digitization.sistripsim;
+
+import java.util.List;
+import org.lcsim.detector.IDetectorElement;
+import org.lcsim.detector.tracker.silicon.SiSensor;
+import org.lcsim.detector.tracker.silicon.SiSensorElectrodes;
+import org.lcsim.event.RawTrackerHit;
+
+/**
+ *
+ * @author tknelson
+ */
+public interface Clusterer
+{
+ public String getName();
+
+ public double getSeedThreshold();
+
+ public double getNeighborThreshold();
+
+ public double getClusterThreshold();
+
+ public List<SiTrackerHit> makeHits(IDetectorElement detector);
+
+ public List<SiTrackerHit> makeHits(SiSensor sensor);
+
+ public List<SiTrackerHit> makeHits(SiSensorElectrodes electrodes, List<RawTrackerHit> hits);
+}
lcsim/src/org/lcsim/recon/tracking/digitization/sistripsim
diff -N PixelHitMaker.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ PixelHitMaker.java 24 Apr 2009 00:16:51 -0000 1.1
@@ -0,0 +1,493 @@
+/*
+ * StripHitMaker.java
+ *
+ * Created on September 26, 2007, 1:57 PM
+ *
+ * To change this template, choose Tools | Template Manager
+ * and open the template in the editor.
+ */
+
+package org.lcsim.recon.tracking.digitization.sistripsim;
+
+import hep.physics.matrix.SymmetricMatrix;
+import hep.physics.vec.BasicHep3Vector;
+import hep.physics.vec.Hep3Vector;
+import hep.physics.vec.VecOp;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.Map.Entry;
+
+import org.lcsim.detector.IDetectorElement;
+import org.lcsim.detector.IReadout;
+import org.lcsim.detector.identifier.IIdentifier;
+import org.lcsim.detector.tracker.silicon.ChargeCarrier;
+import org.lcsim.detector.tracker.silicon.DopedSilicon;
+import org.lcsim.detector.tracker.silicon.SiPixels;
+import org.lcsim.detector.tracker.silicon.SiSensor;
+import org.lcsim.detector.tracker.silicon.SiSensorElectrodes;
+import org.lcsim.detector.tracker.silicon.SiStrips;
+import org.lcsim.detector.tracker.silicon.SiTrackerIdentifierHelper;
+import org.lcsim.event.RawTrackerHit;
+import org.lcsim.event.SimTrackerHit;
+
+/**
+ *
+ * @author tknelson
+ */
+public class PixelHitMaker implements Clusterer
+{
+
+ private static String _NAME = "PixelClusterer";
+
+ // Thresholds
+ double _seed_threshold = 4; // to seed a cluster
+ double _neighbor_threshold = 2; // to add to a cluster
+ double _cluster_threshold = 3; // to make a cluster (noise of channels is summed)
+
+ // Absolute maximum cluster size
+ int _max_cluster_npixels = 10;
+
+ // Readout chip needed to decode hit information
+ ReadoutChip _readout_chip;
+
+ // Sensor simulation needed to correct for Lorentz drift
+ SiSensorSim _simulation;
+
+ // Identifier helper (reset once per sensor)
+ SiTrackerIdentifierHelper _sid_helper;
+
+ // Temporary map connecting hits to pixel numbers for sake of speed (reset once per sensor)
+ Map<RawTrackerHit,Integer> _pixel_map = new HashMap<RawTrackerHit,Integer>();
+
+ /** Creates a new instance of Tracker1DHitMaker */
+ public PixelHitMaker(SiSensorSim simulation, ReadoutChip readout_chip)
+ {
+ _simulation = simulation;
+ _readout_chip = readout_chip;
+
+ _readout_chip.setClusterer(this);
+ }
+
+ // Settings for Tracker1DHitMaker
+ public void setSeedThreshold(double nsigma)
+ {
+ _seed_threshold = nsigma;
+ }
+
+ public void setNeigborThreshold(double nsigma)
+ {
+ _neighbor_threshold = nsigma;
+ }
+
+ public void setClusterThreshold(double nsigma)
+ {
+ _cluster_threshold = nsigma;
+ }
+
+ public void setMaxClusterSize(int max_cluster_npixels)
+ {
+ _max_cluster_npixels = max_cluster_npixels;
+ }
+
+ public String getName()
+ {
+ return _NAME;
+ }
+
+ public double getSeedThreshold()
+ {
+ return _seed_threshold;
+ }
+
+ public double getNeighborThreshold()
+ {
+ return _neighbor_threshold;
+ }
+
+ public double getClusterThreshold()
+ {
+ return _cluster_threshold;
+ }
+
+ // Make hits for all sensors within a DetectorElement
+ public List<SiTrackerHit> makeHits(IDetectorElement detector)
+ {
+ System.out.println("makeHits(IDetectorElement): " + detector.getName());
+ List<SiTrackerHit> hits = new ArrayList<SiTrackerHit>();
+ List<SiSensor> sensors = detector.findDescendants(SiSensor.class);
+
+ // Loop over all sensors
+ for (SiSensor sensor : sensors)
+ {
+ if (sensor.hasPixels())
+ {
+ hits.addAll(makeHits(sensor));
+ }
+ }
+
+ // Return hit list
+ return hits;
+ }
+
+
+ // Make hits for a sensor
+ public List<SiTrackerHit> makeHits(SiSensor sensor)
+ {
+
+ //System.out.println("makeHits: " + sensor.getName());
+
+ List<SiTrackerHit> hits = new ArrayList<SiTrackerHit>();
+
+ // Get SiTrackerIdentifierHelper for this sensor and refresh the pixel map used to increase speed
+ _sid_helper = (SiTrackerIdentifierHelper)sensor.getIdentifierHelper();
+ _pixel_map.clear();
+
+ // Get hits for this sensor
+ IReadout ro = sensor.getReadout();
+ List<RawTrackerHit> raw_hits = ro.getHits(RawTrackerHit.class);
+
+ Map<SiSensorElectrodes,List<RawTrackerHit>> electrode_hits = new HashMap<SiSensorElectrodes,List<RawTrackerHit>>();
+
+ for (RawTrackerHit raw_hit : raw_hits)
+ {
+
+ // get id and create pixel map, get electrodes.
+ IIdentifier id = raw_hit.getIdentifier();
+ _pixel_map.put(raw_hit,_sid_helper.getElectrodeValue(id));
+
+ // Get electrodes and check that they are pixels
+ //System.out.println("proc raw hit from: " + DetectorElementStore.getInstance().find(raw_hit.getIdentifier()).get(0).getName());
+ ChargeCarrier carrier = ChargeCarrier.getCarrier(_sid_helper.getSideValue(id));
+ SiSensorElectrodes electrodes = ((SiSensor)raw_hit.getDetectorElement()).getReadoutElectrodes(carrier);
+ if ( !(electrodes instanceof SiPixels) ) continue;
+
+ if (electrode_hits.get(electrodes) == null)
+ {
+ electrode_hits.put(electrodes,new ArrayList<RawTrackerHit>());
+ }
+
+ electrode_hits.get(electrodes).add(raw_hit);
+ }
+
+ for (Entry entry : electrode_hits.entrySet())
+ {
+ hits.addAll(makeHits((SiPixels)entry.getKey(),(List<RawTrackerHit>)entry.getValue()));
+ }
+
+ return hits;
+ }
+
+
+ // Private methods
+ //=========================
+
+ // Make hits for an electrode
+ public List<SiTrackerHit> makeHits(SiSensorElectrodes electrodes, List<RawTrackerHit> raw_hits)
+ {
+
+// System.out.println("Clustering electrodes: "+electrodes_id);
+
+ List<SiTrackerHit> hits = new ArrayList<SiTrackerHit>();
+
+ List<RawTrackerHit> unclustered_rawhits = new ArrayList<RawTrackerHit>(raw_hits);
+
+ for (RawTrackerHit raw_hit : raw_hits)
+ {
+
+ int pixel_number = _pixel_map.get(raw_hit);
+ double signal = _readout_chip.decodeCharge(raw_hit);
+ double noise = _readout_chip.getChannel(pixel_number).computeNoise(electrodes.getCapacitance(pixel_number));
+
+ if (signal/noise > _seed_threshold && unclustered_rawhits.contains(raw_hit))
+ {
+
+// System.out.println("Creating new cluster, # Raw hits on electrodes is: "+hits.size());
+
+ List<RawTrackerHit> cluster = new ArrayList<RawTrackerHit>();
+ List<RawTrackerHit> clustered_hits = new ArrayList<RawTrackerHit>();
+
+ clustered_hits.add(raw_hit);
+
+ while (clustered_hits.size() != 0)
+ {
+ cluster.addAll(clustered_hits);
+ unclustered_rawhits.removeAll(clustered_hits);
+ clustered_hits = neighborHits(clustered_hits,unclustered_rawhits,electrodes);
+
+// System.out.println(" Cluster size: "+cluster.size());
+// System.out.println(" # Unclustered hits: "+unclustered_hits.size());
+// System.out.println(" # neighbors found: "+clustered_hits.size());
+ }
+
+// if (cluster.size() > 10)
+// {
+// System.out.println("Cluster size: "+cluster.size());
+// }
+
+ // Make a TrackerHit from the cluster if it meets max cluster size requirement
+ if (cluster.size() <= _max_cluster_npixels)
+ {
+ SiTrackerHitPixel hit = makeTrackerHit(cluster,electrodes);
+
+ // Add to readout and to list of hits
+ ((SiSensor)electrodes.getDetectorElement()).getReadout().addHit(hit);
+ hits.add(hit);
+ }
+
+
+ }
+ }
+
+ return hits;
+ }
+
+
+ // Find the hits neigboring a cluster
+ private List<RawTrackerHit> neighborHits(List<RawTrackerHit> clustered_hits, List<RawTrackerHit> unclustered_hits,
+ SiSensorElectrodes electrodes)
+ {
+ List<RawTrackerHit> neighbor_hits = new ArrayList<RawTrackerHit>();
+
+ for (RawTrackerHit seed_hit : clustered_hits)
+ {
+ Set<Integer> neighbor_cells = electrodes.getNearestNeighborCells(_pixel_map.get(seed_hit));
+ for (RawTrackerHit hit : unclustered_hits)
+ {
+ int pixel_number = _pixel_map.get(hit);
+ double signal = _readout_chip.decodeCharge(hit);
+ double noise = _readout_chip.getChannel(pixel_number).computeNoise(electrodes.getCapacitance(pixel_number));
+
+ if (neighbor_cells.contains(_pixel_map.get(hit)) && signal/noise > _neighbor_threshold)
+ {
+ neighbor_hits.add(hit);
+ }
+ }
+ }
+ return neighbor_hits;
+ }
+
+
+ //Make the hit
+ private SiTrackerHitPixel makeTrackerHit(List<RawTrackerHit> cluster, SiSensorElectrodes electrodes)
+ {
+ Hep3Vector position = getPosition(cluster,electrodes);
+ SymmetricMatrix covariance = getCovariance(cluster,electrodes);
+ double time = getTime(cluster);
+ double energy = getEnergy(cluster);
+ TrackerHitType type = new TrackerHitType(TrackerHitType.CoordinateSystem.GLOBAL,TrackerHitType.MeasurementType.PIXEL);
+
+ SiTrackerHitPixel hit = new SiTrackerHitPixel(position, covariance, energy, time, cluster, type);
+ return hit;
+ }
+
+
+ private List<SimTrackerHit> getSimulatedHits(List<RawTrackerHit> cluster)
+ {
+ Set<SimTrackerHit> simulated_hits = new HashSet<SimTrackerHit>();
+ for (RawTrackerHit hit : cluster)
+ {
+ simulated_hits.addAll(hit.getSimTrackerHits());
+ }
+ return new ArrayList<SimTrackerHit>(simulated_hits);
+ }
+
+
+ private Hep3Vector getPosition(List<RawTrackerHit> cluster, SiSensorElectrodes electrodes)
+ {
+ List<Double> signals = new ArrayList<Double>();
+ List<Hep3Vector> positions = new ArrayList<Hep3Vector>();
+
+ for (RawTrackerHit hit : cluster)
+ {
+ signals.add(_readout_chip.decodeCharge(hit));
+ positions.add(electrodes.getCellPosition(_pixel_map.get(hit)) );
+ }
+
+ double total_charge = 0;
+ Hep3Vector position = new BasicHep3Vector(0,0,0);
+
+ for (int ipixel = 0; ipixel < signals.size(); ipixel++)
+ {
+ double signal = signals.get(ipixel);
+
+ total_charge += signal;
+ position = VecOp.add(position,VecOp.mult(signal,positions.get(ipixel)));
+ }
+ position = VecOp.mult(1/total_charge,position);
+
+// double total_charge = 0;
+// Hep3Vector position = new BasicHep3Vector(0,0,0);
+//
+// for (RawTrackerHit hit : cluster)
+// {
+// int strip_number = _strip_map.get(hit);
+// double signal = _readout_chip.decodeCharge(hit);
+//
+// total_charge += signal;
+// position = VecOp.add(position,VecOp.mult(signal,((SiStrips)electrodes).getStripCenter(strip_number)));
+// }
+// position = VecOp.mult(1/total_charge,position);
+
+ // Put position in sensor coordinates
+ electrodes.getParentToLocal().inverse().transform(position);
+
+// System.out.println("Position \n"+position);
+
+ // Swim position back through lorentz drift direction to midpoint between bias surfaces
+ _simulation.setSensor((SiSensor)electrodes.getDetectorElement());
+ _simulation.lorentzCorrect(position,electrodes.getChargeCarrier());
+
+// System.out.println("Lorentz corrected position \n"+position);
+
+ // return position in global coordinates
+ return ((SiSensor)electrodes.getDetectorElement()).getGeometry().getLocalToGlobal().transformed(position);
+// return electrodes.getLocalToGlobal().transformed(position);
+ }
+
+
+ private double getTime(List<RawTrackerHit> cluster)
+ {
+ int time_sum = 0;
+ int signal_sum = 0;
+
+ for (RawTrackerHit hit : cluster)
+ {
+
+ int pixel_number = _pixel_map.get(hit);
+ double signal = _readout_chip.decodeCharge(hit);
+ double time = _readout_chip.decodeTime(hit);
+
+ time_sum += time_sum * signal;
+ signal_sum += signal;
+
+ }
+ return (double)time_sum/(double)signal_sum;
+ }
+
+
+ private SymmetricMatrix getCovariance(List<RawTrackerHit> cluster, SiSensorElectrodes electrodes)
+ {
+
+ SymmetricMatrix covariance = new SymmetricMatrix(3);
+ covariance.setElement( 0, 0, Math.pow( getXResolution(cluster, electrodes), 2 ) );
+ covariance.setElement( 1, 1, Math.pow( getYResolution(cluster, electrodes), 2 ) );
+ covariance.setElement( 2, 2, 0.0);
+
+ SymmetricMatrix covariance_global = electrodes.getLocalToGlobal().transformed(covariance);
+
+// System.out.println("Global covariance matrix: \n"+covariance_global);
+
+ return covariance_global;
+
+// BasicHep3Matrix rotation_matrix = (BasicHep3Matrix)electrodes.getLocalToGlobal().getRotation().getRotationMatrix();
+// BasicHep3Matrix rotation_matrix_transposed = new BasicHep3Matrix(rotation_matrix);
+// rotation_matrix_transposed.transpose();
+//
+//// System.out.println("Rotation matrix: \n"+rotation_matrix);
+//// System.out.println("Rotation matrix transposed: \n"+rotation_matrix_transposed);
+//// System.out.println("Local covariance matrix: \n"+covariance);
+//
+// BasicHep3Matrix covariance_global = (BasicHep3Matrix)VecOp.mult(rotation_matrix,VecOp.mult(covariance,rotation_matrix_transposed));
+//
+//// System.out.println("Global covariance matrix: \n"+covariance_global);
+//
+// return new SymmetricMatrix((Matrix)covariance_global);
+ }
+
+ private double getXResolution(List<RawTrackerHit> cluster, SiSensorElectrodes electrodes)
+ {
+
+ double measured_resolution;
+
+ Set<Integer> rows = new HashSet<Integer>();
+ for (RawTrackerHit hit : cluster)
+ {
+ rows.add(electrodes.getRowNumber(_pixel_map.get(hit)));
+ }
+
+ int cluster_width = rows.size();
+ double sense_pitch = ((SiSensor)electrodes.getDetectorElement()).getSenseElectrodes(electrodes.getChargeCarrier()).getPitch(0);
+
+ if (cluster_width == 1)
+ {
+ measured_resolution = sense_pitch / Math.sqrt(12);
+ }
+ else if (cluster_width == 2)
+ {
+ measured_resolution = sense_pitch / 5;
+ }
+ else if (cluster_width == 3)
+ {
+ measured_resolution = sense_pitch / 3;
+ }
+ else if (cluster_width == 4)
+ {
+ measured_resolution = sense_pitch / 2;
+ }
+ else
+ {
+ measured_resolution = sense_pitch;
+ }
+
+ return measured_resolution;
+
+ }
+
+ private double getYResolution(List<RawTrackerHit> cluster, SiSensorElectrodes electrodes)
+ {
+
+ double measured_resolution;
+
+ Set<Integer> columns = new HashSet<Integer>();
+ for (RawTrackerHit hit : cluster)
+ {
+ columns.add(electrodes.getColumnNumber(_pixel_map.get(hit)));
+ }
+
+ int cluster_width = columns.size();
+ double sense_pitch = ((SiSensor) electrodes.getDetectorElement()).getSenseElectrodes(electrodes.getChargeCarrier()).getPitch(0);
+
+ if (cluster_width == 1)
+ {
+ measured_resolution = sense_pitch / Math.sqrt(12);
+ } else if (cluster_width == 2)
+ {
+ measured_resolution = sense_pitch / 5;
+ } else if (cluster_width == 3)
+ {
+ measured_resolution = sense_pitch / 3;
+ } else if (cluster_width == 4)
+ {
+ measured_resolution = sense_pitch / 2;
+ } else
+ {
+ measured_resolution = sense_pitch;
+ }
+
+ return measured_resolution;
+
+ }
+
+
+
+ private double getEnergy(List<RawTrackerHit> cluster)
+ {
+ double total_charge = 0.0;
+ for (RawTrackerHit hit : cluster)
+ {
+
+ int pixel_number = _pixel_map.get(hit);
+ double signal = _readout_chip.decodeCharge(hit);
+
+ total_charge += signal;
+ }
+ return total_charge * DopedSilicon.ENERGY_EHPAIR;
+ }
+
+
+}
lcsim/src/org/lcsim/recon/tracking/digitization/sistripsim
diff -u -r1.1 -r1.2
--- SiTrackerHitStrip1D.java 9 Dec 2008 22:22:34 -0000 1.1
+++ SiTrackerHitStrip1D.java 24 Apr 2009 00:16:51 -0000 1.2
@@ -68,10 +68,10 @@
{
hit_length = Math.max( hit_length,
((SiStrips)getReadoutElectrodes()).
- getStripLength(getIdentifierHelper().getStripValue(raw_hit.getIdentifier())) );
+ getStripLength(getIdentifierHelper().getElectrodeValue(raw_hit.getIdentifier())) );
// System.out.println("Strip length: "+((SiStrips)getReadoutElectrodes()).
-// getStripLength(getIdentifierHelper().getStripValue(raw_hit.getIdentifier())));
+// getStripLength(getIdentifierHelper().getElectrodeValue(raw_hit.getIdentifier())));
}
// System.out.println(" Hit length: "+hit_length);
lcsim/src/org/lcsim/recon/tracking/digitization/sistripsim
diff -u -r1.2 -r1.3
--- Kpix.java 20 Apr 2009 21:23:50 -0000 1.2
+++ Kpix.java 24 Apr 2009 00:16:51 -0000 1.3
@@ -34,9 +34,9 @@
private static final int VERSION_NUMBER = 1; // version number
private static Random _random = new Random();
- private static NormalDistribution _gaussian = new NormalDistributionImpl(0.0, 1.0);
- private static BinomialDistribution _binomial = new BinomialDistributionImpl(1, 1);
- private StripClusterer _strip_clusterer;
+ private static NormalDistribution _gaussian = new NormalDistributionImpl(0.0,1.0);
+ private static BinomialDistribution _binomial = new BinomialDistributionImpl(1,1);
+ private Clusterer _clusterer;
// Static values and defaults: DO NOT CHANGE
//==========================================
@@ -117,24 +117,22 @@
/** Creates a new instance of Kpix */
public Kpix() {
}
-
- public void setStripClusterer(StripClusterer strip_clusterer) {
- _strip_clusterer = strip_clusterer;
+
+ public void setClusterer(Clusterer clusterer)
+ {
+ _clusterer = clusterer;
}
// ReadoutChip Interface
public KpixChannel getChannel(int channel_number) {
return _channel;
}
-
- public SortedMap<Integer, List<Integer>> readout(SiElectrodeDataCollection data, SiSensorElectrodes electrodes) {
- if (data == null) {
- data = new SiElectrodeDataCollection();
- }
- if (_strip_clusterer != null) {
- addNoise(data, electrodes);
- }
- return digitize(data, electrodes);
+
+ public SortedMap<Integer,List<Integer>> readout(SiElectrodeDataCollection data, SiSensorElectrodes electrodes)
+ {
+ if (data == null) data = new SiElectrodeDataCollection();
+ if (_clusterer != null) addNoise(data,electrodes);
+ return digitize(data,electrodes);
}
// Decoding hit information
@@ -190,7 +188,7 @@
int nelectrodes = electrodes.getNCells();
int nelectrodes_empty = nelectrodes - data.size();
- double normalized_integration_limit = _strip_clusterer.getSeedThreshold(); // We should get this from same place as clustering code
+ double normalized_integration_limit = _clusterer.getSeedThreshold(); // We should get this from same place as clustering code
double integral = normalCDF(normalized_integration_limit);
int nchannels_throw = drawBinomial(nelectrodes_empty, integral);
@@ -232,8 +230,8 @@
neighbors.removeAll(data.keySet());
nelectrodes_empty = neighbors.size();
- normalized_integration_limit = _strip_clusterer.getNeighborThreshold(); // We should get this from same place as clustering code
-
+ normalized_integration_limit = _clusterer.getNeighborThreshold(); // We should get this from same place as clustering code
+
integral = normalCDF(normalized_integration_limit);
nchannels_throw = drawBinomial(nelectrodes_empty, integral);
lcsim/src/org/lcsim/recon/tracking/digitization/sistripsim
diff -u -r1.1 -r1.2
--- ReadoutChip.java 9 Dec 2008 22:22:34 -0000 1.1
+++ ReadoutChip.java 24 Apr 2009 00:16:51 -0000 1.2
@@ -20,7 +20,7 @@
*/
public interface ReadoutChip
{
- public void setStripClusterer(StripClusterer strip_clusterer);
+ public void setClusterer(Clusterer clusterer);
public SortedMap<Integer,List<Integer>> readout(SiElectrodeDataCollection data, SiSensorElectrodes electrodes);
lcsim/src/org/lcsim/recon/tracking/digitization/sistripsim
diff -u -r1.2 -r1.3
--- GenericReadoutChip.java 23 Apr 2009 23:05:23 -0000 1.2
+++ GenericReadoutChip.java 24 Apr 2009 00:16:51 -0000 1.3
@@ -36,7 +36,7 @@
private static Random _random = new Random();
private static NormalDistribution _gaussian = new NormalDistributionImpl(0.0, 1.0);
private static BinomialDistribution _binomial = new BinomialDistributionImpl(1, 1);
- private StripClusterer _clusterer;
+ private Clusterer _clusterer;
private GenericChannel _channel = new GenericChannel();
private double _capacitance;
@@ -88,7 +88,7 @@
*
* @param _clusterer
*/
- public void setStripClusterer(StripClusterer clusterer) {
+ public void setClusterer(Clusterer clusterer) {
_clusterer = clusterer;
}
lcsim/src/org/lcsim/recon/tracking/digitization/sistripsim
diff -u -r1.1 -r1.2
--- StripHitMaker.java 9 Dec 2008 22:22:34 -0000 1.1
+++ StripHitMaker.java 24 Apr 2009 00:16:51 -0000 1.2
@@ -22,7 +22,6 @@
import java.util.Set;
import java.util.Map.Entry;
-import org.lcsim.detector.DetectorElementStore;
import org.lcsim.detector.IDetectorElement;
import org.lcsim.detector.IReadout;
import org.lcsim.detector.identifier.IIdentifier;
@@ -39,7 +38,7 @@
*
* @author tknelson
*/
-public class StripHitMaker implements StripClusterer
+public class StripHitMaker implements Clusterer
{
private static String _NAME = "StripClusterer";
@@ -73,7 +72,7 @@
_simulation = simulation;
_readout_chip = readout_chip;
- _readout_chip.setStripClusterer(this);
+ _readout_chip.setClusterer(this);
}
// Settings for Tracker1DHitMaker
@@ -123,10 +122,10 @@
}
// Make hits for all sensors within a DetectorElement
- public List<SiTrackerHitStrip1D> makeHits(IDetectorElement detector)
+ public List<SiTrackerHit> makeHits(IDetectorElement detector)
{
System.out.println("makeHits(IDetectorElement): " + detector.getName());
- List<SiTrackerHitStrip1D> hits = new ArrayList<SiTrackerHitStrip1D>();
+ List<SiTrackerHit> hits = new ArrayList<SiTrackerHit>();
List<SiSensor> sensors = detector.findDescendants(SiSensor.class);
// Loop over all sensors
@@ -144,12 +143,12 @@
// Make hits for a sensor
- public List<SiTrackerHitStrip1D> makeHits(SiSensor sensor)
+ public List<SiTrackerHit> makeHits(SiSensor sensor)
{
//System.out.println("makeHits: " + sensor.getName());
- List<SiTrackerHitStrip1D> hits = new ArrayList<SiTrackerHitStrip1D>();
+ List<SiTrackerHit> hits = new ArrayList<SiTrackerHit>();
// Get SiTrackerIdentifierHelper for this sensor and refresh the strip map used to increase speed
_sid_helper = (SiTrackerIdentifierHelper)sensor.getIdentifierHelper();
@@ -166,7 +165,7 @@
// get id and create strip map, get electrodes.
IIdentifier id = raw_hit.getIdentifier();
- _strip_map.put(raw_hit,_sid_helper.getStripValue(id));
+ _strip_map.put(raw_hit,_sid_helper.getElectrodeValue(id));
// Get electrodes and check that they are strips
//System.out.println("proc raw hit from: " + DetectorElementStore.getInstance().find(raw_hit.getIdentifier()).get(0).getName());
@@ -195,12 +194,12 @@
//=========================
// Make hits for an electrode
- public List<SiTrackerHitStrip1D> makeHits(SiStrips strips, List<RawTrackerHit> raw_hits)
+ public List<SiTrackerHit> makeHits(SiSensorElectrodes electrodes, List<RawTrackerHit> raw_hits)
{
// System.out.println("Clustering electrodes: "+electrodes_id);
- List<SiTrackerHitStrip1D> hits = new ArrayList<SiTrackerHitStrip1D>();
+ List<SiTrackerHit> hits = new ArrayList<SiTrackerHit>();
List<RawTrackerHit> unclustered_rawhits = new ArrayList<RawTrackerHit>(raw_hits);
@@ -209,7 +208,7 @@
int strip_number = _strip_map.get(raw_hit);
double signal = _readout_chip.decodeCharge(raw_hit);
- double noise = _readout_chip.getChannel(strip_number).computeNoise(strips.getCapacitance(strip_number));
+ double noise = _readout_chip.getChannel(strip_number).computeNoise(electrodes.getCapacitance(strip_number));
if (signal/noise > _seed_threshold && unclustered_rawhits.contains(raw_hit))
{
@@ -225,7 +224,7 @@
{
cluster.addAll(clustered_hits);
unclustered_rawhits.removeAll(clustered_hits);
- clustered_hits = neighborHits(clustered_hits,unclustered_rawhits,strips);
+ clustered_hits = neighborHits(clustered_hits,unclustered_rawhits,electrodes);
// System.out.println(" Cluster size: "+cluster.size());
// System.out.println(" # Unclustered hits: "+unclustered_hits.size());
@@ -240,10 +239,10 @@
// Make a TrackerHit from the cluster if it meets max cluster size requirement
if (cluster.size() <= _max_cluster_nstrips)
{
- SiTrackerHitStrip1D hit = makeTrackerHit(cluster,strips);
+ SiTrackerHitStrip1D hit = makeTrackerHit(cluster,electrodes);
// Add to readout and to list of hits
- ((SiSensor)strips.getDetectorElement()).getReadout().addHit(hit);
+ ((SiSensor)electrodes.getDetectorElement()).getReadout().addHit(hit);
hits.add(hit);
}
lcsim/src/org/lcsim/recon/tracking/digitization/sistripsim
diff -u -r1.4 -r1.5
--- TrackerHitDriver.java 20 Apr 2009 21:23:50 -0000 1.4
+++ TrackerHitDriver.java 24 Apr 2009 00:16:51 -0000 1.5
@@ -40,12 +40,15 @@
Set<SiTrackerModule> _process_modules = new HashSet<SiTrackerModule>();
// Algorithm classes responsible for making hits
- SiSensorSim _si_simulation = new CDFSiSensorSim();
- ReadoutChip _readout_chip = new Kpix();
+ SiSensorSim _strip_simulation = new CDFSiSensorSim();
+ ReadoutChip _strip_readout = new Kpix();
+
+ SiSensorSim _pixel_simulation = new CDFSiSensorSim();
+ ReadoutChip _pixel_readout = new Kpix();
- SiDigitizer _digitizer = new RawTrackerHitMaker(_si_simulation,_readout_chip);
- StripClusterer _strip_clusterer = new StripHitMaker(_si_simulation,_readout_chip);
-// PixelClusterer _pixel_clusterer = new PixelHitMaker(_pixel_simulation,_pixel_readout);
+ SiDigitizer _digitizer = new RawTrackerHitMaker(_strip_simulation,_strip_readout);
+ Clusterer _strip_clusterer = new StripHitMaker(_strip_simulation,_strip_readout);
+ Clusterer _pixel_clusterer = new PixelHitMaker(_pixel_simulation,_pixel_readout);
StripHitCombiner _striphit_combiner = new StripHit2DMaker();
/**
@@ -59,12 +62,12 @@
}
// Construct your own
- public TrackerHitDriver(SiDigitizer digitizer, StripClusterer strip_clusterer,
- PixelClusterer pixel_clusterer, StripHitCombiner striphit_combiner)
+ public TrackerHitDriver(SiDigitizer digitizer, Clusterer strip_clusterer,
+ Clusterer pixel_clusterer, StripHitCombiner striphit_combiner)
{
_digitizer = digitizer;
_strip_clusterer = strip_clusterer;
-// _pixel_clusterer = pixel_clusterer;
+ _pixel_clusterer = pixel_clusterer;
_striphit_combiner = striphit_combiner;
}
@@ -75,15 +78,15 @@
_digitizer = digitizer;
}
- public void setStripClusterer(StripClusterer strip_clusterer)
+ public void setStripClusterer(Clusterer strip_clusterer)
{
_strip_clusterer = strip_clusterer;
}
-
-// public void setPixelClusterer(PixelClusterer pixel_clusterer)
-// {
-// _pixel_clusterer = pixel_clusterer;
-// }
+
+ public void setPixelClusterer(Clusterer pixel_clusterer)
+ {
+ _pixel_clusterer = pixel_clusterer;
+ }
public void setStripHitCombiner(StripHitCombiner striphit_combiner)
{
@@ -97,15 +100,15 @@
return _digitizer;
}
- public StripClusterer getStripClusterer()
+ public Clusterer getStripClusterer()
{
return _strip_clusterer;
}
-// public PixelClusterer getPixelClusterer()
-// {
-// return _pixel_clusterer;
-// }
+ public Clusterer getPixelClusterer()
+ {
+ return _pixel_clusterer;
+ }
public StripHitCombiner getStripHitCombiner()
{
@@ -124,10 +127,10 @@
return _strip_clusterer.getName()+"_SiTrackerHitStrip1D";
}
-// String getPixelHitsName()
-// {
-// return _pixel_clusterer.getName()+"_SiTrackerHitPixel";
-// }
+ String getPixelHitsName()
+ {
+ return _pixel_clusterer.getName()+"_SiTrackerHitPixel";
+ }
public String getStripHits2DName()
{
@@ -213,9 +216,10 @@
// Lists of hits
List<RawTrackerHit> raw_hits = new ArrayList<RawTrackerHit>();
- List<SiTrackerHitStrip1D> hits_strip1D = new ArrayList<SiTrackerHitStrip1D>();
- // List<SiPixelHit> hits_pixel = new ArrayList<SiPixelHit>();
- List<SiTrackerHitStrip2D> hits_strip2D = new ArrayList<SiTrackerHitStrip2D>();
+
+ List<SiTrackerHit> hits_strip1D = new ArrayList<SiTrackerHit>();
+ List<SiTrackerHit> hits_pixel = new ArrayList<SiTrackerHit>();
+ List<SiTrackerHit> hits_strip2D = new ArrayList<SiTrackerHit>();
// for (IDetectorElement detector_element : _process_de) {
//
@@ -275,7 +279,7 @@
int flag = (1 << LCIOConstants.RTHBIT_HITS | 1 << LCIOConstants.TRAWBIT_ID1); //correct flag for persistence
event.put(getRawHitsName(),raw_hits,RawTrackerHit.class,flag,toString());
event.put(getStripHits1DName(),hits_strip1D,SiTrackerHitStrip1D.class,0,toString());
-// event.put(getPixelHitsName(),hits_pixel,SiTrackerHitPixel.class,0,toString());
+ event.put(getPixelHitsName(),hits_pixel,SiTrackerHitPixel.class,0,toString());
event.put(getStripHits2DName(),hits_strip2D,SiTrackerHitStrip2D.class,0,toString());
lcsim/src/org/lcsim/recon/tracking/digitization/sistripsim
diff -N StripClusterer.java
--- StripClusterer.java 9 Dec 2008 22:22:34 -0000 1.1
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,37 +0,0 @@
-/*
- * StripClusterer.java
- *
- * Created on April 2, 2008, 6:51 AM
- *
- * To change this template, choose Tools | Template Manager
- * and open the template in the editor.
- */
-
-package org.lcsim.recon.tracking.digitization.sistripsim;
-
-import java.util.List;
-import org.lcsim.detector.IDetectorElement;
-import org.lcsim.detector.tracker.silicon.SiSensor;
-import org.lcsim.detector.tracker.silicon.SiStrips;
-import org.lcsim.event.RawTrackerHit;
-
-/**
- *
- * @author tknelson
- */
-public interface StripClusterer
-{
- public String getName();
-
- public double getSeedThreshold();
-
- public double getNeighborThreshold();
-
- public double getClusterThreshold();
-
- public List<SiTrackerHitStrip1D> makeHits(IDetectorElement detector);
-
- public List<SiTrackerHitStrip1D> makeHits(SiSensor sensor);
-
- public List<SiTrackerHitStrip1D> makeHits(SiStrips strips, List<RawTrackerHit> hits);
-}
lcsim/src/org/lcsim/recon/tracking/digitization/sistripsim
diff -N ClusterMaker.java
--- ClusterMaker.java 9 Dec 2008 22:22:34 -0000 1.1
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,23 +0,0 @@
-/*
- * ClusterMaker.java
- *
- * Created on September 26, 2007, 1:57 PM
- *
- * To change this template, choose Tools | Template Manager
- * and open the template in the editor.
- */
-
-package org.lcsim.recon.tracking.digitization.sistripsim;
-
-import org.lcsim.event.RawTrackerHit;
-import org.lcsim.event.TrackerHit;
-import java.util.List;
-
-/**
- *
- * @author tknelson
- */
-public interface ClusterMaker
-{
- List<TrackerHit> makeClusters(List<RawTrackerHit> raw_hits);
-}
lcsim/src/org/lcsim/recon/tracking/digitization/sistripsim
diff -N PixelClusterer.java
--- PixelClusterer.java 9 Dec 2008 22:22:34 -0000 1.1
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,30 +0,0 @@
-/*
- * PixelClusterer.java
- *
- * Created on April 2, 2008, 6:51 AM
- *
- * To change this template, choose Tools | Template Manager
- * and open the template in the editor.
- */
-
-package org.lcsim.recon.tracking.digitization.sistripsim;
-
-import java.util.List;
-import org.lcsim.detector.IDetectorElement;
-import org.lcsim.detector.tracker.silicon.SiSensor;
-import org.lcsim.event.RawTrackerHit;
-
-/**
- *
- * @author tknelson
- */
-public interface PixelClusterer
-{
- public String getName();
-
- public List<SiTrackerHitPixel> makeHits(IDetectorElement detector);
-
- public List<SiTrackerHitPixel> makeHits(SiSensor sensor);
-
-// public List<SiTrackerHitPixel> makeHits(SiPixels pixels, List<RawTrackerHit> hits);
-}
lcsim/src/org/lcsim/recon/tracking/digitization/sistripsim
diff -N StripClusterMaker.java
--- StripClusterMaker.java 9 Dec 2008 22:22:34 -0000 1.1
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,356 +0,0 @@
-/*
- * StripClusterMaker.java
- *
- * Created on September 26, 2007, 1:57 PM
- *
- * To change this template, choose Tools | Template Manager
- * and open the template in the editor.
- */
-
-package org.lcsim.recon.tracking.digitization.sistripsim;
-
-import hep.physics.matrix.Matrix;
-import hep.physics.matrix.SymmetricMatrix;
-import hep.physics.vec.BasicHep3Matrix;
-import hep.physics.vec.BasicHep3Vector;
-import hep.physics.vec.Hep3Vector;
-import hep.physics.vec.VecOp;
-import org.lcsim.event.RawTrackerHit;
-import org.lcsim.event.TrackerHit;
-import org.lcsim.detector.identifier.IExpandedIdentifier;
-import org.lcsim.detector.identifier.ExpandedIdentifier;
-
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Map;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Set;
-import org.lcsim.detector.tracker.silicon.ChargeCarrier;
-import org.lcsim.detector.tracker.silicon.DopedSilicon;
-import org.lcsim.detector.tracker.silicon.SiSensor;
-import org.lcsim.detector.tracker.silicon.SiSensorElectrodes;
-import org.lcsim.detector.tracker.silicon.SiStrips;
-import org.lcsim.event.SimTrackerHit;
-
-/**
- *
- * @author tknelson
- */
-public class StripClusterMaker implements ClusterMaker
-{
- int _seed_threshold = 4;
- int _neighbor_threshold = 2;
- int _cluster_threshold = 3;
-
- // Temporary maps connecting electrodes to hit list, hits to strip number, electrode ID to electrodes
- // (the last should be cached... not a model of efficiency at the moment)
- Map<String,List<RawTrackerHit>> _hit_map = new HashMap<String,List<RawTrackerHit>>();
- Map<RawTrackerHit,Integer> _strip_map = new HashMap<RawTrackerHit,Integer>();
- Map<String,SiSensorElectrodes> _electrode_map = new HashMap<String,SiSensorElectrodes>();
-
- // Readout chip needed to decode hit information
- ReadoutChip _readout_chip;
-
- // Sensor simulation needed to correct for Lorentz drift
- SiSensorSim _simulation;
-
- /** Creates a new instance of StripClusterMaker */
- public StripClusterMaker(ReadoutChip readout_chip, SiSensorSim simulation)
- {
- _readout_chip = readout_chip;
- _simulation = simulation;
- }
-
- public List<TrackerHit> makeClusters(List<RawTrackerHit> raw_hits)
- {
-
- // clear the maps
- _hit_map.clear();
- _strip_map.clear();
- _electrode_map.clear();
-
- List<TrackerHit> clusters = new ArrayList<TrackerHit>();
-
- // Sort RawTrackerHits by electrodes
- for (RawTrackerHit raw_hit : raw_hits)
- {
- // FIXME: This doesn't need to be inside a loop if all the hits have
- // the same helper.
- int strip_field = raw_hit.getIdentifierHelper().getFieldIndex("strip");
- int side_field = raw_hit.getIdentifierHelper().getFieldIndex("side");
-
- // Get expanded ID
- IExpandedIdentifier id = new ExpandedIdentifier(raw_hit.getExpandedIdentifier());
-
- // Get strip number
- int strip_id = id.getValue(strip_field);
- _strip_map.put(raw_hit,strip_id);
-
- // Get side of sensor
- ChargeCarrier carrier = ChargeCarrier.getCarrier(id.getValue(side_field));
-
- // Zero strip number to refer only to electrode set
- id.setValue(strip_field,0);
-
- // Fill maps needed for clustering
- if (!_electrode_map.containsKey(id.toString()))
- {
-// System.out.println("Adding electrodes to map for id: "+id.toString());
- _electrode_map.put(id.toString(),((SiSensor)raw_hit.getDetectorElement()).getReadoutElectrodes(carrier));
- _hit_map.put(id.toString(),new ArrayList<RawTrackerHit>());
- }
- _hit_map.get(id.toString()).add(raw_hit);
-
- }
-
- // Do clustering for each set of electrodes
- for (String electrodes_id : _electrode_map.keySet())
- {
-
-// System.out.println("Clustering electrodes: "+electrodes_id);
-
- List<RawTrackerHit> hits = _hit_map.get(electrodes_id);
- List<RawTrackerHit> unclustered_hits = new ArrayList<RawTrackerHit>(hits);
- SiSensorElectrodes electrodes = _electrode_map.get(electrodes_id);
-
- for (RawTrackerHit hit : hits)
- {
-
- int strip_number = _strip_map.get(hit);
- double signal = _readout_chip.decodeCharge(hit);
- double noise = _readout_chip.getChannel(strip_number).computeNoise(electrodes.getCapacitance(strip_number));
-
- if (signal/noise > _seed_threshold && unclustered_hits.contains(hit))
- {
-
-// System.out.println("Creating new cluster, # Raw hits on electrodes is: "+hits.size());
-
- List<RawTrackerHit> cluster = new ArrayList<RawTrackerHit>();
- List<RawTrackerHit> clustered_hits = new ArrayList<RawTrackerHit>();
-
- clustered_hits.add(hit);
-
- while (clustered_hits.size() != 0)
- {
- cluster.addAll(clustered_hits);
- unclustered_hits.removeAll(clustered_hits);
- clustered_hits = neighborHits(clustered_hits,unclustered_hits,electrodes);
-
-// System.out.println(" Cluster size: "+cluster.size());
-// System.out.println(" # Unclustered hits: "+unclustered_hits.size());
-// System.out.println(" # neighbors found: "+clustered_hits.size());
- }
-
- // now make a cluster or trackerhit
- clusters.add(makeTrackerHit(cluster,electrodes));
-
- }
- }
-
-
- }
-
- return clusters;
-
- }
-
- private List<RawTrackerHit> neighborHits(List<RawTrackerHit> clustered_hits, List<RawTrackerHit> unclustered_hits,
- SiSensorElectrodes electrodes)
- {
- List<RawTrackerHit> neighbor_hits = new ArrayList<RawTrackerHit>();
-
- for (RawTrackerHit seed_hit : clustered_hits)
- {
- Set<Integer> neighbor_cells = electrodes.getNearestNeighborCells(_strip_map.get(seed_hit));
- for (RawTrackerHit hit : unclustered_hits)
- {
- int strip_number = _strip_map.get(hit);
- double signal = _readout_chip.decodeCharge(hit);
- double noise = _readout_chip.getChannel(strip_number).computeNoise(electrodes.getCapacitance(strip_number));
-
- if (neighbor_cells.contains(_strip_map.get(hit)) && signal/noise > _neighbor_threshold)
- {
- neighbor_hits.add(hit);
- }
- }
- }
- return neighbor_hits;
- }
-
- private TrackerHit makeTrackerHit(List<RawTrackerHit> cluster, SiSensorElectrodes electrodes)
- {
- Hep3Vector position = getPosition(cluster,electrodes);
- SymmetricMatrix covariance = getCovariance(cluster,electrodes);
- double time = getTime(cluster);
- double energy = getEnergy(cluster);
- TrackerHitType type = new TrackerHitType(TrackerHitType.CoordinateSystem.GLOBAL,TrackerHitType.MeasurementType.STRIP_1D);
-
- TrackerHit hit = new SiTrackerHitStrip1D(position, covariance, energy, time, cluster, type);
- return hit;
- }
-
-// private TrackerHit makeTrackerHit(List<RawTrackerHit> cluster, SiSensorElectrodes electrodes)
-// {
-// double[] position = getPosition(cluster,electrodes);
-// SymmetricMatrix covariance = getCovariance(cluster,electrodes);
-// double time = getTime(cluster);
-// double energy = getEnergy(cluster);
-// int type = 0;
-//
-// BaseTrackerHitMC hit = new BaseTrackerHitMC(position, covariance.asPackedArray(true), time, energy, type, getSimulatedHits(cluster));
-// hit.addRawTrackerHits(cluster);
-// return hit;
-// }
-
- private List<SimTrackerHit> getSimulatedHits(List<RawTrackerHit> cluster)
- {
- Set<SimTrackerHit> simulated_hits = new HashSet<SimTrackerHit>();
- for (RawTrackerHit hit : cluster)
- {
- simulated_hits.addAll(hit.getSimTrackerHits());
- }
- return new ArrayList<SimTrackerHit>(simulated_hits);
- }
-
- private Hep3Vector getPosition(List<RawTrackerHit> cluster, SiSensorElectrodes electrodes)
- {
- double total_charge = 0;
- Hep3Vector position = new BasicHep3Vector(0,0,0);
-
- for (RawTrackerHit hit : cluster)
- {
- int strip_number = _strip_map.get(hit);
- double signal = _readout_chip.decodeCharge(hit);
-
- total_charge += signal;
- position = VecOp.add(position,VecOp.mult(signal,((SiStrips)electrodes).getStripCenter(strip_number)));
- }
- position = VecOp.mult(1/total_charge,position);
-
- // Put position in sensor coordinates
- electrodes.getParentToLocal().inverse().transform(position);
-
-// System.out.println("Position \n"+position);
-
- // Swim position back through lorentz drift direction to midpoint between bias surfaces
- _simulation.setSensor((SiSensor)electrodes.getDetectorElement());
- _simulation.lorentzCorrect(position,electrodes.getChargeCarrier());
-
-// System.out.println("Lorentz corrected position \n"+position);
-
- // return position in global coordinates
- return ((SiSensor)electrodes.getDetectorElement()).getGeometry().getLocalToGlobal().transformed(position);
-// return electrodes.getLocalToGlobal().transformed(position);
- }
-
- private double getTime(List<RawTrackerHit> cluster)
- {
- int time_sum = 0;
- int signal_sum = 0;
-
- for (RawTrackerHit hit : cluster)
- {
-
- int strip_number = _strip_map.get(hit);
- double signal = _readout_chip.decodeCharge(hit);
- double time = _readout_chip.decodeTime(hit);
-
- time_sum += time_sum * signal;
- signal_sum += signal;
-
- }
- return (double)time_sum/(double)signal_sum;
- }
-
- private SymmetricMatrix getCovariance(List<RawTrackerHit> cluster, SiSensorElectrodes electrodes)
- {
- SymmetricMatrix covariance = new SymmetricMatrix(3);
- covariance.setElement( 0, 0, Math.pow( getMeasuredResolution(cluster, electrodes), 2 ) );
- covariance.setElement( 1, 1, Math.pow( getUnmeasuredResolution(cluster, electrodes) ,2 ) );
- covariance.setElement( 2, 2, 0.0);
-
- SymmetricMatrix covariance_global = electrodes.getLocalToGlobal().transformed(covariance);
-
-// System.out.println("Global covariance matrix: \n"+covariance_global);
-
- return covariance_global;
-
-// BasicHep3Matrix rotation_matrix = (BasicHep3Matrix)electrodes.getLocalToGlobal().getRotation().getRotationMatrix();
-// BasicHep3Matrix rotation_matrix_transposed = new BasicHep3Matrix(rotation_matrix);
-// rotation_matrix_transposed.transpose();
-//
-//// System.out.println("Rotation matrix: \n"+rotation_matrix);
-//// System.out.println("Rotation matrix transposed: \n"+rotation_matrix_transposed);
-//// System.out.println("Local covariance matrix: \n"+covariance);
-//
-// BasicHep3Matrix covariance_global = (BasicHep3Matrix)VecOp.mult(rotation_matrix,VecOp.mult(covariance,rotation_matrix_transposed));
-//
-//// System.out.println("Global covariance matrix: \n"+covariance_global);
-//
-// return new SymmetricMatrix((Matrix)covariance_global);
- }
-
- private double getMeasuredResolution(List<RawTrackerHit> cluster, SiSensorElectrodes electrodes) // should replace this by a ResolutionModel class that gives expected resolution. This could be a big job.
- {
- double measured_resolution;
-
- double sense_pitch = ((SiSensor)electrodes.getDetectorElement()).
- getSenseElectrodes(electrodes.getChargeCarrier()).getPitch(0);
-
-// double readout_pitch = electrodes.getPitch(0);
-// double noise = _readout_chip.getChannel(strip_number).computeNoise(electrodes.getCapacitance(strip_number));
-// double signal_expected = (0.000280/DopedSilicon.ENERGY_EHPAIR) *
-// ((SiSensor)electrodes.getDetectorElement()).getThickness(); // ~280 KeV/mm for thick Si sensors
-
- if (cluster.size() == 1)
- {
- measured_resolution = sense_pitch / Math.sqrt(12);
- }
- else if (cluster.size() == 2)
- {
- measured_resolution = sense_pitch / 5;
- }
- else if (cluster.size() == 3)
- {
- measured_resolution = sense_pitch / 3;
- }
- else if (cluster.size() == 4)
- {
- measured_resolution = sense_pitch / 2;
- }
- else
- {
- measured_resolution = sense_pitch;
- }
-
- return measured_resolution;
- }
-
- private double getUnmeasuredResolution(List<RawTrackerHit> cluster, SiSensorElectrodes electrodes)
- {
- // Get length of longest strip in hit
- double hit_length = 0;
- for (RawTrackerHit hit : cluster)
- {
- hit_length = Math.max( hit_length, ((SiStrips)electrodes).getStripLength(_strip_map.get(hit)) );
- }
- return hit_length/Math.sqrt(12);
- }
-
- private double getEnergy(List<RawTrackerHit> cluster)
- {
- double total_charge = 0.0;
- for (RawTrackerHit hit : cluster)
- {
-
- int strip_number = _strip_map.get(hit);
- double signal = _readout_chip.decodeCharge(hit);
-
- total_charge += signal;
- }
- return total_charge * DopedSilicon.ENERGY_EHPAIR;
- }
-
-
-}
CVSspam 0.2.8