hps-java/src/main/java/org/lcsim/hps/recon/tracking
diff -u -r1.1 -r1.2
--- HPSStripMaker.java 24 Apr 2012 14:07:08 -0000 1.1
+++ HPSStripMaker.java 24 Apr 2012 17:45:44 -0000 1.2
@@ -17,7 +17,6 @@
import org.lcsim.detector.identifier.IIdentifier;
import org.lcsim.detector.tracker.silicon.*;
import org.lcsim.event.RawTrackerHit;
-import org.lcsim.event.base.BaseTrackerHit;
import org.lcsim.recon.tracking.digitization.sisim.*;
/**
@@ -33,20 +32,20 @@
int _max_noaverage_nstrips = 4;
// Absolute maximum cluster size
int _max_cluster_nstrips = 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 strip numbers for sake of speed (reset once per sensor)
- Map<HPSTrackerHit, Integer> _strip_map = new HashMap<HPSTrackerHit, Integer>();
+ Map<HPSFittedRawTrackerHit, Integer> _strip_map = new HashMap<HPSFittedRawTrackerHit, Integer>();
double _oneClusterErr = 1 / Math.sqrt(12);
double _twoClusterErr = 1 / 5;
double _threeClusterErr = 1 / 3;
double _fourClusterErr = 1 / 2;
double _fiveClusterErr = 1;
+ public HPSStripMaker(HPSClusteringAlgorithm algo){
+ _clustering=algo;
+ }
+
public String getName() {
return _NAME;
}
@@ -82,50 +81,50 @@
// Get hits for this sensor
IReadout ro = sensor.getReadout();
- List<HPSTrackerHit> hps_hits = ro.getHits(HPSTrackerHit.class);
+ List<HPSFittedRawTrackerHit> hps_hits = ro.getHits(HPSFittedRawTrackerHit.class);
- Map<SiSensorElectrodes, List<HPSTrackerHit>> electrode_hits = new HashMap<SiSensorElectrodes, List<HPSTrackerHit>>();
+ Map<SiSensorElectrodes, List<HPSFittedRawTrackerHit>> electrode_hits = new HashMap<SiSensorElectrodes, List<HPSFittedRawTrackerHit>>();
- for (HPSTrackerHit hps_hit : hps_hits) {
+ for (HPSFittedRawTrackerHit hps_hit : hps_hits) {
// get id and create strip map, get electrodes.
- IIdentifier id = hps_hit.getIdentifier();
+ IIdentifier id = hps_hit.getRawTrackerHit().getIdentifier();
_strip_map.put(hps_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());
ChargeCarrier carrier = ChargeCarrier.getCarrier(_sid_helper.getSideValue(id));
- SiSensorElectrodes electrodes = ((SiSensor) hps_hit.getDetectorElement()).getReadoutElectrodes(carrier);
+ SiSensorElectrodes electrodes = ((SiSensor) hps_hit.getRawTrackerHit().getDetectorElement()).getReadoutElectrodes(carrier);
if (!(electrodes instanceof SiStrips)) {
continue;
}
if (electrode_hits.get(electrodes) == null) {
- electrode_hits.put(electrodes, new ArrayList<HPSTrackerHit>());
+ electrode_hits.put(electrodes, new ArrayList<HPSFittedRawTrackerHit>());
}
electrode_hits.get(electrodes).add(hps_hit);
}
for (Map.Entry entry : electrode_hits.entrySet()) {
- hits.addAll(makeHits(sensor, (SiStrips) entry.getKey(), (List<HPSTrackerHit>) entry.getValue()));
+ hits.addAll(makeHits(sensor, (SiStrips) entry.getKey(), (List<HPSFittedRawTrackerHit>) entry.getValue()));
}
return hits;
}
- public List<SiTrackerHit> makeHits(SiSensor sensor, SiSensorElectrodes electrodes,List<HPSTrackerHit> hps_hits) {
+ public List<SiTrackerHit> makeHits(SiSensor sensor, SiSensorElectrodes electrodes,List<HPSFittedRawTrackerHit> hps_hits) {
// Call the clustering algorithm to make clusters
- List<List<HPSTrackerHit>> cluster_list = _clustering.findClusters(hps_hits);
+ List<List<HPSFittedRawTrackerHit>> cluster_list = _clustering.findClusters(hps_hits);
// Create an empty list for the pixel hits to be formed from clusters
List<SiTrackerHit> hits = new ArrayList<SiTrackerHit>();
// Make a pixel hit from this cluster
- for (List<HPSTrackerHit> cluster : cluster_list) {
+ for (List<HPSFittedRawTrackerHit> cluster : cluster_list) {
// Make a TrackerHit from the cluster if it meets max cluster size requirement
if (cluster.size() <= _max_cluster_nstrips) {
@@ -159,25 +158,34 @@
_fiveClusterErr = err;
}
- private SiTrackerHitStrip1D makeTrackerHit(List<HPSTrackerHit> cluster, SiSensorElectrodes electrodes) {
+
+ public void setCentralStripAveragingThreshold(int max_noaverage_nstrips) {
+ _max_noaverage_nstrips = max_noaverage_nstrips;
+ }
+
+ public void setMaxClusterSize(int max_cluster_nstrips) {
+ _max_cluster_nstrips = max_cluster_nstrips;
+ }
+
+ private SiTrackerHitStrip1D makeTrackerHit(List<HPSFittedRawTrackerHit> 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);
List<RawTrackerHit> rth_cluster = new ArrayList<RawTrackerHit>();
- for (HPSTrackerHit bth : cluster) {
+ for (HPSFittedRawTrackerHit bth : cluster) {
rth_cluster.add((RawTrackerHit) bth);
}
SiTrackerHitStrip1D hit = new SiTrackerHitStrip1D(position, covariance, energy, time, rth_cluster, type);
return hit;
}
- private Hep3Vector getPosition(List<HPSTrackerHit> cluster, SiSensorElectrodes electrodes) {
+ private Hep3Vector getPosition(List<HPSFittedRawTrackerHit> cluster, SiSensorElectrodes electrodes) {
List<Double> signals = new ArrayList<Double>();
List<Hep3Vector> positions = new ArrayList<Hep3Vector>();
- for (HPSTrackerHit hit : cluster) {
+ for (HPSFittedRawTrackerHit hit : cluster) {
signals.add(hit.getAmp());
positions.add(((SiStrips) electrodes).getStripCenter(_strip_map.get(hit)));
}
@@ -209,29 +217,10 @@
position = VecOp.add(position, VecOp.mult(signal, positions.get(istrip)));
}
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
@@ -239,14 +228,14 @@
// return electrodes.getLocalToGlobal().transformed(position);
}
- private double getTime(List<HPSTrackerHit> cluster) {
+ private double getTime(List<HPSFittedRawTrackerHit> cluster) {
int time_sum = 0;
int signal_sum = 0;
- for (HPSTrackerHit hit : cluster) {
+ for (HPSFittedRawTrackerHit hit : cluster) {
double signal = hit.getAmp();
- double time = hit.getTime();
+ double time = hit.getT0();
time_sum += time * signal;
signal_sum += signal;
@@ -255,7 +244,7 @@
return (double) time_sum / (double) signal_sum;
}
- private SymmetricMatrix getCovariance(List<HPSTrackerHit> cluster, SiSensorElectrodes electrodes) {
+ private SymmetricMatrix getCovariance(List<HPSFittedRawTrackerHit> 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));
@@ -282,7 +271,7 @@
// return new SymmetricMatrix((Matrix)covariance_global);
}
- private double getMeasuredResolution(List<HPSTrackerHit> cluster, SiSensorElectrodes electrodes) // should replace this by a ResolutionModel class that gives expected resolution. This could be a big job.
+ private double getMeasuredResolution(List<HPSFittedRawTrackerHit> cluster, SiSensorElectrodes electrodes) // should replace this by a ResolutionModel class that gives expected resolution. This could be a big job.
{
double measured_resolution;
@@ -308,21 +297,22 @@
return measured_resolution;
}
- private double getUnmeasuredResolution(List<HPSTrackerHit> cluster, SiSensorElectrodes electrodes) {
+ private double getUnmeasuredResolution(List<HPSFittedRawTrackerHit> cluster, SiSensorElectrodes electrodes) {
// Get length of longest strip in hit
double hit_length = 0;
- for (HPSTrackerHit hit : cluster) {
+ for (HPSFittedRawTrackerHit 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<HPSTrackerHit> cluster) {
+ private double getEnergy(List<HPSFittedRawTrackerHit> cluster) {
double total_charge = 0.0;
- for (HPSTrackerHit hit : cluster) {
+ for (HPSFittedRawTrackerHit hit : cluster) {
double signal = hit.getAmp();
total_charge += signal;
}
return total_charge * DopedSilicon.ENERGY_EHPAIR;
}
+
}