Print

Print


Author: [log in to unmask]
Date: Sun Feb  7 20:22:03 2016
New Revision: 4188

Log:
made some changes and added new classes

Added:
    java/trunk/users/src/main/java/org/hps/users/spaul/moller/
    java/trunk/users/src/main/java/org/hps/users/spaul/moller/FitAllProfiles.java
    java/trunk/users/src/main/java/org/hps/users/spaul/moller/FitMollerPyPzGraphs.java
    java/trunk/users/src/main/java/org/hps/users/spaul/moller/MollerBeamtiltAnalysis.java
    java/trunk/users/src/main/java/org/hps/users/spaul/moller/MollerBeamtiltFitter.java
    java/trunk/users/src/main/java/org/hps/users/spaul/moller/MollerStdhepTest.java
Modified:
    java/trunk/users/src/main/java/org/hps/users/spaul/StyleUtil.java
    java/trunk/users/src/main/java/org/hps/users/spaul/SumEverything.java
    java/trunk/users/src/main/java/org/hps/users/spaul/feecc/ExtractFormFactors.java
    java/trunk/users/src/main/java/org/hps/users/spaul/feecc/FEESpectrumGenerator.java
    java/trunk/users/src/main/java/org/hps/users/spaul/feecc/MakeHistograms.java
    java/trunk/users/src/main/java/org/hps/users/spaul/feecc/RemoveDuplicateParticles.java
    java/trunk/users/src/main/java/org/hps/users/spaul/feecc/ShowCustomBinningXY.java

Modified: java/trunk/users/src/main/java/org/hps/users/spaul/StyleUtil.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/spaul/StyleUtil.java	(original)
+++ java/trunk/users/src/main/java/org/hps/users/spaul/StyleUtil.java	Sun Feb  7 20:22:03 2016
@@ -1,9 +1,16 @@
 package org.hps.users.spaul;
 
+import java.awt.Component;
+import java.awt.Graphics2D;
+import java.awt.image.BufferedImage;
+import java.io.File;
 import java.util.Arrays;
 import java.util.Random;
 
+import javax.imageio.ImageIO;
+
 import hep.aida.*;
+import hep.aida.ref.plotter.PlotterUtilities;
 
 public class StyleUtil {
 	
@@ -27,14 +34,16 @@
 		r.style().yAxisStyle().labelStyle().setFontSize(16);
 		r.style().yAxisStyle().tickLabelStyle().setFontSize(14);
 		//	r.style().statisticsBoxStyle().set;
-		//System.out.println(Arrays.toString());
+		//debugPrint());
 		r.style().legendBoxStyle().textStyle().setFontSize(16);
+		r.style().statisticsBoxStyle().textStyle().setFontSize(16);
 		
 		//r.style().dataStyle().showInLegendBox(false);
+		
 		r.style().legendBoxStyle().boxStyle().foregroundStyle().setOpacity(1.0);
 		r.style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
 		r.style().dataStyle().fillStyle().setParameter("showZeroHeightBins", "false");
-		System.out.println(Arrays.toString(r.style().statisticsBoxStyle().boxStyle().backgroundStyle().availableParameters()));
+		//debugPrint(r.style().dataStyle().availableParameters()));
 		//r.style().dataStyle().setParameter("showDataInStatisticsBox", "false");
 		r.style().setParameter("hist2DStyle", "colorMap");
 		//r.style().dataBoxStyle()
@@ -62,15 +71,38 @@
 		region.style().dataStyle().lineStyle().setParameter("colorRotateMethod", "regionOverlayIndex");
 		region.style().dataStyle().lineStyle().setParameter("colorRotate", "black, red, green, blue");
 		region.style().dataStyle().lineStyle().setParameter("thickness", "3");
+		region.style().dataStyle().outlineStyle().setParameter("colorRotateMethod", "regionOverlayIndex");
+		//debug = true;
+		debugPrint(region.style().dataStyle().outlineStyle().availableParameters());
+		region.style().dataStyle().outlineStyle().setParameter("colorRotate", "black, red, green, blue");
+		region.style().dataStyle().outlineStyle().setParameter("thickness", "3");
 		region.style().dataStyle().errorBarStyle().setVisible(false);
-		System.out.println(Arrays.toString(region.style().dataStyle().lineStyle().availableParameterOptions("colorRotateMethod")));
+		debugPrint(region.style().dataStyle().lineStyle().availableParameterOptions("colorRotateMethod"));
+	}
+	public static void setSize(IPlotter p, int width, int height){
+		p.setParameter("plotterWidth", width +"");
+		p.setParameter("plotterHeight", height +"");
 	}
 	
+	public static void setLog(IPlotterRegion r){
+
+		r.style().yAxisStyle().setParameter("scale", "log");
+		r.style().gridStyle().setUnits(100);
+		debugPrint(r.style().gridStyle().availableParameters()); 
+		
+	}
+	static boolean debug = false;
+	static void debugPrint(String[] stuff){
+		if(debug){
+			System.out.println(Arrays.toString(stuff));
+		}
+	}
 	public static void main(String arg[]){
 		IAnalysisFactory af = IAnalysisFactory.create();
 		IHistogramFactory hf = af.createHistogramFactory(af.createTreeFactory().create());
 		
 		IPlotter p = af.createPlotterFactory().create();
+		debugPrint(p.availableParameters());
 		p.createRegions(1, 2);
 		IHistogram1D h1 = hf.createHistogram1D("blah", 100, -5, 5);
 		IHistogram1D h2 = hf.createHistogram1D("bleh", 100, -5, 5);
@@ -99,9 +131,65 @@
 		
 		p.show();
 		
+		p = af.createPlotterFactory().create();
+		debugPrint(p.availableParameters());
+		p.createRegions(1, 2);
+		
+		p.region(0).plot(h1);
+		setLog(p.region(0));
+		
+		
+		
+		p.show();
 	}
 	public static void hideLegendAndStats(IPlotterRegion r){
 		r.style().statisticsBoxStyle().setVisible(false);
 		r.style().legendBoxStyle().setVisible(false);
 	}
+	public static IPlotterStyle smoothCurveStyle(IPlotterFactory pf) {
+		IPlotterStyle style = pf.createPlotterStyle();
+		debugPrint(style.dataStyle().availableParameters());
+		
+		style.dataStyle().markerStyle().setVisible(false);
+		
+		return style;
+	}
+	public static void writeToFile(IPlotter plotter, String filename, String filetype){
+		//JFrame frame = new JFrame()
+		//if(plotter.)
+		//plotter.hide();
+		//plotter.show();
+		//PlotterUtilities.writeToFile(plotter, filename, filetype, null);
+		try {
+			
+			
+			//PlotterUtilities.writeToFile(plotter, filename, filetype, null);
+			Thread.sleep(1000);
+			Component c = PlotterUtilities.componentForPlotter(plotter);
+			int width = Integer.parseInt(plotter.parameterValue("plotterWidth"));
+			int height = Integer.parseInt(plotter.parameterValue("plotterHeight"));
+			if(width <= 0){
+				width = 300;
+				plotter.setParameter("plotterWidth", Integer.toString(width));
+			}
+			if(height <= 0){
+				height = 300;
+
+				plotter.setParameter("plotterHeight", Integer.toString(height));
+			}
+			
+			c.setSize(width, height);
+			BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+			Graphics2D graphics2D = image.createGraphics();
+			c.paint(graphics2D);
+			ImageIO.write(image,filetype, new File(filename));
+			Runtime.getRuntime().exec("open " + filename);
+			System.out.println("saved");
+			
+		} catch (Exception e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		
+	}
 }

Modified: java/trunk/users/src/main/java/org/hps/users/spaul/SumEverything.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/spaul/SumEverything.java	(original)
+++ java/trunk/users/src/main/java/org/hps/users/spaul/SumEverything.java	Sun Feb  7 20:22:03 2016
@@ -74,6 +74,8 @@
 		run(new File(indir).listFiles(), out);
 	}
 	static void run(File[] files, String out) throws IllegalArgumentException, IOException{
+		
+		long timeStart = System.currentTimeMillis();
 		IAnalysisFactory af = IAnalysisFactory.create();
 		ITreeFactory tf = af.createTreeFactory();
 		new File(out).delete();
@@ -120,9 +122,12 @@
 							System.err.println("couldn't find object called " + name +  " in file " + s);
 							throw e;
 						}
-						if(o instanceof IHistogram1D)
+						if(o instanceof IHistogram1D){
+							if(((IHistogram1D)o).allEntries() != 0)
 							((IHistogram1D)outtree.find(name)).add((IHistogram1D)o);
+						}
 						if(o instanceof IHistogram2D)
+							if(((IHistogram2D)o).allEntries() != 0)
 							((IHistogram2D)outtree.find(name)).add((IHistogram2D)o);
 					}
 					//outtree.unmount("/tmp");
@@ -131,7 +136,7 @@
 
 				tree.close();
 				j++;
-				System.out.println(j + " files have been read");
+				System.out.println(j + " files have been read (" +(System.currentTimeMillis()-timeStart)/j + " ms per event");
 
 			} catch(IllegalArgumentException e){
 				//print the filename
@@ -141,6 +146,7 @@
 			}
 
 			outtree.commit();
+			System.out.println("summed file " + out +" commited.  Total time = " + (System.currentTimeMillis()-timeStart)/1000 + " seconds");
 		}
 	}
 

Modified: java/trunk/users/src/main/java/org/hps/users/spaul/feecc/ExtractFormFactors.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/spaul/feecc/ExtractFormFactors.java	(original)
+++ java/trunk/users/src/main/java/org/hps/users/spaul/feecc/ExtractFormFactors.java	Sun Feb  7 20:22:03 2016
@@ -36,7 +36,8 @@
 
 			IDataPointSetFactory dpsf = af.createDataPointSetFactory(treeNew);
 
-			IPlotter p = af.createPlotterFactory().create(outpaths[config]);
+			IPlotterFactory pf = af.createPlotterFactory();
+			IPlotter p = pf.create(outpaths[config]);
 
 
 			int Nsets = arg.length/10;
@@ -152,7 +153,9 @@
 
 				//p.region(0).plot(dps_iso);
 			}
-			p.region(0).plot(dpsTheory);
+			
+			IPlotterStyle style = StyleUtil.smoothCurveStyle(pf);
+			p.region(0).plot(dpsTheory, style);
 			StyleUtil.stylize(p.region(0), "Form Factors", "Q^2 (GeV^2)", "|F(Q^2)|^2");
 			p.show();
 		}

Modified: java/trunk/users/src/main/java/org/hps/users/spaul/feecc/FEESpectrumGenerator.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/spaul/feecc/FEESpectrumGenerator.java	(original)
+++ java/trunk/users/src/main/java/org/hps/users/spaul/feecc/FEESpectrumGenerator.java	Sun Feb  7 20:22:03 2016
@@ -145,7 +145,7 @@
 			
 			thetaHist = hf.createHistogram1D("theta", "theta", thetaBins);
 			
-			EHist = hf.createHistogram1D("energy", 50, 0, 1.3);
+			EHist = hf.createHistogram1D("energy", 200, 0, 1.3);
 			IPlotter p = af.createPlotterFactory().create();
 			p.createRegions(2,1);
 			p.region(0).plot(thetaHist);
@@ -166,8 +166,9 @@
 			
 			if(phep[3] > .5*E){
 				StdhepEvent event = new StdhepEvent(nevhep, nhep, isthep, idhep, jmohep, jdahep, phep, vhep);
+				double smear = .02;
 				if(display)
-					EHist.fill(phep[3]*(1+random.nextGaussian()*.045));
+					EHist.fill(phep[3]*(1+random.nextGaussian()*smear));
 				writer.writeRecord(event);
 			}
 			else{ // if the event has enough energy loss,

Modified: java/trunk/users/src/main/java/org/hps/users/spaul/feecc/MakeHistograms.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/spaul/feecc/MakeHistograms.java	(original)
+++ java/trunk/users/src/main/java/org/hps/users/spaul/feecc/MakeHistograms.java	Sun Feb  7 20:22:03 2016
@@ -59,7 +59,7 @@
 			String input = arg[0];
 			String output = arg[1];
 			cb = new CustomBinning(new File(arg[2]));
-			if(arg.length == 5)
+			if(arg[arg.length -1].equals("display"))
 				display = true;
 			IAnalysisFactory af = IAnalysisFactory.create();
 			ITree tree = af.createTreeFactory().create(output,"xml",false,true);
@@ -73,7 +73,10 @@
 			hack.setDetectorName("HPS-EngRun2015-Nominal-v3");
 			hack.setFreeze(true);
 			hack.setRunNumber(Integer.parseInt(arg[3]));
+			
 			hack.initialize();
+			beamTiltY = Double.parseDouble(arg[4]);
+			beamTiltX = Double.parseDouble(arg[5]);
 			LCIOReader reader = new LCIOReader(new File(input));
 			//reader.open(input);
 			//reader.
@@ -98,13 +101,14 @@
 
 	static IHistogram2D h1, h2, h2a, h2b, h2c;
 	static IHistogram2D h4,h4a;
-	static IHistogram1D h3, h3a, h3_t, h3_b;
+	static IHistogram1D h3, /*h3a,*/ h3_t, h3_b;
 	static IHistogram1D h5, h5a; 
-	static IHistogram2D h6, h6a;
+	//static IHistogram2D h6, h6a;
 	static IHistogram1D h7, h7a;
 	static IHistogram1D h8;
 	static IHistogram1D h9_t, h9_b;
 	static IHistogram1D h10_t, h10_b;
+	private static IHistogram1D h4y;
 
 	private static void extractHistograms(ITree tree0) {
 		h1 = (IHistogram2D) tree0.find("theta vs energy");
@@ -115,7 +119,7 @@
 		h2c = (IHistogram2D) tree0.find("theta vs phi alt");
 
 		h3 = (IHistogram1D) tree0.find("theta");
-		h3a = (IHistogram1D) tree0.find("theta isolated ");
+		//h3a = (IHistogram1D) tree0.find("theta isolated ");
 		h3_t = (IHistogram1D) tree0.find("theta top");
 		h3_b = (IHistogram1D) tree0.find("theta bottom");
 		
@@ -125,8 +129,8 @@
 		h5 = (IHistogram1D) tree0.find("energy top");
 		h5 = (IHistogram1D) tree0.find("energy bottom");
 
-		h6 = (IHistogram2D) tree0.find("cluster");
-		h6a = (IHistogram2D) tree0.find("cluster matched");
+//		h6 = (IHistogram2D) tree0.find("cluster");
+//		h6a = (IHistogram2D) tree0.find("cluster matched");
 		h7 = (IHistogram1D) tree0.find("y top");
 		h7a = (IHistogram1D) tree0.find("y bottom");
 		h8 = (IHistogram1D) tree0.find("seed energy");
@@ -176,7 +180,7 @@
 		h2c = hf.createHistogram2D("theta vs phi alt", "theta vs phi alt", thetaBins, phiBins);
 
 		h3 = hf.createHistogram1D("theta", "theta", thetaBins);
-		h3a = hf.createHistogram1D("theta isolated ", "theta isolated", thetaBins);
+//		h3a = hf.createHistogram1D("theta isolated ", "theta isolated", thetaBins);
 
 		h3_t = hf.createHistogram1D("theta top", "theta top", thetaBins);
 		h3_b = hf.createHistogram1D("theta bottom", "theta bottom", thetaBins);
@@ -184,7 +188,8 @@
 		
 		h4 = hf.createHistogram2D("px\\/pz vs py\\/pz", 300, -.16, .24, 300, -.2, .2);
 		h4a = hf.createHistogram2D("px\\/pz vs py\\/pz cut", 300, -.16, .24, 300, -.2, .2);
-
+		h4y = hf.createHistogram1D("py\\pz", 1200, -.06, .06);
+		
 		h5 = hf.createHistogram1D("energy top", 75, 0, 1.5);
 		h5a = hf.createHistogram1D("energy bottom", 75, 0, 1.5);
 		
@@ -192,8 +197,8 @@
 		h9_t = hf.createHistogram1D("pz top", 75, 0, 1.5);
 		h9_b = hf.createHistogram1D("pz bottom", 75, 0, 1.5);
 		
-		h6 = hf.createHistogram2D("cluster", 47, -23.5, 23.5, 11, -5.5, 5.5);
-		h6a = hf.createHistogram2D("cluster matched", 47, -23.5, 23.5, 11, -5.5, 5.5);
+//		h6 = hf.createHistogram2D("cluster", 47, -23.5, 23.5, 11, -5.5, 5.5);
+//		h6a = hf.createHistogram2D("cluster matched", 47, -23.5, 23.5, 11, -5.5, 5.5);
 
 		h7 = hf.createHistogram1D("y top", 500, 0, 100);
 
@@ -210,12 +215,15 @@
 		p.createRegions(2,2);
 		p.region(0).plot(h2);
 		StyleUtil.stylize(p.region(0), "theta", "phi");
-		p.region(1).plot(h3a);
+//		p.region(1).plot(h3a);
 		StyleUtil.stylize(p.region(1), "theta", "# of particles");
-		p.region(2).plot(h3);
-		StyleUtil.stylize(p.region(2), "theta", "# of particles");
+		p.region(2).plot(h9_t);
+		p.region(2).plot(h9_b);
+		StyleUtil.noFillHistogramBars(p.region(2));
+		StyleUtil.stylize(p.region(2), "pztilt" ,"pztilt", "# of particles");
 		p.region(3).plot(h5);
 		p.region(3).plot(h5a);
+		StyleUtil.noFillHistogramBars(p.region(3));
 		StyleUtil.stylize(p.region(3), "energy", "# of particles");
 
 		p.show();
@@ -252,9 +260,9 @@
 
 		IPlotter p6 = pf.create("efficiency");
 		p6.createRegions(1,2);
-		p6.region(0).plot(h6);
+//		p6.region(0).plot(h6);
 		StyleUtil.stylize(p6.region(0), "ix", "iy");
-		p6.region(1).plot(h6a);
+//		p6.region(1).plot(h6a);
 		StyleUtil.stylize(p6.region(1), "ix", "iy");
 		p6.show();
 
@@ -279,15 +287,22 @@
 		p9.region(0).plot(h3_b);
 		StyleUtil.stylize(p9.region(0), "theta", "theta", "# of particles");
 		StyleUtil.noFillHistogramBars(p9.region(0));
-				StyleUtil.stylize(p6.region(1), "ix", "iy");
+				//StyleUtil.stylize(p6.region(1), "ix", "iy");
 		p9.show();
 		
 		IPlotter p10 = pf.create("seed energy");
 		//p6.createRegions(1,2);
+		p10.createRegions(2,1);
 		p10.region(0).plot(h8);
 		StyleUtil.stylize(p10.region(0), "seed energy", "seed energy (GeV)", "# of particles");
+		
+		p10.region(1).plot(h10_t);
+		p10.region(1).plot(h10_b);
+		StyleUtil.noFillHistogramBars(p10.region(1));
+		StyleUtil.stylize(p10.region(1), "clust size", "n ecal hits", "# of particles");
+		
 		//StyleUtil.noFillHistogramBars(p10.region(0));
-				StyleUtil.stylize(p6.region(1), "ix", "iy");
+				//StyleUtil.stylize(p6.region(1), "ix", "iy");
 		p10.show();
 
 	}
@@ -307,80 +322,37 @@
 		List<ReconstructedParticle> particles = event.get(ReconstructedParticle.class, "FinalStateParticles");
 		particles = RemoveDuplicateParticles.removeDuplicateParticles(particles);
 		outer : for(ReconstructedParticle p : particles){
-			//check if this is a duplicate particle (ie, different track same cluster)
-			/*for(ParticleInfo cand : candidates){
-				if(p.getEnergy() == cand.E && cand.isGood == true)
-					continue outer;
-			}*/
+			
 
 			boolean isGood = addParticle(p);
-			if(!isGood){
-				if(p.getClusters().size()!= 0)
-					candidates.add(new ParticleInfo(0, p.getEnergy(), p.getClusters().get(0).getCalorimeterHits().get(0).getTime(), false));
-
-			}
-
-		}
-		for(ParticleInfo c : candidates){
-			if(c.isGood){
-				boolean isIsolated = true;
-				for(ParticleInfo c2 :candidates){
-					//try to remove events that have possible mollers in them. 
-					//correct for this later.  
-					if(Math.abs(c2.t - c.t) < 2.5 && c2.E < .3 && c2 != c){
-						isIsolated = false;
-						break;
-					}
-				}
-				if(isIsolated){
-					h3a.fill(c.theta);
-				}
-			}
-		}
-		candidates.clear();
-		processEventEfficiency(particles);
-	}
-
-	private static void processEventEfficiency(List<ReconstructedParticle> parts) {
-		for(ReconstructedParticle p : parts){
-			if(p.getClusters().size() == 0)
-				continue;
-			if(!(p.getEnergy() > eMin && p.getEnergy() < eMax))
-				continue;
-			Cluster c = p.getClusters().get(0);
-			if(!EcalUtil.fid_ECal(c) || c.getCalorimeterHits().size() < 3)
-				continue;
-			//good cluster?  now continue
-			int ixiy[] = EcalUtil.getCrystalIndex(c); 
-
-			h6.fill(ixiy[0], ixiy[1]);
-			if(p.getTracks().size() == 0)
-				continue;
-			Track t = p.getTracks().get(0);
-			if(t.getChi2()> maxChi2)
-				continue;
-			h6a.fill(ixiy[0], ixiy[1]);
-
-		}
-	}
+			
+
+		}
+		
+	}
+
+	
 
 	static double eMin = .8;
 	static double eMax = 1.2;
 	static double beamEnergy = 1.057;
 
-	static double beamTilt = .03057;
+	static double beamTiltX = .03057;
+	static double beamTiltY;
 	static double maxChi2 = 50;
 	//maximum difference between the reconstructed energy and momentum
-	static double maxdE = .3;
+	static double maxdE = .5;
 
 	static double seedEnergyCut = .4;
 
 
-	static ArrayList<ParticleInfo> candidates = new ArrayList();
 	static boolean addParticle(ReconstructedParticle part){
-
-
-
+		if(part.getTracks().size() != 0){
+			if(part.getMomentum().magnitudeSquared() > .8
+					&& part.getTracks().get(0).getChi2() > maxChi2){
+				h4y.fill(part.getMomentum().y()/part.getMomentum().z());
+			}
+		}
 		if(part.getCharge() != -1)
 			return false;
 		if(part.getClusters().size() == 0)
@@ -422,6 +394,12 @@
 		
 		if(EcalUtil.fid_ECal(c)){
 			
+			if(c.getPosition()[1] > 0){
+				h5.fill(c.getEnergy());
+			}
+			else{ 
+				h5a.fill(c.getEnergy());
+			}
 			if(part.getTracks().size() == 0)
 				return false;
 			Track t = part.getTracks().get(0);
@@ -430,12 +408,7 @@
 			}
 			if(!TrackType.isGBL(t.getType()))
 				return false;
-			if(c.getPosition()[1] > 0){
-				h5.fill(c.getEnergy());
-			}
-			else{ 
-				h5a.fill(c.getEnergy());
-			}
+			
 			
 			
 			Hep3Vector p = part.getMomentum();
@@ -443,9 +416,12 @@
 
 
 			double px = p.x(), pz = p.z();
-			double pxtilt = px*Math.cos(beamTilt)-pz*Math.sin(beamTilt);
+			double pxtilt = px*Math.cos(beamTiltX)-pz*Math.sin(beamTiltX);
 			double py = p.y();
-			double pztilt = pz*Math.cos(beamTilt)+px*Math.sin(beamTilt);
+			double pztilt = pz*Math.cos(beamTiltX)+px*Math.sin(beamTiltX);
+			
+			double pytilt = py*Math.cos(beamTiltY)-pztilt*Math.sin(beamTiltY);
+			pztilt = pz*Math.cos(beamTiltY) + pytilt*Math.sin(beamTiltY);
 
 			if(Math.abs(pztilt - c.getEnergy()) > maxdE)
 				return false;
@@ -454,8 +430,8 @@
 			else
 				h9_b.fill(pztilt);
 
-			double theta = Math.atan(Math.hypot(pxtilt, py)/pztilt);
-			double phi =Math.atan2(py, pxtilt);
+			double theta = Math.atan(Math.hypot(pxtilt, pytilt)/pztilt);
+			double phi =Math.atan2(pytilt, pxtilt);
 			boolean inRange = cb.inRange(theta, phi);
 			if(inRange)
 				h1.fill(theta, c.getEnergy());
@@ -470,6 +446,7 @@
 				h2c.fill(theta, phi);
 
 				h4.fill(px/pz, py/pz);
+				//h4y.fill(py/pz);
 
 				if(inRange){
 
@@ -492,7 +469,6 @@
 					
 					
 					h4a.fill(px/pz, py/pz);
-					candidates.add(new ParticleInfo(theta, c.getEnergy(), c.getCalorimeterHits().get(0).getTime(), true));
 				}
 
 
@@ -502,16 +478,5 @@
 		}
 		return false;
 	}
-	static class ParticleInfo{
-		double theta;
-		double E;
-		double t;
-		boolean isGood;
-		ParticleInfo(double theta, double E, double t, boolean isGood){
-			this.theta = theta;
-			this.E = E;
-			this.t = t;
-			this.isGood = isGood;
-		}
-	}
+	
 }

Modified: java/trunk/users/src/main/java/org/hps/users/spaul/feecc/RemoveDuplicateParticles.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/spaul/feecc/RemoveDuplicateParticles.java	(original)
+++ java/trunk/users/src/main/java/org/hps/users/spaul/feecc/RemoveDuplicateParticles.java	Sun Feb  7 20:22:03 2016
@@ -56,7 +56,7 @@
 			return false;
 		if(p.getTracks().size() == 1 && p.getTracks().size() == 0)
 			return true;
-		if(TrackType.isGBL(p.getTracks().get(0).getType()) && !TrackType.isGBL(p.getTracks().get(0).getType()))
+		if(TrackType.isGBL(p.getTracks().get(0).getType()) && !TrackType.isGBL(p2.getTracks().get(0).getType()))
 				return true;
 		
 		if(p.getTracks().get(0).getChi2() < p2.getTracks().get(0).getChi2()){

Modified: java/trunk/users/src/main/java/org/hps/users/spaul/feecc/ShowCustomBinningXY.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/spaul/feecc/ShowCustomBinningXY.java	(original)
+++ java/trunk/users/src/main/java/org/hps/users/spaul/feecc/ShowCustomBinningXY.java	Sun Feb  7 20:22:03 2016
@@ -24,28 +24,29 @@
 
 				double nK = 10;
 				for(int sign = -1; sign <=1; sign +=2){
-					for(int k = 0; k< nK; k++){
-						drawLineFromPolar(theta1, sign*(phi1+(phi2-phi1)*k/nK), theta1, sign*(phi1+(phi2-phi1)*(k+1)/nK),g);
-					}
-					for(int k = 0; k< nK; k++){
-						drawLineFromPolar(theta1 + (theta2-theta1)*k/nK, sign*phi2, theta1 + (theta2-theta1)*(k+1)/nK, sign*phi2,g);
-					}
-					for(int k = 0; k< nK; k++){
-						drawLineFromPolar(theta2, sign*(phi2+(phi1-phi2)*k/nK), theta2, sign*(phi2+(phi1-phi2)*(k+1)/nK),g);
-					}
-					for(int k = 0; k< nK; k++){
-						drawLineFromPolar(theta2 + (theta1-theta2)*k/nK, sign*phi1, theta2 + (theta1-theta2)*(k+1)/nK, sign*phi1,g);
+
+					Polygon p = new Polygon();
+					for(int k = 0; k< nK; k++){
+						drawLineFromPolar(theta1, sign*(phi1+(phi2-phi1)*k/nK), theta1, sign*(phi1+(phi2-phi1)*(k+1)/nK),g,p);
+					}
+					for(int k = 0; k< nK; k++){
+						drawLineFromPolar(theta1 + (theta2-theta1)*k/nK, sign*phi2, theta1 + (theta2-theta1)*(k+1)/nK, sign*phi2,g,p);
+					}
+					for(int k = 0; k< nK; k++){
+						drawLineFromPolar(theta2, sign*(phi2+(phi1-phi2)*k/nK), theta2, sign*(phi2+(phi1-phi2)*(k+1)/nK),g, p);
+					}
+					for(int k = 0; k< nK; k++){
+						drawLineFromPolar(theta2 + (theta1-theta2)*k/nK, sign*phi1, theta2 + (theta1-theta2)*(k+1)/nK, sign*phi1,g, p);
 					}
 					
-					closePolarFigure(g, i%2 == 0 ? altBin1 : altBin2, i%2 == 0 ? fillBin1 : fillBin2);
+					closePolarFigure(g, i%2 == 0 ? altBin1 : altBin2, i%2 == 0 ? fillBin1 : fillBin2, p);
 				}
 
 			}
 		}
 	}
-	Polygon p = null;
 	private void drawLineFromPolar(double theta1, double phi1, double theta2,
-			double phi2, Graphics g) {
+			double phi2, Graphics g, Polygon p) {
 		double[] xy1 = toXY(theta1, phi1);
 		double[] xy2 = toXY(theta2, phi2);
 
@@ -57,19 +58,24 @@
 				getY(xy2[1]));*/
 		p.addPoint(getX(xy2[0]), getY(xy2[1]));
 	}
-	private void closePolarFigure(Graphics g, Color outlineColor, Color fillColor){
+	private void closePolarFigure(Graphics g, Color outlineColor, Color fillColor, Polygon p){
 		g.setColor(fillColor);
 		g.fillPolygon(p);
 		g.setColor(outlineColor);
 		g.drawPolygon(p);
-		p = null;
-		
-	}
-	double tilt = .03057;
+		
+	}
+	double xtilt =  .0294;
+	double ytilt = -.00082;
 	double[] toXY(double theta, double phi){
-		double ux = Math.cos(phi)*Math.sin(theta)*Math.cos(tilt)+Math.cos(theta)*Math.sin(tilt);
+		double ux = Math.cos(phi)*Math.sin(theta)*Math.cos(xtilt)+Math.cos(theta)*Math.sin(xtilt);
 		double uy = Math.sin(phi)*Math.sin(theta);
-		double uz = Math.cos(theta)*Math.cos(tilt)-Math.cos(phi)*Math.sin(theta)*Math.sin(tilt);
+		double uz = Math.cos(theta)*Math.cos(xtilt)-Math.cos(phi)*Math.sin(theta)*Math.sin(xtilt);
+		
+		double temp = Math.cos(ytilt)*uy+Math.sin(ytilt)*uz;
+		uz = Math.cos(ytilt)*uz-Math.sin(ytilt)*uy;
+		uy = temp;
+		
 		double pxpz = ux/uz;
 		double pypz = uy/uz;
 		return new double[]{pxpz, pypz};
@@ -224,4 +230,19 @@
 			g.drawLine(getX(0), getY(i/100.), getX(0) + 5, getY(i/100.));
 		}
 	}
+	public void paint(Graphics g){
+		super.paint(g);
+		drawBeamspot(g);
+	}
+	
+	void drawBeamspot(Graphics g){
+		g.setColor(Color.red);
+		int x = getX(xtilt), y = getY(ytilt);
+		g.drawLine(x+10, y, x-10, y);
+		g.drawLine(x+10, y+1, x-10, y+1);
+		g.drawLine(x+10, y-1, x-10, y-1);
+		g.drawLine(x, y-10, x, y+10);
+		g.drawLine(x+1, y-10, x+1, y+10);
+		g.drawLine(x-1, y-10, x-1, y+10);
+	}
 }

Added: java/trunk/users/src/main/java/org/hps/users/spaul/moller/FitAllProfiles.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/spaul/moller/FitAllProfiles.java	(added)
+++ java/trunk/users/src/main/java/org/hps/users/spaul/moller/FitAllProfiles.java	Sun Feb  7 20:22:03 2016
@@ -0,0 +1,56 @@
+package org.hps.users.spaul.moller;
+
+import hep.aida.IAnalysisFactory;
+import hep.aida.IFitFactory;
+import hep.aida.IFitResult;
+import hep.aida.IFunction;
+import hep.aida.IHistogram1D;
+import hep.aida.IPlotter;
+import hep.aida.IProfile1D;
+import hep.aida.ITree;
+
+import java.io.IOException;
+
+public class FitAllProfiles {
+	static IAnalysisFactory af = IAnalysisFactory.create();
+	static IFitFactory ff = af.createFitFactory();
+	
+	public static void main(String arg[]) throws IllegalArgumentException, IOException{
+		
+		ITree tree = af.createTreeFactory().create(arg[0]); 
+		IPlotter p = af.createPlotterFactory().create();
+		p.createRegions(3,2);
+		plotAndFit(p, 0, (IHistogram1D)tree.find("pypz"));
+		plotAndFit(p, 1, (IHistogram1D)tree.find("pxpz"));
+		plotAndFit(p, 2, (IProfile1D)tree.find("pypz vs diff"));
+		plotAndFit(p, 3, (IProfile1D)tree.find("pxpz vs diff"));
+		
+		p.show();
+	}
+	public static void plotAndFit(IPlotter p, int r, IHistogram1D h){
+		p.region(r).plot(h);
+		IFitResult fit = ff.createFitter().fit(h, "g");
+		IFunction func = fit.fittedFunction();
+		System.out.println("\n" + h.title());
+		String names[] = func.parameterNames();
+		double params[] = func.parameters();
+		for(int i = 0; i< names.length; i++){
+			System.out.printf("%s: %f\n", names[i], params[i]);
+		}
+		p.region(r).plot(func);
+		
+	}
+	public static void plotAndFit(IPlotter p, int r, IProfile1D h){
+		p.region(r).plot(h);
+		IFitResult fit = ff.createFitter().fit(h, "p4");
+		IFunction func = fit.fittedFunction();
+		System.out.println("\n" + h.title());
+		String names[] = func.parameterNames();
+		double params[] = func.parameters();
+		for(int i = 0; i< names.length; i++){
+			System.out.printf("%s: %f\t", names[i], params[i]);
+		}
+		p.region(r).plot(func);
+		
+	}
+}

Added: java/trunk/users/src/main/java/org/hps/users/spaul/moller/FitMollerPyPzGraphs.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/spaul/moller/FitMollerPyPzGraphs.java	(added)
+++ java/trunk/users/src/main/java/org/hps/users/spaul/moller/FitMollerPyPzGraphs.java	Sun Feb  7 20:22:03 2016
@@ -0,0 +1,74 @@
+package org.hps.users.spaul.moller;
+
+import java.io.IOException;
+import java.util.Arrays;
+
+import org.hps.users.spaul.StyleUtil;
+
+import hep.aida.*;
+
+public class FitMollerPyPzGraphs {
+	static IAnalysisFactory af = IAnalysisFactory.create();
+	static IFitFactory ff = af.createFitFactory();
+	
+	public static void main(String arg[]) throws IllegalArgumentException, IOException{
+		
+		ITree tree = af.createTreeFactory().create(arg[0]); 
+		/*IPlotter p = af.createPlotterFactory().create();
+		p.createRegions(4,2);
+		plotAndFit(p, 0, (IHistogram1D)tree.find("pypz"), "uy all", "uy");
+		plotAndFit(p, 1, (IHistogram1D)tree.find("pxpz"), "ux all", "ux");
+		plotAndFit(p, 2, (IHistogram1D)tree.find("pypz bot"), "uy (bot)", "uy");
+		plotAndFit(p, 3, (IHistogram1D)tree.find("pxpz bot"), "ux (bot)", "ux");
+		plotAndFit(p, 4, (IHistogram1D)tree.find("pypz mid"), "uy (mid)", "uy");
+		plotAndFit(p, 5, (IHistogram1D)tree.find("pxpz mid"), "ux (mid)", "ux");
+		plotAndFit(p, 6, (IHistogram1D)tree.find("pypz top"), "uy (top)", "uy");
+		plotAndFit(p, 7, (IHistogram1D)tree.find("pxpz top"), "ux (top)", "ux");
+
+		StyleUtil.setSize(p, 1000, 500);
+		p.show();*/
+		
+
+		IPlotter p;
+		p = af.createPlotterFactory().create();
+		p.region(0).plot((IHistogram1D) tree.find("diff"));
+		StyleUtil.stylize(p.region(0), "pz top - pz bottom (GeV)", "#");
+		p.show();
+		
+		p = af.createPlotterFactory().create();
+		p.createRegions(2, 1);
+		plotAndFit(p, 0, (IHistogram1D)tree.find("pypz bot"), "bot", "uy");
+		plotAndFit(p, 1, (IHistogram1D)tree.find("pxpz bot"), "bot", "ux");
+		plotAndFit(p, 0, (IHistogram1D)tree.find("pypz mid"), "mid", "uy");
+		plotAndFit(p, 1, (IHistogram1D)tree.find("pxpz mid"), "mid", "ux");
+		plotAndFit(p, 0, (IHistogram1D)tree.find("pypz top"), "top", "uy");
+		plotAndFit(p, 1, (IHistogram1D)tree.find("pxpz top"), "top", "ux");
+		StyleUtil.setSize(p, 1000, 500);
+		p.show();
+		
+	}
+	public static void plotAndFit(IPlotter p, int r, IHistogram1D h, String title, String xAxis){
+		p.region(r).plot(h);
+		h.setTitle(title);
+		StyleUtil.noFillHistogramBars(p.region(r));
+		IFitResult fit = ff.createFitter().fit(h, "g");
+		StyleUtil.stylize(p.region(r), title, xAxis, "#");
+		IFunction func = fit.fittedFunction();
+		System.out.println("\n" + h.title());
+		String names[] = func.parameterNames();
+		double params[] = func.parameters();
+		for(int i = 0; i< names.length; i++){
+			System.out.printf("%s: %f\t", names[i], params[i]);
+		}
+		//System.out.println(Arrays.toString(fit.);
+		
+		p.region(r).plot(func);
+		StyleUtil.stylize(p.region(r), title, xAxis, "#");
+		p.region(r).style().statisticsBoxStyle().setVisible(true);
+		p.region(r).style().legendBoxStyle().setVisible(false);
+		//System.out.println(Arrays.toString(p.region(r).style().statisticsBoxStyle().availableParameters()));
+		//p.show();
+	}
+	
+	
+}

Added: java/trunk/users/src/main/java/org/hps/users/spaul/moller/MollerBeamtiltAnalysis.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/spaul/moller/MollerBeamtiltAnalysis.java	(added)
+++ java/trunk/users/src/main/java/org/hps/users/spaul/moller/MollerBeamtiltAnalysis.java	Sun Feb  7 20:22:03 2016
@@ -0,0 +1,314 @@
+package org.hps.users.spaul.moller;
+
+import java.util.List;
+
+import hep.aida.IHistogram1D;
+import hep.aida.IHistogram2D;
+import hep.aida.IPlotter;
+import hep.aida.IProfile1D;
+
+import org.hps.recon.tracking.TrackType;
+import org.hps.users.spaul.StyleUtil;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.ReconstructedParticle;
+import org.lcsim.event.Vertex;
+import org.lcsim.util.Driver;
+import org.lcsim.util.aida.AIDA;
+
+public class MollerBeamtiltAnalysis extends Driver{
+	@Override
+	public void process(EventHeader event){
+		List<Vertex> mollers = event.get(Vertex.class, "TargetConstrainedMollerVertices");
+		for(Vertex v : mollers){
+			if(!passesCuts(v))
+				continue;
+			ReconstructedParticle m = v.getAssociatedParticle();
+			ReconstructedParticle top;
+			ReconstructedParticle bottom;
+			if(m.getParticles().get(0).getMomentum().y()>0){
+				top = m.getParticles().get(0);
+				bottom = m.getParticles().get(1);
+			}else{
+				top = m.getParticles().get(1);
+				bottom = m.getParticles().get(0);
+			}
+
+			double pypz = m.getMomentum().y()/m.getMomentum().z();
+			double pxpz = m.getMomentum().x()/m.getMomentum().z();
+			//double pypz = (top.getMomentum().y()+bottom.getMomentum().y())/(top.getMomentum().z()+bottom.getMomentum().z());
+			//double pxpz = (top.getMomentum().x()+bottom.getMomentum().x())/(top.getMomentum().z()+bottom.getMomentum().z());
+
+			hpypz.fill(pypz);
+			hpxpz.fill(pxpz);
+
+
+			double diff = top.getMomentum().z()-bottom.getMomentum().z();
+			double sum = m.getMomentum().z();//top.getMomentum().z()+bottom.getMomentum().z();
+			double mass = m.getMass();
+
+			if(diff > -.05 && diff < .05){
+				hpypz_mid.fill(pypz);
+				hpxpz_mid.fill(pxpz);
+			}
+
+			if(diff > .2 && diff < .3){
+				hpypz_topHighE.fill(pypz);
+				hpxpz_topHighE.fill(pxpz);
+			}
+
+			if(diff > -.3 && diff < -.2){
+				hpypz_botHighE.fill(pypz);
+				hpxpz_botHighE.fill(pxpz);
+			}
+
+
+			this.diff.fill(diff);
+			this.sum.fill(sum);
+			this.mass.fill(mass);
+			pypz_vs_diff.fill(diff,pypz );
+			pxpz_vs_diff.fill(diff, pxpz );
+
+
+
+			pxpz_vs_sum.fill(sum, pxpz );
+			pypz_vs_sum.fill(sum, pypz );
+
+			pxpz_vs_mass.fill(mass, pxpz );
+			pypz_vs_mass.fill(mass, pypz );
+			timediff.fill(top.getClusters().get(0).getCalorimeterHits().get(0).getTime()
+					-bottom.getClusters().get(0).getCalorimeterHits().get(0).getTime());
+			/*if(moreEnergetic.getMomentum().y() > 0)
+			{
+				pypz_tophighE.fill(pypz);
+				pxpz_tophighE.fill(pxpz);
+			}
+			if(moreEnergetic.getMomentum().y() < 0)
+			{
+				pypz_bottomhighE.fill(pypz);
+				pxpz_bottomhighE.fill(pxpz);
+			}*/
+		}
+	}
+
+	double _maxVtxChi2 = 15;
+	double _maxTrkChi2 = 30;
+	double _maxMass = .037;
+	double _minMass = .030;
+	double _minPz = 1.0;
+	double _maxPz = 1.1;
+	boolean passesCuts(Vertex vertex){
+		ReconstructedParticle m = vertex.getAssociatedParticle();
+		if(!TrackType.isGBL(m.getType()))
+			return false;
+		if(m.getMomentum().z() > _maxPz || m.getMomentum().z() < _minPz)
+			return false;
+		if(m.getMass() > _maxMass || m.getMass() < _minMass)
+			return false;
+
+		if(m.getParticles().get(0).getCharge() != -1 
+				|| m.getParticles().get(1).getCharge() != -1 )
+			return false;
+
+		if(vertex.getChi2() > _maxVtxChi2)
+			return false;
+
+
+		if(m.getParticles().get(0).getClusters().size() == 0)
+			return false;
+		if(m.getParticles().get(1).getClusters().size() == 0)
+			return false;
+
+		if(m.getParticles().get(0).getTracks().get(0).getChi2() > _maxTrkChi2)
+			return false;
+		if(m.getParticles().get(1).getTracks().get(0).getChi2() > _maxTrkChi2)
+			return false;
+		return true;
+	}
+
+	IHistogram1D hpypz, hpxpz, diff, sum, mass,
+	hpypz_topHighE, hpxpz_topHighE,
+	hpypz_botHighE, hpxpz_botHighE,
+	hpypz_mid, hpxpz_mid;
+
+	boolean display = false;
+
+
+
+
+	public double getMaxVtxChi2() {
+		return _maxVtxChi2;
+	}
+
+
+	public void setMaxVtxChi2(double _maxVtxChi2) {
+		this._maxVtxChi2 = _maxVtxChi2;
+	}
+
+
+	public double getMaxTrkChi2() {
+		return _maxTrkChi2;
+	}
+
+
+	public void setMaxTrkChi2(double _maxTrkChi2) {
+		this._maxTrkChi2 = _maxTrkChi2;
+	}
+
+
+	public double getMaxMass() {
+		return _maxMass;
+	}
+
+
+	public void setMaxMass(double _maxMass) {
+		this._maxMass = _maxMass;
+	}
+
+
+	public double getMinMass() {
+		return _minMass;
+	}
+
+
+	public void setMinMass(double _minMass) {
+		this._minMass = _minMass;
+	}
+
+
+	public double getMinPz() {
+		return _minPz;
+	}
+
+
+	public void setMinPz(double _minPz) {
+		this._minPz = _minPz;
+	}
+
+
+	public double getMaxPz() {
+		return _maxPz;
+	}
+
+
+	public void setMaxPz(double _maxPz) {
+		this._maxPz = _maxPz;
+	}
+
+
+	public boolean getDisplay() {
+		return display;
+	}
+
+
+	public void setDisplay(boolean display) {
+		this.display = display;
+	}
+
+	IHistogram1D vtx_x, vtx_y, timediff;
+
+	IProfile1D pxpz_vs_diff, pypz_vs_diff, pxpz_vs_sum, pypz_vs_sum,
+	pxpz_vs_mass, pypz_vs_mass;
+
+
+	//IHistogram1D pypz_tophighE, pxpz_tophighE;
+	//IHistogram1D pypz_bottomhighE, pxpz_bottomhighE;
+	@Override
+	public void startOfData(){
+		AIDA aida = AIDA.defaultInstance();
+		hpypz = aida.histogram1D("pypz", 60, -.005,.005);
+		hpxpz = aida.histogram1D("pxpz", 60, .025,.035);
+
+
+		hpypz_mid = aida.histogram1D("pypz mid", 60, -.005,.005);
+		hpxpz_mid = aida.histogram1D("pxpz mid", 60, .025,.035);
+
+		hpypz_topHighE = aida.histogram1D("pypz top", 30, -.005,.005);
+		hpxpz_topHighE = aida.histogram1D("pxpz top", 30, .025,.035);
+
+		hpypz_botHighE = aida.histogram1D("pypz bot", 30, -.005,.005);
+		hpxpz_botHighE = aida.histogram1D("pxpz bot", 30, .025,.035);
+
+
+		pxpz_vs_diff = aida.profile1D("pxpz vs diff", 25, -.60, .60);
+		pypz_vs_diff = aida.profile1D("pypz vs diff", 25, -.60, .60);
+
+		diff = aida.histogram1D("diff", 50, -.60, .60);
+
+		sum = aida.histogram1D("sum", 50, 1.0, 1.1);
+
+		pxpz_vs_sum = aida.profile1D("pxpz vs sum", 25, 1.0, 1.1);
+		pypz_vs_sum = aida.profile1D("pypz vs sum", 25, 1.0, 1.1);
+
+		pxpz_vs_mass = aida.profile1D("pxpz vs mass", 25, .03, .037);
+		pypz_vs_mass = aida.profile1D("pypz vs mass", 25, .03, .037);
+
+		//vtx_x = aida.histogram1D("vtx x", 60, -1, 1);
+		//vtx_y = aida.histogram1D("vtx y", 60, -1, 1);
+		mass = aida.histogram1D("mass", 60, .030, .037);
+		timediff = aida.histogram1D("time diff", 60, -6, 6);
+
+
+		/*pypz_tophighE = aida.histogram1D("topHighE pypz", 60, -.005,.005);
+		pxpz_tophighE = aida.histogram1D("topHighE pxpz", 60,  .025,.035);
+		pypz_bottomhighE = aida.histogram1D("bottomHighE pypz", 60, -.005,.005);
+		pxpz_bottomhighE = aida.histogram1D("bottomHighE pxpz", 60, .025,.035);*/
+		if(display){
+			IPlotter p = aida.analysisFactory().createPlotterFactory().create();
+			StyleUtil.setSize(p, 1300, 900);
+			//p.createRegions(3, 2);
+			p.createRegions(4, 3);
+
+			p.region(0).plot(hpypz);
+			p.region(1).plot(hpxpz);
+			p.region(2).plot(timediff);
+			p.region(3).plot(pypz_vs_diff);
+			p.region(4).plot(pxpz_vs_diff);
+			p.region(5).plot(diff);
+			p.region(6).plot(pypz_vs_sum);
+			p.region(7).plot(pxpz_vs_sum);
+			p.region(8).plot(sum);
+
+			p.region(9).plot(pypz_vs_mass);
+			p.region(10).plot(pxpz_vs_mass);
+			p.region(11).plot(mass);
+			/*p.region(2).plot(pypz_tophighE);
+		p.region(3).plot(pxpz_tophighE);
+		p.region(4).plot(pypz_bottomhighE);
+		p.region(5).plot(pxpz_bottomhighE);*/
+			StyleUtil.stylize(p.region(0),"py/pz", "py/pz", "#");
+			StyleUtil.stylize(p.region(1),"px/pz", "px/pz", "#");
+			StyleUtil.stylize(p.region(2),"time diff (t-b)", "diff (ns)", "#");
+			StyleUtil.stylize(p.region(3),"py/pz vs diff", "diff (GeV)", "py/pz");
+			StyleUtil.stylize(p.region(4),"px/pz vs diff", "diff (GeV)", "px/pz");
+			StyleUtil.stylize(p.region(5),"diff", "diff (GeV)", "#");
+
+			StyleUtil.stylize(p.region(6),"py/pz vs sum", "sum (GeV)", "py/pz");
+			StyleUtil.stylize(p.region(7),"px/pz vs sum", "sum (GeV)", "px/pz");
+			StyleUtil.stylize(p.region(8),"sum", "sum (GeV)", "#");
+
+			StyleUtil.stylize(p.region(9),"py/pz vs mass", "mass (GeV)", "py/pz");
+			StyleUtil.stylize(p.region(10),"px/pz vs mass", "mass (GeV)", "px/pz");
+			StyleUtil.stylize(p.region(11),"mass", "mass (GeV)", "#");
+
+			p.show();
+
+			IPlotter p2 = aida.analysisFactory().createPlotterFactory().create();
+
+			p2.createRegions(2, 1);
+
+
+			p2.region(0).plot(hpypz_botHighE);
+			p2.region(1).plot(hpxpz_botHighE);
+			p2.region(0).plot(hpypz_mid);
+			p2.region(1).plot(hpxpz_mid);
+			p2.region(0).plot(hpypz_topHighE);
+			p2.region(1).plot(hpxpz_topHighE);
+
+			StyleUtil.stylize(p2.region(0),"py/pz", "py/pz", "#");
+			StyleUtil.stylize(p2.region(1),"px/pz", "py/pz", "#");
+			StyleUtil.noFillHistogramBars(p2.region(0));
+			StyleUtil.noFillHistogramBars(p2.region(1));
+			p2.show();
+		}
+	}
+}

Added: java/trunk/users/src/main/java/org/hps/users/spaul/moller/MollerBeamtiltFitter.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/spaul/moller/MollerBeamtiltFitter.java	(added)
+++ java/trunk/users/src/main/java/org/hps/users/spaul/moller/MollerBeamtiltFitter.java	Sun Feb  7 20:22:03 2016
@@ -0,0 +1,65 @@
+package org.hps.users.spaul.moller;
+
+import hep.aida.IAnalysisFactory;
+import hep.aida.IFitFactory;
+import hep.aida.IFitResult;
+import hep.aida.IFunction;
+import hep.aida.IHistogram1D;
+import hep.aida.IPlotter;
+import hep.aida.IPlotterFactory;
+import hep.aida.IPlotterStyle;
+import hep.aida.ITree;
+
+import java.io.IOException;
+
+import org.hps.users.spaul.StyleUtil;
+
+public class MollerBeamtiltFitter {
+	static IAnalysisFactory af = IAnalysisFactory.create();
+	static IFitFactory ff = af.createFitFactory();
+	static IPlotterFactory pf = af.createPlotterFactory();
+	
+	public static void main(String arg[]) throws IllegalArgumentException, IOException{
+		
+		ITree tree = af.createTreeFactory().create(arg[0]); 
+		
+
+		IPlotter p;
+		
+		p = pf.create();
+		p.createRegions(2, 1);
+
+		plotAndFit(p, 0, (IHistogram1D)tree.find("pxpz"), "ux", "ux");
+		plotAndFit(p, 1, (IHistogram1D)tree.find("pypz"), "uy", "uy");
+		StyleUtil.setSize(p, 1000, 500);
+		p.show();
+		
+	}
+	public static void plotAndFit(IPlotter p, int r, IHistogram1D h, String title, String xAxis){
+		p.region(r).plot(h);
+		h.setTitle(title);
+		
+		double xmin = h.mean()-2*h.rms();
+		double xmax = h.mean()+2*h.rms();
+		String range = String.format("range=\"(%f,%f)\"", xmin, xmax);
+		//range = "";
+		IFitResult fit = ff.createFitter().fit(h, "g", range);
+		IFunction func = fit.fittedFunction();
+		System.out.println("\n" + h.title());
+		String names[] = func.parameterNames();
+		double params[] = func.parameters();
+		for(int i = 0; i< names.length; i++){
+			System.out.printf("%s: %f\t", names[i], params[i]);
+		}
+		//System.out.println(Arrays.toString(fit.);
+		IPlotterStyle style = p.region(r).style();
+		style.dataStyle().outlineStyle().setColor("blue");
+		p.region(r).plot(func, style);
+		StyleUtil.noFillHistogramBars(p.region(r));
+		StyleUtil.stylize(p.region(r), title, xAxis, "#");
+		p.region(r).style().statisticsBoxStyle().setVisible(true);
+		p.region(r).style().legendBoxStyle().setVisible(false);
+		//System.out.println(Arrays.toString(p.region(r).style().statisticsBoxStyle().availableParameters()));
+		//p.show();
+	}
+}

Added: java/trunk/users/src/main/java/org/hps/users/spaul/moller/MollerStdhepTest.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/spaul/moller/MollerStdhepTest.java	(added)
+++ java/trunk/users/src/main/java/org/hps/users/spaul/moller/MollerStdhepTest.java	Sun Feb  7 20:22:03 2016
@@ -0,0 +1,15 @@
+package org.hps.users.spaul.moller;
+
+import java.io.IOException;
+
+import hep.io.mcfio.MCFIOEvent;
+import hep.io.stdhep.StdhepReader;
+import hep.io.stdhep.StdhepRecord;
+
+public class MollerStdhepTest 
+{
+	public static void main(String arg[]) throws IOException
+	{
+		
+	}
+}