Author: [log in to unmask] Date: Wed Jul 6 18:07:21 2016 New Revision: 4417 Log: read truth info for tridents/A' Modified: java/trunk/analysis/src/main/java/org/hps/analysis/tuple/FEETupleDriver.java java/trunk/analysis/src/main/java/org/hps/analysis/tuple/MollerTupleDriver.java java/trunk/analysis/src/main/java/org/hps/analysis/tuple/TridentTupleDriver.java java/trunk/analysis/src/main/java/org/hps/analysis/tuple/TupleDriver.java java/trunk/steering-files/src/main/resources/org/hps/steering/analysis/MakeTuplesMC.lcsim Modified: java/trunk/analysis/src/main/java/org/hps/analysis/tuple/FEETupleDriver.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/tuple/FEETupleDriver.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/tuple/FEETupleDriver.java Wed Jul 6 18:07:21 2016 @@ -13,7 +13,8 @@ private final String finalStateParticlesColName = "FinalStateParticles"; private final double tupleTrkPCut = 0.7; - public FEETupleDriver() { + @Override + protected void setupVariables() { tupleVariables.clear(); addEventVariables(); addParticleVariables("fsp"); Modified: java/trunk/analysis/src/main/java/org/hps/analysis/tuple/MollerTupleDriver.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/tuple/MollerTupleDriver.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/tuple/MollerTupleDriver.java Wed Jul 6 18:07:21 2016 @@ -23,7 +23,8 @@ private final double tupleMinSumCut = 0.7; private final double tupleMaxSumCut = 1.3; - public MollerTupleDriver() { + @Override + protected void setupVariables() { tupleVariables.clear(); addEventVariables(); addVertexVariables(); Modified: java/trunk/analysis/src/main/java/org/hps/analysis/tuple/TridentTupleDriver.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/tuple/TridentTupleDriver.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/tuple/TridentTupleDriver.java Wed Jul 6 18:07:21 2016 @@ -20,14 +20,24 @@ private final double tupleTrkPCut = 0.9; private final double tupleMaxSumCut = 1.3; + private boolean getMC = false; - public TridentTupleDriver() { + @Override + protected void setupVariables() { + tupleVariables.clear(); addEventVariables(); addVertexVariables(); addParticleVariables("ele"); addParticleVariables("pos"); String[] newVars = new String[]{"minPositiveIso/D", "minNegativeIso/D", "minIso/D"}; tupleVariables.addAll(Arrays.asList(newVars)); + if (getMC) { + addMCTridentVariables(); + } + } + + public void setGetMC(boolean getMC) { + this.getMC = getMC; } @Override @@ -84,6 +94,11 @@ tupleMap.put("minPositiveIso/D", minPositiveIso); tupleMap.put("minNegativeIso/D", minNegativeIso); tupleMap.put("minIso/D", minIso); + + if (getMC) { + fillMCTridentVariables(event); + } + if (tupleWriter != null) { boolean trkCut = tupleMap.get("eleP/D") < tupleTrkPCut * ebeam && tupleMap.get("posP/D") < tupleTrkPCut * ebeam; boolean sumCut = tupleMap.get("eleP/D") + tupleMap.get("posP/D") < tupleMaxSumCut * ebeam; Modified: java/trunk/analysis/src/main/java/org/hps/analysis/tuple/TupleDriver.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/tuple/TupleDriver.java (original) +++ java/trunk/analysis/src/main/java/org/hps/analysis/tuple/TupleDriver.java Wed Jul 6 18:07:21 2016 @@ -3,6 +3,7 @@ import hep.physics.vec.BasicHep3Matrix; import hep.physics.vec.BasicHep3Vector; import hep.physics.vec.Hep3Vector; +import hep.physics.vec.HepLorentzVector; import hep.physics.vec.VecOp; import java.io.FileNotFoundException; import java.io.PrintWriter; @@ -26,6 +27,7 @@ import org.lcsim.event.Cluster; import org.lcsim.event.EventHeader; import org.lcsim.event.GenericObject; +import org.lcsim.event.MCParticle; import org.lcsim.event.ReconstructedParticle; import org.lcsim.event.Track; import org.lcsim.event.TrackState; @@ -41,10 +43,11 @@ * @author mgraham on Apr 15, 2014 update mgraham on May 15, 2014 to include * calculateEndOfRunQuantities & printDQMData i.e. useful methods */ -public class TupleDriver extends Driver { +public abstract class TupleDriver extends Driver { protected boolean debug = false; + protected String tupleFile = null; protected PrintWriter tupleWriter = null; protected final List<String> tupleVariables = new ArrayList<String>(); protected final Map<String, Double> tupleMap = new HashMap<String, Double>(); @@ -139,6 +142,8 @@ this.debug = debug; } + abstract protected void setupVariables(); + @Override protected void detectorChanged(Detector detector) { beamAxisRotation.setActiveEuler(Math.PI / 2, -0.0305, -Math.PI / 2); @@ -148,6 +153,15 @@ = this.getConditionsManager().getCachedConditions(BeamEnergy.BeamEnergyCollection.class, "beam_energies").getCachedData(); if (Double.isNaN(ebeam)) { ebeam = beamEnergyCollection.get(0).getBeamEnergy(); + } + setupVariables(); + if (tupleFile != null) { + try { + tupleWriter = new PrintWriter(tupleFile); + } catch (FileNotFoundException e) { + tupleWriter = null; + } + tupleWriter.println(StringUtils.join(tupleVariables, ":")); } } @@ -194,12 +208,7 @@ } public void setTupleFile(String tupleFile) { - try { - tupleWriter = new PrintWriter(tupleFile); - } catch (FileNotFoundException e) { - tupleWriter = null; - } - tupleWriter.println(StringUtils.join(tupleVariables, ":")); + this.tupleFile = tupleFile; // for (String variable : tupleVariables) { // tupleWriter.format("%s:", variable); // } @@ -444,4 +453,95 @@ tupleMap.put("vzcChisq/D", vzcV0.getStartVertex().getChi2()); tupleMap.put("vzcM/D", vzcV0.getMass()); } + + protected void addMCTridentVariables() { + String[] newVars = new String[]{"triStartX/D", "triStartY/D", "triStartZ/D", + "triEndX/D", "triEndY/D", "triEndZ/D", + "triPX/D", "triPY/D", "triPZ/D", "triP/D", "triM/D", "triE/D", + "pair1PX/D", "pair1PY/D", "pair1PZ/D", "pair1P/D", "pair1M/D", "pair1E/D", + "pair2PX/D", "pair2PY/D", "pair2PZ/D", "pair2P/D", "pair2M/D", "pair2E/D"}; + tupleVariables.addAll(Arrays.asList(newVars)); + } + + protected void fillMCTridentVariables(EventHeader event) { + List<MCParticle> MCParticles = event.getMCParticles(); + + MCParticle trident = null; + + MCParticle ele1 = null;//highest-energy electron daughter + MCParticle ele2 = null;//second-highest-energy electron daughter (if any) + MCParticle pos = null;//highest-energy positron daughter + + List<MCParticle> tridentParticles = null; + + for (MCParticle particle : MCParticles) { + if (particle.getPDGID() == 622) { + trident = particle; + tridentParticles = particle.getDaughters(); + break; + } + } + if (trident == null) { + return; + } + + Hep3Vector tridentStart = VecOp.mult(beamAxisRotation, trident.getOrigin()); + Hep3Vector tridentEnd = VecOp.mult(beamAxisRotation, trident.getEndPoint()); + Hep3Vector tridentP = VecOp.mult(beamAxisRotation, trident.getMomentum()); + + tupleMap.put("triStartX/D", tridentStart.x()); + tupleMap.put("triStartY/D", tridentStart.y()); + tupleMap.put("triStartZ/D", tridentStart.z()); + tupleMap.put("triEndX/D", tridentEnd.x()); + tupleMap.put("triEndY/D", tridentEnd.y()); + tupleMap.put("triEndZ/D", tridentEnd.z()); + tupleMap.put("triPX/D", tridentP.x()); + tupleMap.put("triPY/D", tridentP.y()); + tupleMap.put("triPZ/D", tridentP.z()); + tupleMap.put("triP/D", tridentP.magnitude()); + tupleMap.put("triM/D", trident.getMass()); + tupleMap.put("triE/D", trident.getEnergy()); + + for (MCParticle particle : tridentParticles) { + switch (particle.getPDGID()) { + case -11: + if (pos == null || particle.getEnergy() > pos.getEnergy()) { + pos = particle; + } + break; + case 11: + if (ele1 == null || particle.getEnergy() > ele1.getEnergy()) { + ele2 = ele1; + ele1 = particle; + } else if (ele2 == null || particle.getEnergy() > ele2.getEnergy()) { + ele2 = particle; + } + break; + } + } + + if (pos != null && ele1 != null) { + { + HepLorentzVector vtx = VecOp.add(pos.asFourVector(), ele1.asFourVector()); + Hep3Vector vtxP = VecOp.mult(beamAxisRotation, vtx.v3()); + tupleMap.put("pair1PX/D", vtxP.x()); + tupleMap.put("pair1PY/D", vtxP.y()); + tupleMap.put("pair1PY/D", vtxP.z()); + tupleMap.put("pair1P/D", vtxP.magnitude()); + tupleMap.put("pair1M/D", vtx.magnitude()); + tupleMap.put("pair1E/D", vtx.t()); + } + if (ele2 != null) { + HepLorentzVector vtx = VecOp.add(pos.asFourVector(), ele2.asFourVector()); + Hep3Vector vtxP = VecOp.mult(beamAxisRotation, vtx.v3()); + tupleMap.put("pair2PX/D", vtxP.x()); + tupleMap.put("pair2PY/D", vtxP.y()); + tupleMap.put("pair2PY/D", vtxP.z()); + tupleMap.put("pair2P/D", vtxP.magnitude()); + tupleMap.put("pair2M/D", vtx.magnitude()); + tupleMap.put("pair2E/D", vtx.t()); + } + } + + } } Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/analysis/MakeTuplesMC.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/analysis/MakeTuplesMC.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/analysis/MakeTuplesMC.lcsim Wed Jul 6 18:07:21 2016 @@ -23,6 +23,7 @@ <isGBL>true</isGBL> <tupleFile>${outputFile}_tri.txt</tupleFile> <cutTuple>true</cutTuple> + <getMC>true</getMC> </driver> <driver name="MollerTuple" type="org.hps.analysis.tuple.MollerTupleDriver"> <triggerType>all</triggerType>