Commit in lcsim/src/org/lcsim/contrib/uiowa on MAIN
MassPlots.java+58-191.3 -> 1.4
MJC (contrib): When making output plots, add in energy residuals RMS90; make range in cos(theta) variable.

lcsim/src/org/lcsim/contrib/uiowa
MassPlots.java 1.3 -> 1.4
diff -u -r1.3 -r1.4
--- MassPlots.java	20 Dec 2007 04:08:20 -0000	1.3
+++ MassPlots.java	25 Aug 2008 22:02:05 -0000	1.4
@@ -51,10 +51,16 @@
     ICloud1D m_h1PassingCut2;
     ICloud1D m_h2PassingCut2;
     ICloud1D m_h1trueResPassingCut2;
+    ICloud1D m_h2trueResPassingCut2;
     String m_jetListName;
     String m_inputListName;
-    List<Double> m_list_PassingCut2;
-    List<Double> m_list_trueResPassingCut2;
+    List<Double> m_listMass_PassingCut2;
+    List<Double> m_listMass_trueResPassingCut2;
+    List<Double> m_listEnergy_PassingCut2;
+    List<Double> m_listEnergy_trueResPassingCut2;
+
+    protected double m_cosThetaMin = 0.0;
+    protected double m_cosThetaMax = 0.8;
 
     public MassPlots(String inputList, String outputFilename) {
 	m_inputListName = inputList;
@@ -84,20 +90,28 @@
 	    m_h1PassingCut2 = m_histoFactory.createCloud1D("eventMassInBarrel2");
 	    m_h2PassingCut2 = m_histoFactory.createCloud1D("eventEnergyInBarrel2");
 	    m_h1trueResPassingCut2 = m_histoFactory.createCloud1D("eventMassResidualsToTruthInBarrel2");
+	    m_h2trueResPassingCut2 = m_histoFactory.createCloud1D("eventEnergyResidualsToTruthInBarrel2");
 	} catch (IOException ioe1) {
             ioe1.printStackTrace(); 
 	}
 
 	// For rms90 calculation:
-	m_list_PassingCut2 = new Vector<Double>();
-	m_list_trueResPassingCut2 = new Vector<Double>();
+	m_listMass_PassingCut2 = new Vector<Double>();
+	m_listMass_trueResPassingCut2 = new Vector<Double>();
+	m_listEnergy_PassingCut2 = new Vector<Double>();
+	m_listEnergy_trueResPassingCut2 = new Vector<Double>();
     }
 
     boolean m_doCheckpoints = false;
     int m_eventCount;
     protected void process(EventHeader event)
     {
-	super.process(event);
+	try {
+	    super.process(event);
+        } catch(FixNumberOfJetsFinder.NumJetsNotFoundException e) {
+	    System.out.println("NumJetsNoFoundException: "+e.getMessage()+" when trying to make mass/energy plots for '"+m_inputListName+"'");
+	    return;
+        }
 
 	// Event cut: Both reconstructed jets have cos(theta) < 0.8
 	// Event cut 2: Both quarks have cos(theta) < 0.8
@@ -133,13 +147,14 @@
 		//System.out.println("ERROR: no Z -> vv cand");
 	    }
 	    if (partZToqq == null) {
-		System.out.println("ERROR: no Z -> qq cand");
+		//System.out.println("ERROR: no Z -> qq cand");
 	    } else {
 		//System.out.println("DEBUG: Mass of Z -> qq = "+partZToqq.getMass());
 		passesTruthAcceptanceCut = true;
 		for (MCParticle dau : partZToqq_daughters) {
 		    double cosTheta = Math.abs(dau.getMomentum().z() / dau.getMomentum().magnitude());
-		    if (cosTheta>0.8) { passesTruthAcceptanceCut = false; }
+		    if (cosTheta>m_cosThetaMax) { passesTruthAcceptanceCut = false; }
+		    if (cosTheta<m_cosThetaMin) { passesTruthAcceptanceCut = false; }
 		}
 	    }
 	}
@@ -207,9 +222,12 @@
 	    m_h1PassingCut2.fill(evtmass);
 	    m_h2PassingCut2.fill(esum);
 	    m_h1trueResPassingCut2.fill(evtmass-partZToqq.getMass());
+	    m_h2trueResPassingCut2.fill(esum-partZToqq.getEnergy());
 	    //System.out.println(evtmass-partZToqq.getMass());
-	    m_list_trueResPassingCut2.add(evtmass-partZToqq.getMass());
-	    m_list_PassingCut2.add(evtmass);
+	    m_listMass_trueResPassingCut2.add(evtmass-partZToqq.getMass());
+	    m_listMass_PassingCut2.add(evtmass);
+	    m_listEnergy_trueResPassingCut2.add(esum-partZToqq.getEnergy());
+	    m_listEnergy_PassingCut2.add(esum);
 	}
 	
 
@@ -228,16 +246,24 @@
             ioe1.printStackTrace(); 
         }
 
+	printRMS90(m_listMass_trueResPassingCut2, "Mass residuals: ");
+	printRMS90(m_listEnergy_trueResPassingCut2, "Energy residuals: ");
+
+	// Done
+        super.suspend();
+    }
+
+    protected void printRMS90(List<Double> data, String info) {
 	// Compute rms90
 	double targetCentralFraction = 0.9;
-	Collections.sort(m_list_trueResPassingCut2);
+	Collections.sort(data);
 
-	int nPoints = m_list_trueResPassingCut2.size();
+	int nPoints = data.size();
 	int nTail = (int)((1.0 - targetCentralFraction) * nPoints);
 	int nNonTail = nPoints - nTail;
 	double centralFraction = ((double)(nNonTail))/((double)(nPoints));
 
-	System.out.println("Computing rms90 for "+m_inputListName+": nPoints = "+nPoints+" (of which "+nTail+" tail and "+nNonTail+" non-tail for a central fraction of "+centralFraction+")");
+	System.out.println("Computing rms90 for "+m_inputListName+": "+info+"nPoints = "+nPoints+" (of which "+nTail+" tail and "+nNonTail+" non-tail for a central fraction of "+centralFraction+")");
 
 	double rms_min = 100000.0;
 	double mean_min = 0.0;
@@ -248,14 +274,14 @@
 	    double xm2 = 0.0;
 	    double xn = 0.0;
 	    for (int j=i; j<i+nNonTail; j++) {
-		xm += m_list_trueResPassingCut2.get(j);
-		xm2 += (m_list_trueResPassingCut2.get(j) * m_list_trueResPassingCut2.get(j));
+		xm += data.get(j);
+		xm2 += (data.get(j) * data.get(j));
 		xn += 1.0;
 	    }
 	    double rms = Math.sqrt(xm2/xn - (xm/xn)*(xm/xn));
 	    if (rms<rms_min) {
-		output_min = m_list_trueResPassingCut2.get(i);
-		output_max = m_list_trueResPassingCut2.get(i+nNonTail-1);
+		output_min = data.get(i);
+		output_max = data.get(i+nNonTail-1);
 		rms_min = rms;
 		mean_min = xm/xn;
 	    }
@@ -265,9 +291,22 @@
 	System.out.println("mean90:   "+mean_min);
 	System.out.println("min90:    "+output_min);
 	System.out.println("max90:    "+output_max);
-	System.out.println("Full RMS: "+m_h1trueResPassingCut2.rms());
 
-	// Done
-        super.suspend();
+	// Check: Compute full RMS
+	double full_xm = 0.0;
+	double full_xm2 = 0.0;
+	double full_xn = 0.0;
+	for (Double point : data) {
+	    double value = point.doubleValue();
+	    full_xm += value;
+	    full_xm2 += (value * value);
+	    full_xn += 1.0;
+	}
+	double fullRMS = Math.sqrt(full_xm2/full_xn - (full_xm/full_xn)*(full_xm/full_xn));
+	System.out.println("Full RMS: "+fullRMS);
+
     }
+
+    public void setCosThetaMin(double cut) { m_cosThetaMin = cut; }
+    public void setCosThetaMax(double cut) { m_cosThetaMax = cut; }
 }
CVSspam 0.2.8