Author: [log in to unmask]
Date: Tue Nov 17 11:36:53 2015
New Revision: 3965
Log:
added some of Sebouh's private files and made them public.
Added:
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/
java/trunk/users/src/main/java/org/hps/users/spaul/feecc/BinGenerator.java
java/trunk/users/src/main/java/org/hps/users/spaul/feecc/CustomBinning.java
java/trunk/users/src/main/java/org/hps/users/spaul/feecc/DisplayHistograms.java
java/trunk/users/src/main/java/org/hps/users/spaul/feecc/EcalUtil.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/ShowCustomBinning.java
java/trunk/users/src/main/java/org/hps/users/spaul/feecc/analysis/
java/trunk/users/src/main/java/org/hps/users/spaul/feecc/analysis/CountsPerBinVsCharge.java
java/trunk/users/src/main/java/org/hps/users/spaul/feecc/analysis/ExtractCrossSections.java
java/trunk/users/src/main/java/org/hps/users/spaul/feecc/analysis/PlotPhiDependence.java
Added: java/trunk/users/src/main/java/org/hps/users/spaul/StyleUtil.java
=============================================================================
--- java/trunk/users/src/main/java/org/hps/users/spaul/StyleUtil.java (added)
+++ java/trunk/users/src/main/java/org/hps/users/spaul/StyleUtil.java Tue Nov 17 11:36:53 2015
@@ -0,0 +1,56 @@
+package org.hps.users.spaul;
+
+import java.util.Arrays;
+
+import hep.aida.IAnalysisFactory;
+import hep.aida.IFunction;
+import hep.aida.IPlotterRegion;
+
+public class StyleUtil {
+
+ public static void stylize(IPlotterRegion r, String title, String lx, String ly, double xmin, double xmax, double ymin, double ymax){
+ r.setTitle(title);
+ stylize(r, lx, ly);
+ r.setXLimits(xmin, xmax);
+ r.setYLimits(ymin, ymax);
+ }
+ public static void stylize(IPlotterRegion r, String title, String lx, String ly){
+ r.setTitle(title);
+ stylize(r, lx, ly);
+ }
+ public static void stylize(IPlotterRegion r, String lx, String ly){
+
+ r.style().titleStyle().textStyle().setFontSize(22);
+ r.style().xAxisStyle().setLabel(lx);
+ r.style().xAxisStyle().labelStyle().setFontSize(16);
+ r.style().xAxisStyle().tickLabelStyle().setFontSize(14);
+ r.style().yAxisStyle().setLabel(ly);
+ r.style().yAxisStyle().labelStyle().setFontSize(16);
+ r.style().yAxisStyle().tickLabelStyle().setFontSize(14);
+ r.style().statisticsBoxStyle().setParameter("backgroundColor", "white");
+ r.style().statisticsBoxStyle().boxStyle().backgroundStyle().setColor("White");
+ r.style().statisticsBoxStyle().boxStyle().backgroundStyle().setParameter("color", "white");
+ r.style().statisticsBoxStyle().boxStyle().backgroundStyle().setOpacity(100);
+ System.out.println(Arrays.toString(r.style().dataStyle().availableParameters()));
+ r.style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+ r.style().dataStyle().fillStyle().setParameter("showZeroHeightBins", "false");
+ //r.style().dataStyle().setParameter("showDataInStatisticsBox", "false");
+ r.style().setParameter("hist2DStyle", "colorMap");
+ //r.style().dataBoxStyle()
+ }
+ static void addHorizontalLine(IPlotterRegion r, double y, String name){
+ IAnalysisFactory af = IAnalysisFactory.create();
+ IFunction f = af.createFunctionFactory(af.createTreeFactory().create()).createFunctionByName(name, "p0");
+ f.setParameter("p0", y);
+ r.plot(f);
+ }
+ public static void addParabola(IPlotterRegion region, double p0,
+ double p1, double p2, String string) {
+ IAnalysisFactory af = IAnalysisFactory.create();
+ IFunction f = af.createFunctionFactory(af.createTreeFactory().create()).createFunctionByName(string, "p2");
+ f.setParameter("p0", p0);
+ f.setParameter("p1", p1);
+ f.setParameter("p2", p2);
+ region.plot(f);
+ }
+}
Added: java/trunk/users/src/main/java/org/hps/users/spaul/SumEverything.java
=============================================================================
--- java/trunk/users/src/main/java/org/hps/users/spaul/SumEverything.java (added)
+++ java/trunk/users/src/main/java/org/hps/users/spaul/SumEverything.java Tue Nov 17 11:36:53 2015
@@ -0,0 +1,89 @@
+package org.hps.users.spaul;
+
+import java.io.File;
+import java.io.IOException;
+
+import hep.aida.IAnalysisFactory;
+import hep.aida.IHistogram1D;
+import hep.aida.IHistogram2D;
+import hep.aida.IHistogramFactory;
+import hep.aida.ITree;
+import hep.aida.ITreeFactory;
+
+//sums up everything in a folder full of files containing histograms. Pretty convenient.
+// or if one arg is given, assume that that one arg is a folder full of folders
+// full of aida output files. Then add up all of the histograms in each sub folder,
+// and put the sums in separate files in a folder called "sums"
+public class SumEverything {
+ public static void main(String arg[]) throws IllegalArgumentException, IOException{
+ if(arg.length > 1){
+ twoArg(arg[0], arg[1]);
+ }
+ else{
+ oneArg(arg[0]);
+ }
+ }
+ static void oneArg(String indir) throws IllegalArgumentException, IOException{
+ File outdir = new File(indir + "/sums");
+ outdir.mkdir();
+ for(File subdirf : new File(indir).listFiles()){
+ String subdir = subdirf.getAbsolutePath();
+ if(subdir.matches(".*/sums/?"))
+ continue;
+ String split[] = subdir.split("/");
+ String outfile = indir + "/sums/" + split[split.length-1] + ".aida";
+ twoArg(subdir, outfile);
+ }
+ new File(indir + "/sums/total.aida").delete();
+ twoArg(outdir.getAbsolutePath(), indir + "/sums/total.aida");
+
+ }
+
+ static void twoArg(String indir, String out) throws IllegalArgumentException, IOException{
+ IAnalysisFactory af = IAnalysisFactory.create();
+ ITreeFactory tf = af.createTreeFactory();
+ new File(out).delete();
+ ITree tree0 = tf.create(out, "xml", false, true);
+ IHistogramFactory hf = af.createHistogramFactory(tree0);
+
+
+ int j = 0;
+ for(File s : new File(indir).listFiles()){
+ ITree tree = af.createTreeFactory().create(s.getAbsolutePath(),"xml");
+
+
+ if(j == 0){
+ String [] names = tree.listObjectNames();
+ tree0.mount("/tmp", tree, "/");
+ for(String name : names){
+ Object o = tree.find(name);
+ if(o instanceof IHistogram1D || o instanceof IHistogram2D)
+ tree0.cp("/tmp/" + name, name);
+ }
+ tree0.unmount("/tmp");
+ tree.close();
+
+ }
+ else{
+ //tree.
+ String [] names = tree.listObjectNames();
+ tree0.mount("/tmp", tree, "/");
+ for(String name : names){
+ Object o = tree.find(name);
+ if(o instanceof IHistogram1D)
+ ((IHistogram1D)tree0.find(name)).add((IHistogram1D)o);
+ if(o instanceof IHistogram2D)
+ ((IHistogram2D)tree0.find(name)).add((IHistogram2D)o);
+ }
+ tree0.unmount("/tmp");
+ tree.close();
+ }
+
+ tree.close();
+ j++;
+ System.out.println(j + " files have been read");
+ }
+ tree0.commit();
+ }
+}
+
Added: java/trunk/users/src/main/java/org/hps/users/spaul/feecc/BinGenerator.java
=============================================================================
--- java/trunk/users/src/main/java/org/hps/users/spaul/feecc/BinGenerator.java (added)
+++ java/trunk/users/src/main/java/org/hps/users/spaul/feecc/BinGenerator.java Tue Nov 17 11:36:53 2015
@@ -0,0 +1,80 @@
+package org.hps.users.spaul.feecc;
+
+import java.io.FileNotFoundException;
+import java.io.PrintStream;
+import java.io.PrintWriter;
+
+public class BinGenerator {
+ public static void main(String arg[]) throws FileNotFoundException{
+ int nBins = 20;
+
+ PrintStream pw = new PrintStream("generatedbins.txt");
+ pw.println(nBins);
+ double[] thetaBins = getThetaBins(nBins);
+ for(int i = 0; i< nBins; i++){
+ double thetaMin = thetaBins[i];
+ double thetaMax = thetaBins[i+1];
+ double phiBounds[] = getPhiBounds(thetaMin, thetaMax);
+ pw.printf("%d %.4f %.4f ", phiBounds.length/2, thetaMin, thetaMax);
+ for(int j = 0; j< phiBounds.length; j++){
+ pw.printf("%.4f ", phiBounds[j]);
+ }
+ pw.println();
+ }
+ ShowCustomBinning.main(new String[]{"generatedbins.txt"});
+
+ }
+
+ private static double[] getThetaBins(int nBins){
+ /*double thetaMin = 0.035;
+ double dTheta = .2/nBins;
+ double[] bins = new double[nBins +1];
+ for(int i = 0; i< nBins+1; i++){
+ bins[i] = thetaMin+dTheta*i;
+ }
+ return bins; */
+ double thetaMax = .145;
+ double thetaMin = .035;
+
+ double[] bins = new double[nBins +1];
+ double xMin = 1/(thetaMax*thetaMax);
+ double xMax = 1/(thetaMin*thetaMin);
+ for(int i = 0; i< nBins+1; i++){
+ double x = xMax - i*(xMax-xMin)/nBins;
+ bins[i] = Math.pow(x, -.5);
+ }
+ return bins;
+ }
+ private static double[] getPhiBounds(double thetaMin, double thetaMax){
+ double phiBins[] = new double[6];
+ double dphi = .01;
+ int edgeNumber = 0;
+
+ boolean prevInRange = false;
+ for(double phi = 0; phi< 3.14; phi+= dphi){
+ boolean inRange = EcalUtil.fid_ECal_spherical(thetaMin, phi) && EcalUtil.fid_ECal_spherical(thetaMax, phi)
+ && EcalUtil.fid_ECal_spherical(thetaMin, -phi) && EcalUtil.fid_ECal_spherical(thetaMax, -phi);
+ if(inRange && !prevInRange)
+ phiBins[edgeNumber++] = phi;
+ if(prevInRange && !inRange)
+ phiBins[edgeNumber++] = phi-dphi;
+ prevInRange = inRange;
+ }
+ if(phiBins[2] == 0)
+ return new double[]{phiBins[0], phiBins[1]};
+ if(phiBins[4] == 0)
+ return new double[]{phiBins[0], phiBins[1],phiBins[2], phiBins[3]};
+
+ //3 segments: choose the largest two
+ if(phiBins[4] != 0 && phiBins[1] - phiBins[0] > phiBins[3]-phiBins[2] && phiBins[5] - phiBins[4] > phiBins[3]-phiBins[2]){
+ return new double[]{phiBins[0], phiBins[1],phiBins[4], phiBins[5]};
+ }
+ if(phiBins[4] != 0 && phiBins[3] - phiBins[2] > phiBins[1]-phiBins[0] && phiBins[5] - phiBins[4] > phiBins[1]-phiBins[0]){
+ return new double[]{phiBins[2], phiBins[3],phiBins[4], phiBins[5]};
+ }
+ return new double[]{phiBins[0], phiBins[1],phiBins[2], phiBins[3]};
+
+
+ }
+
+}
Added: java/trunk/users/src/main/java/org/hps/users/spaul/feecc/CustomBinning.java
=============================================================================
--- java/trunk/users/src/main/java/org/hps/users/spaul/feecc/CustomBinning.java (added)
+++ java/trunk/users/src/main/java/org/hps/users/spaul/feecc/CustomBinning.java Tue Nov 17 11:36:53 2015
@@ -0,0 +1,96 @@
+package org.hps.users.spaul.feecc;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.util.Scanner;
+
+public class CustomBinning {
+ public CustomBinning(File f) throws FileNotFoundException{
+ Scanner s = new Scanner(f);
+
+ nTheta = s.nextInt(); //number of bins in theta;
+ thetaMax = new double[nTheta];
+ thetaMin = new double[nTheta];
+
+ phiMax = new double[nTheta][];
+ phiMin = new double[nTheta][];
+ int i = 0;
+ while(s.hasNext()){ //new row
+ int nPhi = s.nextInt();
+ thetaMin[i] = s.nextDouble();
+ thetaMax[i] = s.nextDouble();
+
+ phiMax[i] = new double[nPhi];
+ phiMin[i] = new double[nPhi];
+ for(int j = 0; j<nPhi; j++){
+ phiMin[i][j] = s.nextDouble();
+ phiMax[i][j] = s.nextDouble();
+ }
+ i++;
+ }
+ }
+ double[][] phiMax;
+ double[][] phiMin;
+ public double thetaMax[], thetaMin[];
+ public int nTheta;
+
+ double getSteradians(int binNumber){
+ double t1 = thetaMin[binNumber];
+ double t2 = thetaMax[binNumber];
+ double dCos = Math.cos(t1)-Math.cos(t2);
+ double dPhiTot = 0;
+ for(int i = 0; i< phiMax[binNumber].length; i++){
+ dPhiTot += phiMax[binNumber][i]-phiMin[binNumber][i];
+ }
+ return 2*dPhiTot*dCos; //factor of two because top and bottom
+ }
+ boolean inRange(double theta, double phi){
+ phi = Math.abs(phi);
+ /*int i =(int) Math.floor((theta-theta0)/deltaTheta);
+ if(i>= nTheta || i<0)
+ return false;*/
+ if(theta > thetaMax[nTheta-1] || theta < thetaMin[0])
+ return false;
+ int i;
+ boolean found = false;
+ for(i = 0; i< nTheta; i++){
+ if(theta > thetaMin[i] && theta < thetaMax[i]){
+ found = true;
+ break;
+ }
+ }
+ if(!found)
+ return false;
+
+ for(int j = 0; j<phiMax[i].length; j++){
+ if(phi>phiMin[i][j] && phi< phiMax[i][j])
+ return true;
+ }
+ return false;
+
+ }
+ public double getTotSteradians() {
+ double tot = 0;
+ for(int i = 0; i<nTheta; i++){
+ tot += getSteradians(i);
+ }
+ return tot;
+ }
+ /**
+ * @param bin
+ * @param a = 2E/M
+ * @return the integral of 1/sin^4(th/2)*cos^2(th/2)/(1+a*sin^2(th/2)) times dPhi,
+ * which appears in the integral of mott scattering.
+ */
+ public double mottIntegralFactor(double a, int bin){
+ double dPhi = 0;
+ for(int i = 0; i< phiMax[bin].length; i++)
+ dPhi += 2*(phiMax[bin][0] - phiMin[bin][0]); //factor of 2 from top and bottom
+
+ double csc2 = Math.pow(Math.sin(thetaMax[bin]/2), -2);
+ double Imax = (-csc2+(1+a)*Math.log(a+2*csc2));
+ csc2 = Math.pow(Math.sin(thetaMin[bin]/2), -2);
+ double Imin = (-csc2+(1+a)*Math.log(a+2*csc2));
+ return 2*dPhi*(Imax-Imin);
+ }
+}
Added: java/trunk/users/src/main/java/org/hps/users/spaul/feecc/DisplayHistograms.java
=============================================================================
--- java/trunk/users/src/main/java/org/hps/users/spaul/feecc/DisplayHistograms.java (added)
+++ java/trunk/users/src/main/java/org/hps/users/spaul/feecc/DisplayHistograms.java Tue Nov 17 11:36:53 2015
@@ -0,0 +1,9 @@
+package org.hps.users.spaul.feecc;
+
+import java.io.IOException;
+
+public class DisplayHistograms {
+ public static void main(String arg[]) throws IllegalArgumentException, IOException{
+ MakeHistograms.main(new String[]{arg[0]});
+ }
+}
Added: java/trunk/users/src/main/java/org/hps/users/spaul/feecc/EcalUtil.java
=============================================================================
--- java/trunk/users/src/main/java/org/hps/users/spaul/feecc/EcalUtil.java (added)
+++ java/trunk/users/src/main/java/org/hps/users/spaul/feecc/EcalUtil.java Tue Nov 17 11:36:53 2015
@@ -0,0 +1,164 @@
+package org.hps.users.spaul.feecc;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Scanner;
+
+
+import org.lcsim.event.CalorimeterHit;
+import org.lcsim.event.Cluster;
+
+public class EcalUtil {
+ /**
+ * Holly's algorithm.
+ * @param x x position of cluster
+ * @param y y position of cluster
+ * @param e energy of cluster
+ * @param pid type of particle (11 = electron; -1 = positron)
+ * @return array of doubles
+ * <br> [0] theta = atan(py/pz)
+ * <br> [1] phi = atan(px/pz)
+ */
+ static double [] toHollysCoordinates(double x, double y, double e, int pid){
+ if(pid == 11){
+ return new double[]{0.00071 * y +0.000357, 0.00071*x + 0.00003055*e + 0.04572/e +0.0006196};
+ } else if(pid == -11){
+ return new double[]{0.00071 * y +0.000357, 0.00071*x - 0.0006465*e + 0.045757/e +0.003465};
+ }
+ return null;
+ }
+
+ static double getSteradians(double x, double y, double e,int pid, double dA){
+ double thetaPhi[] = toHollysCoordinates(x, y, e, pid);
+ return .00071*.00071*dA/Math.sqrt(thetaPhi[0]*thetaPhi[0]+ thetaPhi[1]*thetaPhi[1]+1);
+ }
+
+ static boolean isSeedEdge(Cluster c){
+ CalorimeterHit seedhit = (CalorimeterHit)c.getCalorimeterHits().get(0);
+ // seedhit
+ int ix = seedhit.getIdentifierFieldValue("ix");
+ int iy = seedhit.getIdentifierFieldValue("iy");
+
+ //seedhit.get
+ return isEdge(ix, iy);
+ }
+ static boolean isEdge(int ix, int iy){
+ if(iy == 5 || iy == 1 || iy == -1 || iy == -5)
+ return true;
+ if(ix == -23 || ix == 23)
+ return true;
+ if((iy == 2 || iy == -2) && (ix >=-11 && ix <= -1))
+ return true;
+ return false;
+ }
+ public static boolean fid_ECal(Cluster c){
+ return fid_ECal(c.getPosition()[0], c.getPosition()[1]);
+ }
+ public static boolean fid_ECal(double x, double y)
+ {
+ y = Math.abs(y);
+
+ boolean in_fid = false;
+ double x_edge_low = -262.74;
+ double x_edge_high = 347.7;
+ double y_edge_low = 33.54;
+ double y_edge_high = 75.18;
+
+ double x_gap_low = -106.66;
+ double x_gap_high = 42.17;
+ double y_gap_high = 47.18;
+
+ y = Math.abs(y);
+
+ if( x > x_edge_low && x < x_edge_high && y > y_edge_low && y < y_edge_high )
+ {
+ if( !(x > x_gap_low && x < x_gap_high && y > y_edge_low && y < y_gap_high) )
+ {
+ in_fid = true;
+ }
+ }
+
+ return in_fid;
+ }
+ static double[] toSphericalFromBeam(double pxpz, double pypz){
+ double x = pxpz, y = pypz, z = 1;
+ double beamTilt = .03057;
+ double xtemp = Math.cos(beamTilt)*x - Math.sin(beamTilt)*z;
+ double ztemp = Math.cos(beamTilt)*z + Math.sin(beamTilt)*x;
+ double ytemp = y;
+
+ double theta = Math.atan(Math.hypot(xtemp, ytemp)/ ztemp);
+ double phi = Math.atan2(ytemp, xtemp);
+
+
+ return new double[]{theta, phi};
+ }
+ static Map<Integer, double[]> map = new HashMap();
+ static void readMap() throws FileNotFoundException{
+ Scanner s = new Scanner(new File("ecal_positions.txt"));
+
+
+ while(s.hasNext()){
+ int ix =s.nextInt();
+ int iy = s.nextInt();
+ double x = s.nextDouble();
+ double y =s.nextDouble();
+ map.put(ix+100*iy, new double[]{x, y});
+
+ }
+ s.close();
+ }
+ static double getArea(int ix, int iy){
+ int ixp = ix+1;
+ if(ixp == 0)
+ ixp = 1;
+ int ixm = ix-1;
+ if(ixm == 0)
+ ixm = -1;
+ double[] plus = map.get(ixp+100*(iy+1));
+ double[] minus = map.get(ixm+100*(iy-1));
+ return (plus[0]-minus[0])*(plus[1]-minus[1])/4;
+ }
+
+ public static double[] getThetaPhiSpherical(double x,double y){
+ double hcoord[] = toHollysCoordinates(x,y, 1.056, 11);
+ return toSphericalFromBeam(Math.tan(hcoord[1]),Math.tan(hcoord[0]));
+ }
+ /*beam tilt*/
+ static double tilt = .03057;
+ //assuming FEE electron.
+
+ public static double[] getXY(double theta, double phi){
+
+ double ux = Math.cos(phi)*Math.sin(theta)*Math.cos(tilt)+Math.cos(theta)*Math.sin(tilt);
+ 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 pxpz = ux/uz;
+ double pypz = uy/uz;
+ //holly's coordinates:
+ double h1 = Math.atan(pypz);
+ double h2 = Math.atan(pxpz);
+ //0.00071 * y +0.000357,
+ //0.00071*x + 0.00003055*e + 0.04572/e +0.0006196
+ double y = (h1-0.000357)/0.00071;
+ double e = 1.056;
+ double x = (h2 - 0.00003055*e - 0.04572/e -0.0006196)/0.00071;
+ return new double[]{x,y};
+ }
+ public static boolean fid_ECal_spherical(double theta, double phi){
+ double[] xy = getXY(theta, phi);
+ double x = xy[0];
+ double y = xy[1];
+ return fid_ECal(x, y);
+ }
+ public static void main(String arg[]){
+ double x = 0, y = 0;
+ double sp[] = getThetaPhiSpherical(x,y);
+ System.out.println(Arrays.toString(getXY(sp[0], sp[1])));
+ }
+}
+
+
Added: 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 (added)
+++ java/trunk/users/src/main/java/org/hps/users/spaul/feecc/MakeHistograms.java Tue Nov 17 11:36:53 2015
@@ -0,0 +1,260 @@
+package org.hps.users.spaul.feecc;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.List;
+
+import org.hps.conditions.ConditionsDriver;
+import org.hps.record.triggerbank.AbstractIntData;
+import org.hps.record.triggerbank.TIData;
+import org.lcsim.event.CalorimeterHit;
+import org.lcsim.event.Cluster;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.GenericObject;
+import org.lcsim.event.ReconstructedParticle;
+import org.lcsim.lcio.LCIOReader;
+
+import hep.aida.IAnalysisFactory;
+import hep.aida.IHistogram1D;
+import hep.aida.IHistogram2D;
+import hep.aida.IHistogramFactory;
+import hep.aida.IPlotter;
+import hep.aida.IPlotterFactory;
+import hep.aida.ITree;
+import hep.aida.ITreeFactory;
+import hep.physics.vec.Hep3Vector;
+import org.hps.users.spaul.StyleUtil;
+
+public class MakeHistograms {
+ static boolean display = false;
+ static CustomBinning cb;
+ public static void main(String arg[]) throws IllegalArgumentException, IOException{
+ if(arg.length == 1){
+ File file = new File(arg[0]);
+ String path = arg[0];
+ if(file.isDirectory()){
+ org.hps.users.spaul.SumEverything.main(new String[]{path, "temp.aida"});
+ path = "temp.aida";
+ }
+ IAnalysisFactory af = IAnalysisFactory.create();
+ ITreeFactory tf = af.createTreeFactory();
+ ITree tree0 = tf.create(path, "xml");
+ extractHistograms(tree0);
+ setupPlotter(af);
+
+ } else{
+
+ String input = arg[0];
+ String output = arg[1];
+ cb = new CustomBinning(new File(arg[2]));
+ if(arg.length == 5)
+ display = true;
+ IAnalysisFactory af = IAnalysisFactory.create();
+ ITree tree = af.createTreeFactory().create(output,"xml",false,true);
+ IHistogramFactory hf = af.createHistogramFactory(tree);
+ setupHistograms(hf);
+ if(display){
+ setupPlotter(af);
+ }
+ ConditionsDriver hack = new ConditionsDriver();
+ //hack.setXmlConfigResource("/u/group/hps/hps_soft/detector-data/detectors/HPS-EngRun2015-Nominal-v3");
+ hack.setDetectorName("HPS-EngRun2015-Nominal-v3");
+ hack.setFreeze(true);
+ hack.setRunNumber(Integer.parseInt(arg[3]));
+ hack.initialize();
+ LCIOReader reader = new LCIOReader(new File(input));
+ //reader.open(input);
+ //reader.
+ EventHeader event = reader.read();
+ int nEvents = 0;
+ try{
+ outer : while(event != null){
+ processEvent(event);
+
+ //System.out.println(Q2);
+
+ event = reader.read();
+ }
+ } catch (Exception e){
+ e.printStackTrace();
+ }
+ tree.commit();
+ tree.close();
+ }
+
+ }
+
+ static IHistogram2D h1, h2, h2a, h2b, h2c;
+ static IHistogram2D h4,h4a;
+ static IHistogram1D h3, h3a;
+ static IHistogram1D h5, h6;
+
+ private static void extractHistograms(ITree tree0) {
+ h2 = (IHistogram2D) tree0.find("theta vs phi");
+ h2a = (IHistogram2D) tree0.find("theta vs phi cut");
+ h2b = (IHistogram2D) tree0.find("theta vs phi cut alt");
+ h2c = (IHistogram2D) tree0.find("theta vs phi alt");
+
+ h3 = (IHistogram1D) tree0.find("theta");
+ h4 = (IHistogram2D) tree0.find("px\\/pz vs py\\/pz");
+ h4a = (IHistogram2D) tree0.find("px\\/pz vs py\\/pz cut");
+ h5 = (IHistogram1D) tree0.find("energy");
+
+ }
+ static void setupHistograms(IHistogramFactory hf){
+ //h1 = hf.createHistogram2D("px\\/pz vs py\\/pz", 160, -.16, .24, 160, -.2, .2);
+
+
+
+
+ h2 = hf.createHistogram2D("theta vs phi", 300, 0, .3, 314, -3.14, 3.14);
+
+ h2a = hf.createHistogram2D("theta vs phi cut", 300, 0, .3, 314, -3.14, 3.14);
+
+ double thetaBins[] = new double[cb.nTheta+1];
+ for(int i = 0; i<cb.nTheta; i++){
+ thetaBins[i] = cb.thetaMin[i];
+ }
+
+ thetaBins[thetaBins.length-1] = cb.thetaMax[cb.nTheta-1];
+
+ double phiBins[] = new double[315];
+ for(int i = 0; i<315; i++){
+ phiBins[i] = i/50.-3.14; //every 10 mrad;
+ }
+
+ //identical to h2a, except different binning
+ h2b = hf.createHistogram2D("theta vs phi cut alt", "theta vs phi cut alt", thetaBins, phiBins);
+ h2c = hf.createHistogram2D("theta vs phi alt", "theta vs phi alt", thetaBins, phiBins);
+
+ h3 = hf.createHistogram1D("theta", "theta", thetaBins);
+
+ h4 = hf.createHistogram2D("px\\/pz vs py\\/pz", 160, -.16, .24, 160, -.2, .2);
+ h4a = hf.createHistogram2D("px\\/pz vs py\\/pz cut", 160, -.16, .24, 160, -.2, .2);
+
+ h5 = hf.createHistogram1D("energy", 75, 0, 1.5);
+ }
+ static void setupPlotter(IAnalysisFactory af){
+ IPlotterFactory pf = af.createPlotterFactory();
+ IPlotter p = pf.create();
+ p.createRegions(2,2);
+ p.region(0).plot(h2);
+
+ StyleUtil.stylize(p.region(0), "theta", "phi");
+ p.region(1).plot(h2a);
+ StyleUtil.stylize(p.region(1), "theta", "phi");
+ p.region(2).plot(h3);
+ StyleUtil.stylize(p.region(2), "theta", "# of particles");
+ p.region(3).plot(h5);
+ StyleUtil.stylize(p.region(3), "energy", "# of particles");
+
+ p.show();
+ //new window for the next plot
+ IPlotter p2 = pf.create();
+ p2.region(0).plot(h2b);
+ StyleUtil.stylize(p2.region(0), "theta", "phi");
+
+ p2.show();
+
+ //new window for the next plot
+ IPlotter p3 = pf.create();
+ p3.region(0).plot(h2c);
+ StyleUtil.stylize(p3.region(0), "theta", "phi");
+
+ p3.show();
+
+ //new window for the next plot
+ IPlotter p4 = pf.create();
+ p4.region(0).plot(h4);
+ StyleUtil.stylize(p4.region(0), "px/pz", "py/pz");
+
+ p4.show();
+
+ //new window for the next plot
+ IPlotter p5 = pf.create();
+ p5.region(0).plot(h4a);
+ StyleUtil.stylize(p5.region(0), "px/pz", "py/pz");
+
+ p5.show();
+ }
+ private static void processEvent(EventHeader event) {
+ if(event.getEventNumber() %1000 == 0)
+ System.out.println("event number " + event.getEventNumber());
+
+ for (GenericObject gob : event.get(GenericObject.class,"TriggerBank"))
+ {
+ if (!(AbstractIntData.getTag(gob) == TIData.BANK_TAG)) continue;
+ TIData tid = new TIData(gob);
+ if (!tid.isSingle1Trigger())
+ {
+ return;
+ }
+ }
+ List<ReconstructedParticle> particles = event.get(ReconstructedParticle.class, "FinalStateParticles");
+
+ for(ReconstructedParticle p : particles){
+
+ boolean isGood = addParticle(p);
+
+
+ }
+ }
+
+ static double eMin = .8;
+ static double eMax = 1.2;
+ static double beamEnergy = 1.057;
+
+ static double beamTilt = .03057;
+ static double maxChi2 = 50;
+ static boolean addParticle(ReconstructedParticle part){
+
+ if(part.getTracks().size() == 0)
+ return false;
+ if(part.getTracks().get(0).getChi2()>maxChi2){
+ return false;
+ }
+ if(part.getClusters().size() == 0)
+ return false;
+ Cluster c = part.getClusters().get(0);
+ double time = c.getCalorimeterHits().get(0).getTime();
+ if(EcalUtil.fid_ECal(c)){
+ if(c.getCalorimeterHits().size() < 3)
+ return false;
+ if(time>40 && time <48)
+ h5.fill(c.getEnergy());
+ if(c.getEnergy() > eMin && c.getEnergy() < eMax && (time >40 && time < 48)) {
+
+ Hep3Vector p = part.getMomentum();
+
+ double px = p.x(), pz = p.z();
+ double pxtilt = px*Math.cos(beamTilt)-pz*Math.sin(beamTilt);
+ double py = p.y();
+ double pztilt = pz*Math.cos(beamTilt)+px*Math.sin(beamTilt);
+
+ double theta = Math.atan(Math.hypot(pxtilt, py)/pztilt);
+ double phi =Math.atan2(py, pxtilt);
+
+ h2.fill(theta, phi);
+ h2c.fill(theta, phi);
+
+ h4.fill(px/pz, py/pz);
+
+ if(cb.inRange(theta, phi)){
+ h2a.fill(theta, phi);
+ h2b.fill(theta, phi);
+ h3.fill(theta);
+ h4a.fill(px/pz, py/pz);
+ }
+
+
+ return true;
+ }
+
+ }
+ return false;
+ }
+
+}
Added: java/trunk/users/src/main/java/org/hps/users/spaul/feecc/ShowCustomBinning.java
=============================================================================
--- java/trunk/users/src/main/java/org/hps/users/spaul/feecc/ShowCustomBinning.java (added)
+++ java/trunk/users/src/main/java/org/hps/users/spaul/feecc/ShowCustomBinning.java Tue Nov 17 11:36:53 2015
@@ -0,0 +1,218 @@
+package org.hps.users.spaul.feecc;
+
+import java.awt.Canvas;
+import java.awt.Color;
+import java.awt.Graphics;
+import java.io.File;
+import java.io.FileNotFoundException;
+
+import javax.swing.JFrame;
+
+import hep.aida.IAnalysisFactory;
+import hep.aida.ICloud2D;
+import hep.aida.IHistogramFactory;
+import hep.aida.IPlotter;
+import hep.aida.IPlotterFactory;
+import hep.aida.IPlotterRegion;
+import hep.aida.IPlotterStyle;
+import hep.aida.ITreeFactory;
+
+public class ShowCustomBinning extends Canvas{
+ /**
+ * show Rafo's fiducial cuts translated into rotated theta and phi,
+ * and overlay this with my bins in x and y.
+ * @param arg
+ * @throws FileNotFoundException
+ */
+ public static void main(String arg[]) throws FileNotFoundException{
+ JFrame frame = new JFrame();
+ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ frame.add(new ShowCustomBinning(new File(arg[0])));
+ frame.setSize(800, 800);
+ frame.setVisible(true);
+
+ }
+ public void paint(Graphics g){
+ drawEcalOutline(g);
+ drawFidEcalOutline(g);
+ drawCustomBinRectangles(g);
+ }
+
+ void drawFidEcalOutline(Graphics g){
+ g.setColor(Color.GRAY);
+ double x_edge_low = -262.74;
+ double x_edge_high = 347.7;
+ double y_edge_low = 33.54;
+ double y_edge_high = 75.18;
+
+ double x_gap_low = -106.66;
+ double x_gap_high = 42.17;
+ double y_gap_high = 47.18;
+ double x1,y1, x2, y2;
+ double nPoints = 500;
+ for(int i = 0; i< nPoints-1; i++){
+ x1 = x_gap_high+i/nPoints*(x_edge_high-x_gap_high);
+ x2 = x_gap_high+(i+1)/nPoints*(x_edge_high-x_gap_high);
+ y1 = y_edge_low;
+ y2 = y1;
+ drawEcalFaceLine(g, x1, y1, x2, y2);
+ drawEcalFaceLine(g, x1, -y1, x2, -y2);
+
+
+ x1 = x_edge_low+i/nPoints*(x_gap_low-x_edge_low);
+ x2 = x_edge_low+(i+1)/nPoints*(x_gap_low-x_edge_low);
+ y1 = y2 = y_edge_low;
+ drawEcalFaceLine(g, x1, y1, x2, y2);
+ drawEcalFaceLine(g, x1, -y1, x2, -y2);
+
+
+
+ x1 = x_gap_low+i/nPoints*(x_gap_high-x_gap_low);
+ x2 = x_gap_low+(i+1)/nPoints*(x_gap_high-x_gap_low);
+ y1 = y2 = y_gap_high;
+ drawEcalFaceLine(g, x1, y1, x2, y2);
+ drawEcalFaceLine(g, x1, -y1, x2, -y2);
+
+ x1 = x_edge_low+i/nPoints*(x_edge_high-x_edge_low);
+ x2 = x_edge_low+(i+1)/nPoints*(x_edge_high-x_edge_low);
+ y1 = y2 = y_edge_high;
+ drawEcalFaceLine(g, x1, y1, x2, y2);
+ drawEcalFaceLine(g, x1, -y1, x2, -y2);
+ }
+ drawEcalFaceLine(g, x_gap_low, y_edge_low, x_gap_low, y_gap_high);
+ drawEcalFaceLine(g, x_gap_high, y_edge_low, x_gap_high, y_gap_high);
+
+ drawEcalFaceLine(g, x_edge_low, y_edge_low, x_edge_low, y_edge_high);
+ drawEcalFaceLine(g, x_edge_high, y_edge_low, x_edge_high, y_edge_high);
+
+
+ drawEcalFaceLine(g, x_gap_low, -y_edge_low, x_gap_low, -y_gap_high);
+ drawEcalFaceLine(g, x_gap_high, -y_edge_low, x_gap_high, -y_gap_high);
+
+ drawEcalFaceLine(g, x_edge_low, -y_edge_low, x_edge_low, -y_edge_high);
+ drawEcalFaceLine(g, x_edge_high, -y_edge_low, x_edge_high, -y_edge_high);
+
+ }
+
+ void drawEcalOutline(Graphics g){
+ g.setColor(Color.BLACK);
+ double x_edge_low = -276.50;
+ double x_edge_high = 361.55;
+ double y_edge_low = 20.17;
+ double y_edge_high = 89;
+
+ double x_gap_low = -93.30;
+ double x_gap_high = 28.93;
+ double y_gap_high = 33.12;
+ double x1,y1, x2, y2;
+ double nPoints = 500;
+ for(int i = 0; i< nPoints-1; i++){
+ x1 = x_gap_high+i/nPoints*(x_edge_high-x_gap_high);
+ x2 = x_gap_high+(i+1)/nPoints*(x_edge_high-x_gap_high);
+ y1 = y_edge_low;
+ y2 = y1;
+ drawEcalFaceLine(g, x1, y1, x2, y2);
+ drawEcalFaceLine(g, x1, -y1, x2, -y2);
+
+
+ x1 = x_edge_low+i/nPoints*(x_gap_low-x_edge_low);
+ x2 = x_edge_low+(i+1)/nPoints*(x_gap_low-x_edge_low);
+ y1 = y2 = y_edge_low;
+ drawEcalFaceLine(g, x1, y1, x2, y2);
+ drawEcalFaceLine(g, x1, -y1, x2, -y2);
+
+
+
+ x1 = x_gap_low+i/nPoints*(x_gap_high-x_gap_low);
+ x2 = x_gap_low+(i+1)/nPoints*(x_gap_high-x_gap_low);
+ y1 = y2 = y_gap_high;
+ drawEcalFaceLine(g, x1, y1, x2, y2);
+ drawEcalFaceLine(g, x1, -y1, x2, -y2);
+
+ x1 = x_edge_low+i/nPoints*(x_edge_high-x_edge_low);
+ x2 = x_edge_low+(i+1)/nPoints*(x_edge_high-x_edge_low);
+ y1 = y2 = y_edge_high;
+ drawEcalFaceLine(g, x1, y1, x2, y2);
+ drawEcalFaceLine(g, x1, -y1, x2, -y2);
+ }
+ drawEcalFaceLine(g, x_gap_low, y_edge_low, x_gap_low, y_gap_high);
+ drawEcalFaceLine(g, x_gap_high, y_edge_low, x_gap_high, y_gap_high);
+
+ drawEcalFaceLine(g, x_edge_low, y_edge_low, x_edge_low, y_edge_high);
+ drawEcalFaceLine(g, x_edge_high, y_edge_low, x_edge_high, y_edge_high);
+
+
+ drawEcalFaceLine(g, x_gap_low, -y_edge_low, x_gap_low, -y_gap_high);
+ drawEcalFaceLine(g, x_gap_high, -y_edge_low, x_gap_high, -y_gap_high);
+
+ drawEcalFaceLine(g, x_edge_low, -y_edge_low, x_edge_low, -y_edge_high);
+ drawEcalFaceLine(g, x_edge_high, -y_edge_low, x_edge_high, -y_edge_high);
+ }
+
+ CustomBinning binning;
+
+ ShowCustomBinning(File file) throws FileNotFoundException{
+ this.binning = new CustomBinning(file);
+ print(this.binning);
+ }
+ Color altBin1 = new Color(0, 0, 128);
+ Color altBin2 = new Color(0,128,0);
+ void drawCustomBinRectangles(Graphics g){
+ for(int i = 0; i<binning.nTheta; i++){
+ g.setColor(i%2 == 0 ? altBin1 : altBin2);
+ for(int j = 0; j<binning.phiMax[i].length; j++){
+ double phi1 = binning.phiMax[i][j];
+ double phi2 = binning.phiMin[i][j];
+ double theta1 = binning.thetaMin[i];
+ double theta2 = binning.thetaMax[i];
+
+ int x =getX(theta1)+1, y = getY(phi1), w = getX(theta2)-getX(theta1), h = getY(phi2)-getY(phi1);
+ g.drawRect(x, y, w, h);
+ x =getX(theta1)+1; y = getY(-phi2); w = getX(theta2)-getX(theta1); h = getY(-phi1)-getY(-phi2);
+
+ g.drawRect(x, y, w, h);
+
+
+ }
+ }
+ }
+
+
+ void drawEcalFaceLine(Graphics g, double x1, double y1, double x2, double y2){
+
+ double[] polar1 = EcalUtil.getThetaPhiSpherical(x1, y1);
+ double[] polar2 = EcalUtil.getThetaPhiSpherical(x2, y2);
+ g.drawLine(getX(polar1[0]), getY(polar1[1]), getX(polar2[0]), getY(polar2[1]));
+
+ }
+ int getX(double theta){
+ return (int)(this.getWidth()*theta/.3);
+ }
+ int getY(double phi){
+ return (int)(this.getHeight()*(3.2-phi)/6.4);
+ }
+ static void print(CustomBinning binning){
+ System.out.println(" Bin \\# & $\\theta_{\\textrm{min}}$ & $\\theta_{\\textrm{max}}$ & $\\phi_{\\textrm{min 1}}$ & $\\phi_{\\textrm{max 1}}$ & $\\phi_{\\textrm{min 2}}$ & $\\phi_{\\textrm{max 2}}$ & Solid angle \\\\");
+ for(int i = 0; i<binning.nTheta; i++){
+ if(binning.phiMax[i].length == 1)
+ System.out.printf("%d & %.0f & %.0f & %.0f & %.0f & -- & -- & %.0f \\\\\n",
+ i+1,
+ binning.thetaMin[i]*1000,
+ binning.thetaMax[i]*1000,
+ binning.phiMin[i][0]*1000,
+ binning.phiMax[i][0]*1000.,
+ binning.getSteradians(i)*1e6);
+ if(binning.phiMax[i].length == 2)
+ System.out.printf("%d & %.0f & %.0f & %.0f & %.0f & %.0f & %.0f & %.0f \\\\\n",
+ i+1,
+ binning.thetaMin[i]*1000,
+ binning.thetaMax[i]*1000,
+ binning.phiMin[i][0]*1000,
+ binning.phiMax[i][0]*1000,
+ binning.phiMin[i][1]*1000,
+ binning.phiMax[i][1]*1000,
+ binning.getSteradians(i)*1e6);
+ }
+ System.out.println("total " + binning.getTotSteradians()*1e6 + " microsteradians");
+ }
+}
Added: java/trunk/users/src/main/java/org/hps/users/spaul/feecc/analysis/CountsPerBinVsCharge.java
=============================================================================
--- java/trunk/users/src/main/java/org/hps/users/spaul/feecc/analysis/CountsPerBinVsCharge.java (added)
+++ java/trunk/users/src/main/java/org/hps/users/spaul/feecc/analysis/CountsPerBinVsCharge.java Tue Nov 17 11:36:53 2015
@@ -0,0 +1,42 @@
+package org.hps.users.spaul.feecc.analysis;
+
+import hep.aida.*;
+import org.hps.users.spaul.feecc.CustomBinning;
+
+import java.io.File;
+import java.io.IOException;
+
+//arg[0] should point to the sums directory,
+// with files that are named runnum.aida and one file total.aida
+//arg[1] is the binning scheme file.
+//arg[2] is an overall normalization scale (2E/Zalpha)*sqrt(cc/counts)
+//arg[3] is recoil parameter (2E/M)
+public class CountsPerBinVsCharge {
+ public static void main(String arg[]) throws IllegalArgumentException, IOException{
+ IAnalysisFactory af = IAnalysisFactory.create();
+ ITreeFactory tf = af.createTreeFactory();
+ CustomBinning cb = new CustomBinning(new File(arg[1]));
+ double scale = Double.parseDouble(arg[2]);
+ double recoil = Double.parseDouble(arg[3]);
+
+ ITree tree0 = tf.create(arg[0], "xml");
+ IHistogram1D hist = (IHistogram1D) tree0.find("theta");
+
+ int nBins = hist.axis().bins();
+ for(int i = 0; i< nBins; i++){
+ double thmax = cb.thetaMax[i];
+ double thmin = cb.thetaMin[i];
+ double n = hist.binHeight(i);
+ double mottInt = cb.mottIntegralFactor(recoil, i);
+ double F = scale*Math.sqrt(n/mottInt);
+ double dF = scale/(2*Math.sqrt(mottInt));
+ System.out.println(i + "\t" + thmin+ "\t" + thmax + "\t" + F + "\t" + dF);
+ }
+
+ }
+
+ private static double getBeamCharge(int runNumber) {
+ //placeholder until we have the beam charges reliably in the database.
+ return 1;
+ }
+}
Added: java/trunk/users/src/main/java/org/hps/users/spaul/feecc/analysis/ExtractCrossSections.java
=============================================================================
--- java/trunk/users/src/main/java/org/hps/users/spaul/feecc/analysis/ExtractCrossSections.java (added)
+++ java/trunk/users/src/main/java/org/hps/users/spaul/feecc/analysis/ExtractCrossSections.java Tue Nov 17 11:36:53 2015
@@ -0,0 +1,43 @@
+package org.hps.users.spaul.feecc.analysis;
+
+import hep.aida.*;
+
+import java.io.File;
+import java.io.IOException;
+
+//arg[0] should point to the sums directory,
+// with files that are named runnum.aida and one file total.aida
+public class ExtractCrossSections {
+ public static void main(String arg[]) throws IllegalArgumentException, IOException{
+ IAnalysisFactory af = IAnalysisFactory.create();
+ ITreeFactory tf = af.createTreeFactory();
+
+ boolean isFirst = true;
+ int nBins =0;
+ for(File f : new File(arg[0]).listFiles()){
+ String[] split = f.getAbsolutePath().split("[\\./]");
+ String a = split[split.length-2];
+ if(a.equals("total"))
+ continue;
+ int runNumber = Integer.parseInt(a);
+
+ ITree tree0 = tf.create(f.getAbsolutePath(), "xml");
+ IHistogram1D theta = (IHistogram1D) tree0.find("theta");
+
+ if(isFirst){
+ nBins = theta.axis().bins();
+ isFirst = false;
+ }
+ double beamCharge = getBeamCharge(runNumber);
+ System.out.println(runNumber + "\t");
+ for(int i = 0; i< nBins; i++)
+ System.out.print(theta.binHeight(i)/beamCharge + "\t");
+ System.out.println();
+ }
+ }
+
+ private static double getBeamCharge(int runNumber) {
+ //placeholder until we have the beam charges reliably in the database.
+ return 1;
+ }
+}
Added: java/trunk/users/src/main/java/org/hps/users/spaul/feecc/analysis/PlotPhiDependence.java
=============================================================================
--- java/trunk/users/src/main/java/org/hps/users/spaul/feecc/analysis/PlotPhiDependence.java (added)
+++ java/trunk/users/src/main/java/org/hps/users/spaul/feecc/analysis/PlotPhiDependence.java Tue Nov 17 11:36:53 2015
@@ -0,0 +1,40 @@
+package org.hps.users.spaul.feecc.analysis;
+
+import hep.aida.*;
+
+import org.hps.users.spaul.feecc.CustomBinning;
+import org.hps.users.spaul.StyleUtil;
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+
+//arg[0] should point to the sums directory,
+// with files that are named runnum.aida and one file total.aida
+public class PlotPhiDependence {
+ public static void main(String arg[]) throws IllegalArgumentException, IOException{
+ IAnalysisFactory af = IAnalysisFactory.create();
+ ITreeFactory tf = af.createTreeFactory();
+ IHistogramFactory hf = af.createHistogramFactory(tf.create());
+
+ ITree tree0 = tf.create(arg[0], "xml");
+ IHistogram2D hist = (IHistogram2D) tree0.find("theta vs phi alt");
+
+ int nBinsTheta = hist.xAxis().bins();
+
+ for(int i = 0; i< nBinsTheta; i++){
+ IPlotter p = af.createPlotterFactory().create();
+ IHistogram1D proj = hf.sliceY("bin " + i, hist, i);
+ p.region(0).plot(proj);
+ StyleUtil.stylize(p.region(0),"Phi Dependence", "phi", "# of hits");
+ System.out.println(Arrays.toString(p.region(0).style().dataStyle().markerStyle().availableParameters()));
+ p.region(0).style().dataStyle().setParameter("showHistogramBars", "false");
+
+ p.show();
+ }
+
+ }
+
+
+
+
+}
|