Author: [log in to unmask] Date: Tue Mar 15 07:41:51 2016 New Revision: 4296 Log: (empty) Added: java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/MuonCandidateMonitoring.java Added: java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/MuonCandidateMonitoring.java ============================================================================= --- java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/MuonCandidateMonitoring.java (added) +++ java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/MuonCandidateMonitoring.java Tue Mar 15 07:41:51 2016 @@ -0,0 +1,251 @@ +package org.hps.analysis.dataquality; + +import hep.aida.IHistogram1D; +import hep.aida.IHistogram2D; +import hep.physics.vec.Hep3Vector; + +import java.util.List; +import java.util.logging.Logger; + +import org.hps.conditions.beam.BeamEnergy.BeamEnergyCollection; +import org.hps.recon.tracking.TrackType; +import org.hps.recon.tracking.TrackUtils; +import org.lcsim.event.Cluster; +import org.lcsim.event.EventHeader; +import org.lcsim.event.ReconstructedParticle; +import org.lcsim.event.RelationalTable; +import org.lcsim.event.Track; +import org.lcsim.event.Vertex; +import org.lcsim.geometry.Detector; + +public class MuonCandidateMonitoring extends DataQualityMonitor{ + + private static Logger LOGGER = Logger.getLogger(V0Monitoring.class.getPackage().getName()); + + private String finalStateParticlesColName = "FinalStateParticles"; + private String unconstrainedV0CandidatesColName = "UnconstrainedV0Candidates"; + private String beamConV0CandidatesColName = "BeamspotConstrainedV0Candidates"; + private String targetV0ConCandidatesColName = "TargetConstrainedV0Candidates"; + private String clusterCollectionName = "EcalClustersCorr"; + + private int nRecoEvents = 0; + + private String plotDir = "MuonCandidates/"; + + @Override + public void process(EventHeader event) { + /* make sure everything is there */ + if (!event.hasCollection(ReconstructedParticle.class, finalStateParticlesColName)) + return; + if (!event.hasCollection(ReconstructedParticle.class, unconstrainedV0CandidatesColName)) + return; + if (!event.hasCollection(ReconstructedParticle.class, beamConV0CandidatesColName)) + return; + if (!event.hasCollection(ReconstructedParticle.class, targetV0ConCandidatesColName)) + return; + if (!event.hasCollection(Cluster.class, clusterCollectionName)) + return; + + //check to see if this event is from the correct trigger (or "all"); + if (!matchTrigger(event)) + return; + + nRecoEvents++; + + RelationalTable hitToStrips = TrackUtils.getHitToStripsTable(event); + RelationalTable hitToRotated = TrackUtils.getHitToRotatedTable(event); + + List<ReconstructedParticle> unonstrainedV0List = event.get(ReconstructedParticle.class, unconstrainedV0CandidatesColName); + List<Cluster> clusters = event.get(Cluster.class, clusterCollectionName); + for (ReconstructedParticle uncV0 : unonstrainedV0List) { + if (isGBL != TrackType.isGBL(uncV0.getType())) + continue; + Vertex uncVert = uncV0.getStartVertex(); + + + //this always has 2 tracks. + List<ReconstructedParticle> trks = uncV0.getParticles(); + // Track ele = trks.get(0).getTracks().get(0); + // Track pos = trks.get(1).getTracks().get(0); + // //if track #0 has charge>0 it's the electron! This seems mixed up, but remember the track + // //charge is assigned assuming a positive B-field, while ours is negative + // if (trks.get(0).getCharge() > 0) { + // pos = trks.get(0).getTracks().get(0); + // ele = trks.get(1).getTracks().get(0); + // } + // aida.histogram2D(plotDir + trkType + triggerType + "/" + "P(e) vs P(p)").fill(getMomentum(ele), getMomentum(pos)); + // aida.histogram2D(plotDir + trkType + triggerType + "/" + "Px(e) vs Px(p)").fill(ele.getTrackStates().get(0).getMomentum()[1], pos.getTrackStates().get(0).getMomentum()[1]); + // aida.histogram2D(plotDir + trkType + triggerType + "/" + "Py(e) vs Py(p)").fill(ele.getTrackStates().get(0).getMomentum()[2], pos.getTrackStates().get(0).getMomentum()[2]); + ReconstructedParticle muMinus = null; + ReconstructedParticle muPlus = null; + //ReconParticles have the charge correct. + if (trks.get(0).getCharge() > 0 && trks.get(1).getCharge() < 0) { + muPlus = trks.get(0); + muMinus = trks.get(1); + } + else if(trks.get(1).getCharge() > 0 && trks.get(0).getCharge() < 0){ + muPlus = trks.get(1); + muMinus = trks.get(0); + } + + if(uncVert.getAssociatedParticle().getEnergy() > .080) //conservative guess for twice minimum ionizing + continue; + + Hep3Vector pPlus = muPlus.getMomentum(); + Hep3Vector pMinus = muMinus.getMomentum(); + + + double pp =pPlus.magnitude(); + double pm = pMinus.magnitude(); + + double psum = pp + pm; + double pdiff = pp - pm; + if(psum > v0PSumMaxCut || psum < v0PSumMinCut) + continue; + if(pdiff > maxDiffCut || pdiff < -maxDiffCut) + continue; + if(pp < minP|| pm < minP) + continue; + + + Track trackPlus = muPlus.getTracks().get(0); + Track trackMinus = muMinus.getTracks().get(0); + + double tPlus = TrackUtils.getTrackTime(trackPlus, hitToStrips, hitToRotated); + double tMinus = TrackUtils.getTrackTime(trackMinus, hitToStrips, hitToRotated); + + + + + Hep3Vector xyPlus = TrackUtils.extrapolateTrack(trackPlus, ecalZPosition); + Hep3Vector xyMinus = TrackUtils.extrapolateTrack(trackMinus, ecalZPosition); + + + + + //distance between the extrapolated track and the nearest cluster + double iso1 = 1000, iso2 = 1000; + + Cluster nc = getNearestCluster(clusters, xyPlus); + if(nc != null){ + iso1 = Math.hypot(xyPlus.x()-nc.getPosition()[0], xyPlus.y()-nc.getPosition()[1]); + dxyNearestClusterPlus.fill(xyPlus.x()-nc.getPosition()[0], xyPlus.y()-nc.getPosition()[1]); + } + nc = getNearestCluster(clusters, xyMinus); + if(nc != null){ + iso2 = Math.hypot(xyMinus.x()-nc.getPosition()[0], xyMinus.y()-nc.getPosition()[1]); + dxyNearestClusterMinus.fill(xyMinus.x()-nc.getPosition()[0], xyMinus.y()-nc.getPosition()[1]); + } + + if(iso1 < 20 || iso2 < 20) + continue; + + tPlusVsTMinus.fill(tPlus, tMinus); + timeDiff.fill(tPlus- tMinus); + + + xyAtEcalPlus.fill(xyPlus.x(), xyPlus.y()); + xyAtEcalMinus.fill(xyMinus.x(), xyMinus.y()); + + + double mmu2 = .1057*.1057; + + double mass = Math.sqrt(2*mmu2 + 2*Math.sqrt(pPlus.magnitudeSquared()+mmu2)*Math.sqrt(pMinus.magnitudeSquared()+mmu2) + -2*(pPlus.x()*pMinus.x()+pPlus.y()*pMinus.y()+pPlus.z()*pMinus.z())); + this.mass.fill(mass); + + + + this.pPlus.fill(pp); + this.pMinus.fill(pm); + this.pPlusVsPMinus.fill(pp, pm); + this.pTot.fill(pm+pp); + + for(Cluster c : clusters){ + clusterXY.fill(c.getPosition()[0], c.getPosition()[1]); + } + } + } + + private Cluster getNearestCluster(List<Cluster> clusters, Hep3Vector xy) { + double rbest = 1000; + Cluster best = null; + for(Cluster c : clusters){ + double r = Math.hypot(xy.x()-c.getPosition()[0], xy.y()-c.getPosition()[1]); + if(r<rbest){ + rbest = r; + best= c; + } + } + return best; + } + + private double ecalZPosition = 1300; + private double v0PSumMinCut, v0PSumMaxCut, v0MaxPCut, beambeamCut, maxDiffCut; + + private double minP; + + @Override + protected void detectorChanged(Detector detector) { + BeamEnergyCollection beamEnergyCollection = + this.getConditionsManager().getCachedConditions(BeamEnergyCollection.class, "beam_energies").getCachedData(); + double beamEnergy = beamEnergyCollection.get(0).getBeamEnergy(); + //feeMomentumCut = 0.75*beamEnergy; //GeV + + v0PSumMinCut = 0.2 * beamEnergy; + v0PSumMaxCut = 1.25 * beamEnergy; + minP = .1 *beamEnergy; + maxDiffCut = .8*beamEnergy; + + + + + LOGGER.info("Setting up the plotter"); + aida.tree().cd("/"); + + String xtra = "Extras"; + String trkType = "SeedTrack/"; + if (isGBL) + trkType = "GBLTrack/"; + + double maxMass = .4*beamEnergy; + /* V0 Quantities */ + /* Mass, vertex, chi^2 of fit */ + /* unconstrained */ + mass = aida.histogram1D(plotDir + trkType + triggerType + "/" + unconstrainedV0CandidatesColName + "/" + "Invariant Mass (GeV)", 100, 0, maxMass); + pPlus = aida.histogram1D(plotDir + trkType + triggerType + "/" + unconstrainedV0CandidatesColName + "/" + "P mu+", 100, 0, 1.5*beamEnergy); + pMinus = aida.histogram1D(plotDir + trkType + triggerType + "/" + unconstrainedV0CandidatesColName + "/" + "P mu-", 100, 0, 1.5*beamEnergy); + + timeDiff = aida.histogram1D(plotDir + trkType + triggerType + "/" + unconstrainedV0CandidatesColName + "/" + "Time Difference", 100, -10, 10); + + tPlusVsTMinus = aida.histogram2D(plotDir + trkType + triggerType + "/" + unconstrainedV0CandidatesColName + "/" + "t+ versus t-", 100, -10, 10, 100, -10, 10); + + pPlusVsPMinus = aida.histogram2D(plotDir + trkType + triggerType + "/" + unconstrainedV0CandidatesColName + "/" + "P mu+ vs P mu-", 100, 0, 1.5*beamEnergy, 100, 0, 1.5*beamEnergy); + + + + + pTot = aida.histogram1D(plotDir + trkType + triggerType + "/" + unconstrainedV0CandidatesColName + "/" + "P tot", 100, 0, 2*beamEnergy); + + xyAtEcalMinus = aida.histogram2D(plotDir + trkType + triggerType + "/" + unconstrainedV0CandidatesColName + "/" + "XY at Ecal (mu-)", 200, -200.0, 200.0, 85, -85.0, 85.0); + xyAtEcalPlus = aida.histogram2D(plotDir + trkType + triggerType + "/" + unconstrainedV0CandidatesColName + "/" + "XY at Ecal (mu+)", 200, -200.0, 200.0, 85, -85.0, 85.0); + + clusterXY = aida.histogram2D(plotDir + trkType + triggerType + "/" + unconstrainedV0CandidatesColName + "/" + "Cluster XY", 200, -200.0, 200.0, 85, -85.0, 85.0); + + + dxyNearestClusterPlus = aida.histogram2D(plotDir + trkType + triggerType + "/" + unconstrainedV0CandidatesColName + "/" + "dXY from nearest cluster (mu+)", 200, -30.0, 30.0, 85, -30.0, 30.0); + dxyNearestClusterMinus = aida.histogram2D(plotDir + trkType + triggerType + "/" + unconstrainedV0CandidatesColName + "/" + "dXY from nearest cluster (mu-)", 200, -30.0, 30.0, 85, -30.0, 30.0); + } + + + + private IHistogram1D mass, pPlus, pMinus, pTot, timeDiff; + + + private IHistogram2D xyAtEcalPlus, xyAtEcalMinus, pPlusVsPMinus, tPlusVsTMinus; + + private IHistogram2D dxyNearestClusterPlus, dxyNearestClusterMinus; + + private IHistogram2D clusterXY; + +}