Author: [log in to unmask] Date: Wed Dec 2 21:01:47 2015 New Revision: 4006 Log: Merge trunk changes into branch. Added: java/branches/jeremy-dev/users/src/main/java/org/hps/users/meeg/TrackCleanupDriver.java - copied unchanged from r4005, java/trunk/users/src/main/java/org/hps/users/meeg/TrackCleanupDriver.java Modified: java/branches/jeremy-dev/ (props changed) java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/dataquality/TrackingMonitoring.java java/branches/jeremy-dev/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ClusterEnergyCorrection.java java/branches/jeremy-dev/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ClusterUtilities.java java/branches/jeremy-dev/recon/src/main/java/org/hps/recon/filtering/V0CandidateFilter.java java/branches/jeremy-dev/recon/src/main/java/org/hps/recon/particle/ReconParticleDriver.java java/branches/jeremy-dev/run-database/src/main/java/org/hps/run/database/RunDatabaseBuilder.java java/branches/jeremy-dev/steering-files/src/main/resources/org/hps/steering/production/V0CandidateFilter.lcsim java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/HelicalTrackHitDriver.java java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/TrackData.java java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/TrackUtils.java Modified: java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/dataquality/TrackingMonitoring.java ============================================================================= --- java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/dataquality/TrackingMonitoring.java (original) +++ java/branches/jeremy-dev/analysis/src/main/java/org/hps/analysis/dataquality/TrackingMonitoring.java Wed Dec 2 21:01:47 2015 @@ -571,7 +571,7 @@ IHistogram1D hitTimeResidual = getSensorPlot(plotDir + trackCollectionName + "/" + triggerType + "/" + timeresidDir + "hitTimeResidual_", getNiceSensorName(sensor)); IFitResult result = fitGaussian(hitTimeResidual, fitter, "range=\"(-20.0,20.0)\""); if (result != null) { - LOGGER.info(String.format("%s\t%f\t%f\t%d\t%d", getNiceSensorName(sensor), result.fittedParameters()[1], result.fittedParameters()[2], sensor.getFebID(), sensor.getFebHybridID())); + System.out.format("%s\t%f\t%f\t%d\t%d\t%f\n", getNiceSensorName(sensor), result.fittedParameters()[1], result.fittedParameters()[2], sensor.getFebID(), sensor.getFebHybridID(), sensor.getT0Shift()); } } Modified: java/branches/jeremy-dev/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ClusterEnergyCorrection.java ============================================================================= --- java/branches/jeremy-dev/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ClusterEnergyCorrection.java (original) +++ java/branches/jeremy-dev/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ClusterEnergyCorrection.java Wed Dec 2 21:01:47 2015 @@ -1,7 +1,14 @@ package org.hps.recon.ecal.cluster; +import hep.physics.vec.Hep3Vector; + +import org.hps.detector.ecal.EcalCrystal; +import org.hps.detector.ecal.HPSEcalDetectorElement; +import org.jdom.DataConversionException; +//import org.hps.recon.tracking.TrackUtils; import org.lcsim.event.Cluster; import org.lcsim.event.base.BaseCluster; +import org.lcsim.geometry.subdetector.HPSEcal3; /** * This is the cluster energy correction requiring the particle id @@ -13,61 +20,129 @@ * @author Jeremy McCormick <[log in to unmask]> */ public final class ClusterEnergyCorrection { - - // Variables for electron energy corrections. - //Updated with recent monte carlo --7AUG15 HS. - //Old values from 2014-2015 commented out to right. - static final double ELECTRON_ENERGY_A = 0.01004;//-0.0027; - static final double ELECTRON_ENERGY_B = -0.122;//-0.06; - static final double ELECTRON_ENERGY_C = 0.9646;//0.95; - + + // Variables for electron energy corrections. + static final double par0_em = 0.009051; + static final double par1_em[] = {35,-0.1322,-0.0005613,16.42,0.3431,-2.021,74.85,-0.3626}; + static final double par2_em[] = {35, 0.9652, 0.003234, 18.06, 0.2592, 8.586, 75.08, -0.3771}; + // Variables for positron energy corrections. - static final double POSITRON_ENERGY_A = 0.00711;//-0.0096; - static final double POSITRON_ENERGY_B = -0.1154;//-0.042; - static final double POSITRON_ENERGY_C = 0.9614;//0.94; + static final double par0_ep = 0.01307; + static final double par1_ep[] = {35,-0.1415,-0.0008183,17.88,0.2886,-1.192,73.12,-0.3747}; + static final double par2_ep[] = {35, 0.9733, 0.003713, 18.19, 0.2557, 8.342, 72.44, -0.3834}; // Variables for photon energy corrections. - static final double PHOTON_ENERGY_A = 0.007595;//0.0015; - static final double PHOTON_ENERGY_B = -0.09766;//-0.047; - static final double PHOTON_ENERGY_C = 0.9512;//0.94; + static final double par0_p = 0.01604; + static final double par1_p[] = {35,-0.1268,-0.0008572,16.76,0.2784,-0.07232,72.88,-0.1685}; + static final double par2_p[] = {35, 0.965, 0.004, 18.05, 0.24, 3.027, 74.93, -0.3221}; /** * Calculate the corrected energy for the cluster. * @param cluster The input cluster. * @return The corrected energy. */ - public static double calculateCorrectedEnergy(Cluster cluster) { + public static double calculateCorrectedEnergy(HPSEcal3 ecal, Cluster cluster) { double rawE = cluster.getEnergy(); - return computeCorrectedEnergy(cluster.getParticleId(), rawE); + return computeCorrectedEnergy(ecal, cluster.getParticleId(), rawE, cluster.getPosition()[0], cluster.getPosition()[1]); + } + + /** + * Calculate the corrected energy for the cluster using track position at ecal. + * @param cluster The input cluster. + * @return The corrected energy. + */ + public static double calculateCorrectedEnergy(HPSEcal3 ecal, Cluster cluster, double ypos) { + double rawE = cluster.getEnergy(); + return computeCorrectedEnergy(ecal, cluster.getParticleId(), rawE, cluster.getPosition()[0], ypos); } /** * Calculate the corrected energy and set on the cluster. * @param cluster The input cluster. */ - public static void setCorrectedEnergy(BaseCluster cluster) { - double correctedEnergy = calculateCorrectedEnergy(cluster); + public static void setCorrectedEnergy(HPSEcal3 ecal, BaseCluster cluster) { + double correctedEnergy = calculateCorrectedEnergy(ecal, cluster); cluster.setEnergy(correctedEnergy); } - + + /** + * Calculate the corrected energy and set on the cluster. + * @param cluster The input cluster. + */ + + public static void setCorrectedEnergy(HPSEcal3 ecal, BaseCluster cluster, double ypos) { + double correctedEnergy = calculateCorrectedEnergy(ecal, cluster, ypos); + cluster.setEnergy(correctedEnergy); + } + /** * Calculates energy correction based on cluster raw energy and particle type as per * <a href="https://misportal.jlab.org/mis/physics/hps_notes/index.cfm?note_year=2014">HPS Note 2014-001</a> * @param pdg Particle id as per PDG * @param rawEnergy Raw Energy of the cluster (sum of hits with shared hit distribution) * @return Corrected Energy - */ - private static double computeCorrectedEnergy(int pdg, double rawEnergy) { - switch(pdg) { + */ + + private static double computeCorrectedEnergy(HPSEcal3 ecal, int pdg, double rawEnergy, double xpos, double ypos) { + //distance to beam gap edge + double r; + //Get these values from the Ecal geometry: + HPSEcalDetectorElement detElement = (HPSEcalDetectorElement) ecal.getDetectorElement(); +// double BEAMGAPTOP = 22.3;//ecal.getNode().getChild("layout").getAttribute("beamgapTop").getDoubleValue();//mm + double BEAMGAPTOP=20.0; + try { + BEAMGAPTOP = ecal.getNode().getChild("layout").getAttribute("beamgapTop").getDoubleValue(); + } catch (DataConversionException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + }//mm + double BEAMGAPBOT=-20.0; + try { + BEAMGAPBOT = -ecal.getNode().getChild("layout").getAttribute("beamgapBottom").getDoubleValue(); + } catch (DataConversionException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + }//mm + double BEAMGAPTOPC = BEAMGAPTOP + 13.0;//mm + double BEAMGAPBOTC = BEAMGAPBOT - 13.0;//mm + // x-coordinates of crystals on either side of row 1 cut out + EcalCrystal crystalM = detElement.getCrystal(-11, 1); + Hep3Vector posM = crystalM.getPositionFront(); + EcalCrystal crystalP = detElement.getCrystal(-1, 1); + Hep3Vector posP = crystalP.getPositionFront(); + + if ((xpos<posM.x())||(xpos>posP.x())){ + if (ypos>0){ + r = Math.abs(ypos-BEAMGAPTOP);} + else{ + r = Math.abs(ypos-BEAMGAPBOT);} + } + // crystals above row 1 cut out + else { + if (ypos>0){ + if (ypos>(par1_em[0]+BEAMGAPTOP)){ + r = Math.abs(ypos-BEAMGAPTOP);} + else{ + r = Math.abs(ypos-BEAMGAPTOPC);} + } + else { + if (ypos>(-par1_em[0]+BEAMGAPBOT)){ + r = Math.abs(ypos-BEAMGAPBOTC);} + else { + r = Math.abs(ypos-BEAMGAPBOT);} + } + } + + switch(pdg) { case 11: // electron - return computeCorrectedEnergy(rawEnergy, ELECTRON_ENERGY_A, ELECTRON_ENERGY_B, ELECTRON_ENERGY_C); + return computeCorrectedEnergy(r, rawEnergy, par0_em, par1_em, par2_em); case -11: // positron - return computeCorrectedEnergy(rawEnergy, POSITRON_ENERGY_A, POSITRON_ENERGY_B, POSITRON_ENERGY_C); + return computeCorrectedEnergy(r, rawEnergy, par0_ep, par1_ep, par2_ep); case 22: // photon - return computeCorrectedEnergy(rawEnergy, PHOTON_ENERGY_A, PHOTON_ENERGY_B, PHOTON_ENERGY_C); + return computeCorrectedEnergy(r, rawEnergy, par0_p, par1_p, par2_p); default: // unknown return rawEnergy; @@ -82,8 +157,10 @@ * @param A,B,C from fitting in note * @return Corrected Energy */ - private static double computeCorrectedEnergy(double rawEnergy, double varA, double varB, double varC){ - double corrEnergy = rawEnergy / (varA / rawEnergy + varB / (Math.sqrt(rawEnergy)) + varC); + private static double computeCorrectedEnergy(double y, double rawEnergy, double varA, double varB[], double varC[]){ + int ii = y<varB[0] ? 2 : 5; + double corrEnergy = rawEnergy / (varA / rawEnergy + (varB[1]-varB[ii]*Math.exp(-(y-varB[ii+1])*varB[ii+2])) / (Math.sqrt(rawEnergy)) + + (varC[1]-varC[ii]*Math.exp(-(y-varC[ii+1])*varC[ii+2]))); return corrEnergy; } } Modified: java/branches/jeremy-dev/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ClusterUtilities.java ============================================================================= --- java/branches/jeremy-dev/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ClusterUtilities.java (original) +++ java/branches/jeremy-dev/ecal-recon/src/main/java/org/hps/recon/ecal/cluster/ClusterUtilities.java Wed Dec 2 21:01:47 2015 @@ -334,7 +334,7 @@ * Apply HPS-specific energy and position corrections to a list of clusters in place. * @param clusters The list of clusters. */ - public static void applyCorrections(List<Cluster> clusters) { + public static void applyCorrections(HPSEcal3 ecal, List<Cluster> clusters) { // Loop over the clusters. for (Cluster cluster : clusters) { @@ -347,16 +347,16 @@ ClusterPositionCorrection.setCorrectedPosition(baseCluster); // Apply PID based energy correction. - ClusterEnergyCorrection.setCorrectedEnergy(baseCluster); - } - } - } - - /** - * Apply HPS-specific energy and position corrections to a cluster. - * @param cluster The input cluster. - */ - public static void applyCorrections(Cluster cluster) { + ClusterEnergyCorrection.setCorrectedEnergy(ecal, baseCluster); + } + } + } + + /** + * Apply HPS-specific energy and position corrections to a cluster without track information. + * @param cluster The input cluster. + */ + public static void applyCorrections(HPSEcal3 ecal, Cluster cluster) { if (cluster instanceof BaseCluster) { @@ -366,7 +366,25 @@ ClusterPositionCorrection.setCorrectedPosition(baseCluster); // Apply PID based energy correction. - ClusterEnergyCorrection.setCorrectedEnergy(baseCluster); + ClusterEnergyCorrection.setCorrectedEnergy(ecal, baseCluster); + } + } + + /** + * Apply HPS-specific energy and position corrections to a cluster with track information. + * @param cluster The input cluster. + */ + public static void applyCorrections(HPSEcal3 ecal, Cluster cluster, double ypos) { + + if (cluster instanceof BaseCluster) { + + BaseCluster baseCluster = (BaseCluster)cluster; + + // Apply PID based position correction, which should happen before final energy correction. + ClusterPositionCorrection.setCorrectedPosition(baseCluster); + + // Apply PID based energy correction. + ClusterEnergyCorrection.setCorrectedEnergy(ecal, baseCluster, ypos); } } Modified: java/branches/jeremy-dev/recon/src/main/java/org/hps/recon/filtering/V0CandidateFilter.java ============================================================================= --- java/branches/jeremy-dev/recon/src/main/java/org/hps/recon/filtering/V0CandidateFilter.java (original) +++ java/branches/jeremy-dev/recon/src/main/java/org/hps/recon/filtering/V0CandidateFilter.java Wed Dec 2 21:01:47 2015 @@ -4,15 +4,22 @@ import java.util.List; import org.hps.recon.ecal.cluster.ClusterUtilities; import org.hps.recon.particle.ReconParticleDriver; +import org.hps.recon.tracking.TrackData; +import org.hps.recon.tracking.TrackType; import org.hps.record.epics.EpicsData; +import org.hps.record.scalers.ScalerData; import org.lcsim.event.EventHeader; import org.lcsim.event.ReconstructedParticle; /** * Class to strip off trident candidates. Currently defined as: e+ e- events - * with tracks. If the tight constraint is enabled, tracks must be matched to - * clusters and the Ecal cluster times must be within _timingCut [2.5ns] of each - * other. + * with tracks; track and vertex chi2 must be better than values defined by + * cuts, and track times must be within trackDtCut of each other. If the tight + * constraint is enabled, tracks must be matched to clusters, the Ecal cluster + * times must be within _timingCut [2.5ns] of each other, and there must be + * exactly one V0 passing all cuts. + * + * Only GBL vertices are considered. * * @author Norman A Graf * @@ -20,8 +27,13 @@ */ public class V0CandidateFilter extends EventReconFilter { - private String _V0CandidateCollectionName = "TargetConstrainedV0Candidates"; + private String _V0CandidateCollectionName = "UnconstrainedV0Candidates"; private double _clusterTimingCut = 2.5; + private double v0Chi2Cut = 10.0; + private double trackChi2Cut = 20.0; + private double trackDtCut = 5.0; + private double trackPMax = 0.9; + private double v0PMax = 1.4; private boolean _tight = false; private boolean _keepEpicsDataEvents = false; @@ -30,9 +42,15 @@ protected void process(EventHeader event) { incrementEventProcessed(); if (_keepEpicsDataEvents) { - // don't drop any events with EPICS data: - final EpicsData data = EpicsData.read(event); - if (data != null) { + // don't drop any events with EPICS or scaler data: + final EpicsData epicsData = EpicsData.read(event); + if (epicsData != null) { + incrementEventPassed(); + return; + } + + final ScalerData scalerData = ScalerData.read(event); + if (scalerData != null) { incrementEventPassed(); return; } @@ -41,45 +59,96 @@ skipEvent(); } List<ReconstructedParticle> V0Candidates = event.get(ReconstructedParticle.class, _V0CandidateCollectionName); - if (V0Candidates.isEmpty()) { - skipEvent(); - } + int nV0 = 0; //number of good V0 + for (ReconstructedParticle v0 : V0Candidates) { + ReconstructedParticle electron = v0.getParticles().get(ReconParticleDriver.ELECTRON); + ReconstructedParticle positron = v0.getParticles().get(ReconParticleDriver.POSITRON); - // tight requires ONLY ONE real vertex fit - if (_tight) { - if (V0Candidates.size() != 2) { - skipEvent(); + if (!TrackType.isGBL(v0.getType())) { //we only care about GBL vertices + continue; } - for (ReconstructedParticle rp : V0Candidates) { - - ReconstructedParticle electron; - ReconstructedParticle positron; - - List<ReconstructedParticle> fsParticles = rp.getParticles(); - if (fsParticles.size() != 2) { - skipEvent(); + if (v0.getStartVertex().getChi2() > v0Chi2Cut) { + continue; + } + if (electron.getTracks().get(0).getChi2() > trackChi2Cut || positron.getTracks().get(0).getChi2() > trackChi2Cut) { + continue; + } + if (electron.getMomentum().magnitude() > trackPMax || positron.getMomentum().magnitude() > trackPMax) { + continue; + } + if (v0.getMomentum().magnitude() > v0PMax) { + continue; + } + double eleTime = TrackData.getTrackTime(TrackData.getTrackData(event, electron.getTracks().get(0))); + double posTime = TrackData.getTrackTime(TrackData.getTrackData(event, positron.getTracks().get(0))); + if (Math.abs(eleTime - posTime) > trackDtCut) { + continue; + } + if (_tight) { // tight requires cluster matches and cluster time cut + if (electron.getClusters().isEmpty() || positron.getClusters().isEmpty()) { + continue; } - // require both electrons to be associated with an ECal cluster - electron = fsParticles.get(ReconParticleDriver.ELECTRON); - if (electron.getClusters().isEmpty()) { - skipEvent(); - } - positron = fsParticles.get(ReconParticleDriver.POSITRON); - if (positron.getClusters().isEmpty()) { - skipEvent(); - } - // calorimeter cluster timing cut // first CalorimeterHit in the list is the seed crystal double t1 = ClusterUtilities.getSeedHitTime(electron.getClusters().get(0)); double t2 = ClusterUtilities.getSeedHitTime(positron.getClusters().get(0)); if (abs(t1 - t2) > _clusterTimingCut) { - skipEvent(); + continue; } } + nV0++; + } + if (nV0 == 0) { + skipEvent(); + } + // tight requires ONLY ONE candidate vertex + if (_tight && nV0 != 1) { + skipEvent(); } incrementEventPassed(); + } + + /** + * Maximum vertex chi2 for a V0 to be counted. + * + * @param v0Chi2Cut default of 10.0. + */ + public void setV0Chi2Cut(double v0Chi2Cut) { + this.v0Chi2Cut = v0Chi2Cut; + } + + /** + * Maximum track chi2 for a V0 to be counted. A V0 is rejected if either of + * the final state tracks has a chi2 exceeding the cut. + * + * @param trackChi2Cut default of 20.0. + */ + public void setTrackChi2Cut(double trackChi2Cut) { + this.trackChi2Cut = trackChi2Cut; + } + + /** + * Maximum track time different for a V0 to be counted. + * + * @param trackDtCut units of ns, default of 5.0 + */ + public void setTrackDtCut(double trackDtCut) { + this.trackDtCut = trackDtCut; + } + + /** + * Maximum track momentum for a V0 to be counted. A V0 is rejected if either + * of the final state tracks has momentum exceeding this cut. + * + * @param trackPMax units of GeV, default of 0.9 + */ + public void setTrackPMax(double trackPMax) { + this.trackPMax = trackPMax; + } + + public void setV0PMax(double v0PMax) { + this.v0PMax = v0PMax; } /** Modified: java/branches/jeremy-dev/recon/src/main/java/org/hps/recon/particle/ReconParticleDriver.java ============================================================================= --- java/branches/jeremy-dev/recon/src/main/java/org/hps/recon/particle/ReconParticleDriver.java (original) +++ java/branches/jeremy-dev/recon/src/main/java/org/hps/recon/particle/ReconParticleDriver.java Wed Dec 2 21:01:47 2015 @@ -7,13 +7,16 @@ import hep.physics.vec.VecOp; import java.util.ArrayList; +import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Set; import org.hps.recon.ecal.cluster.ClusterUtilities; import org.hps.recon.tracking.CoordinateTransformations; +import org.hps.recon.tracking.TrackUtils; import org.hps.recon.utils.TrackClusterMatcher; +import org.lcsim.event.CalorimeterHit; import org.lcsim.event.Cluster; import org.lcsim.event.EventHeader; import org.lcsim.event.ReconstructedParticle; @@ -23,6 +26,8 @@ import org.lcsim.event.base.BaseReconstructedParticle; import org.lcsim.geometry.Detector; import org.lcsim.util.Driver; +import org.lcsim.geometry.subdetector.HPSEcal3; + /** * Driver framework for generating reconstructed particles and matching clusters @@ -44,6 +49,8 @@ public static final int POSITRON = 1; public static final int MOLLER_TOP = 0; public static final int MOLLER_BOT = 1; + + HPSEcal3 ecal; /** * Sets the name of the LCIO collection for beam spot constrained V0 @@ -173,6 +180,8 @@ this.trackCollectionNames = trackCollectionNames; } + + /** * Updates the magnetic field parameters to match the appropriate values for * the current detector settings. @@ -188,6 +197,7 @@ flipSign = -1; } + ecal = (HPSEcal3) detector.getSubdetector("Ecal"); matcher.setBFieldMap(detector.getFieldMap()); } @@ -222,6 +232,9 @@ // Create a list of unmatched clusters. A cluster should be // removed from the list if a matching track is found. Set<Cluster> unmatchedClusters = new HashSet<Cluster>(clusters); + + // Create a mapping of matched clusters to corresponding tracks. + HashMap<Cluster, Track> clusterToTrack = new HashMap<Cluster,Track>(); // Loop through all of the track collections and try to match every // track to a cluster. Allow a cluster to be matched to multiple @@ -263,6 +276,9 @@ // Check if the cluster and track are a valid match. if (matcher.isMatch(cluster, track)) { + // Store the matched cluster to matched track. + clusterToTrack.put(cluster, track); + // Store the matched cluster. matchedCluster = cluster; @@ -315,10 +331,17 @@ } } - // Apply the corrections to the Ecal clusters + // Apply the corrections to the Ecal clusters using track information, if available for (Cluster cluster : clusters) { if (cluster.getParticleId() != 0) { - ClusterUtilities.applyCorrections(cluster); + if (clusterToTrack.containsKey(cluster)){ + Track matchedT = clusterToTrack.get(cluster); + double ypos = TrackUtils.getTrackStateAtECal(matchedT).getReferencePoint()[2]; + ClusterUtilities.applyCorrections(ecal, cluster, ypos); + } + else { + ClusterUtilities.applyCorrections(ecal, cluster); + } } } Modified: java/branches/jeremy-dev/run-database/src/main/java/org/hps/run/database/RunDatabaseBuilder.java ============================================================================= --- java/branches/jeremy-dev/run-database/src/main/java/org/hps/run/database/RunDatabaseBuilder.java (original) +++ java/branches/jeremy-dev/run-database/src/main/java/org/hps/run/database/RunDatabaseBuilder.java Wed Dec 2 21:01:47 2015 @@ -49,7 +49,7 @@ /** * Builds a complete {@link RunSummary} object from various data sources, including the data catalog and the run * spreadsheet, so that it is ready to be inserted into the run database using the DAO interfaces. This class also - * extracts EPICS data, scaler data, trigger config and SVT config information. + * extracts EPICS data, scaler data, trigger config and SVT config information from all of the EVIO files in a run. * <p> * The setters and some other methods follow the builder pattern and so can be chained by the caller. * Modified: java/branches/jeremy-dev/steering-files/src/main/resources/org/hps/steering/production/V0CandidateFilter.lcsim ============================================================================= --- java/branches/jeremy-dev/steering-files/src/main/resources/org/hps/steering/production/V0CandidateFilter.lcsim (original) +++ java/branches/jeremy-dev/steering-files/src/main/resources/org/hps/steering/production/V0CandidateFilter.lcsim Wed Dec 2 21:01:47 2015 @@ -22,12 +22,6 @@ <!-- Driver to strip events --> <driver name="StripEvent" type="org.hps.recon.filtering.V0CandidateFilter"> - <!-- Name of the V0 Candidate Collection of ReconstructedParticles --> - <v0CandidateCollectionName>TargetConstrainedV0Candidates</v0CandidateCollectionName> - <!-- Maximum difference in the ECal cluster times [ns]--> - <clusterTimingCut>2.5</clusterTimingCut> - <!-- A tight selection requires one and only one real V0 vertex --> - <tightConstraint>false</tightConstraint> <!-- Setting this true keeps ALL events containing EPICS data --> <keepEpicsDataEvents>true</keepEpicsDataEvents> </driver> Modified: java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/HelicalTrackHitDriver.java ============================================================================= --- java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/HelicalTrackHitDriver.java (original) +++ java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/HelicalTrackHitDriver.java Wed Dec 2 21:01:47 2015 @@ -427,7 +427,7 @@ Collection<TrackerHit> htsList = hittostrip.allFrom(cross); for (TrackerHit strip : htsList) { Set<HelicalTrackHit> sharedCrosses = hittostrip.allTo(strip); - System.out.println(sharedCrosses.size()); +// System.out.println(sharedCrosses.size()); if (sharedCrosses.size() > 1) { // this.getLogger().warning(String.format("removing possible ghost hit")); iter.remove(); Modified: java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/TrackData.java ============================================================================= --- java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/TrackData.java (original) +++ java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/TrackData.java Wed Dec 2 21:01:47 2015 @@ -1,6 +1,13 @@ package org.hps.recon.tracking; +import java.util.List; +import org.apache.commons.math3.util.Pair; +import org.lcsim.event.EventHeader; import org.lcsim.event.GenericObject; +import org.lcsim.event.LCRelation; +import org.lcsim.event.RelationalTable; +import org.lcsim.event.Track; +import org.lcsim.event.base.BaseRelationalTable; /** * Generic object used to persist track data not available through a Track @@ -155,4 +162,24 @@ public boolean isFixedSize() { return true; } + + private static Pair<EventHeader, RelationalTable> trackDataToTrackCache = null; + + public static RelationalTable getTrackDataToTrackTable(EventHeader event) { + if (trackDataToTrackCache == null || trackDataToTrackCache.getFirst() != event) { + RelationalTable trackDataToTrack = new BaseRelationalTable(RelationalTable.Mode.MANY_TO_MANY, RelationalTable.Weighting.UNWEIGHTED); + List<LCRelation> hitrelations = event.get(LCRelation.class, TRACK_DATA_RELATION_COLLECTION); + for (LCRelation relation : hitrelations) { + if (relation != null && relation.getFrom() != null && relation.getTo() != null) { + trackDataToTrack.add(relation.getFrom(), relation.getTo()); + } + } + trackDataToTrackCache = new Pair<EventHeader, RelationalTable>(event, trackDataToTrack); + } + return trackDataToTrackCache.getSecond(); + } + + public static GenericObject getTrackData(EventHeader event, Track track) { + return (GenericObject) getTrackDataToTrackTable(event).from(track); + } } Modified: java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/TrackUtils.java ============================================================================= --- java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/TrackUtils.java (original) +++ java/branches/jeremy-dev/tracking/src/main/java/org/hps/recon/tracking/TrackUtils.java Wed Dec 2 21:01:47 2015 @@ -1,19 +1,21 @@ package org.hps.recon.tracking; +import hep.physics.matrix.SymmetricMatrix; +import hep.physics.vec.BasicHep3Vector; +import hep.physics.vec.Hep3Matrix; +import hep.physics.vec.Hep3Vector; +import hep.physics.vec.SpacePoint; +import hep.physics.vec.VecOp; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; - -import hep.physics.matrix.SymmetricMatrix; -import hep.physics.vec.BasicHep3Vector; -import hep.physics.vec.Hep3Matrix; -import hep.physics.vec.Hep3Vector; -import hep.physics.vec.SpacePoint; -import hep.physics.vec.VecOp; - +import org.apache.commons.math3.util.Pair; +import org.hps.recon.tracking.EventQuality.Quality; +import org.hps.recon.tracking.gbl.HelicalTrackStripGbl; +import static org.lcsim.constants.Constants.fieldConversion; import org.lcsim.detector.ITransform3D; import org.lcsim.detector.solids.Box; import org.lcsim.detector.solids.Point3D; @@ -48,10 +50,6 @@ import org.lcsim.util.swim.Helix; import org.lcsim.util.swim.Line; import org.lcsim.util.swim.Trajectory; -import org.hps.recon.tracking.EventQuality.Quality; -import org.hps.recon.tracking.gbl.HelicalTrackStripGbl; - -import static org.lcsim.constants.Constants.fieldConversion; /** * Assorted helper functions for the track and helix objects in lcsim. Re-use as @@ -984,24 +982,36 @@ return new HelicalTrackHit(pos, hitcov, dedx, time, type, rhits, detname, layer, beflag); } + private static Pair<EventHeader, RelationalTable> hitToStripsCache = null; + public static RelationalTable getHitToStripsTable(EventHeader event) { - RelationalTable hitToStrips = new BaseRelationalTable(RelationalTable.Mode.MANY_TO_MANY, RelationalTable.Weighting.UNWEIGHTED); - List<LCRelation> hitrelations = event.get(LCRelation.class, "HelicalTrackHitRelations"); - for (LCRelation relation : hitrelations) - if (relation != null && relation.getFrom() != null && relation.getTo() != null) - hitToStrips.add(relation.getFrom(), relation.getTo()); - - return hitToStrips; - } + if (hitToStripsCache == null || hitToStripsCache.getFirst() != event) { + RelationalTable hitToStrips = new BaseRelationalTable(RelationalTable.Mode.MANY_TO_MANY, RelationalTable.Weighting.UNWEIGHTED); + List<LCRelation> hitrelations = event.get(LCRelation.class, "HelicalTrackHitRelations"); + for (LCRelation relation : hitrelations) { + if (relation != null && relation.getFrom() != null && relation.getTo() != null) { + hitToStrips.add(relation.getFrom(), relation.getTo()); + } + } + hitToStripsCache = new Pair<EventHeader, RelationalTable>(event, hitToStrips); + } + return hitToStripsCache.getSecond(); + } + + private static Pair<EventHeader, RelationalTable> hitToRotatedCache = null; public static RelationalTable getHitToRotatedTable(EventHeader event) { - - RelationalTable hitToRotated = new BaseRelationalTable(RelationalTable.Mode.ONE_TO_ONE, RelationalTable.Weighting.UNWEIGHTED); - List<LCRelation> rotaterelations = event.get(LCRelation.class, "RotatedHelicalTrackHitRelations"); - for (LCRelation relation : rotaterelations) - if (relation != null && relation.getFrom() != null && relation.getTo() != null) - hitToRotated.add(relation.getFrom(), relation.getTo()); - return hitToRotated; + if (hitToRotatedCache == null || hitToRotatedCache.getFirst() != event) { + RelationalTable hitToRotated = new BaseRelationalTable(RelationalTable.Mode.ONE_TO_ONE, RelationalTable.Weighting.UNWEIGHTED); + List<LCRelation> rotaterelations = event.get(LCRelation.class, "RotatedHelicalTrackHitRelations"); + for (LCRelation relation : rotaterelations) { + if (relation != null && relation.getFrom() != null && relation.getTo() != null) { + hitToRotated.add(relation.getFrom(), relation.getTo()); + } + } + hitToRotatedCache = new Pair<EventHeader, RelationalTable>(event, hitToRotated); + } + return hitToRotatedCache.getSecond(); } public static double getTrackTime(Track track, RelationalTable hitToStrips, RelationalTable hitToRotated) {