Print

Print


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);
+    }
+
+}