Author: [log in to unmask]
Date: Wed Feb 11 11:51:12 2015
New Revision: 2107
Log:
Adding HPS specific cluster property calculators. (Not used in reconstruction right now.)
Added:
java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/HardwareClusterPropertyCalculator.java
java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ReconClusterPropertyCalculator.java
Added: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/HardwareClusterPropertyCalculator.java
=============================================================================
--- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/HardwareClusterPropertyCalculator.java (added)
+++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/HardwareClusterPropertyCalculator.java Wed Feb 11 11:51:12 2015
@@ -0,0 +1,42 @@
+package org.hps.recon.ecal.cluster;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.hps.recon.ecal.cluster.ClusterUtilities.UniqueEnergyComparator;
+import static org.hps.recon.ecal.cluster.ClusterUtilities.isHardwareCluster;
+import org.lcsim.event.CalorimeterHit;
+import org.lcsim.event.Cluster;
+import org.lcsim.event.base.AbstractClusterPropertyCalculator;
+
+/**
+ * Cluster property calculator for hardware clusters.
+ * @author Jeremy McCormick <[log in to unmask]>
+ */
+public class HardwareClusterPropertyCalculator extends AbstractClusterPropertyCalculator {
+
+ @Override
+ public void calculateProperties(List<CalorimeterHit> hits) {
+ reset();
+ List<CalorimeterHit> sortedHits = new ArrayList<CalorimeterHit>(hits);
+ Collections.sort(sortedHits, new UniqueEnergyComparator());
+ CalorimeterHit seedHit = sortedHits.get(0);
+ this.position = new double[] {seedHit.getPosition()[0], seedHit.getPosition()[1], seedHit.getPosition()[2]};
+ }
+
+ @Override
+ public void calculateProperties(Cluster cluster) {
+ reset();
+ if (isHardwareCluster(cluster)) {
+ setPositionFromSeedHit(cluster);
+ } else {
+ throw new IllegalArgumentException("The cluster has the wrong type: " + ClusterType.getClusterType(cluster.getType()).toString());
+ }
+ }
+
+ void setPositionFromSeedHit(Cluster cluster) {
+ CalorimeterHit seedHit = ClusterUtilities.findSeedHit(cluster);
+ this.position = new double[] {seedHit.getPosition()[0], seedHit.getPosition()[1], seedHit.getPosition()[2]};
+ }
+}
Added: java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ReconClusterPropertyCalculator.java
=============================================================================
--- java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ReconClusterPropertyCalculator.java (added)
+++ java/trunk/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ReconClusterPropertyCalculator.java Wed Feb 11 11:51:12 2015
@@ -0,0 +1,60 @@
+package org.hps.recon.ecal.cluster;
+
+import hep.physics.vec.Hep3Vector;
+
+import java.util.List;
+
+import org.lcsim.detector.converter.compact.EcalCrystal;
+import org.lcsim.event.CalorimeterHit;
+import org.lcsim.event.Cluster;
+import org.lcsim.event.base.AbstractClusterPropertyCalculator;
+
+class ReconClusterPropertyCalculator extends AbstractClusterPropertyCalculator {
+
+ public void calculateProperties(List<CalorimeterHit> hits) {
+ // This is unsupported because the cluster's energy is required for the position algorithm.
+ throw new IllegalArgumentException("This method is not supported for recon clustering.");
+ }
+
+ /**
+ * Calculates the position of each cluster with no correction for particle type,
+ * as documented in HPS Note 2014-001.
+ * @param cluster The input Cluster.
+ */
+ public void calculateProperties(Cluster cluster) {
+
+ reset();
+
+ // Calculate the position of the cluster.
+ calculatePosition(cluster);
+ }
+
+ private void calculatePosition(Cluster cluster) {
+ final double w0 = 3.1;
+ double xCl = 0.0;
+ // calculated cluster y position
+ double yCl = 0.0;
+ double eNumX = 0.0;
+ double eNumY = 0.0;
+ double eDen = 0.0;
+ List<CalorimeterHit> clusterHits = cluster.getCalorimeterHits();
+ for (CalorimeterHit hit : clusterHits) {
+
+ EcalCrystal crystal = (EcalCrystal) hit.getDetectorElement();
+ Hep3Vector crystalPosition = crystal.getPositionFront();
+
+ eNumX += Math.max(0.0, (w0 + Math.log(hit.getCorrectedEnergy() / cluster.getEnergy()))) * (crystalPosition.x() / 10.0);
+ eNumY += Math.max(0.0, (w0 + Math.log(hit.getCorrectedEnergy() / cluster.getEnergy()))) * (crystalPosition.y() / 10.0);
+ eDen += Math.max(0.0, (w0 + Math.log(hit.getCorrectedEnergy() / cluster.getEnergy())));
+
+ } // end for iteration through clusterHits
+
+ xCl = eNumX / eDen;
+ yCl = eNumY / eDen;
+
+ position[0] = xCl * 10.0;// mm
+ position[1] = yCl * 10.0;// mm
+ CalorimeterHit seedHit = clusterHits.get(0);
+ this.position[2] = ((EcalCrystal)seedHit.getDetectorElement()).getPositionFront().z();
+ }
+}
|