Author: [log in to unmask] Date: Tue Aug 4 19:00:29 2015 New Revision: 3337 Log: fix mismatch between pairs and singles trigger delays Modified: java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/SinglesTriggerDriver.java java/trunk/steering-files/src/main/resources/org/hps/steering/readout/EngineeringRun2015TrigPairs1.lcsim java/trunk/steering-files/src/main/resources/org/hps/steering/readout/EngineeringRun2015TrigSingles1.lcsim java/trunk/tracking/src/main/java/org/hps/readout/svt/SimpleSvtReadout.java Modified: java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/SinglesTriggerDriver.java ============================================================================= --- java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/SinglesTriggerDriver.java (original) +++ java/trunk/ecal-readout-sim/src/main/java/org/hps/readout/ecal/SinglesTriggerDriver.java Tue Aug 4 19:00:29 2015 @@ -2,31 +2,32 @@ import hep.aida.IHistogram1D; import hep.aida.IHistogram2D; - +import java.util.ArrayList; +import java.util.LinkedList; import java.util.List; - +import java.util.Queue; import org.hps.recon.ecal.triggerbank.TriggerModule; import org.lcsim.event.Cluster; import org.lcsim.event.EventHeader; import org.lcsim.util.aida.AIDA; /** - * Class <code>SinglesTriggerDriver</code> represents a basic single - * cluster trigger. It triggers off of seed energy (upper and lower - * bounds), cluster total energy (upper and lower bounds), and the - * cluster hit count (lower bound only). All parameters may be set - * through a steering file. - * + * Class <code>SinglesTriggerDriver</code> represents a basic single cluster + * trigger. It triggers off of seed energy (upper and lower bounds), cluster + * total energy (upper and lower bounds), and the cluster hit count (lower bound + * only). All parameters may be set through a steering file. + * * @author Kyle McCarty <[log in to unmask]> * @see TriggerDriver */ public class SinglesTriggerDriver extends TriggerDriver { + // Cut Values private TriggerModule triggerModule = new TriggerModule(); - + // LCIO Collection Names private String clusterCollectionName = "EcalClusters"; - + // AIDA Plots private AIDA aida = AIDA.defaultInstance(); private IHistogram1D clusterSeedEnergy = aida.histogram1D("Trigger Plots :: Cluster Seed Energy Distribution", 176, 0.0, 2.2); @@ -37,21 +38,44 @@ private IHistogram1D clusterTotalEnergySingle = aida.histogram1D("Trigger Plots :: Cluster Total Energy Distribution (Passed Single Cuts)", 176, 0.0, 2.2); private IHistogram2D clusterDistribution = aida.histogram2D("Trigger Plots :: Cluster Seed Distribution", 46, -23, 23, 11, -5.5, 5.5); private IHistogram2D clusterDistributionSingle = aida.histogram2D("Trigger Plots :: Cluster Seed Distribution (Passed Single Cuts)", 46, -23, 23, 11, -5.5, 5.5); - + + private final Queue<List<Cluster>> clusterDelayQueue; //the length of this queue sets the trigger delay. Defaults to length 1 (zero delay). + + public SinglesTriggerDriver() { + clusterDelayQueue = new LinkedList<List<Cluster>>(); + clusterDelayQueue.add(new ArrayList<Cluster>()); + } + + /** + * Sets the trigger delay (units of 4-ns FADC clocks). Default of 0. + * + * @param delay + */ + public void setDelay(int delay) { + clusterDelayQueue.clear(); + for (int i = 0; i <= delay; i++) { + clusterDelayQueue.add(new ArrayList<Cluster>()); + } + } + @Override public void process(EventHeader event) { // Make sure that there are clusters in the event. - if(event.hasCollection(Cluster.class, clusterCollectionName)) { + if (event.hasCollection(Cluster.class, clusterCollectionName)) { // Get the list of clusters. List<Cluster> clusterList = event.get(Cluster.class, clusterCollectionName); - + + // Add the new cluster collection to the queue. + clusterDelayQueue.add(clusterList); + clusterDelayQueue.remove(); + // Iterate over the clusters. - for(Cluster cluster : clusterList) { + for (Cluster cluster : clusterList) { // Get the x and y indices. int ix = cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("ix"); int iy = cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("iy"); ix = ix > 0 ? ix - 1 : ix; - + // Populate the uncut plots. clusterSeedEnergy.fill(cluster.getCalorimeterHits().get(0).getCorrectedEnergy(), 1); clusterTotalEnergy.fill(cluster.getEnergy(), 1); @@ -63,49 +87,50 @@ // Perform the superclass event processing. super.process(event); } - - /** - * Performs cluster singles cuts. These include seed energy, cluster - * energy, and minimum hit count. + + /** + * Performs cluster singles cuts. These include seed energy, cluster energy, + * and minimum hit count. + * * @return Returns <code>true</code> if the event passes the trigger * conditions and <code>false</code> otherwise. */ @Override protected boolean triggerDecision(EventHeader event) { - // Track whether triggering cluster was seen. - boolean passTrigger = false; - + // Track whether triggering cluster was seen. + boolean passTrigger = false; + // Check that there is a cluster object collection. - if(event.hasCollection(Cluster.class, clusterCollectionName)) { - // Get the list of hits. - List<Cluster> clusterList = event.get(Cluster.class, clusterCollectionName); - + if (event.hasCollection(Cluster.class, clusterCollectionName)) { + // Get the list of clusters. + List<Cluster> clusterList = clusterDelayQueue.peek(); + // Iterate over the hits and perform the cuts. triggerLoop: - for(Cluster cluster : clusterList) { + for (Cluster cluster : clusterList) { // Perform the hit count cut. - if(!triggerModule.clusterHitCountCut(cluster)) { + if (!triggerModule.clusterHitCountCut(cluster)) { continue triggerLoop; } - + // Perform the seed hit cut. - if(!triggerModule.clusterSeedEnergyCut(cluster)) { + if (!triggerModule.clusterSeedEnergyCut(cluster)) { continue triggerLoop; } - + // Perform the cluster energy cut. - if(!triggerModule.clusterTotalEnergyCut(cluster)) { + if (!triggerModule.clusterTotalEnergyCut(cluster)) { continue triggerLoop; } - + // A trigger was seen. Note it. passTrigger = true; - + // Get the x and y indices. int ix = cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("ix"); int iy = cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("iy"); ix = ix > 0 ? ix - 1 : ix; - + // Populate the cut plots. clusterSeedEnergySingle.fill(cluster.getCalorimeterHits().get(0).getCorrectedEnergy(), 1); clusterTotalEnergySingle.fill(cluster.getEnergy(), 1); @@ -113,70 +138,77 @@ clusterDistributionSingle.fill(ix, iy, 1); } } - + // Return whether a triggering cluster was seen. return passTrigger; } - - /** - * Sets the minimum hit count threshold for the trigger. This value - * is inclusive. + + /** + * Sets the minimum hit count threshold for the trigger. This value is + * inclusive. + * * @param hitCountThreshold - The value of the threshold. */ public void setHitCountThreshold(int hitCountThreshold) { - triggerModule.setCutValue(TriggerModule.CLUSTER_HIT_COUNT_LOW, hitCountThreshold); - } - - /** - * Sets the lower bound for the seed energy threshold on the trigger. + triggerModule.setCutValue(TriggerModule.CLUSTER_HIT_COUNT_LOW, hitCountThreshold); + } + + /** + * Sets the lower bound for the seed energy threshold on the trigger. This + * value is inclusive. + * + * @param seedEnergyLow - The value of the threshold. + */ + public void setSeedEnergyLowThreshold(double seedEnergyLow) { + triggerModule.setCutValue(TriggerModule.CLUSTER_SEED_ENERGY_LOW, seedEnergyLow); + } + + /** + * Sets the upper bound for the seed energy threshold on the trigger. This + * value is inclusive. + * + * @param seedEnergyHigh - The value of the threshold. + */ + public void setSeedEnergyHighThreshold(double seedEnergyHigh) { + triggerModule.setCutValue(TriggerModule.CLUSTER_SEED_ENERGY_HIGH, seedEnergyHigh); + } + + /** + * Sets the lower bound for the cluster energy threshold on the trigger. * This value is inclusive. - * @param seedEnergyLow - The value of the threshold. - */ - public void setSeedEnergyLowThreshold(double seedEnergyLow) { - triggerModule.setCutValue(TriggerModule.CLUSTER_SEED_ENERGY_LOW, seedEnergyLow); - } - - /** - * Sets the upper bound for the seed energy threshold on the trigger. + * + * @param clusterEnergyLow - The value of the threshold. + */ + public void setClusterEnergyLowThreshold(double clusterEnergyLow) { + triggerModule.setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_LOW, clusterEnergyLow); + } + + /** + * Sets the upper bound for the cluster energy threshold on the trigger. * This value is inclusive. - * @param seedEnergyHigh - The value of the threshold. - */ - public void setSeedEnergyHighThreshold(double seedEnergyHigh) { - triggerModule.setCutValue(TriggerModule.CLUSTER_SEED_ENERGY_HIGH, seedEnergyHigh); - } - - /** - * Sets the lower bound for the cluster energy threshold on the - * trigger. This value is inclusive. - * @param clusterEnergyLow - The value of the threshold. - */ - public void setClusterEnergyLowThreshold(double clusterEnergyLow) { - triggerModule.setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_LOW, clusterEnergyLow); - } - - /** - * Sets the upper bound for the cluster energy threshold on the - * trigger. This value is inclusive. + * * @param clusterEnergyHigh - The value of the threshold. */ public void setClusterEnergyHighThreshold(double clusterEnergyHigh) { - triggerModule.setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH, clusterEnergyHigh); - } - + triggerModule.setCutValue(TriggerModule.CLUSTER_TOTAL_ENERGY_HIGH, clusterEnergyHigh); + } + /** * Sets the name of the LCIO collection from which clusters are drawn. + * * @param clusterCollectionName - The name of the LCIO collection. */ public void setClusterCollectionName(String clusterCollectionName) { this.clusterCollectionName = clusterCollectionName; } - - /** - * Sets all cut values for the trigger using a string argument with - * the format "Emin Emax Nmin". + + /** + * Sets all cut values for the trigger using a string argument with the + * format "Emin Emax Nmin". + * * @param cuts - The cut string. */ public void setCuts(String cuts) { - triggerModule.setCutValues(true, cuts); - } -} + triggerModule.setCutValues(true, cuts); + } +} Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/readout/EngineeringRun2015TrigPairs1.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/readout/EngineeringRun2015TrigPairs1.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/readout/EngineeringRun2015TrigPairs1.lcsim Tue Aug 4 19:00:29 2015 @@ -43,7 +43,7 @@ <readoutThreshold>12</readoutThreshold> <triggerThreshold>12</triggerThreshold> <readoutWindow>50</readoutWindow> - <readoutLatency>74</readoutLatency> + <readoutLatency>77</readoutLatency> <mode>1</mode> </driver> <driver name="EcalConverter" type="org.hps.recon.ecal.EcalRawConverterDriver"> Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/readout/EngineeringRun2015TrigSingles1.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/readout/EngineeringRun2015TrigSingles1.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/readout/EngineeringRun2015TrigSingles1.lcsim Tue Aug 4 19:00:29 2015 @@ -43,7 +43,7 @@ <readoutThreshold>12</readoutThreshold> <triggerThreshold>12</triggerThreshold> <readoutWindow>50</readoutWindow> - <readoutLatency>74</readoutLatency> + <readoutLatency>77</readoutLatency> <mode>1</mode> </driver> <driver name="EcalConverter" type="org.hps.recon.ecal.EcalRawConverterDriver"> @@ -78,6 +78,7 @@ <clusterEnergyLowThreshold>0.400</clusterEnergyLowThreshold> <clusterEnergyHighThreshold>1.100</clusterEnergyHighThreshold> <prescale>1</prescale> + <delay>3</delay> <outputFileName>${outputFile}.triggers.singles1</outputFileName> <!--<verbose>true</verbose>--> </driver> Modified: java/trunk/tracking/src/main/java/org/hps/readout/svt/SimpleSvtReadout.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/readout/svt/SimpleSvtReadout.java (original) +++ java/trunk/tracking/src/main/java/org/hps/readout/svt/SimpleSvtReadout.java Tue Aug 4 19:00:29 2015 @@ -162,8 +162,8 @@ if (useTimingConditions) { SvtTimingConstants timingConstants = DatabaseConditionsManager.getInstance().getCachedConditions(SvtTimingConstants.SvtTimingConstantsCollection.class, "svt_timing_constants").getCachedData().get(0); - readoutOffset = 4 * timingConstants.getOffsetPhase(); - readoutLatency = 236.0 + timingConstants.getOffsetTime(); + readoutOffset = 4 * (timingConstants.getOffsetPhase() + 3); + readoutLatency = 248.0 + timingConstants.getOffsetTime(); } }