From de2db554c814e7102002e1c668c9906d7f11e7f8 Mon Sep 17 00:00:00 2001 From: Steven Doran <78985334+S81D@users.noreply.github.com> Date: Mon, 25 Nov 2024 10:08:38 -0600 Subject: [PATCH 01/10] PrintDQ toolchain (#315) * PrintDQ toolchain Toolchain to print run quality statistics * Delete configfiles/PrintDQ/CreateProcessedList.sh redundant script - there is another one that does the same thing * Update README.md update README --- configfiles/PrintDQ/ClusterClassifiersConfig | 1 + configfiles/PrintDQ/ClusterFinderConfig | 12 ++ configfiles/PrintDQ/EventSelectorConfig | 29 +++ configfiles/PrintDQ/FindMrdTracksConfig | 12 ++ configfiles/PrintDQ/FitRWMWaveformConfig | 4 + configfiles/PrintDQ/LoadANNIEEventConfig | 4 + configfiles/PrintDQ/PrintDQConfig | 1 + configfiles/PrintDQ/README.md | 22 ++ configfiles/PrintDQ/TimeClusteringConfig | 13 ++ configfiles/PrintDQ/ToolChainConfig | 24 +++ configfiles/PrintDQ/ToolsConfig | 10 + configfiles/PrintDQ/create_my_inputs.sh | 19 ++ configfiles/PrintDQ/my_inputs.txt | 205 +++++++++++++++++++ 13 files changed, 356 insertions(+) create mode 100644 configfiles/PrintDQ/ClusterClassifiersConfig create mode 100644 configfiles/PrintDQ/ClusterFinderConfig create mode 100644 configfiles/PrintDQ/EventSelectorConfig create mode 100644 configfiles/PrintDQ/FindMrdTracksConfig create mode 100644 configfiles/PrintDQ/FitRWMWaveformConfig create mode 100644 configfiles/PrintDQ/LoadANNIEEventConfig create mode 100644 configfiles/PrintDQ/PrintDQConfig create mode 100644 configfiles/PrintDQ/README.md create mode 100644 configfiles/PrintDQ/TimeClusteringConfig create mode 100644 configfiles/PrintDQ/ToolChainConfig create mode 100644 configfiles/PrintDQ/ToolsConfig create mode 100644 configfiles/PrintDQ/create_my_inputs.sh create mode 100644 configfiles/PrintDQ/my_inputs.txt diff --git a/configfiles/PrintDQ/ClusterClassifiersConfig b/configfiles/PrintDQ/ClusterClassifiersConfig new file mode 100644 index 000000000..752200268 --- /dev/null +++ b/configfiles/PrintDQ/ClusterClassifiersConfig @@ -0,0 +1 @@ +verbosity 0 diff --git a/configfiles/PrintDQ/ClusterFinderConfig b/configfiles/PrintDQ/ClusterFinderConfig new file mode 100644 index 000000000..53330c25d --- /dev/null +++ b/configfiles/PrintDQ/ClusterFinderConfig @@ -0,0 +1,12 @@ +# ClusterFinder Config File + +verbosity 0 +HitStore Hits #Either MCHits or Hits (accessed in ANNIEEvent store) +OutputFile BeamRun_ClusterFinder_DefaultOutput #Output root prefix name for the current run +ClusterFindingWindow 40 # in ns, size of the window used to "clusterize" +AcqTimeWindow 70000 # in ns, size of the acquisition window +ClusterIntegrationWindow 40 # in ns, all hits with +/- 1/2 of this window are considered in the cluster +MinHitsPerCluster 5 # group of hits are considered clusters above this amount of hits +end_of_window_time_cut 0.95 # from o to 1, length of the window you want to loop over with respect to acq. window (1 for full window, 0.95 for 95% from the start) +Plots2D 0 #Draw 2D charge-vs-time plots? +ChankeyToPMTIDMap ./configfiles/EventDisplay/Data-RecoEvent/Chankey_WCSimID.dat diff --git a/configfiles/PrintDQ/EventSelectorConfig b/configfiles/PrintDQ/EventSelectorConfig new file mode 100644 index 000000000..a711f08bf --- /dev/null +++ b/configfiles/PrintDQ/EventSelectorConfig @@ -0,0 +1,29 @@ +# EventSelector config file + +verbosity 0 +MCPMTVolCut 0 +MCFVCut 0 +MCMRDCut 0 +MCPiKCut 0 +MCIsMuonCut 0 +MCIsElectronCut 0 +MCIsSingleRingCut 0 +MCIsMultiRingCut 0 +MCProjectedMRDHit 0 +MCEnergyCut 0 +Emin 0 #Minimum energy in MeV +Emax 1000 #Maximum energy in MeV +MRDRecoCut 0 +RecoPMTVolCut 0 +RecoFVCut 0 +NHitCut 0 +NHitmin 4 #Minimum number of hit digits +PMTMRDCoincCut 0 +PMTMRDOffset 755 +PromptTrigOnly 0 +TriggerWord -1 +SaveStatusToStore 1 +NoVeto 0 +Veto 0 +ThroughGoing 0 +IsMC 0 #MC or Data? diff --git a/configfiles/PrintDQ/FindMrdTracksConfig b/configfiles/PrintDQ/FindMrdTracksConfig new file mode 100644 index 000000000..5ba5e8f77 --- /dev/null +++ b/configfiles/PrintDQ/FindMrdTracksConfig @@ -0,0 +1,12 @@ +# FindMrdTracks Config File +# all variables retrieved with m_variables.Get() must be defined here! + +verbosity 0 +IsData 1 +OutputDirectory . +OutputFile STEC_MRDTracks_cluster40ns +DrawTruthTracks 0 # whether to add MC Truth track info for drawing in MrdPaddlePlot Tool + ## note you need to run that tool to actually view the tracks! +WriteTracksToFile 0 # should the track information be written to a ROOT-file? +SelectTriggerType 0 #should the loaded data be filtered by trigger type? +TriggerType Beam #options: Cosmic, Beam, No Loopback diff --git a/configfiles/PrintDQ/FitRWMWaveformConfig b/configfiles/PrintDQ/FitRWMWaveformConfig new file mode 100644 index 000000000..4d3e235aa --- /dev/null +++ b/configfiles/PrintDQ/FitRWMWaveformConfig @@ -0,0 +1,4 @@ +verbosityFitRWMWaveform 0 +printToRootFile 0 + + diff --git a/configfiles/PrintDQ/LoadANNIEEventConfig b/configfiles/PrintDQ/LoadANNIEEventConfig new file mode 100644 index 000000000..d1e73c16e --- /dev/null +++ b/configfiles/PrintDQ/LoadANNIEEventConfig @@ -0,0 +1,4 @@ +verbose 1 +FileForListOfInputs ./configfiles/PrintDQ/my_inputs.txt +EventOffset 0 +GlobalEvNr 1 diff --git a/configfiles/PrintDQ/PrintDQConfig b/configfiles/PrintDQ/PrintDQConfig new file mode 100644 index 000000000..752200268 --- /dev/null +++ b/configfiles/PrintDQ/PrintDQConfig @@ -0,0 +1 @@ +verbosity 0 diff --git a/configfiles/PrintDQ/README.md b/configfiles/PrintDQ/README.md new file mode 100644 index 000000000..16f1b09c1 --- /dev/null +++ b/configfiles/PrintDQ/README.md @@ -0,0 +1,22 @@ +# PrintDQ + +*********************** +# Description +*********************** + +The `PrintDQ` toolchain runs the clustering tools (MRD + PMT) over the ProcessedData files created by the event building toolchain to output run quality statistics. For more information, check out the README for the tool: https://github.com/ANNIEsoft/ToolAnalysis/tree/Application/UserTools/PrintDQ. This tool can be used for assessing the quality of Processed runs to help identify issues with the detector. + +************************ +# Usage +************************ + +- Populate the `my_inputs.txt` file with all part files from a Processed runs. Running the script `sh create_my_inputs.sh ` will automatically populate the input file with all Processed Data part files for that run. +- Run the toolchain via: `./Analyse ./configfiles/PrintDQ/ToolChain` +- Run statistics will be outputted via `std::out` once the toolchain completes. + + +************************ +# Additional information +************************ + +- The current version of the `PrintDQ` tool is intended to be run over 1 run at a time. As the clustering tools may take some time to compile, the processing time of this toolchain may take several minutes (for a ~100 part file run) to ~1 hour (~thousands of part files) depending on how many part files exist. diff --git a/configfiles/PrintDQ/TimeClusteringConfig b/configfiles/PrintDQ/TimeClusteringConfig new file mode 100644 index 000000000..e778247fc --- /dev/null +++ b/configfiles/PrintDQ/TimeClusteringConfig @@ -0,0 +1,13 @@ +#TimeClustering config file + +verbosity 0 +MinDigitsForTrack 3 +MaxMrdSubEventDuration 30 +MinSubeventTimeSep 30 +MakeMrdDigitTimePlot 0 +LaunchTApplication 0 +IsData 1 +#OutputROOTFile TimeClustering_MRDTest28_cluster40ns +OutputROOTFile STEC_TimeClusteringOut +MapChankey_WCSimID ./configfiles/SimpleTankEnergyCalibrator/MRD_Chankey_WCSimID.dat + diff --git a/configfiles/PrintDQ/ToolChainConfig b/configfiles/PrintDQ/ToolChainConfig new file mode 100644 index 000000000..2e56577ac --- /dev/null +++ b/configfiles/PrintDQ/ToolChainConfig @@ -0,0 +1,24 @@ +#ToolChain dynamic setup file + +##### Runtime Parameters ##### +verbose 1 ## Verbosity level of ToolChain +error_level 0 # 0= do not exit, 1= exit on unhandled errors only, 2= exit on unhandled errors and handled errors +attempt_recover 1 ## 1= will attempt to finalise if an execute fails + +###### Logging ##### +log_mode Interactive # Interactive=cout , Remote= remote logging system "serservice_name Remote_Logging" , Local = local file log; +log_local_path ./log +log_service LogStore + + +###### Service discovery ##### Ignore these settings for local analysis +service_publish_sec -1 +service_kick_sec -1 + +##### Tools To Add ##### +Tools_File configfiles/PrintDQ/ToolsConfig ## list of tools to run and their config files + +##### Run Type ##### +Inline -1 ## number of Execute steps in program, -1 infinite loop that is ended by user +Interactive 0 ## set to 1 if you want to run the code interactively + diff --git a/configfiles/PrintDQ/ToolsConfig b/configfiles/PrintDQ/ToolsConfig new file mode 100644 index 000000000..87046c72d --- /dev/null +++ b/configfiles/PrintDQ/ToolsConfig @@ -0,0 +1,10 @@ +myLoadANNIEEvent LoadANNIEEvent ./configfiles/PrintDQ/LoadANNIEEventConfig +myLoadGeometry LoadGeometry ./configfiles/LoadGeometry/LoadGeometryConfig +myTimeClustering TimeClustering configfiles/PrintDQ/TimeClusteringConfig +myFindMrdTracks FindMrdTracks configfiles/PrintDQ/FindMrdTracksConfig +myClusterFinder ClusterFinder ./configfiles/PrintDQ/ClusterFinderConfig +myClusterClassifiers ClusterClassifiers ./configfiles/PrintDQ/ClusterClassifiersConfig +myEventSelector EventSelector ./configfiles/PrintDQ/EventSelectorConfig +myFitRWMWaveform FitRWMWaveform ./configfiles/PrintDQ/FitRWMWaveformConfig + +myPrintDQ PrintDQ ./configfiles/PrintDQ/PrintDQConfig diff --git a/configfiles/PrintDQ/create_my_inputs.sh b/configfiles/PrintDQ/create_my_inputs.sh new file mode 100644 index 000000000..214f789fe --- /dev/null +++ b/configfiles/PrintDQ/create_my_inputs.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +if [[ -z "$1" ]]; then + echo "" + echo "##############################" + echo "Error: No run number provided." + echo "Usage: $0 " + echo "" + exit 1 +fi + +run=$1 + +output_file="my_inputs.txt" +processed_dir="/pnfs/annie/persistent/processed/processed_EBV2/R${run}/" + +find "$processed_dir" -type f -name "Processed*" | sort -t'/' -k2V > "$output_file" + +echo "done" diff --git a/configfiles/PrintDQ/my_inputs.txt b/configfiles/PrintDQ/my_inputs.txt new file mode 100644 index 000000000..d1fe477d4 --- /dev/null +++ b/configfiles/PrintDQ/my_inputs.txt @@ -0,0 +1,205 @@ +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p0 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p1 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p2 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p3 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p4 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p5 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p6 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p7 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p8 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p9 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p10 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p11 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p12 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p13 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p14 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p15 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p16 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p17 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p18 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p19 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p20 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p21 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p22 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p23 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p24 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p25 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p26 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p27 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p28 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p29 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p30 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p31 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p32 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p33 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p34 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p35 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p36 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p37 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p38 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p39 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p40 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p41 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p42 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p43 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p44 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p45 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p46 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p47 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p48 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p49 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p50 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p51 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p52 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p53 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p54 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p55 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p56 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p57 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p58 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p59 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p60 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p61 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p62 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p63 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p64 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p65 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p66 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p67 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p68 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p69 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p70 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p71 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p72 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p73 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p74 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p75 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p76 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p77 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p78 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p79 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p80 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p81 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p82 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p83 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p84 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p85 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p86 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p87 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p88 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p89 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p90 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p91 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p92 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p93 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p94 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p95 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p96 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p97 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p98 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p99 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p100 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p101 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p102 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p103 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p104 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p105 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p106 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p107 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p108 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p109 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p110 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p111 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p112 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p113 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p114 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p115 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p116 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p117 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p118 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p119 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p120 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p121 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p122 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p123 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p124 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p125 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p126 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p127 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p128 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p129 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p130 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p131 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p132 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p133 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p134 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p135 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p136 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p137 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p138 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p139 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p140 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p141 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p142 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p143 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p144 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p145 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p146 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p147 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p148 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p149 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p150 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p151 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p152 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p153 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p154 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p155 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p156 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p157 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p158 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p159 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p160 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p161 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p162 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p163 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p164 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p165 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p166 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p167 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p168 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p169 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p170 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p171 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p172 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p173 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p174 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p175 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p176 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p177 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p178 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p179 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p180 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p181 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p182 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p183 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p184 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p185 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p186 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p187 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p188 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p189 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p190 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p191 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p192 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p193 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p194 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p195 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p196 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p197 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p198 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p199 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p200 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p201 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p202 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p203 +/pnfs/annie/persistent/processed/processed_EBV2/R4939/ProcessedData_PMTMRDLAPPD_R4939S0p204 From f1cfadab6b805ab77ac2757cd5908ef151452797 Mon Sep 17 00:00:00 2001 From: jminock Date: Mon, 25 Nov 2024 11:38:47 -0500 Subject: [PATCH 02/10] Minimal Toolchain for MuonFitter (#316) * minimal Toolchain for MuonFitter * Update FindMrdTracksConfig don't write FindMrdTracks results to debug ROOT file --------- Co-authored-by: James Minock Co-authored-by: marc1uk --- .../MuonFitter/ClusterClassifiersConfig | 3 ++ configfiles/MuonFitter/ClusterFinderConfig | 11 +++++++ configfiles/MuonFitter/DigitBuilderConfig | 8 +++++ configfiles/MuonFitter/EventSelectorConfig | 25 ++++++++++++++ configfiles/MuonFitter/FindMrdTracksConfig | 12 +++++++ configfiles/MuonFitter/LoadWCSimConfig | 22 +++++++++++++ configfiles/MuonFitter/LoadWCSimLAPPDConfig | 14 ++++++++ .../MuonFitter/MCParticlePropertiesConfig | 3 ++ .../MuonFitter/MCRecoEventLoaderConfig | 10 ++++++ configfiles/MuonFitter/MuonFitterConfig | 33 +++++++++++++++++++ configfiles/MuonFitter/README.md | 3 ++ configfiles/MuonFitter/TimeClusteringConfig | 12 +++++++ configfiles/MuonFitter/ToolChainConfig | 26 +++++++++++++++ configfiles/MuonFitter/ToolsConfig | 12 +++++++ 14 files changed, 194 insertions(+) create mode 100644 configfiles/MuonFitter/ClusterClassifiersConfig create mode 100644 configfiles/MuonFitter/ClusterFinderConfig create mode 100644 configfiles/MuonFitter/DigitBuilderConfig create mode 100644 configfiles/MuonFitter/EventSelectorConfig create mode 100644 configfiles/MuonFitter/FindMrdTracksConfig create mode 100644 configfiles/MuonFitter/LoadWCSimConfig create mode 100644 configfiles/MuonFitter/LoadWCSimLAPPDConfig create mode 100644 configfiles/MuonFitter/MCParticlePropertiesConfig create mode 100644 configfiles/MuonFitter/MCRecoEventLoaderConfig create mode 100644 configfiles/MuonFitter/MuonFitterConfig create mode 100644 configfiles/MuonFitter/TimeClusteringConfig create mode 100644 configfiles/MuonFitter/ToolChainConfig create mode 100644 configfiles/MuonFitter/ToolsConfig diff --git a/configfiles/MuonFitter/ClusterClassifiersConfig b/configfiles/MuonFitter/ClusterClassifiersConfig new file mode 100644 index 000000000..948ed3354 --- /dev/null +++ b/configfiles/MuonFitter/ClusterClassifiersConfig @@ -0,0 +1,3 @@ +#ClusterClassifiers Config file +verbosity 0 +IsData 0 diff --git a/configfiles/MuonFitter/ClusterFinderConfig b/configfiles/MuonFitter/ClusterFinderConfig new file mode 100644 index 000000000..4e3606764 --- /dev/null +++ b/configfiles/MuonFitter/ClusterFinderConfig @@ -0,0 +1,11 @@ +# ClusterFinder Config File + +HitStore MCHits #Either MCHits or Hits (accessed in ANNIEEvent store) +OutputFile mc_clusters.root +ClusterFindingWindow 50 # in ns, size of the window used to "clusterize" +AcqTimeWindow 70000 # in ns, size of the acquisition window +ClusterIntegrationWindow 50 # in ns, all hits with +/- 1/2 of this window are considered in the cluster +MinHitsPerCluster 5 # group of hits are considered clusters above this amount of hits +end_of_window_time_cut 0.95 # from o to 1, length of the window you want to loop over with respect to acq. window (1 for full window, 0.95 for 95% from the start) +Plots2D 0 #Draw 2D charge-vs-time plots? +verbosity 0 diff --git a/configfiles/MuonFitter/DigitBuilderConfig b/configfiles/MuonFitter/DigitBuilderConfig new file mode 100644 index 000000000..989becdc6 --- /dev/null +++ b/configfiles/MuonFitter/DigitBuilderConfig @@ -0,0 +1,8 @@ +# DigitBuilder config file + +verbosity 0 +isMC 1 +ParametricModel 1 +PhotoDetectorConfiguration All +LAPPDIDFile ./configfiles/VertexReco/PhaseIIRecoTruth/LAPPDIDs.txt +DigitChargeThr 10 diff --git a/configfiles/MuonFitter/EventSelectorConfig b/configfiles/MuonFitter/EventSelectorConfig new file mode 100644 index 000000000..68c2686af --- /dev/null +++ b/configfiles/MuonFitter/EventSelectorConfig @@ -0,0 +1,25 @@ +# EventSelector config file + +verbosity 0 +MRDRecoCut 0 +MCFVCut 0 +MCPMTVolCut 0 +MCMRDCut 0 +MCPiKCut 0 +MCIsMuonCut 1 +MCIsElectronCut 0 +MCIsSingleRingCut 0 +MCIsMultiRingCut 0 +MCProjectedMRDHit 0 +MCEnergyCut 0 +Emin 0 +Emax 5000 +NHitCut 0 +NHitmin 4 +PromptTrigOnly 0 +RecoFVCut 0 +RecoPMTVolCut 0 +PMTMRDCoincCut 0 +PMTMRDOffset 10 +SaveStatusToStore 1 +IsMC 1 diff --git a/configfiles/MuonFitter/FindMrdTracksConfig b/configfiles/MuonFitter/FindMrdTracksConfig new file mode 100644 index 000000000..d78ed9b58 --- /dev/null +++ b/configfiles/MuonFitter/FindMrdTracksConfig @@ -0,0 +1,12 @@ +# FindMrdTracks Config File +# all variables retrieved with m_variables.Get() must be defined here! + +verbosity 0 +IsData 0 +OutputDirectory . +OutputFile mrdtrackfile # the output file built will be '/...root' +DrawTruthTracks 0 # whether to add MC Truth track info for drawing in MrdPaddlePlot Tool + ## note you need to run that tool to actually view the tracks! +WriteTracksToFile 0 # should the track information be written to a ROOT-file? +SelectTriggerType 0 # should the loaded data be filtered by trigger type? +TriggerType Beam # options: Cosmic, Beam, No Loopback diff --git a/configfiles/MuonFitter/LoadWCSimConfig b/configfiles/MuonFitter/LoadWCSimConfig new file mode 100644 index 000000000..9907c8931 --- /dev/null +++ b/configfiles/MuonFitter/LoadWCSimConfig @@ -0,0 +1,22 @@ +#LoadWCSim Config File +# all variables retrieved with m_variables.Get() must be defined here! +verbose 1 + +#InputFile /pnfs/annie/persistent/users/moflaher/wcsim/lappd/tankonly/wcsim_lappd_tankonly_24-09-17_BNB_Water_10k_22-05-17/wcsim_0.49......19.root +#InputFile /pnfs/annie/persistent/users/moflaher/wcsim/lappd/tankonly/wcsim_lappd_tankonly_03-05-17_rhatcher/wcsim_0.49......00.root ## first of the DOE proposal files +#InputFile /pnfs/annie/persistent/users/moflaher/wcsim/multipmt/tankonly/wcsim_3-12-18_ANNIEp2v6_BNB_Water_10k_22-05-17/wcsim_0.49......19.root +#InputFile /pnfs/annie/persistent/users/moflaher/wcsim/multipmt/tankonly/wcsim_25_04_19_ANNIEp2v6_nodigit_BNB_Water_10k_22-05-17/wcsim_0.49......19.root +#InputFile ./25_04_19_wcsim_0.49......19.root + +#InputFile /annie/app/users/jminock/ToolAnalysis/wcsim_0.root +#InputFile /pnfs/annie/persistent/users/mnieslon/wcsim/output/tankonly/wcsim_ANNIEp2v7_beamlike/wcsim_beamlike_muon_0.100.root +InputFile /pnfs/annie/persistent/simulations/wcsim/G1810a0211a/standard/tank/pmt/wcsim_0.0.0.root +#InputFile ./wcsim_0.*.root +#InputFile /pnfs/annie/persistent/users/mnieslon/wcsim/output/tankonly/wcsim_ANNIEp2v7_beam/pmt-files/wcsim_beam_gst_1060_91_0.7091.root + +WCSimVersion 3 ## should reflect the WCSim version of the files being loaded +HistoricTriggeroffset 0 ## time offset of digits relative to the trigger +UseDigitSmearedTime 1 ## whether to use smeared digit time (T), or true time of first photon (F) +LappdNumStrips 56 ## num channels to construct from each LAPPD +LappdStripLength 100 ## relative x position of each LAPPD strip, for dual-sided readout [mm] +LappdStripSeparation 10 ## stripline separation, for calculating relative y position of each LAPPD strip [mm] diff --git a/configfiles/MuonFitter/LoadWCSimLAPPDConfig b/configfiles/MuonFitter/LoadWCSimLAPPDConfig new file mode 100644 index 000000000..0f1c9af59 --- /dev/null +++ b/configfiles/MuonFitter/LoadWCSimLAPPDConfig @@ -0,0 +1,14 @@ +#LoadWCSimLAPPD Config File +# all variables retrieved with m_variables.Get() must be defined here! +verbose 0 + +#InputFile /pnfs/annie/persistent/users/moflaher/wcsim/lappd/tankonly/wcsim_lappd_tankonly_24-09-17_BNB_Water_10k_22-05-17/wcsim_lappd_0.49......19.root +#InputFile /pnfs/annie/persistent/users/moflaher/wcsim/lappd/tankonly/wcsim_lappd_tankonly_03-05-17_rhatcher/wcsim_lappd_0.49......00.root ## first of the DOE proposal files +#InputFile /pnfs/annie/persistent/users/mnieslon/wcsim/output/tankonly/wcsim_ANNIEp2v7_beamlike/wcsim_beamlike_muon_lappd_0.100.root +InputFile /pnfs/annie/persistent/simulations/wcsim/G1810a0211a/standard/tank/lappd/wcsim_lappd_0.0.0.root +#InputFile ./wcsim_lappd_0.*.root +#InputFile /annie/app/users/jminock/ToolAnalysis/wcsim_lappd_0.root + +WCSimVersion 3 ## should reflect the WCSim version of the files being loaded +InnerStructureRadius 1.3545 ## octagonal inner structure radius in m (from drawings 106.64") +DrawDebugGraphs 0 ## whether to draw TPolyMarker3D's of hits diff --git a/configfiles/MuonFitter/MCParticlePropertiesConfig b/configfiles/MuonFitter/MCParticlePropertiesConfig new file mode 100644 index 000000000..019526011 --- /dev/null +++ b/configfiles/MuonFitter/MCParticlePropertiesConfig @@ -0,0 +1,3 @@ +# MCParticleProperties configuration file + +verbosity 0 diff --git a/configfiles/MuonFitter/MCRecoEventLoaderConfig b/configfiles/MuonFitter/MCRecoEventLoaderConfig new file mode 100644 index 000000000..81f5502a1 --- /dev/null +++ b/configfiles/MuonFitter/MCRecoEventLoaderConfig @@ -0,0 +1,10 @@ +# MCRecoEventLoader config file + +verbosity 1 +GetPionKaonInfo 1 +GetNRings 1 +ParticleID 13 +DoParticleSelection 1 +xshift 0.0 +yshift 14.46469 +zshift -168.1 diff --git a/configfiles/MuonFitter/MuonFitterConfig b/configfiles/MuonFitter/MuonFitterConfig new file mode 100644 index 000000000..69465ed64 --- /dev/null +++ b/configfiles/MuonFitter/MuonFitterConfig @@ -0,0 +1,33 @@ +verbosity 0 + +OutputFile MC_MuonFitter_Reco_2998.root +IsData 0 # 1:is data, not MC; 0:not data, is MC +LuxArea 506.7 # 10-inch R7081 Hamamatsu +EtelArea 613.1 # 11-inch D784UKFLB ETEL +HamamatsuArea 324.3 # 8-inch R5912-100 Hamamatsu +WatchboyArea 506.7 # 10-inch R7081 Hamamatsu +WatchmanArea 506.7 # 10-inch R7081-100 Hamamatsu +PMTMRDOffset 0 # delay btwn tank and MRD PMTs +StepSizeAi 15 # some distance muon travels [cm] +InsideAngle 1. # degrees added to Cherenkov angle for hits to be considered inside cone +OutsideAngle 9. # degrees added to Cherenkov angle for hits to be considered outside cone +PMTChargeThreshold 2 # minimum amount of charge seen by PMT +EtaThreshold 500 # threshold to find best vertex +DisplayTruth 0 # display truth information in graphs (only in MC) +RecoMode 0 # run tool after fitting tank track +AiEtaFile ev_ai_eta_R0.0.txt +#TankTrackFitFile /exp/annie/app/users/jhe/MyToolAnalysis_MFer/fitbyeye_wcsim_2000-2999_RNN_240525v1.txt +#TankTrackFitFile fitbyeye_wcsim_2000-2999_RNN_240525v1.txt +TankTrackFitFile tanktrackfitfile_r0.0_RNN.txt + +UseNumLayers 1 # Updates reco track length in MRD using number of layers +UsePCA 0 # Updates reco track length in MRD using number of layers and PCA-reconstructed track angle (set UseNumLayers 1) +UseConnDots 0 # Updates reco track length in MRD by connecting the MRD hits +UseELoss 0 # Use official ANNIE MRD energyLoss as starting MRD energy +UseSimpleEReco 0 # Just add ANNIE MRD energyLoss (set UseELoss 1); no updating dEdx +RecoEnergyShift 0 # Shift reco muon energy + +Plot3D 0 # 0:no plot; 1:yes plot +Draw3DFMV 0 +Draw3DMRD 0 +SaveHistograms 0 # 0:no; 1:yes diff --git a/configfiles/MuonFitter/README.md b/configfiles/MuonFitter/README.md index 0421158c1..832b47e15 100644 --- a/configfiles/MuonFitter/README.md +++ b/configfiles/MuonFitter/README.md @@ -5,6 +5,7 @@ ********************** Date created: 2024-10-02 +Date last updated: 2024-11-22 The MuonFitter toolchain makes an attempt to fit muons using hit information. The Tool has 2 modes. The first mode is pre-reconstruction. It takes input information from the ANNIEEvent and generates a text file containing hit information for the RNN. It is advisable to include minimal tools in this ToolChain, as the same data must be re-analysed with ToolAnalysis later. @@ -13,6 +14,8 @@ This text file produced in this step is then processed by a standalone python sc The second mode is reconstruction. In this mode the Tool reads information from the ANNIEEvent, along with both text files from the previous two steps (the first mode and the python script) and reconstructs the vertex based on the fitted paths. The resulting muon fit information is passed into the DataModel. +The Toolchain included in this directory is the minimal working Toolchain for MuonFitter to function. All Tools in the ToolChain MUST be included in order for MuonFitter to function. It is recommended to include PhaseIITreeMaker after MuonFitter in RecoMode 1 to generate an ntuple with reconstructed variables from MuonFitter. + More detailed instructions are below. ************************ diff --git a/configfiles/MuonFitter/TimeClusteringConfig b/configfiles/MuonFitter/TimeClusteringConfig new file mode 100644 index 000000000..4a968f850 --- /dev/null +++ b/configfiles/MuonFitter/TimeClusteringConfig @@ -0,0 +1,12 @@ +#TimeClustering Config File + +verbosity 0 +IsData 0 +MinDigitsForTrack 4 +MaxMrdSubEventDuration 30 # [ns] if all hits are within this period, just make one subevent +MinSubeventTimeSep 30 # [ns] gaps of at leas this long delimit subevents +MakeMrdDigitTimePlot 0 # draw a 1D histogram of times to check subevent splitting is suitble +MakeSingleEventPlots 0 +LaunchTApplication 0 +MapChankey_WCSimID ./configfiles/CC_MC_RECO_ntuple/MRD_Chankey_WCSimID.dat +OutputROOTFile test.root diff --git a/configfiles/MuonFitter/ToolChainConfig b/configfiles/MuonFitter/ToolChainConfig new file mode 100644 index 000000000..332810a4f --- /dev/null +++ b/configfiles/MuonFitter/ToolChainConfig @@ -0,0 +1,26 @@ +#ToolChain dynamic setup file + +##### Runtime Parameters ##### +verbose 1 ## Verbosity level of ToolChain +error_level 0 # 0= do not exit, 1= exit on unhandled errors only, 2= exit on unhandled errors and handled errors +attempt_recover 1 ## 1= will attempt to finalise if an execute fails +remote_port 24002 +IO_Threads 1 ## Number of threads for network traffic (~ 1/Gbps) + +###### Logging ##### +log_mode Interactive # Interactive=cout , Remote= remote logging system "serservice_name Remote_Logging" , Local = local file log; +log_local_path ./log +log_service LogStore + + +###### Service discovery ##### Ignore these settings for local analysis +service_publish_sec -1 +service_kick_sec -1 + +##### Tools To Add ##### +Tools_File configfiles/MuonFitter/ToolsConfig ## list of tools to run and their config files + +##### Run Type ##### +Inline -1 ## number of Execute steps in program, -1 infinite loop that is ended by user +Interactive 0 ## set to 1 if you want to run the code interactively + diff --git a/configfiles/MuonFitter/ToolsConfig b/configfiles/MuonFitter/ToolsConfig new file mode 100644 index 000000000..59cd923b6 --- /dev/null +++ b/configfiles/MuonFitter/ToolsConfig @@ -0,0 +1,12 @@ +myLoadGeometry LoadGeometry configfiles/LoadGeometry/LoadGeometryConfig +myLoadWCSim LoadWCSim configfiles/MuonFitter/LoadWCSimConfig +myLoadWCSimLAPPD LoadWCSimLAPPD configfiles/MuonFitter/LoadWCSimLAPPDConfig +myMCParticleProperties MCParticleProperties configfiles/MuonFitter/MCParticlePropertiesConfig +myMCRecoEventLoader MCRecoEventLoader configfiles/MuonFitter/MCRecoEventLoaderConfig +myTimeClustering TimeClustering configfiles/MuonFitter/TimeClusteringConfig +myFindMrdTracks FindMrdTracks configfiles/MuonFitter/FindMrdTracksConfig +myClusterFinder ClusterFinder configfiles/MuonFitter/ClusterFinderConfig +myClusterClassifiers ClusterClassifiers configfiles/MuonFitter/ClusterClassifiersConfig +myDigitBuilder DigitBuilder configfiles/MuonFitter/DigitBuilderConfig +myEventSelector EventSelector configfiles/MuonFitter/EventSelectorConfig +myMuonFitter MuonFitter configfiles/MuonFitter/MuonFitterConfig From 13289a7959f6c6db1a1f301418127488555946b4 Mon Sep 17 00:00:00 2001 From: jminock Date: Tue, 26 Nov 2024 13:43:03 -0500 Subject: [PATCH 03/10] Updated NeutronMultiplicity Tool according to Julie (#291) Co-authored-by: James Minock --- .../NeutronMultiplicity.cpp | 72 +++++++++++++++++-- .../NeutronMultiplicity/NeutronMultiplicity.h | 9 +++ 2 files changed, 77 insertions(+), 4 deletions(-) diff --git a/UserTools/NeutronMultiplicity/NeutronMultiplicity.cpp b/UserTools/NeutronMultiplicity/NeutronMultiplicity.cpp index 1b51d95b7..bf4b31899 100644 --- a/UserTools/NeutronMultiplicity/NeutronMultiplicity.cpp +++ b/UserTools/NeutronMultiplicity/NeutronMultiplicity.cpp @@ -104,6 +104,7 @@ bool NeutronMultiplicity::Initialise(std::string configfile, DataModel &data){ bool NeutronMultiplicity::Execute(){ isMC = m_data->Stores.at("ANNIEEvent")->Get("MCFile",MCFile); + if (isMC) std::cout << "NeutronMultiplicity Tool: MCFile found!" << std::endl; //Reset tree variables this->ResetVariables(); @@ -334,6 +335,11 @@ bool NeutronMultiplicity::InitialiseHistograms(){ h_neutrons_energy_fv = new TH2F("h_neutrons_energy_fv","Neutron multiplicity vs muon energy (FV)",10,0,2000,20,0,20); h_neutrons_energy_zoom = new TH2F("h_neutrons_energy_zoom","Neutron multiplicity vs muon energy",8,400,1200,20,0,20); h_neutrons_energy_fv_zoom = new TH2F("h_neutrons_energy_fv_zoom","Neutron multiplicity vs muon energy (FV)",6,600,1200,20,0,20); + h_neutrons_energy_fv_down = new TH2F("h_neutrons_energy_fv_down","Neutron multiplicity vs muon energy (Downstream FV)",10,0,2000,20,0,20); + h_neutrons_energy_fv_cyl = new TH2F("h_neutrons_energy_fv_cyl","Neutron multiplicity vs muon energy (Cylindrical FV)",10,0,2000,20,0,20); + h_neutrons_q2 = new TH2F("h_neutrons_q2","Neutron multiplicity vs Q^{2}",100,0,2,20,0,20); + h_neutrons_q2_fv = new TH2F("h_neutrons_q2_fv","Neutron multiplicity vs Q^{2} (FV)",100,0,2,20,0,20); + h_neutrons_q2_fv_down = new TH2F("h_neutrons_q2_fv_down","Neutron multiplicity vs Q^{2} (Downstream FV)",100,0,2,20,0,20); h_neutrons_costheta = new TH2F("h_neutrons_costheta","Neutron multiplicity vs muon angle",6,0.7,1.0,20,0,20); h_neutrons_costheta_fv = new TH2F("h_neutrons_costheta_fv","Neutron multiplicity vs muon angle (FV)",6,0.7,1.0,20,0,20); h_neutrons_pT = new TH2F("h_neutrons_pT","Neutron multiplicity vs transverse muon momentum",10,0,1000,20,0,20); @@ -411,6 +417,26 @@ bool NeutronMultiplicity::InitialiseHistograms(){ h_neutrons_energy_fv_zoom->GetXaxis()->SetTitle("E_{#mu} [MeV]"); h_neutrons_energy_fv_zoom->GetYaxis()->SetTitle("Number of neutrons"); + h_neutrons_energy_fv_down->SetStats(0); + h_neutrons_energy_fv_down->GetXaxis()->SetTitle("E_{#mu} [MeV]"); + h_neutrons_energy_fv_down->GetYaxis()->SetTitle("Number of neutrons"); + + h_neutrons_energy_fv_cyl->SetStats(0); + h_neutrons_energy_fv_cyl->GetXaxis()->SetTitle("E_{#mu} [MeV]"); + h_neutrons_energy_fv_cyl->GetYaxis()->SetTitle("Number of neutrons"); + + h_neutrons_q2->SetStats(0); + h_neutrons_q2->GetXaxis()->SetTitle("Q^{2} [(GeV/c)^{2}]"); + h_neutrons_q2->GetYaxis()->SetTitle("Number of neutrons"); + + h_neutrons_q2_fv->SetStats(0); + h_neutrons_q2_fv->GetXaxis()->SetTitle("Q^{2} [(GeV/c)^{2}]"); + h_neutrons_q2_fv->GetYaxis()->SetTitle("Number of neutrons"); + + h_neutrons_q2_fv_down->SetStats(0); + h_neutrons_q2_fv_down->GetXaxis()->SetTitle("Q^{2} [(GeV/c)^{2}]"); + h_neutrons_q2_fv_down->GetYaxis()->SetTitle("Number of neutrons"); + h_neutrons_costheta->SetStats(0); h_neutrons_costheta->GetXaxis()->SetTitle("cos(#theta)"); h_neutrons_costheta->GetYaxis()->SetTitle("Number of neutrons"); @@ -610,6 +636,7 @@ bool NeutronMultiplicity::FillHistograms(){ h_neutrons_mrdstop->Fill(NumberNeutrons); h_neutrons_energy->Fill(SimpleRecoEnergy,NumberNeutrons); h_neutrons_energy_zoom->Fill(SimpleRecoEnergy,NumberNeutrons); + h_neutrons_q2->Fill(SimpleRecoQ2/1.e6,NumberNeutrons); h_neutrons_costheta->Fill(SimpleRecoCosTheta,NumberNeutrons); h_neutrons_pT->Fill(SimpleRecoPt,NumberNeutrons); h_muon_energy->Fill(SimpleRecoEnergy); @@ -634,6 +661,7 @@ bool NeutronMultiplicity::FillHistograms(){ h_muon_costheta_fv->Fill(SimpleRecoCosTheta); h_neutrons_energy_fv->Fill(SimpleRecoEnergy,NumberNeutrons); h_neutrons_energy_fv_zoom->Fill(SimpleRecoEnergy,NumberNeutrons); + h_neutrons_q2_fv->Fill(SimpleRecoQ2/1.e6,NumberNeutrons); h_neutrons_costheta_fv->Fill(SimpleRecoCosTheta,NumberNeutrons); h_neutrons_pT_fv->Fill(SimpleRecoPt,NumberNeutrons); h_neutrons_mrdstop_fv->Fill(NumberNeutrons); @@ -652,12 +680,22 @@ bool NeutronMultiplicity::FillHistograms(){ h_pmtvolneutrons_pT_fv->Fill(SimpleRecoPt,true_NCapturesPMTVol); } } + std::cout << " NM [debug] DownstreamFV/FullCylFV: " << DownstreamFV << "/" << FullCylFV << std::endl; + if (DownstreamFV == 1) + { + h_neutrons_energy_fv_down->Fill(SimpleRecoEnergy,NumberNeutrons); + h_neutrons_q2_fv_down->Fill(SimpleRecoQ2/1.e6,NumberNeutrons); + } + if (FullCylFV == 1) h_neutrons_energy_fv_cyl->Fill(SimpleRecoEnergy,NumberNeutrons); + h_muon_vtx_x->Fill(SimpleRecoVtx.X()); h_muon_vtx_y->Fill(SimpleRecoVtx.Y()); h_muon_vtx_z->Fill(SimpleRecoVtx.Z()); - h_muon_vtx_yz->Fill(SimpleRecoVtx.Z()-1.681,SimpleRecoVtx.Y()-0.144); - h_muon_vtx_xz->Fill(SimpleRecoVtx.Z()-1.681,SimpleRecoVtx.X()); + //h_muon_vtx_yz->Fill(SimpleRecoVtx.Z()-1.681,SimpleRecoVtx.Y()-0.144); + //h_muon_vtx_xz->Fill(SimpleRecoVtx.Z()-1.681,SimpleRecoVtx.X()); + h_muon_vtx_yz->Fill(SimpleRecoVtx.Z(),SimpleRecoVtx.Y()); + h_muon_vtx_xz->Fill(SimpleRecoVtx.Z(),SimpleRecoVtx.X()); reco_VtxX = SimpleRecoVtx.X(); reco_VtxY = SimpleRecoVtx.Y(); @@ -751,6 +789,10 @@ bool NeutronMultiplicity::SaveBoostStore(){ store_neutronmult->Set("NeutronEffMap",neutron_eff_map); store_neutronmult->Set("PMTMRDCoinc",passPMTMRDCoincCut); store_neutronmult->Set("NumMRDTracks",numtracksinev); + store_neutronmult->Set("DownstreamFV",DownstreamFV); + store_neutronmult->Set("FullCylFV",FullCylFV); + store_neutronmult->Set("SimpleRecoNeutrinoEnergy",SimpleRecoNeutrinoEnergy); + store_neutronmult->Set("SimpleRecoQ2",SimpleRecoQ2); if (isMC){ store_neutronmult->Set("NeutrinoEnergy",true_Enu); @@ -829,6 +871,10 @@ bool NeutronMultiplicity::ReadBoostStore(){ read_neutronmult->Get("NeutronEffMap",neutron_eff_map); read_neutronmult->Get("PMTMRDCoinc",passPMTMRDCoincCut); read_neutronmult->Get("NumMRDTracks",numtracksinev); + read_neutronmult->Get("DownstreamFV",DownstreamFV); + read_neutronmult->Get("FullCylFV",FullCylFV); + read_neutronmult->Get("SimpleRecoNeutrinoEnergy",SimpleRecoNeutrinoEnergy); + read_neutronmult->Get("SimpleRecoQ2",SimpleRecoQ2); m_data->Stores["ANNIEEvent"]->Set("RunNumber",RunNumber); m_data->Stores["ANNIEEvent"]->Set("EventNumber",EventNumber); @@ -854,6 +900,10 @@ bool NeutronMultiplicity::ReadBoostStore(){ m_data->Stores["RecoEvent"]->Set("NeutronEffMap",neutron_eff_map); m_data->Stores.at("RecoEvent")->Set("PMTMRDCoinc",passPMTMRDCoincCut); m_data->Stores["MRDTracks"]->Set("NumMrdTracks",numtracksinev); + m_data->Stores["RecoEvent"]->Set("DownstreamFV",DownstreamFV); + m_data->Stores["RecoEvent"]->Set("FullCylFV",FullCylFV); + m_data->Stores["RecoEvent"]->Set("SimpleRecoNeutrinoEnergy",SimpleRecoNeutrinoEnergy); + m_data->Stores["RecoEvent"]->Set("SimpleRecoQ2",SimpleRecoQ2); if (isMC){ read_neutronmult->Get("NeutrinoEnergy",true_Enu); @@ -973,6 +1023,15 @@ bool NeutronMultiplicity::GetParticleInformation(){ bool get_simple_mrdstop = m_data->Stores["RecoEvent"]->Get("SimpleRecoMRDStop",SimpleRecoMRDStop); if (!get_simple_mrdstop) Log("NeutronMultiplicity tool: No SimpleRecoMRDStop in RecoEvent!",v_error,verbosity); + bool get_simple_fvregion = m_data->Stores["RecoEvent"]->Get("DownstreamFV",DownstreamFV); + if (!get_simple_fvregion) Log("NeutronMultiplicity tool: No DownstreamFV in RecoEvent!",v_error,verbosity); + get_simple_fvregion = m_data->Stores["RecoEvent"]->Get("FullCylFV",FullCylFV); + if (!get_simple_fvregion) Log("NeutronMultiplicity tool: No FullCylFV in RecoEvent!",v_error,verbosity); + bool get_simple_nuenergy = m_data->Stores["RecoEvent"]->Get("SimpleRecoNeutrinoEnergy",SimpleRecoNeutrinoEnergy); + if (!get_simple_nuenergy) Log("NeutronMultiplicity tool: No SimpleRecoNeutrinoEnergy in RecoEvent!",v_error,verbosity); + bool get_simple_q2 = m_data->Stores["RecoEvent"]->Get("SimpleRecoQ2",SimpleRecoQ2); + if (!get_simple_q2) Log("NeutronMultiplicity tool: No SimpleRecoQ2 in RecoEvent!",v_error,verbosity); + bool get_pmtmrdcoinc = m_data->Stores.at("RecoEvent")->Get("PMTMRDCoinc",passPMTMRDCoincCut); if (!get_pmtmrdcoinc) Log("NeutronMultiplicity tool: No PMTMRDCoinc in RecoEvent!",v_error,verbosity); @@ -1006,7 +1065,7 @@ bool NeutronMultiplicity::GetMCTruthInformation(){ bool return_value = true; //Get information from GENIE store - bool get_neutrino_energy = m_data->Stores["GenieInfo"]->Get("NeutrinoEnergy",true_Enu); +/* bool get_neutrino_energy = m_data->Stores["GenieInfo"]->Get("NeutrinoEnergy",true_Enu); if (!get_neutrino_energy) Log("NeutronMultiplicity tool: No NeutrinoEnergy In GenieInfo!",v_error,verbosity); true_Enu *= 1000; //convert to MeV for consistency bool get_q2 = m_data->Stores["GenieInfo"]->Get("EventQ2",true_Q2); @@ -1041,7 +1100,7 @@ bool NeutronMultiplicity::GetMCTruthInformation(){ bool get_p = m_data->Stores["GenieInfo"]->Get("NumFSProtons",true_PrimProt); if (!get_p) Log("NeutronMultiplicity tool: No NumFSProtons In GenieInfo!",v_error,verbosity); - return_value = (get_neutrino_energy && get_q2 && get_cc && get_qel && get_res && get_dis && get_coh && get_mec && get_n && get_p); + return_value = (get_neutrino_energy && get_q2 && get_cc && get_qel && get_res && get_dis && get_coh && get_mec && get_n && get_p);*/ //Get information from RecoEvent store RecoVertex* TrueVtx = nullptr; auto get_muonMC = m_data->Stores.at("RecoEvent")->Get("TrueVertex",TrueVtx); @@ -1141,6 +1200,11 @@ bool NeutronMultiplicity::GetMCTruthInformation(){ bool NeutronMultiplicity::ResetVariables(){ + DownstreamFV = -9999; + FullCylFV = -9999; + SimpleRecoNeutrinoEnergy = -9999; + SimpleRecoQ2 = -9999; + SimpleRecoFlag = -9999; SimpleRecoVtx = Position(-9999,-9999,-9999); SimpleRecoStopVtx = Position(-9999,-9999,-9999); diff --git a/UserTools/NeutronMultiplicity/NeutronMultiplicity.h b/UserTools/NeutronMultiplicity/NeutronMultiplicity.h index 93392784b..b77f5aa31 100644 --- a/UserTools/NeutronMultiplicity/NeutronMultiplicity.h +++ b/UserTools/NeutronMultiplicity/NeutronMultiplicity.h @@ -78,6 +78,10 @@ class NeutronMultiplicity: public Tool { std::vector input_filenames_; //Reconstruction variables + int DownstreamFV; + int FullCylFV; + double SimpleRecoNeutrinoEnergy; + double SimpleRecoQ2; int SimpleRecoFlag; Position SimpleRecoVtx; Position SimpleRecoStopVtx; @@ -124,8 +128,13 @@ class NeutronMultiplicity: public Tool { TH1F *h_neutrons_mrdstop_fv = nullptr; TH2F *h_neutrons_energy = nullptr; TH2F *h_neutrons_energy_fv = nullptr; + TH2F *h_neutrons_energy_fv_down = nullptr; + TH2F *h_neutrons_energy_fv_cyl = nullptr; TH2F *h_neutrons_energy_zoom = nullptr; TH2F *h_neutrons_energy_fv_zoom = nullptr; + TH2F *h_neutrons_q2 = nullptr; + TH2F *h_neutrons_q2_fv = nullptr; + TH2F *h_neutrons_q2_fv_down = nullptr; TH2F *h_primneutrons_energy = nullptr; TH2F *h_primneutrons_energy_fv = nullptr; TH2F *h_primneutrons_energy_zoom = nullptr; From 29969e31de64379cb096456401815f724db6e507 Mon Sep 17 00:00:00 2001 From: jminock Date: Tue, 26 Nov 2024 13:46:41 -0500 Subject: [PATCH 04/10] Added config files for MuonFitter to CC_MC_RECO_ntuple Toolchain (#294) Co-authored-by: James Minock --- .../CC_MC_RECO_ntuple/MuonFitterConfig | 33 +++++++++++++++++++ .../CC_MC_RECO_ntuple/PhaseIITreeMakerConfig | 1 + configfiles/CC_MC_RECO_ntuple/ToolsConfig | 3 +- 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 configfiles/CC_MC_RECO_ntuple/MuonFitterConfig diff --git a/configfiles/CC_MC_RECO_ntuple/MuonFitterConfig b/configfiles/CC_MC_RECO_ntuple/MuonFitterConfig new file mode 100644 index 000000000..69465ed64 --- /dev/null +++ b/configfiles/CC_MC_RECO_ntuple/MuonFitterConfig @@ -0,0 +1,33 @@ +verbosity 0 + +OutputFile MC_MuonFitter_Reco_2998.root +IsData 0 # 1:is data, not MC; 0:not data, is MC +LuxArea 506.7 # 10-inch R7081 Hamamatsu +EtelArea 613.1 # 11-inch D784UKFLB ETEL +HamamatsuArea 324.3 # 8-inch R5912-100 Hamamatsu +WatchboyArea 506.7 # 10-inch R7081 Hamamatsu +WatchmanArea 506.7 # 10-inch R7081-100 Hamamatsu +PMTMRDOffset 0 # delay btwn tank and MRD PMTs +StepSizeAi 15 # some distance muon travels [cm] +InsideAngle 1. # degrees added to Cherenkov angle for hits to be considered inside cone +OutsideAngle 9. # degrees added to Cherenkov angle for hits to be considered outside cone +PMTChargeThreshold 2 # minimum amount of charge seen by PMT +EtaThreshold 500 # threshold to find best vertex +DisplayTruth 0 # display truth information in graphs (only in MC) +RecoMode 0 # run tool after fitting tank track +AiEtaFile ev_ai_eta_R0.0.txt +#TankTrackFitFile /exp/annie/app/users/jhe/MyToolAnalysis_MFer/fitbyeye_wcsim_2000-2999_RNN_240525v1.txt +#TankTrackFitFile fitbyeye_wcsim_2000-2999_RNN_240525v1.txt +TankTrackFitFile tanktrackfitfile_r0.0_RNN.txt + +UseNumLayers 1 # Updates reco track length in MRD using number of layers +UsePCA 0 # Updates reco track length in MRD using number of layers and PCA-reconstructed track angle (set UseNumLayers 1) +UseConnDots 0 # Updates reco track length in MRD by connecting the MRD hits +UseELoss 0 # Use official ANNIE MRD energyLoss as starting MRD energy +UseSimpleEReco 0 # Just add ANNIE MRD energyLoss (set UseELoss 1); no updating dEdx +RecoEnergyShift 0 # Shift reco muon energy + +Plot3D 0 # 0:no plot; 1:yes plot +Draw3DFMV 0 +Draw3DMRD 0 +SaveHistograms 0 # 0:no; 1:yes diff --git a/configfiles/CC_MC_RECO_ntuple/PhaseIITreeMakerConfig b/configfiles/CC_MC_RECO_ntuple/PhaseIITreeMakerConfig index 710811c4c..a6c6c09b1 100644 --- a/configfiles/CC_MC_RECO_ntuple/PhaseIITreeMakerConfig +++ b/configfiles/CC_MC_RECO_ntuple/PhaseIITreeMakerConfig @@ -14,6 +14,7 @@ TankReco_fill 1 SimpleReco_fill 1 RingCounting_fill 1 Reweight_fill 1 +MuonFitter_fill 1 OutputFile PhaseIITree_0.0.0.root #NumEventsWritten 2000 diff --git a/configfiles/CC_MC_RECO_ntuple/ToolsConfig b/configfiles/CC_MC_RECO_ntuple/ToolsConfig index b9c149c24..e0c6ea660 100644 --- a/configfiles/CC_MC_RECO_ntuple/ToolsConfig +++ b/configfiles/CC_MC_RECO_ntuple/ToolsConfig @@ -17,6 +17,7 @@ myRingCounting PythonScript configfiles/CC_MC_RECO_ntuple/RingCountingConfig #myVtxSeedGenerator VtxSeedGenerator #myVtxSeedFineGrid VtxSeedFineGrid #myVtxExtendedVertexFinder VtxExtendedVertexFinder -mySimpleReconstruction SimpleReconstruction configfiles/CC_MC_RECO_ntuple/SimpleReconstructionConfig +#mySimpleReconstruction SimpleReconstruction configfiles/CC_MC_RECO_ntuple/SimpleReconstructionConfig +myMuonFitter MuonFitter configfiles/CC_MC_RECO_ntuple/MuonFitterConfig myPhaseIITreeMaker PhaseIITreeMaker configfiles/CC_MC_RECO_ntuple/PhaseIITreeMakerConfig From 0b1f89f655fc41d51f8b2b622b74b51d3139eec6 Mon Sep 17 00:00:00 2001 From: jminock Date: Tue, 26 Nov 2024 13:47:21 -0500 Subject: [PATCH 05/10] Added README's for MuonFitter (#295) * Added README's for MuonFitter * Updated torch warning and location of model files * Updated README file to clarify steps/issues regarding MuonFitter model generation * Fix to previous commit, deleted AutoDict_map_string_vector_double__.cxx --------- Co-authored-by: James Minock --- UserTools/MuonFitter/README.md | 24 +++++++++ .../CC_MC_RECO_ntuple/MuonFitterREADME.md | 50 +++++++++++++++++++ configfiles/CC_MC_RECO_ntuple/README.md | 2 + 3 files changed, 76 insertions(+) create mode 100644 UserTools/MuonFitter/README.md create mode 100644 configfiles/CC_MC_RECO_ntuple/MuonFitterREADME.md diff --git a/UserTools/MuonFitter/README.md b/UserTools/MuonFitter/README.md new file mode 100644 index 000000000..e00a0dd32 --- /dev/null +++ b/UserTools/MuonFitter/README.md @@ -0,0 +1,24 @@ +#MuonFitter Tool Documentation +*********************** +Created by: Julie He + +Maintained by: James Minock + +Last updated: 10-2-2024 +*********************** + +This Tool functions for vertex and energy reconstruction, with the primary purpose being vertex reconstruction. This Tool operates on a ML generated model that fits tank tracks according to MRD information. + +This Tool is intended to act as a substitution to Michael's SimpleReconstruction Tool, filling "SimpleReco" values expected in PhaseIITreeMaker. + +The vertex saved to "SimpleRecoVtx" is given in meters and is oriented such that the center of the tank is represented by (0,-0.1446,1.681). + +There are additional variables created to be passed downstream including: + +FittedTrackLengthInWater - estimated track length in water of tank + +FittedMuonVertex - vertex of interaction assuming tank center at (0,0,0) + +RecoMuonKE - estimated kinetic energy of reconstructed muon + +Nlyrs - number of layers penetrated in MRD diff --git a/configfiles/CC_MC_RECO_ntuple/MuonFitterREADME.md b/configfiles/CC_MC_RECO_ntuple/MuonFitterREADME.md new file mode 100644 index 000000000..a8f65763b --- /dev/null +++ b/configfiles/CC_MC_RECO_ntuple/MuonFitterREADME.md @@ -0,0 +1,50 @@ +#MuonFitter Config + +*********************** +#Description +********************** + +Date created: 2024-10-02 +The MuonFitter toolchain makes an attempt to fit muons using hit information. + +Configure files are simple text files for passing variables to the Tools. + +Text files are read by the Store class (src/Store) and automatically assigned to an internal map for the relevant Tool to use. + +MuonFitter has 2 functionalities. The first functionality is pre-reconstruction. It takes input information and outputs a text file providing information to be fitted. This text file is used in a script to generate an additional text file that contains the fitted information. + +The second functionality is reconstruction. It takes both text files and reconstructs the vertex based on the fitted paths. + +Therefore, in order to properly use this Tool in a ToolChain: The ToolChain must be ran twice on the same set of data. Instructions are below. + +************************ +#Usage +************************ + +Any line starting with a "#" will be ignored by the Store, as will blank lines. + +Variables should be stored one per line as follows: + + +Name Value #Comments + +Note: Only one value is permitted per name and they are stored in a string stream and template cast back to the type given. + + +To generate a model, run the following scripts in order: + +1. Data_prepare.py + +2. RNN_train.py + +WARNING: currently, Data_prepare.py requires input files that do not exist on the ANNIE gpvms. These scripts were created and used to create models outside of the ANNIE gpvms and ToolAnalysis container. These scripts are to be considered DEPRECATED until further notice. + +Please update any paths such that all files and models are available or copy all model files to configfiles/MuonFitter/RNNFit directory. All model files are currently located at /pnfs/annie/persistent/simulations/models/MuonFitter/ + +To run the Tool: + +1. First, run in "RecoMode 0". This will generate a file: ev_ai_eta_R{RUN}.txt with a {RUN} number corresponding to the WCSim run number. You do not need any Tools further along the ToolChain for this step. This text file is all you need. + +2. Second, run "python3 Fit_data.py ev_ai_eta_R{RUN}.txt". This will apply the fitting and generate another textfile to be ran in ToolAnalysis: tanktrackfitfile_r{RUN}_RNN.txt. ALSO: please update any paths such that all files and models are available. + +3. Finally, run in "RecoMode 1". This is running the ToolChain for real. Please set the paths for the ev_ai_eta_R{RUN}.txt and tanktrackfitfile_r{RUN}_RNN.txt accordingly so they can be read in with the corresponding data file. See the README.md in UserTools/MuonFitter/ for short descriptions of information saved to the DataModel and how to access them. diff --git a/configfiles/CC_MC_RECO_ntuple/README.md b/configfiles/CC_MC_RECO_ntuple/README.md index 914085561..fbbf4e112 100644 --- a/configfiles/CC_MC_RECO_ntuple/README.md +++ b/configfiles/CC_MC_RECO_ntuple/README.md @@ -58,6 +58,8 @@ EventSelector Tool performs reconstruction ----------------------- +RingCounting +MuonFitter - this Tool REPLACES SimpleReconstruction SimpleReconstruction ----------------------- From 30a9cb9a07c78e1631c28f60abf0cdc02e4b5112 Mon Sep 17 00:00:00 2001 From: jminock Date: Tue, 26 Nov 2024 13:47:41 -0500 Subject: [PATCH 06/10] Added documentation regarding model generation. Updated paths in Data_prepare.py (#320) Co-authored-by: James Minock --- configfiles/MuonFitter/README.md | 21 ++++++++++++++----- configfiles/MuonFitter/RNNFit/Data_prepare.py | 4 ++-- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/configfiles/MuonFitter/README.md b/configfiles/MuonFitter/README.md index 832b47e15..a5ee2aa00 100644 --- a/configfiles/MuonFitter/README.md +++ b/configfiles/MuonFitter/README.md @@ -5,7 +5,7 @@ ********************** Date created: 2024-10-02 -Date last updated: 2024-11-22 +Date last updated: 2024-11-26 The MuonFitter toolchain makes an attempt to fit muons using hit information. The Tool has 2 modes. The first mode is pre-reconstruction. It takes input information from the ANNIEEvent and generates a text file containing hit information for the RNN. It is advisable to include minimal tools in this ToolChain, as the same data must be re-analysed with ToolAnalysis later. @@ -25,12 +25,13 @@ More detailed instructions are below. To generate (train) a model: ============================ -1. Data_prepare.py +1. Run a ToolChain containing the MuonFitter Tool configured in "RecoMode 0". This will generate 2 files: ev_ai_eta_R{RUN}.txt with a {RUN} number corresponding to the WCSim run number and true_track_len.txt. You should not include any Tools further along the ToolChain for this step. -2. RNN_train.py +2. Run Data_prepare.py with the generated ev_ai_eta file and true_track_len file. This will generate data files to train the model for the next step. -NOTE: Data_prepare.py requires input files that do not yet exist on the ANNIE gpvms; as a result the model cannot at present be re-trained. -Previously generated models are stored in /pnfs/annie/persistent/simulations/models/MuonFitter/ which may be used. +3. Run RNN_train.py with the data files generated from the previous step. This will generate model.pth to be used as the model for data analysis. + +Previously generated models and data are stored in /pnfs/annie/persistent/simulations/models/MuonFitter/ which may be used. Please update any paths in the Tool configuration and Fit_data.py accordingly, or copy the appropriate model files to the configfiles/MuonFitter/RNNFit directory. @@ -44,3 +45,13 @@ To analyse data: NOTE: the script RNNFit/rnn_fit.sh can act as a helper to process multiple ev_ai_eta_R{RUN}.txt files. Be sure to update the path in the script to point to your ev_ai_eta text files from step 1. 3. Finally, run a ToolChain containing the MuonFitter Tool configured in "RecoMode 1". Please set the paths for the ev_ai_eta_R{RUN}.txt and tanktrackfitfile_r{RUN}_RNN.txt in the MuonFitter config file accordingly. You may include any downstream tools you desire for further analysis. See the UserTools/MuonFitter/README.md for short descriptions of information saved to the DataModel and how to access them. + +Storage for intermediate files: +=============================== + +Intermediate files can be stored in directories in /pnfs/annie/persistent/simulations/models/MuonFitter/ +truetanktracklength/ - would contain true_track_len.txt +tanktrackfit/ - would contain tanktrackfitfile_r{RUN}_RNN.txt +ev_ai_eta/ - would contain ev_ai_eta_R{RUN}.txt + +These directories are currently empty as of 11/26/2024 and will be filled upon Production level generation of ntuples using MuonFitter. diff --git a/configfiles/MuonFitter/RNNFit/Data_prepare.py b/configfiles/MuonFitter/RNNFit/Data_prepare.py index e3d519dce..b0f978eba 100644 --- a/configfiles/MuonFitter/RNNFit/Data_prepare.py +++ b/configfiles/MuonFitter/RNNFit/Data_prepare.py @@ -6,8 +6,8 @@ # # Prepare data into pandas DataFrame -dataX = pd.read_csv("/home/jhe/annie/analysis/Muon_vertex/X.txt",sep=',',header=None,names=['id','ai','eta']) #ai is track segment -dataY = pd.read_csv("/home/jhe/annie/analysis/Muon_vertex/Y.txt",sep=',',header=None,names=['id','truetracklen']) +dataX = pd.read_csv("ev_ai_eta_R0.0.txt",sep=',',header=None,names=['id','ai','eta']) #ai is track segment +dataY = pd.read_csv("true_track_len.txt",sep=',',header=None,names=['id','truetracklen']) # dataX['combine'] = dataX[['X','Y']].values.tolist() From db4358b176633ab332cde8448103cca10d2415f3 Mon Sep 17 00:00:00 2001 From: jminock Date: Tue, 26 Nov 2024 13:50:10 -0500 Subject: [PATCH 07/10] Added MuonFitter updates to PhaseIITreeMaker (#296) Co-authored-by: James Minock Co-authored-by: marc1uk --- .../PhaseIITreeMaker/PhaseIITreeMaker.cpp | 55 ++++++++++++++++++- UserTools/PhaseIITreeMaker/PhaseIITreeMaker.h | 8 +++ 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/UserTools/PhaseIITreeMaker/PhaseIITreeMaker.cpp b/UserTools/PhaseIITreeMaker/PhaseIITreeMaker.cpp index 4212820c4..6c51a6925 100644 --- a/UserTools/PhaseIITreeMaker/PhaseIITreeMaker.cpp +++ b/UserTools/PhaseIITreeMaker/PhaseIITreeMaker.cpp @@ -38,6 +38,8 @@ bool PhaseIITreeMaker::Initialise(std::string configfile, DataModel &data){ m_variables.Get("Digit_fill",Digit_fill); + m_variables.Get("MuonFitter_fill", MuonFitter_fill); + std::string output_filename; m_variables.Get("OutputFile", output_filename); fOutput_tfile = new TFile(output_filename.c_str(), "recreate"); @@ -108,6 +110,15 @@ bool PhaseIITreeMaker::Initialise(std::string configfile, DataModel &data){ fPhaseIITankClusterTree->Branch("SiPM1NPulses",&fSiPM1NPulses,"SiPM1NPulses/I"); fPhaseIITankClusterTree->Branch("SiPM2NPulses",&fSiPM2NPulses,"SiPM2NPulses/I"); } + //MuonFitter reco track length, vtx, energy; juju + if (MuonFitter_fill) + { + fPhaseIITankClusterTree->Branch("recoMuonVtxX", &fRecoMuonVtxX, "recoMuonVtxX/D"); + fPhaseIITankClusterTree->Branch("recoMuonVtxY", &fRecoMuonVtxY, "recoMuonVtxY/D"); + fPhaseIITankClusterTree->Branch("recoMuonVtxZ", &fRecoMuonVtxZ, "recoMuonVtxZ/D"); + fPhaseIITankClusterTree->Branch("recoTankTrack", &fRecoTankTrack, "recoTankTrack/D"); + fPhaseIITankClusterTree->Branch("recoMuonKE", &fRecoMuonKE, "recoMuonKE/D"); + } // MC BNB spill structure timing - AssignBunchTimingMC tool if(hasBNBtimingMC){ fPhaseIITankClusterTree->Branch("bunchTimes",&fbunchTimes,"bunchTimes/D"); @@ -433,6 +444,17 @@ bool PhaseIITreeMaker::Initialise(std::string configfile, DataModel &data){ fPhaseIITrigTree->Branch("weight_nucleonqexsec_FluxUnisim",&fnucleonqexsec); fPhaseIITrigTree->Branch("weight_nucleontotxsec_FluxUnisim",&fnucleontotxsec); } + + //MuonFitter reco track length, vtx, energy; juju + if (MuonFitter_fill) + { + fPhaseIITrigTree->Branch("recoMuonVtxX", &fRecoMuonVtxX, "recoMuonVtxX/D"); + fPhaseIITrigTree->Branch("recoMuonVtxY", &fRecoMuonVtxY, "recoMuonVtxY/D"); + fPhaseIITrigTree->Branch("recoMuonVtxZ", &fRecoMuonVtxZ, "recoMuonVtxZ/D"); + fPhaseIITrigTree->Branch("recoTankTrack", &fRecoTankTrack, "recoTankTrack/D"); + fPhaseIITrigTree->Branch("recoMuonKE", &fRecoMuonKE, "recoMuonKE/D"); + fPhaseIITrigTree->Branch("numMrdLayers", &fNumMrdLayers, "numMrdLayers/I"); + } // Reconstructed variables from each step in Muon Reco Analysis // Currently output when RecoDebug_fill = 1 in config @@ -656,6 +678,16 @@ bool PhaseIITreeMaker::Execute(){ } if(SiPMPulseInfo_fill) this->LoadSiPMHits(); + if (MuonFitter_fill) + { + Position tmp_vtx(-999,-999,-999); + m_data->CStore.Get("FittedMuonVertex", tmp_vtx); + fRecoMuonVtxX = tmp_vtx.X(); + fRecoMuonVtxY = tmp_vtx.Y(); + fRecoMuonVtxZ = tmp_vtx.Z(); + m_data->CStore.Get("FittedTrackLengthInWater", fRecoTankTrack); + m_data->CStore.Get("RecoMuonKE", fRecoMuonKE); + } fPhaseIITankClusterTree->Fill(); cluster_num += 1; if (isData){ @@ -922,6 +954,18 @@ bool PhaseIITreeMaker::Execute(){ // FIll tree with all reconstruction information if (RecoDebug_fill) this->FillRecoDebugInfo(); + if (MuonFitter_fill) + { + Position tmp_vtx(-999,-999,-999); + m_data->CStore.Get("FittedMuonVertex", tmp_vtx); + fRecoMuonVtxX = tmp_vtx.X(); + fRecoMuonVtxY = tmp_vtx.Y(); + fRecoMuonVtxZ = tmp_vtx.Z(); + m_data->CStore.Get("FittedTrackLengthInWater", fRecoTankTrack); + m_data->CStore.Get("RecoMuonKE", fRecoMuonKE); + m_data->CStore.Get("NLyers", fNumMrdLayers); + } + fPhaseIITrigTree->Fill(); } return true; @@ -1225,7 +1269,16 @@ void PhaseIITreeMaker::ResetVariables() { fdigitT.clear(); } //DIGITS - + + if (MuonFitter_fill) + { + fRecoMuonVtxX = -9999; + fRecoMuonVtxY = -9999; + fRecoMuonVtxZ = -9999; + fRecoTankTrack = -9999; + fRecoMuonKE = -9999; + fNumMrdLayers = -9999; + } } bool PhaseIITreeMaker::LoadTankClusterClassifiers(double cluster_time){ diff --git a/UserTools/PhaseIITreeMaker/PhaseIITreeMaker.h b/UserTools/PhaseIITreeMaker/PhaseIITreeMaker.h index 5770fbebd..a41b61866 100644 --- a/UserTools/PhaseIITreeMaker/PhaseIITreeMaker.h +++ b/UserTools/PhaseIITreeMaker/PhaseIITreeMaker.h @@ -437,6 +437,13 @@ class PhaseIITreeMaker: public Tool { double fDeltaZenith; double fDeltaAngle; + // MuonFitter vertex + double fRecoMuonVtxX; + double fRecoMuonVtxY; + double fRecoMuonVtxZ; + double fRecoTankTrack; + double fRecoMuonKE; + int fNumMrdLayers; /// \brief Integer that determines the level of logging to perform int verbosity = 0; @@ -464,6 +471,7 @@ class PhaseIITreeMaker: public Tool { bool muonTruthRecoDiff_fill = 0; //Output difference in tmuonruth and reconstructed values bool SiPMPulseInfo_fill = 0; bool Digit_fill = 0; + bool MuonFitter_fill = 0; }; From 0d9aca0572973bd39d92ba5b1db27300053098c7 Mon Sep 17 00:00:00 2001 From: Daniel Tobias Schmid <82974642+s4294967296@users.noreply.github.com> Date: Tue, 26 Nov 2024 19:51:17 +0100 Subject: [PATCH 08/10] Added ensemble support for RingCounting tool. (#278) * add RingCounting tool * RingCounting.py: added model loading and documentation * RingCounting.py: fix bug * RingCounting.py: rm unimplemented method call * RingCounting.py: fixed pmt masking, fixed file loading, added files_to_load path line commenting support * RingCounting.py: + docStrings + saving controlled by [[save_to]] * added RingCountingConfig, fixed loading error in RingCountingTool * RingCounting.py: + logging of successful file loading + pep8 formatting * Filled RingCountingTool README.md * Created RingCounting Tool (#1) Created RingCounting Tool --------- Co-authored-by: Daniel T. Schmid * Update files_to_load.txt noop to trigger CI test * Fixed mrdtotalentries being smaller than tanktotalentries throwing a fatal error in LoadRawData.cpp when build type is set to "MRD", since in this case only MRD data is expected to be loaded. * Improved clarity of the load and save operation of the RingCounting tool: - Renamed load_from_file -> load_from_csv - Introduced variable save_to_csv - Updated documentation at beginning of RingCounting.py to reflect changes - Updated README.md to reflect changes - Updated UserTools/RingCounting/RingCountingConfig to reflect changes Users using the RingCounting tool need to update their RingCountingConfig files following this change. * Added ensemble support for RingCounting tool. - Moved logic for processing predictions to method process_predictions - Added new configuration variables model_is_ensemble, ensemble_model_count,ensemble_prediction_combination_mode - Added support for loading ensemble models and processing predictions - Added support for average and majority-voting ensemble - Added storing of majority-voting ensemble class prediction in new variables RingCountingVoting{SR,MR}Prediction in RecoEvent BoostStore - Updated documentation within RingCounting.py - Updated README.md - Updated configfiles/RingCounting/RingCountingConfig Users using the RingCounting tool need to update their RingCountingConfig file(s) following this change. --------- Co-authored-by: Daniel T. Schmid Co-authored-by: marc1uk --- UserTools/RingCounting/README.md | 11 ++ UserTools/RingCounting/RingCounting.py | 126 +++++++++++++++++--- configfiles/RingCounting/RingCountingConfig | 4 + 3 files changed, 123 insertions(+), 18 deletions(-) diff --git a/UserTools/RingCounting/README.md b/UserTools/RingCounting/README.md index 22fff5bfd..0714b19c9 100644 --- a/UserTools/RingCounting/README.md +++ b/UserTools/RingCounting/README.md @@ -31,6 +31,12 @@ reco_event_bs.Set("RingCountingSRPrediction", predicted_sr) reco_event_bs.Set("RingCountingMRPrediction", predicted_mr) ``` +and in case of using an ensemble with majority-voting the following variables are also set: +``` +reco_event_bs.Set("RingCountingVotingSRPrediction", predicted_sr) +reco_event_bs.Set("RingCountingVotingMRPrediction", predicted_mr) +``` + --- ## Configuration @@ -55,4 +61,9 @@ files_to_load configfiles/RingCounting/files_to_load.txt # txt file c version 1_0_0 # Model version model_path /exp/annie/app/users/dschmid/RingCountingStore/models/ # Model path pmt_mask november_22 # Masked PMTs (name of hard-coded set of PMTs to ignore) + +model_is_ensemble 1 # If set to 1, treat as ensemble +ensemble_model_count 13 # Number of models in ensemble +ensemble_prediction_combination_mode average # average/voting + ``` diff --git a/UserTools/RingCounting/RingCounting.py b/UserTools/RingCounting/RingCounting.py index 4cfd706b9..eb74ef05b 100644 --- a/UserTools/RingCounting/RingCounting.py +++ b/UserTools/RingCounting/RingCounting.py @@ -35,9 +35,19 @@ # 6. Which PMT mask to use (some PMTs have been turned off in the training); check documentation for which model # requires what mask. # -> defined by setting [[pmt_mask]] -# 7. Where to save the predictions, when save_to_csv == true +# 7. Where to save the predictions, when save_to_csv == 1 # -> defined by setting [[save_to]] -# An example config file can also be found in in the RingCountingStore/documentation/ folders mentioned below. +# 8. Whether a single model or ensemble should be used +# -> defined by setting [[model_is_ensemble]] +# 9. How many models make up the ensemble. If model count is N, "sub"-models are labeled 0, 1, ..., N-1. +# -> defined by setting [[ensemble_model_count]] +# 10. How the model predictions should be combined when using an ensemble. Supported: +# - "None" (the type), only the first model's predictions are used. (blank line in config file) +# - "average", average predictions of all models +# - "voting", average predictions and in addition a majority-voting prediction is also produced. +# -> defined by setting [[ensemble_prediction_combination_mode]] +# +# An example config file can be found in the configfiles/RingCounting/ ToolChain. # # # When using on the grid, make sure to only use onsite computing resources. TensorFlow is not supported at all offsite @@ -85,16 +95,22 @@ class RingCounting(Tool, RingCountingGlobals): load_from_csv = std.string() # if 1, load 1 or more CNNImage formatted csv file instead of using toolchain save_to_csv = std.string() # if 1, save as a csv file in format MR prediction, SR prediction files_to_load = std.string() # List of files to be loaded (must be in CNNImage format, - # load_from_file has to be true) + # load_from_csv has to be true) version = std.string() # Model version model_path = std.string() # Path to model directory pmt_mask = std.string() # See RingCountingGlobals save_to = std.string() # Where to save the predictions to + model_is_ensemble = std.string() # Whether the model consists of multiple models acting as a mixture of experts + # (MOE)/ensemble + ensemble_model_count = std.string() # Count of models used in the ensemble + ensemble_prediction_combination_mode = std.string() # How predictions of models are combined: average, voting, .. # ---------------------------------------------------------------------------------------------------- # Model variables - model = None - predicted = None + model = None # Union[TF.model/Keras.model, None] + ensemble_models = None # Union[List[TF.model/Keras.model], None] + predicted = None # np.array() + predicted_ensemble = None # List[np.array()] def Initialise(self): """ Initialise RingCounting tool object in following these steps: @@ -123,6 +139,21 @@ def Initialise(self): self.m_variables.Get("save_to", self.save_to) self.save_to = str(self.save_to) # cast to str since std.string =/= str self.pmt_mask = self.PMT_MASKS[self.pmt_mask] + self.m_variables.Get("model_is_ensemble", self.model_is_ensemble) + self.model_is_ensemble = "1" == self.model_is_ensemble + self.m_variables.Get("ensemble_model_count", self.ensemble_model_count) + self.ensemble_model_count = int(self.ensemble_model_count) + if self.ensemble_model_count % 2 == 0: + self.m_log.Log(__file__ + f" WARNING: Number of models in ensemble is even" + f" ({self.ensemble_model_count}). Can lead to unexpected classification when" + f" using voting to determine ensemble predictions.", + self.v_warning, self.m_verbosity) + self.m_variables.Get("ensemble_prediction_combination_mode", self.ensemble_prediction_combination_mode) + if self.ensemble_prediction_combination_mode not in [None, "average", "voting"]: + self.m_log.Log(__file__ + f" WARNING: Unsupported prediction combination mode selected" + f" ({self.ensemble_prediction_combination_mode}). Defaulting to 'average'.", + self.v_warning, self.m_verbosity) + self.ensemble_prediction_combination_mode = "average" # ---------------------------------------------------------------------------------------------------- # Loading data @@ -146,14 +177,7 @@ def Execute(self): self.mask_pmts() self.predict() - if not self.load_from_csv: - predicted_sr = float(self.predicted[0][1]) - predicted_mr = float(self.predicted[0][0]) - - reco_event_bs = self.m_data.Stores.at("RecoEvent") - - reco_event_bs.Set("RingCountingSRPrediction", predicted_sr) - reco_event_bs.Set("RingCountingMRPrediction", predicted_mr) + self.process_predictions() return 1 @@ -210,8 +234,13 @@ def load_data(self): self.v_debug, self.m_verbosity) def save_data(self): - """ Save the data to the specified [[save_to]]-file. """ - np.savetxt(self.save_to, self.predicted, delimiter=",") + """ Save the data to the specified [[save_to]]-file. When using an ensemble, each line contains all of the + individual model's predictions for that event (ordered as MR1,SR1,MR2,SR2,...). + """ + if self.model_is_ensemble: + np.savetxt(self.save_to, np.array(self.predicted_ensemble).flatten(), delimiter=",") + else: + np.savetxt(self.save_to, self.predicted, delimiter=",") def mask_pmts(self): """ Mask PMTs to 0. The PMTs to be masked is given as a list of indices, defined by setting [[pmt_mask]]. @@ -224,8 +253,18 @@ def mask_pmts(self): np.put(self.cnn_image_pmt, self.pmt_mask, 0, mode='raise') def load_model(self): - """ Load the specified model [[version]].""" - self.model = tf.keras.models.load_model(self.model_path + f"RC_model_v{self.version}.model") + """ Load the specified model [[version]]. If [[model_is_ensemble]], load all models in ensemble. + Models files are expected to be named as 'model_path + RC_model_v[[version]].model' for single models, and + 'model_path + RC_model_ENS_v[[version]].i.model', where i in {0, 1, ..., [[ensemble_model_count]] - 1} for + ensemble models. + """ + if self.model_is_ensemble: + self.ensemble_models = [ + tf.keras.models.load_model(self.model_path + f"RC_model_ENS_v{self.version}.{i}.model") + for i in range(0, self.ensemble_model_count) + ] + else: + self.model = tf.keras.models.load_model(self.model_path + f"RC_model_v{self.version}.model") def get_next_event(self): """ Get the next event from the BoostStore. """ @@ -256,8 +295,59 @@ def predict(self): """ self.m_log.Log(__file__ + " PREDICTING", self.v_message, self.m_verbosity) - self.predicted = self.model.predict(np.reshape(self.cnn_image_pmt, newshape=(-1, 10, 16, 1))) + if self.model_is_ensemble: + self.predicted_ensemble = [ + m.predict(np.reshape(self.cnn_image_pmt, newshape=(-1, 10, 16, 1))) for m in self.ensemble_models + ] + else: + self.predicted = self.model.predict(np.reshape(self.cnn_image_pmt, newshape=(-1, 10, 16, 1))) + + def process_predictions(self): + """ Process the model predictions. If an ensemble is used, calculate final predictions based on the selected + ensemble mode. Finally, store predictions in the RecoEvent BoostStore. + + Store the output of the averaging ensemble and single model within the RecoEvent BoostStore under + RingCountingSRPrediction, + RingCountingMRPrediction. + Store the voted-for class prediction of the voting ensemble within the RecoEvent BoostStore under + RingCountingVotingSRPrediction, + RingCountingVotingMRPrediction. + """ + predicted_sr = -1 + predicted_mr = -1 + reco_event_bs = self.m_data.Stores.at("RecoEvent") + + if self.model_is_ensemble: + if self.ensemble_prediction_combination_mode is None: + predicted_sr = float(self.predicted_ensemble[0][0][1]) + predicted_mr = float(self.predicted_ensemble[0][0][0]) + + elif self.ensemble_prediction_combination_mode in ["average", "voting"]: + # Voting will also get a predicted_sr and mr calculated by averaging, since it can be useful to also + # use the averaged predictions in that case. Sometimes 4 models could yield outputs of a class as + # 0.51, while a single model could classify the class as 0.1. The average will then be < 0.5, leading + # to a different predicted class based on averaging, compared to voting. + predicted_sr = np.average([float(i[0][1]) for i in self.predicted_ensemble]) + predicted_mr = np.average([float(i[0][0]) for i in self.predicted_ensemble]) + + if self.ensemble_prediction_combination_mode == "voting": + # Index will be 1 for argmax in case of SR prediction, hence the sum of the argmaxes gives votes in + # favour of SR. + # In case of having an even number of models and an equal number of votes for both classes, the class + # will be set as neither SR *nor* MR. + + votes = np.argmax([float(i[0]) for i in self.predicted_ensemble]) + pred_category_sr = 1 if np.sum(votes) > self.ensemble_model_count // 2 else 0 + pred_category_mr = 1 if np.sum(votes) < self.ensemble_model_count // 2 else 0 + + reco_event_bs.Set("RingCountingVotingSRPrediction", pred_category_sr) + reco_event_bs.Set("RingCountingVotingMRPrediction", pred_category_mr) + else: + predicted_sr = float(self.predicted[0][1]) + predicted_mr = float(self.predicted[0][0]) + reco_event_bs.Set("RingCountingSRPrediction", predicted_sr) + reco_event_bs.Set("RingCountingMRPrediction", predicted_mr) ################### # ↓ Boilerplate ↓ # diff --git a/configfiles/RingCounting/RingCountingConfig b/configfiles/RingCounting/RingCountingConfig index 36c0c9cf8..c691e1f7a 100644 --- a/configfiles/RingCounting/RingCountingConfig +++ b/configfiles/RingCounting/RingCountingConfig @@ -20,3 +20,7 @@ model_path /exp/annie/app/users/dschmid/RingCountingStore/models/ pmt_mask november_22 # Output file save_to RC_output.csv + +model_is_ensemble 1 # If set to 1, treat as ensemble +ensemble_model_count 13 # Number of models in ensemble +ensemble_prediction_combination_mode average # average/voting From 17eeb302ce0ce2ad54a0d0591d56e01c2715168b Mon Sep 17 00:00:00 2001 From: fengyvoid <67118022+fengyvoid@users.noreply.github.com> Date: Tue, 26 Nov 2024 19:19:47 -0600 Subject: [PATCH 09/10] LAPPD_EB tool chain (#310) --- configfiles/LAPPD_EB/ConfigGeo | 12 ++++ configfiles/LAPPD_EB/Configs | 56 +++++++++++++++++++ configfiles/LAPPD_EB/LoadRawDataConfig | 12 ++++ configfiles/LAPPD_EB/ToolChainConfig | 24 ++++++++ configfiles/LAPPD_EB/ToolsConfig | 5 ++ configfiles/LAPPD_EB/TriggerDataDecoderConfig | 4 ++ configfiles/LAPPD_EB/my_files.txt | 50 +++++++++++++++++ 7 files changed, 163 insertions(+) create mode 100644 configfiles/LAPPD_EB/ConfigGeo create mode 100644 configfiles/LAPPD_EB/Configs create mode 100644 configfiles/LAPPD_EB/LoadRawDataConfig create mode 100644 configfiles/LAPPD_EB/ToolChainConfig create mode 100644 configfiles/LAPPD_EB/ToolsConfig create mode 100644 configfiles/LAPPD_EB/TriggerDataDecoderConfig create mode 100644 configfiles/LAPPD_EB/my_files.txt diff --git a/configfiles/LAPPD_EB/ConfigGeo b/configfiles/LAPPD_EB/ConfigGeo new file mode 100644 index 000000000..759b28663 --- /dev/null +++ b/configfiles/LAPPD_EB/ConfigGeo @@ -0,0 +1,12 @@ +#LoadGeometry +verbosity 0 +LAPPDChannelCount 60 +FACCMRDGeoFile ./configfiles/LoadGeometry/FullMRDGeometry.csv +DetectorGeoFile ./configfiles/LoadGeometry/DetectorGeometrySpecs.csv +LAPPDGeoFile ./configfiles/LAPPDana/LAPPDGeometry.csv +TankPMTGeoFile ./configfiles/LoadGeometry/FullTankPMTGeometry.csv +TankPMTGainFile ./configfiles/LoadGeometry/ChannelSPEGains2023.csv +TankPMTTimingOffsetFile ./configfiles/LoadGeometry/TankPMTTimingOffsets.csv +AuxiliaryChannelFile ./configfiles/LoadGeometry/AuxChannels.csv +LAPPDMerging 0 + diff --git a/configfiles/LAPPD_EB/Configs b/configfiles/LAPPD_EB/Configs new file mode 100644 index 000000000..0975b4615 --- /dev/null +++ b/configfiles/LAPPD_EB/Configs @@ -0,0 +1,56 @@ + General Parameters +Nsamples 256 #Number of samples in a waveform +SampleSize 100 #Sample size for baseline substraction +TrigChannel 5 #Specified channel the trigger signal will be on +num_vector_pps 16 #Fixed PPS vector size +num_vector_data 7795 #Fixed DATA vector size +NUM_VECTOR_METADATA 103 #Fixed META vector size +LAPPDchannelOffset 1000 +NChannels 30 + +LAPPDStoreReadInVerbosity 0 + +mergingModeReadIn 0 +RawDataInputWavLabel RawWaveform +RawDataOutputWavLabel RawLAPPDData +BoardIndexLabel BoardIndex #Label of the vector of read out boards + +PsecReceiveMode 1 +stopEntries 10000000000 + +DoPedSubtraction 0 +Nboards 6 #Number of pedestal files to be read in +PedinputfileTXT ../Pedestals/Laser2024Feb/P +PSECinputfile /pnfs/annie/persistent/processed/LAPPD40Merged/FinalVersion_withRawTS/FilteredData_PMT_MRDtrack_noveto_15mV_7strips_3xxx_104 + + +Pedinputfile1 ../Pedestals/PEDS_ACDC_board0.txt +Pedinputfile2 ../Pedestals/PEDS_ACDC_board1.txt + + +ReadStore 0 +OutputWavLabel RawLAPPDData +SelectSingleLAPPD false +SelectedLAPPD 0 +loadPSEC 1 +loadPPS 1 +loadOffsets 0 + + +#LAPPDTreeMaker +LoadPulse 0 +LoadHit 0 +LoadWaveform 0 +LoadLAPPDDataTimeStamp 1 +LoadPPSTimestamp 1 +LoadRunInfoRaw 1 +LoadRunInfoANNIEEvent 0 + +treeMakerVerbosity 0 + +treeMakerInputPulseLabel LAPPDPulses +treeMakerInputHitLabel LAPPDHits +treeMakerOutputFileName LAPPDTree.root +LoadTriggerInfo 1 +LoadGroupOption beam +LoadGroupedTriggerInfo 1 diff --git a/configfiles/LAPPD_EB/LoadRawDataConfig b/configfiles/LAPPD_EB/LoadRawDataConfig new file mode 100644 index 000000000..d849fc8f2 --- /dev/null +++ b/configfiles/LAPPD_EB/LoadRawDataConfig @@ -0,0 +1,12 @@ +verbosity 0 +BuildType LAPPDAndCTC +Mode FileList + + +InputFile ./configfiles/LAPPD_EB/my_files.txt + + +DummyRunInfo 1 +StoreTrigOverlap 0 +ReadTrigOverlap 0 +StoreRawData 0 diff --git a/configfiles/LAPPD_EB/ToolChainConfig b/configfiles/LAPPD_EB/ToolChainConfig new file mode 100644 index 000000000..fe4ab0be2 --- /dev/null +++ b/configfiles/LAPPD_EB/ToolChainConfig @@ -0,0 +1,24 @@ + +#ToollChain dynamic setup file + +##### Runtime Paramiters ##### +verbose 1 ## Verbosity level of ToolChain +error_level 0 # 0= do not exit, 1= exit on unhandeled errors only, 2= exit on unhandeled errors and handeled errors +attempt_recover 1 ## 1= will attempt to finalise if an execute fails + +###### Logging ##### +log_mode Interactive # Interactive=cout , Remote= remote logging system "serservice_name Remote_Logging" , Local = local file log; +log_local_path ./log +log_service LogStore + +###### Service discovery ##### Ignore these settings for local analysis +service_publish_sec -1 +service_kick_sec -1 + +##### Tools To Add ##### +Tools_File configfiles/LAPPD_EB/ToolsConfig ## list of tools to run and their config files + +##### Run Type ##### +Inline -1 ## number of Execute steps in program, -1 infinite loop that is ended by user +Interactive 0 ## set to 1 if you want to run the code interactively + diff --git a/configfiles/LAPPD_EB/ToolsConfig b/configfiles/LAPPD_EB/ToolsConfig new file mode 100644 index 000000000..71b067fe2 --- /dev/null +++ b/configfiles/LAPPD_EB/ToolsConfig @@ -0,0 +1,5 @@ +LoadGeometry LoadGeometry configfiles/LAPPD_EB/ConfigGeo +LoadRawData LoadRawData configfiles/LAPPD_EB/LoadRawDataConfig +TriggerDataDecoder TriggerDataDecoder configfiles/LAPPD_EB/TriggerDataDecoderConfig +LAPPDLoadStore LAPPDLoadStore configfiles/LAPPD_EB/Configs +LAPPDTreeMaker LAPPDTreeMaker configfiles/LAPPD_EB/Configs diff --git a/configfiles/LAPPD_EB/TriggerDataDecoderConfig b/configfiles/LAPPD_EB/TriggerDataDecoderConfig new file mode 100644 index 000000000..d3e32f7f8 --- /dev/null +++ b/configfiles/LAPPD_EB/TriggerDataDecoderConfig @@ -0,0 +1,4 @@ +verbosity 0 +#TriggerMaskFile ./configfiles/LAPPDBeamAnalysis/LAPPDRawData/DefaultTriggerMask.txt +StoreTrigOverlap 0 +ReadTrigOverlap 0 diff --git a/configfiles/LAPPD_EB/my_files.txt b/configfiles/LAPPD_EB/my_files.txt new file mode 100644 index 000000000..d047a0162 --- /dev/null +++ b/configfiles/LAPPD_EB/my_files.txt @@ -0,0 +1,50 @@ +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p0 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p1 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p2 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p3 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p4 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p5 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p6 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p7 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p8 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p9 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p10 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p11 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p12 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p13 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p14 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p15 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p16 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p17 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p18 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p19 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p20 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p21 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p22 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p23 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p24 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p25 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p26 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p27 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p28 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p29 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p30 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p31 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p32 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p33 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p34 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p35 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p36 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p37 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p38 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p39 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p40 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p41 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p42 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p43 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p44 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p45 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p46 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p47 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p48 +/pnfs/annie/persistent/raw/raw/4795/RAWDataR4795S0p49 From 536de96c57f708c3d979d2392b5b92ac8224fa6b Mon Sep 17 00:00:00 2001 From: fengyvoid <67118022+fengyvoid@users.noreply.github.com> Date: Tue, 26 Nov 2024 19:20:00 -0600 Subject: [PATCH 10/10] LAPPDProcessedAna (#309) --- configfiles/LAPPDProcessedAna/ConfigGeo | 11 ++ configfiles/LAPPDProcessedAna/ConfigPlot | 136 ++++++++++++++++++ .../LAPPDProcessedAna/ConfigPreProcess | 67 +++++++++ .../LAPPDProcessedAna/ConfigStoreReadIn | 42 ++++++ configfiles/LAPPDProcessedAna/ConfigTXT | 72 ++++++++++ configfiles/LAPPDProcessedAna/Configs | 72 ++++++++++ .../LAPPDProcessedAna/FindMrdTracksConfig | 12 ++ .../LAPPDProcessedAna/LoadANNIEEventConfig | 6 + .../ProcessedLAPPDFilterConfig | 1 + .../LAPPDProcessedAna/TimeClusteringConfig | 13 ++ configfiles/LAPPDProcessedAna/ToolChainConfig | 24 ++++ configfiles/LAPPDProcessedAna/ToolsConfig | 16 +++ configfiles/LAPPDProcessedAna/knownlist | 1 + configfiles/LAPPDProcessedAna/list.txt | 15 ++ 14 files changed, 488 insertions(+) create mode 100644 configfiles/LAPPDProcessedAna/ConfigGeo create mode 100755 configfiles/LAPPDProcessedAna/ConfigPlot create mode 100755 configfiles/LAPPDProcessedAna/ConfigPreProcess create mode 100755 configfiles/LAPPDProcessedAna/ConfigStoreReadIn create mode 100644 configfiles/LAPPDProcessedAna/ConfigTXT create mode 100644 configfiles/LAPPDProcessedAna/Configs create mode 100644 configfiles/LAPPDProcessedAna/FindMrdTracksConfig create mode 100644 configfiles/LAPPDProcessedAna/LoadANNIEEventConfig create mode 100644 configfiles/LAPPDProcessedAna/ProcessedLAPPDFilterConfig create mode 100644 configfiles/LAPPDProcessedAna/TimeClusteringConfig create mode 100644 configfiles/LAPPDProcessedAna/ToolChainConfig create mode 100644 configfiles/LAPPDProcessedAna/ToolsConfig create mode 100644 configfiles/LAPPDProcessedAna/knownlist create mode 100644 configfiles/LAPPDProcessedAna/list.txt diff --git a/configfiles/LAPPDProcessedAna/ConfigGeo b/configfiles/LAPPDProcessedAna/ConfigGeo new file mode 100644 index 000000000..ffe0ca918 --- /dev/null +++ b/configfiles/LAPPDProcessedAna/ConfigGeo @@ -0,0 +1,11 @@ +#LoadGeometry +verbosity 0 +LAPPDChannelCount 60 +FACCMRDGeoFile ./configfiles/LoadGeometry/FullMRDGeometry.csv +DetectorGeoFile ./configfiles/LoadGeometry/DetectorGeometrySpecs.csv +LAPPDGeoFile ./configfiles/LAPPDana/LAPPDGeometry.csv +TankPMTGeoFile ./configfiles/LoadGeometry/FullTankPMTGeometry.csv +TankPMTGainFile ./configfiles/LoadGeometry/ChannelSPEGains_BeamRun20192020.csv +AuxiliaryChannelFile ./configfiles/LoadGeometry/AuxChannels.csv +LAPPDMerging 0 + diff --git a/configfiles/LAPPDProcessedAna/ConfigPlot b/configfiles/LAPPDProcessedAna/ConfigPlot new file mode 100755 index 000000000..5156f6b55 --- /dev/null +++ b/configfiles/LAPPDProcessedAna/ConfigPlot @@ -0,0 +1,136 @@ +oldLaser 0 #1 for old data, 0 for new trigger boards + +#LAPPDBaselineSubtract +BLSInputWavLabel AlignedLAPPDData +BaselineSubstractVerbosityLevel 0 +TrigChannel 5 #Specified channel the trigger signal will be on +LAPPDchannelOffset 1000 +LowBLfitrange 25; +HiBLfitrange 60; +TrigLowBLfitrange 30 +TrigHiBLfitrange 100 +BLSOutputWavLabel ABLSLAPPDData +oldLaserTrigAmpRange 40 + +#LAPPDFindPeak +FindPeakVerbosity 0 +FiltPeakInputWavLabel FiltLAPPDData +RawPeakInputWavLabel LAPPDWaveforms +BLSPeakInputWavLabel ABLSLAPPDData +FindPeakOutLabel SimpleRecoLAPPDPulses +TotThreshold 7. +MinimumTot 900. +Deltat 100. + +# General Parameters +Nsamples 256 +SampleSize 100 +NChannels 60 + +#LAPPDPlotWaveForms +requireT0signal 0 +SaveByChannel 1 +#PlotWavLabel RawLAPPDData +#PlotWavLabel LAPPDWaveforms +PlotWavLabel BLsubtractedLAPPDData +#PlotWavLabel AlignedLAPPDData +switchBit 0 + +outfile WaveForms_ablsub.root +NHistos 200 +SaveSingleStrip 0 +SingleStripNo 9 +plotLow -10 +plotHigh 20 + +#LAPPDPlotWaveForms2D +outfile2D RawDataWaveForms_2D.root +plot2DrecoPulseInputLabel thresRecoLAPPDPulses +plot2DrecoHitInputLabel thresRecoLAPPDHits +includeRecoPulses 1 +includeRecoHits 1 +plotAdditionalPart 1 +titleSize 0.04 +canvasMargin 0.15 +canvasTitleOffset 1 +#LAPPDSelectPlot2D +LAPPDSelectPlotWaveform2DLabel LAPPDWaveforms +SelectOutfile2D LAPPDSelectPlot.root +MRDTrackExistSelection 0 +verbosityPlot2D 10 +colorContour 255 +useDefaultPalette 1 +colorPalette 112 + + + +#LAPPDThresReco +LAPPDThresRecoVerbosity 0 +verbosity 0 +printHitsTXT 0 +threshold 10 +minPulseWidth 5 +#thresRecoInputWaveLabel AlignedLAPPDData +ThresRecoInputWaveLabel BLsubtractedLAPPDData +#thresRecoInputWaveLabel LAPPDWaveforms + +ThresRecoOutputPulseLabel LAPPDPulses +ThresRecoOutputHitLabel LAPPDHits +useMaxTime 1 # 1: use max bin as pulse time, 0: use gaus fit bin as pulse peak time +#signalSpeedOnStrip 0.6667 +signalSpeedOnStrip 0.567 #1.69982/2.99792 +triggerBoardDelay 0 +loadPrintMRDinfo 0 +useRange 0 #set this to 0 for using pulse start time as the saved pulse time, 1 for high, -1 for using peak time +plusClockBit 0 + +savePositionOnStrip 1 +LoadLAPPDMapInfo 1 + +#LAPPDStackStrip +verbosityStackStrip 0 +StackOutputFileName stacked.root +#StackInputWaveLabel BLsubtractedLAPPDData +StackInputWaveLabel RawLAPPDData +#StackInputWaveLabel LAPPDWaveforms +StackStripNumber 1 +StackStripSide 0 + +#LAPPDPlotWaveForms +NHistos 200 +SaveByChannel 0 +SaveSingleStrip 0 +SingleStripNo 1 +requireT0signal 0 + + +#LAPPDTreeMaker +treeMakerVerbosity 0 +treeMakerInputPulseLabel LAPPDPulses +treeMakerInputHitLabel LAPPDHits +treeMakerOutputFileName LAPPDTree.root + + +#LAPPDPlots +LAPPDPlotInputWaveLabel BLsubtractedLAPPDData +#LAPPDPlotInputWaveLabel LAPPDWaveforms +#LAPPDPlotInputWaveLabel AlignedLAPPDData +#LAPPDPlotInputWaveLabel RawLAPPDData +LAPPDPlotsVerbosity 0 +CanvasXSubPlotNumber 2 +CanvasYSubPlotNumber 2 +canvasMargin 0.1 +drawHighThreshold 50 +drawLowThreshold -20 + +CanvasWidth 1000 +CanvasHeight 500 + +maxDrawEventNumber 200 + +DrawBinHist 1 +printEventNumber 0 +printLAPPDNumber 1 +printEventWaveform 1 + +LoadLAPPDMap 1 diff --git a/configfiles/LAPPDProcessedAna/ConfigPreProcess b/configfiles/LAPPDProcessedAna/ConfigPreProcess new file mode 100755 index 000000000..c1a0a8830 --- /dev/null +++ b/configfiles/LAPPDProcessedAna/ConfigPreProcess @@ -0,0 +1,67 @@ +# General Parameters +Nsamples 256 #Number of samples in a waveform +SampleSize 100 #Sample size for baseline substraction +TrigChannel 5 #Specified channel the trigger signal will be on +LAPPDchannelOffset 1000 +Folder ../Data/3655/ +#Folder ../Data/2022-06-10/ + +#LAPPDBaselineSubtract +BaselineSubstractVerbosityLevel 0 +TrigChannel1 1005 +TrigChannel2 1035 +#BLSInputWavLabel LAPPDWaveforms #LAPPDWaveforms +BLSInputWavLabel AlignedLAPPDData +#BLSInputWavLabel RawLAPPDData + +LowBLfitrange 0 +HiBLfitrange 60 +TrigLowBLfitrange 110 +TrigHiBLfitrange 160 +BLSOutputWavLabel BLsubtractedLAPPDData +oldLaserTrigAmpRange 40 + +#LAPPDFindT0 +FindT0Verbosity 0 +#FindT0InputWavLabel BLsubtractedLAPPDData +#FindT0InputWavLabel RawLAPPDData +FindT0InputWavLabel LAPPDWaveforms +OneBoardShift 0 +OneBoardShiftValue 16 +LoadLAPPDMap 1 + +TrigEarlyCut 20 +TrigLateCut 200 +T0channelNo 1005 +T0channelNo1 1005 +T0channelNo2 1005 +T0signalmax -100. +T0signalthreshold -50. +T0signalmaxOld 50. #Older data uses a positive going signal +T0signalthresholdOld 80. #Older data uses a positive going signal +T0offset 0 +FindT0OutputWavLabel AlignedLAPPDData +GlobalShiftT0 0 # for 2023 data +#GlobalShiftT0 80 # for 2024 data + +#Added by Marc +Triggerdefault 5 +LAPPDOffset 1000 + +#LAPPDPlotWaveForms +requireT0signal 0 +SaveByChannel 1 +PlotWavLabel BLsubtractedLAPPDData +#PlotWavLabel LAPPDWaveforms +outfile WaveForms_rawblsub.root +NHistos 400 +SaveSingleStrip 0 +SingleStripNo 9 + + + + + + + + diff --git a/configfiles/LAPPDProcessedAna/ConfigStoreReadIn b/configfiles/LAPPDProcessedAna/ConfigStoreReadIn new file mode 100755 index 000000000..79f2d2fa7 --- /dev/null +++ b/configfiles/LAPPDProcessedAna/ConfigStoreReadIn @@ -0,0 +1,42 @@ +# General Parameters +Nsamples 256 #Number of samples in a waveform +SampleSize 100 #Sample size for baseline substraction +TrigChannel 5 #Specified channel the trigger signal will be on +NUM_VECTOR_PPS 16 #Fixed PPS vector size +NUM_VECTOR_DATA 7795 #Fixed DATA vector size +NUM_VECTOR_METADATA 103 #Fixed META vector size +LAPPDchannelOffset 1000 +NChannels 30 +#StoreInputFile /pnfs/annie/persistent/users/redwards/data/filtered_lappd/R3649-R3844/LAPPDEventsBeamgateMRDTrack/FilteredEvents_LAPPDEventsBeamgateMRDTrack_R3649-R3844 + +LAPPDStoreReadInVerbosity 0 + +RawDataInputWavLabel RawWaveform +RawDataOutputWavLabel RawLAPPDData +BoardIndexLabel BoardIndex #Label of the vector of read out boards + +PsecReceiveMode 1 +stopEntries 10000000000 + +DoPedSubtraction 1 +Nboards 6 #Number of pedestal files to be read in +PedinputfileTXT ../Pedestals/swapLAPPD/Pedestal +#PedinputfileTXT ../Pedestals/change/Pedestal + +Pedinputfile1 ../Pedestals/PEDS_ACDC_board0.txt +Pedinputfile2 ../Pedestals/PEDS_ACDC_board1.txt + +#LAPPDReorderData +LAPPDReorderVerbosityLevel 0 +ReorderInputWavLabel RawLAPPDData +ReorderOutputWavLabel LAPPDWaveforms +DelayOffset 0 +GlobalShift 0 + +ReadStore 0 +NUM_VECTOR_DATA 7795 +NUM_VECTOR_PPS 16 +OutputWavLabel RawLAPPDData +SelectSingleLAPPD false +SelectedLAPPD 0 +LoadLAPPDMap 1 diff --git a/configfiles/LAPPDProcessedAna/ConfigTXT b/configfiles/LAPPDProcessedAna/ConfigTXT new file mode 100644 index 000000000..a982c4278 --- /dev/null +++ b/configfiles/LAPPDProcessedAna/ConfigTXT @@ -0,0 +1,72 @@ +#General Parameters +Nsamples 256 #Number of samples in a waveform +SampleSize 100 #Sample size for baseline substraction +TrigChannel 5 #Specified channel the trigger signal will be on +NUM_VECTOR_PPS 16 #Fixed PPS vector size +NUM_VECTOR_DATA 7795 #Fixed DATA vector size +NUM_VECTOR_METADATA 103 #Fixed META vector size +LAPPDchannelOffset 1000 +NChannels 30 + +LAPPDStoreReadInVerbosity 0 + +mergingModeReadIn 0 +RawDataInputWavLabel RawWaveform +RawDataOutputWavLabel RawLAPPDData +BoardIndexLabel BoardIndex #Label of the vector of read out boards + +PsecReceiveMode 0 +MultiLAPPDMap 1 +stopEntries 10000000000 + +DoPedSubtraction 1 +Nboards 6 #Number of pedestal files to be read in +#PedinputfileTXT ../Pedestals/LAPPD645839/P +PedinputfileTXT ../Pedestals/LAPPD40/P + +PSECinputfile /pnfs/annie/persistent/processed/LAPPD40Merged/FinalVersion_withRawTS/FilteredData_PMT_MRDtrack_noveto_15mV_7strips_3xxx_104 + +ReadStorePdeFile 0 +loadFromStoreDirectly 0 + +Pedinputfile1 ../Pedestals/PEDS_ACDC_board0.txt +Pedinputfile2 ../Pedestals/PEDS_ACDC_board1.txt + +#LAPPDReorderData +ReorderVerbosityLevel 0 +#ReorderInputWavLabel RawLAPPDData +ReorderInputWavLabel AlignedLAPPDData +ReorderOutputWavLabel LAPPDWaveforms +DelayOffset 0 +GlobalShift 180 + +ReadStore 0 +NUM_VECTOR_DATA 7795 +NUM_VECTOR_PPS 16 +OutputWavLabel RawLAPPDData +SelectSingleLAPPD false +SelectedLAPPD 0 +loadPSEC 1 +loadPPS 0 +loadOffsets 0 +LoadBuiltPPSInfo 1 +num_vector_data 7795 +num_vector_pps 16 + +#LAPPDTreeMaker +LoadPulse 1 +LoadHit 1 +LoadWaveform 1 +LoadLAPPDDataTimeStamp 1 +LoadPPSTimestamp 0 +LoadRunInfoRaw 0 +LoadRunInfoANNIEEvent 1 + +treeMakerVerbosity 0 +MultiLAPPDMapTreeMaker 1 +treeMakerInputPulseLabel LAPPDPulses +treeMakerInputHitLabel LAPPDHits +treeMakerOutputFileName LAPPDTree_processedAna.root +LoadTriggerInfo 0 +LoadGroupOption beam +LoadGroupedTriggerInfo 1 diff --git a/configfiles/LAPPDProcessedAna/Configs b/configfiles/LAPPDProcessedAna/Configs new file mode 100644 index 000000000..e8ad7c851 --- /dev/null +++ b/configfiles/LAPPDProcessedAna/Configs @@ -0,0 +1,72 @@ +#General Parameters +Nsamples 256 #Number of samples in a waveform +SampleSize 100 #Sample size for baseline substraction +TrigChannel 5 #Specified channel the trigger signal will be on +NUM_VECTOR_PPS 16 #Fixed PPS vector size +NUM_VECTOR_DATA 7795 #Fixed DATA vector size +NUM_VECTOR_METADATA 103 #Fixed META vector size +LAPPDchannelOffset 1000 +NChannels 30 + +LAPPDStoreReadInVerbosity 0 + +mergingModeReadIn 0 +RawDataInputWavLabel RawWaveform +RawDataOutputWavLabel RawLAPPDData +BoardIndexLabel BoardIndex #Label of the vector of read out boards + +PsecReceiveMode 0 +MultiLAPPDMap 1 +stopEntries 10000000000 + +DoPedSubtraction 1 +Nboards 6 #Number of pedestal files to be read in +#PedinputfileTXT ../Pedestals/LAPPD645839/P +#PedinputfileTXT ../Pedestals/LAPPD40/P +PedinputfileTXT /pnfs/annie/persistent/processed/processed_EBV2_LAPPDFiltered/Pedestal/2022_LAPPD40/P + + +ReadStorePdeFile 0 +loadFromStoreDirectly 0 + +Pedinputfile1 ../Pedestals/PEDS_ACDC_board0.txt +Pedinputfile2 ../Pedestals/PEDS_ACDC_board1.txt + +#LAPPDReorderData +ReorderVerbosityLevel 0 +#ReorderInputWavLabel RawLAPPDData +ReorderInputWavLabel AlignedLAPPDData +ReorderOutputWavLabel LAPPDWaveforms +DelayOffset 0 +GlobalShift 180 + +ReadStore 0 +NUM_VECTOR_DATA 7795 +NUM_VECTOR_PPS 16 +OutputWavLabel RawLAPPDData +SelectSingleLAPPD false +SelectedLAPPD 0 +loadPSEC 1 +loadPPS 0 +loadOffsets 0 +LoadBuiltPPSInfo 1 +num_vector_data 7795 +num_vector_pps 16 + +#LAPPDTreeMaker +LoadPulse 1 +LoadHit 1 +LoadWaveform 1 +LoadLAPPDDataTimeStamp 1 +LoadPPSTimestamp 0 +LoadRunInfoRaw 0 +LoadRunInfoANNIEEvent 1 + +treeMakerVerbosity 0 +MultiLAPPDMapTreeMaker 1 +treeMakerInputPulseLabel LAPPDPulses +treeMakerInputHitLabel LAPPDHits +treeMakerOutputFileName LAPPDTree_processedAna.root +LoadTriggerInfo 0 +LoadGroupOption beam +LoadGroupedTriggerInfo 1 diff --git a/configfiles/LAPPDProcessedAna/FindMrdTracksConfig b/configfiles/LAPPDProcessedAna/FindMrdTracksConfig new file mode 100644 index 000000000..5ba5e8f77 --- /dev/null +++ b/configfiles/LAPPDProcessedAna/FindMrdTracksConfig @@ -0,0 +1,12 @@ +# FindMrdTracks Config File +# all variables retrieved with m_variables.Get() must be defined here! + +verbosity 0 +IsData 1 +OutputDirectory . +OutputFile STEC_MRDTracks_cluster40ns +DrawTruthTracks 0 # whether to add MC Truth track info for drawing in MrdPaddlePlot Tool + ## note you need to run that tool to actually view the tracks! +WriteTracksToFile 0 # should the track information be written to a ROOT-file? +SelectTriggerType 0 #should the loaded data be filtered by trigger type? +TriggerType Beam #options: Cosmic, Beam, No Loopback diff --git a/configfiles/LAPPDProcessedAna/LoadANNIEEventConfig b/configfiles/LAPPDProcessedAna/LoadANNIEEventConfig new file mode 100644 index 000000000..b7330eecc --- /dev/null +++ b/configfiles/LAPPDProcessedAna/LoadANNIEEventConfig @@ -0,0 +1,6 @@ +verbose 1 + +FileForListOfInputs configfiles/LAPPDProcessedAna/list.txt + +EventOffset 0 +GlobalEvNr 1 diff --git a/configfiles/LAPPDProcessedAna/ProcessedLAPPDFilterConfig b/configfiles/LAPPDProcessedAna/ProcessedLAPPDFilterConfig new file mode 100644 index 000000000..752200268 --- /dev/null +++ b/configfiles/LAPPDProcessedAna/ProcessedLAPPDFilterConfig @@ -0,0 +1 @@ +verbosity 0 diff --git a/configfiles/LAPPDProcessedAna/TimeClusteringConfig b/configfiles/LAPPDProcessedAna/TimeClusteringConfig new file mode 100644 index 000000000..e778247fc --- /dev/null +++ b/configfiles/LAPPDProcessedAna/TimeClusteringConfig @@ -0,0 +1,13 @@ +#TimeClustering config file + +verbosity 0 +MinDigitsForTrack 3 +MaxMrdSubEventDuration 30 +MinSubeventTimeSep 30 +MakeMrdDigitTimePlot 0 +LaunchTApplication 0 +IsData 1 +#OutputROOTFile TimeClustering_MRDTest28_cluster40ns +OutputROOTFile STEC_TimeClusteringOut +MapChankey_WCSimID ./configfiles/SimpleTankEnergyCalibrator/MRD_Chankey_WCSimID.dat + diff --git a/configfiles/LAPPDProcessedAna/ToolChainConfig b/configfiles/LAPPDProcessedAna/ToolChainConfig new file mode 100644 index 000000000..3c8060cf1 --- /dev/null +++ b/configfiles/LAPPDProcessedAna/ToolChainConfig @@ -0,0 +1,24 @@ + +#ToollChain dynamic setup file + +##### Runtime Paramiters ##### +verbose 1 ## Verbosity level of ToolChain +error_level 0 # 0= do not exit, 1= exit on unhandeled errors only, 2= exit on unhandeled errors and handeled errors +attempt_recover 1 ## 1= will attempt to finalise if an execute fails + +###### Logging ##### +log_mode Interactive # Interactive=cout , Remote= remote logging system "serservice_name Remote_Logging" , Local = local file log; +log_local_path ./log +log_service LogStore + +###### Service discovery ##### Ignore these settings for local analysis +service_publish_sec -1 +service_kick_sec -1 + +##### Tools To Add ##### +Tools_File configfiles/LAPPDProcessedAna/ToolsConfig ## list of tools to run and their config files + +##### Run Type ##### +Inline 20 ## number of Execute steps in program, -1 infinite loop that is ended by user +Interactive 0 ## set to 1 if you want to run the code interactively + diff --git a/configfiles/LAPPDProcessedAna/ToolsConfig b/configfiles/LAPPDProcessedAna/ToolsConfig new file mode 100644 index 000000000..3af77fe8a --- /dev/null +++ b/configfiles/LAPPDProcessedAna/ToolsConfig @@ -0,0 +1,16 @@ +LoadANNIEEvent LoadANNIEEvent configfiles/LAPPDProcessedAna/LoadANNIEEventConfig +LoadGeometry LoadGeometry configfiles/LoadGeometry/LoadGeometryConfig + +myTimeClustering TimeClustering configfiles/LAPPDProcessedAna/TimeClusteringConfig +myFindMrdTracks FindMrdTracks configfiles/LAPPDProcessedAna/FindMrdTracksConfig + +LAPPDLoadStore LAPPDLoadStore configfiles/LAPPDProcessedAna/Configs +LAPPDStoreReorder LAPPDStoreReorder configfiles/LAPPDProcessedAna/ConfigStoreReadIn + +LAPPDTimeAlignment LAPPDTimeAlignment configfiles/LAPPDProcessedAna/ConfigPreProcess +LAPPDBaseline LAPPDBaseline configfiles/LAPPDProcessedAna/ConfigPreProcess +LAPPDPlots LAPPDPlots configfiles/LAPPDProcessedAna/ConfigPlot + +LAPPDThresReco LAPPDThresReco configfiles/LAPPDProcessedAna/ConfigPlot + +LAPPDTreeMaker LAPPDTreeMaker configfiles/LAPPDProcessedAna/Configs diff --git a/configfiles/LAPPDProcessedAna/knownlist b/configfiles/LAPPDProcessedAna/knownlist new file mode 100644 index 000000000..22c51f858 --- /dev/null +++ b/configfiles/LAPPDProcessedAna/knownlist @@ -0,0 +1 @@ +/pnfs/annie/persistent/users/yuefeng/EventBuildingV2/output/4843/ProcessedData_PMTMRDLAPPD_R4843S0p5 diff --git a/configfiles/LAPPDProcessedAna/list.txt b/configfiles/LAPPDProcessedAna/list.txt new file mode 100644 index 000000000..8894dadb6 --- /dev/null +++ b/configfiles/LAPPDProcessedAna/list.txt @@ -0,0 +1,15 @@ +/pnfs/annie/persistent/processed/processed_EBV2_LAPPDFiltered/2023_LAPPD40/AllLAPPD/FilteredAllLAPPDData_4200_0_106 +/pnfs/annie/persistent/processed/processed_EBV2_LAPPDFiltered/2023_LAPPD40/AllLAPPD/FilteredAllLAPPDData_4208_0_15 +/pnfs/annie/persistent/processed/processed_EBV2_LAPPDFiltered/2023_LAPPD40/AllLAPPD/FilteredAllLAPPDData_4210_0_275 +/pnfs/annie/persistent/processed/processed_EBV2_LAPPDFiltered/2023_LAPPD40/AllLAPPD/FilteredAllLAPPDData_4213_0_499 +/pnfs/annie/persistent/processed/processed_EBV2_LAPPDFiltered/2023_LAPPD40/AllLAPPD/FilteredAllLAPPDData_4213_500_903 +/pnfs/annie/persistent/processed/processed_EBV2_LAPPDFiltered/2023_LAPPD40/AllLAPPD/FilteredAllLAPPDData_4215_0_42 +/pnfs/annie/persistent/processed/processed_EBV2_LAPPDFiltered/2023_LAPPD40/AllLAPPD/FilteredAllLAPPDData_4217_0_499 +/pnfs/annie/persistent/processed/processed_EBV2_LAPPDFiltered/2023_LAPPD40/AllLAPPD/FilteredAllLAPPDData_4217_500_507 +/pnfs/annie/persistent/processed/processed_EBV2_LAPPDFiltered/2023_LAPPD40/AllLAPPD/FilteredAllLAPPDData_4218_0_262 +/pnfs/annie/persistent/processed/processed_EBV2_LAPPDFiltered/2023_LAPPD40/AllLAPPD/FilteredAllLAPPDData_4222_0_381 +/pnfs/annie/persistent/processed/processed_EBV2_LAPPDFiltered/2023_LAPPD40/AllLAPPD/FilteredAllLAPPDData_4223_0_499 +/pnfs/annie/persistent/processed/processed_EBV2_LAPPDFiltered/2023_LAPPD40/AllLAPPD/FilteredAllLAPPDData_4223_500_870 +/pnfs/annie/persistent/processed/processed_EBV2_LAPPDFiltered/2023_LAPPD40/AllLAPPD/FilteredAllLAPPDData_4224_0_337 +/pnfs/annie/persistent/processed/processed_EBV2_LAPPDFiltered/2023_LAPPD40/AllLAPPD/FilteredAllLAPPDData_4228_0_175 +/pnfs/annie/persistent/processed/processed_EBV2_LAPPDFiltered/2023_LAPPD40/AllLAPPD/FilteredAllLAPPDData_4229_0_345