Print

Print


Author: [log in to unmask]
Date: Wed Aug 10 12:33:46 2016
New Revision: 4459

Log:
added lots of variables for weighting the mass and momentum for further studies

Modified:
    java/trunk/analysis/src/main/java/org/hps/analysis/tuple/TupleDriver.java

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 Aug 10 12:33:46 2016
@@ -5,6 +5,7 @@
 import hep.physics.vec.Hep3Vector;
 import hep.physics.vec.HepLorentzVector;
 import hep.physics.vec.VecOp;
+
 import java.io.FileNotFoundException;
 import java.io.PrintWriter;
 import java.util.ArrayList;
@@ -12,7 +13,9 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+
 import org.apache.commons.lang3.StringUtils;
+import org.hps.analysis.ecal.MassCalculator;
 import org.hps.conditions.beam.BeamEnergy;
 import org.hps.recon.ecal.cluster.ClusterUtilities;
 import org.hps.recon.particle.HpsReconParticleDriver;
@@ -250,7 +253,13 @@
             "tarPX/D", "tarPY/D", "tarPZ/D", "tarP/D",
             "tarVX/D", "tarVY/D", "tarVZ/D", "tarChisq/D", "tarM/D",
             "vzcPX/D", "vzcPY/D", "vzcPZ/D", "vzcP/D",
-            "vzcVX/D", "vzcVY/D", "vzcVZ/D", "vzcChisq/D", "vzcM/D"};
+            "vzcVX/D", "vzcVY/D", "vzcVZ/D", "vzcChisq/D", "vzcM/D",
+            "uncElePX/D", "uncElePY/D", "uncElePZ/D", "uncPosPX/D", "uncPosPY/D", "uncPosPZ/D", "uncEleP/D", "uncPosP/D",
+            "bscElePX/D", "bscElePY/D", "bscElePZ/D", "bscPosPX/D", "bscPosPY/D", "bscPosPZ/D", "bscEleP/D", "bscPosP/D",
+            "tarElePX/D", "tarElePY/D", "tarElePZ/D", "tarPosPX/D", "tarPosPY/D", "tarPosPZ/D", "tarEleP/D", "tarPosP/D",
+            "vzcElePX/D", "vzcElePY/D", "vzcElePZ/D", "vzcPosPX/D", "vzcPosPY/D", "vzcPosPZ/D", "vzcEleP/D", "vzcPosP/D",
+            "uncEleWtP/D","uncPosWtP/D","bscEleWtP/D","bscPosWtP/D","tarEleWtP/D","tarPosWtP/D", "vzcEleWtP/D","vzcPosWtP/D",
+            "uncWtM/D","bscWtM/D","tarWtM/D","vzcWtM/D"};
         tupleVariables.addAll(Arrays.asList(newVars));
     }
 
@@ -266,6 +275,7 @@
             "IsoStereo/D", "IsoAxial/D",
             "MinPositiveIso/D", "MinNegativeIso/D",
             "MatchChisq/D", "ClT/D", "ClE/D", "ClSeedE/D", "ClX/D", "ClY/D", "ClZ/D", "ClHits/I"};
+        
         for (int i = 0; i < newVars.length; i++) {
             newVars[i] = prefix + newVars[i];
         }
@@ -279,9 +289,12 @@
         int npos = 0;
         int ntrk = 0;
         for (ReconstructedParticle fsp : fspList) {
-            if (isGBL != TrackType.isGBL(fsp.getType())) {
+           if (isGBL != TrackType.isGBL(fsp.getType())) {
                 continue;
             }
+            /*if (fsp.getClusters().isEmpty()){
+                continue;
+            }*/
             if (fsp.getCharge() != 0) {
                 ntrk++;
             }
@@ -302,8 +315,8 @@
             tupleMap.put("isPair1/B", triggerData.isPair1Trigger() ? 1.0 : 0.0);
         }
     }
-
-    protected TrackState fillParticleVariables(EventHeader event, ReconstructedParticle particle, String prefix) {
+    
+    protected TrackState fillParticleVariablesT(EventHeader event, ReconstructedParticle particle, String prefix) {
         Track track = particle.getTracks().get(0);
         TrackState trackState = track.getTrackStates().get(0);
         double[] param = new double[5];
@@ -393,6 +406,102 @@
         return tweakedTrackState;
     }
 
+  //  protected TrackState fillParticleVariables(EventHeader event, ReconstructedParticle particle, String prefix) {
+    protected ReconstructedParticle fillParticleVariables(EventHeader event, ReconstructedParticle particle, String prefix) {
+
+    if (!particle.getTracks().isEmpty()){
+        Track track = particle.getTracks().get(0);
+        TrackState trackState = track.getTrackStates().get(0);
+        double[] param = new double[5];
+        for (int i = 0; i < 5; i++) {
+            param[i] = trackState.getParameters()[i] + ((trackState.getTanLambda() > 0) ? topTrackCorrection[i] : botTrackCorrection[i]);
+        }
+//            Arrays.
+        TrackState tweakedTrackState = new BaseTrackState(param, trackState.getReferencePoint(), trackState.getCovMatrix(), trackState.getLocation(), bfield);
+        Hep3Vector pRot = VecOp.mult(beamAxisRotation, CoordinateTransformations.transformVectorToDetector(new BasicHep3Vector(tweakedTrackState.getMomentum())));
+
+        Double[] iso = TrackUtils.getIsolations(track, TrackUtils.getHitToStripsTable(event), TrackUtils.getHitToRotatedTable(event));
+        double minPositiveIso = 9999;
+        double minNegativeIso = 9999;
+        double isoStereo = -9999, isoAxial = -9999;
+        for (int i = 0; i < 6; i++) {
+            if (iso[2 * i] != null) {
+                if (pRot.y() < 0) {
+                    isoStereo = iso[2 * i];
+                    isoAxial = iso[2 * i + 1];
+                } else {
+                    isoAxial = iso[2 * i];
+                    isoStereo = iso[2 * i + 1];
+                }
+                for (int j = 2 * i; j < 2 * i + 2; j++) {
+                    if (iso[j] < 100) {
+                        if (iso[j] > 0) {
+                            if (minPositiveIso > 100 || iso[j] < minPositiveIso) {
+                                minPositiveIso = iso[j];
+                            }
+                        } else {
+                            if (minNegativeIso > 100 || iso[j] > minNegativeIso) {
+                                minNegativeIso = iso[j];
+                            }
+                        }
+                    }
+                }
+                break;
+            }
+        }
+        
+        double trkT = TrackUtils.getTrackTime(track, TrackUtils.getHitToStripsTable(event), TrackUtils.getHitToRotatedTable(event));
+        Hep3Vector atEcal = TrackUtils.getTrackPositionAtEcal(tweakedTrackState);
+        Hep3Vector firstHitPosition = VecOp.mult(beamAxisRotation, CoordinateTransformations.transformVectorToDetector(new BasicHep3Vector(track.getTrackerHits().get(0).getPosition())));
+        GenericObject kinks = GBLKinkData.getKinkData(event, track);
+
+        tupleMap.put(prefix + "PX/D", pRot.x());
+        tupleMap.put(prefix + "PY/D", pRot.y());
+        tupleMap.put(prefix + "PZ/D", pRot.z());
+        tupleMap.put(prefix + "P/D", pRot.magnitude());
+        tupleMap.put(prefix + "TrkZ0/D", tweakedTrackState.getZ0());
+        tupleMap.put(prefix + "TrkLambda/D", tweakedTrackState.getTanLambda());
+        tupleMap.put(prefix + "TrkD0/D", tweakedTrackState.getD0());
+        tupleMap.put(prefix + "TrkPhi/D", tweakedTrackState.getPhi());
+        tupleMap.put(prefix + "TrkOmega/D", tweakedTrackState.getOmega());
+        tupleMap.put(prefix + "TrkEcalX/D", atEcal.x());
+        tupleMap.put(prefix + "TrkEcalY/D", atEcal.y());
+        tupleMap.put(prefix + "TrkChisq/D", track.getChi2());
+        tupleMap.put(prefix + "TrkHits/I", (double) track.getTrackerHits().size());
+        tupleMap.put(prefix + "TrkType/I", (double) particle.getType());
+        tupleMap.put(prefix + "TrkT/D", trkT);
+        tupleMap.put(prefix + "HasL1/B", iso[0] != null ? 1.0 : 0.0);
+        tupleMap.put(prefix + "HasL2/B", iso[2] != null ? 1.0 : 0.0);
+        tupleMap.put(prefix + "HasL3/B", iso[4] != null ? 1.0 : 0.0);
+        tupleMap.put(prefix + "FirstHitX/D", firstHitPosition.x());
+        tupleMap.put(prefix + "FirstHitY/D", firstHitPosition.y());
+        tupleMap.put(prefix + "LambdaKink1/D", kinks!=null ? GBLKinkData.getLambdaKink(kinks, 1) : 0);
+        tupleMap.put(prefix + "LambdaKink2/D", kinks!=null ? GBLKinkData.getLambdaKink(kinks, 2) : 0);
+        tupleMap.put(prefix + "LambdaKink3/D", kinks!=null ? GBLKinkData.getLambdaKink(kinks, 3) : 0);
+        tupleMap.put(prefix + "PhiKink1/D", kinks!=null ? GBLKinkData.getPhiKink(kinks, 1) : 0);
+        tupleMap.put(prefix + "PhiKink2/D", kinks!=null ? GBLKinkData.getPhiKink(kinks, 2) : 0);
+        tupleMap.put(prefix + "PhiKink3/D", kinks!=null ? GBLKinkData.getPhiKink(kinks, 3) : 0);
+        tupleMap.put(prefix + "IsoStereo/D", isoStereo);
+        tupleMap.put(prefix + "IsoAxial/D", isoAxial);
+        tupleMap.put(prefix + "MinPositiveIso/D", minPositiveIso);
+        tupleMap.put(prefix + "MinNegativeIso/D", minNegativeIso);
+        tupleMap.put(prefix + "MatchChisq/D", particle.getGoodnessOfPID());
+        }
+        if (!particle.getClusters().isEmpty()) {
+            Cluster cluster = particle.getClusters().get(0);
+            tupleMap.put(prefix + "ClT/D", ClusterUtilities.getSeedHitTime(cluster));
+            tupleMap.put(prefix + "ClE/D", cluster.getEnergy());
+            tupleMap.put(prefix + "ClSeedE/D", ClusterUtilities.findSeedHit(cluster).getCorrectedEnergy());
+            tupleMap.put(prefix + "ClX/D", cluster.getPosition()[0]);
+            tupleMap.put(prefix + "ClY/D", cluster.getPosition()[1]);
+            tupleMap.put(prefix + "ClZ/D", cluster.getPosition()[2]);
+            tupleMap.put(prefix + "ClHits/I", (double) cluster.getCalorimeterHits().size());
+        }
+
+        //return tweakedTrackState;
+        return particle;    
+    }
+
     protected void fillVertexVariables(EventHeader event, List<BilliorTrack> billiorTracks, ReconstructedParticle electron, ReconstructedParticle positron) {
         BilliorVertexer vtxFitter = new BilliorVertexer(TrackUtils.getBField(event.getDetector()).y());
         vtxFitter.setBeamSize(beamSize);
@@ -421,8 +530,8 @@
         BilliorVertex vzcVertex = vtxFitter.fitVertex(billiorTracks);
         ReconstructedParticle vzcV0 = HpsReconParticleDriver.makeReconstructedParticle(electron, positron, vzcVertex);
         Hep3Vector vzcMomRot = VecOp.mult(beamAxisRotation, vzcV0.getMomentum());
-        Hep3Vector vzcVtx = VecOp.mult(beamAxisRotation, vzcV0.getStartVertex().getPosition());
-
+        Hep3Vector vzcVtx = VecOp.mult(beamAxisRotation, vzcV0.getStartVertex().getPosition()); 
+        
         tupleMap.put("uncPX/D", uncMomRot.x());
         tupleMap.put("uncPY/D", uncMomRot.y());
         tupleMap.put("uncPZ/D", uncMomRot.z());
@@ -432,7 +541,17 @@
         tupleMap.put("uncVZ/D", uncVtx.z());
         tupleMap.put("uncChisq/D", uncV0.getStartVertex().getChi2());
         tupleMap.put("uncM/D", uncV0.getMass());
-
+        tupleMap.put("uncElePX/D", uncVertex.getParameters().get("p1X"));
+        tupleMap.put("uncElePY/D", uncVertex.getParameters().get("p1Y"));
+        tupleMap.put("uncElePZ/D", uncVertex.getParameters().get("p1Z"));
+        tupleMap.put("uncEleP/D", Math.sqrt(Math.pow(uncVertex.getParameters().get("p1X"), 2)+Math.pow(uncVertex.getParameters().get("p1Y"), 2)
+                +Math.pow(uncVertex.getParameters().get("p1Z"), 2)));
+        tupleMap.put("uncPosPX/D", uncVertex.getParameters().get("p2X"));
+        tupleMap.put("uncPosPY/D", uncVertex.getParameters().get("p2Y"));
+        tupleMap.put("uncPosPZ/D", uncVertex.getParameters().get("p2Z"));
+        tupleMap.put("uncPosP/D", Math.sqrt(Math.pow(uncVertex.getParameters().get("p2X"), 2)+Math.pow(uncVertex.getParameters().get("p2Y"), 2)
+                +Math.pow(uncVertex.getParameters().get("p2Z"), 2)));
+               
         tupleMap.put("bscPX/D", bscMomRot.x());
         tupleMap.put("bscPY/D", bscMomRot.y());
         tupleMap.put("bscPZ/D", bscMomRot.z());
@@ -442,7 +561,17 @@
         tupleMap.put("bscVZ/D", bscVtx.z());
         tupleMap.put("bscChisq/D", bscV0.getStartVertex().getChi2());
         tupleMap.put("bscM/D", bscV0.getMass());
-
+        tupleMap.put("bscElePX/D", bsconVertex.getParameters().get("p1X"));
+        tupleMap.put("bscElePY/D", bsconVertex.getParameters().get("p1Y"));
+        tupleMap.put("bscElePZ/D", bsconVertex.getParameters().get("p1Z"));
+        tupleMap.put("bscEleP/D", Math.sqrt(Math.pow(bsconVertex.getParameters().get("p1X"), 2)+Math.pow(bsconVertex.getParameters().get("p1Y"), 2)
+                +Math.pow(bsconVertex.getParameters().get("p1Z"), 2)));
+        tupleMap.put("bscPosPX/D", bsconVertex.getParameters().get("p2X"));
+        tupleMap.put("bscPosPY/D", bsconVertex.getParameters().get("p2Y"));
+        tupleMap.put("bscPosPZ/D", bsconVertex.getParameters().get("p2Z"));
+        tupleMap.put("bscPosP/D", Math.sqrt(Math.pow(bsconVertex.getParameters().get("p2X"), 2)+Math.pow(bsconVertex.getParameters().get("p2Y"), 2)
+                +Math.pow(bsconVertex.getParameters().get("p2Z"), 2)));
+        
         tupleMap.put("tarPX/D", tarMomRot.x());
         tupleMap.put("tarPY/D", tarMomRot.y());
         tupleMap.put("tarPZ/D", tarMomRot.z());
@@ -452,7 +581,17 @@
         tupleMap.put("tarVZ/D", tarVtx.z());
         tupleMap.put("tarChisq/D", tarV0.getStartVertex().getChi2());
         tupleMap.put("tarM/D", tarV0.getMass());
-
+        tupleMap.put("tarElePX/D", tarVertex.getParameters().get("p1X"));
+        tupleMap.put("tarElePY/D", tarVertex.getParameters().get("p1Y"));
+        tupleMap.put("tarElePZ/D", tarVertex.getParameters().get("p1Z"));
+        tupleMap.put("tarEleP/D", Math.sqrt(Math.pow(tarVertex.getParameters().get("p1X"), 2)+Math.pow(tarVertex.getParameters().get("p1Y"), 2)
+                +Math.pow(tarVertex.getParameters().get("p1Z"), 2)));
+        tupleMap.put("tarPosPX/D", tarVertex.getParameters().get("p2X"));
+        tupleMap.put("tarPosPY/D", tarVertex.getParameters().get("p2Y"));
+        tupleMap.put("tarPosPZ/D", tarVertex.getParameters().get("p2Z"));
+        tupleMap.put("tarPosP/D", Math.sqrt(Math.pow(tarVertex.getParameters().get("p2X"), 2)+Math.pow(tarVertex.getParameters().get("p2Y"), 2)
+                +Math.pow(tarVertex.getParameters().get("p2Z"), 2)));
+        
         tupleMap.put("vzcPX/D", vzcMomRot.x());
         tupleMap.put("vzcPY/D", vzcMomRot.y());
         tupleMap.put("vzcPZ/D", vzcMomRot.z());
@@ -462,6 +601,129 @@
         tupleMap.put("vzcVZ/D", vzcVtx.z());
         tupleMap.put("vzcChisq/D", vzcV0.getStartVertex().getChi2());
         tupleMap.put("vzcM/D", vzcV0.getMass());
+        tupleMap.put("vzcElePX/D", vzcVertex.getParameters().get("p1X"));
+        tupleMap.put("vzcElePY/D", vzcVertex.getParameters().get("p1Y"));
+        tupleMap.put("vzcElePZ/D", vzcVertex.getParameters().get("p1Z"));
+        tupleMap.put("vzcEleP/D", Math.sqrt(Math.pow(vzcVertex.getParameters().get("p1X"), 2)+Math.pow(vzcVertex.getParameters().get("p1Y"), 2)
+                +Math.pow(vzcVertex.getParameters().get("p1Z"), 2)));
+        tupleMap.put("vzcPosPX/D", vzcVertex.getParameters().get("p2X"));
+        tupleMap.put("vzcPosPY/D", vzcVertex.getParameters().get("p2Y"));
+        tupleMap.put("vzcPosPZ/D", vzcVertex.getParameters().get("p2Z"));
+        tupleMap.put("vzcPosP/D", Math.sqrt(Math.pow(vzcVertex.getParameters().get("p2X"), 2)+Math.pow(vzcVertex.getParameters().get("p2Y"), 2)
+                +Math.pow(vzcVertex.getParameters().get("p2Z"), 2)));
+        
+        //////////////////////////////////////////////////////////////////////////////////////////
+        int nEleClusters = electron.getClusters().size();
+        int nPosClusters = positron.getClusters().size();
+
+        if (nEleClusters > 0){
+           
+            tupleMap.put("uncEleWtP/D", MassCalculator.combinedMomentum(electron.getClusters().get(0), electron.getTracks().get(0), 
+                    Math.sqrt(Math.pow(uncV0.getStartVertex().getParameters().get("p1X"), 2)+Math.pow(uncV0.getStartVertex().getParameters().get("p1Y"), 2)
+                    +Math.pow(uncV0.getStartVertex().getParameters().get("p1Z"), 2))));
+            tupleMap.put("vzcEleWtP/D", MassCalculator.combinedMomentum(electron.getClusters().get(0), electron.getTracks().get(0), 
+                    Math.sqrt(Math.pow(vzcV0.getStartVertex().getParameters().get("p1X"), 2)+Math.pow(vzcV0.getStartVertex().getParameters().get("p1Y"), 2)
+                    +Math.pow(vzcV0.getStartVertex().getParameters().get("p1Z"), 2))));
+            tupleMap.put("tarEleWtP/D", MassCalculator.combinedMomentum(electron.getClusters().get(0), electron.getTracks().get(0), 
+                    Math.sqrt(Math.pow(tarV0.getStartVertex().getParameters().get("p1X"), 2)+Math.pow(tarV0.getStartVertex().getParameters().get("p1Y"), 2)
+                    +Math.pow(tarV0.getStartVertex().getParameters().get("p1Z"), 2))));
+            tupleMap.put("bscEleWtP/D", MassCalculator.combinedMomentum(electron.getClusters().get(0), electron.getTracks().get(0), 
+                    Math.sqrt(Math.pow(bscV0.getStartVertex().getParameters().get("p1X"), 2)+Math.pow(bscV0.getStartVertex().getParameters().get("p1Y"), 2)
+                    +Math.pow(bscV0.getStartVertex().getParameters().get("p1Z"), 2))));
+                    
+            if (nPosClusters > 0){
+
+                tupleMap.put("vzcPosWtP/D", MassCalculator.combinedMomentum(positron.getClusters().get(0), positron.getTracks().get(0), 
+                        Math.sqrt(Math.pow(vzcV0.getStartVertex().getParameters().get("p2X"), 2)+Math.pow(vzcV0.getStartVertex().getParameters().get("p2Y"), 2)
+                        +Math.pow(vzcV0.getStartVertex().getParameters().get("p2Z"), 2))));
+                tupleMap.put("tarPosWtP/D", MassCalculator.combinedMomentum(positron.getClusters().get(0), positron.getTracks().get(0), 
+                        Math.sqrt(Math.pow(tarV0.getStartVertex().getParameters().get("p2X"), 2)+Math.pow(tarV0.getStartVertex().getParameters().get("p2Y"), 2)
+                        +Math.pow(tarV0.getStartVertex().getParameters().get("p2Z"), 2)))); 
+                tupleMap.put("bscPosWtP/D", MassCalculator.combinedMomentum(positron.getClusters().get(0), positron.getTracks().get(0), 
+                        Math.sqrt(Math.pow(bscV0.getStartVertex().getParameters().get("p2X"), 2)+Math.pow(bscV0.getStartVertex().getParameters().get("p2Y"), 2)
+                        +Math.pow(bscV0.getStartVertex().getParameters().get("p2Z"), 2))));
+                tupleMap.put("uncPosWtP/D", MassCalculator.combinedMomentum(positron.getClusters().get(0), positron.getTracks().get(0), 
+                        Math.sqrt(Math.pow(uncV0.getStartVertex().getParameters().get("p2X"), 2)+Math.pow(uncV0.getStartVertex().getParameters().get("p2Y"), 2)
+                        +Math.pow(uncV0.getStartVertex().getParameters().get("p2Z"), 2))));         
+                
+                tupleMap.put("vzcWtM/D", MassCalculator.combinedMass(electron.getClusters().get(0), positron.getClusters().get(0), vzcV0));     
+                tupleMap.put("tarWtM/D", MassCalculator.combinedMass(electron.getClusters().get(0), positron.getClusters().get(0), tarV0));
+                tupleMap.put("bscWtM/D", MassCalculator.combinedMass(electron.getClusters().get(0), positron.getClusters().get(0), bscV0));
+                tupleMap.put("uncWtM/D", MassCalculator.combinedMass(electron.getClusters().get(0), positron.getClusters().get(0), uncV0));     
+                          
+            }
+            
+            else {//e- has cluster, e+ does not
+                tupleMap.put("vzcPosWtP/D", Math.sqrt(Math.pow(vzcV0.getStartVertex().getParameters().get("p2X"), 2)+Math.pow(vzcV0.getStartVertex().getParameters().get("p2Y"), 2)
+                        +Math.pow(vzcV0.getStartVertex().getParameters().get("p2Z"), 2)));
+                tupleMap.put("bscPosWtP/D", Math.sqrt(Math.pow(bscV0.getStartVertex().getParameters().get("p2X"), 2)+Math.pow(bscV0.getStartVertex().getParameters().get("p2Y"), 2)
+                        +Math.pow(bscV0.getStartVertex().getParameters().get("p2Z"), 2)));
+                tupleMap.put("tarPosWtP/D", Math.sqrt(Math.pow(tarV0.getStartVertex().getParameters().get("p2X"), 2)+Math.pow(tarV0.getStartVertex().getParameters().get("p2Y"), 2)
+                        +Math.pow(tarV0.getStartVertex().getParameters().get("p2Z"), 2)));
+                tupleMap.put("uncPosWtP/D", Math.sqrt(Math.pow(uncV0.getStartVertex().getParameters().get("p2X"), 2)+Math.pow(uncV0.getStartVertex().getParameters().get("p2Y"), 2)
+                        +Math.pow(uncV0.getStartVertex().getParameters().get("p2Z"), 2)));
+                tupleMap.put("vzcWtM/D", MassCalculator.combinedMass(electron.getClusters().get(0), positron.getTracks().get(0), vzcV0));
+                tupleMap.put("tarWtM/D", MassCalculator.combinedMass(electron.getClusters().get(0), positron.getTracks().get(0), tarV0));
+                tupleMap.put("bscWtM/D", MassCalculator.combinedMass(electron.getClusters().get(0), positron.getTracks().get(0), bscV0));
+                tupleMap.put("uncWtM/D", MassCalculator.combinedMass(electron.getClusters().get(0), positron.getTracks().get(0), uncV0));                      
+            }
+            
+        }
+        
+        if (nPosClusters>0 && nEleClusters==0){//e+ has cluster, e- does not
+            tupleMap.put("vzcPosWtP/D", MassCalculator.combinedMomentum(positron.getClusters().get(0), positron.getTracks().get(0), 
+                    Math.sqrt(Math.pow(vzcV0.getStartVertex().getParameters().get("p2X"), 2)+Math.pow(vzcV0.getStartVertex().getParameters().get("p2Y"), 2)
+                            +Math.pow(vzcV0.getStartVertex().getParameters().get("p2Z"), 2))));
+            tupleMap.put("tarPosWtP/D", MassCalculator.combinedMomentum(positron.getClusters().get(0), positron.getTracks().get(0), 
+                    Math.sqrt(Math.pow(tarV0.getStartVertex().getParameters().get("p2X"), 2)+Math.pow(tarV0.getStartVertex().getParameters().get("p2Y"), 2)
+                            +Math.pow(tarV0.getStartVertex().getParameters().get("p2Z"), 2)))); 
+            tupleMap.put("bscPosWtP/D", MassCalculator.combinedMomentum(positron.getClusters().get(0), positron.getTracks().get(0), 
+                    Math.sqrt(Math.pow(bscV0.getStartVertex().getParameters().get("p2X"), 2)+Math.pow(bscV0.getStartVertex().getParameters().get("p2Y"), 2)
+                            +Math.pow(bscV0.getStartVertex().getParameters().get("p2Z"), 2))));
+            tupleMap.put("uncPosWtP/D", MassCalculator.combinedMomentum(positron.getClusters().get(0), positron.getTracks().get(0), 
+                    Math.sqrt(Math.pow(uncV0.getStartVertex().getParameters().get("p2X"), 2)+Math.pow(uncV0.getStartVertex().getParameters().get("p2Y"), 2)
+                            +Math.pow(uncV0.getStartVertex().getParameters().get("p2Z"), 2))));  
+            tupleMap.put("vzcEleWtP/D", Math.sqrt(Math.pow(vzcV0.getStartVertex().getParameters().get("p1X"), 2)+Math.pow(vzcV0.getStartVertex().getParameters().get("p1Y"), 2)
+                    +Math.pow(vzcV0.getStartVertex().getParameters().get("p1Z"), 2)));
+            tupleMap.put("bscEleWtP/D", Math.sqrt(Math.pow(bscV0.getStartVertex().getParameters().get("p1X"), 2)+Math.pow(bscV0.getStartVertex().getParameters().get("p1Y"), 2)
+                    +Math.pow(bscV0.getStartVertex().getParameters().get("p1Z"), 2)));
+            tupleMap.put("tarEleWtP/D", Math.sqrt(Math.pow(tarV0.getStartVertex().getParameters().get("p1X"), 2)+Math.pow(tarV0.getStartVertex().getParameters().get("p1Y"), 2)
+                    +Math.pow(tarV0.getStartVertex().getParameters().get("p1Z"), 2)));
+            tupleMap.put("uncEleWtP/D", Math.sqrt(Math.pow(uncV0.getStartVertex().getParameters().get("p1X"), 2)+Math.pow(uncV0.getStartVertex().getParameters().get("p1Y"), 2)
+                    +Math.pow(uncV0.getStartVertex().getParameters().get("p1Z"), 2)));
+                    
+            tupleMap.put("vzcWtM/D", MassCalculator.combinedMass(electron.getTracks().get(0), positron.getClusters().get(0), vzcV0));
+            tupleMap.put("tarWtM/D", MassCalculator.combinedMass(electron.getTracks().get(0), positron.getClusters().get(0), tarV0));
+            tupleMap.put("bscWtM/D", MassCalculator.combinedMass(electron.getTracks().get(0), positron.getClusters().get(0), bscV0));
+            tupleMap.put("uncWtM/D", MassCalculator.combinedMass(electron.getTracks().get(0), positron.getClusters().get(0), uncV0));                
+        }   
+        
+        
+       if (nPosClusters==0 && nEleClusters==0){
+            tupleMap.put("vzcEleWtP/D", Math.sqrt(Math.pow(vzcV0.getStartVertex().getParameters().get("p1X"), 2)+Math.pow(vzcV0.getStartVertex().getParameters().get("p1Y"), 2)
+                    +Math.pow(vzcV0.getStartVertex().getParameters().get("p1Z"), 2)));
+            tupleMap.put("vzcPosWtP/D", Math.sqrt(Math.pow(vzcV0.getStartVertex().getParameters().get("p2X"), 2)+Math.pow(vzcV0.getStartVertex().getParameters().get("p2Y"), 2)
+                    +Math.pow(vzcV0.getStartVertex().getParameters().get("p2Z"), 2)));
+            tupleMap.put("vzcWtM/D", vzcV0.getMass());  
+            tupleMap.put("tarEleWtP/D", Math.sqrt(Math.pow(tarV0.getStartVertex().getParameters().get("p1X"), 2)+Math.pow(tarV0.getStartVertex().getParameters().get("p1Y"), 2)
+                    +Math.pow(tarV0.getStartVertex().getParameters().get("p1Z"), 2)));
+            tupleMap.put("tarPosWtP/D", Math.sqrt(Math.pow(tarV0.getStartVertex().getParameters().get("p2X"), 2)+Math.pow(tarV0.getStartVertex().getParameters().get("p2Y"), 2)
+                    +Math.pow(tarV0.getStartVertex().getParameters().get("p2Z"), 2)));
+            tupleMap.put("tarWtM/D", tarV0.getMass());    
+            tupleMap.put("bscEleWtP/D", Math.sqrt(Math.pow(bscV0.getStartVertex().getParameters().get("p1X"), 2)+Math.pow(bscV0.getStartVertex().getParameters().get("p1Y"), 2)
+                    +Math.pow(bscV0.getStartVertex().getParameters().get("p1Z"), 2)));
+            tupleMap.put("bscPosWtP/D", Math.sqrt(Math.pow(bscV0.getStartVertex().getParameters().get("p2X"), 2)+Math.pow(bscV0.getStartVertex().getParameters().get("p2Y"), 2)
+                    +Math.pow(bscV0.getStartVertex().getParameters().get("p2Z"), 2)));
+            tupleMap.put("bscWtM/D", bscV0.getMass());    
+            tupleMap.put("uncEleWtP/D", Math.sqrt(Math.pow(uncV0.getStartVertex().getParameters().get("p1X"), 2)+Math.pow(uncV0.getStartVertex().getParameters().get("p1Y"), 2)
+                    +Math.pow(uncV0.getStartVertex().getParameters().get("p1Z"), 2)));
+            tupleMap.put("uncPosWtP/D", Math.sqrt(Math.pow(uncV0.getStartVertex().getParameters().get("p2X"), 2)+Math.pow(uncV0.getStartVertex().getParameters().get("p2Y"), 2)
+                    +Math.pow(uncV0.getStartVertex().getParameters().get("p2Z"), 2)));
+            tupleMap.put("uncWtM/D", uncV0.getMass());
+            
+       }
+       
+        //////////////////////////////////////////////////////////////////////////////
     }
 
     protected void addMCTridentVariables() {