Author: [log in to unmask] Date: Mon Jun 22 19:12:27 2015 New Revision: 3184 Log: driver for cleaning up reconparticle collections Added: java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/PairsSkimmer.lcsim - copied, changed from r3101, java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/EcalScoring.lcsim java/trunk/users/src/main/java/org/hps/users/meeg/ReconParticleCleanupDriver.java Copied: java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/PairsSkimmer.lcsim (from r3101, java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/EcalScoring.lcsim) ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/EcalScoring.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/users/meeg/PairsSkimmer.lcsim Mon Jun 22 19:12:27 2015 @@ -1,28 +1,43 @@ <!-- - Minimal example for ECalScoringMatchDriver. + Discard events with SVT readout noise. @author Sho Uemura <[log in to unmask]> - @version $Id: HPS2014ReadoutToLcio.lcsim,v 1.2 2013/03/01 23:22:24 meeg Exp $ --> <lcsim xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/lcsim/1.0/lcsim.xsd"> <execute> <driver name="EventMarkerDriver"/> + + <driver name="RawTrackerHitSensorSetup"/> - <driver name="EcalScoringMatch"/> + <driver name="ReconParticleCleanupDriver"/> + + <driver name="SVTSmallHitsFilter"/> + <driver name="EcalPairsFilter"/> + <driver name="CollectionSizeFilter"/> - <driver name="AidaSaveDriver"/> + <driver name="LCIOWriter"/> </execute> <drivers> <driver name="EventMarkerDriver" type="org.lcsim.job.EventMarkerDriver"> - <eventInterval>1</eventInterval> + <eventInterval>1000</eventInterval> </driver> - <driver name="EcalScoringMatch" type="org.hps.analysis.examples.EcalScoringMatchDriver"/> - - <driver name="AidaSaveDriver" type="org.lcsim.job.AidaSaveDriver"> - <outputFileName>${outputFile}</outputFileName> + <driver name="RawTrackerHitSensorSetup" type="org.lcsim.recon.tracking.digitization.sisim.config.RawTrackerHitSensorSetup"> + <readoutCollections>SVTRawTrackerHits</readoutCollections> </driver> + <driver name="ReconParticleCleanupDriver" type="org.hps.users.meeg.ReconParticleCleanupDriver"/> + + <driver name="SVTSmallHitsFilter" type="org.hps.recon.filtering.SVTSmallHitsFilter"/> + <driver name="EcalPairsFilter" type="org.hps.recon.filtering.EcalPairsFilter"/> + <driver name="CollectionSizeFilter" type="org.hps.recon.filtering.CollectionSizeFilter"> + <collectionName>UnconstrainedV0Candidates</collectionName> + <minSize>1</minSize> + </driver> + + <driver name="LCIOWriter" type="org.lcsim.util.loop.LCIODriver"> + <outputFilePath>${outputFile}.slcio</outputFilePath> + </driver> </drivers> </lcsim> Added: java/trunk/users/src/main/java/org/hps/users/meeg/ReconParticleCleanupDriver.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/meeg/ReconParticleCleanupDriver.java (added) +++ java/trunk/users/src/main/java/org/hps/users/meeg/ReconParticleCleanupDriver.java Mon Jun 22 19:12:27 2015 @@ -0,0 +1,125 @@ +package org.hps.users.meeg; + +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; +import org.hps.recon.ecal.cluster.ClusterUtilities; +import org.hps.recon.tracking.TrackUtils; +import org.lcsim.event.EventHeader; +import org.lcsim.event.ReconstructedParticle; +import org.lcsim.event.RelationalTable; +import org.lcsim.util.Driver; + +/** + * Remove final state particles with bad track-cluster time matching, and + * vertices with shared tracks. + * + * @author Sho Uemura <[log in to unmask]> + * @version $Id: $ + */ +public class ReconParticleCleanupDriver extends Driver { + + private final String finalStateParticlesColName = "FinalStateParticles"; + private final String unconstrainedV0CandidatesColName = "UnconstrainedV0Candidates"; + private final String beamConV0CandidatesColName = "BeamspotConstrainedV0Candidates"; + private final String targetV0ConCandidatesColName = "TargetConstrainedV0Candidates"; + private double fsDeltaT = 43.5; + private double fsDeltaTCut = 5.0; + + /** + * Center value for (cluster - track) time cut. + * + * @param fsDeltaT + */ + public void setFsDeltaT(double fsDeltaT) { + this.fsDeltaT = fsDeltaT; + } + + /** + * Cut window half-width for (cluster - track) time cut. + * + * @param fsDeltaTCut + */ + public void setFsDeltaTCut(double fsDeltaTCut) { + this.fsDeltaTCut = fsDeltaTCut; + } + + @Override + public void process(EventHeader event) { + RelationalTable hitToStrips = TrackUtils.getHitToStripsTable(event); + RelationalTable hitToRotated = TrackUtils.getHitToRotatedTable(event); + + for (Iterator<ReconstructedParticle> iter = event.get(ReconstructedParticle.class, finalStateParticlesColName).listIterator(); iter.hasNext();) { + ReconstructedParticle fs = iter.next(); + if (fs.getClusters().isEmpty()) {//track without cluster, discard + iter.remove(); + continue; + } + + if (fs.getTracks().isEmpty()) {//cluster without track (photon), keep + continue; + } + + double deltaT = ClusterUtilities.getSeedHitTime(fs.getClusters().get(0)) - TrackUtils.getTrackTime(fs.getTracks().get(0), hitToStrips, hitToRotated); + if (Math.abs(deltaT - fsDeltaT) > fsDeltaTCut) {//bad track-cluster time match, discard + iter.remove(); + } + } + + Set<ReconstructedParticle> fsParticles = new HashSet<ReconstructedParticle>(event.get(ReconstructedParticle.class, finalStateParticlesColName)); + + v0Loop: + for (Iterator<ReconstructedParticle> iter = event.get(ReconstructedParticle.class, unconstrainedV0CandidatesColName).listIterator(); iter.hasNext();) { + ReconstructedParticle v0 = iter.next(); + if (hasSharedStrips(v0, hitToStrips, hitToRotated)) { + iter.remove(); + continue; + } + for (ReconstructedParticle particle : v0.getParticles()) { + if (!fsParticles.contains(particle)) { + iter.remove(); + continue v0Loop; + } + } + } + + v0Loop: + for (Iterator<ReconstructedParticle> iter = event.get(ReconstructedParticle.class, beamConV0CandidatesColName).listIterator(); iter.hasNext();) { + ReconstructedParticle v0 = iter.next(); + if (hasSharedStrips(v0, hitToStrips, hitToRotated)) { + iter.remove(); + continue; + } + for (ReconstructedParticle particle : v0.getParticles()) { + if (!fsParticles.contains(particle)) { + iter.remove(); + continue v0Loop; + } + } + } + + v0Loop: + for (Iterator<ReconstructedParticle> iter = event.get(ReconstructedParticle.class, targetV0ConCandidatesColName).listIterator(); iter.hasNext();) { + ReconstructedParticle v0 = iter.next(); + if (hasSharedStrips(v0, hitToStrips, hitToRotated)) { + iter.remove(); + continue; + } + for (ReconstructedParticle particle : v0.getParticles()) { + if (!fsParticles.contains(particle)) { + iter.remove(); + continue v0Loop; + } + } + } + } + + private static boolean hasSharedStrips(ReconstructedParticle vertex, RelationalTable hittostrip, RelationalTable hittorotated) { + return hasSharedStrips(vertex.getParticles().get(0), vertex.getParticles().get(1), hittostrip, hittorotated); + } + + private static boolean hasSharedStrips(ReconstructedParticle fs1, ReconstructedParticle fs2, RelationalTable hittostrip, RelationalTable hittorotated) { + return TrackUtils.hasSharedStrips(fs1.getTracks().get(0), fs2.getTracks().get(0), hittostrip, hittorotated); + } + +}