Author: [log in to unmask] Date: Tue Sep 27 08:50:14 2016 New Revision: 4501 Log: Adding working copy of a DAQConfigDriver that can read runtime settings from the database. Added: java/trunk/users/src/main/java/org/hps/users/kmccarty/DatabaseDAQConfigDriver.java (with props) Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/HPSEcalDataPlotsDriver.java java/trunk/users/src/main/java/org/hps/users/kmccarty/TriggerProcessAnalysisDriver.java java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/FormattedPlot.java java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/FormattedPlot1D.java java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/FormattedPlot2D.java java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/PlotFormatModule.java java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/PlotsFormatter.java java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/InvariantMassPlotsFormatter.java java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/MTEPlotFormatter.java java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/MTETriggerPlotsFormatter.java java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/ParticleMCAnalysisPlotsFormatter.java java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/RafoTridentFormatter.java java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/SingleTriggerPlotsFormatter.java java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/TridentTrackFormatter.java java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/TriggerPlotsFormat.java Added: java/trunk/users/src/main/java/org/hps/users/kmccarty/DatabaseDAQConfigDriver.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/DatabaseDAQConfigDriver.java (added) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/DatabaseDAQConfigDriver.java Tue Sep 27 08:50:14 2016 @@ -0,0 +1,79 @@ +package org.hps.users.kmccarty; + +import org.hps.record.daqconfig.ConfigurationManager; +import org.hps.record.daqconfig.DAQConfigDriver; +import org.hps.record.daqconfig.EvioDAQParser; +import org.hps.record.triggerbank.TriggerConfigData; +import org.hps.record.triggerbank.TriggerConfigData.Crate; +import org.hps.rundb.DaoProvider; +import org.hps.rundb.RunManager; +import org.lcsim.event.EventHeader; +import org.lcsim.geometry.Detector; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.StringReader; + +public class DatabaseDAQConfigDriver extends DAQConfigDriver { + // Define the crate enumerables by crate number. Crates are + // in the order 46, 37, 39. + private static final Crate[] CRATES = { Crate.CONFIG3, Crate.CONFIG1, Crate.CONFIG2 }; + + @Override + public void detectorChanged(Detector detector) { + // Make sure that the run number is defined. + if(getRunNumber() == -1) { throw new IllegalArgumentException("Run number is undefined."); } + + // Get the trigger configuration data. + RunManager manager = new RunManager(); + manager.setRun(getRunNumber()); + DaoProvider factory = new DaoProvider(manager.getConnection()); + TriggerConfigData triggerConfig = factory.getTriggerConfigDao().getTriggerConfig(RunManager.getRunManager().getRun()); + + // Convert the trigger configuration text blocks into individual + // strings. + String[][] data = null; + try { data = getDataFileArrays(triggerConfig); } + catch(IOException e) { + throw new RuntimeException("An error occurred when processing the trigger data."); + } + + // Instantiate an EvIO DAQ parser and feed it the data. + EvioDAQParser daqConfig = new EvioDAQParser(); + for(int i = 0; i < 3; i++) { + daqConfig.parse(CRATES[i].getCrateNumber(), getRunNumber(), data[i]); + } + + // Update the configuration manager. + ConfigurationManager.updateConfiguration(daqConfig); + + // Close the manager. + manager.closeConnection(); + } + + @Override + public void process(EventHeader event) { } + + private static final String[][] getDataFileArrays(TriggerConfigData triggerConfig) throws IOException { + // Create file readers to process the data files. + StringReader[] fr = new StringReader[3]; + BufferedReader[] reader = new BufferedReader[3]; + for(int i = 0; i < 3; i++) { + fr[i] = new StringReader(triggerConfig.getData().get(CRATES[i])); + reader[i] = new BufferedReader(fr[i]); + } + + // Convert the crate data into an array of strings. These must + // be in the order of 46, 37, 39. + String[][] data = getDataFileArrays(reader); + + // Close the readers. + for(int i = 0; i < 3; i++) { + reader[i].close(); + fr[i].close(); + } + + // Return the converted data. + return data; + } +} Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/HPSEcalDataPlotsDriver.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/HPSEcalDataPlotsDriver.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/HPSEcalDataPlotsDriver.java Tue Sep 27 08:50:14 2016 @@ -27,22 +27,23 @@ * @author Kyle McCarty <[log in to unmask]> */ public class HPSEcalDataPlotsDriver extends Driver { - private String plotsGroupName= "Data Plots"; - private String bankCollectionName = "TriggerBank"; - private String clusterCollectionName = "EcalClusters"; - - private static final int PULSER = 0; - private static final int SINGLES0 = 1; - private static final int SINGLES1 = 2; - private static final int PAIR0 = 3; - private static final int PAIR1 = 4; - - private static final int ALL = 0; - private static final int EDGE = 1; - private static final int FIDUCIAL = 2; - - private AIDA aida = AIDA.defaultInstance(); - private IHistogram1D[][] clusterTotalEnergy = new IHistogram1D[5][3]; + private boolean useGoodSVT = false; + private String plotsGroupName= "Data Plots"; + private String bankCollectionName = "TriggerBank"; + private String clusterCollectionName = "EcalClusters"; + + private static final int PULSER = 0; + private static final int SINGLES0 = 1; + private static final int SINGLES1 = 2; + private static final int PAIR0 = 3; + private static final int PAIR1 = 4; + + private static final int ALL = 0; + private static final int EDGE = 1; + private static final int FIDUCIAL = 2; + + private AIDA aida = AIDA.defaultInstance(); + private IHistogram1D[][] clusterTotalEnergy = new IHistogram1D[5][3]; private IHistogram1D[][] clusterTime = new IHistogram1D[5][3]; private IHistogram1D[][] clusterHitCount = new IHistogram1D[5][3]; private IHistogram1D[][] clusterSeedEnergy = new IHistogram1D[5][3]; @@ -101,204 +102,228 @@ pairCoplanarityEnergySum[i][j] = aida.histogram2D(plotsGroupName + "/" + triggerNames[i] + "/" + positionNames[j] + "/Pair Energy Sum vs. Coplanarity", 150, 0.000, 1.500, 180, 0, 180); pairEnergySlope2D[i][j] = aida.histogram2D(plotsGroupName + "/" + triggerNames[i] + "/" - + positionNames[j] + "/Pair Energy Slope 2D", 75, 0.000, 1.500, 100, 0.0, 400.0); + + positionNames[j] + "/Pair Energy Slope 2D", 75, 0.000, 1.500, 100, 0.0, 400.0); + } + } + } + + /** + * Processes the event clusters and populates distribution charts + * from them for each trigger. Also creates separate plots for the + * edge and fiducial regions. + * @param event - The event containing LCIO collections to be used + * for plot population. + */ + @Override + public void process(EventHeader event) { + // Check whether the SVT was active in this event. + final String[] flagNames = { "svt_bias_good", "svt_burstmode_noise_good", "svt_position_good" }; + boolean svtGood = true; + for(int i = 0; i < flagNames.length; i++) { + int[] flag = event.getIntegerParameters().get(flagNames[i]); + if(flag == null || flag[0] == 0) { + svtGood = false; } } - } - - /** - * Processes the event clusters and populates distribution charts - * from them for each trigger. Also creates separate plots for the - * edge and fiducial regions. - * @param event - The event containing LCIO collections to be used - * for plot population. - */ - @Override - public void process(EventHeader event) { - // Get the TI and SSP banks. - TIData tiBank = null; - SSPData sspBank = null; - if(event.hasCollection(GenericObject.class, bankCollectionName)) { - // Get the bank list. - List<GenericObject> bankList = event.get(GenericObject.class, bankCollectionName); - - // Search through the banks and get the SSP and TI banks. - for(GenericObject obj : bankList) { - // If this is an SSP bank, parse it. - if(AbstractIntData.getTag(obj) == SSPData.BANK_TAG) { - sspBank = new SSPData(obj); - } - - // Otherwise, if this is a TI bank, parse it. - else if(AbstractIntData.getTag(obj) == TIData.BANK_TAG) { - tiBank = new TIData(obj); - } - } - } + + // If the SVT is not properly running, skip the event. + if(!svtGood && useGoodSVT) { return; } - // Get the list of clusters. - List<Cluster> clusters = null; - if(event.hasCollection(Cluster.class, clusterCollectionName)) { - clusters = event.get(Cluster.class, clusterCollectionName); - } - - // Require that all collections be initialized. - if(sspBank == null || tiBank == null || clusters == null) { - return; - } - - // Track which triggers are active. - boolean[] activeTrigger = new boolean[5]; - activeTrigger[PULSER] = tiBank.isPulserTrigger(); - activeTrigger[SINGLES0] = tiBank.isSingle0Trigger(); - activeTrigger[SINGLES1] = tiBank.isSingle1Trigger(); - activeTrigger[PAIR0] = tiBank.isPair0Trigger(); - activeTrigger[PAIR1] = tiBank.isPair1Trigger(); - - // Plot all cluster properties for each trigger. - for(Cluster cluster : clusters) { - // Check whether the cluster is a fiducial or edge cluster. - int positional = inFiducialRegion(cluster) ? FIDUCIAL : EDGE; - - // Fill the appropriate plots for each trigger with an - // active trigger bit for single clusters. - for(int i = 0; i < 5; i++) { - if(activeTrigger[i]) { - // Populate the ALL plots. - clusterSeedEnergy[i][ALL].fill(TriggerModule.getValueClusterSeedEnergy(cluster)); - clusterTotalEnergy[i][ALL].fill(cluster.getEnergy()); - clusterHitCount[i][ALL].fill(TriggerModule.getClusterHitCount(cluster)); - clusterTime[i][ALL].fill(TriggerModule.getClusterTime(cluster)); - clusterSeedPosition[i][ALL].fill(TriggerModule.getClusterXIndex(cluster), - TriggerModule.getClusterYIndex(cluster)); - - // Populate the positional plots. - clusterSeedEnergy[i][positional].fill(TriggerModule.getValueClusterSeedEnergy(cluster)); - clusterTotalEnergy[i][positional].fill(cluster.getEnergy()); - clusterHitCount[i][positional].fill(TriggerModule.getClusterHitCount(cluster)); - clusterTime[i][positional].fill(TriggerModule.getClusterTime(cluster)); - clusterSeedPosition[i][positional].fill(TriggerModule.getClusterXIndex(cluster), - TriggerModule.getClusterYIndex(cluster)); - } - } - } - - // Plot all pair properties for each trigger. - List<Cluster[]> pairs = TriggerModule.getTopBottomPairs(clusters, Cluster.class); - for(Cluster[] pair : pairs) { - // Check whether the cluster is a fiducial or edge cluster. - boolean[] isFiducial = { - inFiducialRegion(pair[0]), - inFiducialRegion(pair[1]) - }; - int positional = (isFiducial[0] && isFiducial[1]) ? FIDUCIAL : EDGE; - - // Fill the appropriate plots for each trigger with an - // active trigger bit for single clusters. - for(int i = 0; i < 5; i++) { - if(activeTrigger[i]) { - // Calculate the values. - double energySum = TriggerModule.getValueEnergySum(pair); - double energyDiff = TriggerModule.getValueEnergyDifference(pair); - double energySlope = TriggerModule.getValueEnergySlope(pair, 0.00550); - double coplanarity = TriggerModule.getValueCoplanarity(pair); - double timeCoincidence = TriggerModule.getValueTimeCoincidence(pair); - - // Get the energy slope values. - Cluster lowCluster = pair[0].getEnergy() < pair[1].getEnergy() ? pair[0] : pair[1]; - double clusterDistance = TriggerModule.getClusterDistance(lowCluster); - - // Populate the ALL plots. - pairEnergySum[i][ALL].fill(energySum); - pairEnergyDifference[i][ALL].fill(energyDiff); - pairEnergySlope[i][ALL].fill(energySlope); - pairCoplanarity[i][ALL].fill(coplanarity); - pairTimeCoincidence[i][ALL].fill(timeCoincidence); - pairEnergySum2D[i][ALL].fill(pair[0].getEnergy(), pair[1].getEnergy()); - pairCoplanarityEnergySum[i][ALL].fill(energySum, coplanarity); - pairEnergySlope2D[i][ALL].fill(lowCluster.getEnergy(), clusterDistance); - - // Populate the positional plots. - pairEnergySum[i][positional].fill(energySum); - pairEnergyDifference[i][positional].fill(energyDiff); - pairEnergySlope[i][positional].fill(energySlope); - pairCoplanarity[i][positional].fill(coplanarity); - pairTimeCoincidence[i][positional].fill(timeCoincidence); - pairEnergySum2D[i][positional].fill(pair[0].getEnergy(), pair[1].getEnergy()); - pairCoplanarityEnergySum[i][positional].fill(energySum, coplanarity); - pairEnergySlope2D[i][positional].fill(lowCluster.getEnergy(), clusterDistance); - } - } - } - } - - /** - * Indicates whether the argument cluster is located in the fiducial - * region or not. - * @param cluster - The cluster to check. - * @return Returns <code>true</code> if the cluster is located in - * the fiducial region and <code>false</code> otherwise. - */ - private static final boolean inFiducialRegion(Cluster cluster) { - // Get the x and y indices for the cluster. - int ix = TriggerModule.getClusterXIndex(cluster); - int absx = Math.abs(TriggerModule.getClusterXIndex(cluster)); - int absy = Math.abs(TriggerModule.getClusterYIndex(cluster)); - - // Check if the cluster is on the top or the bottom of the - // calorimeter, as defined by |y| == 5. This is an edge cluster - // and is not in the fiducial region. - if(absy == 5) { - return false; - } - - // Check if the cluster is on the extreme left or right side - // of the calorimeter, as defined by |x| == 23. This is also - // and edge cluster is not in the fiducial region. - if(absx == 23) { - return false; - } - - // Check if the cluster is along the beam gap, as defined by - // |y| == 1. This is an internal edge cluster and is not in the - // fiducial region. - if(absy == 1) { - return false; - } - - // Lastly, check if the cluster falls along the beam hole, as - // defined by clusters with -11 <= x <= -1 and |y| == 2. This - // is not the fiducial region. - if(absy == 2 && ix <= -1 && ix >= -11) { - return false; - } - - // If all checks fail, the cluster is in the fiducial region. - return true; - } - - /** - * Sets the name of the LCIO collection containing the clusters - * that are to be plotted. - * @param collection - The LCIO collection name. - */ - public void setClusterCollectionName(String collection) { - clusterCollectionName = collection; - } - - /** - * Defines the name of the LCIO collection containing the TI bank. - * @param collection - The LCIO collection name. - */ - public void setBankCollectionName(String collection) { - bankCollectionName = collection; - } - - /** - * Sets the name of the super-group folder containing all plots. - * @param name - The name of the plots folder. - */ - public void setPlotsGroupName(String name) { - plotsGroupName = name; - } + // Get the TI and SSP banks. + TIData tiBank = null; + SSPData sspBank = null; + if(event.hasCollection(GenericObject.class, bankCollectionName)) { + // Get the bank list. + List<GenericObject> bankList = event.get(GenericObject.class, bankCollectionName); + + // Search through the banks and get the SSP and TI banks. + for(GenericObject obj : bankList) { + // If this is an SSP bank, parse it. + if(AbstractIntData.getTag(obj) == SSPData.BANK_TAG) { + sspBank = new SSPData(obj); + } + + // Otherwise, if this is a TI bank, parse it. + else if(AbstractIntData.getTag(obj) == TIData.BANK_TAG) { + tiBank = new TIData(obj); + } + } + } + + // Get the list of clusters. + List<Cluster> clusters = null; + if(event.hasCollection(Cluster.class, clusterCollectionName)) { + clusters = event.get(Cluster.class, clusterCollectionName); + } + + // Require that all collections be initialized. + if(sspBank == null || tiBank == null || clusters == null) { + return; + } + + // Track which triggers are active. + boolean[] activeTrigger = new boolean[5]; + activeTrigger[PULSER] = tiBank.isPulserTrigger(); + activeTrigger[SINGLES0] = tiBank.isSingle0Trigger(); + activeTrigger[SINGLES1] = tiBank.isSingle1Trigger(); + activeTrigger[PAIR0] = tiBank.isPair0Trigger(); + activeTrigger[PAIR1] = tiBank.isPair1Trigger(); + + // Plot all cluster properties for each trigger. + for(Cluster cluster : clusters) { + // Check whether the cluster is a fiducial or edge cluster. + int positional = inFiducialRegion(cluster) ? FIDUCIAL : EDGE; + + // Fill the appropriate plots for each trigger with an + // active trigger bit for single clusters. + for(int i = 0; i < 5; i++) { + if(activeTrigger[i]) { + // Populate the ALL plots. + clusterSeedEnergy[i][ALL].fill(TriggerModule.getValueClusterSeedEnergy(cluster)); + clusterTotalEnergy[i][ALL].fill(cluster.getEnergy()); + clusterHitCount[i][ALL].fill(TriggerModule.getClusterHitCount(cluster)); + clusterTime[i][ALL].fill(TriggerModule.getClusterTime(cluster)); + clusterSeedPosition[i][ALL].fill(TriggerModule.getClusterXIndex(cluster), + TriggerModule.getClusterYIndex(cluster)); + + // Populate the positional plots. + clusterSeedEnergy[i][positional].fill(TriggerModule.getValueClusterSeedEnergy(cluster)); + clusterTotalEnergy[i][positional].fill(cluster.getEnergy()); + clusterHitCount[i][positional].fill(TriggerModule.getClusterHitCount(cluster)); + clusterTime[i][positional].fill(TriggerModule.getClusterTime(cluster)); + clusterSeedPosition[i][positional].fill(TriggerModule.getClusterXIndex(cluster), + TriggerModule.getClusterYIndex(cluster)); + } + } + } + + // Plot all pair properties for each trigger. + List<Cluster[]> pairs = TriggerModule.getTopBottomPairs(clusters, Cluster.class); + for(Cluster[] pair : pairs) { + // Check whether the cluster is a fiducial or edge cluster. + boolean[] isFiducial = { + inFiducialRegion(pair[0]), + inFiducialRegion(pair[1]) + }; + int positional = (isFiducial[0] && isFiducial[1]) ? FIDUCIAL : EDGE; + + // Fill the appropriate plots for each trigger with an + // active trigger bit for single clusters. + for(int i = 0; i < 5; i++) { + if(activeTrigger[i]) { + // Calculate the values. + double energySum = TriggerModule.getValueEnergySum(pair); + double energyDiff = TriggerModule.getValueEnergyDifference(pair); + double energySlope = TriggerModule.getValueEnergySlope(pair, 0.00550); + double coplanarity = TriggerModule.getValueCoplanarity(pair); + double timeCoincidence = TriggerModule.getValueTimeCoincidence(pair); + + // Get the energy slope values. + Cluster lowCluster = pair[0].getEnergy() < pair[1].getEnergy() ? pair[0] : pair[1]; + double clusterDistance = TriggerModule.getClusterDistance(lowCluster); + + // Populate the ALL plots. + pairEnergySum[i][ALL].fill(energySum); + pairEnergyDifference[i][ALL].fill(energyDiff); + pairEnergySlope[i][ALL].fill(energySlope); + pairCoplanarity[i][ALL].fill(coplanarity); + pairTimeCoincidence[i][ALL].fill(timeCoincidence); + pairEnergySum2D[i][ALL].fill(pair[0].getEnergy(), pair[1].getEnergy()); + pairCoplanarityEnergySum[i][ALL].fill(energySum, coplanarity); + pairEnergySlope2D[i][ALL].fill(lowCluster.getEnergy(), clusterDistance); + + // Populate the positional plots. + pairEnergySum[i][positional].fill(energySum); + pairEnergyDifference[i][positional].fill(energyDiff); + pairEnergySlope[i][positional].fill(energySlope); + pairCoplanarity[i][positional].fill(coplanarity); + pairTimeCoincidence[i][positional].fill(timeCoincidence); + pairEnergySum2D[i][positional].fill(pair[0].getEnergy(), pair[1].getEnergy()); + pairCoplanarityEnergySum[i][positional].fill(energySum, coplanarity); + pairEnergySlope2D[i][positional].fill(lowCluster.getEnergy(), clusterDistance); + } + } + } + } + + /** + * Indicates whether the argument cluster is located in the fiducial + * region or not. + * @param cluster - The cluster to check. + * @return Returns <code>true</code> if the cluster is located in + * the fiducial region and <code>false</code> otherwise. + */ + private static final boolean inFiducialRegion(Cluster cluster) { + // Get the x and y indices for the cluster. + int ix = TriggerModule.getClusterXIndex(cluster); + int absx = Math.abs(TriggerModule.getClusterXIndex(cluster)); + int absy = Math.abs(TriggerModule.getClusterYIndex(cluster)); + + // Check if the cluster is on the top or the bottom of the + // calorimeter, as defined by |y| == 5. This is an edge cluster + // and is not in the fiducial region. + if(absy == 5) { + return false; + } + + // Check if the cluster is on the extreme left or right side + // of the calorimeter, as defined by |x| == 23. This is also + // and edge cluster is not in the fiducial region. + if(absx == 23) { + return false; + } + + // Check if the cluster is along the beam gap, as defined by + // |y| == 1. This is an internal edge cluster and is not in the + // fiducial region. + if(absy == 1) { + return false; + } + + // Lastly, check if the cluster falls along the beam hole, as + // defined by clusters with -11 <= x <= -1 and |y| == 2. This + // is not the fiducial region. + if(absy == 2 && ix <= -1 && ix >= -11) { + return false; + } + + // If all checks fail, the cluster is in the fiducial region. + return true; + } + + /** + * Sets the name of the LCIO collection containing the clusters + * that are to be plotted. + * @param collection - The LCIO collection name. + */ + public void setClusterCollectionName(String collection) { + clusterCollectionName = collection; + } + + /** + * Defines the name of the LCIO collection containing the TI bank. + * @param collection - The LCIO collection name. + */ + public void setBankCollectionName(String collection) { + bankCollectionName = collection; + } + + /** + * Sets the name of the super-group folder containing all plots. + * @param name - The name of the plots folder. + */ + public void setPlotsGroupName(String name) { + plotsGroupName = name; + } + + /** + * Sets whether or not to skip events where the SVT was not in + * position and active. + * @param state - <code>true</code> indicates that only events + * with an active, properly positioned SVT should be analyzed, and + * <code>false</code> that all events will be included. + */ + public void setUseGoodSVT(boolean state) { + useGoodSVT = state; + } } Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/TriggerProcessAnalysisDriver.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/TriggerProcessAnalysisDriver.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/TriggerProcessAnalysisDriver.java Tue Sep 27 08:50:14 2016 @@ -9,11 +9,18 @@ import java.util.List; import java.util.Set; +import org.hps.analysis.trigger.SimTriggerData; +import org.hps.analysis.trigger.data.TriggerDiagStats; +import org.hps.analysis.trigger.util.OutputLogger; import org.hps.recon.tracking.TrackType; import org.hps.recon.tracking.TrackUtils; +import org.hps.record.triggerbank.AbstractIntData; +import org.hps.record.triggerbank.SSPData; +import org.hps.record.triggerbank.TIData; import org.hps.record.triggerbank.TriggerModule; import org.lcsim.event.Cluster; import org.lcsim.event.EventHeader; +import org.lcsim.event.GenericObject; import org.lcsim.event.ReconstructedParticle; import org.lcsim.event.RelationalTable; import org.lcsim.event.Track; @@ -21,78 +28,245 @@ import org.lcsim.util.aida.AIDA; public class TriggerProcessAnalysisDriver extends Driver { - private int eventsProcessed = 0; - private int mollersProcessed = 0; - private boolean checkSVT = false; - private int tridentsProcessed = 0; - private int gblMollersProcessed = 0; - private int gblTridentsProcessed = 0; - private double timeCoincidence = 2.5; - private double elasticThreshold = 0.800; - private double mollerLowerRange = 0.900; - private double mollerUpperRange = 1.200; - private AIDA aida = AIDA.defaultInstance(); - private boolean checkTriggerTimeWindow = false; - private String clusterCollectionName = "EcalClustersCorr"; - private String particleCollectionName = "FinalStateParticles"; - - // Define trident cluster-track matched condition plots. - private IHistogram1D trctmInvariantMass = aida.histogram1D("Tridents CTMatched/Invariant Mass", 140, 0.0, 0.070); - private IHistogram1D trctmInstancesInEvent = aida.histogram1D("Tridents CTMatched/Instances in Event", 9, 0.5, 9.5); - private IHistogram1D trctmEnergySum1D = aida.histogram1D("Tridents CTMatched/Cluster Energy Sum", 150, 0.000, 1.500); - private IHistogram1D trctmMomentumSum1D = aida.histogram1D("Tridents CTMatched/Track Momentum Sum", 150, 0.000, 1.500); - private IHistogram1D trctmElectronEnergy = aida.histogram1D("Tridents CTMatched/Electron Cluster Energy", 150, 0.000, 1.500); - private IHistogram1D trctmElectronMomentum = aida.histogram1D("Tridents CTMatched/Electron Track Momentum", 150, 0.000, 1.500); - private IHistogram1D trctmPositronEnergy = aida.histogram1D("Tridents CTMatched/Positron Cluster Energy", 150, 0.000, 1.500); - private IHistogram1D trctmPositronMomentum = aida.histogram1D("Tridents CTMatched/Positron Track Momentum", 150, 0.000, 1.500); - private IHistogram1D trctmTimeCoincidence = aida.histogram1D("Tridents CTMatched/Time Coincidence", 100, -4, 4); - private IHistogram2D trctmClusterPosition = aida.histogram2D("Tridents CTMatched/Cluster Seed Position", 46, -23, 23, 11, -5.5, 5.5); - private IHistogram2D trctmEnergySum2D = aida.histogram2D("Tridents CTMatched/Cluster Energy Sum 2D", 300, 0.000, 1.500, 300, 0.000, 1.500); - private IHistogram2D trctmTrackPosition = aida.histogram2D("Tridents CTMatched/Extrapolated Track Position", 200, -400, 400, 55, -110, 110); - private IHistogram2D trctmMomentumSum2D = aida.histogram2D("Tridents CTMatched/Track Momentum Sum 2D", 300, 0.000, 1.500, 300, 0.000, 1.500); - private IHistogram2D trctmESumCoplanarity = aida.histogram2D("Tridents CTMatched/Cluster Energy Sum vs. Coplanarity", 300, 0.000, 1.500, 360, 0, 360); - private IHistogram2D trctmPSumCoplanarity = aida.histogram2D("Tridents CTMatched/Track Momentum Sum vs. Coplanarity", 300, 0.000, 1.500, 360, 0, 360); - - // Define the Moller cluster-track matched condition plots. - private IHistogram1D moctmInvariantMass = aida.histogram1D("Moller CTMatched/Invariant Mass", 140, 0.0, 0.070); - private IHistogram1D moctmInstancesInEvent = aida.histogram1D("Moller CTMatched/Instances in Event", 9, 0.5, 9.5); - private IHistogram1D moctmEnergySum1D = aida.histogram1D("Moller CTMatched/Cluster Energy Sum", 150, 0.000, 1.500); - private IHistogram1D moctmMomentumSum1D = aida.histogram1D("Moller CTMatched/Track Momentum Sum", 150, 0.000, 1.500); - private IHistogram1D moctmElectronEnergy = aida.histogram1D("Moller CTMatched/Electron Cluster Energy", 150, 0.000, 1.500); - private IHistogram1D moctmElectronMomentum = aida.histogram1D("Moller CTMatched/Electron Track Momentum", 150, 0.000, 1.500); - private IHistogram1D moctmTimeCoincidence = aida.histogram1D("Moller CTMatched/Time Coincidence", 100, -4, 4); - private IHistogram2D moctmClusterPosition = aida.histogram2D("Moller CTMatched/Cluster Seed Position", 46, -23, 23, 11, -5.5, 5.5); - private IHistogram2D moctmEnergySum2D = aida.histogram2D("Moller CTMatched/Cluster Energy Sum 2D", 300, 0.000, 1.500, 300, 0.000, 1.500); - private IHistogram2D moctmTrackPosition = aida.histogram2D("Moller CTMatched/Extrapolated Track Position", 200, -400, 400, 55, -110, 110); - private IHistogram2D moctmMomentumSum2D = aida.histogram2D("Moller CTMatched/Track Momentum Sum 2D", 300, 0.000, 1.500, 300, 0.000, 1.500); - private IHistogram2D moctmESumCoplanarity = aida.histogram2D("Moller CTMatched/Cluster Energy Sum vs. Coplanarity", 300, 0.000, 1.500, 360, 0, 360); - private IHistogram2D moctmPSumCoplanarity = aida.histogram2D("Moller CTMatched/Track Momentum Sum vs. Coplanarity", 300, 0.000, 1.500, 360, 0, 360); - - // Define the Moller track-only condition plots. - private IHistogram1D mogblTimeCoincidence = aida.histogram1D("Moller Track-Only/Time Coincidence", 100, -4, 4); - private IHistogram1D mogblInvariantMass = aida.histogram1D("Moller Track-Only/Invariant Mass", 140, 0.0, 0.070); - private IHistogram1D mogblInstancesInEvent = aida.histogram1D("Moller Track-Only/Instances in Event", 9, 0.5, 9.5); - private IHistogram1D mogblMomentumSum1D = aida.histogram1D("Moller Track-Only/Track Momentum Sum", 150, 0.000, 1.500); - private IHistogram1D mogblElectronMomentum = aida.histogram1D("Moller Track-Only/Electron Track Momentum", 150, 0.000, 1.500); - private IHistogram2D mogblTrackPosition = aida.histogram2D("Moller Track-Only/Extrapolated Track Position", 200, -400, 400, 55, -110, 110); - private IHistogram2D mogblMomentumSum2D = aida.histogram2D("Moller Track-Only/Track Momentum Sum 2D", 300, 0.000, 1.500, 300, 0.000, 1.500); - private IHistogram2D mogblPSumCoplanarity = aida.histogram2D("Moller Track-Only/Track Momentum Sum vs. Coplanarity", 300, 0.000, 1.500, 360, 0, 360); - - // Define the GBL trident condition plots. - private IHistogram1D trgblInvariantMass = aida.histogram1D("Tridents Track-Only/Invariant Mass", 140, 0.0, 0.070); - private IHistogram1D trgblInstancesInEvent = aida.histogram1D("Tridents Track-Only/Instances in Event", 9, 0.5, 9.5); - private IHistogram1D trgblMomentumSum1D = aida.histogram1D("Tridents Track-Only/Track Momentum Sum", 150, 0.000, 1.500); - private IHistogram1D trgblElectronMomentum = aida.histogram1D("Tridents Track-Only/Electron Track Momentum", 150, 0.000, 1.500); - private IHistogram1D trgblPositronMomentum = aida.histogram1D("Tridents Track-Only/Positron Track Momentum", 150, 0.000, 1.500); - private IHistogram1D trgblTimeCoincidence = aida.histogram1D("Tridents Track-Only/Time Coincidence", 100, -4, 4); - private IHistogram2D trgblTrackPosition = aida.histogram2D("Tridents Track-Only/Extrapolated Track Position", 200, -400, 400, 55, -110, 110); - private IHistogram2D trgblMomentumSum2D = aida.histogram2D("Tridents Track-Only/Track Momentum Sum 2D", 300, 0.000, 1.500, 300, 0.000, 1.500); - private IHistogram2D trgblPSumCoplanarity = aida.histogram2D("Tridents Track-Only/Track Momentum Sum vs. Coplanarity", 300, 0.000, 1.500, 360, 0, 360); - - @Override - public void endOfData() { - // Calculate the scaling factor for Hertz. - double scale = 19000.0 / eventsProcessed; + private int eventsProcessed = 0; + private int møllersProcessed = 0; + private boolean checkSVT = false; + private int tridentsProcessed = 0; + private int gblMøllersProcessed = 0; + private int gblTridentsProcessed = 0; + private int vertexedMøllersProcessed = 0; + private int vertexedTridentsProcessed = 0; + private double timeCoincidence = 2.5; + private double elasticThreshold = 0.900; + private double møllerLowerRange = 0.800; + private double møllerUpperRange = 1.300; + private AIDA aida = AIDA.defaultInstance(); + private boolean checkTriggerTimeWindow = false; + private String bankCollectionName = "TriggerBank"; + private String clusterCollectionName = "EcalClustersCorr"; + private String particleCollectionName = "FinalStateParticles"; + private String møllerCollectionName = "UnconstrainedMollerCandidates"; + private String tridentCollectionName = "TargetConstrainedV0Candidates"; + + // Track how many events pass each trigger configuration. + private int triggerActiveEvents = 0; + private int[][][][][] ctmTriggerMøllers = new int[2][2][2][2][2]; + private int[][][][][] vtxTriggerMøllers = new int[2][2][2][2][2]; + private int[][][][][] ctmTriggerTridents = new int[2][2][2][2][2]; + private int[][][][][] vtxTriggerTridents = new int[2][2][2][2][2]; + + // Define Møller cut constants. + /* + private static final int LOW = 0; + private static final int HIGH = 1; + private static final double[] MÃLLER_ANGLE_THRESHOLD = { + (1 - 0.40) * 0.5109989 / (2 * 1056), + (1 + 0.40) * 0.5109989 / (2 * 1056) + }; + private static final double[] MÃLLER_ENERGY_THRESHOLD = { + (1 - 0.15) * 1.056, + (1 + 0.15) * 1.056 + }; + private static final double BEAM_ROTATION = -0.0305; + private static final double ELECTRON_MASS_2 = 0.0005109989 * 0.0005109989; + */ + + // Define trident cluster-track matched condition plots. + private IHistogram1D trctmInvariantMass = aida.histogram1D("Tridents CTMatched/Invariant Mass", 140, 0.0, 0.070); + private IHistogram1D trctmInstancesInEvent = aida.histogram1D("Tridents CTMatched/Instances in Event", 9, 0.5, 9.5); + private IHistogram1D trctmEnergySum1D = aida.histogram1D("Tridents CTMatched/Cluster Energy Sum", 150, 0.000, 1.500); + private IHistogram1D trctmMomentumSum1D = aida.histogram1D("Tridents CTMatched/Track Momentum Sum", 150, 0.000, 1.500); + private IHistogram1D trctmElectronEnergy = aida.histogram1D("Tridents CTMatched/Electron Cluster Energy", 150, 0.000, 1.500); + private IHistogram1D trctmElectronMomentum = aida.histogram1D("Tridents CTMatched/Electron Track Momentum", 150, 0.000, 1.500); + private IHistogram1D trctmPositronEnergy = aida.histogram1D("Tridents CTMatched/Positron Cluster Energy", 150, 0.000, 1.500); + private IHistogram1D trctmPositronMomentum = aida.histogram1D("Tridents CTMatched/Positron Track Momentum", 150, 0.000, 1.500); + private IHistogram1D trctmTimeCoincidence = aida.histogram1D("Tridents CTMatched/Time Coincidence", 100, -4, 4); + private IHistogram2D trctmClusterPosition = aida.histogram2D("Tridents CTMatched/Cluster Seed Position", 46, -23, 23, 11, -5.5, 5.5); + private IHistogram2D trctmEnergySum2D = aida.histogram2D("Tridents CTMatched/Cluster Energy Sum 2D", 300, 0.000, 1.500, 300, 0.000, 1.500); + private IHistogram2D trctmTrackPosition = aida.histogram2D("Tridents CTMatched/Extrapolated Track Position", 200, -400, 400, 55, -110, 110); + private IHistogram2D trctmMomentumSum2D = aida.histogram2D("Tridents CTMatched/Track Momentum Sum 2D", 300, 0.000, 1.500, 300, 0.000, 1.500); + private IHistogram2D trctmESumCoplanarity = aida.histogram2D("Tridents CTMatched/Cluster Energy Sum vs. Coplanarity", 300, 0.000, 1.500, 360, 0, 360); + private IHistogram2D trctmPSumCoplanarity = aida.histogram2D("Tridents CTMatched/Track Momentum Sum vs. Coplanarity", 300, 0.000, 1.500, 360, 0, 360); + + // Define trident vertexed condition plots. + private IHistogram1D trvtxInvariantMass = aida.histogram1D("Tridents Vertexed/Invariant Mass", 140, 0.0, 0.070); + private IHistogram1D trvtxInstancesInEvent = aida.histogram1D("Tridents Vertexed/Instances in Event", 9, 0.5, 9.5); + private IHistogram1D trvtxEnergySum1D = aida.histogram1D("Tridents Vertexed/Cluster Energy Sum", 150, 0.000, 1.500); + private IHistogram1D trvtxMomentumSum1D = aida.histogram1D("Tridents Vertexed/Track Momentum Sum", 150, 0.000, 1.500); + private IHistogram1D trvtxElectronEnergy = aida.histogram1D("Tridents Vertexed/Electron Cluster Energy", 150, 0.000, 1.500); + private IHistogram1D trvtxElectronMomentum = aida.histogram1D("Tridents Vertexed/Electron Track Momentum", 150, 0.000, 1.500); + private IHistogram1D trvtxPositronEnergy = aida.histogram1D("Tridents Vertexed/Positron Cluster Energy", 150, 0.000, 1.500); + private IHistogram1D trvtxPositronMomentum = aida.histogram1D("Tridents Vertexed/Positron Track Momentum", 150, 0.000, 1.500); + private IHistogram1D trvtxTimeCoincidence = aida.histogram1D("Tridents Vertexed/Time Coincidence", 100, -4, 4); + private IHistogram2D trvtxClusterPosition = aida.histogram2D("Tridents Vertexed/Cluster Seed Position", 46, -23, 23, 11, -5.5, 5.5); + private IHistogram2D trvtxEnergySum2D = aida.histogram2D("Tridents Vertexed/Cluster Energy Sum 2D", 300, 0.000, 1.500, 300, 0.000, 1.500); + private IHistogram2D trvtxTrackPosition = aida.histogram2D("Tridents Vertexed/Extrapolated Track Position", 200, -400, 400, 55, -110, 110); + private IHistogram2D trvtxMomentumSum2D = aida.histogram2D("Tridents Vertexed/Track Momentum Sum 2D", 300, 0.000, 1.500, 300, 0.000, 1.500); + private IHistogram2D trvtxESumCoplanarity = aida.histogram2D("Tridents Vertexed/Cluster Energy Sum vs. Coplanarity", 300, 0.000, 1.500, 360, 0, 360); + private IHistogram2D trvtxPSumCoplanarity = aida.histogram2D("Tridents Vertexed/Track Momentum Sum vs. Coplanarity", 300, 0.000, 1.500, 360, 0, 360); + private IHistogram1D trvtxChiSquared = aida.histogram1D("Tridents Vertexed/Chi Squared", 1000, 0.0, 1000.0); + + // Define the Møller cluster-track matched condition plots. + private IHistogram1D møctmInvariantMass = aida.histogram1D("Møller CTMatched/Invariant Mass", 140, 0.0, 0.070); + private IHistogram1D møctmInstancesInEvent = aida.histogram1D("Møller CTMatched/Instances in Event", 9, 0.5, 9.5); + private IHistogram1D møctmEnergySum1D = aida.histogram1D("Møller CTMatched/Cluster Energy Sum", 150, 0.000, 1.500); + private IHistogram1D møctmMomentumSum1D = aida.histogram1D("Møller CTMatched/Track Momentum Sum", 150, 0.000, 1.500); + private IHistogram1D møctmElectronEnergy = aida.histogram1D("Møller CTMatched/Electron Cluster Energy", 150, 0.000, 1.500); + private IHistogram1D møctmElectronMomentum = aida.histogram1D("Møller CTMatched/Electron Track Momentum", 150, 0.000, 1.500); + private IHistogram1D møctmTimeCoincidence = aida.histogram1D("Møller CTMatched/Time Coincidence", 100, -4, 4); + private IHistogram2D møctmClusterPosition = aida.histogram2D("Møller CTMatched/Cluster Seed Position", 46, -23, 23, 11, -5.5, 5.5); + private IHistogram2D møctmEnergySum2D = aida.histogram2D("Møller CTMatched/Cluster Energy Sum 2D", 300, 0.000, 1.500, 300, 0.000, 1.500); + private IHistogram2D møctmTrackPosition = aida.histogram2D("Møller CTMatched/Extrapolated Track Position", 200, -400, 400, 55, -110, 110); + private IHistogram2D møctmMomentumSum2D = aida.histogram2D("Møller CTMatched/Track Momentum Sum 2D", 300, 0.000, 1.500, 300, 0.000, 1.500); + private IHistogram2D møctmESumCoplanarity = aida.histogram2D("Møller CTMatched/Cluster Energy Sum vs. Coplanarity", 300, 0.000, 1.500, 360, 0, 360); + private IHistogram2D møctmPSumCoplanarity = aida.histogram2D("Møller CTMatched/Track Momentum Sum vs. Coplanarity", 300, 0.000, 1.500, 360, 0, 360); + + // Define the Møller track-only condition plots. + private IHistogram1D møgblTimeCoincidence = aida.histogram1D("Møller Track-Only/Time Coincidence", 100, -4, 4); + private IHistogram1D møgblInvariantMass = aida.histogram1D("Møller Track-Only/Invariant Mass", 140, 0.0, 0.070); + private IHistogram1D møgblInstancesInEvent = aida.histogram1D("Møller Track-Only/Instances in Event", 9, 0.5, 9.5); + private IHistogram1D møgblMomentumSum1D = aida.histogram1D("Møller Track-Only/Track Momentum Sum", 150, 0.000, 1.500); + private IHistogram1D møgblElectronMomentum = aida.histogram1D("Møller Track-Only/Electron Track Momentum", 150, 0.000, 1.500); + private IHistogram2D møgblTrackPosition = aida.histogram2D("Møller Track-Only/Extrapolated Track Position", 200, -400, 400, 55, -110, 110); + private IHistogram2D møgblMomentumSum2D = aida.histogram2D("Møller Track-Only/Track Momentum Sum 2D", 300, 0.000, 1.500, 300, 0.000, 1.500); + private IHistogram2D møgblPSumCoplanarity = aida.histogram2D("Møller Track-Only/Track Momentum Sum vs. Coplanarity", 300, 0.000, 1.500, 360, 0, 360); + + // Define the Møller vertexed condition plots. + private IHistogram1D møvtxTimeCoincidence = aida.histogram1D("Møller Vertexed/Time Coincidence", 100, -4, 4); + private IHistogram1D møvtxInvariantMass = aida.histogram1D("Møller Vertexed/Invariant Mass", 140, 0.0, 0.070); + private IHistogram1D møvtxInstancesInEvent = aida.histogram1D("Møller Vertexed/Instances in Event", 9, 0.5, 9.5); + private IHistogram1D møvtxMomentumSum1D = aida.histogram1D("Møller Vertexed/Track Momentum Sum", 150, 0.000, 1.500); + private IHistogram1D møvtxElectronMomentum = aida.histogram1D("Møller Vertexed/Electron Track Momentum", 150, 0.000, 1.500); + private IHistogram2D møvtxTrackPosition = aida.histogram2D("Møller Vertexed/Extrapolated Track Position", 200, -400, 400, 55, -110, 110); + private IHistogram2D møvtxMomentumSum2D = aida.histogram2D("Møller Vertexed/Track Momentum Sum 2D", 300, 0.000, 1.500, 300, 0.000, 1.500); + private IHistogram2D møvtxPSumCoplanarity = aida.histogram2D("Møller Vertexed/Track Momentum Sum vs. Coplanarity", 300, 0.000, 1.500, 360, 0, 360); + + // Define the GBL trident condition plots. + private IHistogram1D trgblInvariantMass = aida.histogram1D("Tridents Track-Only/Invariant Mass", 140, 0.0, 0.070); + private IHistogram1D trgblInstancesInEvent = aida.histogram1D("Tridents Track-Only/Instances in Event", 9, 0.5, 9.5); + private IHistogram1D trgblMomentumSum1D = aida.histogram1D("Tridents Track-Only/Track Momentum Sum", 150, 0.000, 1.500); + private IHistogram1D trgblElectronMomentum = aida.histogram1D("Tridents Track-Only/Electron Track Momentum", 150, 0.000, 1.500); + private IHistogram1D trgblPositronMomentum = aida.histogram1D("Tridents Track-Only/Positron Track Momentum", 150, 0.000, 1.500); + private IHistogram1D trgblTimeCoincidence = aida.histogram1D("Tridents Track-Only/Time Coincidence", 100, -4, 4); + private IHistogram2D trgblTrackPosition = aida.histogram2D("Tridents Track-Only/Extrapolated Track Position", 200, -400, 400, 55, -110, 110); + private IHistogram2D trgblMomentumSum2D = aida.histogram2D("Tridents Track-Only/Track Momentum Sum 2D", 300, 0.000, 1.500, 300, 0.000, 1.500); + private IHistogram2D trgblPSumCoplanarity = aida.histogram2D("Tridents Track-Only/Track Momentum Sum vs. Coplanarity", 300, 0.000, 1.500, 360, 0, 360); + + @Override + public void endOfData() { + // Calculate the scaling factor for Hertz. + double scale = 19000.0 / eventsProcessed; + + System.out.println("Processed " + eventsProcessed + " events."); + System.out.println("Processed " + møllersProcessed + " Møller events"); + System.out.println("\tAcceptance :: " + (100.0 * møllersProcessed / eventsProcessed) + "%"); + System.out.println("\tRate :: " + (møllersProcessed * scale) + " Hz"); + + System.out.println("Processed " + tridentsProcessed + " trident events"); + System.out.println("\tAcceptance :: " + (100.0 * tridentsProcessed / eventsProcessed) + "%"); + System.out.println("\tRate :: " + (tridentsProcessed * scale) + " Hz"); + + /* + System.out.println("Processed " + gblMøllersProcessed + " track-only Møller events"); + System.out.println("\tAcceptance :: " + (100.0 * gblMøllersProcessed / eventsProcessed) + "%"); + System.out.println("\tRate :: " + (gblMøllersProcessed * scale) + " Hz"); + + System.out.println("Processed " + gblTridentsProcessed + " track-only trident events"); + System.out.println("\tAcceptance :: " + (100.0 * gblTridentsProcessed / eventsProcessed) + "%"); + System.out.println("\tRate :: " + (gblTridentsProcessed * scale) + " Hz"); + */ + + System.out.println("Processed " + vertexedMøllersProcessed + " vertexed Møller events"); + System.out.println("\tAcceptance :: " + (100.0 * vertexedMøllersProcessed / eventsProcessed) + "%"); + System.out.println("\tRate :: " + (vertexedMøllersProcessed * scale) + " Hz"); + + System.out.println("Processed " + vertexedTridentsProcessed + " vertexed trident events"); + System.out.println("\tAcceptance :: " + (100.0 * vertexedTridentsProcessed / eventsProcessed) + "%"); + System.out.println("\tRate :: " + (vertexedTridentsProcessed * scale) + " Hz"); + + + System.out.println("CTM Møllers:"); + for(int pulser = 0; pulser < 2; pulser++) { + for(int singles0 = 0; singles0 < 2; singles0++) { + for(int singles1 = 0; singles1 < 2; singles1++) { + for(int pair0 = 0; pair0 < 2; pair0++) { + for(int pair1 = 0; pair1 < 2; pair1++) { + System.out.printf("\t%5b %5b %5b %5b %5b %d%n", + pulser == 1 ? true : false, singles0 == 1 ? true : false, + singles1 == 1 ? true : false, pair0 == 1 ? true : false, + pair1 == 1 ? true : false, ctmTriggerMøllers[pulser][singles0][singles1][pair0][pair1]); + } + } + } + } + } + + System.out.println("CTM Tridents:"); + for(int pulser = 0; pulser < 2; pulser++) { + for(int singles0 = 0; singles0 < 2; singles0++) { + for(int singles1 = 0; singles1 < 2; singles1++) { + for(int pair0 = 0; pair0 < 2; pair0++) { + for(int pair1 = 0; pair1 < 2; pair1++) { + System.out.printf("\t%5b %5b %5b %5b %5b %d%n", + pulser == 1 ? true : false, singles0 == 1 ? true : false, + singles1 == 1 ? true : false, pair0 == 1 ? true : false, + pair1 == 1 ? true : false, ctmTriggerTridents[pulser][singles0][singles1][pair0][pair1]); + } + } + } + } + } + + System.out.println("VTX Møllers:"); + for(int pulser = 0; pulser < 2; pulser++) { + for(int singles0 = 0; singles0 < 2; singles0++) { + for(int singles1 = 0; singles1 < 2; singles1++) { + for(int pair0 = 0; pair0 < 2; pair0++) { + for(int pair1 = 0; pair1 < 2; pair1++) { + System.out.printf("\t%5b %5b %5b %5b %5b %d%n", + pulser == 1 ? true : false, singles0 == 1 ? true : false, + singles1 == 1 ? true : false, pair0 == 1 ? true : false, + pair1 == 1 ? true : false, vtxTriggerMøllers[pulser][singles0][singles1][pair0][pair1]); + } + } + } + } + } + + System.out.println("VTX Tridents:"); + for(int pulser = 0; pulser < 2; pulser++) { + for(int singles0 = 0; singles0 < 2; singles0++) { + for(int singles1 = 0; singles1 < 2; singles1++) { + for(int pair0 = 0; pair0 < 2; pair0++) { + for(int pair1 = 0; pair1 < 2; pair1++) { + System.out.printf("\t%5b %5b %5b %5b %5b %d%n", + pulser == 1 ? true : false, singles0 == 1 ? true : false, + singles1 == 1 ? true : false, pair0 == 1 ? true : false, + pair1 == 1 ? true : false, vtxTriggerTridents[pulser][singles0][singles1][pair0][pair1]); + } + } + } + } + } + } + + /** + @Override + public void process(EventHeader event) { + // Check whether the SVT was active in this event and, if so, + // skip it. This can be disabled through the steering file for + // Monte Carlo data, where the "SVT" is always active. + if(checkSVT) { + final String[] flagNames = { "svt_bias_good", "svt_burstmode_noise_good", "svt_position_good" }; + boolean svtGood = true; + for(int i = 0; i < flagNames.length; i++) { + int[] flag = event.getIntegerParameters().get(flagNames[i]); + if(flag == null || flag[0] == 0) { + svtGood = false; + } + } + if(!svtGood) { return; } + } System.out.println("Processed " + eventsProcessed + " events."); System.out.println("Processed " + mollersProcessed + " Moller events"); @@ -110,7 +284,7 @@ System.out.println("Processed " + gblTridentsProcessed + " Rafo trident events"); System.out.println("\tAcceptance :: " + (100.0 * gblTridentsProcessed / eventsProcessed) + "%"); System.out.println("\tRate :: " + (gblTridentsProcessed * scale) + " Hz"); - } + }**/ /* @Override @@ -171,583 +345,870 @@ // Check if the event has a collection of tracks. If it exists, // extract it. Otherwise, skip the event. - if(!event.hasCollection(ReconstructedParticle.class, particleCollectionName)) { - return; - } - List<ReconstructedParticle> trackList = event.get(ReconstructedParticle.class, particleCollectionName); - - // Check if the event has a collection of clusters. If it - // exists, extract it. Otherwise, skip the event. - if(!event.hasCollection(Cluster.class, clusterCollectionName)) { - return; - } - List<Cluster> clusterList = event.get(Cluster.class, clusterCollectionName); - - // Get cluster-track matched top/bottom pairs. - List<ReconstructedParticle[]> gblMatchedPairs = getTopBottomTracksGBL(trackList); - List<ReconstructedParticle[]> ctMatchedPairs = getTopBottomTracksCTMatched(trackList); - - System.out.println("CTM Pairs :: " + ctMatchedPairs.size()); - System.out.println("GBL Pairs :: " + gblMatchedPairs.size()); - - // Get the trident and Moller tracks for the matched track - // and cluster pair condition sets. - List<ReconstructedParticle[]> mollers = getMollerTracksCTMatched(ctMatchedPairs); - List<ReconstructedParticle[]> mollersGBL = getMollerTracksGBL(gblMatchedPairs, event); - List<ReconstructedParticle[]> tridents = getTridentTracksCTMatched(ctMatchedPairs); - List<ReconstructedParticle[]> tridentsGBL = getTridentClustersGBL(gblMatchedPairs, TriggerModule.getTopBottomPairs(clusterList, Cluster.class), event); - - // Track how many events had tridents and Mollers. - if(!mollers.isEmpty()) { mollersProcessed++; } - if(!tridents.isEmpty()) { tridentsProcessed++; } - if(!mollersGBL.isEmpty()) { gblMollersProcessed++; } - if(!tridentsGBL.isEmpty()) { gblTridentsProcessed++; } - - // Produce Moller cluster-track matched plots. - moctmInstancesInEvent.fill(mollers.size()); - for(ReconstructedParticle[] pair : mollers) { - // Get the track clusters. - Track[] tracks = { pair[0].getTracks().get(0), pair[1].getTracks().get(0) }; - Cluster[] trackClusters = { pair[0].getClusters().get(0), pair[1].getClusters().get(0) }; - - // Populate the cluster plots. - moctmElectronEnergy.fill(trackClusters[0].getEnergy()); - moctmElectronEnergy.fill(trackClusters[1].getEnergy()); - moctmEnergySum1D.fill(TriggerModule.getValueEnergySum(trackClusters)); - moctmEnergySum2D.fill(trackClusters[0].getEnergy(), trackClusters[1].getEnergy()); - moctmESumCoplanarity.fill(TriggerModule.getValueEnergySum(trackClusters), getCalculatedCoplanarity(trackClusters)); - moctmTimeCoincidence.fill(TriggerModule.getClusterTime(trackClusters[0]) - TriggerModule.getClusterTime(trackClusters[1])); - moctmClusterPosition.fill(TriggerModule.getClusterXIndex(trackClusters[0]), TriggerModule.getClusterYIndex(trackClusters[0])); - moctmClusterPosition.fill(TriggerModule.getClusterXIndex(trackClusters[1]), TriggerModule.getClusterYIndex(trackClusters[1])); - - // Populate the momentum plots. - moctmInvariantMass.fill(getInvariantMass(pair)); - moctmElectronMomentum.fill(pair[0].getMomentum().magnitude()); - moctmElectronMomentum.fill(pair[1].getMomentum().magnitude()); - moctmMomentumSum1D.fill(VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude()); - moctmMomentumSum2D.fill(pair[0].getMomentum().magnitude(), pair[1].getMomentum().magnitude()); - moctmTrackPosition.fill(TrackUtils.getTrackPositionAtEcal(tracks[0]).x(), TrackUtils.getTrackPositionAtEcal(tracks[0]).y()); - moctmTrackPosition.fill(TrackUtils.getTrackPositionAtEcal(tracks[1]).x(), TrackUtils.getTrackPositionAtEcal(tracks[1]).y()); - moctmPSumCoplanarity.fill(VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude(), - getCalculatedCoplanarity(new Track[] { pair[0].getTracks().get(0), pair[1].getTracks().get(0) })); - } - - // Produce trident cluster-track matched plots. - trctmInstancesInEvent.fill(tridents.size()); - for(ReconstructedParticle[] pair : tridents) { - // Get the electron and positron tracks. - ReconstructedParticle electronTrack = pair[pair[0].getCharge() < 0 ? 0 : 1]; - ReconstructedParticle positronTrack = pair[pair[0].getCharge() > 0 ? 0 : 1]; - - // Get the track clusters. - Cluster electronCluster = electronTrack.getClusters().get(0); - Cluster positronCluster = positronTrack.getClusters().get(0); - Track[] tracks = { pair[0].getTracks().get(0), pair[1].getTracks().get(0) }; - Cluster[] trackClusters = { pair[0].getClusters().get(0), pair[1].getClusters().get(0) }; - - // Populate the cluster plots. - trctmElectronEnergy.fill(electronCluster.getEnergy()); - trctmPositronEnergy.fill(positronCluster.getEnergy()); - trctmEnergySum2D.fill(pair[0].getEnergy(), pair[1].getEnergy()); - trctmEnergySum1D.fill(TriggerModule.getValueEnergySum(trackClusters)); - trctmESumCoplanarity.fill(TriggerModule.getValueEnergySum(trackClusters), getCalculatedCoplanarity(trackClusters)); - trctmTimeCoincidence.fill(TriggerModule.getClusterTime(trackClusters[0]) - TriggerModule.getClusterTime(trackClusters[1])); - trctmClusterPosition.fill(TriggerModule.getClusterXIndex(trackClusters[0]), TriggerModule.getClusterYIndex(trackClusters[0])); - trctmClusterPosition.fill(TriggerModule.getClusterXIndex(trackClusters[1]), TriggerModule.getClusterYIndex(trackClusters[1])); - - // Populate the momentum plots. - trctmInvariantMass.fill(getInvariantMass(pair)); - trctmElectronMomentum.fill(electronTrack.getMomentum().magnitude()); - trctmPositronMomentum.fill(positronTrack.getMomentum().magnitude()); - trctmMomentumSum1D.fill(VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude()); - trctmMomentumSum2D.fill(pair[0].getMomentum().magnitude(), pair[1].getMomentum().magnitude()); - trctmTrackPosition.fill(TrackUtils.getTrackPositionAtEcal(tracks[0]).x(), TrackUtils.getTrackPositionAtEcal(tracks[0]).y()); - trctmTrackPosition.fill(TrackUtils.getTrackPositionAtEcal(tracks[1]).x(), TrackUtils.getTrackPositionAtEcal(tracks[1]).y()); - trctmPSumCoplanarity.fill(VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude(), - getCalculatedCoplanarity(new Track[] { pair[0].getTracks().get(0), pair[1].getTracks().get(0) })); - } - - // Produce the Moller track-only plots. - mogblInstancesInEvent.fill(mollersGBL.size()); - RelationalTable<?, ?> hitToStrips = TrackUtils.getHitToStripsTable(event); - RelationalTable<?, ?> hitToRotated = TrackUtils.getHitToRotatedTable(event); - for(ReconstructedParticle pair[] : mollersGBL) { - // Get the tracks and track times. - Track[] tracks = { pair[0].getTracks().get(0), pair[1].getTracks().get(0) }; - double times[] = { - TrackUtils.getTrackTime(tracks[0], hitToStrips, hitToRotated), - TrackUtils.getTrackTime(tracks[1], hitToStrips, hitToRotated) - }; - - // Fill the plots. - mogblTimeCoincidence.fill(times[0] - times[1]); - mogblInvariantMass.fill(getInvariantMass(pair)); - mogblElectronMomentum.fill(pair[0].getMomentum().magnitude()); - mogblElectronMomentum.fill(pair[1].getMomentum().magnitude()); - mogblMomentumSum1D.fill(VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude()); - mogblMomentumSum2D.fill(pair[0].getMomentum().magnitude(), pair[1].getMomentum().magnitude()); - mogblTrackPosition.fill(TrackUtils.getTrackPositionAtEcal(tracks[0]).x(), TrackUtils.getTrackPositionAtEcal(tracks[0]).y()); - mogblTrackPosition.fill(TrackUtils.getTrackPositionAtEcal(tracks[1]).x(), TrackUtils.getTrackPositionAtEcal(tracks[1]).y()); - mogblPSumCoplanarity.fill(VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude(), - getCalculatedCoplanarity(new Track[] { pair[0].getTracks().get(0), pair[1].getTracks().get(0) })); - } - - // Produce track-only trident plots. - trgblInstancesInEvent.fill(tridentsGBL.size()); - for(ReconstructedParticle[] pair : tridentsGBL) { - // Get the tracks and track times. - Track[] tracks = { pair[0].getTracks().get(0), pair[1].getTracks().get(0) }; - double times[] = { - TrackUtils.getTrackTime(tracks[0], hitToStrips, hitToRotated), - TrackUtils.getTrackTime(tracks[1], hitToStrips, hitToRotated) - }; - - // Get the positron and the electron. - ReconstructedParticle positron = pair[0].getCharge() > 0 ? pair[0] : pair[1]; - ReconstructedParticle electron = pair[0].getCharge() < 0 ? pair[0] : pair[1]; - - // Fill the plots. - trgblTimeCoincidence.fill(times[0] - times[1]); - trgblInvariantMass.fill(getInvariantMass(pair)); - trgblElectronMomentum.fill(electron.getMomentum().magnitude()); - trgblPositronMomentum.fill(positron.getMomentum().magnitude()); - trgblMomentumSum1D.fill(VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude()); - trgblMomentumSum2D.fill(pair[0].getMomentum().magnitude(), pair[1].getMomentum().magnitude()); - trgblTrackPosition.fill(TrackUtils.getTrackPositionAtEcal(tracks[0]).x(), TrackUtils.getTrackPositionAtEcal(tracks[0]).y()); - trgblTrackPosition.fill(TrackUtils.getTrackPositionAtEcal(tracks[1]).x(), TrackUtils.getTrackPositionAtEcal(tracks[1]).y()); - trgblPSumCoplanarity.fill(VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude(), - getCalculatedCoplanarity(new Track[] { pair[0].getTracks().get(0), pair[1].getTracks().get(0) })); - } - } - - public void setCheckSVT(boolean state) { - checkSVT = state; - } - - public void setCheckTriggerTimeWindow(boolean state) { - checkTriggerTimeWindow = state; - } - - /** - * Gets a list of all possible GBL top/bottom track pairs. These - * tracks are not guaranteed to have a matched cluster. - * @param trackList - A list of all possible tracks. - * @return Returns a list of track pairs. - */ - private static final List<ReconstructedParticle[]> getTopBottomTracksGBL(List<ReconstructedParticle> trackList) { - // Separate the tracks into top and bottom tracks based on - // the value of tan(Î). Use only GBL tracks to avoid track - // duplication. - List<ReconstructedParticle> topTracks = new ArrayList<ReconstructedParticle>(); - List<ReconstructedParticle> botTracks = new ArrayList<ReconstructedParticle>(); - trackLoop: - for(ReconstructedParticle track : trackList) { - // Require that the ReconstructedParticle contain an actual - // Track object. - if(track.getTracks().isEmpty()) { - continue trackLoop; - } - - // Ignore tracks that are not GBL tracks. - if(!TrackType.isGBL(track.getType())) { - continue trackLoop; - } - - // If the above tests pass, the ReconstructedParticle has - // a track and is also a GBL track. Separate it into either - // a top or a bottom track based on its tan(Î) value. - if(track.getTracks().get(0).getTrackStates().get(0).getTanLambda() > 0) { - topTracks.add(track); - } else { - botTracks.add(track); - } - } - - // Form all top/bottom pairs with the unique tracks. - List<ReconstructedParticle[]> pairList = new ArrayList<ReconstructedParticle[]>(); - for(ReconstructedParticle topTrack : topTracks) { - for(ReconstructedParticle botTrack : botTracks) { - pairList.add(new ReconstructedParticle[] { topTrack, botTrack }); - } - } - - // Return the result. - return pairList; - } - - /** - * Produces pairs of tracks. The track pairs are required to be - * matched to a cluster and the associated clusters must form a - * top/bottom pair. If more than one track points to the same - * cluster, only the first track is retained. - * @param trackList - A list of all tracks. - * @return Returns a list of track pairs meeting the aforementioned - * conditions. - */ - private static final List<ReconstructedParticle[]> getTopBottomTracksCTMatched(List<ReconstructedParticle> trackList) { - // Track clusters that have already been seen to prevent clusters - // that have duplicate tracks from reappearing. - Set<Cluster> clusterSet = new HashSet<Cluster>(); - - // Separate the tracks into top and bottom tracks based on - // the track cluster. Filter out tracks with no clusters. - List<ReconstructedParticle> topTracks = new ArrayList<ReconstructedParticle>(); - List<ReconstructedParticle> botTracks = new ArrayList<ReconstructedParticle>(); - trackLoop: - for(ReconstructedParticle track : trackList) { - // Check if the track has a cluster. If not, skip it. - if(track.getClusters().isEmpty()) { - continue trackLoop; - } - - // If the track doesn't have actual tracks, skip it. - if(track.getTracks().isEmpty()) { - continue trackLoop; - } - - // Check if the track cluster has already seen. - Cluster trackCluster = track.getClusters().get(0); - if(clusterSet.contains(trackCluster)) { - continue trackLoop; - } - - // If the track has a unique cluster, add it to the proper - // list based on the cluster y-index. - clusterSet.add(trackCluster); - if(TriggerModule.getClusterYIndex(trackCluster) > 0) { - topTracks.add(track); - } else { - botTracks.add(track); - } - } - - // Form all top/bottom pairs with the unique tracks. - List<ReconstructedParticle[]> pairList = new ArrayList<ReconstructedParticle[]>(); - for(ReconstructedParticle topTrack : topTracks) { - for(ReconstructedParticle botTrack : botTracks) { - pairList.add(new ReconstructedParticle[] { topTrack, botTrack }); - } - } - - // Return the result. - return pairList; - } - - private final List<ReconstructedParticle[]> getTridentClustersGBL(List<ReconstructedParticle[]> pairList, List<Cluster[]> clusterList, EventHeader event) { - // Store the set of track pairs that meet the trident condition. - List<ReconstructedParticle[]> tridentTracks = new ArrayList<ReconstructedParticle[]>(); - - // Extract track relational tables from the event object. - RelationalTable<?, ?> hitToStrips = TrackUtils.getHitToStripsTable(event); - RelationalTable<?, ?> hitToRotated = TrackUtils.getHitToRotatedTable(event); - - // Tracks will not be considered for trident analysis unless there - // is at least one top/bottom cluster pair within the time window. - boolean passesClusterCondition = false; - tridentClusterLoop: - for(Cluster[] pair : clusterList) { - // Ignore clusters that are too far apart temporally. - if(TriggerModule.getValueTimeCoincidence(pair) > timeCoincidence) { - continue tridentClusterLoop; - } - - // Require that the cluster pair be top/bottom. - boolean hasTop = TriggerModule.getClusterYIndex(pair[0]) > 0 || TriggerModule.getClusterYIndex(pair[1]) > 0; - boolean hasBot = TriggerModule.getClusterYIndex(pair[0]) < 0 || TriggerModule.getClusterYIndex(pair[1]) < 0; - if(!hasTop || !hasBot) { - continue tridentClusterLoop; - } - - // If the cluster passes, mark that it has done so and skip - // the rest. Only one pair need pass. - passesClusterCondition = true; - break tridentClusterLoop; - } - - // If no cluster pair passed the cluster condition, no tracks - // are allowed to pass either. - if(!passesClusterCondition) { - return tridentTracks; - } - - // Next, check the track pair list. A track pair must have a - // positive and a negative track and must also be within the - // time coincidence window. - tridentTrackLoop: - for(ReconstructedParticle[] pair : pairList) { - // Check that there is at least one positive and one negative - // track in the pair. - boolean hasPositive = pair[0].getCharge() > 0 || pair[1].getCharge() > 0; - boolean hasNegative = pair[0].getCharge() < 0 || pair[1].getCharge() < 0; - if(!hasPositive || !hasNegative) { - break tridentTrackLoop; - } - - // Check that the track pair passes the time cut. - double times[] = { - TrackUtils.getTrackTime(pair[0].getTracks().get(0), hitToStrips, hitToRotated), - TrackUtils.getTrackTime(pair[1].getTracks().get(0), hitToStrips, hitToRotated) - }; - - if(Math.abs(times[0] - times[1]) > timeCoincidence) { - continue tridentTrackLoop; - } - - // Require that the negative track have less than the - // elastic threshold momentum to exclude elastic electrons. - if(pair[0].getCharge() < 0 && pair[0].getMomentum().magnitude() > elasticThreshold - || pair[1].getCharge() < 0 && pair[1].getMomentum().magnitude() > elasticThreshold) { - continue tridentTrackLoop; - } - - // If the track passes both, it is considered a trident pair. - tridentTracks.add(pair); - } - - // Return the resultant pairs. - return tridentTracks; - } - - /** - * Gets a list track pairs that meet the trident condition defined - * using tracks with matched calorimeter clusters. A pair meets the - * cluster/track matched trident condition is it meets the following: - * <ul><li>Both tracks have matched clusters.</li> - * <li>Has one positive track.</li> - * <li>Has one negative track.</li> - * <li>Clusters have a time coincidence of 2.5 ns or less.</li> - * <li>The electron momentum is below 900 MeV.</li></ul> - * @param pairList - A <code>List</code> collection of parameterized - * type <code>ReconstructedParticle[]</code> containing all valid - * top/bottom pairs of tracks with matched clusters. These will be - * tested to see if they meet the process criteria. - * @return Returns a list containing pairs of tracks that meet the - * trident condition. - */ - private final List<ReconstructedParticle[]> getTridentTracksCTMatched(List<ReconstructedParticle[]> pairList) { - // Store the set of track pairs that meet the trident condition. - List<ReconstructedParticle[]> tridentTracks = new ArrayList<ReconstructedParticle[]>(); - - // Loop over the filtered pair list and apply the trident - // condition test. - tridentLoop: - for(ReconstructedParticle[] pair : pairList) { - // There must be one positive and one negative track. - ReconstructedParticle electron = null; - ReconstructedParticle positron = null; - if(pair[0].getCharge() > 0) { positron = pair[0]; } - else if(pair[1].getCharge() > 0) { positron = pair[1]; } - if(pair[0].getCharge() < 0) { electron = pair[0]; } - else if(pair[1].getCharge() < 0) { electron = pair[1]; } - if(electron == null || positron == null) { - continue tridentLoop; - } - - // Make sure that the clusters are not the same. This should - // not actually ever be possible... - if(pair[0].getClusters().get(0) == pair[1].getClusters().get(0)) { - continue tridentLoop; - } - - // The clusters must within a limited time window. - /* - Cluster[] trackClusters = { pair[0].getClusters().get(0), pair[1].getClusters().get(0) }; - if(TriggerModule.getValueTimeCoincidence(trackClusters) > timeCoincidence) { - continue tridentLoop; - } - */ - - // The clusters must be coincidental within an energy - // dependent coincidence window. - Cluster[] trackClusters = { pair[0].getClusters().get(0), pair[1].getClusters().get(0) }; - if(!isCoincidental(trackClusters)) { - continue tridentLoop; - } - - // Require that the electron in the pair have an energy - // below the elastic threshold to exclude elastic electrons. - if(electron.getMomentum().magnitude() >= elasticThreshold) { - continue tridentLoop; - } - - // Require that all clusters occur within the trigger time - // window to exclude accidentals. - if(checkTriggerTimeWindow) { - if(!inTriggerWindow(trackClusters[0]) || !inTriggerWindow(trackClusters[1])) { - continue tridentLoop; - } - } - - // If all the above conditions are met, the pair is to be - // considered a trident pair. Add it to the list. - tridentTracks.add(pair); - } - - // Return the list of pairs that passed the condition. - return tridentTracks; - } - - private final List<ReconstructedParticle[]> getMollerTracksGBL(List<ReconstructedParticle[]> pairList, EventHeader event) { - // Store the set of track pairs that meet the Moller condition. - List<ReconstructedParticle[]> mollerTracks = new ArrayList<ReconstructedParticle[]>(); - - // Extract track relational tables from the event object. - RelationalTable<?, ?> hitToStrips = TrackUtils.getHitToStripsTable(event); - RelationalTable<?, ?> hitToRotated = TrackUtils.getHitToRotatedTable(event); - - // Loop over the filtered pair list and apply the Moller - // condition test. - mollerLoop: - for(ReconstructedParticle[] pair : pairList) { - // Both tracks must be negatively charged. - if(pair[0].getCharge() > 0 || pair[1].getCharge() > 0) { - continue mollerLoop; - } - - // The clusters must within a limited time window. - double times[] = { - TrackUtils.getTrackTime(pair[0].getTracks().get(0), hitToStrips, hitToRotated), - TrackUtils.getTrackTime(pair[1].getTracks().get(0), hitToStrips, hitToRotated) - }; - - if(Math.abs(times[0] - times[1]) > timeCoincidence) { - continue mollerLoop; - } - - // Require that the electrons in the pair have energies - // below the elastic threshold to exclude said electrons. - if(pair[0].getMomentum().magnitude() > elasticThreshold || pair[1].getMomentum().magnitude() > elasticThreshold) { - continue mollerLoop; - } - - // Require that the energy of the pair be within a range - // that is sufficiently "Moller-like." - double momentumSum = VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude(); - if(momentumSum < mollerLowerRange || momentumSum > mollerUpperRange) { - continue mollerLoop; - } - - // If all the above conditions are met, the pair is to be - // considered a trident pair. Add it to the list. - mollerTracks.add(pair); - } - - // Return the list of pairs that passed the condition. - return mollerTracks; - } - - /** - * Gets a list track pairs that meet the Moller condition defined - * using tracks with matched calorimeter clusters. A pair meets the - * cluster/track matched Moller condition is it meets the following: - * <ul><li>Both tracks have matched clusters.</li> - * <li>Both tracks are negative.</li> - * <li>Clusters have a time coincidence of 2.5 ns or less.</li> - * <li>The electron momenta are below 900 MeV.</li> - * <li>The momentum sum of the tracks is in the range <code>800 MeV - * ⤠p1 + p2 ⤠1500 MeV</li></ul> - * @param pairList - A <code>List</code> collection of parameterized - * type <code>ReconstructedParticle[]</code> containing all valid - * top/bottom pairs of tracks with matched clusters. These will be - * tested to see if they meet the process criteria. - * @return Returns a list containing pairs of tracks that meet the - * Moller condition. - */ - private final List<ReconstructedParticle[]> getMollerTracksCTMatched(List<ReconstructedParticle[]> pairList) { - // Store the set of track pairs that meet the Moller condition. - List<ReconstructedParticle[]> mollerTracks = new ArrayList<ReconstructedParticle[]>(); - - // Loop over the filtered pair list and apply the Moller - // condition test. - mollerLoop: - for(ReconstructedParticle[] pair : pairList) { - // Both tracks must be negatively charged. - if(pair[0].getCharge() > 0 || pair[1].getCharge() > 0) { - continue mollerLoop; - } - - // The clusters must within a limited time window. - /* - Cluster[] trackClusters = { pair[0].getClusters().get(0), pair[1].getClusters().get(0) }; - if(TriggerModule.getValueTimeCoincidence(trackClusters) > timeCoincidence) { - continue mollerLoop; - } - */ - - // The clusters must be coincidental within an energy - // dependent coincidence window. - Cluster[] trackClusters = { pair[0].getClusters().get(0), pair[1].getClusters().get(0) }; - if(!isCoincidental(trackClusters)) { - continue mollerLoop; - } - - // Require that the electrons in the pair have energies - // below the elastic threshold to exclude said electrons. - if(pair[0].getMomentum().magnitude() > elasticThreshold || pair[1].getMomentum().magnitude() > elasticThreshold) { - continue mollerLoop; - } - - // Require that the energy of the pair be within a range - // that is sufficiently "Moller-like." - double momentumSum = VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude(); - if(momentumSum < mollerLowerRange || momentumSum > mollerUpperRange) { - continue mollerLoop; - } - - // Require that all clusters occur within the trigger time - // window to exclude accidentals. - if(checkTriggerTimeWindow) { - if(!inTriggerWindow(trackClusters[0]) || !inTriggerWindow(trackClusters[1])) { - continue mollerLoop; - } - } - - // If all the above conditions are met, the pair is to be - // considered a trident pair. Add it to the list. - mollerTracks.add(pair); - } - - // Return the list of pairs that passed the condition. - return mollerTracks; - } - - /** - * Calculates the approximate invariant mass for a pair of tracks - * from their momentum. This assumes that the particles are either - * electrons or positrons, and thusly have a sufficiently small - * mass term that it can be safely excluded. - * @param pair - The track pair for which to calculate the invariant - * mass. - * @return Returns the approximate invariant mass in units of GeV. - */ - private static final double getInvariantMass(ReconstructedParticle[] pair) { - // Get the momentum squared. - double p2 = Math.pow(pair[0].getMomentum().magnitude() + pair[1].getMomentum().magnitude(), 2); - - // Get the remaining terms. - double xPro = pair[0].getMomentum().x() + pair[1].getMomentum().x(); - double yPro = pair[0].getMomentum().y() + pair[1].getMomentum().y(); - double zPro = pair[0].getMomentum().z() + pair[1].getMomentum().z(); - - // Calculate the invariant mass. - return Math.sqrt(p2 - Math.pow(xPro, 2) - Math.pow(yPro, 2) - Math.pow(zPro, 2)); - } - - /** - * Calculates the coplanarity angle between two points, specified - * by a double array. The array must be of the format (x, y, z). - * @param position - The first position array. - * @param otherPosition - The second position array. - * @return Returns the coplanarity angle between the points in units - * of degrees. - */ - private static final double getCalculatedCoplanarity(double[] position, double[] otherPosition) { - // Define the x- and y-coordinates of the clusters as well as - // calorimeter center. - final double ORIGIN_X = 42.52; - double x[] = { position[0], otherPosition[0] }; - double y[] = { position[1], otherPosition[1] }; - + if(!event.hasCollection(ReconstructedParticle.class, particleCollectionName)) { + return; + } + List<ReconstructedParticle> trackList = event.get(ReconstructedParticle.class, particleCollectionName); + + // Check if the event has a collection of clusters. If it + // exists, extract it. Otherwise, skip the event. + if(!event.hasCollection(Cluster.class, clusterCollectionName)) { + return; + } + List<Cluster> clusterList = event.get(Cluster.class, clusterCollectionName); + + // Check if a trident candidate collection exists, and obtain + // it if so. Continue with the event if it does not. + List<ReconstructedParticle> tridentCandidates = null; + if(event.hasCollection(ReconstructedParticle.class, tridentCollectionName)) { + tridentCandidates = event.get(ReconstructedParticle.class, tridentCollectionName); + } else { + tridentCandidates = new ArrayList<ReconstructedParticle>(0); + } + + // Check if a Møller candidate collection exists, and obtain + // it if so. Continue with the event if it does not. + List<ReconstructedParticle> møllerCandidates = null; + if(event.hasCollection(ReconstructedParticle.class, møllerCollectionName)) { + møllerCandidates = event.get(ReconstructedParticle.class, møllerCollectionName); + } else { + møllerCandidates = new ArrayList<ReconstructedParticle>(0); + } + + // Get cluster-track matched top/bottom pairs. + List<ReconstructedParticle[]> gblMatchedPairs = getTopBottomTracksGBL(trackList); + List<ReconstructedParticle[]> ctMatchedPairs = getTopBottomTracksCTMatched(trackList); + + // Get the trident and Møller tracks for the matched track + // and cluster pair condition sets. + List<ReconstructedParticle[]> møllers = getMøllerTracksCTMatched(ctMatchedPairs); + List<ReconstructedParticle[]> møllersGBL = getMøllerTracksGBL(gblMatchedPairs, event); + List<ReconstructedParticle[]> tridents = getTridentTracksCTMatched(ctMatchedPairs); + List<ReconstructedParticle[]> tridentsVTX = getTridentTracksVertexed(tridentCandidates); + List<ReconstructedParticle[]> møllersVTX = getMøllerTracksVertexed(møllerCandidates); + List<ReconstructedParticle[]> tridentsGBL = getTridentClustersGBL(gblMatchedPairs, TriggerModule.getTopBottomPairs(clusterList, Cluster.class), event); + + // Track how many events had tridents and Møllers. + if(!møllers.isEmpty()) { møllersProcessed++; } + if(!tridents.isEmpty()) { tridentsProcessed++; } + if(!møllersGBL.isEmpty()) { gblMøllersProcessed++; } + if(!tridentsGBL.isEmpty()) { gblTridentsProcessed++; } + if(!møllersVTX.isEmpty()) { vertexedMøllersProcessed++; } + if(!tridentsVTX.isEmpty()) { vertexedTridentsProcessed++; } + + // Get the SSP clusters. + if(event.hasCollection(GenericObject.class, bankCollectionName)) { + // Get the bank list. + List<GenericObject> bankList = event.get(GenericObject.class, bankCollectionName); + + // Check for simulated triggers. If they exist, populate the + // trigger tracking variables. + for(GenericObject obj : bankList) { + if(AbstractIntData.getTag(obj) == TIData.BANK_TAG) { + TIData tiBank = new TIData(obj); + + // Establish which triggers were active. + boolean isPulser = tiBank.isPulserTrigger(); + boolean isPair0 = tiBank.isPair0Trigger(); + boolean isPair1 = tiBank.isPair1Trigger(); + boolean isSingles0 = tiBank.isSingle0Trigger(); + boolean isSingles1 = tiBank.isSingle1Trigger(); + + // Populate the appropriate trigger tracking variables. + triggerActiveEvents++; + if(!møllers.isEmpty()) { + ctmTriggerMøllers[isPulser ? 1 : 0][isSingles0 ? 1 : 0][isSingles1 ? 1 : 0][isPair0 ? 1 : 0][isPair1 ? 1 : 0]++; + } if(!tridents.isEmpty()) { + ctmTriggerTridents[isPulser ? 1 : 0][isSingles0 ? 1 : 0][isSingles1 ? 1 : 0][isPair0 ? 1 : 0][isPair1 ? 1 : 0]++; + } if(!møllersVTX.isEmpty()) { + vtxTriggerMøllers[isPulser ? 1 : 0][isSingles0 ? 1 : 0][isSingles1 ? 1 : 0][isPair0 ? 1 : 0][isPair1 ? 1 : 0]++; + } if(!tridentsVTX.isEmpty()) { + vtxTriggerTridents[isPulser ? 1 : 0][isSingles0 ? 1 : 0][isSingles1 ? 1 : 0][isPair0 ? 1 : 0][isPair1 ? 1 : 0]++; + } + } + } + } + + // Produce Møller cluster-track matched plots. + møctmInstancesInEvent.fill(møllers.size()); + for(ReconstructedParticle[] pair : møllers) { + // Get the track clusters. + Track[] tracks = { pair[0].getTracks().get(0), pair[1].getTracks().get(0) }; + Cluster[] trackClusters = { pair[0].getClusters().get(0), pair[1].getClusters().get(0) }; + + // Populate the cluster plots. + møctmElectronEnergy.fill(trackClusters[0].getEnergy()); + møctmElectronEnergy.fill(trackClusters[1].getEnergy()); + møctmEnergySum1D.fill(TriggerModule.getValueEnergySum(trackClusters)); + møctmEnergySum2D.fill(trackClusters[0].getEnergy(), trackClusters[1].getEnergy()); + møctmESumCoplanarity.fill(TriggerModule.getValueEnergySum(trackClusters), getCalculatedCoplanarity(trackClusters)); + møctmTimeCoincidence.fill(TriggerModule.getClusterTime(trackClusters[0]) - TriggerModule.getClusterTime(trackClusters[1])); + møctmClusterPosition.fill(TriggerModule.getClusterXIndex(trackClusters[0]), TriggerModule.getClusterYIndex(trackClusters[0])); + møctmClusterPosition.fill(TriggerModule.getClusterXIndex(trackClusters[1]), TriggerModule.getClusterYIndex(trackClusters[1])); + + // Populate the momentum plots. + møctmInvariantMass.fill(getInvariantMass(pair)); + møctmElectronMomentum.fill(pair[0].getMomentum().magnitude()); + møctmElectronMomentum.fill(pair[1].getMomentum().magnitude()); + møctmMomentumSum1D.fill(VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude()); + møctmMomentumSum2D.fill(pair[0].getMomentum().magnitude(), pair[1].getMomentum().magnitude()); + møctmTrackPosition.fill(TrackUtils.getTrackPositionAtEcal(tracks[0]).x(), TrackUtils.getTrackPositionAtEcal(tracks[0]).y()); + møctmTrackPosition.fill(TrackUtils.getTrackPositionAtEcal(tracks[1]).x(), TrackUtils.getTrackPositionAtEcal(tracks[1]).y()); + møctmPSumCoplanarity.fill(VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude(), + getCalculatedCoplanarity(new Track[] { pair[0].getTracks().get(0), pair[1].getTracks().get(0) })); + } + + // Produce trident cluster-track matched plots. + trctmInstancesInEvent.fill(tridents.size()); + for(ReconstructedParticle[] pair : tridents) { + // Get the electron and positron tracks. + ReconstructedParticle electronTrack = pair[pair[0].getCharge() < 0 ? 0 : 1]; + ReconstructedParticle positronTrack = pair[pair[0].getCharge() > 0 ? 0 : 1]; + + // Get the track clusters. + Cluster electronCluster = electronTrack.getClusters().get(0); + Cluster positronCluster = positronTrack.getClusters().get(0); + Track[] tracks = { pair[0].getTracks().get(0), pair[1].getTracks().get(0) }; + Cluster[] trackClusters = { pair[0].getClusters().get(0), pair[1].getClusters().get(0) }; + + // Populate the cluster plots. + trctmElectronEnergy.fill(electronCluster.getEnergy()); + trctmPositronEnergy.fill(positronCluster.getEnergy()); + trctmEnergySum2D.fill(pair[0].getEnergy(), pair[1].getEnergy()); + trctmEnergySum1D.fill(TriggerModule.getValueEnergySum(trackClusters)); + trctmESumCoplanarity.fill(TriggerModule.getValueEnergySum(trackClusters), getCalculatedCoplanarity(trackClusters)); + trctmTimeCoincidence.fill(TriggerModule.getClusterTime(trackClusters[0]) - TriggerModule.getClusterTime(trackClusters[1])); + trctmClusterPosition.fill(TriggerModule.getClusterXIndex(trackClusters[0]), TriggerModule.getClusterYIndex(trackClusters[0])); + trctmClusterPosition.fill(TriggerModule.getClusterXIndex(trackClusters[1]), TriggerModule.getClusterYIndex(trackClusters[1])); + + // Populate the momentum plots. + trctmInvariantMass.fill(getInvariantMass(pair)); + trctmElectronMomentum.fill(electronTrack.getMomentum().magnitude()); + trctmPositronMomentum.fill(positronTrack.getMomentum().magnitude()); + trctmMomentumSum1D.fill(VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude()); + trctmMomentumSum2D.fill(pair[0].getMomentum().magnitude(), pair[1].getMomentum().magnitude()); + trctmTrackPosition.fill(TrackUtils.getTrackPositionAtEcal(tracks[0]).x(), TrackUtils.getTrackPositionAtEcal(tracks[0]).y()); + trctmTrackPosition.fill(TrackUtils.getTrackPositionAtEcal(tracks[1]).x(), TrackUtils.getTrackPositionAtEcal(tracks[1]).y()); + trctmPSumCoplanarity.fill(VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude(), + getCalculatedCoplanarity(new Track[] { pair[0].getTracks().get(0), pair[1].getTracks().get(0) })); + } + + // Produce trident vertexed plots. + trvtxInstancesInEvent.fill(tridentsVTX.size()); + for(ReconstructedParticle[] pair : tridentsVTX) { + // Get the electron and positron tracks. + ReconstructedParticle electronTrack = pair[pair[0].getCharge() < 0 ? 0 : 1]; + ReconstructedParticle positronTrack = pair[pair[0].getCharge() > 0 ? 0 : 1]; + + // Get the track clusters. + Cluster electronCluster = electronTrack.getClusters().get(0); + Cluster positronCluster = positronTrack.getClusters().get(0); + Track[] tracks = { pair[0].getTracks().get(0), pair[1].getTracks().get(0) }; + Cluster[] trackClusters = { pair[0].getClusters().get(0), pair[1].getClusters().get(0) }; + + // Populate the cluster plots. + trvtxElectronEnergy.fill(electronCluster.getEnergy()); + trvtxPositronEnergy.fill(positronCluster.getEnergy()); + trvtxEnergySum2D.fill(pair[0].getEnergy(), pair[1].getEnergy()); + trvtxEnergySum1D.fill(TriggerModule.getValueEnergySum(trackClusters)); + trvtxESumCoplanarity.fill(TriggerModule.getValueEnergySum(trackClusters), getCalculatedCoplanarity(trackClusters)); + trvtxTimeCoincidence.fill(TriggerModule.getClusterTime(trackClusters[0]) - TriggerModule.getClusterTime(trackClusters[1])); + trvtxClusterPosition.fill(TriggerModule.getClusterXIndex(trackClusters[0]), TriggerModule.getClusterYIndex(trackClusters[0])); + trvtxClusterPosition.fill(TriggerModule.getClusterXIndex(trackClusters[1]), TriggerModule.getClusterYIndex(trackClusters[1])); + + // Populate the momentum plots. + trvtxInvariantMass.fill(getInvariantMass(pair)); + trvtxElectronMomentum.fill(electronTrack.getMomentum().magnitude()); + trvtxPositronMomentum.fill(positronTrack.getMomentum().magnitude()); + trvtxMomentumSum1D.fill(VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude()); + trvtxMomentumSum2D.fill(pair[0].getMomentum().magnitude(), pair[1].getMomentum().magnitude()); + trvtxTrackPosition.fill(TrackUtils.getTrackPositionAtEcal(tracks[0]).x(), TrackUtils.getTrackPositionAtEcal(tracks[0]).y()); + trvtxTrackPosition.fill(TrackUtils.getTrackPositionAtEcal(tracks[1]).x(), TrackUtils.getTrackPositionAtEcal(tracks[1]).y()); + trvtxPSumCoplanarity.fill(VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude(), + getCalculatedCoplanarity(new Track[] { pair[0].getTracks().get(0), pair[1].getTracks().get(0) })); + } + + // Produce the Møller vertexed plots. + møvtxInstancesInEvent.fill(møllersVTX.size()); + RelationalTable<?, ?> hitToStrips = TrackUtils.getHitToStripsTable(event); + RelationalTable<?, ?> hitToRotated = TrackUtils.getHitToRotatedTable(event); + for(ReconstructedParticle pair[] : møllersVTX) { + // Get the tracks and track times. + Track[] tracks = { pair[0].getTracks().get(0), pair[1].getTracks().get(0) }; + double times[] = { + TrackUtils.getTrackTime(tracks[0], hitToStrips, hitToRotated), + TrackUtils.getTrackTime(tracks[1], hitToStrips, hitToRotated) + }; + + // Fill the plots. + møvtxTimeCoincidence.fill(times[0] - times[1]); + møvtxInvariantMass.fill(getInvariantMass(pair)); + møvtxElectronMomentum.fill(pair[0].getMomentum().magnitude()); + møvtxElectronMomentum.fill(pair[1].getMomentum().magnitude()); + møvtxMomentumSum1D.fill(VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude()); + møvtxMomentumSum2D.fill(pair[0].getMomentum().magnitude(), pair[1].getMomentum().magnitude()); + møvtxTrackPosition.fill(TrackUtils.getTrackPositionAtEcal(tracks[0]).x(), TrackUtils.getTrackPositionAtEcal(tracks[0]).y()); + møvtxTrackPosition.fill(TrackUtils.getTrackPositionAtEcal(tracks[1]).x(), TrackUtils.getTrackPositionAtEcal(tracks[1]).y()); + møvtxPSumCoplanarity.fill(VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude(), + getCalculatedCoplanarity(new Track[] { pair[0].getTracks().get(0), pair[1].getTracks().get(0) })); + } + + // Produce the Møller track-only plots. + møgblInstancesInEvent.fill(møllersGBL.size()); + for(ReconstructedParticle pair[] : møllersGBL) { + // Get the tracks and track times. + Track[] tracks = { pair[0].getTracks().get(0), pair[1].getTracks().get(0) }; + double times[] = { + TrackUtils.getTrackTime(tracks[0], hitToStrips, hitToRotated), + TrackUtils.getTrackTime(tracks[1], hitToStrips, hitToRotated) + }; + + // Fill the plots. + møgblTimeCoincidence.fill(times[0] - times[1]); + møgblInvariantMass.fill(getInvariantMass(pair)); + møgblElectronMomentum.fill(pair[0].getMomentum().magnitude()); + møgblElectronMomentum.fill(pair[1].getMomentum().magnitude()); + møgblMomentumSum1D.fill(VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude()); + møgblMomentumSum2D.fill(pair[0].getMomentum().magnitude(), pair[1].getMomentum().magnitude()); + møgblTrackPosition.fill(TrackUtils.getTrackPositionAtEcal(tracks[0]).x(), TrackUtils.getTrackPositionAtEcal(tracks[0]).y()); + møgblTrackPosition.fill(TrackUtils.getTrackPositionAtEcal(tracks[1]).x(), TrackUtils.getTrackPositionAtEcal(tracks[1]).y()); + møgblPSumCoplanarity.fill(VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude(), + getCalculatedCoplanarity(new Track[] { pair[0].getTracks().get(0), pair[1].getTracks().get(0) })); + } + + // Produce track-only trident plots. + trgblInstancesInEvent.fill(tridentsGBL.size()); + for(ReconstructedParticle[] pair : tridentsGBL) { + // Get the tracks and track times. + Track[] tracks = { pair[0].getTracks().get(0), pair[1].getTracks().get(0) }; + double times[] = { + TrackUtils.getTrackTime(tracks[0], hitToStrips, hitToRotated), + TrackUtils.getTrackTime(tracks[1], hitToStrips, hitToRotated) + }; + + // Get the positron and the electron. + ReconstructedParticle positron = pair[0].getCharge() > 0 ? pair[0] : pair[1]; + ReconstructedParticle electron = pair[0].getCharge() < 0 ? pair[0] : pair[1]; + + // Fill the plots. + trgblTimeCoincidence.fill(times[0] - times[1]); + trgblInvariantMass.fill(getInvariantMass(pair)); + trgblElectronMomentum.fill(electron.getMomentum().magnitude()); + trgblPositronMomentum.fill(positron.getMomentum().magnitude()); + trgblMomentumSum1D.fill(VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude()); + trgblMomentumSum2D.fill(pair[0].getMomentum().magnitude(), pair[1].getMomentum().magnitude()); + trgblTrackPosition.fill(TrackUtils.getTrackPositionAtEcal(tracks[0]).x(), TrackUtils.getTrackPositionAtEcal(tracks[0]).y()); + trgblTrackPosition.fill(TrackUtils.getTrackPositionAtEcal(tracks[1]).x(), TrackUtils.getTrackPositionAtEcal(tracks[1]).y()); + trgblPSumCoplanarity.fill(VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude(), + getCalculatedCoplanarity(new Track[] { pair[0].getTracks().get(0), pair[1].getTracks().get(0) })); + } + } + + public void setCheckSVT(boolean state) { + checkSVT = state; + } + + public void setCheckTriggerTimeWindow(boolean state) { + checkTriggerTimeWindow = state; + } + + /** + * Gets a list of all possible GBL top/bottom track pairs. These + * tracks are not guaranteed to have a matched cluster. + * @param trackList - A list of all possible tracks. + * @return Returns a list of track pairs. + */ + private static final List<ReconstructedParticle[]> getTopBottomTracksGBL(List<ReconstructedParticle> trackList) { + // Separate the tracks into top and bottom tracks based on + // the value of tan(Î). Use only GBL tracks to avoid track + // duplication. + List<ReconstructedParticle> topTracks = new ArrayList<ReconstructedParticle>(); + List<ReconstructedParticle> botTracks = new ArrayList<ReconstructedParticle>(); + trackLoop: + for(ReconstructedParticle track : trackList) { + // Require that the ReconstructedParticle contain an actual + // Track object. + if(track.getTracks().isEmpty()) { + continue trackLoop; + } + + // Ignore tracks that are not GBL tracks. + if(!TrackType.isGBL(track.getType())) { + continue trackLoop; + } + + // If the above tests pass, the ReconstructedParticle has + // a track and is also a GBL track. Separate it into either + // a top or a bottom track based on its tan(Î) value. + if(track.getTracks().get(0).getTrackStates().get(0).getTanLambda() > 0) { + topTracks.add(track); + } else { + botTracks.add(track); + } + } + + // Form all top/bottom pairs with the unique tracks. + List<ReconstructedParticle[]> pairList = new ArrayList<ReconstructedParticle[]>(); + for(ReconstructedParticle topTrack : topTracks) { + for(ReconstructedParticle botTrack : botTracks) { + pairList.add(new ReconstructedParticle[] { topTrack, botTrack }); + } + } + + // Return the result. + return pairList; + } + + /** + * Produces pairs of tracks. The track pairs are required to be + * matched to a cluster and the associated clusters must form a + * top/bottom pair. If more than one track points to the same + * cluster, only the first track is retained. + * @param trackList - A list of all tracks. + * @return Returns a list of track pairs meeting the aforementioned + * conditions. + */ + private static final List<ReconstructedParticle[]> getTopBottomTracksCTMatched(List<ReconstructedParticle> trackList) { + // Track clusters that have already been seen to prevent clusters + // that have duplicate tracks from reappearing. + Set<Cluster> clusterSet = new HashSet<Cluster>(); + + // Separate the tracks into top and bottom tracks based on + // the track cluster. Filter out tracks with no clusters. + List<ReconstructedParticle> topTracks = new ArrayList<ReconstructedParticle>(); + List<ReconstructedParticle> botTracks = new ArrayList<ReconstructedParticle>(); + trackLoop: + for(ReconstructedParticle track : trackList) { + // Check if the track has a cluster. If not, skip it. + if(track.getClusters().isEmpty()) { + continue trackLoop; + } + + // If the track doesn't have actual tracks, skip it. + if(track.getTracks().isEmpty()) { + continue trackLoop; + } + + // Check if the track cluster has already seen. + Cluster trackCluster = track.getClusters().get(0); + if(clusterSet.contains(trackCluster)) { + continue trackLoop; + } + + // If the track has a unique cluster, add it to the proper + // list based on the cluster y-index. + clusterSet.add(trackCluster); + if(TriggerModule.getClusterYIndex(trackCluster) > 0) { + topTracks.add(track); + } else { + botTracks.add(track); + } + } + + // Form all top/bottom pairs with the unique tracks. + List<ReconstructedParticle[]> pairList = new ArrayList<ReconstructedParticle[]>(); + for(ReconstructedParticle topTrack : topTracks) { + for(ReconstructedParticle botTrack : botTracks) { + pairList.add(new ReconstructedParticle[] { topTrack, botTrack }); + } + } + + // Return the result. + return pairList; + } + + private final List<ReconstructedParticle[]> getTridentTracksVertexed(List<ReconstructedParticle> candidateList) { + // Store the set of track pairs that meet the trident condition. + List<ReconstructedParticle[]> tridentTracks = new ArrayList<ReconstructedParticle[]>(); + + // Loop over the filtered pair list and apply the trident + // condition test. + tridentLoop: + for(ReconstructedParticle candidate : candidateList) { + // Require that the vertex fit have a X^2 value of less + // than 25. + trvtxChiSquared.fill(candidate.getStartVertex().getChi2()); + if(candidate.getStartVertex().getChi2() > 10) { + continue tridentLoop; + } + + // Make sure that each particle is track/cluster matched. + ReconstructedParticle[] pair = { + candidate.getParticles().get(0), + candidate.getParticles().get(1) + }; + if(pair[0].getTracks().isEmpty() || pair[0].getClusters().isEmpty()) { + continue tridentLoop; + } + if(pair[1].getTracks().isEmpty() || pair[1].getClusters().isEmpty()) { + continue tridentLoop; + } + + // Make sure there is a top/bottom cluster pair. + Cluster[] trackClusters = { pair[0].getClusters().get(0), pair[1].getClusters().get(0) }; + boolean hasTop = TriggerModule.getClusterYIndex(trackClusters[0]) > 0 || TriggerModule.getClusterYIndex(trackClusters[1]) > 0; + boolean hasBot = TriggerModule.getClusterYIndex(trackClusters[0]) < 0 || TriggerModule.getClusterYIndex(trackClusters[1]) < 0; + if(!hasTop || !hasBot) { + continue tridentLoop; + } + + // There must be one positive and one negative track. + ReconstructedParticle electron = null; + ReconstructedParticle positron = null; + if(pair[0].getCharge() > 0) { positron = pair[0]; } + else if(pair[1].getCharge() > 0) { positron = pair[1]; } + if(pair[0].getCharge() < 0) { electron = pair[0]; } + else if(pair[1].getCharge() < 0) { electron = pair[1]; } + if(electron == null || positron == null) { + continue tridentLoop; + } + + // Make sure that the clusters are not the same. This should + // not actually ever be possible... + if(pair[0].getClusters().get(0) == pair[1].getClusters().get(0)) { + continue tridentLoop; + } + + // The clusters must within a limited time window. + if(TriggerModule.getValueTimeCoincidence(trackClusters) > timeCoincidence) { + continue tridentLoop; + } + + // Require that the electron in the pair have an energy + // below the elastic threshold to exclude elastic electrons. + if(electron.getMomentum().magnitude() >= elasticThreshold) { + continue tridentLoop; + } + + // Require that all clusters occur within the trigger time + // window to exclude accidentals. + if(checkTriggerTimeWindow) { + if(!inTriggerWindow(trackClusters[0]) || !inTriggerWindow(trackClusters[1])) { + continue tridentLoop; + } + } + + // If all the above conditions are met, the pair is to be + // considered a trident pair. Add it to the list. + tridentTracks.add(pair); + } + + // Return the list of pairs that passed the condition. + return tridentTracks; + } + + private final List<ReconstructedParticle[]> getTridentClustersGBL(List<ReconstructedParticle[]> pairList, List<Cluster[]> clusterList, EventHeader event) { + // Store the set of track pairs that meet the trident condition. + List<ReconstructedParticle[]> tridentTracks = new ArrayList<ReconstructedParticle[]>(); + + // Extract track relational tables from the event object. + RelationalTable<?, ?> hitToStrips = TrackUtils.getHitToStripsTable(event); + RelationalTable<?, ?> hitToRotated = TrackUtils.getHitToRotatedTable(event); + + // Tracks will not be considered for trident analysis unless there + // is at least one top/bottom cluster pair within the time window. + boolean passesClusterCondition = false; + tridentClusterLoop: + for(Cluster[] pair : clusterList) { + // Ignore clusters that are too far apart temporally. + if(TriggerModule.getValueTimeCoincidence(pair) > timeCoincidence) { + continue tridentClusterLoop; + } + + // Require that the cluster pair be top/bottom. + boolean hasTop = TriggerModule.getClusterYIndex(pair[0]) > 0 || TriggerModule.getClusterYIndex(pair[1]) > 0; + boolean hasBot = TriggerModule.getClusterYIndex(pair[0]) < 0 || TriggerModule.getClusterYIndex(pair[1]) < 0; + if(!hasTop || !hasBot) { + continue tridentClusterLoop; + } + + // If the cluster passes, mark that it has done so and skip + // the rest. Only one pair need pass. + passesClusterCondition = true; + break tridentClusterLoop; + } + + // If no cluster pair passed the cluster condition, no tracks + // are allowed to pass either. + if(!passesClusterCondition) { + return tridentTracks; + } + + // Next, check the track pair list. A track pair must have a + // positive and a negative track and must also be within the + // time coincidence window. + tridentTrackLoop: + for(ReconstructedParticle[] pair : pairList) { + // Check that there is at least one positive and one negative + // track in the pair. + boolean hasPositive = pair[0].getCharge() > 0 || pair[1].getCharge() > 0; + boolean hasNegative = pair[0].getCharge() < 0 || pair[1].getCharge() < 0; + if(!hasPositive || !hasNegative) { + break tridentTrackLoop; + } + + // Check that the track pair passes the time cut. + double times[] = { + TrackUtils.getTrackTime(pair[0].getTracks().get(0), hitToStrips, hitToRotated), + TrackUtils.getTrackTime(pair[1].getTracks().get(0), hitToStrips, hitToRotated) + }; + + if(Math.abs(times[0] - times[1]) > timeCoincidence) { + continue tridentTrackLoop; + } + + // Require that the negative track have less than the + // elastic threshold momentum to exclude elastic electrons. + if(pair[0].getCharge() < 0 && pair[0].getMomentum().magnitude() > elasticThreshold + || pair[1].getCharge() < 0 && pair[1].getMomentum().magnitude() > elasticThreshold) { + continue tridentTrackLoop; + } + + // If the track passes both, it is considered a trident pair. + tridentTracks.add(pair); + } + + // Return the resultant pairs. + return tridentTracks; + } + + /** + * Gets a list track pairs that meet the trident condition defined + * using tracks with matched calorimeter clusters. A pair meets the + * cluster/track matched trident condition is it meets the following: + * <ul><li>Both tracks have matched clusters.</li> + * <li>Has one positive track.</li> + * <li>Has one negative track.</li> + * <li>Clusters have a time coincidence of 2.5 ns or less.</li> + * <li>The electron momentum is below 900 MeV.</li></ul> + * @param pairList - A <code>List</code> collection of parameterized + * type <code>ReconstructedParticle[]</code> containing all valid + * top/bottom pairs of tracks with matched clusters. These will be + * tested to see if they meet the process criteria. + * @return Returns a list containing pairs of tracks that meet the + * trident condition. + */ + private final List<ReconstructedParticle[]> getTridentTracksCTMatched(List<ReconstructedParticle[]> pairList) { + // Store the set of track pairs that meet the trident condition. + List<ReconstructedParticle[]> tridentTracks = new ArrayList<ReconstructedParticle[]>(); + + // Loop over the filtered pair list and apply the trident + // condition test. + tridentLoop: + for(ReconstructedParticle[] pair : pairList) { + // There must be one positive and one negative track. + ReconstructedParticle electron = null; + ReconstructedParticle positron = null; + if(pair[0].getCharge() > 0) { positron = pair[0]; } + else if(pair[1].getCharge() > 0) { positron = pair[1]; } + if(pair[0].getCharge() < 0) { electron = pair[0]; } + else if(pair[1].getCharge() < 0) { electron = pair[1]; } + if(electron == null || positron == null) { + continue tridentLoop; + } + + // Make sure that the clusters are not the same. This should + // not actually ever be possible... + if(pair[0].getClusters().get(0) == pair[1].getClusters().get(0)) { + continue tridentLoop; + } + + // The clusters must within a limited time window. + Cluster[] trackClusters = { pair[0].getClusters().get(0), pair[1].getClusters().get(0) }; + if(TriggerModule.getValueTimeCoincidence(trackClusters) > timeCoincidence) { + continue tridentLoop; + } + + // Require that the electron in the pair have an energy + // below the elastic threshold to exclude elastic electrons. + if(electron.getMomentum().magnitude() >= elasticThreshold) { + continue tridentLoop; + } + + // Require that all clusters occur within the trigger time + // window to exclude accidentals. + if(checkTriggerTimeWindow) { + if(!inTriggerWindow(trackClusters[0]) || !inTriggerWindow(trackClusters[1])) { + continue tridentLoop; + } + } + + // If all the above conditions are met, the pair is to be + // considered a trident pair. Add it to the list. + tridentTracks.add(pair); + } + + // Return the list of pairs that passed the condition. + return tridentTracks; + } + + private final List<ReconstructedParticle[]> getMøllerTracksGBL(List<ReconstructedParticle[]> pairList, EventHeader event) { + // Store the set of track pairs that meet the Møller condition. + List<ReconstructedParticle[]> møllerTracks = new ArrayList<ReconstructedParticle[]>(); + + // Extract track relational tables from the event object. + RelationalTable<?, ?> hitToStrips = TrackUtils.getHitToStripsTable(event); + RelationalTable<?, ?> hitToRotated = TrackUtils.getHitToRotatedTable(event); + + // Loop over the filtered pair list and apply the Møller + // condition test. + møllerLoop: + for(ReconstructedParticle[] pair : pairList) { + // Both tracks must be negatively charged. + if(pair[0].getCharge() > 0 || pair[1].getCharge() > 0) { + continue møllerLoop; + } + + // The clusters must within a limited time window. + double times[] = { + TrackUtils.getTrackTime(pair[0].getTracks().get(0), hitToStrips, hitToRotated), + TrackUtils.getTrackTime(pair[1].getTracks().get(0), hitToStrips, hitToRotated) + }; + + if(Math.abs(times[0] - times[1]) > timeCoincidence) { + continue møllerLoop; + } + + // Require that the electrons in the pair have energies + // below the elastic threshold to exclude said electrons. + if(pair[0].getMomentum().magnitude() > elasticThreshold || pair[1].getMomentum().magnitude() > elasticThreshold) { + continue møllerLoop; + } + + // Require that the energy of the pair be within a range + // that is sufficiently "Møller-like." + double momentumSum = VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude(); + if(momentumSum < møllerLowerRange || momentumSum > møllerUpperRange) { + continue møllerLoop; + } + + // If all the above conditions are met, the pair is to be + // considered a trident pair. Add it to the list. + møllerTracks.add(pair); + } + + // Return the list of pairs that passed the condition. + return møllerTracks; + } + + private final List<ReconstructedParticle[]> getMøllerTracksVertexed(List<ReconstructedParticle> candidateList) { + // Store the set of track pairs that meet the Møller condition. + List<ReconstructedParticle[]> møllerTracks = new ArrayList<ReconstructedParticle[]>(); + + // Loop over the candidate list and apply the Møller cuts. + møllerLoop: + for(ReconstructedParticle candidate : candidateList) { + // Require that the vertex fit have a X^2 value of less + // than 25. + if(candidate.getStartVertex().getChi2() > 10) { + continue møllerLoop; + } + + // Make sure that each particle is track/cluster matched. + ReconstructedParticle[] pair = { + candidate.getParticles().get(0), + candidate.getParticles().get(1) + }; + if(pair[0].getTracks().isEmpty() || pair[0].getClusters().isEmpty()) { + continue møllerLoop; + } + if(pair[1].getTracks().isEmpty() || pair[1].getClusters().isEmpty()) { + continue møllerLoop; + } + + // Make sure there is a top/bottom cluster pair. + Cluster[] trackClusters = { pair[0].getClusters().get(0), pair[1].getClusters().get(0) }; + boolean hasTop = TriggerModule.getClusterYIndex(trackClusters[0]) > 0 || TriggerModule.getClusterYIndex(trackClusters[1]) > 0; + boolean hasBot = TriggerModule.getClusterYIndex(trackClusters[0]) < 0 || TriggerModule.getClusterYIndex(trackClusters[1]) < 0; + if(!hasTop || !hasBot) { + continue møllerLoop; + } + + // Require that the clusters be within the time coincidence. + if(TriggerModule.getValueTimeCoincidence(trackClusters) > timeCoincidence) { + continue møllerLoop; + } + + // Require that both tracks have less than the elastic + // threshold in momentum. + if(pair[0].getMomentum().magnitude() > elasticThreshold || pair[1].getMomentum().magnitude() > elasticThreshold) { + continue møllerLoop; + } + + + + + // Variable definitions + double[] mom1 = pair[0].getMomentum().v(); + double px1 = mom1[0]; + double py1 = mom1[1]; + double pz1 = mom1[2]; + + double unrot_px1 = px1*Math.cos(-0.0305) + pz1*Math.sin(-0.0305); + double unrot_pz1 = pz1*Math.cos(-0.0305) - px1*Math.sin(-0.0305); + + double unrot_theta1 = Math.atan2(Math.sqrt(unrot_px1*unrot_px1 + py1*py1),unrot_pz1); + double TrackE1 = Math.sqrt(Math.sqrt(px1*px1 + py1*py1 + pz1*pz1)*Math.sqrt(px1*px1 + py1*py1 + pz1*pz1) + 0.0005109989*0.0005109989); + + + double[] mom2 = pair[1].getMomentum().v(); + double px2 = mom2[0]; + double py2 = mom2[1]; + double pz2 = mom2[2]; + + double unrot_px2 = px2*Math.cos(-0.0305) + pz2*Math.sin(-0.0305); + double unrot_pz2 = pz2*Math.cos(-0.0305) - px2*Math.sin(-0.0305); + + double unrot_theta2 = Math.atan2(Math.sqrt(unrot_px2*unrot_px2 + py2*py2),unrot_pz2); + double TrackE2 = Math.sqrt(Math.sqrt(px2*px2 + py2*py2 + pz2*pz2)*Math.sqrt(px2*px2 + py2*py2 + pz2*pz2) + 0.0005109989*0.0005109989); + + + // Ultimate Moller Cut + if((Math.sin(unrot_theta1/2)*Math.sin(unrot_theta2/2)<=(1+0.20)*0.5109989/(2*1056) && Math.sin(unrot_theta1/2)*Math.sin(unrot_theta2/2)>=(1-0.20)*0.5109989/(2*1056)) ) { + if( (TrackE1+TrackE2<=(1+0.10)*1.056 && TrackE1+TrackE2>=(1-0.10)*1.056) ) { + + + + + møllerTracks.add(pair); + } + } + + + + + /* + double[] trackE = new double[2]; + double[] unrotTheta = new double[2]; + double[][] unrotP = new double[2][3]; + for(int i = 0; i < pair.length; i++) { + unrotP[i][0] = pair[i].getMomentum().x() * Math.cos(BEAM_ROTATION) + pair[i].getMomentum().z() * Math.sin(BEAM_ROTATION); + unrotP[i][2] = pair[i].getMomentum().z() * Math.cos(BEAM_ROTATION) - pair[i].getMomentum().x() * Math.sin(BEAM_ROTATION); + unrotTheta[i] = Math.atan2(Math.sqrt(unrotP[i][0] * unrotP[i][0] + pair[0].getMomentum().y() * pair[i].getMomentum().y()), unrotP[0][2]); + trackE[i] = Math.sqrt(pair[i].getMomentum().magnitudeSquared() + ELECTRON_MASS_2); + } + + // Perform the track angle threshold cuts. + double unrotatedTheta = Math.sin(unrotTheta[0] / 2) * Math.sin(unrotTheta[1] / 2); + if((unrotatedTheta <= MÃLLER_ANGLE_THRESHOLD[HIGH] && unrotatedTheta >= MÃLLER_ANGLE_THRESHOLD[LOW])) { + // Perform the track energy sum threshold cuts. + double trackESum = trackE[0] + trackE[1]; + if((trackESum <= MÃLLER_ENERGY_THRESHOLD[HIGH] && trackESum >= MÃLLER_ENERGY_THRESHOLD[LOW])) { + // If a pair passes all the Møller cuts, then it + // is a Møller pair. + møllerTracks.add(pair); + } + } + */ + } + + // Return the Møller list. + return møllerTracks; + } + + /** + * Gets a list track pairs that meet the Møller condition defined + * using tracks with matched calorimeter clusters. A pair meets the + * cluster/track matched Møller condition is it meets the following: + * <ul><li>Both tracks have matched clusters.</li> + * <li>Both tracks are negative.</li> + * <li>Clusters have a time coincidence of 2.5 ns or less.</li> + * <li>The electron momenta are below 900 MeV.</li> + * <li>The momentum sum of the tracks is in the range <code>800 MeV + * ⤠p1 + p2 ⤠1500 MeV</li></ul> + * @param pairList - A <code>List</code> collection of parameterized + * type <code>ReconstructedParticle[]</code> containing all valid + * top/bottom pairs of tracks with matched clusters. These will be + * tested to see if they meet the process criteria. + * @return Returns a list containing pairs of tracks that meet the + * Møller condition. + */ + private final List<ReconstructedParticle[]> getMøllerTracksCTMatched(List<ReconstructedParticle[]> pairList) { + // Store the set of track pairs that meet the Møller condition. + List<ReconstructedParticle[]> møllerTracks = new ArrayList<ReconstructedParticle[]>(); + + // Loop over the filtered pair list and apply the Møller + // condition test. + møllerLoop: + for(ReconstructedParticle[] pair : pairList) { + // Both tracks must be negatively charged. + if(pair[0].getCharge() > 0 || pair[1].getCharge() > 0) { + continue møllerLoop; + } + + // The clusters must within a limited time window. + Cluster[] trackClusters = { pair[0].getClusters().get(0), pair[1].getClusters().get(0) }; + if(TriggerModule.getValueTimeCoincidence(trackClusters) > timeCoincidence) { + continue møllerLoop; + } + + // Require that the electrons in the pair have energies + // below the elastic threshold to exclude said electrons. + if(pair[0].getMomentum().magnitude() > elasticThreshold || pair[1].getMomentum().magnitude() > elasticThreshold) { + continue møllerLoop; + } + + // Require that the energy of the pair be within a range + // that is sufficiently "Møller-like." + double momentumSum = VecOp.add(pair[0].getMomentum(), pair[1].getMomentum()).magnitude(); + if(momentumSum < møllerLowerRange || momentumSum > møllerUpperRange) { + continue møllerLoop; + } + + // Require that all clusters occur within the trigger time + // window to exclude accidentals. + if(checkTriggerTimeWindow) { + if(!inTriggerWindow(trackClusters[0]) || !inTriggerWindow(trackClusters[1])) { + continue møllerLoop; + } + } + + // If all the above conditions are met, the pair is to be + // considered a trident pair. Add it to the list. + møllerTracks.add(pair); + } + + // Return the list of pairs that passed the condition. + return møllerTracks; + } + + /** + * Calculates the approximate invariant mass for a pair of tracks + * from their momentum. This assumes that the particles are either + * electrons or positrons, and thusly have a sufficiently small + * mass term that it can be safely excluded. + * @param pair - The track pair for which to calculate the invariant + * mass. + * @return Returns the approximate invariant mass in units of GeV. + */ + private static final double getInvariantMass(ReconstructedParticle[] pair) { + // Get the momentum squared. + double p2 = Math.pow(pair[0].getMomentum().magnitude() + pair[1].getMomentum().magnitude(), 2); + + // Get the remaining terms. + double xPro = pair[0].getMomentum().x() + pair[1].getMomentum().x(); + double yPro = pair[0].getMomentum().y() + pair[1].getMomentum().y(); + double zPro = pair[0].getMomentum().z() + pair[1].getMomentum().z(); + + // Calculate the invariant mass. + return Math.sqrt(p2 - Math.pow(xPro, 2) - Math.pow(yPro, 2) - Math.pow(zPro, 2)); + } + + /** + * Calculates the coplanarity angle between two points, specified + * by a double array. The array must be of the format (x, y, z). + * @param position - The first position array. + * @param otherPosition - The second position array. + * @return Returns the coplanarity angle between the points in units + * of degrees. + */ + private static final double getCalculatedCoplanarity(double[] position, double[] otherPosition) { + // Define the x- and y-coordinates of the clusters as well as + // calorimeter center. + final double ORIGIN_X = 42.52; + double x[] = { position[0], otherPosition[0] }; + double y[] = { position[1], otherPosition[1] }; + // Get the cluster angles. double[] clusterAngle = new double[2]; for(int i = 0; i < 2; i++) { Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/FormattedPlot.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/FormattedPlot.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/FormattedPlot.java Tue Sep 27 08:50:14 2016 @@ -1,25 +1,25 @@ package org.hps.users.kmccarty.plots; public abstract class FormattedPlot { - private final String xAxis; - private final String yAxis; - private final String plotName; - - public FormattedPlot(String xAxis, String yAxis, String plotName) { - this.xAxis = xAxis; - this.yAxis = yAxis; - this.plotName = plotName; - } - - public String getPlotName() { - return plotName; - } - - public String getXAxisName() { - return xAxis; - } - - public String getYAxisName() { - return yAxis; - } + private final String xAxis; + private final String yAxis; + private final String plotName; + + public FormattedPlot(String xAxis, String yAxis, String plotName) { + this.xAxis = xAxis; + this.yAxis = yAxis; + this.plotName = plotName; + } + + public String getPlotName() { + return plotName; + } + + public String getXAxisName() { + return xAxis; + } + + public String getYAxisName() { + return yAxis; + } } Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/FormattedPlot1D.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/FormattedPlot1D.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/FormattedPlot1D.java Tue Sep 27 08:50:14 2016 @@ -1,41 +1,136 @@ package org.hps.users.kmccarty.plots; +import java.util.HashSet; +import java.util.Set; + import org.hps.users.kmccarty.plots.PlotsFormatter.ColorStyle; +import org.hps.users.kmccarty.plots.PlotsFormatter.DisplayStyle; import hep.aida.IHistogram1D; public class FormattedPlot1D extends FormattedPlot { - private final ColorStyle style; - private final IHistogram1D plot; - private final double axisRange; - - public FormattedPlot1D(IHistogram1D plot, ColorStyle style, String xAxis, String yAxis, String plotName) { - super(xAxis, yAxis, plotName); - this.plot = plot; - this.style = style; - this.axisRange = -1; - } - - public FormattedPlot1D(IHistogram1D plot, ColorStyle style, String xAxis, String yAxis, String plotName, double axisRange) { - super(xAxis, yAxis, plotName); - this.plot = plot; - this.style = style; - this.axisRange = axisRange; - } - - public IHistogram1D getPlot() { - return plot; - } - - public ColorStyle getColorStyle() { - return style; - } - - public boolean definesAxisRange() { - return axisRange != -1; - } - - public double getAxisRange() { - return axisRange; - } + private final double axisMin; + private final double axisMax; + private final ColorStyle[] styles; + private final IHistogram1D[] plots; + private final DisplayStyle dispStyle; + + public FormattedPlot1D(IHistogram1D plot, ColorStyle style, String xAxis, String yAxis, String plotName) { + this(new IHistogram1D[] { plot }, new ColorStyle[] { style }, new String[] { plotName }, xAxis, yAxis, DisplayStyle.BAR, plotName); + } + + public FormattedPlot1D(IHistogram1D plot, ColorStyle style, String xAxis, String yAxis, DisplayStyle dispStyle, String plotName) { + this(new IHistogram1D[] { plot }, new ColorStyle[] { style }, new String[] { plotName }, xAxis, yAxis, dispStyle, plotName); + } + + public FormattedPlot1D(IHistogram1D plots[], ColorStyle[] styles, String[] entryNames, + String xAxis, String yAxis, DisplayStyle dispStyle, String plotName) { + this(plots, styles, entryNames, xAxis, yAxis, dispStyle, plotName, -1, -1); + } + + public FormattedPlot1D(IHistogram1D plot, ColorStyle style, String xAxis, String yAxis, String plotName, double axisMin, double axisMax) { + this(new IHistogram1D[] { plot }, new ColorStyle[] { style }, new String[] { plotName }, + xAxis, yAxis, DisplayStyle.BAR, plotName, axisMin, axisMax); + } + + public FormattedPlot1D(IHistogram1D plot, ColorStyle style, String xAxis, String yAxis, + DisplayStyle dispStyle, String plotName, double axisMin, double axisMax) { + this(new IHistogram1D[] { plot }, new ColorStyle[] { style }, new String[] { plotName }, + xAxis, yAxis, dispStyle, plotName, axisMin, axisMax); + } + + public FormattedPlot1D(IHistogram1D plots[], ColorStyle[] styles, String[] entryNames, String xAxis, + String yAxis, DisplayStyle dispStyle, String plotName, double axisMin, double axisMax) { + // Initialize the object. + super(xAxis, yAxis, plotName); + this.plots = plots; + this.styles = styles; + this.axisMin = axisMin; + this.axisMax = axisMax; + if(dispStyle == null) { this.dispStyle = DisplayStyle.BAR; } + else { this.dispStyle = dispStyle; } + + // Verify that the plot array is valid for a compound plot. + if(!verifyPlots(plots)) { + throw new IllegalArgumentException("Plots array invalid; plots must have the same bins!"); + } + + // Verify that all color styles are defined and are equal in + // number to the plots. + if(styles == null || styles.length != plots.length) { + throw new IllegalArgumentException("Color style array invalid; a number of color styles equal to plots must be defined."); + } + for(int i = 0; i < styles.length; i++) { + if(styles[i] == null) { + throw new IllegalArgumentException("Color style array invalid; all color styles must be defined."); + } + } + + // Set the names of each individual entry plot. + if(entryNames == null || entryNames.length != plots.length) { + throw new IllegalArgumentException("When defining multiple plots, a unique entry name must be defined for each."); + } + Set<String> entryNameSet = new HashSet<String>(entryNames.length); + for(int i = 0; i < plots.length; i++) { + if(entryNames[i] == null || entryNameSet.contains(entryNames[i])) { + throw new IllegalArgumentException("When defining multiple plots, a unique entry name must be defined for each."); + } + entryNameSet.add(entryNames[i]); + plots[i].setTitle(entryNames[i]); + } + } + + public IHistogram1D[] getPlots() { + return plots; + } + + public ColorStyle[] getColorStyle() { + return styles; + } + + public boolean definesAxisRange() { + return axisMax != -1; + } + + public double getAxisMin() { + return axisMin; + } + + public double getAxisMax() { + return axisMax; + } + + public DisplayStyle getDisplayStyle() { + return dispStyle; + } + + private static final boolean verifyPlots(IHistogram1D[] plots) { + // The plot file must be defined. + if(plots == null) { return false; } + + // If there is only one plot, it passes automatically. + if(plots.length == 1) { return true; } + + // All plots must have the same dimensions and bin values. + int baseBins = plots[0].axis().bins(); + for(IHistogram1D plot : plots) { + // Check that the plot has the same number of bins. + if(plot.axis().bins() != baseBins) { return false; } + } + + // Check that each bin in the plots has the same value. + for(int bin = 0; bin < baseBins; bin++) { + // Get the value of the first bin in the base plot. + double baseBinValue = plots[0].axis().binLowerEdge(0); + + // Check that all other plots are the same. + for(IHistogram1D plot : plots) { + // Check that the plot has the same number of bins. + if(plot.axis().binLowerEdge(0) != baseBinValue) { return false; } + } + } + + // Otherwise, the plots are the same. + return true; + } } Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/FormattedPlot2D.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/FormattedPlot2D.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/FormattedPlot2D.java Tue Sep 27 08:50:14 2016 @@ -3,48 +3,48 @@ import hep.aida.IHistogram2D; public class FormattedPlot2D extends FormattedPlot { - private final IHistogram2D plot; - private final boolean logarithmic; - private final double xAxisRange; - private final double yAxisRange; - - public FormattedPlot2D(IHistogram2D plot, boolean logarithmic, String xAxis, String yAxis, String plotName) { - super(xAxis, yAxis, plotName); - this.plot = plot; - this.xAxisRange = -1; - this.yAxisRange = -1; - this.logarithmic = logarithmic; - } - - public FormattedPlot2D(IHistogram2D plot, boolean logarithmic, String xAxis, String yAxis, String plotName, double xAxisRange, double yAxisRange) { - super(xAxis, yAxis, plotName); - this.plot = plot; - this.xAxisRange = xAxisRange; - this.yAxisRange = yAxisRange; - this.logarithmic = logarithmic; - } - - public IHistogram2D getPlot() { - return plot; - } - - public boolean isLogarithmic() { - return logarithmic; - } - - public boolean definesXAxisRange() { - return xAxisRange != -1; - } - - public boolean definesYAxisRange() { - return yAxisRange != -1; - } - - public double getXAxisRange() { - return xAxisRange; - } - - public double getYAxisRange() { - return yAxisRange; - } + private final IHistogram2D plot; + private final boolean logarithmic; + private final double xAxisRange; + private final double yAxisRange; + + public FormattedPlot2D(IHistogram2D plot, boolean logarithmic, String xAxis, String yAxis, String plotName) { + super(xAxis, yAxis, plotName); + this.plot = plot; + this.xAxisRange = -1; + this.yAxisRange = -1; + this.logarithmic = logarithmic; + } + + public FormattedPlot2D(IHistogram2D plot, boolean logarithmic, String xAxis, String yAxis, String plotName, double xAxisRange, double yAxisRange) { + super(xAxis, yAxis, plotName); + this.plot = plot; + this.xAxisRange = xAxisRange; + this.yAxisRange = yAxisRange; + this.logarithmic = logarithmic; + } + + public IHistogram2D getPlot() { + return plot; + } + + public boolean isLogarithmic() { + return logarithmic; + } + + public boolean definesXAxisRange() { + return xAxisRange != -1; + } + + public boolean definesYAxisRange() { + return yAxisRange != -1; + } + + public double getXAxisRange() { + return xAxisRange; + } + + public double getYAxisRange() { + return yAxisRange; + } } Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/PlotFormatModule.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/PlotFormatModule.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/PlotFormatModule.java Tue Sep 27 08:50:14 2016 @@ -7,8 +7,6 @@ import hep.aida.IPlotterFactory; import hep.aida.ref.plotter.PlotterRegion; -import org.hps.users.kmccarty.plots.PlotsFormatter.ColorStyle; - import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; @@ -17,189 +15,220 @@ import java.util.List; public class PlotFormatModule { - private String width = "2000"; - private String height = "1200"; - private List<FormattedPlot1D> formattedPlots1D = new ArrayList<FormattedPlot1D>(); - private List<FormattedPlot2D> formattedPlots2D = new ArrayList<FormattedPlot2D>(); - - public void addPlot1D(FormattedPlot1D plot) { - formattedPlots1D.add(plot); - } - - public void addPlot2D(FormattedPlot2D plot) { - formattedPlots2D.add(plot); - } - - public void setDisplayHeight(int height) { - this.height = "" + height; - } - - public void setDisplayWidth(int width) { - this.width = "" + width; - } - - public void displayPlots() { - try { processPlots(null); } - catch (IOException e) { e.printStackTrace(); } - } - - public void savePlots(String filePath) throws IOException { - processPlots(filePath); - } - - private void processPlots(String filePath) throws IOException { - // Create a plotter factory. - IAnalysisFactory af = IAnalysisFactory.create(); - IPlotterFactory plotterFactory = af.createPlotterFactory(); - - // Format and display the 1D plots. - for(FormattedPlot1D formattedPlot : formattedPlots1D) { - // Get the plot. - IHistogram1D plot = formattedPlot.getPlot(); - - // Create a plotter and plotting region for the plot. - IPlotter plotter = plotterFactory.create(plot.title()); - plotter.createRegions(1); - plotter.region(0).plot(plot); - - // Set the axis range. - PlotterRegion region = (PlotterRegion) plotter.region(0); - if(formattedPlot.definesAxisRange()) { - region.getPlot().getXAxis().setMax(formattedPlot.getAxisRange()); - } - - // Format the axis labels. - region.getPlot().setTitle(formattedPlot.getPlotName()); - region.getPlot().getXAxis().setLabel(formattedPlot.getXAxisName()); - region.getPlot().getYAxis().setLabel(formattedPlot.getYAxisName()); - - // Format the fonts and general plot presentation. - PlotsFormatter.setDefault1DStyle(region, new ColorStyle[] { formattedPlot.getColorStyle() }); - - // Set the plotter dimensions. - plotter.setParameter("plotterWidth", width); - plotter.setParameter("plotterHeight", height); - - // If the file path is null, display the plots. Otherwise, - // save them to the destination folder. - if(filePath == null) { plotter.show(); } - else { - File plotFile = new File(filePath + formattedPlot.getPlotName() + ".png"); - if(plotFile.exists()) { plotFile.delete(); } - plotter.writeToFile(filePath + formattedPlot.getPlotName() + ".png"); - System.out.printf("Saved plot \"%s\" to path: %s%n", formattedPlot.getPlotName(), filePath + formattedPlot.getPlotName() + ".png"); - } - } - - // Format and display the 2D plots. - for(FormattedPlot2D formattedPlot : formattedPlots2D) { - // Get the plot. - IHistogram2D plot = formattedPlot.getPlot(); - - // Create a plotter and plotting region for the plot. - IPlotter plotter = plotterFactory.create(formattedPlot.getPlotName()); - plotter.createRegions(1); - plotter.region(0).plot(plot); - - // Set the axis range. - PlotterRegion region = (PlotterRegion) plotter.region(0); - if(formattedPlot.definesXAxisRange()) { - region.getPlot().getXAxis().setMax(formattedPlot.getXAxisRange()); - } if(formattedPlot.definesYAxisRange()) { - region.getPlot().getYAxis().setMax(formattedPlot.getYAxisRange()); - } - - // Format the axis labels. - region.getPlot().setTitle(formattedPlot.getPlotName()); - region.getPlot().getXAxis().setLabel(formattedPlot.getXAxisName()); - region.getPlot().getYAxis().setLabel(formattedPlot.getYAxisName()); - - // Format the fonts and general plot presentation. - PlotsFormatter.setDefault2DStyle(region, formattedPlot.isLogarithmic()); - - // Set the plotter dimensions. - plotter.setParameter("plotterWidth", width); - plotter.setParameter("plotterHeight", height); - - // If the file path is null, display the plots. Otherwise, - // save them to the destination folder. - if(filePath == null) { plotter.show(); } - else { - File plotFile = new File(filePath + formattedPlot.getPlotName() + ".png"); - if(plotFile.exists()) { plotFile.delete(); } - plotter.writeToFile(filePath + formattedPlot.getPlotName() + ".png"); - System.out.printf("Saved plot \"%s\" to path: %s%n", formattedPlot.getPlotName(), filePath + formattedPlot.getPlotName() + ".png"); - } - } - } - - public void exportPlots(String filePath) throws IOException { - // Export the 1D plots in a text format. - for(FormattedPlot1D plot : formattedPlots1D) { - exportPlot(filePath, plot); - } - - // Export the 2D plots in a text format. - for(FormattedPlot2D plot : formattedPlots2D) { - exportPlot(filePath, plot); - } - } - - private static final void exportPlot(String filePath, FormattedPlot plot) throws IOException { - // Check if this is a one or two dimensional plot. - boolean is1D = plot instanceof FormattedPlot1D; - - // Create a file object for the plot. - String plotPath = filePath + plot.getPlotName() + (is1D ? ".aida1D" : ".aida2D"); - File datFile = new File(plotPath); - - // If the plot file already exists, delete it. - if(datFile.exists()) { datFile.delete(); } - - // Create a new file for the plot to occupy. - datFile.createNewFile(); - - // Get the textual form of the plot. - String plotText = null; - if(is1D) { plotText = toTextFormat(((FormattedPlot1D) plot).getPlot()); } - else { plotText = toTextFormat(((FormattedPlot2D) plot).getPlot()); } - - // Write the plot text to the file. - BufferedWriter writer = new BufferedWriter(new FileWriter(datFile)); - writer.write(plotText); - writer.close(); - - // Note that the file was written. - System.out.printf("Plot \"%s\" was exported to path: %s%n", plot.getPlotName(), plotPath); - } - - private static final String toTextFormat(IHistogram1D plot) { - // Create a buffer to hold the converted plot. - StringBuffer buffer = new StringBuffer(); - - // Iterate over the bins and output the plot in the format of - // "[BIN_MEAN] [BIN_VALUE]" with a tab delimiter. - for(int bin = 0; bin < plot.axis().bins(); bin++) { - buffer.append(String.format("%f\t%f%n", plot.binMean(bin), plot.binHeight(bin))); - } - - // Return the converted file. - return buffer.toString(); - } - - private static final String toTextFormat(IHistogram2D plot) { - // Create a buffer to hold the converted plot. - StringBuffer buffer = new StringBuffer(); - - // Iterate over the bins and output the plot in the format of - // "[X_BIN_MEAN] [Y_BIN_MEAN] [BIN_VALUE]" with a tab delimiter. - for(int xBin = 0; xBin < plot.xAxis().bins(); xBin++) { - for(int yBin = 0; yBin < plot.yAxis().bins(); yBin++) { - buffer.append(String.format("%f\t%f\t%f%n", plot.binMeanX(xBin, yBin), plot.binMeanY(xBin, yBin), plot.binHeight(xBin, yBin))); - } - } - - // Return the converted file. - return buffer.toString(); - } + private String width = "2000"; + private String height = "1200"; + private List<FormattedPlot1D> formattedPlots1D = new ArrayList<FormattedPlot1D>(); + private List<FormattedPlot2D> formattedPlots2D = new ArrayList<FormattedPlot2D>(); + + public void addPlot1D(FormattedPlot1D plot) { + formattedPlots1D.add(plot); + } + + public void addPlot2D(FormattedPlot2D plot) { + formattedPlots2D.add(plot); + } + + public void setDisplayHeight(int height) { + this.height = "" + height; + } + + public void setDisplayWidth(int width) { + this.width = "" + width; + } + + public void displayPlots() { + try { processPlots(null); } + catch (IOException e) { e.printStackTrace(); } + } + + public void savePlots(String filePath) throws IOException { + processPlots(filePath); + } + + private void processPlots(String filePath) throws IOException { + // Create a plotter factory. + IAnalysisFactory af = IAnalysisFactory.create(); + IPlotterFactory plotterFactory = af.createPlotterFactory(); + + // Format and display the 1D plots. + for(FormattedPlot1D formattedPlot : formattedPlots1D) { + // Get the plot(s). + IHistogram1D[] plots = formattedPlot.getPlots(); + + // Create a plotter and plotting region for the plot. + IPlotter plotter = plotterFactory.create(formattedPlot.getPlotName()); + plotter.createRegions(1); + for(IHistogram1D plot : plots) { + plotter.region(0).plot(plot); + } + + // Set the axis range. + PlotterRegion region = (PlotterRegion) plotter.region(0); + if(formattedPlot.definesAxisRange()) { + region.getPlot().getXAxis().setMin(formattedPlot.getAxisMin()); + region.getPlot().getXAxis().setMax(formattedPlot.getAxisMax()); + } + + // Format the axis labels. + region.getPlot().setTitle(formattedPlot.getPlotName()); + region.getPlot().getXAxis().setLabel(formattedPlot.getXAxisName()); + region.getPlot().getYAxis().setLabel(formattedPlot.getYAxisName()); + + // Format the fonts and general plot presentation. + PlotsFormatter.setDefault1DStyle(region, formattedPlot.getColorStyle(), formattedPlot.getDisplayStyle()); + + // Set the plotter dimensions. + plotter.setParameter("plotterWidth", width); + plotter.setParameter("plotterHeight", height); + + // If the file path is null, display the plots. Otherwise, + // save them to the destination folder. + if(filePath == null) { plotter.show(); } + else { + String name = sanitize(formattedPlot.getPlotName()); + File plotFile = new File(filePath + name + ".png"); + if(plotFile.exists()) { plotFile.delete(); } + plotter.writeToFile(filePath + name + ".png"); + System.out.printf("Saved plot \"%s\" to path: %s%n", name, filePath + name + ".png"); + } + } + + // Format and display the 2D plots. + for(FormattedPlot2D formattedPlot : formattedPlots2D) { + // Get the plot. + IHistogram2D plot = formattedPlot.getPlot(); + + // Create a plotter and plotting region for the plot. + IPlotter plotter = plotterFactory.create(formattedPlot.getPlotName()); + plotter.createRegions(1); + plotter.region(0).plot(plot); + + // Set the axis range. + PlotterRegion region = (PlotterRegion) plotter.region(0); + if(formattedPlot.definesXAxisRange()) { + region.getPlot().getXAxis().setMax(formattedPlot.getXAxisRange()); + } if(formattedPlot.definesYAxisRange()) { + region.getPlot().getYAxis().setMax(formattedPlot.getYAxisRange()); + } + + // Format the axis labels. + region.getPlot().setTitle(formattedPlot.getPlotName()); + region.getPlot().getXAxis().setLabel(formattedPlot.getXAxisName()); + region.getPlot().getYAxis().setLabel(formattedPlot.getYAxisName()); + + // Format the fonts and general plot presentation. + PlotsFormatter.setDefault2DStyle(region, formattedPlot.isLogarithmic()); + + // Set the plotter dimensions. + plotter.setParameter("plotterWidth", width); + plotter.setParameter("plotterHeight", height); + + // If the file path is null, display the plots. Otherwise, + // save them to the destination folder. + if(filePath == null) { plotter.show(); } + else { + File plotFile = new File(filePath + formattedPlot.getPlotName() + ".png"); + if(plotFile.exists()) { plotFile.delete(); } + plotter.writeToFile(filePath + formattedPlot.getPlotName() + ".png"); + System.out.printf("Saved plot \"%s\" to path: %s%n", formattedPlot.getPlotName(), filePath + formattedPlot.getPlotName() + ".png"); + } + } + } + + public void exportPlots(String filePath) throws IOException { + // Export the 1D plots in a text format. + for(FormattedPlot1D plot : formattedPlots1D) { + exportPlot(filePath, plot); + } + + // Export the 2D plots in a text format. + for(FormattedPlot2D plot : formattedPlots2D) { + exportPlot(filePath, plot); + } + } + + private static final void exportPlot(String filePath, FormattedPlot plot) throws IOException { + // Check if this is a one or two dimensional plot. + boolean is1D = plot instanceof FormattedPlot1D; + + // Create a file object for the plot. + String plotPath = filePath + plot.getPlotName() + (is1D ? ".aida1D" : ".aida2D"); + File datFile = new File(plotPath); + + // If the plot file already exists, delete it. + if(datFile.exists()) { datFile.delete(); } + + // Create a new file for the plot to occupy. + datFile.createNewFile(); + + // Get the textual form of the plot. + String plotText = null; + if(is1D) { plotText = toTextFormat(((FormattedPlot1D) plot).getPlots()); } + else { plotText = toTextFormat(((FormattedPlot2D) plot).getPlot()); } + + // Write the plot text to the file. + BufferedWriter writer = new BufferedWriter(new FileWriter(datFile)); + writer.write(plotText); + writer.close(); + + // Note that the file was written. + System.out.printf("Plot \"%s\" was exported to path: %s%n", plot.getPlotName(), plotPath); + } + + private static final String toTextFormat(IHistogram1D[] plot) { + // Create a buffer to hold the converted plot. + StringBuffer buffer = new StringBuffer(); + + // Iterate over the bins and output the plot in the format of + // "[BIN_MEAN] [BIN_VALUE]" with a tab delimiter. + for(int bin = 0; bin < plot[0].axis().bins(); bin++) { + // Add the bin value to the file once. + buffer.append(String.format("%f", plot[0].binMean(bin))); + + // Add all the plots' bin heights to the line.) + for(int i = 0; i < plot.length; i++) { + buffer.append(String.format("\t%f", plot[i].binHeight(bin))); + } + } + + // Return the converted file. + return buffer.toString(); + } + + private static final String toTextFormat(IHistogram2D plot) { + // Create a buffer to hold the converted plot. + StringBuffer buffer = new StringBuffer(); + + // Iterate over the bins and output the plot in the format of + // "[X_BIN_MEAN] [Y_BIN_MEAN] [BIN_VALUE]" with a tab delimiter. + for(int xBin = 0; xBin < plot.xAxis().bins(); xBin++) { + for(int yBin = 0; yBin < plot.yAxis().bins(); yBin++) { + buffer.append(String.format("%f\t%f\t%f%n", plot.binMeanX(xBin, yBin), plot.binMeanY(xBin, yBin), plot.binHeight(xBin, yBin))); + } + } + + // Return the converted file. + return buffer.toString(); + } + + /** + * Sanitizes a filename for saving. + * @param filename - The original filename. + * @return Returns the filename, but with all characters except + * those which are alphanumeric or a dash ('-') excluded. + */ + private static final String sanitize(String filename) { + // Store the sanitized filename. + StringBuffer cleanName = new StringBuffer(); + + // Only allow alphanumeric characters. + for(char c : filename.toCharArray()) { + if(Character.isLetterOrDigit(c) || c == '-') { + cleanName.append(c); + } + } + + // Return the cleaned name. + return cleanName.toString(); + } } Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/PlotsFormatter.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/PlotsFormatter.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/PlotsFormatter.java Tue Sep 27 08:50:14 2016 @@ -8,120 +8,146 @@ import java.awt.Font; public class PlotsFormatter { - // Define plot fonts. - public static final Font BASIC_FONT = new Font("Calibri", Font.PLAIN, 30); - public static final Font AXIS_FONT = new Font("Calibri", Font.BOLD, 35); - public static final Font TITLE_FONT = new Font("Calibri", Font.BOLD, 45); - - // Defines the color style options for plot data. - public static enum ColorStyle { - MS_BLUE(new Color( 79, 129, 189), new Color( 36, 64, 97)), MS_ORANGE(new Color(247, 150, 70), new Color(152, 72, 6)), - MS_RED(new Color(192, 80, 77), new Color( 99, 36, 35)), GREY(new Color(166, 166, 166), new Color( 89, 89, 89)), - MS_GREEN(new Color(155, 187, 89), new Color( 79, 98, 40)), CRIMSON(new Color(161, 0, 0), new Color(104, 0, 0)), - RUST(new Color(161, 80, 0), new Color(105, 80, 0)), YELLOW(new Color(161, 161, 0), new Color(122, 109, 8)), - FOREST(new Color( 65, 102, 0), new Color( 37, 79, 0)), GREEN(new Color( 7, 132, 70), new Color( 7, 82, 30)), - TEAL(new Color( 0, 130, 130), new Color( 0, 90, 100)), CERULEAN(new Color( 0, 86, 130), new Color( 0, 28, 83)), - BLUE(new Color( 0, 33, 203), new Color( 0, 0, 137)), INDIGO(new Color( 68, 10, 127), new Color( 0, 0, 61)), - PURPLE(new Color(106, 0, 106), new Color( 63, 0, 56)), FUSCHIA(new Color(119, 0, 60), new Color( 60, 0, 60)); - - private final Color fillColor; - private final Color lineColor; - - private ColorStyle(Color fillColor, Color lineColor) { - this.fillColor = fillColor; - this.lineColor = lineColor; - } - - public Color getFillColor() { return fillColor; } - - public Color getLineColor() { return lineColor; } - }; - - /** - * Sets the plot display formatting for 1D plots. - * @param region - The plotter region to format. - * @param color - The data color settings to use. - */ - public static final void setDefault1DStyle(PlotterRegion region, ColorStyle[] color) { - // Get the names of each plot on in the region. - String[] dataNames = region.getAllDataNames(); - - // Check whether this is an overlay plot. Overlay plots contain - // more than one data name. - boolean overlay = (dataNames.length > 1 ? true : false); - - // Iterate over each plot in the region. - for(int i = 0; i < dataNames.length; i++) { - // Set the overlay style if needed. - if(overlay) { - // Get the fill style for the current data type. - JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle(); - - // Set the histogram style to display thick-lined bars - // with no fill. The color is set by the "color" argument. - fillStyle.setHistogramFill(false); - fillStyle.setHistogramBarLineWidth(3); - fillStyle.setHistogramBarLineColor(color[i].getFillColor()); - - // Set the legend text style. - region.getPlot().getLegend().setFont(new Font("Calibri", Font.PLAIN, 20)); - } - - // Otherwise, set the fill style for a single plot. - else { - // Get the fill style for the current data type. - JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle(); - - // Set the histogram style to display thick-lined bars - // with a fill color. The colors are defined by the - // "color" argument. - fillStyle.setHistogramBarLineWidth(3); - fillStyle.setHistogramBarColor(color[i].getFillColor()); - fillStyle.setHistogramBarLineColor(color[i].getLineColor()); - } - - // Set the statistics box style. - region.getPlot().getStats().setVisible(true); - region.getPlot().getStats().setFont(BASIC_FONT); - - // Set the title font. - region.getPlot().getTitleObject().setFont(TITLE_FONT); - - // Set the axis tick-mark fonts. - region.getPlot().getXAxis().setFont(BASIC_FONT); - region.getPlot().getYAxis().setFont(BASIC_FONT); - region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT); - region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT); - } - } - - /** - * Sets the plot display formatting for 1D plots. - * @param region - The plotter region to format. - */ - public static final void setDefault2DStyle(PlotterRegion region, boolean logarithmic) { - // Get the fill style object. 2D plots should never be overlay - // plots, so there should only ever be one data name. - JASHist2DHistogramStyle fillStyle = (JASHist2DHistogramStyle) region.getDataForName(region.getAllDataNames()[0]).getStyle(); - - // Set the fill style for a two-dimensional plot. - if(logarithmic) { fillStyle.setLogZ(true); } - fillStyle.setHistStyle(JASHist2DHistogramStyle.STYLE_COLORMAP); - fillStyle.setColorMapScheme(JASHist2DHistogramStyle.COLORMAP_RAINBOW); - - // Make the statistics box invisible. - region.getPlot().getStats().setVisible(false); - - // Set the general plot font (which is also the z-axis font). - region.getPlot().setFont(BASIC_FONT); - - // Set the title font. - region.getPlot().getTitleObject().setFont(TITLE_FONT); - - // Set the axis tick-mark fonts. - region.getPlot().getXAxis().setFont(BASIC_FONT); - region.getPlot().getYAxis().setFont(BASIC_FONT); - region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT); - region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT); - } + // Define plot fonts. + public static final Font BASIC_FONT = new Font("Calibri", Font.PLAIN, 30); + public static final Font AXIS_FONT = new Font("Calibri", Font.BOLD, 35); + public static final Font TITLE_FONT = new Font("Calibri", Font.BOLD, 45); + + // Defines whether the histogram should be a line or bar histogram. + public enum DisplayStyle { BAR, LINE }; + + // Defines the color style options for plot data. + public static enum ColorStyle { + MS_BLUE(new Color( 79, 129, 189), new Color( 36, 64, 97)), MS_ORANGE(new Color(247, 150, 70), new Color(152, 72, 6)), + MS_RED(new Color(192, 80, 77), new Color( 99, 36, 35)), GREY(new Color(166, 166, 166), new Color( 89, 89, 89)), + MS_GREEN(new Color(155, 187, 89), new Color( 79, 98, 40)), CRIMSON(new Color(161, 0, 0), new Color(104, 0, 0)), + RUST(new Color(161, 80, 0), new Color(105, 80, 0)), YELLOW(new Color(161, 161, 0), new Color(122, 109, 8)), + FOREST(new Color( 65, 102, 0), new Color( 37, 79, 0)), GREEN(new Color( 7, 132, 70), new Color( 7, 82, 30)), + TEAL(new Color( 0, 130, 130), new Color( 0, 90, 100)), CERULEAN(new Color( 0, 86, 130), new Color( 0, 28, 83)), + BLUE(new Color( 0, 33, 203), new Color( 0, 0, 137)), INDIGO(new Color( 68, 10, 127), new Color( 0, 0, 61)), + PURPLE(new Color(106, 0, 106), new Color( 63, 0, 56)), FUSCHIA(new Color(119, 0, 60), new Color( 60, 0, 60)); + + private final Color fillColor; + private final Color lineColor; + + private ColorStyle(Color fillColor, Color lineColor) { + this.fillColor = fillColor; + this.lineColor = lineColor; + } + + public Color getFillColor() { return fillColor; } + + public Color getLineColor() { return lineColor; } + }; + + /** + * Sets the plot display formatting for 1D plots. + * @param region - The plotter region to format. + * @param color - The data color settings to use. + */ + public static final void setDefault1DStyle(PlotterRegion region, ColorStyle[] color, DisplayStyle style) { + // Get the names of each plot on in the region. + String[] dataNames = region.getAllDataNames(); + + // Check whether this is an overlay plot. Overlay plots contain + // more than one data name. + boolean overlay = (dataNames.length > 1 ? true : false); + System.out.println("Is overlay: " + overlay); + + // Iterate over each plot in the region. + for(int i = 0; i < dataNames.length; i++) { + System.out.println("Processing data name [" + i + "]: " + dataNames[i]); + + // Set the overlay style if needed. + if(overlay) { + // Get the fill style for the current data type. + JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle(); + + // Set the histogram style to display thick-lined bars + // with no fill. The color is set by the "color" argument. + fillStyle.setHistogramFill(false); + fillStyle.setHistogramBarLineWidth(3); + fillStyle.setShowErrorBars(false); + if(style == DisplayStyle.LINE) { + fillStyle.setLinesBetweenPointsWidth(3); + fillStyle.setShowHistogramBars(false); + fillStyle.setShowLinesBetweenPoints(true); + fillStyle.setLineColor(color[i].getFillColor()); + } else { + fillStyle.setShowHistogramBars(true); + fillStyle.setShowLinesBetweenPoints(false); + fillStyle.setHistogramBarLineColor(color[i].getFillColor()); + } + + // Set the legend text style. + region.getPlot().getLegend().setFont(new Font("Calibri", Font.PLAIN, 20)); + } + + // Otherwise, set the fill style for a single plot. + else { + // Get the fill style for the current data type. + JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle(); + + // Set the histogram style to display thick-lined bars + // with a fill color. The colors are defined by the + // "color" argument. + fillStyle.setHistogramBarLineWidth(3); + if(style == DisplayStyle.LINE) { + fillStyle.setHistogramFill(false); + fillStyle.setLinesBetweenPointsWidth(3); + fillStyle.setShowHistogramBars(false); + fillStyle.setShowLinesBetweenPoints(true); + fillStyle.setLineColor(color[i].getFillColor()); + } else { + fillStyle.setShowHistogramBars(true); + fillStyle.setShowLinesBetweenPoints(false); + fillStyle.setHistogramBarColor(color[i].getFillColor()); + fillStyle.setHistogramBarLineColor(color[i].getLineColor()); + } + } + + // Set the statistics box style. + region.getPlot().getStats().setVisible(true); + region.getPlot().getStats().setFont(BASIC_FONT); + + // Set the title font. + region.getPlot().getTitleObject().setFont(TITLE_FONT); + + // Set the axis tick-mark fonts. + region.getPlot().getXAxis().setFont(BASIC_FONT); + region.getPlot().getYAxis().setFont(BASIC_FONT); + region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT); + region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT); + } + } + + /** + * Sets the plot display formatting for 1D plots. + * @param region - The plotter region to format. + */ + public static final void setDefault2DStyle(PlotterRegion region, boolean logarithmic) { + // Get the fill style object. 2D plots should never be overlay + // plots, so there should only ever be one data name. + JASHist2DHistogramStyle fillStyle = (JASHist2DHistogramStyle) region.getDataForName(region.getAllDataNames()[0]).getStyle(); + + // Set the fill style for a two-dimensional plot. + if(logarithmic) { fillStyle.setLogZ(true); } + fillStyle.setHistStyle(JASHist2DHistogramStyle.STYLE_COLORMAP); + fillStyle.setColorMapScheme(JASHist2DHistogramStyle.COLORMAP_RAINBOW); + + // Make the statistics box invisible. + region.getPlot().getStats().setVisible(false); + + // Set the general plot font (which is also the z-axis font). + region.getPlot().setFont(BASIC_FONT); + + // Set the title font. + region.getPlot().getTitleObject().setFont(TITLE_FONT); + + // Set the axis tick-mark fonts. + region.getPlot().getXAxis().setFont(BASIC_FONT); + region.getPlot().getYAxis().setFont(BASIC_FONT); + region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT); + region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT); + } } Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/InvariantMassPlotsFormatter.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/InvariantMassPlotsFormatter.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/InvariantMassPlotsFormatter.java Tue Sep 27 08:50:14 2016 @@ -19,317 +19,317 @@ import hep.aida.ref.plotter.PlotterRegion; public class InvariantMassPlotsFormatter { - // Define plot fonts. - private static final Font BASIC_FONT = new Font("Calibri", Font.PLAIN, 20); - private static final Font AXIS_FONT = new Font("Calibri", Font.BOLD, 25); - private static final Font TITLE_FONT = new Font("Calibri", Font.BOLD, 35); - - // Defines the color style options for plot data. - private enum ColorStyle { - MS_BLUE(new Color( 79, 129, 189), new Color( 36, 64, 97)), MS_ORANGE(new Color(247, 150, 70), new Color(152, 72, 6)), - MS_RED(new Color(192, 80, 77), new Color( 99, 36, 35)), GREY(new Color(166, 166, 166), new Color( 89, 89, 89)), - MS_GREEN(new Color(155, 187, 89), new Color( 79, 98, 40)), CRIMSON(new Color(161, 0, 0), new Color(104, 0, 0)), - RUST(new Color(161, 80, 0), new Color(105, 80, 0)), YELLOW(new Color(161, 161, 0), new Color(122, 109, 8)), - FOREST(new Color( 65, 102, 0), new Color( 37, 79, 0)), GREEN(new Color( 7, 132, 70), new Color( 7, 82, 30)), - TEAL(new Color( 0, 130, 130), new Color( 0, 90, 100)), CERULEAN(new Color( 0, 86, 130), new Color( 0, 28, 83)), - BLUE(new Color( 0, 33, 203), new Color( 0, 0, 137)), INDIGO(new Color( 68, 10, 127), new Color( 0, 0, 61)), - PURPLE(new Color(106, 0, 106), new Color( 63, 0, 56)), FUSCHIA(new Color(119, 0, 60), new Color( 60, 0, 60)); - - private final Color fillColor; - private final Color lineColor; - - private ColorStyle(Color fillColor, Color lineColor) { - this.fillColor = fillColor; - this.lineColor = lineColor; - } - - public Color getFillColor() { return fillColor; } - - public Color getLineColor() { return lineColor; } - }; - - /** - * Loads all plots in a file and formats them according to the - * indicated style. - * @param args - Unused default executable parameter. - * @throws IOException Occurs if there is an issue opening the file. - */ - public static void main(String[] args) throws IOException { - // Define the root directory for the plots. - String rootDir = "D:\\cygwin64\\home\\Kyle\\"; - - // Define the new name of the file containing the trigger plots. - String[] plotFile = { - rootDir + "temp.aida" - }; - - // Define the run numbers for each file. - String[] runNumber = { "1 Hits", "2 Hits" }; - - // Define the scaling factors for each plot. - double scaleFactor = 13.254; - - // Get the plots file and open it. - IAnalysisFactory af = IAnalysisFactory.create(); - ITree[] tree = new ITree[plotFile.length]; - for(int i = 0; i < plotFile.length; i++) { - tree[i] = af.createTreeFactory().create(plotFile[i]); - if(tree[i] == null) { throw new IllegalArgumentException("Unable to load plot file."); } - } - - // Get the histograms. - IHistogram1D[] invariantMassPlots = new IHistogram1D[3]; - invariantMassPlots[0] = (IHistogram1D) tree[0].find("Trident Analysis/Particle Invariant Mass (1 Hit)"); - invariantMassPlots[1] = (IHistogram1D) tree[0].find("Trident Analysis/Particle Invariant Mass (2 Hit)"); - IHistogram1D electronEnergyPlot = (IHistogram1D) tree[0].find("Trident Analysis/Electron Energy"); - IHistogram1D positronEnergyPlot = (IHistogram1D) tree[0].find("Trident Analysis/Positron Energy"); - IHistogram1D energySumPlot = (IHistogram1D) tree[0].find("Trident Analysis/Energy Sum Distribution"); - IHistogram2D energySum2DPlot = (IHistogram2D) tree[0].find("Trident Analysis/2D Energy Distribution"); - IHistogram1D tridentElectronEnergyPlot = (IHistogram1D) tree[0].find("Trident Analysis/Trident Electron Energy"); - IHistogram1D tridentPositronEnergyPlot = (IHistogram1D) tree[0].find("Trident Analysis/Trident Positron Energy"); - - // Define the plot titles and arrays. - IHistogram[] plots = { electronEnergyPlot, positronEnergyPlot, energySumPlot, tridentElectronEnergyPlot, tridentPositronEnergyPlot }; - String[] titles = { "Electron Energy", "Positron Energy", "Energy Sum", "Trident Electron Energy", "Trident Positron Energy" }; - String[] xTitles = { "Energy (GeV)", "Energy (GeV)", "Energy Sum (GeV)", "Energy (GeV)", "Energy (GeV)" }; - - // Re-bin the histograms to have 5-times larger bins. First, - // get the bin count and upper and lower bounds of the plot. - int bins = invariantMassPlots[0].axis().bins(); - double low = invariantMassPlots[0].axis().binLowerEdge(0); - double high = invariantMassPlots[0].axis().binUpperEdge(invariantMassPlots[0].axis().bins() - 1); - - // Create new plots with the larger bin sizes. - AIDA aida = AIDA.defaultInstance(); - IHistogram1D[] newPlot = new IHistogram1D[2]; - newPlot[0] = aida.histogram1D("Particle Invariant Mass (1 Hit)", bins / 5, low, high); - newPlot[1] = aida.histogram1D("Particle Invariant Mass (2 Hit)", bins / 5, low, high); - - // Populate the new plots with the data from the old ones. - for(int j = 0; j < 2; j++) { - for(int i = 0; i < bins; i++) { - int entries = invariantMassPlots[j].binEntries(i); - double center = invariantMassPlots[j].axis().binCenter(i); - for(int k = 0; k < entries; k++) { - newPlot[j].fill(center); - } - } - } - - // Replace the old plots. - invariantMassPlots = newPlot; - - // Create a plotter factory. - IPlotterFactory plotterFactory = af.createPlotterFactory(); - - // Format and display the basic histograms. - for(int i = 0; i < plots.length; i++) { - // Scale the histogram by the appropriate scaling factor. - plots[i].scale(1.0 / scaleFactor); - - // Create a plotter and plotting region for the plot. - IPlotter plotter = plotterFactory.create(titles[i]); - plotter.createRegions(1); - plotter.region(0).plot(plots[i]); - - // Format the axis labels. - PlotterRegion region = (PlotterRegion) plotter.region(0); - region.getPlot().setTitle(titles[i]); - region.getPlot().getXAxis().setLabel(xTitles[i]); - region.getPlot().getYAxis().setLabel("Rate (Hz)"); - - // Format the fonts and general plot presentation. - setDefault1DStyle(region, new ColorStyle[] { ColorStyle.GREY }); - - // Show the plot. - plotter.setParameter("plotterWidth", "2000"); - plotter.setParameter("plotterHeight", "1200"); - plotter.show(); - } - - // Format and display the 2D histogram. - energySum2DPlot.scale(1.0 / scaleFactor); - IPlotter plotter2D = plotterFactory.create("2D Energy Sum"); - plotter2D.createRegions(1); - plotter2D.region(0).plot(energySum2DPlot); - - // Format the axis labels. - PlotterRegion region2D = (PlotterRegion) plotter2D.region(0); - region2D.getPlot().setTitle("2D Energy Sum"); - region2D.getPlot().getXAxis().setLabel("Electron Energy (GeV)"); - region2D.getPlot().getYAxis().setLabel("Positron Energy (GeV)"); - - // Format the fonts and general plot presentation. - setDefault2DStyle(region2D, false); - - // Show the plot. - plotter2D.setParameter("plotterWidth", "2000"); - plotter2D.setParameter("plotterHeight", "1200"); - plotter2D.show(); - - // Format and display the histograms. - for(int i = 0; i < 2; i++) { - // Scale the histogram by the appropriate scaling factor. - invariantMassPlots[i].scale(1.0 / scaleFactor); - - // Create a plotter and plotting region for the plot. - IPlotter plotter = plotterFactory.create("Particle Invariant Mass (" + runNumber[i] + ")"); - plotter.createRegions(1); - plotter.region(0).plot(invariantMassPlots[i]); - - // Format the axis labels. - PlotterRegion region = (PlotterRegion) plotter.region(0); - region.getPlot().setTitle("Particle Invariant Mass (" + runNumber[i] + ")"); - region.getPlot().getXAxis().setLabel("Invariant Mass (GeV)"); - region.getPlot().getYAxis().setLabel("Rate (Hz)"); - - // Format the fonts and general plot presentation. - setDefault1DStyle(region, new ColorStyle[] { ColorStyle.GREY }); - - // Show the plot. - plotter.setParameter("plotterWidth", "2000"); - plotter.setParameter("plotterHeight", "1200"); - plotter.show(); - } - - // Note which plot is the numerator and which is the denominator. - int numerator = 0; - int denominator = 1; - - // Create a new histogram to display the ratios of the rates. - IHistogram1D ratioPlot = AIDA.defaultInstance().histogram1D("Invariant Mass Ratio (" + runNumber[numerator] + " / " - + runNumber[denominator] + ")", invariantMassPlots[0].axis().bins(), - invariantMassPlots[0].axis().lowerEdge(), invariantMassPlots[0].axis().upperEdge()); - - // Iterate over each bin. - for(int bin = 0; bin < invariantMassPlots[0].axis().bins(); bin++) { - // Calculate the ratio. - double ratio = invariantMassPlots[numerator].binHeight(bin) / invariantMassPlots[denominator].binHeight(bin); - - // If the ratio is either not a number of infinite, skip - // this bin. - if(Double.isNaN(ratio) || Double.isInfinite(ratio)) { continue; } - - // Populate the ratio plot bin. - ratioPlot.fill(invariantMassPlots[0].axis().binCenter(bin), ratio); - } - - // Create a plotter and plotting region for the plot. - IPlotter plotter = plotterFactory.create("Invariant Mass Ratio (5411 / 5554)"); - plotter.createRegions(1); - plotter.region(0).plot(ratioPlot); - - // Format the axis labels. - PlotterRegion region = (PlotterRegion) plotter.region(0); - region.getPlot().setTitle("Invariant Mass Ratio (" + runNumber[numerator] + " / " + runNumber[denominator] + ")"); - region.getPlot().getXAxis().setLabel("Invariant Mass (GeV)"); - region.getPlot().getXAxis().setMin(0.010); - region.getPlot().getXAxis().setMax(0.060); - region.getPlot().getYAxis().setLabel("Ratio"); - - // Format the fonts and general plot presentation. - setDefault1DStyle(region, new ColorStyle[] { ColorStyle.GREY }); - - // Disable the error bars. - JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(region.getAllDataNames()[0]).getStyle(); - fillStyle.setShowErrorBars(false); - - // Show the plot. - plotter.setParameter("plotterWidth", "2000"); - plotter.setParameter("plotterHeight", "1200"); - plotter.show(); - - // Close the trees. - for(int i = 0; i < plotFile.length; i++) { - tree[i].close(); - } - } - - /** - * Sets the plot display formatting for 1D plots. - * @param region - The plotter region to format. - * @param color - The data color settings to use. - */ - private static final void setDefault1DStyle(PlotterRegion region, ColorStyle[] color) { - // Get the names of each plot on in the region. - String[] dataNames = region.getAllDataNames(); - - // Check whether this is an overlay plot. Overlay plots contain - // more than one data name. - boolean overlay = (dataNames.length > 1 ? true : false); - - // Iterate over each plot in the region. - for(int i = 0; i < dataNames.length; i++) { - // Set the overlay style if needed. - if(overlay) { - // Get the fill style for the current data type. - JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle(); - - // Set the histogram style to display thick-lined bars - // with no fill. The color is set by the "color" argument. - fillStyle.setHistogramFill(false); - fillStyle.setHistogramBarLineWidth(3); - fillStyle.setHistogramBarLineColor(color[i].getFillColor()); - - // Set the legend text style. - region.getPlot().getLegend().setFont(new Font("Calibri", Font.PLAIN, 20)); - } - - // Otherwise, set the fill style for a single plot. - else { - // Get the fill style for the current data type. - JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle(); - - // Set the histogram style to display thick-lined bars - // with a fill color. The colors are defined by the - // "color" argument. - fillStyle.setHistogramBarLineWidth(3); - fillStyle.setHistogramBarColor(color[i].getFillColor()); - fillStyle.setHistogramBarLineColor(color[i].getLineColor()); - } - - // Set the statistics box style. - region.getPlot().getStats().setVisible(true); - region.getPlot().getStats().setFont(BASIC_FONT); - - // Set the title font. - region.getPlot().getTitleObject().setFont(TITLE_FONT); - - // Set the axis tick-mark fonts. - region.getPlot().getXAxis().setFont(BASIC_FONT); - region.getPlot().getYAxis().setFont(BASIC_FONT); - region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT); - region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT); - } - } - - /** - * Sets the plot display formatting for 1D plots. - * @param region - The plotter region to format. - */ - private static final void setDefault2DStyle(PlotterRegion region, boolean logarithmic) { - // Get the fill style object. 2D plots should never be overlay - // plots, so there should only ever be one data name. - JASHist2DHistogramStyle fillStyle = (JASHist2DHistogramStyle) region.getDataForName(region.getAllDataNames()[0]).getStyle(); - - // Set the fill style for a two-dimensional plot. - if(logarithmic) { fillStyle.setLogZ(true); } - fillStyle.setHistStyle(JASHist2DHistogramStyle.STYLE_COLORMAP); - fillStyle.setColorMapScheme(JASHist2DHistogramStyle.COLORMAP_RAINBOW); - - // Make the statistics box invisible. - region.getPlot().getStats().setVisible(false); - - // Set the general plot font (which is also the z-axis font). - region.getPlot().setFont(BASIC_FONT); - - // Set the title font. - region.getPlot().getTitleObject().setFont(TITLE_FONT); - - // Set the axis tick-mark fonts. - region.getPlot().getXAxis().setFont(BASIC_FONT); - region.getPlot().getYAxis().setFont(BASIC_FONT); - region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT); - region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT); - } + // Define plot fonts. + private static final Font BASIC_FONT = new Font("Calibri", Font.PLAIN, 20); + private static final Font AXIS_FONT = new Font("Calibri", Font.BOLD, 25); + private static final Font TITLE_FONT = new Font("Calibri", Font.BOLD, 35); + + // Defines the color style options for plot data. + private enum ColorStyle { + MS_BLUE(new Color( 79, 129, 189), new Color( 36, 64, 97)), MS_ORANGE(new Color(247, 150, 70), new Color(152, 72, 6)), + MS_RED(new Color(192, 80, 77), new Color( 99, 36, 35)), GREY(new Color(166, 166, 166), new Color( 89, 89, 89)), + MS_GREEN(new Color(155, 187, 89), new Color( 79, 98, 40)), CRIMSON(new Color(161, 0, 0), new Color(104, 0, 0)), + RUST(new Color(161, 80, 0), new Color(105, 80, 0)), YELLOW(new Color(161, 161, 0), new Color(122, 109, 8)), + FOREST(new Color( 65, 102, 0), new Color( 37, 79, 0)), GREEN(new Color( 7, 132, 70), new Color( 7, 82, 30)), + TEAL(new Color( 0, 130, 130), new Color( 0, 90, 100)), CERULEAN(new Color( 0, 86, 130), new Color( 0, 28, 83)), + BLUE(new Color( 0, 33, 203), new Color( 0, 0, 137)), INDIGO(new Color( 68, 10, 127), new Color( 0, 0, 61)), + PURPLE(new Color(106, 0, 106), new Color( 63, 0, 56)), FUSCHIA(new Color(119, 0, 60), new Color( 60, 0, 60)); + + private final Color fillColor; + private final Color lineColor; + + private ColorStyle(Color fillColor, Color lineColor) { + this.fillColor = fillColor; + this.lineColor = lineColor; + } + + public Color getFillColor() { return fillColor; } + + public Color getLineColor() { return lineColor; } + }; + + /** + * Loads all plots in a file and formats them according to the + * indicated style. + * @param args - Unused default executable parameter. + * @throws IOException Occurs if there is an issue opening the file. + */ + public static void main(String[] args) throws IOException { + // Define the root directory for the plots. + String rootDir = "D:\\cygwin64\\home\\Kyle\\"; + + // Define the new name of the file containing the trigger plots. + String[] plotFile = { + rootDir + "temp.aida" + }; + + // Define the run numbers for each file. + String[] runNumber = { "1 Hits", "2 Hits" }; + + // Define the scaling factors for each plot. + double scaleFactor = 13.254; + + // Get the plots file and open it. + IAnalysisFactory af = IAnalysisFactory.create(); + ITree[] tree = new ITree[plotFile.length]; + for(int i = 0; i < plotFile.length; i++) { + tree[i] = af.createTreeFactory().create(plotFile[i]); + if(tree[i] == null) { throw new IllegalArgumentException("Unable to load plot file."); } + } + + // Get the histograms. + IHistogram1D[] invariantMassPlots = new IHistogram1D[3]; + invariantMassPlots[0] = (IHistogram1D) tree[0].find("Trident Analysis/Particle Invariant Mass (1 Hit)"); + invariantMassPlots[1] = (IHistogram1D) tree[0].find("Trident Analysis/Particle Invariant Mass (2 Hit)"); + IHistogram1D electronEnergyPlot = (IHistogram1D) tree[0].find("Trident Analysis/Electron Energy"); + IHistogram1D positronEnergyPlot = (IHistogram1D) tree[0].find("Trident Analysis/Positron Energy"); + IHistogram1D energySumPlot = (IHistogram1D) tree[0].find("Trident Analysis/Energy Sum Distribution"); + IHistogram2D energySum2DPlot = (IHistogram2D) tree[0].find("Trident Analysis/2D Energy Distribution"); + IHistogram1D tridentElectronEnergyPlot = (IHistogram1D) tree[0].find("Trident Analysis/Trident Electron Energy"); + IHistogram1D tridentPositronEnergyPlot = (IHistogram1D) tree[0].find("Trident Analysis/Trident Positron Energy"); + + // Define the plot titles and arrays. + IHistogram[] plots = { electronEnergyPlot, positronEnergyPlot, energySumPlot, tridentElectronEnergyPlot, tridentPositronEnergyPlot }; + String[] titles = { "Electron Energy", "Positron Energy", "Energy Sum", "Trident Electron Energy", "Trident Positron Energy" }; + String[] xTitles = { "Energy (GeV)", "Energy (GeV)", "Energy Sum (GeV)", "Energy (GeV)", "Energy (GeV)" }; + + // Re-bin the histograms to have 5-times larger bins. First, + // get the bin count and upper and lower bounds of the plot. + int bins = invariantMassPlots[0].axis().bins(); + double low = invariantMassPlots[0].axis().binLowerEdge(0); + double high = invariantMassPlots[0].axis().binUpperEdge(invariantMassPlots[0].axis().bins() - 1); + + // Create new plots with the larger bin sizes. + AIDA aida = AIDA.defaultInstance(); + IHistogram1D[] newPlot = new IHistogram1D[2]; + newPlot[0] = aida.histogram1D("Particle Invariant Mass (1 Hit)", bins / 5, low, high); + newPlot[1] = aida.histogram1D("Particle Invariant Mass (2 Hit)", bins / 5, low, high); + + // Populate the new plots with the data from the old ones. + for(int j = 0; j < 2; j++) { + for(int i = 0; i < bins; i++) { + int entries = invariantMassPlots[j].binEntries(i); + double center = invariantMassPlots[j].axis().binCenter(i); + for(int k = 0; k < entries; k++) { + newPlot[j].fill(center); + } + } + } + + // Replace the old plots. + invariantMassPlots = newPlot; + + // Create a plotter factory. + IPlotterFactory plotterFactory = af.createPlotterFactory(); + + // Format and display the basic histograms. + for(int i = 0; i < plots.length; i++) { + // Scale the histogram by the appropriate scaling factor. + plots[i].scale(1.0 / scaleFactor); + + // Create a plotter and plotting region for the plot. + IPlotter plotter = plotterFactory.create(titles[i]); + plotter.createRegions(1); + plotter.region(0).plot(plots[i]); + + // Format the axis labels. + PlotterRegion region = (PlotterRegion) plotter.region(0); + region.getPlot().setTitle(titles[i]); + region.getPlot().getXAxis().setLabel(xTitles[i]); + region.getPlot().getYAxis().setLabel("Rate (Hz)"); + + // Format the fonts and general plot presentation. + setDefault1DStyle(region, new ColorStyle[] { ColorStyle.GREY }); + + // Show the plot. + plotter.setParameter("plotterWidth", "2000"); + plotter.setParameter("plotterHeight", "1200"); + plotter.show(); + } + + // Format and display the 2D histogram. + energySum2DPlot.scale(1.0 / scaleFactor); + IPlotter plotter2D = plotterFactory.create("2D Energy Sum"); + plotter2D.createRegions(1); + plotter2D.region(0).plot(energySum2DPlot); + + // Format the axis labels. + PlotterRegion region2D = (PlotterRegion) plotter2D.region(0); + region2D.getPlot().setTitle("2D Energy Sum"); + region2D.getPlot().getXAxis().setLabel("Electron Energy (GeV)"); + region2D.getPlot().getYAxis().setLabel("Positron Energy (GeV)"); + + // Format the fonts and general plot presentation. + setDefault2DStyle(region2D, false); + + // Show the plot. + plotter2D.setParameter("plotterWidth", "2000"); + plotter2D.setParameter("plotterHeight", "1200"); + plotter2D.show(); + + // Format and display the histograms. + for(int i = 0; i < 2; i++) { + // Scale the histogram by the appropriate scaling factor. + invariantMassPlots[i].scale(1.0 / scaleFactor); + + // Create a plotter and plotting region for the plot. + IPlotter plotter = plotterFactory.create("Particle Invariant Mass (" + runNumber[i] + ")"); + plotter.createRegions(1); + plotter.region(0).plot(invariantMassPlots[i]); + + // Format the axis labels. + PlotterRegion region = (PlotterRegion) plotter.region(0); + region.getPlot().setTitle("Particle Invariant Mass (" + runNumber[i] + ")"); + region.getPlot().getXAxis().setLabel("Invariant Mass (GeV)"); + region.getPlot().getYAxis().setLabel("Rate (Hz)"); + + // Format the fonts and general plot presentation. + setDefault1DStyle(region, new ColorStyle[] { ColorStyle.GREY }); + + // Show the plot. + plotter.setParameter("plotterWidth", "2000"); + plotter.setParameter("plotterHeight", "1200"); + plotter.show(); + } + + // Note which plot is the numerator and which is the denominator. + int numerator = 0; + int denominator = 1; + + // Create a new histogram to display the ratios of the rates. + IHistogram1D ratioPlot = AIDA.defaultInstance().histogram1D("Invariant Mass Ratio (" + runNumber[numerator] + " / " + + runNumber[denominator] + ")", invariantMassPlots[0].axis().bins(), + invariantMassPlots[0].axis().lowerEdge(), invariantMassPlots[0].axis().upperEdge()); + + // Iterate over each bin. + for(int bin = 0; bin < invariantMassPlots[0].axis().bins(); bin++) { + // Calculate the ratio. + double ratio = invariantMassPlots[numerator].binHeight(bin) / invariantMassPlots[denominator].binHeight(bin); + + // If the ratio is either not a number of infinite, skip + // this bin. + if(Double.isNaN(ratio) || Double.isInfinite(ratio)) { continue; } + + // Populate the ratio plot bin. + ratioPlot.fill(invariantMassPlots[0].axis().binCenter(bin), ratio); + } + + // Create a plotter and plotting region for the plot. + IPlotter plotter = plotterFactory.create("Invariant Mass Ratio (5411 / 5554)"); + plotter.createRegions(1); + plotter.region(0).plot(ratioPlot); + + // Format the axis labels. + PlotterRegion region = (PlotterRegion) plotter.region(0); + region.getPlot().setTitle("Invariant Mass Ratio (" + runNumber[numerator] + " / " + runNumber[denominator] + ")"); + region.getPlot().getXAxis().setLabel("Invariant Mass (GeV)"); + region.getPlot().getXAxis().setMin(0.010); + region.getPlot().getXAxis().setMax(0.060); + region.getPlot().getYAxis().setLabel("Ratio"); + + // Format the fonts and general plot presentation. + setDefault1DStyle(region, new ColorStyle[] { ColorStyle.GREY }); + + // Disable the error bars. + JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(region.getAllDataNames()[0]).getStyle(); + fillStyle.setShowErrorBars(false); + + // Show the plot. + plotter.setParameter("plotterWidth", "2000"); + plotter.setParameter("plotterHeight", "1200"); + plotter.show(); + + // Close the trees. + for(int i = 0; i < plotFile.length; i++) { + tree[i].close(); + } + } + + /** + * Sets the plot display formatting for 1D plots. + * @param region - The plotter region to format. + * @param color - The data color settings to use. + */ + private static final void setDefault1DStyle(PlotterRegion region, ColorStyle[] color) { + // Get the names of each plot on in the region. + String[] dataNames = region.getAllDataNames(); + + // Check whether this is an overlay plot. Overlay plots contain + // more than one data name. + boolean overlay = (dataNames.length > 1 ? true : false); + + // Iterate over each plot in the region. + for(int i = 0; i < dataNames.length; i++) { + // Set the overlay style if needed. + if(overlay) { + // Get the fill style for the current data type. + JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle(); + + // Set the histogram style to display thick-lined bars + // with no fill. The color is set by the "color" argument. + fillStyle.setHistogramFill(false); + fillStyle.setHistogramBarLineWidth(3); + fillStyle.setHistogramBarLineColor(color[i].getFillColor()); + + // Set the legend text style. + region.getPlot().getLegend().setFont(new Font("Calibri", Font.PLAIN, 20)); + } + + // Otherwise, set the fill style for a single plot. + else { + // Get the fill style for the current data type. + JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle(); + + // Set the histogram style to display thick-lined bars + // with a fill color. The colors are defined by the + // "color" argument. + fillStyle.setHistogramBarLineWidth(3); + fillStyle.setHistogramBarColor(color[i].getFillColor()); + fillStyle.setHistogramBarLineColor(color[i].getLineColor()); + } + + // Set the statistics box style. + region.getPlot().getStats().setVisible(true); + region.getPlot().getStats().setFont(BASIC_FONT); + + // Set the title font. + region.getPlot().getTitleObject().setFont(TITLE_FONT); + + // Set the axis tick-mark fonts. + region.getPlot().getXAxis().setFont(BASIC_FONT); + region.getPlot().getYAxis().setFont(BASIC_FONT); + region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT); + region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT); + } + } + + /** + * Sets the plot display formatting for 1D plots. + * @param region - The plotter region to format. + */ + private static final void setDefault2DStyle(PlotterRegion region, boolean logarithmic) { + // Get the fill style object. 2D plots should never be overlay + // plots, so there should only ever be one data name. + JASHist2DHistogramStyle fillStyle = (JASHist2DHistogramStyle) region.getDataForName(region.getAllDataNames()[0]).getStyle(); + + // Set the fill style for a two-dimensional plot. + if(logarithmic) { fillStyle.setLogZ(true); } + fillStyle.setHistStyle(JASHist2DHistogramStyle.STYLE_COLORMAP); + fillStyle.setColorMapScheme(JASHist2DHistogramStyle.COLORMAP_RAINBOW); + + // Make the statistics box invisible. + region.getPlot().getStats().setVisible(false); + + // Set the general plot font (which is also the z-axis font). + region.getPlot().setFont(BASIC_FONT); + + // Set the title font. + region.getPlot().getTitleObject().setFont(TITLE_FONT); + + // Set the axis tick-mark fonts. + region.getPlot().getXAxis().setFont(BASIC_FONT); + region.getPlot().getYAxis().setFont(BASIC_FONT); + region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT); + region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT); + } } Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/MTEPlotFormatter.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/MTEPlotFormatter.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/MTEPlotFormatter.java Tue Sep 27 08:50:14 2016 @@ -19,308 +19,308 @@ import hep.aida.ref.plotter.PlotterRegion; public class MTEPlotFormatter { - // Define plot fonts. - private static final Font BASIC_FONT = new Font("Calibri", Font.PLAIN, 20); - private static final Font AXIS_FONT = new Font("Calibri", Font.BOLD, 25); - private static final Font TITLE_FONT = new Font("Calibri", Font.BOLD, 35); - - // Defines the color style options for plot data. - private enum ColorStyle { - MS_BLUE(new Color( 79, 129, 189), new Color( 36, 64, 97)), MS_ORANGE(new Color(247, 150, 70), new Color(152, 72, 6)), - MS_RED(new Color(192, 80, 77), new Color( 99, 36, 35)), GREY(new Color(166, 166, 166), new Color( 89, 89, 89)), - MS_GREEN(new Color(155, 187, 89), new Color( 79, 98, 40)), CRIMSON(new Color(161, 0, 0), new Color(104, 0, 0)), - RUST(new Color(161, 80, 0), new Color(105, 80, 0)), YELLOW(new Color(161, 161, 0), new Color(122, 109, 8)), - FOREST(new Color( 65, 102, 0), new Color( 37, 79, 0)), GREEN(new Color( 7, 132, 70), new Color( 7, 82, 30)), - TEAL(new Color( 0, 130, 130), new Color( 0, 90, 100)), CERULEAN(new Color( 0, 86, 130), new Color( 0, 28, 83)), - BLUE(new Color( 0, 33, 203), new Color( 0, 0, 137)), INDIGO(new Color( 68, 10, 127), new Color( 0, 0, 61)), - PURPLE(new Color(106, 0, 106), new Color( 63, 0, 56)), FUSCHIA(new Color(119, 0, 60), new Color( 60, 0, 60)); - - private final Color fillColor; - private final Color lineColor; - - private ColorStyle(Color fillColor, Color lineColor) { - this.fillColor = fillColor; - this.lineColor = lineColor; - } - - public Color getFillColor() { return fillColor; } - - public Color getLineColor() { return lineColor; } - }; - - /** - * Loads all plots in a file and formats them according to the - * indicated style. - * @param args - Unused default executable parameter. - * @throws IOException Occurs if there is an issue opening the file. - */ - public static void main(String[] args) throws IOException { - // Define the root directory for the plots. - String rootDir = "D:\\cygwin64\\home\\Kyle\\"; - - // Define the new name of the file containing the trigger plots. - String plotFile = rootDir + "temp.aida"; - - // Define the scaling factors for each plot. - double scaleFactor = 1; - - // Get the plots file and open it. - IAnalysisFactory af = IAnalysisFactory.create(); - ITree tree = af.createTreeFactory().create(plotFile); - if(tree == null) { throw new IllegalArgumentException("Unable to load plot file."); } - - // Define index references for each event type. - int MOLLER = 0; - int TRIDENT = 1; - int ELASTIC = 2; - - // Get the histograms. - IHistogram1D[] trackCountPlots = new IHistogram1D[3]; - trackCountPlots[MOLLER] = (IHistogram1D) tree.find("MTE Analysis/Møller Event Tracks"); - trackCountPlots[TRIDENT] = (IHistogram1D) tree.find("MTE Analysis/Trident Event Tracks"); - trackCountPlots[ELASTIC] = (IHistogram1D) tree.find("MTE Analysis/Elastic Event Tracks"); - - IHistogram1D[] energyPlots = new IHistogram1D[3]; - energyPlots[MOLLER] = (IHistogram1D) tree.find("MTE Analysis/Møller Electron Energy Distribution"); - energyPlots[TRIDENT] = (IHistogram1D) tree.find("MTE Analysis/Trident Electron Energy Distribution"); - energyPlots[ELASTIC] = (IHistogram1D) tree.find("MTE Analysis/Elastic Energy Distribution"); - - IHistogram1D[] energySumPlots = new IHistogram1D[2]; - energySumPlots[MOLLER] = (IHistogram1D) tree.find("MTE Analysis/Møller Energy Sum Distribution"); - energySumPlots[TRIDENT] = (IHistogram1D) tree.find("MTE Analysis/Trident Energy Sum Distribution"); - - IHistogram2D[] energy2DPlots = new IHistogram2D[2]; - energy2DPlots[MOLLER] = (IHistogram2D) tree.find("MTE Analysis/Møller 2D Energy Distribution"); - energy2DPlots[TRIDENT] = (IHistogram2D) tree.find("MTE Analysis/Trident 2D Energy Distribution"); - - // Create a plotter factory. - IPlotterFactory plotterFactory = af.createPlotterFactory(); - - // Format the track count plots. - for(IHistogram1D trackCountPlot : trackCountPlots) { - // Create a plotter and plotting region for the plot. - IPlotter plotter = plotterFactory.create(trackCountPlot.title()); - plotter.createRegions(1); - plotter.region(0).plot(trackCountPlot); - - // Format the axis labels. - PlotterRegion region = (PlotterRegion) plotter.region(0); - region.getPlot().setTitle(trackCountPlot.title()); - region.getPlot().getXAxis().setLabel("Number of Tracks"); - region.getPlot().getYAxis().setLabel("Count"); - - // Format the fonts and general plot presentation. - setDefault1DStyle(region, new ColorStyle[] { ColorStyle.GREY }); - - // Show the plot. - plotter.setParameter("plotterWidth", "2000"); - plotter.setParameter("plotterHeight", "1200"); - plotter.show(); - } - - // Format the electron energy plots. - for(IHistogram1D energyPlot : energyPlots) { - // Create a plotter and plotting region for the plot. - IPlotter plotter = plotterFactory.create(energyPlot.title()); - plotter.createRegions(1); - plotter.region(0).plot(energyPlot); - - // Format the axis labels. - PlotterRegion region = (PlotterRegion) plotter.region(0); - region.getPlot().setTitle(energyPlot.title()); - region.getPlot().getXAxis().setLabel("Track Energy (GeV)"); - region.getPlot().getYAxis().setLabel("Count"); - - // Format the fonts and general plot presentation. - setDefault1DStyle(region, new ColorStyle[] { ColorStyle.GREY }); - - // Show the plot. - plotter.setParameter("plotterWidth", "2000"); - plotter.setParameter("plotterHeight", "1200"); - plotter.show(); - } - - // Format the energy sum plots. - for(IHistogram1D energySumPlot : energySumPlots) { - // Create a plotter and plotting region for the plot. - IPlotter plotter = plotterFactory.create(energySumPlot.title()); - plotter.createRegions(1); - plotter.region(0).plot(energySumPlot); - - // Format the axis labels. - PlotterRegion region = (PlotterRegion) plotter.region(0); - region.getPlot().setTitle(energySumPlot.title()); - region.getPlot().getXAxis().setLabel("Track Energy (GeV)"); - region.getPlot().getYAxis().setLabel("Count"); - - // Format the fonts and general plot presentation. - setDefault1DStyle(region, new ColorStyle[] { ColorStyle.GREY }); - - // Show the plot. - plotter.setParameter("plotterWidth", "2000"); - plotter.setParameter("plotterHeight", "1200"); - plotter.show(); - } - - // Format the 2D energy sum plots. - for(IHistogram2D energy2DPlot : energy2DPlots) { - // Create a plotter and plotting region for the plot. - IPlotter plotter = plotterFactory.create(energy2DPlot.title()); - plotter.createRegions(1); - plotter.region(0).plot(energy2DPlot); - - // Format the axis labels. - PlotterRegion region = (PlotterRegion) plotter.region(0); - region.getPlot().setTitle(energy2DPlot.title()); - region.getPlot().getXAxis().setLabel("First Track Energy (GeV)"); - region.getPlot().getYAxis().setLabel("Second Track Energy (GeV)"); - - - // Format the fonts and general plot presentation. - setDefault2DStyle(region, false); - - // Show the plot. - plotter.setParameter("plotterWidth", "2000"); - plotter.setParameter("plotterHeight", "1200"); - plotter.show(); - } - - // Disable the error bars. - //JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(region.getAllDataNames()[0]).getStyle(); - //fillStyle.setShowErrorBars(false); - - // Close the tree. - tree.close(); - } - - /** - * Sets the plot display formatting for 1D plots. - * @param region - The plotter region to format. - * @param color - The data color settings to use. - */ - private static final void setDefault1DStyle(PlotterRegion region, ColorStyle[] color) { - // Get the names of each plot on in the region. - String[] dataNames = region.getAllDataNames(); - - // Check whether this is an overlay plot. Overlay plots contain - // more than one data name. - boolean overlay = (dataNames.length > 1 ? true : false); - - // Iterate over each plot in the region. - for(int i = 0; i < dataNames.length; i++) { - // Set the overlay style if needed. - if(overlay) { - // Get the fill style for the current data type. - JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle(); - - // Set the histogram style to display thick-lined bars - // with no fill. The color is set by the "color" argument. - fillStyle.setHistogramFill(false); - fillStyle.setHistogramBarLineWidth(3); - fillStyle.setHistogramBarLineColor(color[i].getFillColor()); - - // Set the legend text style. - region.getPlot().getLegend().setFont(new Font("Calibri", Font.PLAIN, 20)); - } - - // Otherwise, set the fill style for a single plot. - else { - // Get the fill style for the current data type. - JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle(); - - // Set the histogram style to display thick-lined bars - // with a fill color. The colors are defined by the - // "color" argument. - fillStyle.setHistogramBarLineWidth(3); - fillStyle.setHistogramBarColor(color[i].getFillColor()); - fillStyle.setHistogramBarLineColor(color[i].getLineColor()); - } - - // Set the statistics box style. - region.getPlot().getStats().setVisible(true); - region.getPlot().getStats().setFont(BASIC_FONT); - - // Set the title font. - region.getPlot().getTitleObject().setFont(TITLE_FONT); - - // Set the axis tick-mark fonts. - region.getPlot().getXAxis().setFont(BASIC_FONT); - region.getPlot().getYAxis().setFont(BASIC_FONT); - region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT); - region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT); - } - } - - /** - * Sets the plot display formatting for 1D plots. - * @param region - The plotter region to format. - */ - private static final void setDefault2DStyle(PlotterRegion region, boolean logarithmic) { - // Get the fill style object. 2D plots should never be overlay - // plots, so there should only ever be one data name. - JASHist2DHistogramStyle fillStyle = (JASHist2DHistogramStyle) region.getDataForName(region.getAllDataNames()[0]).getStyle(); - - // Set the fill style for a two-dimensional plot. - if(logarithmic) { fillStyle.setLogZ(true); } - fillStyle.setHistStyle(JASHist2DHistogramStyle.STYLE_COLORMAP); - fillStyle.setColorMapScheme(JASHist2DHistogramStyle.COLORMAP_RAINBOW); - - // Make the statistics box invisible. - region.getPlot().getStats().setVisible(false); - - // Set the general plot font (which is also the z-axis font). - region.getPlot().setFont(BASIC_FONT); - - // Set the title font. - region.getPlot().getTitleObject().setFont(TITLE_FONT); - - // Set the axis tick-mark fonts. - region.getPlot().getXAxis().setFont(BASIC_FONT); - region.getPlot().getYAxis().setFont(BASIC_FONT); - region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT); - region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT); - } - - /** - * Recursive method that gets all object names from a tree that - * are not directories. Method should not be called directly, but - * rather called only through the <code>getHistograms(ITree)</code> - * method. - * @param tree - The tree from which to obtain the object names. - * @param directory - The directory in which to search for objects. - * @param list - The list in which to place the objects. - * @return Returns the <code>List</code> collection that was given - * as an argument. - */ - private static final List<String> getHistograms(ITree tree, String directory, List<String> list) { - // Get the list of objects in the directory. - String[] treeObjects = tree.listObjectNames(directory); - - // Print the objects. - for(String objectName : treeObjects) { - // Check if the object is a directory. - boolean isDirectory = isDirectory(objectName); - - // If the object is a directory, get the histograms from it. - if(isDirectory) { - getHistograms(tree, objectName, list); - } - - // If the object is a plot, add it to the list. - else { list.add(objectName); } - } - - // Return the list. - return list; - } - - /** - * Checks whether a tree object is a directory. - * @param object - The object to check. - * @return Returns <code>true</code> if the object is a directory - * and <code>false</code> otherwise. - */ - private static final boolean isDirectory(String object) { - return (object.toCharArray()[object.length() - 1] == '/'); - } + // Define plot fonts. + private static final Font BASIC_FONT = new Font("Calibri", Font.PLAIN, 20); + private static final Font AXIS_FONT = new Font("Calibri", Font.BOLD, 25); + private static final Font TITLE_FONT = new Font("Calibri", Font.BOLD, 35); + + // Defines the color style options for plot data. + private enum ColorStyle { + MS_BLUE(new Color( 79, 129, 189), new Color( 36, 64, 97)), MS_ORANGE(new Color(247, 150, 70), new Color(152, 72, 6)), + MS_RED(new Color(192, 80, 77), new Color( 99, 36, 35)), GREY(new Color(166, 166, 166), new Color( 89, 89, 89)), + MS_GREEN(new Color(155, 187, 89), new Color( 79, 98, 40)), CRIMSON(new Color(161, 0, 0), new Color(104, 0, 0)), + RUST(new Color(161, 80, 0), new Color(105, 80, 0)), YELLOW(new Color(161, 161, 0), new Color(122, 109, 8)), + FOREST(new Color( 65, 102, 0), new Color( 37, 79, 0)), GREEN(new Color( 7, 132, 70), new Color( 7, 82, 30)), + TEAL(new Color( 0, 130, 130), new Color( 0, 90, 100)), CERULEAN(new Color( 0, 86, 130), new Color( 0, 28, 83)), + BLUE(new Color( 0, 33, 203), new Color( 0, 0, 137)), INDIGO(new Color( 68, 10, 127), new Color( 0, 0, 61)), + PURPLE(new Color(106, 0, 106), new Color( 63, 0, 56)), FUSCHIA(new Color(119, 0, 60), new Color( 60, 0, 60)); + + private final Color fillColor; + private final Color lineColor; + + private ColorStyle(Color fillColor, Color lineColor) { + this.fillColor = fillColor; + this.lineColor = lineColor; + } + + public Color getFillColor() { return fillColor; } + + public Color getLineColor() { return lineColor; } + }; + + /** + * Loads all plots in a file and formats them according to the + * indicated style. + * @param args - Unused default executable parameter. + * @throws IOException Occurs if there is an issue opening the file. + */ + public static void main(String[] args) throws IOException { + // Define the root directory for the plots. + String rootDir = "D:\\cygwin64\\home\\Kyle\\"; + + // Define the new name of the file containing the trigger plots. + String plotFile = rootDir + "temp.aida"; + + // Define the scaling factors for each plot. + double scaleFactor = 1; + + // Get the plots file and open it. + IAnalysisFactory af = IAnalysisFactory.create(); + ITree tree = af.createTreeFactory().create(plotFile); + if(tree == null) { throw new IllegalArgumentException("Unable to load plot file."); } + + // Define index references for each event type. + int MOLLER = 0; + int TRIDENT = 1; + int ELASTIC = 2; + + // Get the histograms. + IHistogram1D[] trackCountPlots = new IHistogram1D[3]; + trackCountPlots[MOLLER] = (IHistogram1D) tree.find("MTE Analysis/Møller Event Tracks"); + trackCountPlots[TRIDENT] = (IHistogram1D) tree.find("MTE Analysis/Trident Event Tracks"); + trackCountPlots[ELASTIC] = (IHistogram1D) tree.find("MTE Analysis/Elastic Event Tracks"); + + IHistogram1D[] energyPlots = new IHistogram1D[3]; + energyPlots[MOLLER] = (IHistogram1D) tree.find("MTE Analysis/Møller Electron Energy Distribution"); + energyPlots[TRIDENT] = (IHistogram1D) tree.find("MTE Analysis/Trident Electron Energy Distribution"); + energyPlots[ELASTIC] = (IHistogram1D) tree.find("MTE Analysis/Elastic Energy Distribution"); + + IHistogram1D[] energySumPlots = new IHistogram1D[2]; + energySumPlots[MOLLER] = (IHistogram1D) tree.find("MTE Analysis/Møller Energy Sum Distribution"); + energySumPlots[TRIDENT] = (IHistogram1D) tree.find("MTE Analysis/Trident Energy Sum Distribution"); + + IHistogram2D[] energy2DPlots = new IHistogram2D[2]; + energy2DPlots[MOLLER] = (IHistogram2D) tree.find("MTE Analysis/Møller 2D Energy Distribution"); + energy2DPlots[TRIDENT] = (IHistogram2D) tree.find("MTE Analysis/Trident 2D Energy Distribution"); + + // Create a plotter factory. + IPlotterFactory plotterFactory = af.createPlotterFactory(); + + // Format the track count plots. + for(IHistogram1D trackCountPlot : trackCountPlots) { + // Create a plotter and plotting region for the plot. + IPlotter plotter = plotterFactory.create(trackCountPlot.title()); + plotter.createRegions(1); + plotter.region(0).plot(trackCountPlot); + + // Format the axis labels. + PlotterRegion region = (PlotterRegion) plotter.region(0); + region.getPlot().setTitle(trackCountPlot.title()); + region.getPlot().getXAxis().setLabel("Number of Tracks"); + region.getPlot().getYAxis().setLabel("Count"); + + // Format the fonts and general plot presentation. + setDefault1DStyle(region, new ColorStyle[] { ColorStyle.GREY }); + + // Show the plot. + plotter.setParameter("plotterWidth", "2000"); + plotter.setParameter("plotterHeight", "1200"); + plotter.show(); + } + + // Format the electron energy plots. + for(IHistogram1D energyPlot : energyPlots) { + // Create a plotter and plotting region for the plot. + IPlotter plotter = plotterFactory.create(energyPlot.title()); + plotter.createRegions(1); + plotter.region(0).plot(energyPlot); + + // Format the axis labels. + PlotterRegion region = (PlotterRegion) plotter.region(0); + region.getPlot().setTitle(energyPlot.title()); + region.getPlot().getXAxis().setLabel("Track Energy (GeV)"); + region.getPlot().getYAxis().setLabel("Count"); + + // Format the fonts and general plot presentation. + setDefault1DStyle(region, new ColorStyle[] { ColorStyle.GREY }); + + // Show the plot. + plotter.setParameter("plotterWidth", "2000"); + plotter.setParameter("plotterHeight", "1200"); + plotter.show(); + } + + // Format the energy sum plots. + for(IHistogram1D energySumPlot : energySumPlots) { + // Create a plotter and plotting region for the plot. + IPlotter plotter = plotterFactory.create(energySumPlot.title()); + plotter.createRegions(1); + plotter.region(0).plot(energySumPlot); + + // Format the axis labels. + PlotterRegion region = (PlotterRegion) plotter.region(0); + region.getPlot().setTitle(energySumPlot.title()); + region.getPlot().getXAxis().setLabel("Track Energy (GeV)"); + region.getPlot().getYAxis().setLabel("Count"); + + // Format the fonts and general plot presentation. + setDefault1DStyle(region, new ColorStyle[] { ColorStyle.GREY }); + + // Show the plot. + plotter.setParameter("plotterWidth", "2000"); + plotter.setParameter("plotterHeight", "1200"); + plotter.show(); + } + + // Format the 2D energy sum plots. + for(IHistogram2D energy2DPlot : energy2DPlots) { + // Create a plotter and plotting region for the plot. + IPlotter plotter = plotterFactory.create(energy2DPlot.title()); + plotter.createRegions(1); + plotter.region(0).plot(energy2DPlot); + + // Format the axis labels. + PlotterRegion region = (PlotterRegion) plotter.region(0); + region.getPlot().setTitle(energy2DPlot.title()); + region.getPlot().getXAxis().setLabel("First Track Energy (GeV)"); + region.getPlot().getYAxis().setLabel("Second Track Energy (GeV)"); + + + // Format the fonts and general plot presentation. + setDefault2DStyle(region, false); + + // Show the plot. + plotter.setParameter("plotterWidth", "2000"); + plotter.setParameter("plotterHeight", "1200"); + plotter.show(); + } + + // Disable the error bars. + //JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(region.getAllDataNames()[0]).getStyle(); + //fillStyle.setShowErrorBars(false); + + // Close the tree. + tree.close(); + } + + /** + * Sets the plot display formatting for 1D plots. + * @param region - The plotter region to format. + * @param color - The data color settings to use. + */ + private static final void setDefault1DStyle(PlotterRegion region, ColorStyle[] color) { + // Get the names of each plot on in the region. + String[] dataNames = region.getAllDataNames(); + + // Check whether this is an overlay plot. Overlay plots contain + // more than one data name. + boolean overlay = (dataNames.length > 1 ? true : false); + + // Iterate over each plot in the region. + for(int i = 0; i < dataNames.length; i++) { + // Set the overlay style if needed. + if(overlay) { + // Get the fill style for the current data type. + JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle(); + + // Set the histogram style to display thick-lined bars + // with no fill. The color is set by the "color" argument. + fillStyle.setHistogramFill(false); + fillStyle.setHistogramBarLineWidth(3); + fillStyle.setHistogramBarLineColor(color[i].getFillColor()); + + // Set the legend text style. + region.getPlot().getLegend().setFont(new Font("Calibri", Font.PLAIN, 20)); + } + + // Otherwise, set the fill style for a single plot. + else { + // Get the fill style for the current data type. + JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle(); + + // Set the histogram style to display thick-lined bars + // with a fill color. The colors are defined by the + // "color" argument. + fillStyle.setHistogramBarLineWidth(3); + fillStyle.setHistogramBarColor(color[i].getFillColor()); + fillStyle.setHistogramBarLineColor(color[i].getLineColor()); + } + + // Set the statistics box style. + region.getPlot().getStats().setVisible(true); + region.getPlot().getStats().setFont(BASIC_FONT); + + // Set the title font. + region.getPlot().getTitleObject().setFont(TITLE_FONT); + + // Set the axis tick-mark fonts. + region.getPlot().getXAxis().setFont(BASIC_FONT); + region.getPlot().getYAxis().setFont(BASIC_FONT); + region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT); + region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT); + } + } + + /** + * Sets the plot display formatting for 1D plots. + * @param region - The plotter region to format. + */ + private static final void setDefault2DStyle(PlotterRegion region, boolean logarithmic) { + // Get the fill style object. 2D plots should never be overlay + // plots, so there should only ever be one data name. + JASHist2DHistogramStyle fillStyle = (JASHist2DHistogramStyle) region.getDataForName(region.getAllDataNames()[0]).getStyle(); + + // Set the fill style for a two-dimensional plot. + if(logarithmic) { fillStyle.setLogZ(true); } + fillStyle.setHistStyle(JASHist2DHistogramStyle.STYLE_COLORMAP); + fillStyle.setColorMapScheme(JASHist2DHistogramStyle.COLORMAP_RAINBOW); + + // Make the statistics box invisible. + region.getPlot().getStats().setVisible(false); + + // Set the general plot font (which is also the z-axis font). + region.getPlot().setFont(BASIC_FONT); + + // Set the title font. + region.getPlot().getTitleObject().setFont(TITLE_FONT); + + // Set the axis tick-mark fonts. + region.getPlot().getXAxis().setFont(BASIC_FONT); + region.getPlot().getYAxis().setFont(BASIC_FONT); + region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT); + region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT); + } + + /** + * Recursive method that gets all object names from a tree that + * are not directories. Method should not be called directly, but + * rather called only through the <code>getHistograms(ITree)</code> + * method. + * @param tree - The tree from which to obtain the object names. + * @param directory - The directory in which to search for objects. + * @param list - The list in which to place the objects. + * @return Returns the <code>List</code> collection that was given + * as an argument. + */ + private static final List<String> getHistograms(ITree tree, String directory, List<String> list) { + // Get the list of objects in the directory. + String[] treeObjects = tree.listObjectNames(directory); + + // Print the objects. + for(String objectName : treeObjects) { + // Check if the object is a directory. + boolean isDirectory = isDirectory(objectName); + + // If the object is a directory, get the histograms from it. + if(isDirectory) { + getHistograms(tree, objectName, list); + } + + // If the object is a plot, add it to the list. + else { list.add(objectName); } + } + + // Return the list. + return list; + } + + /** + * Checks whether a tree object is a directory. + * @param object - The object to check. + * @return Returns <code>true</code> if the object is a directory + * and <code>false</code> otherwise. + */ + private static final boolean isDirectory(String object) { + return (object.toCharArray()[object.length() - 1] == '/'); + } } Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/MTETriggerPlotsFormatter.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/MTETriggerPlotsFormatter.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/MTETriggerPlotsFormatter.java Tue Sep 27 08:50:14 2016 @@ -15,164 +15,164 @@ public class MTETriggerPlotsFormatter { - public static void main(String[] args) throws IllegalArgumentException, IOException { - // Define the root directory for the plots. - String rootDir = "D:\\cygwin64\\home\\Kyle\\"; - - // Define the new name of the file containing the trigger plots. - String plotFile = rootDir + "5772-ana.aida"; - - // Get the plots file and open it. - IAnalysisFactory af = IAnalysisFactory.create(); - ITree tree = af.createTreeFactory().create(plotFile); - if(tree == null) { throw new IllegalArgumentException("Unable to load plot file."); } - - // Define the 1D trigger plot names for Møllers and tridents. - String[] plotNames1D = { "Cluster Hit Count", "Cluster Seed Energy", "Cluster Total Energy", - "Pair Coplanarity", "Pair Energy Difference", "Pair Energy Slope", "Pair Energy Sum" }; - String[] displayNames1D = { "Cluster Hit Count", "Cluster Seed Energy", "Cluster Total Energy", - "Pair Coplanarity", "Pair Energy Difference", "Pair Energy Slope", "Pair Energy Sum" }; - String[] xAxisNames1D = { "Hit Count", "Seed Energy (GeV)", "Total Energy (GeV)", - "Coplanarity (Degrees)", "Energy Difference (GeV)", "Energy Slope (GeV)", "Energy Sum (GeV)" }; - String yAxisName1D = "Count"; - - // Define the 2D trigger plot names for Møllers and tridents. - String[] plotNames2D = { "Cluster Seed", "Pair Energy Sum 2D" }; - String[] displayNames2D = { "Cluster Seed Distribution", "2D Energy Sum" }; - String[] xAxisNames2D = { "x-Index", "Second Cluster Energy (GeV)" }; - String[] yAxisNames2D = { "y-Index", "First Cluster Energy (GeV)" }; - - // Define the 1D trigger plot names for elastics. - String[] plotNamesElastic1D = { "Cluster Hit Count", "Cluster Seed Energy", "Cluster Total Energy" }; - String[] displayNamesElastic1D = { "Cluster Hit Count", "Cluster Seed Energy", "Cluster Total Energy" }; - String[] xAxisNamesElastic1D = { "Hit Count", "Seed Energy (GeV)", "Total Energy (GeV)" }; - String yAxisNameElastic1D = "Count"; - - // Define the 2D trigger plot names for elastics. - String[] plotNamesElastic2D = { "Cluster Seed" }; - String[] displayNamesElastic2D = { "Cluster Seed Distribution" }; - String[] xAxisNamesElastic2D = { "x-Index" }; - String[] yAxisNamesElastic2D = { "y-Index" }; - - // Define the Møller, trident, and elastic prefixes. - String allPrefix = "All Trigger Plots/Pair Plots/"; - String møllerPrefix = "Møller Trigger Plots/Pair Plots/"; - String tridentPrefix = "Trident Trigger Plots/Pair Plots/"; - String elasticPrefix = "Elastic Trigger Plots/Singles Plots/"; - String allSinglesPrefix = "All Trigger Plots/Singles Plots/"; - - // Define the plot type prefix. - String allTypeName = "All Pairs - "; - String møllerTypeName = "Møller - "; - String tridentTypeName = "Trident - "; - String elasticTypeName = "Elastic - "; - String allSinglesTypeName = "All Singles - "; - - // Define the plot type colors. - ColorStyle allColor = PlotsFormatter.ColorStyle.GREY; - ColorStyle møllerColor = PlotsFormatter.ColorStyle.MS_BLUE; - ColorStyle tridentColor = PlotsFormatter.ColorStyle.MS_ORANGE; - ColorStyle elasticColor = PlotsFormatter.ColorStyle.MS_GREEN; - - // Create a plot formatting module. - PlotFormatModule module = new PlotFormatModule(); - - // Get the histograms and add them to the module. Start with the - // trident and Møller plots. - for(int i = 0; i < plotNames1D.length; i++) { - // Get the Møller and trident plots. - IHistogram1D allPlot = (IHistogram1D) tree.find(allPrefix + plotNames1D[i]); - IHistogram1D møllerPlot = (IHistogram1D) tree.find(møllerPrefix + plotNames1D[i]); - IHistogram1D tridentPlot = (IHistogram1D) tree.find(tridentPrefix + plotNames1D[i]); - - // Make a formatted plot for each. - FormattedPlot1D allFormattedPlot = new FormattedPlot1D(allPlot, allColor, xAxisNames1D[i], yAxisName1D, allTypeName + displayNames1D[i]); - FormattedPlot1D møllerFormattedPlot = new FormattedPlot1D(møllerPlot, møllerColor, xAxisNames1D[i], yAxisName1D, møllerTypeName + displayNames1D[i]); - FormattedPlot1D tridentFormattedPlot = new FormattedPlot1D(tridentPlot, tridentColor, xAxisNames1D[i], yAxisName1D, tridentTypeName + displayNames1D[i]); - - // Add them to the module. - module.addPlot1D(allFormattedPlot); - module.addPlot1D(møllerFormattedPlot); - module.addPlot1D(tridentFormattedPlot); - } - for(int i = 0; i < plotNames2D.length; i++) { - // Get the Møller and trident plots. - IHistogram2D allPlot = (IHistogram2D) tree.find(allPrefix + plotNames2D[i]); - IHistogram2D møllerPlot = (IHistogram2D) tree.find(møllerPrefix + plotNames2D[i]); - IHistogram2D tridentPlot = (IHistogram2D) tree.find(tridentPrefix + plotNames2D[i]); - - // Make a formatted plot for each. - FormattedPlot2D allFormattedPlot = new FormattedPlot2D(allPlot, i == 0 ? true : false, xAxisNames2D[i], yAxisNames2D[i], allTypeName + displayNames2D[i]); - FormattedPlot2D møllerFormattedPlot = new FormattedPlot2D(møllerPlot, i == 0 ? true : false, xAxisNames2D[i], yAxisNames2D[i], møllerTypeName + displayNames2D[i]); - FormattedPlot2D tridentFormattedPlot = new FormattedPlot2D(tridentPlot, i == 0 ? true : false, xAxisNames2D[i], yAxisNames2D[i], tridentTypeName + displayNames2D[i]); - - // Add them to the module. - module.addPlot2D(allFormattedPlot); - module.addPlot2D(møllerFormattedPlot); - module.addPlot2D(tridentFormattedPlot); - } - - // Get the histograms for the elastic plots and add them to the module. - for(int i = 0; i < plotNamesElastic1D.length; i++) { - // Get the Møller and trident plots. - IHistogram1D allPlot = (IHistogram1D) tree.find(allSinglesPrefix + plotNames1D[i]); - IHistogram1D elasticPlot = (IHistogram1D) tree.find(elasticPrefix + plotNames1D[i]); - - // Make a formatted plot for each. - FormattedPlot1D allFormattedPlot = new FormattedPlot1D(allPlot, allColor, xAxisNamesElastic1D[i], yAxisNameElastic1D, - allSinglesTypeName + displayNamesElastic1D[i]); - FormattedPlot1D elasticFormattedPlot = new FormattedPlot1D(elasticPlot, elasticColor, xAxisNamesElastic1D[i], yAxisNameElastic1D, - elasticTypeName + displayNamesElastic1D[i]); - - // Add them to the module. - module.addPlot1D(allFormattedPlot); - module.addPlot1D(elasticFormattedPlot); - } - for(int i = 0; i < plotNamesElastic2D.length; i++) { - // Get the Møller and trident plots. - IHistogram2D allPlot = (IHistogram2D) tree.find(allPrefix + plotNamesElastic2D[i]); - IHistogram2D elasticPlot = (IHistogram2D) tree.find(møllerPrefix + plotNamesElastic2D[i]); - - // Make a formatted plot for each. - FormattedPlot2D allFormattedPlot = new FormattedPlot2D(allPlot, i == 0 ? true : false, xAxisNamesElastic2D[i], yAxisNamesElastic2D[i], - allSinglesTypeName + plotNames2D[i]); - FormattedPlot2D elasticFormattedPlot = new FormattedPlot2D(elasticPlot, i == 0 ? true : false, xAxisNamesElastic2D[i], yAxisNamesElastic2D[i], - elasticTypeName + displayNamesElastic2D[i]); - - // Add them to the module. - module.addPlot2D(allFormattedPlot); - module.addPlot2D(elasticFormattedPlot); - } - - // Add the MTE plots to the module. - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Elastic Energy Distribution"), elasticColor, - "Momentum (GeV)", "Count", "Elastic - Momentum")); - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Elastic Event Tracks"), elasticColor, - "Tracks", "Count", "Elastic - Tracks in Event")); - - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Møller Energy Sum Distribution"), møllerColor, - "Momentum Sum (GeV)", "Count", "Møller - Momentum Sum")); - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Møller Electron Energy Distribution"), møllerColor, - "Momentum (GeV)", "Count", "Møller - Momentum (Electron)")); - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Møller Time Coincidence Distribution (All Møller Cuts)"), møllerColor, - "Time (ns)", "Count", "Møller - Time Coincidence")); - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Møller Event Tracks"), møllerColor, - "Tracks", "Count", "Møller - Tracks in Event")); - module.addPlot2D(new FormattedPlot2D((IHistogram2D) tree.find("MTE Analysis/Møller 2D Energy Distribution"), false, - "First Track Momentum (GeV)", "Second Track Momentum (GeV)", "Møller - 2D Momentum Sum")); - - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Trident Energy Sum Distribution"), tridentColor, - "Momentum Sum (GeV)", "Count", "Trident - Momentum Sum")); - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Trident Electron Energy Distribution"), tridentColor, - "Momentum (GeV)", "Count", "Trident - Momentum (Electron)")); - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Trident Positron Energy Distribution"), tridentColor, - "Momentum (GeV)", "Count", "Trident - Momentum (Positron)")); - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Trident Event Tracks"), tridentColor, - "Tracks", "Count", "Trident - Tracks in Event")); - module.addPlot2D(new FormattedPlot2D((IHistogram2D) tree.find("MTE Analysis/Trident 2D Energy Distribution"), false, - "First Track Momentum (GeV)", "Second Track Momentum (GeV)", "Trident - 2D Momentum Sum")); - - // Display the plots. - module.savePlots("C:\\Users\\Kyle\\Desktop\\EnergyShift\\TestPrint\\"); - } + public static void main(String[] args) throws IllegalArgumentException, IOException { + // Define the root directory for the plots. + String rootDir = "D:\\cygwin64\\home\\Kyle\\"; + + // Define the new name of the file containing the trigger plots. + String plotFile = rootDir + "5772-ana.aida"; + + // Get the plots file and open it. + IAnalysisFactory af = IAnalysisFactory.create(); + ITree tree = af.createTreeFactory().create(plotFile); + if(tree == null) { throw new IllegalArgumentException("Unable to load plot file."); } + + // Define the 1D trigger plot names for Møllers and tridents. + String[] plotNames1D = { "Cluster Hit Count", "Cluster Seed Energy", "Cluster Total Energy", + "Pair Coplanarity", "Pair Energy Difference", "Pair Energy Slope", "Pair Energy Sum" }; + String[] displayNames1D = { "Cluster Hit Count", "Cluster Seed Energy", "Cluster Total Energy", + "Pair Coplanarity", "Pair Energy Difference", "Pair Energy Slope", "Pair Energy Sum" }; + String[] xAxisNames1D = { "Hit Count", "Seed Energy (GeV)", "Total Energy (GeV)", + "Coplanarity (Degrees)", "Energy Difference (GeV)", "Energy Slope (GeV)", "Energy Sum (GeV)" }; + String yAxisName1D = "Count"; + + // Define the 2D trigger plot names for Møllers and tridents. + String[] plotNames2D = { "Cluster Seed", "Pair Energy Sum 2D" }; + String[] displayNames2D = { "Cluster Seed Distribution", "2D Energy Sum" }; + String[] xAxisNames2D = { "x-Index", "Second Cluster Energy (GeV)" }; + String[] yAxisNames2D = { "y-Index", "First Cluster Energy (GeV)" }; + + // Define the 1D trigger plot names for elastics. + String[] plotNamesElastic1D = { "Cluster Hit Count", "Cluster Seed Energy", "Cluster Total Energy" }; + String[] displayNamesElastic1D = { "Cluster Hit Count", "Cluster Seed Energy", "Cluster Total Energy" }; + String[] xAxisNamesElastic1D = { "Hit Count", "Seed Energy (GeV)", "Total Energy (GeV)" }; + String yAxisNameElastic1D = "Count"; + + // Define the 2D trigger plot names for elastics. + String[] plotNamesElastic2D = { "Cluster Seed" }; + String[] displayNamesElastic2D = { "Cluster Seed Distribution" }; + String[] xAxisNamesElastic2D = { "x-Index" }; + String[] yAxisNamesElastic2D = { "y-Index" }; + + // Define the Møller, trident, and elastic prefixes. + String allPrefix = "All Trigger Plots/Pair Plots/"; + String møllerPrefix = "Møller Trigger Plots/Pair Plots/"; + String tridentPrefix = "Trident Trigger Plots/Pair Plots/"; + String elasticPrefix = "Elastic Trigger Plots/Singles Plots/"; + String allSinglesPrefix = "All Trigger Plots/Singles Plots/"; + + // Define the plot type prefix. + String allTypeName = "All Pairs - "; + String møllerTypeName = "Møller - "; + String tridentTypeName = "Trident - "; + String elasticTypeName = "Elastic - "; + String allSinglesTypeName = "All Singles - "; + + // Define the plot type colors. + ColorStyle allColor = PlotsFormatter.ColorStyle.GREY; + ColorStyle møllerColor = PlotsFormatter.ColorStyle.MS_BLUE; + ColorStyle tridentColor = PlotsFormatter.ColorStyle.MS_ORANGE; + ColorStyle elasticColor = PlotsFormatter.ColorStyle.MS_GREEN; + + // Create a plot formatting module. + PlotFormatModule module = new PlotFormatModule(); + + // Get the histograms and add them to the module. Start with the + // trident and Møller plots. + for(int i = 0; i < plotNames1D.length; i++) { + // Get the Møller and trident plots. + IHistogram1D allPlot = (IHistogram1D) tree.find(allPrefix + plotNames1D[i]); + IHistogram1D møllerPlot = (IHistogram1D) tree.find(møllerPrefix + plotNames1D[i]); + IHistogram1D tridentPlot = (IHistogram1D) tree.find(tridentPrefix + plotNames1D[i]); + + // Make a formatted plot for each. + FormattedPlot1D allFormattedPlot = new FormattedPlot1D(allPlot, allColor, xAxisNames1D[i], yAxisName1D, allTypeName + displayNames1D[i]); + FormattedPlot1D møllerFormattedPlot = new FormattedPlot1D(møllerPlot, møllerColor, xAxisNames1D[i], yAxisName1D, møllerTypeName + displayNames1D[i]); + FormattedPlot1D tridentFormattedPlot = new FormattedPlot1D(tridentPlot, tridentColor, xAxisNames1D[i], yAxisName1D, tridentTypeName + displayNames1D[i]); + + // Add them to the module. + module.addPlot1D(allFormattedPlot); + module.addPlot1D(møllerFormattedPlot); + module.addPlot1D(tridentFormattedPlot); + } + for(int i = 0; i < plotNames2D.length; i++) { + // Get the Møller and trident plots. + IHistogram2D allPlot = (IHistogram2D) tree.find(allPrefix + plotNames2D[i]); + IHistogram2D møllerPlot = (IHistogram2D) tree.find(møllerPrefix + plotNames2D[i]); + IHistogram2D tridentPlot = (IHistogram2D) tree.find(tridentPrefix + plotNames2D[i]); + + // Make a formatted plot for each. + FormattedPlot2D allFormattedPlot = new FormattedPlot2D(allPlot, i == 0 ? true : false, xAxisNames2D[i], yAxisNames2D[i], allTypeName + displayNames2D[i]); + FormattedPlot2D møllerFormattedPlot = new FormattedPlot2D(møllerPlot, i == 0 ? true : false, xAxisNames2D[i], yAxisNames2D[i], møllerTypeName + displayNames2D[i]); + FormattedPlot2D tridentFormattedPlot = new FormattedPlot2D(tridentPlot, i == 0 ? true : false, xAxisNames2D[i], yAxisNames2D[i], tridentTypeName + displayNames2D[i]); + + // Add them to the module. + module.addPlot2D(allFormattedPlot); + module.addPlot2D(møllerFormattedPlot); + module.addPlot2D(tridentFormattedPlot); + } + + // Get the histograms for the elastic plots and add them to the module. + for(int i = 0; i < plotNamesElastic1D.length; i++) { + // Get the Møller and trident plots. + IHistogram1D allPlot = (IHistogram1D) tree.find(allSinglesPrefix + plotNames1D[i]); + IHistogram1D elasticPlot = (IHistogram1D) tree.find(elasticPrefix + plotNames1D[i]); + + // Make a formatted plot for each. + FormattedPlot1D allFormattedPlot = new FormattedPlot1D(allPlot, allColor, xAxisNamesElastic1D[i], yAxisNameElastic1D, + allSinglesTypeName + displayNamesElastic1D[i]); + FormattedPlot1D elasticFormattedPlot = new FormattedPlot1D(elasticPlot, elasticColor, xAxisNamesElastic1D[i], yAxisNameElastic1D, + elasticTypeName + displayNamesElastic1D[i]); + + // Add them to the module. + module.addPlot1D(allFormattedPlot); + module.addPlot1D(elasticFormattedPlot); + } + for(int i = 0; i < plotNamesElastic2D.length; i++) { + // Get the Møller and trident plots. + IHistogram2D allPlot = (IHistogram2D) tree.find(allPrefix + plotNamesElastic2D[i]); + IHistogram2D elasticPlot = (IHistogram2D) tree.find(møllerPrefix + plotNamesElastic2D[i]); + + // Make a formatted plot for each. + FormattedPlot2D allFormattedPlot = new FormattedPlot2D(allPlot, i == 0 ? true : false, xAxisNamesElastic2D[i], yAxisNamesElastic2D[i], + allSinglesTypeName + plotNames2D[i]); + FormattedPlot2D elasticFormattedPlot = new FormattedPlot2D(elasticPlot, i == 0 ? true : false, xAxisNamesElastic2D[i], yAxisNamesElastic2D[i], + elasticTypeName + displayNamesElastic2D[i]); + + // Add them to the module. + module.addPlot2D(allFormattedPlot); + module.addPlot2D(elasticFormattedPlot); + } + + // Add the MTE plots to the module. + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Elastic Energy Distribution"), elasticColor, + "Momentum (GeV)", "Count", "Elastic - Momentum")); + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Elastic Event Tracks"), elasticColor, + "Tracks", "Count", "Elastic - Tracks in Event")); + + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Møller Energy Sum Distribution"), møllerColor, + "Momentum Sum (GeV)", "Count", "Møller - Momentum Sum")); + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Møller Electron Energy Distribution"), møllerColor, + "Momentum (GeV)", "Count", "Møller - Momentum (Electron)")); + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Møller Time Coincidence Distribution (All Møller Cuts)"), møllerColor, + "Time (ns)", "Count", "Møller - Time Coincidence")); + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Møller Event Tracks"), møllerColor, + "Tracks", "Count", "Møller - Tracks in Event")); + module.addPlot2D(new FormattedPlot2D((IHistogram2D) tree.find("MTE Analysis/Møller 2D Energy Distribution"), false, + "First Track Momentum (GeV)", "Second Track Momentum (GeV)", "Møller - 2D Momentum Sum")); + + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Trident Energy Sum Distribution"), tridentColor, + "Momentum Sum (GeV)", "Count", "Trident - Momentum Sum")); + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Trident Electron Energy Distribution"), tridentColor, + "Momentum (GeV)", "Count", "Trident - Momentum (Electron)")); + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Trident Positron Energy Distribution"), tridentColor, + "Momentum (GeV)", "Count", "Trident - Momentum (Positron)")); + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MTE Analysis/Trident Event Tracks"), tridentColor, + "Tracks", "Count", "Trident - Tracks in Event")); + module.addPlot2D(new FormattedPlot2D((IHistogram2D) tree.find("MTE Analysis/Trident 2D Energy Distribution"), false, + "First Track Momentum (GeV)", "Second Track Momentum (GeV)", "Trident - 2D Momentum Sum")); + + // Display the plots. + module.savePlots("C:\\Users\\Kyle\\Desktop\\EnergyShift\\TestPrint\\"); + } } Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/ParticleMCAnalysisPlotsFormatter.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/ParticleMCAnalysisPlotsFormatter.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/ParticleMCAnalysisPlotsFormatter.java Tue Sep 27 08:50:14 2016 @@ -13,43 +13,43 @@ import org.hps.users.kmccarty.plots.PlotsFormatter.ColorStyle; public class ParticleMCAnalysisPlotsFormatter { - public static void main(String[] args) throws IllegalArgumentException, IOException { - // Define the root directory for the plots. - String rootDir = "D:\\cygwin64\\home\\Kyle\\"; - - // Define the new name of the file containing the trigger plots. - String plotFile = rootDir + "moller-mc-out_triggerPlots.aida"; - - // Get the plots file and open it. - IAnalysisFactory af = IAnalysisFactory.create(); - ITree tree = af.createTreeFactory().create(plotFile); - if(tree == null) { throw new IllegalArgumentException("Unable to load plot file."); } - - // Create a plot formatting module. - PlotFormatModule module = new PlotFormatModule(); - - // Define the plot color. - ColorStyle plotColor = ColorStyle.MS_BLUE; - - // Define the plots to be read. - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MC Analysis/Electron Energy Distribution"), - plotColor, "Electron Energy (GeV)", "Count", "Electron Energy Distribution")); - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MC Analysis/Electron\\Electron Momentum Sum Distribution"), - plotColor, "Momentum Sum (GeV)", "Count", "Momentum Sum Distribution")); - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MC Analysis/Electron\\Electron Pair Angle Distribution"), - plotColor, "Momentum Sum (GeV)", "Count", "Pair Angle Distribution")); - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MC Analysis/Particle x-Momentum Distribution"), - plotColor, "Momentum (GeV)", "Count", "Particle x-Momentum Distribution")); - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MC Analysis/Particle y-Momentum Distribution"), - plotColor, "Momentum (GeV)", "Count", "Particle y-Momentum Distribution")); - module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MC Analysis/Particle z-Momentum Distribution"), - plotColor, "Momentum (GeV)", "Count", "Particle z-Momentum Distribution")); - module.addPlot2D(new FormattedPlot2D((IHistogram2D) tree.find("MC Analysis/Electron\\Electron 2D Momentum Distribution"), - true, "Particle 1 Momentum (GeV)", "Particle 2 Momentum (GeV)", "2D Momentum Sum Distribution")); - module.addPlot2D(new FormattedPlot2D((IHistogram2D) tree.find("MC Analysis/Particle Momentum Distribution"), - true, "px (GeV)", "py (GeV)", "Particle x/y Momentum Distribution")); - - // Display the plots. - module.displayPlots(); - } + public static void main(String[] args) throws IllegalArgumentException, IOException { + // Define the root directory for the plots. + String rootDir = "D:\\cygwin64\\home\\Kyle\\"; + + // Define the new name of the file containing the trigger plots. + String plotFile = rootDir + "moller-mc-out_triggerPlots.aida"; + + // Get the plots file and open it. + IAnalysisFactory af = IAnalysisFactory.create(); + ITree tree = af.createTreeFactory().create(plotFile); + if(tree == null) { throw new IllegalArgumentException("Unable to load plot file."); } + + // Create a plot formatting module. + PlotFormatModule module = new PlotFormatModule(); + + // Define the plot color. + ColorStyle plotColor = ColorStyle.MS_BLUE; + + // Define the plots to be read. + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MC Analysis/Electron Energy Distribution"), + plotColor, "Electron Energy (GeV)", "Count", "Electron Energy Distribution")); + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MC Analysis/Electron\\Electron Momentum Sum Distribution"), + plotColor, "Momentum Sum (GeV)", "Count", "Momentum Sum Distribution")); + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MC Analysis/Electron\\Electron Pair Angle Distribution"), + plotColor, "Momentum Sum (GeV)", "Count", "Pair Angle Distribution")); + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MC Analysis/Particle x-Momentum Distribution"), + plotColor, "Momentum (GeV)", "Count", "Particle x-Momentum Distribution")); + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MC Analysis/Particle y-Momentum Distribution"), + plotColor, "Momentum (GeV)", "Count", "Particle y-Momentum Distribution")); + module.addPlot1D(new FormattedPlot1D((IHistogram1D) tree.find("MC Analysis/Particle z-Momentum Distribution"), + plotColor, "Momentum (GeV)", "Count", "Particle z-Momentum Distribution")); + module.addPlot2D(new FormattedPlot2D((IHistogram2D) tree.find("MC Analysis/Electron\\Electron 2D Momentum Distribution"), + true, "Particle 1 Momentum (GeV)", "Particle 2 Momentum (GeV)", "2D Momentum Sum Distribution")); + module.addPlot2D(new FormattedPlot2D((IHistogram2D) tree.find("MC Analysis/Particle Momentum Distribution"), + true, "px (GeV)", "py (GeV)", "Particle x/y Momentum Distribution")); + + // Display the plots. + module.displayPlots(); + } } Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/RafoTridentFormatter.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/RafoTridentFormatter.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/RafoTridentFormatter.java Tue Sep 27 08:50:14 2016 @@ -13,101 +13,101 @@ import hep.aida.ITree; public class RafoTridentFormatter { - /** - * Loads all plots in a file and formats them according to the - * indicated style. - * @param args - Unused default executable parameter. - * @throws IOException Occurs if there is an issue opening the file. - */ - public static void main(String[] args) throws IOException { - // Define the root directory for the plots. - String rootDir = "D:\\cygwin64\\home\\Kyle\\"; - - // Define the new name of the file containing the trigger plots. - String plotFile = rootDir + "mte-out.aida"; - - // Get the plots file and open it. - IAnalysisFactory af = IAnalysisFactory.create(); - ITree tree = af.createTreeFactory().create(plotFile); - if(tree == null) { throw new IllegalArgumentException("Unable to load plot file."); } - - // Declare the histogram names. - String energySumName = "Energy Sum"; - String timeCoincidenceName = "Time Coincidence"; - String timeEnergy2DName = "Cluster Time vs. Cluster Energy"; - String hCoplanaritySum2DName = "Hardware Coplanarity vs. Energy Sum"; - String coplanaritySum2DName = "Calculated Coplanarity vs. Energy Sum"; - String energySum2DName = "Top Cluster Energy vs. Bottom Cluster Energy"; - String fiducial = " (Fiducial Region)"; - - // Get the histograms. - IHistogram1D[] energySum = { - (IHistogram1D) tree.find("Trident/" + energySumName), - (IHistogram1D) tree.find("Trident/" + energySumName + fiducial) - }; - IHistogram1D[] timeCoincidence = { - (IHistogram1D) tree.find("Trident/" + timeCoincidenceName), - (IHistogram1D) tree.find("Trident/" + timeCoincidenceName + fiducial) - }; - IHistogram2D[] coplanaritySum = { - (IHistogram2D) tree.find("Trident/" + coplanaritySum2DName), - (IHistogram2D) tree.find("Trident/" + coplanaritySum2DName + fiducial) - }; - IHistogram2D[] hcoplanaritySum = { - (IHistogram2D) tree.find("Trident/" + hCoplanaritySum2DName), - (IHistogram2D) tree.find("Trident/" + hCoplanaritySum2DName + fiducial) - }; - IHistogram2D[] energySum2D = { - (IHistogram2D) tree.find("Trident/" + energySum2DName), - (IHistogram2D) tree.find("Trident/" + energySum2DName + fiducial) - }; - IHistogram2D[] timeEnergy = { - (IHistogram2D) tree.find("Trident/" + timeEnergy2DName), - (IHistogram2D) tree.find("Trident/" + timeEnergy2DName + fiducial) - }; - - // Define the scaling factors for each plot. - double scaleFactor = 19000.0 / 9736969.0; - - // Define the plot titles and arrays for 1D plots. - IHistogram1D[][] plots = { energySum, timeCoincidence }; - String titles[] = { energySumName, timeCoincidenceName, coplanaritySum2DName, hCoplanaritySum2DName, energySum2DName, timeEnergy2DName }; - String[] xTitles = { "Energy (GeV)", "Time Difference (ns)" }; - String yTitle = "Rate (Hz)"; - - // Define the plot titles and arrays for 2D plots. - IHistogram2D[][] plots2D = { coplanaritySum, hcoplanaritySum, energySum2D, timeEnergy }; - String[] titles2D = { coplanaritySum2DName, hCoplanaritySum2DName, energySum2DName, timeEnergy2DName }; - String[] xTitles2D = { "Coplanarity (Degrees)", "Coplanarity (Degrees)", "Top Cluster Energy (GeV)", "Time Coincidence (ns)" }; - String[] yTitles2D = { "Energy Sum (GeV)", "Energy Sum (GeV)", "Bottom Cluster Energy (GeV)", "Energy Sum (GeV)" }; - String zTitle2D = "Rate (Hz)"; - - // Create a plot formatting module. - PlotFormatModule module = new PlotFormatModule(); - - // Define the plot color. - ColorStyle plotColor = ColorStyle.MS_BLUE; - - // Define the plots to be read. - for(int i = 0; i < plots.length; i++) { - plots[i][0].scale(scaleFactor); - plots[i][1].scale(scaleFactor); - module.addPlot1D(new FormattedPlot1D(plots[i][0], plotColor, xTitles[i], yTitle, titles[i])); - module.addPlot1D(new FormattedPlot1D(plots[i][1], plotColor, xTitles[i], yTitle, titles[i] + fiducial)); - } - for(int i = 0; i < plots2D.length; i++) { - plots2D[i][0].scale(scaleFactor); - plots2D[i][1].scale(scaleFactor); - module.addPlot2D(new FormattedPlot2D(plots2D[i][0], false, xTitles2D[i], yTitles2D[i], titles2D[i])); - module.addPlot2D(new FormattedPlot2D(plots2D[i][1], false, xTitles2D[i], yTitles2D[i], titles2D[i] + fiducial)); - } - - // Display the plots. - //module.displayPlots(); - module.savePlots("C:\\Users\\Kyle\\Desktop\\EnergyShift\\run-5772\\RafoPlots\\"); - module.exportPlots("C:\\Users\\Kyle\\Desktop\\EnergyShift\\run-5772\\RafoPlots\\"); - - // Close the tree. - tree.close(); - } + /** + * Loads all plots in a file and formats them according to the + * indicated style. + * @param args - Unused default executable parameter. + * @throws IOException Occurs if there is an issue opening the file. + */ + public static void main(String[] args) throws IOException { + // Define the root directory for the plots. + String rootDir = "D:\\cygwin64\\home\\Kyle\\"; + + // Define the new name of the file containing the trigger plots. + String plotFile = rootDir + "mte-out.aida"; + + // Get the plots file and open it. + IAnalysisFactory af = IAnalysisFactory.create(); + ITree tree = af.createTreeFactory().create(plotFile); + if(tree == null) { throw new IllegalArgumentException("Unable to load plot file."); } + + // Declare the histogram names. + String energySumName = "Energy Sum"; + String timeCoincidenceName = "Time Coincidence"; + String timeEnergy2DName = "Cluster Time vs. Cluster Energy"; + String hCoplanaritySum2DName = "Hardware Coplanarity vs. Energy Sum"; + String coplanaritySum2DName = "Calculated Coplanarity vs. Energy Sum"; + String energySum2DName = "Top Cluster Energy vs. Bottom Cluster Energy"; + String fiducial = " (Fiducial Region)"; + + // Get the histograms. + IHistogram1D[] energySum = { + (IHistogram1D) tree.find("Trident/" + energySumName), + (IHistogram1D) tree.find("Trident/" + energySumName + fiducial) + }; + IHistogram1D[] timeCoincidence = { + (IHistogram1D) tree.find("Trident/" + timeCoincidenceName), + (IHistogram1D) tree.find("Trident/" + timeCoincidenceName + fiducial) + }; + IHistogram2D[] coplanaritySum = { + (IHistogram2D) tree.find("Trident/" + coplanaritySum2DName), + (IHistogram2D) tree.find("Trident/" + coplanaritySum2DName + fiducial) + }; + IHistogram2D[] hcoplanaritySum = { + (IHistogram2D) tree.find("Trident/" + hCoplanaritySum2DName), + (IHistogram2D) tree.find("Trident/" + hCoplanaritySum2DName + fiducial) + }; + IHistogram2D[] energySum2D = { + (IHistogram2D) tree.find("Trident/" + energySum2DName), + (IHistogram2D) tree.find("Trident/" + energySum2DName + fiducial) + }; + IHistogram2D[] timeEnergy = { + (IHistogram2D) tree.find("Trident/" + timeEnergy2DName), + (IHistogram2D) tree.find("Trident/" + timeEnergy2DName + fiducial) + }; + + // Define the scaling factors for each plot. + double scaleFactor = 19000.0 / 9736969.0; + + // Define the plot titles and arrays for 1D plots. + IHistogram1D[][] plots = { energySum, timeCoincidence }; + String titles[] = { energySumName, timeCoincidenceName, coplanaritySum2DName, hCoplanaritySum2DName, energySum2DName, timeEnergy2DName }; + String[] xTitles = { "Energy (GeV)", "Time Difference (ns)" }; + String yTitle = "Rate (Hz)"; + + // Define the plot titles and arrays for 2D plots. + IHistogram2D[][] plots2D = { coplanaritySum, hcoplanaritySum, energySum2D, timeEnergy }; + String[] titles2D = { coplanaritySum2DName, hCoplanaritySum2DName, energySum2DName, timeEnergy2DName }; + String[] xTitles2D = { "Coplanarity (Degrees)", "Coplanarity (Degrees)", "Top Cluster Energy (GeV)", "Time Coincidence (ns)" }; + String[] yTitles2D = { "Energy Sum (GeV)", "Energy Sum (GeV)", "Bottom Cluster Energy (GeV)", "Energy Sum (GeV)" }; + String zTitle2D = "Rate (Hz)"; + + // Create a plot formatting module. + PlotFormatModule module = new PlotFormatModule(); + + // Define the plot color. + ColorStyle plotColor = ColorStyle.MS_BLUE; + + // Define the plots to be read. + for(int i = 0; i < plots.length; i++) { + plots[i][0].scale(scaleFactor); + plots[i][1].scale(scaleFactor); + module.addPlot1D(new FormattedPlot1D(plots[i][0], plotColor, xTitles[i], yTitle, titles[i])); + module.addPlot1D(new FormattedPlot1D(plots[i][1], plotColor, xTitles[i], yTitle, titles[i] + fiducial)); + } + for(int i = 0; i < plots2D.length; i++) { + plots2D[i][0].scale(scaleFactor); + plots2D[i][1].scale(scaleFactor); + module.addPlot2D(new FormattedPlot2D(plots2D[i][0], false, xTitles2D[i], yTitles2D[i], titles2D[i])); + module.addPlot2D(new FormattedPlot2D(plots2D[i][1], false, xTitles2D[i], yTitles2D[i], titles2D[i] + fiducial)); + } + + // Display the plots. + //module.displayPlots(); + module.savePlots("C:\\Users\\Kyle\\Desktop\\EnergyShift\\run-5772\\RafoPlots\\"); + module.exportPlots("C:\\Users\\Kyle\\Desktop\\EnergyShift\\run-5772\\RafoPlots\\"); + + // Close the tree. + tree.close(); + } } Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/SingleTriggerPlotsFormatter.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/SingleTriggerPlotsFormatter.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/SingleTriggerPlotsFormatter.java Tue Sep 27 08:50:14 2016 @@ -13,151 +13,151 @@ import hep.aida.ITree; public class SingleTriggerPlotsFormatter { - - public static void main(String[] args) throws IllegalArgumentException, IOException { - // Define the root directory for the plots. - String rootDir = "D:\\cygwin64\\home\\Kyle\\"; - - // Define the new name of the file containing the trigger plots. - String plotFile = rootDir + "trident-readout-full.aida"; - - // Get the plots file and open it. - IAnalysisFactory af = IAnalysisFactory.create(); - ITree tree = af.createTreeFactory().create(plotFile); - if(tree == null) { throw new IllegalArgumentException("Unable to load plot file."); } - - // Define plots variables. - int UNCUT = 0; - int TRIGGERED = 1; - String[] plotsDir = { "NoCuts/", "PassedAll/" }; - int PLOT_HIT_COUNT = 0; - int PLOT_SEED_ENERGY = 1; - int PLOT_CLUSTER_ENERGY = 2; - int PLOT_COPLANARITY = 3; - int PLOT_ENERGY_SUM = 4; - int PLOT_ENERGY_DIFF = 5; - int PLOT_ENERGY_SLOPE = 6; - int PLOT_SEED_DIST = 0; - int PLOT_ENERGY_SUM_2D = 1; - - // Define the internal plot names. - String[] plotNameInternal1D = new String[7]; - String[] plotNameInternal2D = new String[2]; - plotNameInternal1D[PLOT_HIT_COUNT] = "Cluster Hit Count"; - plotNameInternal1D[PLOT_SEED_ENERGY] = "Cluster Seed Energy"; - plotNameInternal1D[PLOT_CLUSTER_ENERGY] = "Cluster Total Energy"; - plotNameInternal1D[PLOT_COPLANARITY] = "Pair Coplanarity"; - plotNameInternal1D[PLOT_ENERGY_SUM] = "Pair Energy Sum"; - plotNameInternal1D[PLOT_ENERGY_DIFF] = "Pair Energy Difference"; - plotNameInternal1D[PLOT_ENERGY_SLOPE] = "Pair Energy Slope"; - plotNameInternal2D[PLOT_SEED_DIST] = "Cluster Seed"; - plotNameInternal2D[PLOT_ENERGY_SUM_2D] = "Pair Energy Sum 2D"; - - // Define the plot display names. - String[] plotName1D = new String[7]; - String[] plotName2D = new String[2]; - for(int j = 0; j < plotNameInternal1D.length; j++) { - plotName1D[j] = plotNameInternal1D[j]; - } - for(int j = 0; j < plotNameInternal2D.length; j++) { - plotName2D[j] = plotNameInternal2D[j]; - } - plotName1D[PLOT_ENERGY_SUM] = "1D Pair Energy Sum"; - plotName2D[PLOT_SEED_DIST] = "Cluster Seed Distribution"; - plotName2D[PLOT_ENERGY_SUM_2D] = "2D Pair Energy Sum"; - - String[] xTitles1D = new String[plotName1D.length]; - String[] xTitles2D = new String[plotName2D.length]; - xTitles1D[PLOT_HIT_COUNT] = "Hit Count"; - xTitles1D[PLOT_SEED_ENERGY] = "Seed Energy (GeV)"; - xTitles1D[PLOT_CLUSTER_ENERGY] = "Cluster Energy (GeV)"; - xTitles1D[PLOT_COPLANARITY] = "Coplanarity Angle (Degrees)"; - xTitles1D[PLOT_ENERGY_SUM] = "Energy Sum (GeV)"; - xTitles1D[PLOT_ENERGY_DIFF] = "Energy Difference (GeV)"; - xTitles1D[PLOT_ENERGY_SLOPE] = "Energy Slope (GeV)"; - xTitles2D[PLOT_SEED_DIST] = "x-Index"; - xTitles2D[PLOT_ENERGY_SUM_2D] = "First Cluster Energy (GeV)"; - String yTitle1D = "Count"; - String[] yTitles2D = new String[plotName2D.length]; - yTitles2D[PLOT_SEED_DIST] = "y-Index"; - yTitles2D[PLOT_ENERGY_SUM_2D] = "Second Cluster Energy (GeV)"; - - // Define axis ranges. - double[] axisRanges1D = new double[plotName1D.length]; - axisRanges1D[PLOT_HIT_COUNT] = -1; - axisRanges1D[PLOT_SEED_ENERGY] = 1.1; - axisRanges1D[PLOT_CLUSTER_ENERGY] = 1.1; - axisRanges1D[PLOT_COPLANARITY] = 180; - axisRanges1D[PLOT_ENERGY_SUM] = 2.2; - axisRanges1D[PLOT_ENERGY_DIFF] = 1.1; - axisRanges1D[PLOT_ENERGY_SLOPE] = 2.4; - double[] xAxisRanges2D = new double[plotName2D.length]; - double[] yAxisRanges2D = new double[plotName2D.length]; - xAxisRanges2D[PLOT_SEED_DIST] = -1; - xAxisRanges2D[PLOT_ENERGY_SUM_2D] = 1.1; - yAxisRanges2D[PLOT_SEED_DIST] = -1; - yAxisRanges2D[PLOT_ENERGY_SUM_2D] = 1.1; - - // Define the plot names. - String[][] plotLocations1D = new String[plotsDir.length][plotNameInternal1D.length]; - String[][] plotLocations2D = new String[plotsDir.length][plotNameInternal2D.length]; - for(int i = 0; i < plotsDir.length; i++) { - for(int j = 0; j < plotNameInternal1D.length; j++) { - plotLocations1D[i][j] = plotsDir[i] + plotNameInternal1D[j]; - } - } - for(int i = 0; i < plotsDir.length; i++) { - for(int j = 0; j < plotNameInternal2D.length; j++) { - plotLocations2D[i][j] = plotsDir[i] + plotNameInternal2D[j]; - } - } - - // Create a plot formatting module. - PlotFormatModule module = new PlotFormatModule(); - - // Load the plot objects. - for(int i = 0; i < plotName1D.length; i++) { - // Get the uncut and triggered plots. - IHistogram1D uncutPlot = (IHistogram1D) tree.find(plotLocations1D[UNCUT][i]); - IHistogram1D triggeredPlot = (IHistogram1D) tree.find(plotLocations1D[TRIGGERED][i] + " (Passed All Cuts)"); - - // Make a formatted plot for each. - FormattedPlot1D uncutFormattedPlot; - FormattedPlot1D triggeredFormattedPlot; - if(axisRanges1D[i] != -1) { - uncutFormattedPlot = new FormattedPlot1D(uncutPlot, PlotsFormatter.ColorStyle.GREY, xTitles1D[i], yTitle1D, plotName1D[i] + " (No Cuts)", axisRanges1D[i]); - triggeredFormattedPlot = new FormattedPlot1D(triggeredPlot, PlotsFormatter.ColorStyle.MS_GREEN, xTitles1D[i], yTitle1D, plotName1D[i] + " (Triggered)", axisRanges1D[i]); - } else { - uncutFormattedPlot = new FormattedPlot1D(uncutPlot, PlotsFormatter.ColorStyle.GREY, xTitles1D[i], yTitle1D, plotName1D[i] + " (No Cuts)"); - triggeredFormattedPlot = new FormattedPlot1D(triggeredPlot, PlotsFormatter.ColorStyle.MS_GREEN, xTitles1D[i], yTitle1D, plotName1D[i] + " (Triggered)"); - } - - // Add the plots to the module. - module.addPlot1D(uncutFormattedPlot); - module.addPlot1D(triggeredFormattedPlot); - } - for(int i = 0; i < plotName2D.length; i++) { - // Get the uncut and triggered plots. - IHistogram2D uncutPlot = (IHistogram2D) tree.find(plotLocations2D[UNCUT][i]); - IHistogram2D triggeredPlot = (IHistogram2D) tree.find(plotLocations2D[TRIGGERED][i] + " (Passed All Cuts)"); - - // Make a formatted plot for each. - FormattedPlot2D uncutFormattedPlot; - FormattedPlot2D triggeredFormattedPlot; - if(xAxisRanges2D[i] != -1) { - uncutFormattedPlot = new FormattedPlot2D(uncutPlot, true, xTitles2D[i], yTitles2D[i], plotName2D[i] + " (No Cuts)", xAxisRanges2D[i], yAxisRanges2D[i]); - triggeredFormattedPlot = new FormattedPlot2D(triggeredPlot, true, xTitles2D[i], yTitles2D[i], plotName2D[i] + " (Triggered)", xAxisRanges2D[i], yAxisRanges2D[i]); - } else { - uncutFormattedPlot = new FormattedPlot2D(uncutPlot, true, xTitles2D[i], yTitles2D[i], plotName2D[i] + " (No Cuts)"); - triggeredFormattedPlot = new FormattedPlot2D(triggeredPlot, true, xTitles2D[i], yTitles2D[i], plotName2D[i] + " (Triggered)"); - } - - // Add the plots to the module. - module.addPlot2D(uncutFormattedPlot); - module.addPlot2D(triggeredFormattedPlot); - } - - // Save the plots. - module.savePlots("C:\\Users\\Kyle\\Desktop\\EnergyShift\\MonteCarlo\\Trident\\Trigger\\"); - } + + public static void main(String[] args) throws IllegalArgumentException, IOException { + // Define the root directory for the plots. + String rootDir = "D:\\cygwin64\\home\\Kyle\\"; + + // Define the new name of the file containing the trigger plots. + String plotFile = rootDir + "trident-readout-full.aida"; + + // Get the plots file and open it. + IAnalysisFactory af = IAnalysisFactory.create(); + ITree tree = af.createTreeFactory().create(plotFile); + if(tree == null) { throw new IllegalArgumentException("Unable to load plot file."); } + + // Define plots variables. + int UNCUT = 0; + int TRIGGERED = 1; + String[] plotsDir = { "NoCuts/", "PassedAll/" }; + int PLOT_HIT_COUNT = 0; + int PLOT_SEED_ENERGY = 1; + int PLOT_CLUSTER_ENERGY = 2; + int PLOT_COPLANARITY = 3; + int PLOT_ENERGY_SUM = 4; + int PLOT_ENERGY_DIFF = 5; + int PLOT_ENERGY_SLOPE = 6; + int PLOT_SEED_DIST = 0; + int PLOT_ENERGY_SUM_2D = 1; + + // Define the internal plot names. + String[] plotNameInternal1D = new String[7]; + String[] plotNameInternal2D = new String[2]; + plotNameInternal1D[PLOT_HIT_COUNT] = "Cluster Hit Count"; + plotNameInternal1D[PLOT_SEED_ENERGY] = "Cluster Seed Energy"; + plotNameInternal1D[PLOT_CLUSTER_ENERGY] = "Cluster Total Energy"; + plotNameInternal1D[PLOT_COPLANARITY] = "Pair Coplanarity"; + plotNameInternal1D[PLOT_ENERGY_SUM] = "Pair Energy Sum"; + plotNameInternal1D[PLOT_ENERGY_DIFF] = "Pair Energy Difference"; + plotNameInternal1D[PLOT_ENERGY_SLOPE] = "Pair Energy Slope"; + plotNameInternal2D[PLOT_SEED_DIST] = "Cluster Seed"; + plotNameInternal2D[PLOT_ENERGY_SUM_2D] = "Pair Energy Sum 2D"; + + // Define the plot display names. + String[] plotName1D = new String[7]; + String[] plotName2D = new String[2]; + for(int j = 0; j < plotNameInternal1D.length; j++) { + plotName1D[j] = plotNameInternal1D[j]; + } + for(int j = 0; j < plotNameInternal2D.length; j++) { + plotName2D[j] = plotNameInternal2D[j]; + } + plotName1D[PLOT_ENERGY_SUM] = "1D Pair Energy Sum"; + plotName2D[PLOT_SEED_DIST] = "Cluster Seed Distribution"; + plotName2D[PLOT_ENERGY_SUM_2D] = "2D Pair Energy Sum"; + + String[] xTitles1D = new String[plotName1D.length]; + String[] xTitles2D = new String[plotName2D.length]; + xTitles1D[PLOT_HIT_COUNT] = "Hit Count"; + xTitles1D[PLOT_SEED_ENERGY] = "Seed Energy (GeV)"; + xTitles1D[PLOT_CLUSTER_ENERGY] = "Cluster Energy (GeV)"; + xTitles1D[PLOT_COPLANARITY] = "Coplanarity Angle (Degrees)"; + xTitles1D[PLOT_ENERGY_SUM] = "Energy Sum (GeV)"; + xTitles1D[PLOT_ENERGY_DIFF] = "Energy Difference (GeV)"; + xTitles1D[PLOT_ENERGY_SLOPE] = "Energy Slope (GeV)"; + xTitles2D[PLOT_SEED_DIST] = "x-Index"; + xTitles2D[PLOT_ENERGY_SUM_2D] = "First Cluster Energy (GeV)"; + String yTitle1D = "Count"; + String[] yTitles2D = new String[plotName2D.length]; + yTitles2D[PLOT_SEED_DIST] = "y-Index"; + yTitles2D[PLOT_ENERGY_SUM_2D] = "Second Cluster Energy (GeV)"; + + // Define axis ranges. + double[] axisRanges1D = new double[plotName1D.length]; + axisRanges1D[PLOT_HIT_COUNT] = -1; + axisRanges1D[PLOT_SEED_ENERGY] = 1.1; + axisRanges1D[PLOT_CLUSTER_ENERGY] = 1.1; + axisRanges1D[PLOT_COPLANARITY] = 180; + axisRanges1D[PLOT_ENERGY_SUM] = 2.2; + axisRanges1D[PLOT_ENERGY_DIFF] = 1.1; + axisRanges1D[PLOT_ENERGY_SLOPE] = 2.4; + double[] xAxisRanges2D = new double[plotName2D.length]; + double[] yAxisRanges2D = new double[plotName2D.length]; + xAxisRanges2D[PLOT_SEED_DIST] = -1; + xAxisRanges2D[PLOT_ENERGY_SUM_2D] = 1.1; + yAxisRanges2D[PLOT_SEED_DIST] = -1; + yAxisRanges2D[PLOT_ENERGY_SUM_2D] = 1.1; + + // Define the plot names. + String[][] plotLocations1D = new String[plotsDir.length][plotNameInternal1D.length]; + String[][] plotLocations2D = new String[plotsDir.length][plotNameInternal2D.length]; + for(int i = 0; i < plotsDir.length; i++) { + for(int j = 0; j < plotNameInternal1D.length; j++) { + plotLocations1D[i][j] = plotsDir[i] + plotNameInternal1D[j]; + } + } + for(int i = 0; i < plotsDir.length; i++) { + for(int j = 0; j < plotNameInternal2D.length; j++) { + plotLocations2D[i][j] = plotsDir[i] + plotNameInternal2D[j]; + } + } + + // Create a plot formatting module. + PlotFormatModule module = new PlotFormatModule(); + + // Load the plot objects. + for(int i = 0; i < plotName1D.length; i++) { + // Get the uncut and triggered plots. + IHistogram1D uncutPlot = (IHistogram1D) tree.find(plotLocations1D[UNCUT][i]); + IHistogram1D triggeredPlot = (IHistogram1D) tree.find(plotLocations1D[TRIGGERED][i] + " (Passed All Cuts)"); + + // Make a formatted plot for each. + FormattedPlot1D uncutFormattedPlot; + FormattedPlot1D triggeredFormattedPlot; + if(axisRanges1D[i] != -1) { + uncutFormattedPlot = new FormattedPlot1D(uncutPlot, PlotsFormatter.ColorStyle.GREY, xTitles1D[i], yTitle1D, plotName1D[i] + " (No Cuts)", 0, axisRanges1D[i]); + triggeredFormattedPlot = new FormattedPlot1D(triggeredPlot, PlotsFormatter.ColorStyle.MS_GREEN, xTitles1D[i], yTitle1D, plotName1D[i] + " (Triggered)", 0, axisRanges1D[i]); + } else { + uncutFormattedPlot = new FormattedPlot1D(uncutPlot, PlotsFormatter.ColorStyle.GREY, xTitles1D[i], yTitle1D, plotName1D[i] + " (No Cuts)"); + triggeredFormattedPlot = new FormattedPlot1D(triggeredPlot, PlotsFormatter.ColorStyle.MS_GREEN, xTitles1D[i], yTitle1D, plotName1D[i] + " (Triggered)"); + } + + // Add the plots to the module. + module.addPlot1D(uncutFormattedPlot); + module.addPlot1D(triggeredFormattedPlot); + } + for(int i = 0; i < plotName2D.length; i++) { + // Get the uncut and triggered plots. + IHistogram2D uncutPlot = (IHistogram2D) tree.find(plotLocations2D[UNCUT][i]); + IHistogram2D triggeredPlot = (IHistogram2D) tree.find(plotLocations2D[TRIGGERED][i] + " (Passed All Cuts)"); + + // Make a formatted plot for each. + FormattedPlot2D uncutFormattedPlot; + FormattedPlot2D triggeredFormattedPlot; + if(xAxisRanges2D[i] != -1) { + uncutFormattedPlot = new FormattedPlot2D(uncutPlot, true, xTitles2D[i], yTitles2D[i], plotName2D[i] + " (No Cuts)", xAxisRanges2D[i], yAxisRanges2D[i]); + triggeredFormattedPlot = new FormattedPlot2D(triggeredPlot, true, xTitles2D[i], yTitles2D[i], plotName2D[i] + " (Triggered)", xAxisRanges2D[i], yAxisRanges2D[i]); + } else { + uncutFormattedPlot = new FormattedPlot2D(uncutPlot, true, xTitles2D[i], yTitles2D[i], plotName2D[i] + " (No Cuts)"); + triggeredFormattedPlot = new FormattedPlot2D(triggeredPlot, true, xTitles2D[i], yTitles2D[i], plotName2D[i] + " (Triggered)"); + } + + // Add the plots to the module. + module.addPlot2D(uncutFormattedPlot); + module.addPlot2D(triggeredFormattedPlot); + } + + // Save the plots. + module.savePlots("C:\\Users\\Kyle\\Desktop\\EnergyShift\\MonteCarlo\\Trident\\Trigger\\"); + } } Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/TridentTrackFormatter.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/TridentTrackFormatter.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/TridentTrackFormatter.java Tue Sep 27 08:50:14 2016 @@ -16,187 +16,187 @@ import hep.aida.ref.plotter.PlotterRegion; public class TridentTrackFormatter { - /** - * Loads all plots in a file and formats them according to the - * indicated style. - * @param args - Unused default executable parameter. - * @throws IOException Occurs if there is an issue opening the file. - */ - public static void main(String[] args) throws IOException { - // Define the root directory for the plots. - String rootDir = "D:\\cygwin64\\home\\Kyle\\tmp\\"; - - // Define the new name of the file containing the trigger plots. - String plotFile = rootDir + "trident-out.aida"; - - // Get the plots file and open it. - IAnalysisFactory af = IAnalysisFactory.create(); - ITree tree = af.createTreeFactory().create(plotFile); - if(tree == null) { throw new IllegalArgumentException("Unable to load plot file."); } - - // Declare the histogram names. - String trackName = "Tracks in Event (All)"; - String posTrackName = "Tracks in Event (Positive)"; - String negTrackName = "Tracks in Event (Negative)"; - String posMomentumName = "Momentum (Positive)"; - String negMomentumName = "Momentum (Negative)"; - String energySumName = "Energy Sum"; - String momentumSumName = "Momentum Sum"; - String energyMomentumDiffName = "Energy-Momentum Difference"; - String invariantMassName = "Invariant Mass"; - String energySum2DName = "2D Energy Sum"; - String momentumSum2DName = "2D Momentum Sum"; - String positionName = "Track Cluster Position"; - - // Get the histograms. - IHistogram1D[] tracks = { - (IHistogram1D) tree.find("Trident Analysis/All/" + trackName), - (IHistogram1D) tree.find("Trident Analysis/Cluster/" + trackName) - }; - IHistogram1D[] posTracks = { - (IHistogram1D) tree.find("Trident Analysis/All/" + posTrackName), - (IHistogram1D) tree.find("Trident Analysis/Cluster/" + posTrackName) - }; - IHistogram1D[] negTracks = { - (IHistogram1D) tree.find("Trident Analysis/All/" + negTrackName), - (IHistogram1D) tree.find("Trident Analysis/Cluster/" + negTrackName) - }; - IHistogram1D[] posMomentum = { - (IHistogram1D) tree.find("Trident Analysis/All/" + posMomentumName), - (IHistogram1D) tree.find("Trident Analysis/Cluster/" + posMomentumName) - }; - IHistogram1D[] negMomentum = { - (IHistogram1D) tree.find("Trident Analysis/All/" + negMomentumName), - (IHistogram1D) tree.find("Trident Analysis/Cluster/" + negMomentumName) - }; - IHistogram1D[] energySum = { - (IHistogram1D) tree.find("Trident Analysis/All/" + energySumName), - (IHistogram1D) tree.find("Trident Analysis/Cluster/" + energySumName) - }; - IHistogram1D[] momentumSum = { - (IHistogram1D) tree.find("Trident Analysis/All/" + momentumSumName), - (IHistogram1D) tree.find("Trident Analysis/Cluster/" + momentumSumName) - }; - IHistogram1D[] energyMomentumDiff = { - (IHistogram1D) tree.find("Trident Analysis/All/" + energyMomentumDiffName), - (IHistogram1D) tree.find("Trident Analysis/Cluster/" + energyMomentumDiffName) - }; - IHistogram1D[] invariantMass = { - (IHistogram1D) tree.find("Trident Analysis/All/" + invariantMassName), - (IHistogram1D) tree.find("Trident Analysis/Cluster/" + invariantMassName) - }; - IHistogram2D[] energySum2D = { - (IHistogram2D) tree.find("Trident Analysis/All/" + energySum2DName), - (IHistogram2D) tree.find("Trident Analysis/Cluster/" + energySum2DName) - }; - IHistogram2D[] momentumSum2D = { - (IHistogram2D) tree.find("Trident Analysis/All/" + momentumSum2DName), - (IHistogram2D) tree.find("Trident Analysis/Cluster/" + momentumSum2DName) - }; - IHistogram2D[] position = { - (IHistogram2D) tree.find("Trident Analysis/All/" + positionName), - (IHistogram2D) tree.find("Trident Analysis/Cluster/" + positionName) - }; - - // Re-bin the histograms to have 5-times larger bins. First, - // get the bin count and upper and lower bounds of the plot. - int bins = invariantMass[0].axis().bins(); - double low = invariantMass[0].axis().binLowerEdge(0); - double high = invariantMass[0].axis().binUpperEdge(invariantMass[0].axis().bins() - 1); - - // Create new plots with the larger bin sizes. - AIDA aida = AIDA.defaultInstance(); - IHistogram1D[] newPlot = new IHistogram1D[2]; - newPlot[0] = aida.histogram1D(invariantMassName, bins / 5, low, high); - newPlot[1] = aida.histogram1D("Cluster " + invariantMassName, bins / 5, low, high); - - // Populate the new plots with the data from the old ones. - for(int j = 0; j < 2; j++) { - for(int i = 0; i < bins; i++) { - int entries = invariantMass[j].binEntries(i); - double center = invariantMass[j].axis().binCenter(i); - for(int k = 0; k < entries; k++) { - newPlot[j].fill(center); - } - } - } - - // Replace the old plots. - invariantMass = newPlot; - - // Define the scaling factors for each plot. - double scaleFactor = 1; - - // Define the plot titles and arrays for 1D plots. - IHistogram[][] plots = { tracks, posTracks, negTracks, posMomentum, negMomentum, energySum, momentumSum, energyMomentumDiff, invariantMass }; - String[] titles = { trackName, posTrackName, negTrackName, posMomentumName, negMomentumName, energySumName, momentumSumName, - energyMomentumDiffName, invariantMassName }; - String[] xTitles = { "Tracks", "Tracks", "Tracks", "Momentum (GeV)", "Momentum (GeV)", "Energy Sum (GeV)", "Momentum Sum (GeV)", - "|E_Cluster - P_Track| (GeV)", "Invariant Mass (GeV)" }; - String yTitle = "Count"; - - // Define the plot titles and arrays for 2D plots. - IHistogram2D[][] plots2D = { energySum2D, momentumSum2D, position }; - String[] titles2D = { energySum2DName, momentumSum2DName, positionName }; - String[] xTitles2D = { "Positive Cluster Energy", "Positive Track Momentum", "x-Index" }; - String[] yTitles2D = { "Negative Cluster Energy", "Negative Track Momentum", "y-Index" }; - String zTitle2D = "Count"; - - // Create a plotter factory. - IPlotterFactory plotterFactory = af.createPlotterFactory(); - - // Format and display the basic histograms. - for(int i = 0; i < plots.length; i++) { - for(int j = 0; j < 2; j++) { - // Scale the histogram by the appropriate scaling factor. - plots[i][j].scale(1.0 / scaleFactor); - - // Create a plotter and plotting region for the plot. - IPlotter plotter = plotterFactory.create((j == 1 ? "Cluster " : "") + titles[i]); - plotter.createRegions(1); - plotter.region(0).plot(plots[i][j]); - - // Format the axis labels. - PlotterRegion region = (PlotterRegion) plotter.region(0); - region.getPlot().setTitle((j == 1 ? "Cluster " : "") + titles[i]); - region.getPlot().getXAxis().setLabel(xTitles[i]); - region.getPlot().getYAxis().setLabel(yTitle); - - // Format the fonts and general plot presentation. - PlotsFormatter.setDefault1DStyle(region, new ColorStyle[] { ColorStyle.GREY }); - - // Show the plot. - plotter.setParameter("plotterWidth", "2000"); - plotter.setParameter("plotterHeight", "1200"); - plotter.show(); - } - } - - // Format and display the 2D histogram. - for(int i = 0; i < plots2D.length; i++) { - for(int j = 0; j < 2; j++) { - plots2D[i][j].scale(1.0 / scaleFactor); - IPlotter plotter2D = plotterFactory.create((j == 1 ? "Cluster " : "") + titles2D[i]); - plotter2D.createRegions(1); - plotter2D.region(0).plot(plots2D[i][j]); - - // Format the axis labels. - PlotterRegion region2D = (PlotterRegion) plotter2D.region(0); - region2D.getPlot().setTitle((j == 1 ? "Cluster " : "") + titles2D[i]); - region2D.getPlot().getXAxis().setLabel(xTitles2D[i]); - region2D.getPlot().getYAxis().setLabel(yTitles2D[i]); - - // Format the fonts and general plot presentation. - PlotsFormatter.setDefault2DStyle(region2D, true); - - // Show the plot. - plotter2D.setParameter("plotterWidth", "2000"); - plotter2D.setParameter("plotterHeight", "1200"); - plotter2D.show(); - } - } - - // Close the tree. - tree.close(); - } + /** + * Loads all plots in a file and formats them according to the + * indicated style. + * @param args - Unused default executable parameter. + * @throws IOException Occurs if there is an issue opening the file. + */ + public static void main(String[] args) throws IOException { + // Define the root directory for the plots. + String rootDir = "D:\\cygwin64\\home\\Kyle\\tmp\\"; + + // Define the new name of the file containing the trigger plots. + String plotFile = rootDir + "trident-out.aida"; + + // Get the plots file and open it. + IAnalysisFactory af = IAnalysisFactory.create(); + ITree tree = af.createTreeFactory().create(plotFile); + if(tree == null) { throw new IllegalArgumentException("Unable to load plot file."); } + + // Declare the histogram names. + String trackName = "Tracks in Event (All)"; + String posTrackName = "Tracks in Event (Positive)"; + String negTrackName = "Tracks in Event (Negative)"; + String posMomentumName = "Momentum (Positive)"; + String negMomentumName = "Momentum (Negative)"; + String energySumName = "Energy Sum"; + String momentumSumName = "Momentum Sum"; + String energyMomentumDiffName = "Energy-Momentum Difference"; + String invariantMassName = "Invariant Mass"; + String energySum2DName = "2D Energy Sum"; + String momentumSum2DName = "2D Momentum Sum"; + String positionName = "Track Cluster Position"; + + // Get the histograms. + IHistogram1D[] tracks = { + (IHistogram1D) tree.find("Trident Analysis/All/" + trackName), + (IHistogram1D) tree.find("Trident Analysis/Cluster/" + trackName) + }; + IHistogram1D[] posTracks = { + (IHistogram1D) tree.find("Trident Analysis/All/" + posTrackName), + (IHistogram1D) tree.find("Trident Analysis/Cluster/" + posTrackName) + }; + IHistogram1D[] negTracks = { + (IHistogram1D) tree.find("Trident Analysis/All/" + negTrackName), + (IHistogram1D) tree.find("Trident Analysis/Cluster/" + negTrackName) + }; + IHistogram1D[] posMomentum = { + (IHistogram1D) tree.find("Trident Analysis/All/" + posMomentumName), + (IHistogram1D) tree.find("Trident Analysis/Cluster/" + posMomentumName) + }; + IHistogram1D[] negMomentum = { + (IHistogram1D) tree.find("Trident Analysis/All/" + negMomentumName), + (IHistogram1D) tree.find("Trident Analysis/Cluster/" + negMomentumName) + }; + IHistogram1D[] energySum = { + (IHistogram1D) tree.find("Trident Analysis/All/" + energySumName), + (IHistogram1D) tree.find("Trident Analysis/Cluster/" + energySumName) + }; + IHistogram1D[] momentumSum = { + (IHistogram1D) tree.find("Trident Analysis/All/" + momentumSumName), + (IHistogram1D) tree.find("Trident Analysis/Cluster/" + momentumSumName) + }; + IHistogram1D[] energyMomentumDiff = { + (IHistogram1D) tree.find("Trident Analysis/All/" + energyMomentumDiffName), + (IHistogram1D) tree.find("Trident Analysis/Cluster/" + energyMomentumDiffName) + }; + IHistogram1D[] invariantMass = { + (IHistogram1D) tree.find("Trident Analysis/All/" + invariantMassName), + (IHistogram1D) tree.find("Trident Analysis/Cluster/" + invariantMassName) + }; + IHistogram2D[] energySum2D = { + (IHistogram2D) tree.find("Trident Analysis/All/" + energySum2DName), + (IHistogram2D) tree.find("Trident Analysis/Cluster/" + energySum2DName) + }; + IHistogram2D[] momentumSum2D = { + (IHistogram2D) tree.find("Trident Analysis/All/" + momentumSum2DName), + (IHistogram2D) tree.find("Trident Analysis/Cluster/" + momentumSum2DName) + }; + IHistogram2D[] position = { + (IHistogram2D) tree.find("Trident Analysis/All/" + positionName), + (IHistogram2D) tree.find("Trident Analysis/Cluster/" + positionName) + }; + + // Re-bin the histograms to have 5-times larger bins. First, + // get the bin count and upper and lower bounds of the plot. + int bins = invariantMass[0].axis().bins(); + double low = invariantMass[0].axis().binLowerEdge(0); + double high = invariantMass[0].axis().binUpperEdge(invariantMass[0].axis().bins() - 1); + + // Create new plots with the larger bin sizes. + AIDA aida = AIDA.defaultInstance(); + IHistogram1D[] newPlot = new IHistogram1D[2]; + newPlot[0] = aida.histogram1D(invariantMassName, bins / 5, low, high); + newPlot[1] = aida.histogram1D("Cluster " + invariantMassName, bins / 5, low, high); + + // Populate the new plots with the data from the old ones. + for(int j = 0; j < 2; j++) { + for(int i = 0; i < bins; i++) { + int entries = invariantMass[j].binEntries(i); + double center = invariantMass[j].axis().binCenter(i); + for(int k = 0; k < entries; k++) { + newPlot[j].fill(center); + } + } + } + + // Replace the old plots. + invariantMass = newPlot; + + // Define the scaling factors for each plot. + double scaleFactor = 1; + + // Define the plot titles and arrays for 1D plots. + IHistogram[][] plots = { tracks, posTracks, negTracks, posMomentum, negMomentum, energySum, momentumSum, energyMomentumDiff, invariantMass }; + String[] titles = { trackName, posTrackName, negTrackName, posMomentumName, negMomentumName, energySumName, momentumSumName, + energyMomentumDiffName, invariantMassName }; + String[] xTitles = { "Tracks", "Tracks", "Tracks", "Momentum (GeV)", "Momentum (GeV)", "Energy Sum (GeV)", "Momentum Sum (GeV)", + "|E_Cluster - P_Track| (GeV)", "Invariant Mass (GeV)" }; + String yTitle = "Count"; + + // Define the plot titles and arrays for 2D plots. + IHistogram2D[][] plots2D = { energySum2D, momentumSum2D, position }; + String[] titles2D = { energySum2DName, momentumSum2DName, positionName }; + String[] xTitles2D = { "Positive Cluster Energy", "Positive Track Momentum", "x-Index" }; + String[] yTitles2D = { "Negative Cluster Energy", "Negative Track Momentum", "y-Index" }; + String zTitle2D = "Count"; + + // Create a plotter factory. + IPlotterFactory plotterFactory = af.createPlotterFactory(); + + // Format and display the basic histograms. + for(int i = 0; i < plots.length; i++) { + for(int j = 0; j < 2; j++) { + // Scale the histogram by the appropriate scaling factor. + plots[i][j].scale(1.0 / scaleFactor); + + // Create a plotter and plotting region for the plot. + IPlotter plotter = plotterFactory.create((j == 1 ? "Cluster " : "") + titles[i]); + plotter.createRegions(1); + plotter.region(0).plot(plots[i][j]); + + // Format the axis labels. + PlotterRegion region = (PlotterRegion) plotter.region(0); + region.getPlot().setTitle((j == 1 ? "Cluster " : "") + titles[i]); + region.getPlot().getXAxis().setLabel(xTitles[i]); + region.getPlot().getYAxis().setLabel(yTitle); + + // Format the fonts and general plot presentation. + PlotsFormatter.setDefault1DStyle(region, new ColorStyle[] { ColorStyle.GREY }, PlotsFormatter.DisplayStyle.BAR); + + // Show the plot. + plotter.setParameter("plotterWidth", "2000"); + plotter.setParameter("plotterHeight", "1200"); + plotter.show(); + } + } + + // Format and display the 2D histogram. + for(int i = 0; i < plots2D.length; i++) { + for(int j = 0; j < 2; j++) { + plots2D[i][j].scale(1.0 / scaleFactor); + IPlotter plotter2D = plotterFactory.create((j == 1 ? "Cluster " : "") + titles2D[i]); + plotter2D.createRegions(1); + plotter2D.region(0).plot(plots2D[i][j]); + + // Format the axis labels. + PlotterRegion region2D = (PlotterRegion) plotter2D.region(0); + region2D.getPlot().setTitle((j == 1 ? "Cluster " : "") + titles2D[i]); + region2D.getPlot().getXAxis().setLabel(xTitles2D[i]); + region2D.getPlot().getYAxis().setLabel(yTitles2D[i]); + + // Format the fonts and general plot presentation. + PlotsFormatter.setDefault2DStyle(region2D, true); + + // Show the plot. + plotter2D.setParameter("plotterWidth", "2000"); + plotter2D.setParameter("plotterHeight", "1200"); + plotter2D.show(); + } + } + + // Close the tree. + tree.close(); + } } Modified: java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/TriggerPlotsFormat.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/TriggerPlotsFormat.java (original) +++ java/trunk/users/src/main/java/org/hps/users/kmccarty/plots/formatter/TriggerPlotsFormat.java Tue Sep 27 08:50:14 2016 @@ -20,331 +20,331 @@ import hep.aida.ref.plotter.PlotterRegion; public class TriggerPlotsFormat { - // Define plot fonts. - private static final Font BASIC_FONT = new Font("Calibri", Font.PLAIN, 20); - private static final Font AXIS_FONT = new Font("Calibri", Font.BOLD, 25); - private static final Font TITLE_FONT = new Font("Calibri", Font.BOLD, 35); - - // Defines the color style options for plot data. - private enum ColorStyle { - MS_BLUE(new Color( 79, 129, 189), new Color( 36, 64, 97)), MS_ORANGE(new Color(247, 150, 70), new Color(152, 72, 6)), - MS_RED(new Color(192, 80, 77), new Color( 99, 36, 35)), GREY(new Color(166, 166, 166), new Color( 89, 89, 89)), - MS_GREEN(new Color(155, 187, 89), new Color( 79, 98, 40)), CRIMSON(new Color(161, 0, 0), new Color(104, 0, 0)), - RUST(new Color(161, 80, 0), new Color(105, 80, 0)), YELLOW(new Color(161, 161, 0), new Color(122, 109, 8)), - FOREST(new Color( 65, 102, 0), new Color( 37, 79, 0)), GREEN(new Color( 7, 132, 70), new Color( 7, 82, 30)), - TEAL(new Color( 0, 130, 130), new Color( 0, 90, 100)), CERULEAN(new Color( 0, 86, 130), new Color( 0, 28, 83)), - BLUE(new Color( 0, 33, 203), new Color( 0, 0, 137)), INDIGO(new Color( 68, 10, 127), new Color( 0, 0, 61)), - PURPLE(new Color(106, 0, 106), new Color( 63, 0, 56)), FUSCHIA(new Color(119, 0, 60), new Color( 60, 0, 60)); - - private final Color fillColor; - private final Color lineColor; - - private ColorStyle(Color fillColor, Color lineColor) { - this.fillColor = fillColor; - this.lineColor = lineColor; - } - - public Color getFillColor() { return fillColor; } - - public Color getLineColor() { return lineColor; } - }; - - /** - * Loads all plots in a file and formats them according to the - * indicated style. - * @param args - Unused default executable parameter. - * @throws IOException Occurs if there is an issue opening the file. - */ - public static void main(String[] args) throws IOException { - // Define the root directory for the plots. - String rootDir = "D:\\cygwin64\\home\\Kyle\\beam-plots\\base\\"; - //String rootDir = "D:\\cygwin64\\home\\Kyle\\aprime-plots\\base\\readout-plots\\"; - - // Define the new name of the file containing the trigger plots. - String[] plotFile = { - rootDir + "compiled-plots.aida" - //rootDir + "15-MeV\\compiled-plots.aida", - //rootDir + "20-MeV\\compiled-plots.aida", - //rootDir + "30-MeV\\compiled-plots.aida", - //rootDir + "40-MeV\\compiled-plots.aida", - //rootDir + "50-MeV\\compiled-plots.aida" - }; - - // Define the names of each plot. This will be used for the - // legend in the case of multiple plots. - String[] treeName = { - "Background", - "15 MeV A'", - "20 MeV A'", - "30 MeV A'", - "40 MeV A'", - "50 MeV A'" - }; - - // Define the color style for the plots. - ColorStyle[] dataColorStyle = { - ColorStyle.GREY, - ColorStyle.MS_GREEN, - ColorStyle.MS_BLUE, - ColorStyle.MS_ORANGE, - ColorStyle.MS_RED, - ColorStyle.TEAL, - ColorStyle.CRIMSON, - ColorStyle.FOREST - }; - - // Get the plots file and open it. - IAnalysisFactory af = IAnalysisFactory.create(); - ITree[] tree = new ITree[plotFile.length]; - for(int i = 0; i < plotFile.length; i++) { - tree[i] = af.createTreeFactory().create(plotFile[i]); - if(tree[i] == null) { throw new IllegalArgumentException("Unable to load plot file."); } - } - - // Get a list of all the histograms in the file. - List<List<String>> treeHistograms = new ArrayList<List<String>>(plotFile.length); - for(int i = 0; i < plotFile.length; i++) { - treeHistograms.add(getHistograms(tree[i], "/NoCuts/"));//, "/PassedAll/")); - } - - // Create a plotter factory. - IPlotterFactory plotterFactory = af.createPlotterFactory(); - - // Plot each histogram and format it. - for(String histogram : treeHistograms.get(0)) { - // Get the plot from the tree and verify that it is a 1D - // or 2D histogram. Other types are not supported. - IManagedObject histObject = tree[0].find(histogram); - if(!(histObject instanceof IHistogram1D) && !(histObject instanceof IHistogram2D)) { - continue; - } - - // Obtain the histogram object. - IBaseHistogram hist; - if(histObject instanceof IHistogram1D) { hist = (IHistogram1D) histObject; } - else { hist = (IHistogram2D) histObject; } - - // Define whether this is an overlay plot and whether - // this is a one or two dimensional plot. - boolean overlay = plotFile.length > 1; - boolean twoDimensional = hist instanceof IHistogram2D; - - // Generate the plotter and set its title. The plotter will - // use the title of the first tree's plot. - String plotTitle = hist.title(); - IPlotter plotter = plotterFactory.create(plotTitle); - - // For single plots and one-dimensional overlay plots, - // there should only be a single plotter region. - if(!twoDimensional || !overlay) { plotter.createRegions(1); } - - // For two-dimensional overlay plots, create a region for - // each plot individually. - else { plotter.createRegions(2, (int) Math.ceil(plotFile.length / 2.0)); } - - // Find the histogram in each of the trees and plot them - // all on the same region. - for(int i = 0; i < plotFile.length; i++) { - // Get the histogram from the tree. - IManagedObject treeObject = tree[i].find(histogram); - IBaseHistogram treeHist; - if(treeObject instanceof IHistogram1D) { treeHist = (IHistogram1D) treeObject; } - else { treeHist = (IHistogram2D) treeObject; } - - // Display the plot. - if(treeHist != null) { - // Set the title of plot to the name associated with - // its tree. This ensures that the correct name will - // appear on the legend. - if(plotFile.length > 1) { - treeHist.setTitle(treeName[i]); - } - - // Plot the tree's data in the plotter region. - if(!twoDimensional || !overlay) { plotter.region(0).plot(treeHist); } - else { - plotter.region(i).plot(treeHist); - setDefault2DStyle(((PlotterRegion) plotter.region(i)), dataColorStyle); - } - } - } - - // Format the plot region. - if(!twoDimensional) { setDefault1DStyle(((PlotterRegion) plotter.region(0)), dataColorStyle); } - else { setDefault2DStyle(((PlotterRegion) plotter.region(0)), dataColorStyle); } - - // Show the plotter. - plotter.region(0).setTitle(plotTitle); - plotter.setParameter("plotterWidth", "750"); - plotter.setParameter("plotterHeight", "600"); - //plotter.setParameter("plotterWidth", "2000"); - //plotter.setParameter("plotterHeight", "1200"); - plotter.show(); - } - - // Close the trees. - for(int i = 0; i < plotFile.length; i++) { - tree[i].close(); - } - } - - /** - * Sets the plot display formatting for 1D plots. - * @param region - The plotter region to format. - * @param color - The data color settings to use. - */ - private static final void setDefault1DStyle(PlotterRegion region, ColorStyle[] color) { - // Get the names of each plot on in the region. - String[] dataNames = region.getAllDataNames(); - - // Check whether this is an overlay plot. Overlay plots contain - // more than one data name. - boolean overlay = (dataNames.length > 1 ? true : false); - - // Iterate over each plot in the region. - for(int i = 0; i < dataNames.length; i++) { - // Set the overlay style if needed. - if(overlay) { - // Get the fill style for the current data type. - JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle(); - - // Set the histogram style to display thick-lined bars - // with no fill. The color is set by the "color" argument. - fillStyle.setHistogramFill(false); - fillStyle.setHistogramBarLineWidth(3); - fillStyle.setHistogramBarLineColor(color[i].getFillColor()); - - // Set the legend text style. - region.getPlot().getLegend().setFont(new Font("Calibri", Font.PLAIN, 20)); - } - - // Otherwise, set the fill style for a single plot. - else { - // Get the fill style for the current data type. - JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle(); - - // Set the histogram style to display thick-lined bars - // with a fill color. The colors are defined by the - // "color" argument. - fillStyle.setHistogramBarLineWidth(3); - fillStyle.setHistogramBarColor(color[i].getFillColor()); - fillStyle.setHistogramBarLineColor(color[i].getLineColor()); - } - - // Set the statistics box style. - region.getPlot().getStats().setVisible(true); - region.getPlot().getStats().setFont(BASIC_FONT); - - // Set the title font. - region.getPlot().getTitleObject().setFont(TITLE_FONT); - - // Set generic axis titles. - region.getPlot().getXAxis().setLabel("Data Label (Unit)"); - region.getPlot().getYAxis().setLabel("Count"); - - // Set the axis tick-mark fonts. - region.getPlot().getXAxis().setFont(BASIC_FONT); - region.getPlot().getYAxis().setFont(BASIC_FONT); - region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT); - region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT); - } - } - - /** - * Sets the plot display formatting for 1D plots. - * @param region - The plotter region to format. - * @param color - The data color settings to use. - */ - private static final void setDefault2DStyle(PlotterRegion region, ColorStyle[] color) { - // Get the fill style object. 2D plots should never be overlay - // plots, so there should only ever be one data name. - JASHist2DHistogramStyle fillStyle = (JASHist2DHistogramStyle) region.getDataForName(region.getAllDataNames()[0]).getStyle(); - - // Set the fill style for a two-dimensional plot. - fillStyle.setLogZ(true); - fillStyle.setHistStyle(JASHist2DHistogramStyle.STYLE_COLORMAP); - fillStyle.setColorMapScheme(JASHist2DHistogramStyle.COLORMAP_RAINBOW); - - // Make the statistics box invisible. - region.getPlot().getStats().setVisible(false); - - // Set the general plot font (which is also the z-axis font). - region.getPlot().setFont(BASIC_FONT); - - // Set the title font. - region.getPlot().getTitleObject().setFont(TITLE_FONT); - - // Set generic axis titles. - region.getPlot().getXAxis().setLabel("Data Label (Unit)"); - region.getPlot().getYAxis().setLabel("Data Label (Unit)"); - - // Set the axis tick-mark fonts. - region.getPlot().getXAxis().setFont(BASIC_FONT); - region.getPlot().getYAxis().setFont(BASIC_FONT); - region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT); - region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT); - } - - /** - * Gets a list of all objects that are not directories in a tree. - * @param tree - The tree from which to extract the object names. - * @return Returns the object names as <code>String</code> objects - * in a <code>List</code> collection. - */ - private static final List<String> getHistograms(ITree tree) { - return getHistograms(tree, "/"); - } - - /** - * Gets a list of all objects that are not directories in a tree. - * @param tree - The tree from which to extract the object names. - * @return Returns the object names as <code>String</code> objects - * in a <code>List</code> collection. - */ - private static final List<String> getHistograms(ITree tree, String rootDir) { - return getHistograms(tree, rootDir, new ArrayList<String>()); - } - - /** - * Recursive method that gets all object names from a tree that - * are not directories. Method should not be called directly, but - * rather called only through the <code>getHistograms(ITree)</code> - * method. - * @param tree - The tree from which to obtain the object names. - * @param directory - The directory in which to search for objects. - * @param list - The list in which to place the objects. - * @return Returns the <code>List</code> collection that was given - * as an argument. - */ - private static final List<String> getHistograms(ITree tree, String directory, List<String> list) { - // Get the list of objects in the directory. - String[] treeObjects = tree.listObjectNames(directory); - - // Print the objects. - for(String objectName : treeObjects) { - // Check if the object is a directory. - boolean isDirectory = isDirectory(objectName); - - // If the object is a directory, get the histograms from it. - if(isDirectory) { - getHistograms(tree, objectName, list); - } - - // If the object is a plot, add it to the list. - else { list.add(objectName); } - } - - // Return the list. - return list; - } - - /** - * Checks whether a tree object is a directory. - * @param object - The object to check. - * @return Returns <code>true</code> if the object is a directory - * and <code>false</code> otherwise. - */ - private static final boolean isDirectory(String object) { - return (object.toCharArray()[object.length() - 1] == '/'); - } + // Define plot fonts. + private static final Font BASIC_FONT = new Font("Calibri", Font.PLAIN, 20); + private static final Font AXIS_FONT = new Font("Calibri", Font.BOLD, 25); + private static final Font TITLE_FONT = new Font("Calibri", Font.BOLD, 35); + + // Defines the color style options for plot data. + private enum ColorStyle { + MS_BLUE(new Color( 79, 129, 189), new Color( 36, 64, 97)), MS_ORANGE(new Color(247, 150, 70), new Color(152, 72, 6)), + MS_RED(new Color(192, 80, 77), new Color( 99, 36, 35)), GREY(new Color(166, 166, 166), new Color( 89, 89, 89)), + MS_GREEN(new Color(155, 187, 89), new Color( 79, 98, 40)), CRIMSON(new Color(161, 0, 0), new Color(104, 0, 0)), + RUST(new Color(161, 80, 0), new Color(105, 80, 0)), YELLOW(new Color(161, 161, 0), new Color(122, 109, 8)), + FOREST(new Color( 65, 102, 0), new Color( 37, 79, 0)), GREEN(new Color( 7, 132, 70), new Color( 7, 82, 30)), + TEAL(new Color( 0, 130, 130), new Color( 0, 90, 100)), CERULEAN(new Color( 0, 86, 130), new Color( 0, 28, 83)), + BLUE(new Color( 0, 33, 203), new Color( 0, 0, 137)), INDIGO(new Color( 68, 10, 127), new Color( 0, 0, 61)), + PURPLE(new Color(106, 0, 106), new Color( 63, 0, 56)), FUSCHIA(new Color(119, 0, 60), new Color( 60, 0, 60)); + + private final Color fillColor; + private final Color lineColor; + + private ColorStyle(Color fillColor, Color lineColor) { + this.fillColor = fillColor; + this.lineColor = lineColor; + } + + public Color getFillColor() { return fillColor; } + + public Color getLineColor() { return lineColor; } + }; + + /** + * Loads all plots in a file and formats them according to the + * indicated style. + * @param args - Unused default executable parameter. + * @throws IOException Occurs if there is an issue opening the file. + */ + public static void main(String[] args) throws IOException { + // Define the root directory for the plots. + String rootDir = "D:\\cygwin64\\home\\Kyle\\beam-plots\\base\\"; + //String rootDir = "D:\\cygwin64\\home\\Kyle\\aprime-plots\\base\\readout-plots\\"; + + // Define the new name of the file containing the trigger plots. + String[] plotFile = { + rootDir + "compiled-plots.aida" + //rootDir + "15-MeV\\compiled-plots.aida", + //rootDir + "20-MeV\\compiled-plots.aida", + //rootDir + "30-MeV\\compiled-plots.aida", + //rootDir + "40-MeV\\compiled-plots.aida", + //rootDir + "50-MeV\\compiled-plots.aida" + }; + + // Define the names of each plot. This will be used for the + // legend in the case of multiple plots. + String[] treeName = { + "Background", + "15 MeV A'", + "20 MeV A'", + "30 MeV A'", + "40 MeV A'", + "50 MeV A'" + }; + + // Define the color style for the plots. + ColorStyle[] dataColorStyle = { + ColorStyle.GREY, + ColorStyle.MS_GREEN, + ColorStyle.MS_BLUE, + ColorStyle.MS_ORANGE, + ColorStyle.MS_RED, + ColorStyle.TEAL, + ColorStyle.CRIMSON, + ColorStyle.FOREST + }; + + // Get the plots file and open it. + IAnalysisFactory af = IAnalysisFactory.create(); + ITree[] tree = new ITree[plotFile.length]; + for(int i = 0; i < plotFile.length; i++) { + tree[i] = af.createTreeFactory().create(plotFile[i]); + if(tree[i] == null) { throw new IllegalArgumentException("Unable to load plot file."); } + } + + // Get a list of all the histograms in the file. + List<List<String>> treeHistograms = new ArrayList<List<String>>(plotFile.length); + for(int i = 0; i < plotFile.length; i++) { + treeHistograms.add(getHistograms(tree[i], "/NoCuts/"));//, "/PassedAll/")); + } + + // Create a plotter factory. + IPlotterFactory plotterFactory = af.createPlotterFactory(); + + // Plot each histogram and format it. + for(String histogram : treeHistograms.get(0)) { + // Get the plot from the tree and verify that it is a 1D + // or 2D histogram. Other types are not supported. + IManagedObject histObject = tree[0].find(histogram); + if(!(histObject instanceof IHistogram1D) && !(histObject instanceof IHistogram2D)) { + continue; + } + + // Obtain the histogram object. + IBaseHistogram hist; + if(histObject instanceof IHistogram1D) { hist = (IHistogram1D) histObject; } + else { hist = (IHistogram2D) histObject; } + + // Define whether this is an overlay plot and whether + // this is a one or two dimensional plot. + boolean overlay = plotFile.length > 1; + boolean twoDimensional = hist instanceof IHistogram2D; + + // Generate the plotter and set its title. The plotter will + // use the title of the first tree's plot. + String plotTitle = hist.title(); + IPlotter plotter = plotterFactory.create(plotTitle); + + // For single plots and one-dimensional overlay plots, + // there should only be a single plotter region. + if(!twoDimensional || !overlay) { plotter.createRegions(1); } + + // For two-dimensional overlay plots, create a region for + // each plot individually. + else { plotter.createRegions(2, (int) Math.ceil(plotFile.length / 2.0)); } + + // Find the histogram in each of the trees and plot them + // all on the same region. + for(int i = 0; i < plotFile.length; i++) { + // Get the histogram from the tree. + IManagedObject treeObject = tree[i].find(histogram); + IBaseHistogram treeHist; + if(treeObject instanceof IHistogram1D) { treeHist = (IHistogram1D) treeObject; } + else { treeHist = (IHistogram2D) treeObject; } + + // Display the plot. + if(treeHist != null) { + // Set the title of plot to the name associated with + // its tree. This ensures that the correct name will + // appear on the legend. + if(plotFile.length > 1) { + treeHist.setTitle(treeName[i]); + } + + // Plot the tree's data in the plotter region. + if(!twoDimensional || !overlay) { plotter.region(0).plot(treeHist); } + else { + plotter.region(i).plot(treeHist); + setDefault2DStyle(((PlotterRegion) plotter.region(i)), dataColorStyle); + } + } + } + + // Format the plot region. + if(!twoDimensional) { setDefault1DStyle(((PlotterRegion) plotter.region(0)), dataColorStyle); } + else { setDefault2DStyle(((PlotterRegion) plotter.region(0)), dataColorStyle); } + + // Show the plotter. + plotter.region(0).setTitle(plotTitle); + plotter.setParameter("plotterWidth", "750"); + plotter.setParameter("plotterHeight", "600"); + //plotter.setParameter("plotterWidth", "2000"); + //plotter.setParameter("plotterHeight", "1200"); + plotter.show(); + } + + // Close the trees. + for(int i = 0; i < plotFile.length; i++) { + tree[i].close(); + } + } + + /** + * Sets the plot display formatting for 1D plots. + * @param region - The plotter region to format. + * @param color - The data color settings to use. + */ + private static final void setDefault1DStyle(PlotterRegion region, ColorStyle[] color) { + // Get the names of each plot on in the region. + String[] dataNames = region.getAllDataNames(); + + // Check whether this is an overlay plot. Overlay plots contain + // more than one data name. + boolean overlay = (dataNames.length > 1 ? true : false); + + // Iterate over each plot in the region. + for(int i = 0; i < dataNames.length; i++) { + // Set the overlay style if needed. + if(overlay) { + // Get the fill style for the current data type. + JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle(); + + // Set the histogram style to display thick-lined bars + // with no fill. The color is set by the "color" argument. + fillStyle.setHistogramFill(false); + fillStyle.setHistogramBarLineWidth(3); + fillStyle.setHistogramBarLineColor(color[i].getFillColor()); + + // Set the legend text style. + region.getPlot().getLegend().setFont(new Font("Calibri", Font.PLAIN, 20)); + } + + // Otherwise, set the fill style for a single plot. + else { + // Get the fill style for the current data type. + JASHist1DHistogramStyle fillStyle = (JASHist1DHistogramStyle) region.getDataForName(dataNames[i]).getStyle(); + + // Set the histogram style to display thick-lined bars + // with a fill color. The colors are defined by the + // "color" argument. + fillStyle.setHistogramBarLineWidth(3); + fillStyle.setHistogramBarColor(color[i].getFillColor()); + fillStyle.setHistogramBarLineColor(color[i].getLineColor()); + } + + // Set the statistics box style. + region.getPlot().getStats().setVisible(true); + region.getPlot().getStats().setFont(BASIC_FONT); + + // Set the title font. + region.getPlot().getTitleObject().setFont(TITLE_FONT); + + // Set generic axis titles. + region.getPlot().getXAxis().setLabel("Data Label (Unit)"); + region.getPlot().getYAxis().setLabel("Count"); + + // Set the axis tick-mark fonts. + region.getPlot().getXAxis().setFont(BASIC_FONT); + region.getPlot().getYAxis().setFont(BASIC_FONT); + region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT); + region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT); + } + } + + /** + * Sets the plot display formatting for 1D plots. + * @param region - The plotter region to format. + * @param color - The data color settings to use. + */ + private static final void setDefault2DStyle(PlotterRegion region, ColorStyle[] color) { + // Get the fill style object. 2D plots should never be overlay + // plots, so there should only ever be one data name. + JASHist2DHistogramStyle fillStyle = (JASHist2DHistogramStyle) region.getDataForName(region.getAllDataNames()[0]).getStyle(); + + // Set the fill style for a two-dimensional plot. + fillStyle.setLogZ(true); + fillStyle.setHistStyle(JASHist2DHistogramStyle.STYLE_COLORMAP); + fillStyle.setColorMapScheme(JASHist2DHistogramStyle.COLORMAP_RAINBOW); + + // Make the statistics box invisible. + region.getPlot().getStats().setVisible(false); + + // Set the general plot font (which is also the z-axis font). + region.getPlot().setFont(BASIC_FONT); + + // Set the title font. + region.getPlot().getTitleObject().setFont(TITLE_FONT); + + // Set generic axis titles. + region.getPlot().getXAxis().setLabel("Data Label (Unit)"); + region.getPlot().getYAxis().setLabel("Data Label (Unit)"); + + // Set the axis tick-mark fonts. + region.getPlot().getXAxis().setFont(BASIC_FONT); + region.getPlot().getYAxis().setFont(BASIC_FONT); + region.getPlot().getXAxis().getLabelObject().setFont(AXIS_FONT); + region.getPlot().getYAxis().getLabelObject().setFont(AXIS_FONT); + } + + /** + * Gets a list of all objects that are not directories in a tree. + * @param tree - The tree from which to extract the object names. + * @return Returns the object names as <code>String</code> objects + * in a <code>List</code> collection. + */ + private static final List<String> getHistograms(ITree tree) { + return getHistograms(tree, "/"); + } + + /** + * Gets a list of all objects that are not directories in a tree. + * @param tree - The tree from which to extract the object names. + * @return Returns the object names as <code>String</code> objects + * in a <code>List</code> collection. + */ + private static final List<String> getHistograms(ITree tree, String rootDir) { + return getHistograms(tree, rootDir, new ArrayList<String>()); + } + + /** + * Recursive method that gets all object names from a tree that + * are not directories. Method should not be called directly, but + * rather called only through the <code>getHistograms(ITree)</code> + * method. + * @param tree - The tree from which to obtain the object names. + * @param directory - The directory in which to search for objects. + * @param list - The list in which to place the objects. + * @return Returns the <code>List</code> collection that was given + * as an argument. + */ + private static final List<String> getHistograms(ITree tree, String directory, List<String> list) { + // Get the list of objects in the directory. + String[] treeObjects = tree.listObjectNames(directory); + + // Print the objects. + for(String objectName : treeObjects) { + // Check if the object is a directory. + boolean isDirectory = isDirectory(objectName); + + // If the object is a directory, get the histograms from it. + if(isDirectory) { + getHistograms(tree, objectName, list); + } + + // If the object is a plot, add it to the list. + else { list.add(objectName); } + } + + // Return the list. + return list; + } + + /** + * Checks whether a tree object is a directory. + * @param object - The object to check. + * @return Returns <code>true</code> if the object is a directory + * and <code>false</code> otherwise. + */ + private static final boolean isDirectory(String object) { + return (object.toCharArray()[object.length() - 1] == '/'); + } }