Print

Print


Author: [log in to unmask]
Date: Fri May 22 13:39:10 2015
New Revision: 3615

Log:
Add copy constructor and implementation of clone to BaseCluster.  LCSIM-247

Modified:
    projects/lcsim/trunk/event-model/src/main/java/org/lcsim/event/base/BaseCluster.java

Modified: projects/lcsim/trunk/event-model/src/main/java/org/lcsim/event/base/BaseCluster.java
 =============================================================================
--- projects/lcsim/trunk/event-model/src/main/java/org/lcsim/event/base/BaseCluster.java	(original)
+++ projects/lcsim/trunk/event-model/src/main/java/org/lcsim/event/base/BaseCluster.java	Fri May 22 13:39:10 2015
@@ -22,7 +22,8 @@
  * <li>Added access to particle ID based on the official API.</li>
  * <li>Added a few utility methods for adding lists of hits and clusters.</li>
  * <li>Added a method for setting a hit contribution that is different from the corrected energy.</li>
- * <li>Simplified the {@link #calculateProperties()} method so it doesn't do a bunch of array copies.</li> 
+ * <li>Simplified the {@link #calculateProperties()} method so that it doesn't do a bunch of array copies.</li>
+ * <li>Added a copy constructor and implementation of {@link #clone()} method.</li>
  * </ul>
  * 
  * @see org.lcsim.event.Cluster
@@ -71,15 +72,16 @@
      * The energy given here will override the value calculated from the hits.  If this is not
      * desired, then another constructor should be used instead.  This constructor does not
      * allow setting hit contributions that are different from the hit energies.
-     * @param hits The list of hits.
-     * @param energy The total energy.
-     * @param energyError The energy error.
-     * @param position The position.
-     * @param positionError The position error.
-     * @param iphi The intrinsic phi.
-     * @param itheta The intrinsic theta.
-     * @param directionError The direction error.
-     * @param shapeParameters The shape parameters.
+     * 
+     * @param hits the list of hits
+     * @param energy the total energy
+     * @param energyError the energy error
+     * @param position the position
+     * @param positionError the position error
+     * @param iphi the intrinsic phi
+     * @param itheta the intrinsic theta
+     * @param directionError the direction error
+     * @param shapeParameters the shape parameters
      */
     public BaseCluster(
             List<CalorimeterHit> hits,
@@ -116,9 +118,72 @@
     }
     
     /**
+     * Copy constructor, which will create new arrays and lists in this object so the copied cluster's 
+     * data is not incorrectly referenced.
+     * <p>
+     * The hits in the <code>CalorimeterHit</code> list are not themselves copied.
+     * 
+     * @param cluster the <code>BaseCluster</code> to copy
+     */
+    public BaseCluster(BaseCluster cluster) {
+               
+        // Copy the hit list; the hits themselves are *not* copied.
+        for (CalorimeterHit hit : cluster.getCalorimeterHits()) {
+            this.hits.add(hit);
+        }
+        
+        // Copy hit contributions.
+        this.hitContributions = new ArrayList<Double>();
+        for (Double contribution : cluster.getHitContributions()) {
+            this.hitContributions.add(contribution);
+        }
+                
+        // Set energy and energy error.
+        this.energy = cluster.getEnergy();
+        this.energyError = cluster.getEnergyError();        
+        
+        // Copy position into new array.
+        this.position = new double[cluster.getPosition().length];
+        System.arraycopy(cluster.getPosition(), 0, this.position, 0, cluster.getPosition().length);
+                                
+        // Copy position error into new array.
+        this.positionError = new double[cluster.getPositionError().length];
+        System.arraycopy(cluster.getPositionError(), 0, this.positionError, 0, cluster.getPositionError().length);
+        
+        // Set iphi and itheta.
+        this.iphi = cluster.getIPhi();
+        this.itheta = cluster.getITheta();
+
+        // Copy direction error into new array.
+        this.directionError = new double[cluster.getDirectionError().length];
+        System.arraycopy(cluster.getDirectionError(), 0, this.directionError, 0, cluster.getDirectionError().length);
+
+        // Copy shape parameters into new array.
+        this.shapeParameters = new double[cluster.getShape().length];
+        System.arraycopy(cluster.getShape(), 0, this.shapeParameters, 0, cluster.getShape().length);
+       
+        // Copy type and PID.
+        this.type = cluster.getType();
+        this.pid = cluster.getParticleId();
+        
+        // Set needs property calculation.
+        this.needsPropertyCalculation = cluster.needsPropertyCalculation();
+    }   
+    
+    /**
+     * Clone to a new object using the copy constructor.
+     * 
+     * @return the new object
+     */
+    public Object clone() {
+        return new BaseCluster(this);
+    }
+    
+    /**
      * Basic constructor that takes a list of hits.
      * It will apply the default energy calculation.
-     * @param hits The list of CalorimeterHits.
+     * 
+     * @param hits the list of CalorimeterHits
      */
     public BaseCluster(List<CalorimeterHit> hits) {
         addHits(hits);
@@ -132,8 +197,9 @@
     
     /**
      * Get the list of CalorimeterHits of this cluster.
+     * 
      * The hits are not necessarily unique in the list.
-     * @return The hits comprising the cluster.
+     * @return the hits comprising the cluster
      */
     public List<CalorimeterHit> getCalorimeterHits() {
         return hits;
@@ -141,7 +207,7 @@
 
     /**
      * Get the clusters that are part of this cluster.
-     * @return The clusters comprising the cluster.
+     * @return the clusters comprising the cluster
      */
     public List<Cluster> getClusters() {
         return clusters;
@@ -150,7 +216,8 @@
     /**
      * Get the energy of the cluster, which by default will be the
      * sum of the CalorimeterHit corrected energy values.
-     * @return The energy of the cluster.
+     * 
+     * @return the energy of the cluster
      */
     public double getEnergy() {
         return energy;
@@ -158,7 +225,8 @@
 
     /**
      * Get the energy error.
-     * @return The energy error.
+     * 
+     * @return the energy error
      */
     public double getEnergyError() {
         return energyError;
@@ -171,7 +239,8 @@
      * but the contributions may be set to different values
      * on a per hit basis using the {@link #addHit(CalorimeterHit, double)}
      * method.
-     * @return The individual hit contribution energies.
+     * 
+     * @return the individual hit contribution energies
      */
     public double[] getHitContributions() {                       
         double[] arrayCopy = new double[hitContributions.size()];
@@ -184,7 +253,8 @@
     /**
      * Get the list of subdetector energy contributions.
      * The ordering and meaning of this array is unspecified by this class.
-     * @return The list of subdetector energy contributions.
+     * 
+     * @return the list of subdetector energy contributions
      */
     public double[] getSubdetectorEnergies() {
         return subdetectorEnergies;
@@ -192,7 +262,7 @@
 
     /**
      * Get a value defining the type of this cluster.
-     * @return The type of this cluster.
+     * @return the type of this cluster
      */
     public int getType() {
         return type;
@@ -201,7 +271,8 @@
     /**
      * Get the number of hits in the cluster, including hits in sub-clusters. 
      * Hits belonging to more than one cluster are counted once.
-     * @return The size of the cluster.
+     * 
+     * @return the size of the cluster
      */
     public int getSize() {                       
         Set<CalorimeterHit> hitSet = new HashSet<CalorimeterHit>(this.hits);
@@ -215,7 +286,8 @@
     
     /**
      * Get the intrinsic phi direction of the cluster.
-     * @return The intrinsic phi direction of the cluster.
+     * 
+     * @return the intrinsic phi direction of the cluster
      */
     public double getIPhi() {
         checkCalculateProperties();
@@ -224,7 +296,7 @@
 
     /**
      * Get the intrinsic theta direction of the cluster.
-     * @return The intrinsic theta direction of the cluster.
+     * @return the intrinsic theta direction of the cluster
      */
     public double getITheta() {
         checkCalculateProperties();
@@ -233,7 +305,7 @@
 
     /**
      * Get the direction error of the cluster as a double array of size 6.
-     * @return The direction error of the cluster.
+     * @return the direction error of the cluster
      */
     public double[] getDirectionError() {
         checkCalculateProperties();
@@ -242,7 +314,7 @@
 
     /**
      * Get the position of the cluster as a double array of size 3.
-     * @return The position of the cluster.
+     * @return the position of the cluster
      */
     public double[] getPosition() {
         checkCalculateProperties();
@@ -251,7 +323,8 @@
 
     /**
      * Get the position error of the cluster as a double array of size 6.
-     * @return The position error of the cluster.
+     * 
+     * @return the position error of the cluster
      */
     public double[] getPositionError() {
         checkCalculateProperties();
@@ -260,7 +333,8 @@
 
     /**
      * Get the shape parameters of the cluster as a double array of unspecified size.
-     * @return The shape parameters of the cluster.
+     * 
+     * @return the shape parameters of the cluster
      */
     public double[] getShape() {
         checkCalculateProperties();
@@ -269,7 +343,8 @@
     
     /**
      * Get the PDG ID of the particle hypothesis.
-     * @return The PID.
+     * 
+     * @return the PID
      */
     public int getParticleId() {
         return pid;
@@ -283,8 +358,9 @@
     
     /**
      * Set the position of the cluster.    
-     * @param position The position of the cluster.
-     * @throws IllegalArgumentException if array is wrong size.
+     * 
+     * @param position the position of the cluster
+     * @throws IllegalArgumentException if array is wrong size
      */
     public void setPosition(double[] position) {
         if (position.length != 3) {
@@ -295,8 +371,9 @@
     
     /**
      * Set the position error of the cluster.
-     * @param positionError The position error of the cluster.    
-     * @throws IllegalArgumentException if array is wrong size.
+     * 
+     * @param positionError the position error of the cluster    
+     * @throws IllegalArgumentException if array is wrong size
      */
     public void setPositionError(double[] positionError) {
         if (positionError.length != 6) {
@@ -307,7 +384,8 @@
 
     /**
      * Set the intrinsic phi of the cluster.
-     * @param iphi The intrinsic phi of the cluster.
+     * 
+     * @param iphi the intrinsic phi of the cluster
      */
     public void setIPhi(double iphi) {
         this.iphi = iphi;
@@ -315,6 +393,7 @@
     
     /**
      * Set the intrinsic theta of the cluster.
+     * 
      * @param iphi The intrinsic theta of the cluster.
      */
     public void setITheta(double itheta) {
@@ -322,9 +401,10 @@
     }
 
     /**
-     * Set the direction error of the cluster.    
-     * @param directionError The direction error of the cluster.
-     * @throws IllegalArgumentException if array is wrong size.
+     * Set the direction error of the cluster.
+     *     
+     * @param directionError the direction error of the cluster
+     * @throws IllegalArgumentException if array is wrong size
      */
     public void setDirectionError(double[] directionError) {
         if (directionError.length != 6) {
@@ -335,7 +415,8 @@
     
     /**
      * Set the shape parameters of the cluster.
-     * @param shapeParameters The shape parameters.
+     * 
+     * @param shapeParameters the shape parameters
      */
     public void setShapeParameters(double[] shapeParameters) {
         this.shapeParameters = shapeParameters;
@@ -343,7 +424,8 @@
     
     /**
      * Set the type of the cluster.
-     * @param type The type of the cluster.
+     * 
+     * @param type the type of the cluster
      */
     public void setType(int type) {
         this.type = type;    
@@ -351,7 +433,8 @@
     
     /**
      * Get the PDG ID of the particle hypothesis.
-     * @return The PID.
+     * 
+     * @return the PID
      */
     public void setParticleId(int pid) {
         this.pid = pid;
@@ -361,7 +444,8 @@
      * Set a total energy of this cluster, overriding any energy
      * value that may have been automatically calculated from
      * hit energies.
-     * @param energy The total energy of this cluster.
+     * 
+     * @param energy the total energy of this cluster
      */
     public void setEnergy(double energy) {
         this.energy = energy;
@@ -369,7 +453,8 @@
     
     /**
      * Set the error on the energy measurement.
-     * @param energyError The error on the energ measurement.
+     * 
+     * @param energyError the error on the energ measurement
      */
     public void setEnergyError(double energyError) {
         this.energyError = energyError;
@@ -377,7 +462,8 @@
    
     /**
      * Set the subdetector energies.  
-     * @param subdetectorEnergies The subdetector energies.
+     * 
+     * @param subdetectorEnergies the subdetector energies
      */
     public void setSubdetectorEnergies(double[] subdetectorEnergies) {
         this.subdetectorEnergies = subdetectorEnergies;
@@ -391,7 +477,8 @@
     
     /**
      * Add a list of hits to the cluster.
-     * @param The list of hits to add.
+     * 
+     * @param the list of hits to add
      */
     public void addHits(List<CalorimeterHit> hits) {
         for (CalorimeterHit hit : hits) {
@@ -401,7 +488,8 @@
     
     /**
      * Add a list of sub-clusters to the cluster.
-     * @param The list of clusters to add.
+     * 
+     * @param the list of clusters to add
      */
     public void addClusters(List<Cluster> clusters) {
         for (Cluster cluster : clusters) {
@@ -411,7 +499,8 @@
     
     /**
      * Add a sub-cluster to the cluster.
-     * @param cluster The cluster to add.
+     * 
+     * @param cluster the cluster to add
      */
     public void addCluster(Cluster cluster) {
         clusters.add(cluster);
@@ -426,7 +515,8 @@
     
     /**
      * Add a hit to the cluster with default energy contribution.
-     * @param hit The hit to add.
+     * 
+     * @param hit the hit to add
      */
     public void addHit(CalorimeterHit hit) {        
         addHit(hit, hit.getCorrectedEnergy());
@@ -435,8 +525,9 @@
     
     /**
      * Add a hit to the cluster with specified energy contribution.
-     * @param hit The hit to add.
-     * @param contribution The energy contribution of the hit [GeV].
+     * 
+     * @param hit the hit to add     
+     * @param contribution the energy contribution of the hit [GeV]
      */
     public void addHit(CalorimeterHit hit, double contribution) {
         hits.add(hit);        
@@ -447,7 +538,8 @@
 
     /**
      * Remove a hit from the cluster.
-     * @param hit The hit to remove.
+     * 
+     * @param hit the hit to remove
      */
     public void removeHit(CalorimeterHit hit) {
         int index = hits.indexOf(hit);
@@ -475,23 +567,26 @@
     
     /**
      * Set a property calculator for computing position, etc.
-     * @param calc The property calculator.
+     * 
+     * @param calc the property calculator
      */
     public void setPropertyCalculator(ClusterPropertyCalculator calc) {
         this.calc = calc;
     }
 
     /**
-     * True if property calculator is set.
-     * @return True if property calculator is set.
+     * Return <code>true</code> if property calculator is set.
+     * 
+     * @return <code>true</code> if property calculator is set
      */
     public boolean hasPropertyCalculator() {
         return calc != null;
     }
     
     /**
-     * True if cluster is flagged as needed a property calculation.
-     * @return True if cluster needs property calculation.
+     * Return <code>true</code> if cluster is flagged as needed a property calculation.
+     * 
+     * @return <code>true</code> if cluster needs property calculation
      */
     public boolean needsPropertyCalculation() {
         return needsPropertyCalculation;
@@ -499,7 +594,8 @@
     
     /**
      * Manually set whether the cluster needs property calculation.
-     * @param needsPropertyCalculation Whether the cluster needs property calculation.
+     * 
+     * @param needsPropertyCalculation <code>true</code> if cluster needs property calculation
      */
     public void setNeedsPropertyCalculation(boolean needsPropertyCalculation) {
         this.needsPropertyCalculation = needsPropertyCalculation;
@@ -509,11 +605,11 @@
      * 
      * Calculate the properties of this cluster using the current 
      * <code>ClusterPropertyCalculator</code>. The calculated properties will be
-     * set on the following class variables:<br/> 
+     * set on the following class variables:<br/>
      * {@link #position}, {@link #positionError}, 
      * {@link #iphi}, {@link #itheta}, {@link #directionError},   
-     * and {@link #shapeParameters}.  The cluster will then be flagged
-     * as not needing a property calculation in its current state.         
+     * and {@link #shapeParameters}.  Then {@link #needsPropertyCalculation} will be 
+     * set to <code>false</code> until the cluster's state changes.
      */
     public void calculateProperties() {
         if (!hasPropertyCalculator()) {

########################################################################
Use REPLY-ALL to reply to list

To unsubscribe from the LCDET-SVN list, click the following link:
https://listserv.slac.stanford.edu/cgi-bin/wa?SUBED1=LCDET-SVN&A=1