Author: [log in to unmask] Date: Fri Oct 16 11:32:57 2015 New Revision: 3852 Log: fancier cut analysis Modified: java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/TridentMonitoring.java java/trunk/conditions/src/main/java/org/hps/conditions/database/ConnectionParameters.java Modified: java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/TridentMonitoring.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/TridentMonitoring.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/TridentMonitoring.java Fri Oct 16 11:32:57 2015 @@ -11,6 +11,7 @@ import hep.physics.vec.VecOp; import java.util.ArrayList; +import java.util.EnumSet; import java.util.List; import java.util.Map.Entry; import java.util.logging.Logger; @@ -36,30 +37,63 @@ */ public class TridentMonitoring extends DataQualityMonitor { - private static Logger LOGGER = Logger.getLogger(TridentMonitoring.class.getPackage().getName()); - + private enum Cut { + + TRK_QUALITY("Trk Quality"), + VTX_QUALITY("Vtx Quality"), + VERTEX_CUTS("Vtx Cuts"), + TIMING("Timing"), + TRACK_CUTS("Trk Cuts"), + CLUSTER_CUTS("Cluster"), + EVENT_QUALITY("Evt Quality"), + FRONT_HITS("Front Hits"), + ISOLATION("Isolation"); + private final String name; + private final static int nCuts = 9; + private final static int firstVertexingCut = 7; + + Cut(String name) { + this.name = name; + } + + static int bitmask(EnumSet<Cut> flags) { + int mask = 0; + for (Cut flag : flags) { + mask |= 1 << flag.ordinal(); + } + return mask; + } + + @Override + public String toString() { + return name; + } + } + + private final static Logger LOGGER = Logger.getLogger(TridentMonitoring.class.getPackage().getName()); + private double ebeam = 1.05; private final BasicHep3Matrix beamAxisRotation = new BasicHep3Matrix(); - private static final int nCuts = 9; - private final String[] cutNames = {"Trk Quality", - "V0 Quality", - "V0 Vertex", - "Timing", - "Tracking", - "Cluster", - "Event", - "Front Hits", - "Isolation"}; - private int firstVertexingCut = 0; - private static final int PASS = 0; - private static final int FAIL = 1; +// private static final int nCuts = 9; +// private final String[] cutNames = {"Trk Quality", +// "V0 Quality", +// "V0 Vertex", +// "Timing", +// "Tracking", +// "Cluster", +// "Event", +// "Front Hits", +// "Isolation"}; +// private int firstVertexingCut = 0; + private static final int TRIDENT = 0; + private static final int VERTEX = 1; private final String finalStateParticlesColName = "FinalStateParticles"; private final String unconstrainedV0CandidatesColName = "UnconstrainedV0Candidates"; // private final String beamConV0CandidatesColName = "BeamspotConstrainedV0Candidates"; // private final String targetV0ConCandidatesColName = "TargetConstrainedV0Candidates"; // private final String trackListName = "MatchedTracks"; - private String[] fpQuantNames = {"nV0_per_Event", "avg_BSCon_mass", "avg_BSCon_Vx", "avg_BSCon_Vy", "avg_BSCon_Vz", "sig_BSCon_Vx", "sig_BSCon_Vy", "sig_BSCon_Vz", "avg_BSCon_Chi2"}; + private final String[] fpQuantNames = {"nV0_per_Event", "avg_BSCon_mass", "avg_BSCon_Vx", "avg_BSCon_Vy", "avg_BSCon_Vz", "sig_BSCon_Vx", "sig_BSCon_Vy", "sig_BSCon_Vz", "avg_BSCon_Chi2"}; private final String plotDir = "TridentMonitoring/"; @@ -175,36 +209,39 @@ private IHistogram1D l1Iso; private IHistogram2D zVsL1Iso; - private final IHistogram1D[][] cutVertexMass = new IHistogram1D[nCuts][2]; - private final IHistogram1D[][] cutVertexZ = new IHistogram1D[nCuts][2]; - private final IHistogram2D[][] cutVertexZVsMass = new IHistogram2D[nCuts][2]; + private final IHistogram1D[][] cutVertexMass = new IHistogram1D[Cut.nCuts][2]; + private final IHistogram1D[][] cutVertexZ = new IHistogram1D[Cut.nCuts][2]; + private final IHistogram2D[][] cutVertexZVsMass = new IHistogram2D[Cut.nCuts][2]; + + private final double plotsMinMass = 0.03 * ebeam; + private final double plotsMaxMass = 0.04 * ebeam; //clean up event first - private int nTrkMax = 5; - private int nPosMax = 1; - - private double maxChi2SeedTrack = 7.0; - private double maxChi2GBLTrack = 15.0; - private double maxVertChi2 = 7.0; + private final int nTrkMax = 5; + private final int nPosMax = 1; + + private final double maxChi2SeedTrack = 7.0; + private final double maxChi2GBLTrack = 15.0; + private final double maxVertChi2 = 7.0; //v0 cuts - private double v0PzMax = 1.25 * ebeam;//GeV - private double v0PzMin = 0.1;// GeV - private double v0PyMax = 0.04;//GeV absolute value - private double v0PxMax = 0.04;//GeV absolute value - private double v0VzMax = 50.0;// mm from target...someday make mass dependent - private double v0VyMax = 1.0;// mm from target...someday make mass dependent - private double v0VxMax = 2.0;// mm from target...someday make mass dependent + private final double v0PzMax = 1.25 * ebeam;//GeV + private final double v0PzMin = 0.1;// GeV + private final double v0PyMax = 0.04;//GeV absolute value + private final double v0PxMax = 0.04;//GeV absolute value + private final double v0VzMax = 50.0;// mm from target...someday make mass dependent + private final double v0VyMax = 1.0;// mm from target...someday make mass dependent + private final double v0VxMax = 2.0;// mm from target...someday make mass dependent // track quality cuts - private double beamPCut = 0.85; - private double minPCut = 0.05; + private final double beamPCut = 0.85; + private final double minPCut = 0.05; // private double trkPyMax = 0.2; // private double trkPxMax = 0.2; - private double radCut = 0.8 * ebeam; - private double trkTimeDiff = 5.0; - private double clusterTimeDiffCut = 2.5; - - private double l1IsoMin = 1.0; + private final double radCut = 0.8 * ebeam; + private final double trkTimeDiff = 5.0; + private final double clusterTimeDiffCut = 2.5; + + private final double l1IsoMin = 1.0; //cluster matching // private boolean reqCluster = false; // private int nClustMax = 3; @@ -214,7 +251,7 @@ //counters private float nEvents = 0; private float nRecoV0 = 0; - private final float[] nPassCut = new float[nCuts]; + private final float[] nPassCut = new float[Cut.nCuts]; public void setEbeam(double ebeam) { this.ebeam = ebeam; @@ -368,13 +405,13 @@ l1Iso = aida.histogram1D(plotDir + trkType + triggerType + "/" + "Cut: L1 Isolation", 50, 0.0, 5.0); zVsL1Iso = aida.histogram2D(plotDir + trkType + triggerType + "/" + "Cut: Vz vs L1 Isolation", 50, 0.0, 5.0, 50, -v0VzMax, v0VzMax); - for (int i = 0; i < nCuts; i++) { - for (int pass = 0; pass < 2; pass++) { - cutVertexZ[i][pass] = aida.histogram1D(String.format("%s%s%s/cut %d: %s/%s: Vertex Z position (mm)", plotDir, trkType, triggerType, i, cutNames[i], pass == PASS ? "pass" : "fail"), + for (Cut cut : Cut.values()) { + for (int i = 0; i < 2; i++) { + cutVertexZ[cut.ordinal()][i] = aida.histogram1D(String.format("%s%s%s/failed cut: %s/%s: Vertex Z position (mm)", plotDir, trkType, triggerType, cut.ordinal(), cut.name, i == VERTEX ? "vertex" : "trident"), 100, -v0VzMax, v0VzMax); - cutVertexMass[i][pass] = aida.histogram1D(String.format("%s%s%s/cut %d: %s/%s: Vertex mass (GeV)", plotDir, trkType, triggerType, i, cutNames[i], pass == PASS ? "pass" : "fail"), + cutVertexMass[cut.ordinal()][i] = aida.histogram1D(String.format("%s%s%s/failed cut: %s/%s: Vertex mass (GeV)", plotDir, trkType, triggerType, cut.ordinal(), cut.name, i == VERTEX ? "vertex" : "trident"), 100, 0, 0.1 * ebeam); - cutVertexZVsMass[i][pass] = aida.histogram2D(String.format("%s%s%s/cut %d: %s/%s: Vertex Z vs. mass", plotDir, trkType, triggerType, i, cutNames[i], pass == PASS ? "pass" : "fail"), + cutVertexZVsMass[cut.ordinal()][i] = aida.histogram2D(String.format("%s%s%s/failed cut: %s/%s: Vertex Z vs. mass", plotDir, trkType, triggerType, cut.ordinal(), cut.name, i == VERTEX ? "vertex" : "trident"), 100, 0, 0.1 * ebeam, 100, -v0VzMax, v0VzMax); } } @@ -480,96 +517,49 @@ } //start applying cuts - int cutNum = 0; + EnumSet<Cut> bits = EnumSet.noneOf(Cut.class); + boolean trackQualityCut = Math.max(tracks.get(0).getChi2(), tracks.get(1).getChi2()) < (isGBL ? maxChi2GBLTrack : maxChi2SeedTrack); maxTrkChi2.fill(Math.max(tracks.get(0).getChi2(), tracks.get(1).getChi2())); zVsMaxTrkChi2.fill(Math.max(tracks.get(0).getChi2(), tracks.get(1).getChi2()), v0Vtx.z()); - if (!trackQualityCut) { - cutVertexZ[cutNum][FAIL].fill(v0Vtx.z()); - cutVertexMass[cutNum][FAIL].fill(uncV0.getMass()); - cutVertexZVsMass[cutNum][FAIL].fill(uncV0.getMass(), v0Vtx.z()); - continue; - } - cutVertexZ[cutNum][PASS].fill(v0Vtx.z()); - cutVertexMass[cutNum][PASS].fill(uncV0.getMass()); - cutVertexZVsMass[cutNum][PASS].fill(uncV0.getMass(), v0Vtx.z()); - nPassCut[cutNum]++; - cutNum++; + if (trackQualityCut) { + bits.add(Cut.TRK_QUALITY); + } boolean v0QualityCut = uncVert.getChi2() < maxVertChi2; v0Chi2.fill(uncVert.getChi2()); zVsV0Chi2.fill(uncVert.getChi2(), v0Vtx.z()); - if (!v0QualityCut) { - cutVertexZ[cutNum][FAIL].fill(v0Vtx.z()); - cutVertexMass[cutNum][FAIL].fill(uncV0.getMass()); - cutVertexZVsMass[cutNum][FAIL].fill(uncV0.getMass(), v0Vtx.z()); - continue; - } - cutVertexZ[cutNum][PASS].fill(v0Vtx.z()); - cutVertexMass[cutNum][PASS].fill(uncV0.getMass()); - cutVertexZVsMass[cutNum][PASS].fill(uncV0.getMass(), v0Vtx.z()); - nPassCut[cutNum]++; - cutNum++; + if (v0QualityCut) { + bits.add(Cut.VTX_QUALITY); + } boolean vertexMomentumCut = v0MomRot.z() < v0PzMax && v0MomRot.z() > v0PzMin && Math.abs(v0MomRot.x()) < v0PxMax && Math.abs(v0MomRot.y()) < v0PyMax; boolean vertexPositionCut = Math.abs(v0Vtx.x()) < v0VxMax && Math.abs(v0Vtx.y()) < v0VyMax && Math.abs(v0Vtx.z()) < v0VzMax; - if (!vertexMomentumCut || !vertexPositionCut) { - cutVertexZ[cutNum][FAIL].fill(v0Vtx.z()); - cutVertexMass[cutNum][FAIL].fill(uncV0.getMass()); - cutVertexZVsMass[cutNum][FAIL].fill(uncV0.getMass(), v0Vtx.z()); - continue; - } - cutVertexZ[cutNum][PASS].fill(v0Vtx.z()); - cutVertexMass[cutNum][PASS].fill(uncV0.getMass()); - cutVertexZVsMass[cutNum][PASS].fill(uncV0.getMass(), v0Vtx.z()); - nPassCut[cutNum]++; - cutNum++; + if (vertexMomentumCut && vertexPositionCut) { + bits.add(Cut.VERTEX_CUTS); + } boolean trackTimeDiffCut = Math.abs(trackTimes.get(0) - trackTimes.get(1)) < trkTimeDiff; trackTimeDiff.fill(Math.abs(trackTimes.get(0) - trackTimes.get(1))); hitTimeStdDev.fill(stdDev); zVsTrackTimeDiff.fill(Math.abs(trackTimes.get(0) - trackTimes.get(1)), v0Vtx.z()); zVsHitTimeStdDev.fill(stdDev, v0Vtx.z()); - if (!trackTimeDiffCut) { - cutVertexZ[cutNum][FAIL].fill(v0Vtx.z()); - cutVertexMass[cutNum][FAIL].fill(uncV0.getMass()); - cutVertexZVsMass[cutNum][FAIL].fill(uncV0.getMass(), v0Vtx.z()); - continue; - } - cutVertexZ[cutNum][PASS].fill(v0Vtx.z()); - cutVertexMass[cutNum][PASS].fill(uncV0.getMass()); - cutVertexZVsMass[cutNum][PASS].fill(uncV0.getMass(), v0Vtx.z()); - nPassCut[cutNum]++; - cutNum++; + if (trackTimeDiffCut) { + bits.add(Cut.TIMING); + } boolean topBottomCut = electron.getMomentum().y() * positron.getMomentum().y() < 0; boolean pMinCut = electron.getMomentum().magnitude() > minPCut && positron.getMomentum().magnitude() > minPCut; boolean pMaxCut = electron.getMomentum().magnitude() < beamPCut && positron.getMomentum().magnitude() < beamPCut; - if (!topBottomCut || !pMaxCut || !pMinCut) { - cutVertexZ[cutNum][FAIL].fill(v0Vtx.z()); - cutVertexMass[cutNum][FAIL].fill(uncV0.getMass()); - cutVertexZVsMass[cutNum][FAIL].fill(uncV0.getMass(), v0Vtx.z()); - continue; - } - cutVertexZ[cutNum][PASS].fill(v0Vtx.z()); - cutVertexMass[cutNum][PASS].fill(uncV0.getMass()); - cutVertexZVsMass[cutNum][PASS].fill(uncV0.getMass(), v0Vtx.z()); - nPassCut[cutNum]++; - cutNum++; + if (topBottomCut && pMaxCut && pMinCut) { + bits.add(Cut.TRACK_CUTS); + } boolean clusterMatchCut = !electron.getClusters().isEmpty() && !positron.getClusters().isEmpty(); boolean clusterTimeCut = clusterMatchCut && Math.abs(ClusterUtilities.getSeedHitTime(electron.getClusters().get(0)) - ClusterUtilities.getSeedHitTime(positron.getClusters().get(0))) < clusterTimeDiffCut; - if (!clusterMatchCut || !clusterTimeCut) { - cutVertexZ[cutNum][FAIL].fill(v0Vtx.z()); - cutVertexMass[cutNum][FAIL].fill(uncV0.getMass()); - cutVertexZVsMass[cutNum][FAIL].fill(uncV0.getMass(), v0Vtx.z()); - continue; - } - cutVertexZ[cutNum][PASS].fill(v0Vtx.z()); - cutVertexMass[cutNum][PASS].fill(uncV0.getMass()); - cutVertexZVsMass[cutNum][PASS].fill(uncV0.getMass(), v0Vtx.z()); - nPassCut[cutNum]++; - cutNum++; + if (clusterMatchCut && clusterTimeCut) { + bits.add(Cut.CLUSTER_CUTS); + } boolean eventTrkCountCut = ntrk >= 2 && ntrk <= nTrkMax; boolean eventPosCountCut = npos >= 1 && npos <= nPosMax; @@ -577,50 +567,61 @@ eventPosCount.fill(npos); zVsEventTrkCount.fill(ntrk, v0Vtx.z()); zVsEventPosCount.fill(npos, v0Vtx.z()); - if (!eventTrkCountCut || !eventPosCountCut) { - cutVertexZ[cutNum][FAIL].fill(v0Vtx.z()); - cutVertexMass[cutNum][FAIL].fill(uncV0.getMass()); - cutVertexZVsMass[cutNum][FAIL].fill(uncV0.getMass(), v0Vtx.z()); - continue; - } - cutVertexZ[cutNum][PASS].fill(v0Vtx.z()); - cutVertexMass[cutNum][PASS].fill(uncV0.getMass()); - cutVertexZVsMass[cutNum][PASS].fill(uncV0.getMass(), v0Vtx.z()); - nPassCut[cutNum]++; - cutNum++; - - candidateList.add(uncV0); - firstVertexingCut = cutNum; + if (eventTrkCountCut && eventPosCountCut) { + bits.add(Cut.EVENT_QUALITY); + } boolean frontHitsCut = eleIso[0] != null && posIso[0] != null && eleIso[2] != null && posIso[2] != null; - if (!frontHitsCut) { - cutVertexZ[cutNum][FAIL].fill(v0Vtx.z()); - cutVertexMass[cutNum][FAIL].fill(uncV0.getMass()); - cutVertexZVsMass[cutNum][FAIL].fill(uncV0.getMass(), v0Vtx.z()); - continue; - } - cutVertexZ[cutNum][PASS].fill(v0Vtx.z()); - cutVertexMass[cutNum][PASS].fill(uncV0.getMass()); - cutVertexZVsMass[cutNum][PASS].fill(uncV0.getMass(), v0Vtx.z()); - nPassCut[cutNum]++; - cutNum++; + if (frontHitsCut) { + bits.add(Cut.FRONT_HITS); + } l1Iso.fill(minL1Iso); zVsL1Iso.fill(minL1Iso, v0Vtx.z()); boolean isoCut = minL1Iso > l1IsoMin; - if (!isoCut) { - cutVertexZ[cutNum][FAIL].fill(v0Vtx.z()); - cutVertexMass[cutNum][FAIL].fill(uncV0.getMass()); - cutVertexZVsMass[cutNum][FAIL].fill(uncV0.getMass(), v0Vtx.z()); - continue; - } - cutVertexZ[cutNum][PASS].fill(v0Vtx.z()); - cutVertexMass[cutNum][PASS].fill(uncV0.getMass()); - cutVertexZVsMass[cutNum][PASS].fill(uncV0.getMass(), v0Vtx.z()); - nPassCut[cutNum]++; - cutNum++; - - vertCandidateList.add(uncV0); + if (isoCut) { + bits.add(Cut.ISOLATION); + } + + for (Cut cut : Cut.values()) { + if (bits.contains(cut)) { + if (cut.ordinal() == Cut.firstVertexingCut) {//if we get here, we've passed all non-vertexing cuts + candidateList.add(uncV0); + } + nPassCut[cut.ordinal()]++; + } else { + break; + } + } + + for (Cut cut : Cut.values()) { + EnumSet<Cut> allButThisCut = EnumSet.allOf(Cut.class); + allButThisCut.remove(cut); + if (bits.equals(allButThisCut)) { + if (uncV0.getMass() > plotsMinMass && uncV0.getMass() < plotsMaxMass) { + cutVertexZ[cut.ordinal()][VERTEX].fill(v0Vtx.z()); + } + cutVertexMass[cut.ordinal()][VERTEX].fill(uncV0.getMass()); + cutVertexZVsMass[cut.ordinal()][VERTEX].fill(uncV0.getMass(), v0Vtx.z()); + } + + EnumSet<Cut> allTriCutsButThisCut = EnumSet.range(Cut.values()[0], Cut.values()[Cut.firstVertexingCut - 1]); + allTriCutsButThisCut.remove(cut); + if (bits.containsAll(allTriCutsButThisCut) && !bits.contains(cut)) { + if (uncV0.getMass() > plotsMinMass && uncV0.getMass() < plotsMaxMass) { + cutVertexZ[cut.ordinal()][TRIDENT].fill(v0Vtx.z()); + } + cutVertexMass[cut.ordinal()][TRIDENT].fill(uncV0.getMass()); + cutVertexZVsMass[cut.ordinal()][TRIDENT].fill(uncV0.getMass(), v0Vtx.z()); + } + } + + if (bits.containsAll(EnumSet.range(Cut.values()[0], Cut.values()[Cut.firstVertexingCut - 1]))) { + candidateList.add(uncV0); + } + if (bits.equals(EnumSet.allOf(Cut.class))) { + vertCandidateList.add(uncV0); + } } nTriCand.fill(candidateList.size()); @@ -765,7 +766,7 @@ @Override // TODO: Change from System.out to use logger instead. - public void printDQMData() { + public void printDQMData() { System.out.println("TridendMonitoring::printDQMData"); for (Entry<String, Double> entry : monitoredQuantityMap.entrySet()) { System.out.println(entry.getKey() + " = " + entry.getValue()); @@ -778,13 +779,13 @@ System.out.println("******************************************************************************************"); System.out.println(String.format("Number of V0:\t%8.0f\t%8.6f\t%8.6f\t%8.6f\n", nRecoV0, nRecoV0 / nRecoV0, nRecoV0 / nRecoV0, nRecoV0 / nEvents)); - for (int i = 0; i < nCuts; i++) { - if (i == firstVertexingCut) { + for (Cut cut : Cut.values()) { + if (cut.ordinal() == Cut.firstVertexingCut) { System.out.println("******************************************************************************************"); System.out.println("\t\t\tVertex Selection Summary"); System.out.println("******************************************************************************************"); } - System.out.format("%-12s Cuts:\t%8.0f\t%8.6f\t%8.6f\t%8.6f\n", cutNames[i], nPassCut[i], nPassCut[i] / (i == 0 ? nRecoV0 : nPassCut[i == 0 ? 0 : (i - 1)]), nPassCut[i] / nRecoV0, nPassCut[i] / nEvents); + System.out.format("%-12s Cuts:\t%8.0f\t%8.6f\t%8.6f\t%8.6f\n", cut.name, nPassCut[cut.ordinal()], nPassCut[cut.ordinal()] / (cut.ordinal() == 0 ? nRecoV0 : nPassCut[cut.ordinal() == 0 ? 0 : (cut.ordinal() - 1)]), nPassCut[cut.ordinal()] / nRecoV0, nPassCut[cut.ordinal()] / nEvents); } System.out.println("******************************************************************************************"); } Modified: java/trunk/conditions/src/main/java/org/hps/conditions/database/ConnectionParameters.java ============================================================================= --- java/trunk/conditions/src/main/java/org/hps/conditions/database/ConnectionParameters.java (original) +++ java/trunk/conditions/src/main/java/org/hps/conditions/database/ConnectionParameters.java Fri Oct 16 11:32:57 2015 @@ -9,6 +9,7 @@ import java.sql.DriverManager; import java.sql.SQLException; import java.util.Properties; +import java.util.logging.Level; import java.util.logging.Logger; /** @@ -164,6 +165,11 @@ if (attempt >= MAX_ATTEMPTS) { throw new RuntimeException("Failed to connect to database after " + attempt + " attempts: " + this.getConnectionString(), x); } + try { + Thread.sleep(attempt * 1000); + } catch (InterruptedException ex) { + Logger.getLogger(ConnectionParameters.class.getName()).log(Level.SEVERE, null, ex); + } continue; } if (attempt > 1) {