Print

Print


Commit in hps-java/src/main/java/org/lcsim/hps/recon/ecal on MAIN
HPSFADCSingleTriggerDriver.java+242added 1.1
Single cluster trigger version.

hps-java/src/main/java/org/lcsim/hps/recon/ecal
HPSFADCSingleTriggerDriver.java added at 1.1
diff -N HPSFADCSingleTriggerDriver.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ HPSFADCSingleTriggerDriver.java	2 Oct 2012 22:48:17 -0000	1.1
@@ -0,0 +1,242 @@
+package org.lcsim.hps.recon.ecal;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.lcsim.event.Cluster;
+import org.lcsim.event.EventHeader;
+import org.lcsim.hps.evio.TriggerData;
+import org.lcsim.hps.util.ClockSingleton;
+
+/**
+ * Reads clusters and makes trigger decision using opposite quadrant criterion.
+ * Prints triggers to file if file path specified.
+ *
+ * @author Omar Moreno <[log in to unmask]>
+ * @author Sho Uemura <[log in to unmask]>
+ * @author Per Hansson Adrian <[log in to unmask]>
+ * @version $Id: HPSFADCSingleTriggerDriver.java,v 1.1 2012/10/02 22:48:17 phansson Exp $
+ */
+public class HPSFADCSingleTriggerDriver extends HPSTriggerDriver {
+
+    private static final double GeV = 1000;
+    // A list to contain all cluster pairs in an event
+    List<HPSEcalCluster[]> clusterPairs;
+    int nTriggers;
+    int totalEvents;
+    private double clusterEnergyHigh = 1.85 * GeV; // GeV
+    private double clusterEnergyLow = .1 * GeV;    // GeV
+    private double energySumThreshold = 2.2 * GeV;  // GeV
+    private double energyDifferenceThreshold = 1.5 * GeV; // GeV
+    private double maxCoplanarityAngle = 35; // degrees
+    int allClusters;
+    int clusterEnergyCount;
+    int deadtimelessTriggerCount;
+
+    public HPSFADCSingleTriggerDriver() {
+        clusterPairs = new LinkedList<HPSEcalCluster[]>();
+    }
+
+    @Override
+    public void startOfData() {
+        super.startOfData();
+
+        allClusters = 0;
+        clusterEnergyCount = 0;
+        deadtimelessTriggerCount = 0;
+    }
+
+    @Override
+    public boolean testTrigger(List<HPSEcalCluster> clusters) {
+        boolean trigger = false;
+
+        //--- Apply Trigger Cuts ---//
+
+        // Iterate through all clusters present in the event.  
+        //If at least one of the clusters satisfies all of the trigger conditions,
+        // a trigger signal is sent to all other detectors.
+        for (HPSEcalCluster cluster : clusters) {
+            
+            
+            if (outputStream != null) {
+                outputStream.printf("Event %d: cluster energy %f in quadrant %d (%s)\n",
+                        ClockSingleton.getClock(),
+                        cluster.getEnergy(), HPSECalUtils.getQuadrant(cluster),cluster.getSeedHit().getPositionVec().toString());
+                        
+            }
+            
+            allClusters++;
+            
+          
+            // Require the componets of a cluster pair to have an energy in
+            // the range of 100 MeV to 1.85 GeV
+            if (!clusterECut(cluster)) {
+                if (outputStream != null) {
+                    outputStream.println("Failed cluster energy cut");
+                }
+                continue;
+            }
+            clusterEnergyCount++;
+
+            // If all cuts are pased, we have a trigger
+            if (outputStream != null) {
+                outputStream.println("Passed all cuts");
+            }
+            trigger = true;
+        }
+        if (trigger) {
+            deadtimelessTriggerCount++;
+        }
+        return trigger;
+    }
+
+    @Override
+    public void endOfData() {
+        if (outputStream != null) {
+            outputStream.printf("%s: Number of clusters: %d\n",this.getClass().getSimpleName(),allClusters);
+            outputStream.printf("%s: Number of cluster pairs after successive trigger conditions:\n",this.getClass().getSimpleName());
+            outputStream.printf("%s: Cluster energy: %d\n",this.getClass().getSimpleName(), clusterEnergyCount);
+            outputStream.printf("%s: Trigger count without dead time: %d\n",this.getClass().getSimpleName(), deadtimelessTriggerCount);
+            outputStream.printf("%s: Trigger count: %d\n",this.getClass().getSimpleName(), numTriggers);
+            outputStream.close();
+        }
+        System.out.printf("%s: Number of pairs: %d\n",this.getClass().getSimpleName(),allClusters);
+        System.out.printf("%s: Number of cluster pairs after successive trigger conditions:\n",this.getClass().getSimpleName());
+        System.out.printf("%s: Cluster energy: %d\n",this.getClass().getSimpleName(), clusterEnergyCount);
+        System.out.printf("%s: Trigger count without dead time: %d\n",this.getClass().getSimpleName(), deadtimelessTriggerCount);
+        System.out.printf("%s: Trigger count: %d\n",this.getClass().getSimpleName(), numTriggers);
+        super.endOfData();
+    }
+
+   
+
+    /**
+     * Checks if the ECal clusters making up a cluster pair lie in opposite
+     * quadrants
+     *
+     * @param clusterPair : pair of clusters
+     * @return true if opposite quadrants, false otherwise
+     */
+    public boolean oppositeQuadrantsCut(HPSEcalCluster[] clusterPair) {
+        int quad1 = HPSECalUtils.getQuadrant(clusterPair[0]);
+        int quad2 = HPSECalUtils.getQuadrant(clusterPair[1]);
+
+        //if clusters are in the same quadrant, they're not opposite quadrants
+        if (quad1 == quad2) {
+            return false;
+        } //opposite pairs of quadrants are either both even (2 and 4) or both odd (1 and 3)
+        else {
+            return ((quad1 & 1) == (quad2 & 1));
+        }
+    }
+
+    /**
+     * Checks if the ECal clusters making up a cluster pair lie above the low
+     * energy threshold and below the high energy threshold
+     *
+     * @param clusterPair : pair of clusters
+     * @return true if a pair is found, false otherwise
+     */
+    public boolean clusterECut(HPSEcalCluster cluster) {
+        return (cluster.getEnergy() < clusterEnergyHigh && cluster.getEnergy() > clusterEnergyLow);
+    }
+
+    /**
+     * Checks if the sum of the energies of ECal clusters making up a cluster
+     * pair is below an energy sum threshold
+     *
+     * @param clusterPair : pair of clusters
+     * @return true if a pair is found, false otherwise
+     */
+    public boolean energySum(Cluster[] clusterPair) {
+        double clusterESum = clusterPair[0].getEnergy()
+                + clusterPair[1].getEnergy();
+        return (clusterESum < energySumThreshold);
+    }
+
+    /**
+     * Checks if the energy difference between the ECal clusters making up a
+     * cluster pair is below an energy difference threshold
+     *
+     * @param clusterPair : pair of clusters
+     * @return true if pair is found, false otherwise
+     */
+    public boolean energyDifference(HPSEcalCluster[] clusterPair) {
+        double clusterEDifference = Math.abs(clusterPair[0].getEnergy()
+                - clusterPair[1].getEnergy());
+
+        return (clusterEDifference < energyDifferenceThreshold);
+    }
+
+    /**
+     * Require that the distance from the beam of the lowest energy cluster in a
+     * cluster pair satisfies the following E_low + d_b*.0032 GeV/mm < .8 GeV
+     *
+     * @param clusterPair : pair of clusters
+     * @return true if pair is found, false otherwise
+     */
+    public boolean energyDistanceCut(HPSEcalCluster[] clusterPair) {
+        HPSEcalCluster lowEnergyCluster;
+
+        // Obtain the lowest energy cluster
+        if (clusterPair[0].getEnergy() < clusterPair[1].getEnergy()) {
+            lowEnergyCluster = clusterPair[0];
+        } else {
+            lowEnergyCluster = clusterPair[1];
+        }
+
+        double lowEClusterPosition[] = lowEnergyCluster.getSeedHit().getPosition();
+        // Calculate its position
+        double lowEClusterDistance = Math.sqrt(Math.pow(lowEClusterPosition[0], 2)
+                + Math.pow(lowEClusterPosition[1], 2));
+
+        double clusterDistvsE = lowEnergyCluster.getEnergy() + lowEClusterDistance * (0.0032 * GeV);
+
+        if (clusterDistvsE > .8 * GeV /*
+                 * GeV
+                 */) {
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * Checks if a cluster pair is coplanar to the beam within a given angle
+     *
+     * @param clusterPair : pair of clusters
+     * @return true if pair is found, false otherwise
+     */
+    public boolean coplanarityCut(HPSEcalCluster[] clusterPair) {
+        double cluster1Position[] = clusterPair[0].getSeedHit().getPosition();
+        double cluster2Position[] = clusterPair[1].getSeedHit().getPosition();
+        // Find the distance of both clusters from the origin
+        double cluster1Dist = Math.sqrt(Math.pow(cluster1Position[0], 2)
+                + Math.pow(cluster1Position[1], 2));
+        double cluster2Dist = Math.sqrt(Math.pow(cluster2Position[0], 2)
+                + Math.pow(cluster2Position[1], 2));
+        
+        // Calculate the dot product between the distance vectors of
+        // each cluster in the cluster pair
+        double clusterDot = cluster1Position[0] * cluster2Position[0]
+                + cluster1Position[1] * cluster2Position[1];
+
+        // Find the angle between clusters in the pair
+        double cosphi = clusterDot / (cluster1Dist * cluster2Dist);
+        double phi = Math.toDegrees(Math.acos(cosphi));
+
+        return ((180 - phi) < maxCoplanarityAngle);
+    }
+
+    /**
+     * Make a dummy TriggerData
+     */
+    @Override
+    protected void makeTriggerData(EventHeader event, String collectionName) {
+        TriggerData tData = new TriggerData(new int[8]);
+        List<TriggerData> triggerList = new ArrayList<TriggerData>();
+        triggerList.add(tData);
+        event.put(collectionName, triggerList, TriggerData.class, 0);
+    }
+}
\ No newline at end of file
CVSspam 0.2.12


Use REPLY-ALL to reply to list

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