diff --git a/recon/src/main/java/org/hps/recon/skims/FEESkimmer.java b/recon/src/main/java/org/hps/recon/skims/FEESkimmer.java index 33b34002d..bcd316c10 100644 --- a/recon/src/main/java/org/hps/recon/skims/FEESkimmer.java +++ b/recon/src/main/java/org/hps/recon/skims/FEESkimmer.java @@ -1,39 +1,146 @@ package org.hps.recon.skims; -import java.util.Set; +import java.util.Set; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; -import org.lcsim.event.EventHeader; +import org.hps.record.triggerbank.AbstractIntData; +import org.hps.record.triggerbank.TSData2019; +import org.lcsim.event.EventHeader; +import org.lcsim.event.GenericObject; +/** + * Skimmer for full-energy-electron (FEE) events. + * + * The selection is applied in steps; the first (and, for now, only) step is the + * trigger skim, which requires that the event was taken with an FEE trigger. + * The trigger bits are read from the 2019+ TS bank, so this is applicable to the + * 2019 and 2021 running periods. + */ public class FEESkimmer extends Skimmer { - private String _FEECandidateCollectionName = "UnconstrainedFEECandidates"; - private double _clusterTimingCut = 20.0; // only used if _tight is true - private double _v0Chi2Cut = 100.0; - private double _trackChi2Cut = 80.0; - private double _trackDtCut = 20.0; - private double _trackPMax = 0.9; - private double _v0PMax = 1.4; - private int _nHitsMin=10; - + //default parameters...ok for 2021 run + private String _tsBankCollectionName = "TSBank"; + private boolean _requireFEETrigger = true; + private boolean _useFEETopTrigger = true; + private boolean _useFEEBotTrigger = true; + private boolean _debug = false; + private int totalFEETopTriggers = 0; + private int totalFEEBotTriggers = 0; + @Override public boolean passSelection(EventHeader event){ - // System.out.println(this.getClass().getName()+":: in pass selection"); - boolean pass=true; - - - return pass; + if(_debug) + System.out.println(this.getClass().getName()+":: in pass selection"); + incrementEventProcessed(); + + //step 1: trigger skim + if(!passTriggerSelection(event)) + return false; + + incrementEventPassed(); + return true; + } + + /** + * Require an FEE trigger bit in the TS bank. If neither the top nor the + * bottom FEE trigger is requested, or if the trigger requirement is turned + * off altogether, every event passes this step. + */ + private boolean passTriggerSelection(EventHeader event){ + if(!_requireFEETrigger) + return true; + + if (!event.hasCollection(GenericObject.class, _tsBankCollectionName)) { + if(_debug)System.out.println(this.getClass().getName()+":: no "+_tsBankCollectionName+" collection in event"); + return false; + } + + boolean pass=false; + for (GenericObject tsBank : event.get(GenericObject.class, _tsBankCollectionName)) { + if (AbstractIntData.getTag(tsBank) != TSData2019.BANK_TAG) + continue; + TSData2019 triggerData = new TSData2019(tsBank); + if (_useFEETopTrigger && triggerData.isFEETopTrigger()) { + totalFEETopTriggers++; + pass=true; + } + if (_useFEEBotTrigger && triggerData.isFEEBotTrigger()) { + totalFEEBotTriggers++; + pass=true; + } + } + + if(_debug && !pass) + System.out.println(this.getClass().getName()+":: failed FEE trigger"); + + return pass; + } + + public FEESkimmer(String file) { + super(file, null); } + public FEESkimmer(String file, Set ignore) { + super(file, ignore); + } + @Override public void setParameters(String parsFileName){ + String infilePreResDir = "/org/hps/recon/skims/"; + String infile=infilePreResDir+parsFileName; + InputStream inParamStream = this.getClass().getResourceAsStream(infile); + System.out.println(this.getClass().getName()+":: reading in FEE skimming cuts from "+infile); + BufferedReader reader = new BufferedReader(new InputStreamReader(inParamStream)); + String line; + String delims = "[ ]+";// this will split strings between one or more spaces + try { + while ((line = reader.readLine()) != null) { + String[] tokens = line.split(delims); + String parName=tokens[0].replaceAll("\\s+",""); + System.out.println(this.getClass().getName()+":: parameter name = " + parName + "; value = " + tokens[1]); + putParam(parName,tokens[1]); + + } + } catch (IOException ex) { + System.out.println(this.getClass().getName()+":: died while reading parameters"); + return; + } return; } - - public FEESkimmer(String file) { - super(file, null); - // this(super.addFileExtension(file), null); + private void putParam(String parName, String var){ + if(parName.equals("tsBankCollectionName")) + _tsBankCollectionName=var; + else if(parName.equals("requireFEETrigger")) + _requireFEETrigger=Boolean.parseBoolean(var); + else if(parName.equals("useFEETopTrigger")) + _useFEETopTrigger=Boolean.parseBoolean(var); + else if(parName.equals("useFEEBotTrigger")) + _useFEEBotTrigger=Boolean.parseBoolean(var); + else + System.out.println(this.getClass().getName()+":: couldn't find "+parName+"!"); } - public FEESkimmer(String file, Set ignore) { - super(file, ignore); + + public int getTotalFEETopTriggers(){ + return totalFEETopTriggers; + } + + public int getTotalFEEBotTriggers(){ + return totalFEEBotTriggers; + } + + public void setRequireFEETrigger(boolean require){ + this._requireFEETrigger=require; + } + public void setUseFEETopTrigger(boolean use){ + this._useFEETopTrigger=use; + } + public void setUseFEEBotTrigger(boolean use){ + this._useFEEBotTrigger=use; + } + public void setTsBankCollectionName(String name){ + this._tsBankCollectionName=name; } } diff --git a/recon/src/main/java/org/hps/recon/skims/MultiSkimDriver.java b/recon/src/main/java/org/hps/recon/skims/MultiSkimDriver.java index 1ef486d33..193747bfb 100644 --- a/recon/src/main/java/org/hps/recon/skims/MultiSkimDriver.java +++ b/recon/src/main/java/org/hps/recon/skims/MultiSkimDriver.java @@ -31,17 +31,17 @@ public class MultiSkimDriver extends Driver { private String v0OutputFile="v0Skim"; private String threeBodyOutputFile="threeBodySkim"; - private String FEEOutputFile="FEESkim"; + private String feeOutputFile="FEESkim"; private String mollerOutputFile="mollerSkim"; private String v0ParamFile="default"; private String threeBodyParamFile="default"; - private String FEEParamFile="default"; + private String feeParamFile="default"; private String mollerParamFile="default"; private Skimmer v0Skimmer; private Skimmer threeBodySkimmer; - private Skimmer FEESkimmer; + private Skimmer feeSkimmer; private Skimmer mollerSkimmer; protected Double beamEnergy; @@ -62,6 +62,14 @@ public void endOfData() { System.out.println("Total number of V0s passing skim = "+((V0Skimmer)v0Skimmer).getTotalV0sPassing()); } + if(skimFEE){ + System.out.println("FEE skim events processed = " + feeSkimmer.getNProcessed()); + System.out.println("Events passed = " + feeSkimmer.getNPassed()); + System.out.println(" Pass efficiency = " + feeSkimmer.getPassFraction()); + System.out.println("Total number of FEE top triggers = "+((FEESkimmer)feeSkimmer).getTotalFEETopTriggers()); + System.out.println("Total number of FEE bottom triggers = "+((FEESkimmer)feeSkimmer).getTotalFEEBotTriggers()); + } + if(skimMoller){ System.out.println("Moller skim events processed = " + mollerSkimmer.getNProcessed()); System.out.println("Events passed = " + mollerSkimmer.getNPassed()); @@ -85,8 +93,8 @@ protected void process(EventHeader event) { writeSkimList.add(threeBodySkimmer); if(skimFEE && - FEESkimmer.passSelection(event)) - writeSkimList.add(FEESkimmer); + feeSkimmer.passSelection(event)) + writeSkimList.add(feeSkimmer); if(skimMoller && mollerSkimmer.passSelection(event)) writeSkimList.add(mollerSkimmer); @@ -130,8 +138,8 @@ public void setThreeBodyOutputFile(String outputFile){ this.threeBodyOutputFile=outputFile; } - public void setFEEOutputFile(String outputFile){ - this.FEEOutputFile=outputFile; + public void setFeeOutputFile(String outputFile){ + this.feeOutputFile=outputFile; } public void setMollerOutputFile(String outputFile){ this.mollerOutputFile=outputFile; @@ -154,7 +162,7 @@ protected void detectorChanged(Detector detector) { if(skimThreeBody) threeBodySkimmer=setupSkimmer("ThreeBody",threeBodyOutputFile, threeBodyParamFile); if(skimFEE) - FEESkimmer=setupSkimmer("FEE",FEEOutputFile, FEEParamFile); + feeSkimmer=setupSkimmer("FEE",feeOutputFile, feeParamFile); if(skimMoller) mollerSkimmer=setupSkimmer("Moller",mollerOutputFile, mollerParamFile); } @@ -188,8 +196,8 @@ public void setThreeBodyParamFile(String pFile){ this.threeBodyParamFile=pFile; } - public void setFEEParamFile(String pFile){ - this.FEEParamFile=pFile; + public void setFeeParamFile(String pFile){ + this.feeParamFile=pFile; } public void setMollerParamFile(String pFile){ diff --git a/recon/src/main/resources/org/hps/recon/skims/feeskim_parameters_ver0.txt b/recon/src/main/resources/org/hps/recon/skims/feeskim_parameters_ver0.txt new file mode 100644 index 000000000..593b1a395 --- /dev/null +++ b/recon/src/main/resources/org/hps/recon/skims/feeskim_parameters_ver0.txt @@ -0,0 +1,3 @@ +requireFEETrigger true +useFEETopTrigger true +useFEEBotTrigger true diff --git a/steering-files/src/main/resources/org/hps/steering/recon/PhysicsRun2021_pass6dev_recon_skimmed_dataqual_physics.lcsim b/steering-files/src/main/resources/org/hps/steering/recon/PhysicsRun2021_pass6dev_recon_skimmed_dataqual_physics.lcsim new file mode 100644 index 000000000..d2f1af94a --- /dev/null +++ b/steering-files/src/main/resources/org/hps/steering/recon/PhysicsRun2021_pass6dev_recon_skimmed_dataqual_physics.lcsim @@ -0,0 +1,302 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1000 + + + svt_readout_overlap_good + + + + + + + + CONFIG + + + + + + + + + WARNING + EcalClusters + + + EcalClusters + EcalClustersCorr + + + + SVTRawTrackerHits + + + .5 + 1 + Pileup + Migrad + false + true + false + false + true + true + false + true + false + + + 24.0 + 3.0 + false + 400 + 4.0 + 1.0 + 3.0 + 3.0 + true + true + false + + + true + true + 2 + 1 + + + 12.0 + + 55.0 + 20.0 + 11.546843987796496 + + + + + 9 + 9 + + 6 + 6 + + 3 + 3 + 40.0 + 5.0 + 12.320066328390354 + 9.206482863412027 + + + 8.0 + + 5.508828061070076 + 5 + false + + + 400 + + 0.3473319986601534 + true + 0.055 + 0.045 + true + -1.1 + + + + + 000BBS0 + 00BBS00 + 00ASBS0 + 00ABSS0 + 0A0SBS0 + 00B0BS0 + 00SBSA0 + 00SBB00 + 00SBAS0 + 0SA0BS0 + 0000SBB + 000SABS + 0BBS000 + 0SBB000 + 0000BBS + 000SSBA + 000BSSA + ABSS000 + SBB0000 + SABS000 + + BBS0000 + BSB0000 + 0BSB000 + + + 17 + + false + + + EcalClustersCorr + KalmanFullTracks + KalmanFullTracks + TrackClusterMatcherMinDistance + UnconstrainedV0Candidates_KF + UnconstrainedV0Vertices_KF + BeamspotConstrainedV0Candidates_KF + BeamspotConstrainedV0Vertices_KF + TargetConstrainedV0Candidates_KF + TargetConstrainedV0Vertices_KF + FinalStateParticles_KF + true + false + true + false + 0.055 + 0.045 + -1.1 + 7.0 + 7.0 + 0.0 + 40.0 + 40 + 40 + false + true + true + false + true + UnconstrainedMollerCandidates_KF + UnconstrainedMollerVertices_KF + BeamspotConstrainedMollerCandidates_KF + BeamspotConstrainedMollerVertices_KF + TargetConstrainedMollerCandidates_KF + TargetConstrainedMollerVertices_KF + + + true + false + true + false + v0skim_parameters_ver1.txt + ${outputFile}_v0skim.slcio + feeskim_parameters_ver0.txt + ${outputFile}_feeskim.slcio + FPGAData HelicalTrackHitRelations HelicalTrackHits HelicalTrackMCRelations KFGBLStripClusterData KFGBLStripClusterDataRelations ReadoutTimestamps RotatedHelicalTrackHitRelations RotatedHelicalTrackHits RotatedHelicalTrackMCRelations SVTFittedRawTrackerHits SVTShapeFitParameters SVTTrueHitRelations StripClusterer_SiTrackerHitStrip1D SVTRawTrackerHits FADCGenericHits HodoReadoutHits HodoCalHits EcalReadoutHits EcalUncalHits HodoGenericClusters VTPBank EcalClusters + + + all + EcalClustersCorr + false + + + all + + + all + KalmanFullTracks + + + FinalStateParticles_KF + all + true + + + FinalStateParticles_KF + UnconstrainedV0Candidates_KF + BeamspotConstrainedV0Candidates_KF + TargetConstrainedV0Candidates_KF + all + true + + + FinalStateParticles_KF + UnconstrainedV0Candidates_KF + BeamspotConstrainedV0Candidates_KF + TargetConstrainedV0Candidates_KF + all + true + + + ${outputFile}_data_quality_plots.root + + + + + ${outputFile}.slcio + + +