LISTSERV mailing list manager LISTSERV 16.5

Help for HPS-SVN Archives


HPS-SVN Archives

HPS-SVN Archives


HPS-SVN@LISTSERV.SLAC.STANFORD.EDU


View:

Message:

[

First

|

Previous

|

Next

|

Last

]

By Topic:

[

First

|

Previous

|

Next

|

Last

]

By Author:

[

First

|

Previous

|

Next

|

Last

]

Font:

Proportional Font

LISTSERV Archives

LISTSERV Archives

HPS-SVN Home

HPS-SVN Home

HPS-SVN  May 2016

HPS-SVN May 2016

Subject:

r4353 - in /java/trunk/users/src/main/java/org/hps/users/spaul: fee/ feecc/ trident/

From:

[log in to unmask]

Reply-To:

Notification of commits to the hps svn repository <[log in to unmask]>

Date:

Mon, 16 May 2016 19:45:11 -0000

Content-Type:

text/plain

Parts/Attachments:

Parts/Attachments

text/plain (1095 lines)

Author: [log in to unmask]
Date: Mon May 16 12:45:06 2016
New Revision: 4353

Log: (empty)

Added:
    java/trunk/users/src/main/java/org/hps/users/spaul/fee/
    java/trunk/users/src/main/java/org/hps/users/spaul/fee/Cleanup.java
    java/trunk/users/src/main/java/org/hps/users/spaul/fee/CustomBinning.java
    java/trunk/users/src/main/java/org/hps/users/spaul/fee/FeeHistogramDriver.java
    java/trunk/users/src/main/java/org/hps/users/spaul/fee/FormFactor.java
    java/trunk/users/src/main/java/org/hps/users/spaul/fee/MottIntegral.java
    java/trunk/users/src/main/java/org/hps/users/spaul/trident/
    java/trunk/users/src/main/java/org/hps/users/spaul/trident/TridentHistogramDriver.java
Modified:
    java/trunk/users/src/main/java/org/hps/users/spaul/feecc/BinGenerator.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/ShowCustomBinningXY.java

Added: java/trunk/users/src/main/java/org/hps/users/spaul/fee/Cleanup.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/spaul/fee/Cleanup.java	(added)
+++ java/trunk/users/src/main/java/org/hps/users/spaul/fee/Cleanup.java	Mon May 16 12:45:06 2016
@@ -0,0 +1,53 @@
+package org.hps.users.spaul.fee;
+
+import hep.physics.vec.Hep3Vector;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.lcsim.event.ReconstructedParticle;
+
+public class Cleanup {
+
+	public static void purgeDuplicates(List<ReconstructedParticle> particles) {
+		ArrayList<ReconstructedParticle> trashcan = new ArrayList();
+		outer : for(ReconstructedParticle p1 : particles){
+			if(trashcan.contains(p1))
+				continue;
+			for(ReconstructedParticle p2 : particles){
+				if(p1 == p2) continue;
+				if(trashcan.contains(p2))
+					continue;
+				if((p1.getType()>31)^(p2.getType()>31)){ //one is GBL, the other is seed.  
+					continue;
+				}
+				
+				if(p1.getEnergy() == p2.getEnergy()){ //tracks matched to same cluster
+					ReconstructedParticle loser = getWorseParticle(p1, p2);
+					trashcan.add(loser);
+				}
+				if(trashcan.contains(p1))
+					continue outer;
+				
+			}
+			
+		}
+		particles.removeAll(trashcan);
+	}
+	
+	static ReconstructedParticle getWorseParticle(ReconstructedParticle p1, ReconstructedParticle p2){
+		if(p1.getTracks().get(0).getChi2() < p2.getTracks().get(0).getChi2())
+			return p2;
+		return p1;
+	}
+	
+	
+	
+	
+	
+	static double angle(Hep3Vector v1, Hep3Vector v2){
+		return Math.acos(v1.x()*v2.x() + v1.y()*v2.y() + v1.z()*v2.z())
+			/(v1.magnitude()*v2.magnitude());
+	}
+
+}

Added: java/trunk/users/src/main/java/org/hps/users/spaul/fee/CustomBinning.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/spaul/fee/CustomBinning.java	(added)
+++ java/trunk/users/src/main/java/org/hps/users/spaul/fee/CustomBinning.java	Mon May 16 12:45:06 2016
@@ -0,0 +1,100 @@
+package org.hps.users.spaul.fee;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.util.Scanner;
+
+public class CustomBinning {
+    
+    public CustomBinning(String s){
+        this(new Scanner(s));
+    }
+    
+    
+    public CustomBinning(File f) throws FileNotFoundException{
+        this(new Scanner(f));
+    }
+        
+    private CustomBinning(Scanner s){
+    
+    
+
+        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
+    }
+    
+    double getPhiWidth(int thetaBin){
+        double dPhiTot = 0;
+         for(int i = 0; i< phiMax[thetaBin].length; i++){
+             dPhiTot += phiMax[thetaBin][i]-phiMin[thetaBin][i];
+         }
+         return 2*dPhiTot;  //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;
+    }
+
+}

Added: java/trunk/users/src/main/java/org/hps/users/spaul/fee/FeeHistogramDriver.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/spaul/fee/FeeHistogramDriver.java	(added)
+++ java/trunk/users/src/main/java/org/hps/users/spaul/fee/FeeHistogramDriver.java	Mon May 16 12:45:06 2016
@@ -0,0 +1,386 @@
+package org.hps.users.spaul.fee;
+
+import java.util.List;
+
+import hep.aida.IHistogram1D;
+import hep.aida.IHistogram2D;
+import hep.physics.vec.Hep3Vector;
+
+import org.hps.conditions.beam.BeamEnergy.BeamEnergyCollection;
+import org.hps.recon.tracking.TrackType;
+import org.hps.recon.tracking.TrackUtils;
+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.geometry.Detector;
+import org.lcsim.util.Driver;
+import org.lcsim.util.aida.AIDA;
+
+import static java.lang.Math.*;
+
+
+public class FeeHistogramDriver extends Driver{
+	
+	double d0cut = 1;
+	double z0cut = .5;
+	
+	//determined by beam energy
+    double eMin, eMax, beamEnergy, seedEnergyCut;
+    double pMin, pMax;
+    
+
+    double beamTiltX = .0295;
+    double beamTiltY = -.0008;
+    
+    double maxChi2 = 50;
+    //maximum difference between the reconstructed energy and momentum
+    //double maxdE = .5;
+    int nMin = 3;
+
+    IHistogram1D theta;
+    IHistogram1D thetaInRange;
+    IHistogram2D thetaVsPhi;
+    IHistogram2D thetaVsPhiInRange;
+    IHistogram2D d0VsZ0, d0VsZ0_top, d0VsZ0_bottom;
+    IHistogram1D d0;
+    IHistogram1D z0;
+    IHistogram1D timeHist;
+    IHistogram1D chi2Hist;
+    
+    
+    @Override
+    public void detectorChanged(Detector det){
+        BeamEnergyCollection beamEnergyCollection = 
+            this.getConditionsManager().getCachedConditions(BeamEnergyCollection.class, "beam_energies").getCachedData();        
+        beamEnergy = beamEnergyCollection.get(0).getBeamEnergy();
+        eMin = .75*beamEnergy;
+        eMax = 1.15*beamEnergy;
+        
+        pMin = .75*beamEnergy;
+        pMax = 1.15*beamEnergy;
+        
+        seedEnergyCut = .38*beamEnergy; 
+        setupHistograms();
+        
+    }
+    
+    AIDA aida = AIDA.defaultInstance();
+
+
+    private IHistogram1D thetaTopOnly;
+
+
+    private IHistogram1D thetaTopOnlyInRange;
+
+
+    private IHistogram1D thetaBottomOnlyInRange;
+    
+    
+    private IHistogram1D energy, seedEnergy, energyTop, seedEnergyTop, energyBottom, seedEnergyBottom;
+    private IHistogram2D clusterVsSeedEnergy, clusterVsSeedEnergyTop, clusterVsSeedEnergyBottom;
+
+    private IHistogram1D thetaBottomOnly;
+    
+    private IHistogram1D charge;
+    
+    
+    void setupHistograms(){
+
+
+        energy = aida.histogram1D("cluster energy", 100, 0, 1.5*beamEnergy);
+        energyTop = aida.histogram1D("cluster energy top", 100, 0, 1.5*beamEnergy);
+        energyBottom = aida.histogram1D("cluster energy bottom", 100, 0, 1.5*beamEnergy);
+        
+        seedEnergy = aida.histogram1D("seed energy", 100, 0, beamEnergy);
+        seedEnergyTop = aida.histogram1D("seed energy top", 100, 0, beamEnergy);
+        seedEnergyBottom = aida.histogram1D("seed energy bottom", 100, 0, beamEnergy);
+        
+        clusterVsSeedEnergy = aida.histogram2D("cluster vs seed energy", 100, 0, 1.5*beamEnergy, 100, 0, beamEnergy);
+        clusterVsSeedEnergyTop = aida.histogram2D("cluster vs seed energy top", 100, 0, 1.5*beamEnergy, 100, 0, beamEnergy);
+        clusterVsSeedEnergyBottom = aida.histogram2D("cluster vs seed energy bottom", 100, 0, 1.5*beamEnergy, 100, 0, beamEnergy);
+        
+        
+        int nBinsPhi = 400;
+        thetaVsPhi = aida.histogram2D("theta vs phi", nBinsPhi, 0, .2, 628, -3.14, 3.14);
+        thetaVsPhiInRange = aida.histogram2D("theta vs phi in range", nBinsPhi, 0, .2, 628, -3.14, 3.14);
+        
+        theta = aida.histogram1D("theta", nBinsPhi, 0, .2);
+        thetaInRange = aida.histogram1D("theta in range", nBinsPhi, 0, .2);
+        
+        thetaTopOnly = aida.histogram1D("theta top", nBinsPhi, 0, .2);
+        thetaTopOnlyInRange = aida.histogram1D("theta top in range", nBinsPhi, 0, .2);
+        
+        thetaBottomOnly = aida.histogram1D("theta bottom", nBinsPhi, 0, .2);
+        thetaBottomOnlyInRange = aida.histogram1D("theta bottom in range", nBinsPhi, 0, .2);
+        uxVsUy = aida.histogram2D("ux vs uy", 300, -.16, .24, 300, -.2, .2);
+        uxVsUyInRange = aida.histogram2D("ux vs uy in range", 300, -.16, .24, 300, -.2, .2);
+        d0VsZ0 = aida.histogram2D("d0 vs z0", 100, -5, 5, 100, -5, 5);
+        d0 = aida.histogram1D("d0", 100, -5, 5);
+        z0 = aida.histogram1D("z0", 100, -5, 5);
+        
+        d0VsZ0_top = aida.histogram2D("d0 vs z0 top", 100, -5, 5, 100, -5, 5);
+        d0VsZ0_bottom = aida.histogram2D("d0 vs z0 bottom", 100, -5, 5, 100, -5, 5);
+        
+        
+        pHist = aida.histogram1D("momentum", 100, 0, 1.5*beamEnergy);
+        
+        charge = aida.histogram1D("charge", 6, -3, 3);
+        
+        
+        timeHist = aida.histogram1D("cluster time", 400, 0, 400);
+        chi2Hist = aida.histogram1D("chi2", 200, 0, 200);
+        clustSize = aida.histogram1D("cluster size", 20, 0, 20);
+        
+        z0VsTanLambda = aida.histogram2D("z0 vs tan lambda", 100, -5, 5, 100, -.1, .1);
+        z0VsChi2 = aida.histogram2D("z0 vs chi2", 100, -5, 5, 100, 0, 100);
+        
+    }
+    
+    
+    IHistogram2D uxVsUy, uxVsUyInRange;
+    
+    IHistogram1D pHist;
+    IHistogram1D clustSize;
+    
+    @Override
+    public void process(EventHeader event){
+    	
+    	
+    	
+    	//removed this criterion from this driver.
+    	//instead use a trigger filter driver preceding this driver in the steering file. 
+    	//
+    	
+        /*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");
+        Cleanup.purgeDuplicates(particles);
+        for(ReconstructedParticle p : particles){
+            processParticle(p);
+        }
+    }
+
+   
+	private void processParticle(ReconstructedParticle part) {
+        
+        //reject duplicate particles that use seed tracks instead of GBL
+        if(!TrackType.isGBL(part.getType()) && part.getTracks().size() >0)
+            return;
+        
+        //reject particles that have no cluster in the Ecal
+        if(part.getClusters().size() == 0)
+            return;
+        Cluster c = part.getClusters().get(0);
+        
+      //cluster time
+        double time = c.getCalorimeterHits().get(0).getTime();
+        timeHist.fill(time);
+        
+        if(!(time>minClustTime && time <maxClustTime))
+            return;
+        
+        
+        //find seed hit energy
+        double seedEnergy = 0;
+        for(CalorimeterHit hit : c.getCalorimeterHits()){
+            if(hit.getCorrectedEnergy() > seedEnergy)
+                seedEnergy = hit.getCorrectedEnergy();
+        }
+        double energy = c.getEnergy();
+        
+        
+        //these are the histograms of seed and cluster energy before
+        //the cuts on these variables 
+        this.seedEnergy.fill(seedEnergy);
+        this.energy.fill(energy);
+        this.clusterVsSeedEnergy.fill(energy, seedEnergy);
+        
+        if(part.getMomentum().y()> 0){
+            this.seedEnergyTop.fill(seedEnergy);
+            this.energyTop.fill(energy);
+            this.clusterVsSeedEnergyTop.fill(energy, seedEnergy);
+        } else {
+            this.seedEnergyBottom.fill(seedEnergy);
+            this.energyBottom.fill(energy);
+            this.clusterVsSeedEnergyBottom.fill(energy, seedEnergy);
+        }
+        
+        
+        //seed energy cut
+        if(seedEnergy < seedEnergyCut)
+            return;
+        
+        //cluster energy cut
+        if(energy > eMax || energy< eMin)
+            return;
+        
+        clustSize.fill(c.getCalorimeterHits().size());
+        if(c.getCalorimeterHits().size() < nMin)
+            return;
+        
+        
+        
+        charge.fill(part.getCharge());
+        if(part.getCharge() != -1)
+            return;
+        
+        if(part.getTracks().size() == 0)
+            return;
+        
+        
+        
+        
+
+        Hep3Vector p = part.getMomentum();
+
+        double pmag = part.getMomentum().magnitude();
+        pHist.fill(pmag);
+        if(pmag > pMax || pmag < pMin)
+            return;
+        
+        double d = TrackUtils.getDoca(part.getTracks().get(0));
+        d0.fill(d);
+        double z = TrackUtils.getZ0(part.getTracks().get(0));
+        z0.fill(z);
+        d0VsZ0.fill(d, z);
+        
+        if(p.y() > 0)
+        	d0VsZ0_top.fill(d,z);
+        else
+        	d0VsZ0_bottom.fill(d,z);
+        
+        z0VsTanLambda.fill(z, TrackUtils.getTanLambda(part.getTracks().get(0)));
+        z0VsChi2.fill(z, part.getTracks().get(0).getChi2());
+        
+        if(abs(TrackUtils.getDoca(part.getTracks().get(0)))> d0cut)
+        	return;
+        if(abs(TrackUtils.getZ0(part.getTracks().get(0)))> z0cut)
+        	return;
+        
+        
+        
+        chi2Hist.fill(part.getTracks().get(0).getChi2());
+        if(part.getTracks().get(0).getChi2()>maxChi2)
+            return;
+        
+
+
+/*
+        double px = p.x(), pz = p.z();
+        double pxtilt = px*cos(beamTiltX)-pz*sin(beamTiltX);
+        double py = p.y();
+        double pztilt = pz*cos(beamTiltX)+px*sin(beamTiltX);
+        
+        double pytilt = py*cos(beamTiltY)-pztilt*sin(beamTiltY);
+        pztilt = pz*cos(beamTiltY) + pytilt*sin(beamTiltY);
+*/
+        double px = p.x(), py = p.y(), pz = p.z();
+        
+        double cx = cos(beamTiltX);
+        double sy = sin(beamTiltY);
+        double cy = cos(beamTiltY);
+        double sx = sin(beamTiltX);
+        
+        double pxtilt = px*cx              -pz*sx;
+        double pytilt = -py*sx*sy + py*cy  -pz*sy*cx;
+        double pztilt = px*cy*sx  + py*sy  +pz*cy*cx;
+        
+
+        double theta = atan(hypot(pxtilt, pytilt)/pztilt);
+        double phi =atan2(pytilt, pxtilt);
+        
+        uxVsUy.fill(pxtilt/pztilt, pytilt/pztilt);
+        thetaVsPhi.fill(theta, phi);
+        this.theta.fill(theta);
+        if(phi > 0)
+            thetaTopOnly.fill(theta);
+        else
+            thetaBottomOnly.fill(theta);
+        if(cb.inRange(theta, phi)){
+            thetaVsPhiInRange.fill(theta, phi);
+            thetaInRange.fill(theta);
+            if(phi > 0)
+                thetaTopOnlyInRange.fill(theta);
+            else
+                thetaBottomOnlyInRange.fill(theta);
+            uxVsUyInRange.fill(pxtilt/pztilt, pytilt/pztilt);
+        }
+    }
+    
+    public void setBinning(String binning){
+        System.out.println("binning scheme:\n" + binning);
+        this.cb = new CustomBinning(binning);
+    }
+    /*
+    @Override
+    protected void endOfData(){
+        createRenormalizationHistogram();
+    }
+    
+    private void createRenormalizationHistogram(){
+    	
+        //the purpose of this histogram is so that there is a simple histogram
+        //that each bin in the theta histograms can be normalized to the 
+        //angular range in phi that I am using for the cut inside of that theta bin.
+        
+        int xbins = thetaVsPhi.xAxis().bins();
+        double xmin = thetaVsPhi.xAxis().lowerEdge();
+        double xmax = thetaVsPhi.xAxis().upperEdge();
+        double ymin = thetaVsPhi.xAxis().lowerEdge();
+        double ymax = thetaVsPhi.xAxis().upperEdge();
+        
+        IHistogram1D phiHist = aida.histogram1D("phiWidth", xbins, xmin, xmax);
+
+        for(int i = 0; i< cb.nTheta; i++){
+            double phiWidth = cb.getPhiWidth(i);
+            for(int j = 0; j<phiWidth*1000; j++){
+                phiHist.fill(cb.thetaMin[i]+.001);
+            }
+        }
+
+        
+    }*/
+    
+    CustomBinning cb;
+    double minClustTime = 40;
+    double maxClustTime = 50;
+
+
+	public double getMinClustTime() {
+		return minClustTime;
+	}
+
+
+
+	public void setMinClustTime(double minClustTime) {
+		this.minClustTime = minClustTime;
+	}
+
+
+
+	public double getMaxClustTime() {
+		return maxClustTime;
+	}
+
+
+
+	public void setMaxClustTime(double maxClustTime) {
+		this.maxClustTime = maxClustTime;
+	}
+    
+	IHistogram2D z0VsTanLambda;
+	IHistogram2D z0VsChi2;
+	
+}

Added: java/trunk/users/src/main/java/org/hps/users/spaul/fee/FormFactor.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/spaul/fee/FormFactor.java	(added)
+++ java/trunk/users/src/main/java/org/hps/users/spaul/fee/FormFactor.java	Mon May 16 12:45:06 2016
@@ -0,0 +1,43 @@
+package org.hps.users.spaul.fee;
+
+public abstract class FormFactor {
+
+    abstract double getFormFactor(double q2);
+
+    double getFormFactorSquared(double q2){
+        return Math.pow(getFormFactor(q2), 2);
+    }
+    static double hbarc = .197;
+    static FormFactor carbon = new FormFactor(){
+
+        @Override
+        public double getFormFactor(double Q2) {
+            double Z= 6;
+            double rp = 0.8786;
+            double a = 1.64;
+            double b = Math.sqrt(a*a*(1-1/12.)+rp*rp);
+            return (1-(Z-2)/(6*Z)*a*a*Q2/(hbarc*hbarc))*Math.exp(-1/4.*b*b*Q2/(hbarc*hbarc));
+        }
+
+    };
+    static FormFactor tungsten = new FormFactor(){
+
+        @Override
+        public double getFormFactor(double Q2) {
+            double Z= 74;
+            double r = 6.87;
+            double x = Math.sqrt(Q2*r*r/(hbarc*hbarc));
+            double F_calc = 3/(x*x*x)*(Math.sin(x)-x*Math.cos(x));
+            return F_calc;
+        }
+        
+    };
+    static FormFactor get(int Z){
+        if(Z == 6)
+            return carbon;
+        if(Z == 74)
+            return tungsten;
+        System.err.println("Form Factor for " + Z + " not implemented");
+        return null;
+    }
+}

Added: java/trunk/users/src/main/java/org/hps/users/spaul/fee/MottIntegral.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/spaul/fee/MottIntegral.java	(added)
+++ java/trunk/users/src/main/java/org/hps/users/spaul/fee/MottIntegral.java	Mon May 16 12:45:06 2016
@@ -0,0 +1,66 @@
+package org.hps.users.spaul.fee;
+
+public class MottIntegral {
+    /**
+     * @param bin
+     * @param scale = Z^2alpha^2/(4*E^2)
+     * @param recoil = 2E/M
+     * @return the integral of 1/sin^4(th/2)*cos^2(th/2)/(1+a*sin^2(th/2)) times dPhi*sin(theta),
+     * which appears in the integral of mott scattering.
+     * 
+     * NOTE the sin(theta) is because dOmega = dTheta*dPhi*sin(theta)
+     */
+    static double mottIntegral(double recoil, double scale, int bin, CustomBinning cb){
+        double dPhi = 0;
+        for(int i = 0; i< cb.phiMax[bin].length; i++)
+            dPhi += 2*(cb.phiMax[bin][i] - cb.phiMin[bin][i]); //factor of 2 from top and bottom
+        
+        double Imax = integral(recoil, cb.thetaMax[bin]);
+               
+        double Imin = integral(recoil, cb.thetaMin[bin]);
+        double dI = Imax-Imin; 
+        
+        
+        double retval = scale*dPhi*dI;
+        return retval;
+    }
+    
+    static double mottIntegral(double recoil, double scale, double thetaMin, double thetaMax){
+        double Imax = integral(recoil, thetaMax);
+    
+        double Imin = integral(recoil, thetaMin);
+        double dI = Imax-Imin; 
+        
+        double dPhi = 2*Math.PI;  //full range in phi
+        double retval = scale*dPhi*dI;
+        return retval;
+    }
+    
+    static double integral(double a, double th){
+        double sinth22 = Math.pow(Math.sin(th/2), 2);
+        return 2*(-1/sinth22+(1+a)*(Math.log(2/sinth22+2*a)));
+    }
+    
+    static double mottIntegralWithFormFactor(double recoil, double scale, double thetaMin, double thetaMax, FormFactor ff, int nsteps, double E){
+        double sum = 0;
+        double prev = -1;
+
+        double dTheta = (thetaMax-thetaMin)/nsteps;
+        for(int i = 0; i<nsteps; i++){
+            double theta = i*(thetaMax-thetaMin)/nsteps+thetaMin;
+            double I = integral(recoil, theta);
+            if(i != 0)
+            {
+                double ts = Math.pow(Math.sin(theta/2),2);
+                double q2 = 4*E*E*ts/(1+recoil*ts);
+                double f2 = ff.getFormFactorSquared(q2);
+                sum+= (I-prev)*f2;
+            }
+            prev = I;
+            
+        }
+        double dPhi = 2*Math.PI;  //full range in phi
+        double retval = scale*dPhi*sum;
+        return retval;
+    }
+}

Modified: 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	(original)
+++ java/trunk/users/src/main/java/org/hps/users/spaul/feecc/BinGenerator.java	Mon May 16 12:45:06 2016
@@ -21,7 +21,7 @@
             }
             pw.println();
         }
-        ShowCustomBinning.main(new String[]{"generatedbins.txt"});
+        ShowCustomBinning.main(new String[]{"generatedbins.txt", "."});
 
     }
 
@@ -60,10 +60,11 @@
             // make the angular cuts on the tracks such that the particles that go into that cut 
             // are expected to be within 4 mm (~= 2 times the angular resolution of 1.5 mrad) of 
             // the ecal cuts.  
-            double d = 4;
+            double d = 0;
             
             boolean inRange = EcalUtil.fid_ECal_spherical_more_strict(thetaMin, phi, d) && EcalUtil.fid_ECal_spherical_more_strict(thetaMax, phi, d)
-                                && EcalUtil.fid_ECal_spherical_more_strict(thetaMin, -phi, d) && EcalUtil.fid_ECal_spherical_more_strict(thetaMax, -phi, d);
+                                && EcalUtil.fid_ECal_spherical_more_strict(thetaMin, -phi, d) && EcalUtil.fid_ECal_spherical_more_strict(thetaMax, -phi, d)
+                                && svt_fiducial(thetaMin, phi)&& svt_fiducial(thetaMin, -phi)&& svt_fiducial(thetaMax, phi) && svt_fiducial(thetaMax, -phi);
             if(inRange && !prevInRange)
                 phiBins[edgeNumber++] = phi;
             if(prevInRange && !inRange)
@@ -87,4 +88,15 @@
         
     }
 
+	private static boolean svt_fiducial(double theta, double phi) {
+		double ux = Math.sin(theta)*Math.cos(phi);
+		double uy = Math.sin(theta)*Math.sin(phi);
+		double uz = Math.cos(theta);
+		
+		ux/= uz;
+		uy/= uz;
+		
+		return Math.abs(uy)> 0.008 && Math.abs(uy)<0.059 && ux < 0.1600 && ux > -.119;
+	}
+
 }

Modified: 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	(original)
+++ java/trunk/users/src/main/java/org/hps/users/spaul/feecc/ShowCustomBinning.java	Mon May 16 12:45:06 2016
@@ -70,13 +70,63 @@
         
         drawEcalOutline(g);
         drawFidEcalOutline(g);
+        drawSVTOutline5(g);
         drawCustomBinRectangles(g);
         g.setColor(Color.BLACK);
         drawXAxis(g);
         drawYAxis(g);
     }
     
-    void drawFidEcalOutline(Graphics g){
+    private void drawSVTOutline5(Graphics g) {
+    	g.setColor(Color.RED);
+		double x_edge_high = 0.160;
+		double y_edge_low =  0.008;
+		double y_edge_high = 0.059;
+		double x_edge_low = -.119;
+		
+		double ux1,uy1, ux2, uy2;
+        double nPoints = 200;
+        for(int i = 0; i< nPoints-1; i++){
+            ux1 = x_edge_high;
+            ux2 = x_edge_high;
+            uy1 = y_edge_low + i*(y_edge_high-y_edge_low)/nPoints;
+            uy2 = y_edge_low+ (i+1)*(y_edge_high-y_edge_low)/nPoints;
+            drawLine(g, ux1, uy1, ux2, uy2);
+            drawLine(g, ux1, -uy1, ux2, -uy2);
+            
+            ux1 = x_edge_low;
+            ux2 = x_edge_low;
+            uy1 = y_edge_low + i*(y_edge_high-y_edge_low)/nPoints;
+            uy2 = y_edge_low+ (i+1)*(y_edge_high-y_edge_low)/nPoints;
+            drawLine(g, ux1, uy1, ux2, uy2);
+            drawLine(g, ux1, -uy1, ux2, -uy2);
+            
+            ux1 = x_edge_low + i*(x_edge_high-x_edge_low)/nPoints;
+            ux2 = x_edge_low + (i+1)*(x_edge_high-x_edge_low)/nPoints;
+            uy1 = y_edge_low;
+            uy2 = y_edge_low;
+            drawLine(g, ux1, uy1, ux2, uy2);
+            drawLine(g, ux1, -uy1, ux2, -uy2);
+            
+            ux1 = x_edge_low + i*(x_edge_high-x_edge_low)/nPoints;
+            ux2 = x_edge_low + (i+1)*(x_edge_high-x_edge_low)/nPoints;
+            uy1 = y_edge_high;
+            uy2 = y_edge_high;
+            drawLine(g, ux1, uy1, ux2, uy2);
+            drawLine(g, ux1, -uy1, ux2, -uy2);
+        }
+	}
+        
+    protected void drawLine(Graphics g, double ux1, double uy1, double ux2, double uy2){
+    	double theta1 = Math.atan(Math.hypot(ux1, uy1));
+    	double theta2 = Math.atan(Math.hypot(ux2, uy2));
+    	
+    	double phi1 = Math.atan2(uy1, ux1);
+    	double phi2 = Math.atan2(uy2, ux2);
+    	
+    	g.drawLine(getX(theta1), getY(phi1), getX(theta2), getY(phi2));
+    }
+	void drawFidEcalOutline(Graphics g){
         g.setColor(Color.GRAY);
         double x_edge_low = -262.74;
         double x_edge_high = 347.7;

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	Mon May 16 12:45:06 2016
@@ -45,6 +45,15 @@
             }
         }
     }
+    
+    protected void drawLine(Graphics g, double ux1, double uy1, double ux2, double uy2){
+    	
+    	ux1+=.0305;
+    	ux2+=.0305;
+    	
+    	g.drawLine(getX(ux1), getY(uy1), getX(ux2), getY(uy2));
+    }
+    
     private void drawLineFromPolar(double theta1, double phi1, double theta2,
             double phi2, Graphics g, Polygon p) {
         double[] xy1 = toXY(theta1, phi1);

Added: java/trunk/users/src/main/java/org/hps/users/spaul/trident/TridentHistogramDriver.java
 =============================================================================
--- java/trunk/users/src/main/java/org/hps/users/spaul/trident/TridentHistogramDriver.java	(added)
+++ java/trunk/users/src/main/java/org/hps/users/spaul/trident/TridentHistogramDriver.java	Mon May 16 12:45:06 2016
@@ -0,0 +1,256 @@
+package org.hps.users.spaul.trident;
+
+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 TridentHistogramDriver extends Driver{
+
+    private String[] tridentCollections =  new String[]{
+            "TargetConstrainedV0Vertices",
+            "UnconstrainedV0Vertices",
+            "BeamspotConstrainedV0Vertices",
+    };
+
+
+    @Override
+    public void process(EventHeader event){
+        for(int i = 0; i< tridentCollections.length; i++){
+            List<Vertex> tridents = event.get(Vertex.class, tridentCollections[i]);
+            for(Vertex v : tridents){
+                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[i].fill(pypz);
+                hpxpz[i].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();
+
+                
+
+                this.diff[i].fill(diff);
+                this.sum[i].fill(sum);
+                this.mass[i].fill(mass);
+                pypz_vs_diff[i].fill(diff,pypz );
+                pxpz_vs_diff[i].fill(diff, pxpz );
+
+
+
+                pxpz_vs_sum[i].fill(sum, pxpz );
+                pypz_vs_sum[i].fill(sum, pypz );
+
+                pxpz_vs_mass[i].fill(mass, pxpz );
+                pypz_vs_mass[i].fill(mass, pypz );
+                timediff[i].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);
+            }*/
+            }
+        }
+    }
+
+    static double BIG_NUMBER = Double.POSITIVE_INFINITY; 
+    double _maxVtxChi2 = 10;
+    double _maxTrkChi2 = 15;
+    double _maxMass = 1.0;
+    double _minMass = 0;
+    double _minVtxPz = 2.0;
+    double _maxVtxPz = 4.0;
+    double _maxTrkPz = 0;
+    double _maxPzDiff = 4.0;
+    boolean passesCuts(Vertex vertex){
+        ReconstructedParticle part = vertex.getAssociatedParticle();
+        if(!TrackType.isGBL(part.getType()))
+            return false;
+        if(part.getMomentum().z() > _maxVtxPz || part.getMomentum().z() < _minVtxPz)
+            return false;
+        if(part.getMass() > _maxMass || part.getMass() < _minMass)
+            return false;
+
+        if(part.getParticles().get(0).getCharge()*part.getParticles().get(1).getCharge() != -1 )
+            return false;
+
+        if(vertex.getChi2() > _maxVtxChi2)
+            return false;
+
+
+        if(part.getParticles().get(0).getClusters().size() == 0)
+            return false;
+        if(part.getParticles().get(1).getClusters().size() == 0)
+            return false;
+
+        if(part.getParticles().get(0).getTracks().get(0).getChi2() > _maxTrkChi2)
+            return false;
+        if(part.getParticles().get(1).getTracks().get(0).getChi2() > _maxTrkChi2)
+            return false;
+        return true;
+    }
+
+    IHistogram1D hpypz[], hpxpz[], diff[], sum[], mass[];
+    
+    IHistogram1D chi2TrkPlus[];
+    IHistogram1D chi2TrkMinus[];
+    IHistogram1D chi2Vtx[];
+    
+
+
+
+
+    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 getMinVtxPz() {
+        return _minVtxPz;
+    }
+
+
+    public void setMinVtxPz(double _minPz) {
+        this._minVtxPz = _minPz;
+    }
+
+
+    public double getMaxVtxPz() {
+        return _maxVtxPz;
+    }
+
+    public void setMaxVtxPz(double _maxPz) {
+        this._maxVtxPz = _maxPz;
+    }
+
+    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 = new IHistogram1D[3];
+        hpxpz = new IHistogram1D[3];
+        
+        
+        pxpz_vs_diff= new IProfile1D[3];
+        pypz_vs_diff= new IProfile1D[3];
+
+        diff= new IHistogram1D[3];
+
+        sum= new IHistogram1D[3];
+
+        pxpz_vs_sum= new IProfile1D[3];
+        pypz_vs_sum= new IProfile1D[3];
+
+        pxpz_vs_mass= new IProfile1D[3];
+        pypz_vs_mass= new IProfile1D[3];
+
+        //vtx_x= new IHistogram1D[3];
+        //vtx_y= new IHistogram1D[3];
+        mass= new IHistogram1D[3];
+        timediff= new IHistogram1D[3];
+        
+        for(int i = 0; i< 3; i++){
+            
+            hpypz[i] = aida.histogram1D(tridentCollections[i]+"/"+"pypz", 60, -.005,.005);
+            hpxpz[i] = aida.histogram1D(tridentCollections[i]+"/"+"pxpz", 60, .025,.035);
+
+
+           
+
+            pxpz_vs_diff[i] = aida.profile1D(tridentCollections[i]+"/"+"pxpz vs diff", 25, -.60, .60);
+            pypz_vs_diff[i] = aida.profile1D(tridentCollections[i]+"/"+"pypz vs diff", 25, -.60, .60);
+
+            diff[i] = aida.histogram1D(tridentCollections[i]+"/"+"diff", 50, -.60, .60);
+
+            sum[i] = aida.histogram1D(tridentCollections[i]+"/"+"sum", 50, 1.0, 1.1);
+
+            pxpz_vs_sum[i] = aida.profile1D(tridentCollections[i]+"/"+"pxpz vs sum", 25, 1.0, 1.1);
+            pypz_vs_sum[i] = aida.profile1D(tridentCollections[i]+"/"+"pypz vs sum", 25, 1.0, 1.1);
+
+            pxpz_vs_mass[i] = aida.profile1D(tridentCollections[i]+"/"+"pxpz vs mass", 25, .03, .037);
+            pypz_vs_mass[i] = aida.profile1D(tridentCollections[i]+"/"+"pypz vs mass", 25, .03, .037);
+
+            //vtx_x[i] = aida.histogram1D(tridentCollections[i]+"/"+"vtx x", 60, -1, 1);
+            //vtx_y[i] = aida.histogram1D(tridentCollections[i]+"/"+"vtx y", 60, -1, 1);
+            mass[i] = aida.histogram1D(tridentCollections[i]+"/"+"mass", 60, .030, .037);
+            timediff[i] = aida.histogram1D(tridentCollections[i]+"/"+"time diff", 60, -6, 6);
+        }
+
+        
+    }
+}

Top of Message | Previous Page | Permalink

Advanced Options


Options

Log In

Log In

Get Password

Get Password


Search Archives

Search Archives


Subscribe or Unsubscribe

Subscribe or Unsubscribe


Archives

November 2017
August 2017
July 2017
January 2017
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
December 2013
November 2013

ATOM RSS1 RSS2



LISTSERV.SLAC.STANFORD.EDU

Secured by F-Secure Anti-Virus CataList Email List Search Powered by the LISTSERV Email List Manager

Privacy Notice, Security Notice and Terms of Use