lcsim/src/org/lcsim/contrib/SiStripSim
diff -u -r1.2 -r1.3
--- StripClusterMaker.java 16 Nov 2007 23:00:06 -0000 1.2
+++ StripClusterMaker.java 17 Nov 2007 21:07:01 -0000 1.3
@@ -27,6 +27,8 @@
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
+import org.lcsim.detector.Rotation3D;
+import org.lcsim.detector.RotationPassiveXYZ;
import org.lcsim.detector.tracker.silicon.ChargeCarrier;
import org.lcsim.detector.tracker.silicon.DopedSilicon;
import org.lcsim.detector.tracker.silicon.SiSensor;
@@ -46,9 +48,9 @@
// 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<IExpandedIdentifier,List<RawTrackerHit>> _hit_map = new HashMap<IExpandedIdentifier,List<RawTrackerHit>>();
+ Map<String,List<RawTrackerHit>> _hit_map = new HashMap<String,List<RawTrackerHit>>();
Map<RawTrackerHit,Integer> _strip_map = new HashMap<RawTrackerHit,Integer>();
- Map<IExpandedIdentifier,SiSensorElectrodes> _electrode_map = new HashMap<IExpandedIdentifier,SiSensorElectrodes>();
+ Map<String,SiSensorElectrodes> _electrode_map = new HashMap<String,SiSensorElectrodes>();
// Readout chip needed to decode hit information
ReadoutChip _readout_chip;
@@ -68,7 +70,7 @@
_electrode_map.clear();
List<TrackerHit> clusters = new ArrayList<TrackerHit>();
-
+
// Sort RawTrackerHits by electrodes
for (RawTrackerHit raw_hit : raw_hits)
{
@@ -117,19 +119,22 @@
id.setValue(strip_field,0);
// Fill maps needed for clustering
- if (_electrode_map.get(id) == null)
+ if (!_electrode_map.containsKey(id.toString()))
{
- _electrode_map.put(id,((SiSensor)raw_hit.getDetectorElement()).getReadoutElectrodes(carrier));
- _hit_map.put(id,new ArrayList<RawTrackerHit>());
+// 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).add(raw_hit);
+ _hit_map.get(id.toString()).add(raw_hit);
}
// Do clustering for each set of electrodes
- for (IExpandedIdentifier electrodes_id : _electrode_map.keySet())
+ 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);
@@ -140,9 +145,12 @@
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>();
@@ -153,6 +161,10 @@
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
@@ -181,7 +193,7 @@
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);
@@ -222,7 +234,7 @@
{
int strip_number = _strip_map.get(hit);
double signal = _readout_chip.decodeCharge(hit);
-
+
total_charge += signal;
position = VecOp.add(position,VecOp.mult(signal,electrodes.getCellPosition(_strip_map.get(hit))));
}
@@ -242,7 +254,7 @@
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_sum;
@@ -258,8 +270,20 @@
covariance.setElement(0,0,Math.pow(0.007,2));
covariance.setElement(1,1,Math.pow(93.031/Math.sqrt(12),2));
covariance.setElement(2,2,0.0);
- VecOp.mult(electrodes.getLocalToGlobal().getRotation().getRotationMatrix(),covariance);
- return new SymmetricMatrix((Matrix)covariance);
+
+ 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 getEnergy(List<RawTrackerHit> cluster)
@@ -267,10 +291,10 @@
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;