diff --git a/CMakeLists.txt b/CMakeLists.txt index 11b47e546..f08ed4591 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,10 +17,10 @@ cmake_minimum_required(VERSION 3.20 FATAL_ERROR) # cmake_policy(VERSION 3.19) find_package(cetmodules 3.24.01 REQUIRED) -#project(icaruscode VERSION 10.06.00.01 LANGUAGES CXX) +project(icaruscode VERSION 10.06.00.04 LANGUAGES CXX) -set(${PROJECT_NAME}_CMAKE_PROJECT_VERSION_STRING 10.06.00.01-p03) -project(icaruscode LANGUAGES CXX) +#set(${PROJECT_NAME}_CMAKE_PROJECT_VERSION_STRING 10.06.00.01-p05) +#project(icaruscode LANGUAGES CXX) message(STATUS "\n-- =============================================================================" diff --git a/fcl/caf/cafmaker_add_detsim2d_icarus.fcl b/fcl/caf/cafmaker_add_detsim2d_icarus.fcl index 005c164a6..11c7f0aba 100644 --- a/fcl/caf/cafmaker_add_detsim2d_icarus.fcl +++ b/fcl/caf/cafmaker_add_detsim2d_icarus.fcl @@ -4,12 +4,6 @@ physics.producers.cafmaker.SimChannelLabel: "merge" # 2D, YZ sim # SimChannel's get re-made by 2D drift simulation -- use these to backtrack services.BackTrackerService.BackTracker.SimChannelModuleLabel: "merge" -# MCReco also needs correct SimChannels -# need to use new config names to make MCParticle/SimChannel labels different -physics.producers.mcreco.G4ModName: @erase -physics.producers.mcreco.MCParticleLabel: "largeant" -physics.producers.mcreco.SimChannelLabel: "merge" - # Mini production, pre signal shape tuning # this_cal_constants: [1.343e-2, 1.338e-2, 0.01227] # Post signal shape tuning, post gain fixing diff --git a/fcl/caf/cafmaker_add_overlay_icarus.fcl b/fcl/caf/cafmaker_add_overlay_icarus.fcl new file mode 100644 index 000000000..fda521683 --- /dev/null +++ b/fcl/caf/cafmaker_add_overlay_icarus.fcl @@ -0,0 +1,4 @@ +services.BackTrackerService.BackTracker.OverrideRealData: true +services.ParticleInventoryService.ParticleInventory.OverrideRealData: true + +physics.producers.cafmaker.OverrideRealData: true diff --git a/fcl/caf/cafmaker_defs.fcl b/fcl/caf/cafmaker_defs.fcl index 50de910f3..feadf4f0d 100644 --- a/fcl/caf/cafmaker_defs.fcl +++ b/fcl/caf/cafmaker_defs.fcl @@ -14,7 +14,6 @@ #include "eventweight_genie_sbn.fcl" #include "eventweight_genie_systtools.fcl" #include "eventweight_flux_sbn.fcl" -#include "mcreco.fcl" #include "mcsproducer.fcl" #include "rangeproducer.fcl" #include "flashmatch_simple_icarus.fcl" @@ -87,8 +86,6 @@ recoana_datacalo_producers.vertexStubCryoW.NormTools: @local::icarus_calonormtoo # Producers for making analysis level products recoana_caf_preprocess_producers: { - mcreco: @local::standard_mcreco - pandoraTrackMCSCryoE: @local::mcs_sbn pandoraTrackMCSCryoW: @local::mcs_sbn @@ -228,7 +225,7 @@ caf_preprocess_sce_producers: { } # Sequences -caf_preprocess_sequence: [ mcreco, +caf_preprocess_sequence: [ # Calorimetry pandoraCaloGausCryoE, pandoraCaloGausCryoW, pandoraPidGausCryoE, pandoraPidGausCryoW, @@ -258,7 +255,7 @@ caf_preprocess_data_sequence: [ caf_preprocess_evtw_sequence: [@sequence::caf_preprocess_sequence, rns, genieweight, fluxweight] -caf_preprocess_sce_sequence: [ mcreco, +caf_preprocess_sce_sequence: [ # Run the SCE correction pandoraGausSCECryoE, pandoraGausSCECryoW, # Then remake tracks diff --git a/fcl/caf/cafmakerjob_icarus_detsim2d_overlay.fcl b/fcl/caf/cafmakerjob_icarus_detsim2d_overlay.fcl index 171ce0b0b..f8d4e8652 100644 --- a/fcl/caf/cafmakerjob_icarus_detsim2d_overlay.fcl +++ b/fcl/caf/cafmakerjob_icarus_detsim2d_overlay.fcl @@ -1,7 +1,8 @@ #include "cafmakerjob_icarus.fcl" -#include "cafmaker_add_detsim2d_icarus.fcl" -services.BackTrackerService.BackTracker.OverrideRealData: true -services.ParticleInventoryService.ParticleInventory.OverrideRealData: true +# overwrite the producers to use data versions +physics.producers: @local::caf_preprocess_data_producers +physics.runprod: [ @sequence::caf_preprocess_data_sequence, cafmaker] -physics.producers.cafmaker.OverrideRealData: true +#include "cafmaker_add_detsim2d_icarus.fcl" +#include "cafmaker_add_overlay_icarus.fcl" diff --git a/fcl/caf/cafmakerjob_icarus_detsim2d_overlay_simpledet.fcl b/fcl/caf/cafmakerjob_icarus_detsim2d_overlay_simpledet.fcl new file mode 100644 index 000000000..fe75e0903 --- /dev/null +++ b/fcl/caf/cafmakerjob_icarus_detsim2d_overlay_simpledet.fcl @@ -0,0 +1,4 @@ +#include "cafmakerjob_icarus_detsim2d_overlay.fcl" + +physics.producers.cafmaker.SimChannelLabel: "daq:simpleSC" +services.BackTrackerService.BackTracker.SimChannelModuleLabel: "daq:simpleSC" diff --git a/fcl/caf/cafmakerjob_icarus_detsim2d_simpledet.fcl b/fcl/caf/cafmakerjob_icarus_detsim2d_simpledet.fcl new file mode 100644 index 000000000..1c8b09582 --- /dev/null +++ b/fcl/caf/cafmakerjob_icarus_detsim2d_simpledet.fcl @@ -0,0 +1,4 @@ +#include "cafmakerjob_icarus_detsim2d.fcl" + +physics.producers.cafmaker.SimChannelLabel: "daq:simpleSC" +services.BackTrackerService.BackTracker.SimChannelModuleLabel: "daq:simpleSC" diff --git a/fcl/caf/cafmakerjob_icarus_detsim2d_systtools_and_fluxwgt_overlay.fcl b/fcl/caf/cafmakerjob_icarus_detsim2d_systtools_and_fluxwgt_overlay.fcl index ded9909e6..8577537b5 100644 --- a/fcl/caf/cafmakerjob_icarus_detsim2d_systtools_and_fluxwgt_overlay.fcl +++ b/fcl/caf/cafmakerjob_icarus_detsim2d_systtools_and_fluxwgt_overlay.fcl @@ -1,5 +1,10 @@ #include "cafmakerjob_icarus_detsim2d_systtools_and_fluxwgt.fcl" -services.BackTrackerService.BackTracker.OverrideRealData: true -services.ParticleInventoryService.ParticleInventory.OverrideRealData: true -physics.producers.cafmaker.OverrideRealData: true +# overwrite the producers to use data versions +physics.producers: @local::caf_preprocess_data_producers +physics.runprod: [ @sequence::caf_preprocess_data_sequence, rns, systtools, fluxweight, cafmaker] + +physics.producers.cafmaker.SystWeightLabels: ["systtools", "fluxweight"] + + +#include "cafmaker_add_overlay_icarus.fcl" diff --git a/fcl/configurations/calibration_database_GlobalTags_icarus.fcl b/fcl/configurations/calibration_database_GlobalTags_icarus.fcl index 5d080878d..03f5d89a5 100644 --- a/fcl/configurations/calibration_database_GlobalTags_icarus.fcl +++ b/fcl/configurations/calibration_database_GlobalTags_icarus.fcl @@ -5,7 +5,7 @@ BEGIN_PROLOG ICARUS_Calibration_GlobalTags: { - @table::TPC_CalibrationTags_Jan2025 + @table::TPC_CalibrationTags_Jul2025 @table::PMT_CalibrationTags_Run3_Feb2025 @table::CRT_CalibrationTags_Oct2023 } diff --git a/fcl/configurations/calibration_database_TPC_TagSets_icarus.fcl b/fcl/configurations/calibration_database_TPC_TagSets_icarus.fcl index 828e8d8a3..99d15c020 100644 --- a/fcl/configurations/calibration_database_TPC_TagSets_icarus.fcl +++ b/fcl/configurations/calibration_database_TPC_TagSets_icarus.fcl @@ -37,4 +37,15 @@ TPC_CalibrationTags_Jan2025: { } +## TPC_CalibrationTags_Jul2024 +# Update to 2D deconv tags. Change TPC equalization to be per-plane +TPC_CalibrationTags_Jul2025: { + + tpc_channelstatus_data: "v3r4" + tpc_elifetime_data: "v3r0" + tpc_dqdxcalibration_allplanes_data: "v1r0" + tpc_yz_correction_allplanes_data: "v2r0" + +} + END_PROLOG diff --git a/fcl/detsim/detsim_2d_icarus_refactored.fcl b/fcl/detsim/detsim_2d_icarus_refactored.fcl index 993ce8586..799170d15 100644 --- a/fcl/detsim/detsim_2d_icarus_refactored.fcl +++ b/fcl/detsim/detsim_2d_icarus_refactored.fcl @@ -19,7 +19,7 @@ physics: { crtdaq: @local::icarus_crtsim opdaq: @local::icarus_simpmt - daq: @local::icarus_simwire_wirecell_filtersed + daq: @local::icarus_simwire_wirecell_shifted rns: { module_type: "RandomNumberSaver" } } # producers diff --git a/fcl/detsim/detsim_2d_icarus_refactored_overlay.fcl b/fcl/detsim/detsim_2d_icarus_refactored_overlay.fcl new file mode 100644 index 000000000..bf9754683 --- /dev/null +++ b/fcl/detsim/detsim_2d_icarus_refactored_overlay.fcl @@ -0,0 +1,3 @@ +#include "detsim_2d_icarus_refactored.fcl" + +physics.producers.daq: @local::icarus_simwire_wirecell_shifted_overlay diff --git a/fcl/reco/CMakeLists.txt b/fcl/reco/CMakeLists.txt index de9682fc7..565e07219 100644 --- a/fcl/reco/CMakeLists.txt +++ b/fcl/reco/CMakeLists.txt @@ -13,6 +13,7 @@ add_subdirectory(ForCITests) #add_subdirectory(archive) add_subdirectory(Definitions) add_subdirectory(larcv) +add_subdirectory(wires) add_subdirectory(ntuple) add_subdirectory(Stage0) add_subdirectory(Stage1) diff --git a/fcl/reco/Definitions/enable_overlay_stage1.fcl b/fcl/reco/Definitions/enable_overlay_stage1.fcl index 71707c38e..8e1467116 100644 --- a/fcl/reco/Definitions/enable_overlay_stage1.fcl +++ b/fcl/reco/Definitions/enable_overlay_stage1.fcl @@ -12,3 +12,21 @@ physics.producers.crttrack.DataLabelHits: "overlayCRTHit" # overlay PMT waveforms physics.analyzers.simpleLightAna.OpDetWaveformLabels: ["overlayOpWaveforms"] + +# don't apply lifetime correction when calculating shower energy in data/overlay +applyLifetime: false +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[7].ApplyMCLifetimeCorrection: @local::applyLifetime +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[7].ApplyMCLifetimeCorrection: @local::applyLifetime +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[5].ApplyMCLifetimeCorrection: @local::applyLifetime +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[5].ApplyMCLifetimeCorrection: @local::applyLifetime +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[3].ApplyMCLifetimeCorrection: @local::applyLifetime +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[3].ApplyMCLifetimeCorrection: @local::applyLifetime + +# overlays need all the same norm tools as data +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[7].NormTools: @local::icarus_calonormtools +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[7].NormTools: @local::icarus_calonormtools +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[5].NormTools: @local::icarus_calonormtools +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[5].NormTools: @local::icarus_calonormtools +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[3].NormTools: @local::icarus_calonormtools +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[3].NormTools: @local::icarus_calonormtools + diff --git a/fcl/reco/Definitions/stage1_icarus_defs.fcl b/fcl/reco/Definitions/stage1_icarus_defs.fcl index 22b46744c..e053af3af 100644 --- a/fcl/reco/Definitions/stage1_icarus_defs.fcl +++ b/fcl/reco/Definitions/stage1_icarus_defs.fcl @@ -43,6 +43,10 @@ icarus_stage1_producers: cluster3DCryoW: @local::icarus_cluster3d cluster3DCryoE: @local::icarus_cluster3d + ### Hit combiner + combineHitsCryoE: @local::icarus_hitmerger_cryoE + combineHitsCryoW: @local::icarus_hitmerger_cryoW + ### pandora pandoraGausCryoW: @local::icarus_pandora pandoraTrackGausCryoW: @local::icarus_pandoraTrackCreation @@ -192,11 +196,17 @@ icarus_WestHits_TPC: [ gaushit1dTPCWW, gaushit1dTPCWE ] icarus_EastHits2d_TPC: [ gaushit2dTPCEW, - gaushit2dTPCEE + gaushit2dTPCEE, + combineHitsCryoE, + gaushitPT2dTPCEW, + gaushitPT2dTPCEE ] icarus_WestHits2d_TPC: [ gaushit2dTPCWW, - gaushit2dTPCWE + gaushit2dTPCWE, + combineHitsCryoW, + gaushitPT2dTPCWW, + gaushitPT2dTPCWE ] # Set up filtering of cluster3D hits by cryostat @@ -314,6 +324,16 @@ icarus_stage1_producers.gaushit2dTPCWW.HitFinderToolVec.CandidateHitsPlane1.RoiT icarus_stage1_producers.gaushit2dTPCWW.HitFinderToolVec.CandidateHitsPlane2.RoiThreshold: 5. icarus_stage1_producers.gaushit2dTPCWW.HitFilterAlg.MinPulseHeight: [3., 3., 3.] +# Setup version of hit finder's with Pulse Trains ("PT"s) enabled +icarus_stage1_producers.gaushitPT2dTPCEE: @local::icarus_stage1_producers.gaushit2dTPCEE +icarus_stage1_producers.gaushitPT2dTPCEE.LongMaxHits: [25, 25, 25] +icarus_stage1_producers.gaushitPT2dTPCEW: @local::icarus_stage1_producers.gaushit2dTPCEW +icarus_stage1_producers.gaushitPT2dTPCEW.LongMaxHits: [25, 25, 25] +icarus_stage1_producers.gaushitPT2dTPCWE: @local::icarus_stage1_producers.gaushit2dTPCWE +icarus_stage1_producers.gaushitPT2dTPCWE.LongMaxHits: [25, 25, 25] +icarus_stage1_producers.gaushitPT2dTPCWW: @local::icarus_stage1_producers.gaushit2dTPCWW +icarus_stage1_producers.gaushitPT2dTPCWW.LongMaxHits: [25, 25, 25] + ## Overrides for filtering of cluster3D hits icarus_stage1_filters.TPCHitFilterCryoW.HitDataLabelVec: ["cluster3DCryoW"] icarus_stage1_filters.TPCHitFilterCryoW.MaximumHits: 60000 @@ -323,7 +343,8 @@ icarus_stage1_filters.TPCHitFilterCryoE.MaximumHits: 60000 ## Definitions for running the 3D clustering by Cryostat icarus_stage1_producers.cluster3DCryoW.MakeSpacePointsOnly: true -icarus_stage1_producers.cluster3DCryoW.Hit3DBuilderAlg.HitFinderTagVec: ["gaushit2dTPCWW", "gaushit2dTPCWE"] +# use the "PT" (pulse train) hits as input to cluster3D +icarus_stage1_producers.cluster3DCryoW.Hit3DBuilderAlg.HitFinderTagVec: ["gaushitPT2dTPCWW", "gaushitPT2dTPCWE"] icarus_stage1_producers.cluster3DCryoW.Hit3DBuilderAlg.PulseHeightFraction: 0. #0.75 #0.25 icarus_stage1_producers.cluster3DCryoW.Hit3DBuilderAlg.PHLowSelection: 0. #4.0 # 20. icarus_stage1_producers.cluster3DCryoW.Hit3DBuilderAlg.MaxHitChiSquare: 1000000. @@ -331,7 +352,7 @@ icarus_stage1_producers.cluster3DCryoW.Hit3DBuilderAlg.MaxMythicalChiSquare: icarus_stage1_producers.cluster3DCryoW.Hit3DBuilderAlg.OutputHistograms: false icarus_stage1_producers.cluster3DCryoE.MakeSpacePointsOnly: true -icarus_stage1_producers.cluster3DCryoE.Hit3DBuilderAlg.HitFinderTagVec: ["gaushit2dTPCEW", "gaushit2dTPCEE"] +icarus_stage1_producers.cluster3DCryoE.Hit3DBuilderAlg.HitFinderTagVec: ["gaushitPT2dTPCEW", "gaushitPT2dTPCEE"] icarus_stage1_producers.cluster3DCryoE.Hit3DBuilderAlg.PulseHeightFraction: 0. #0.75 #0.25 icarus_stage1_producers.cluster3DCryoE.Hit3DBuilderAlg.PHLowSelection: 0. #4.0 # 20. icarus_stage1_producers.cluster3DCryoE.Hit3DBuilderAlg.MaxHitChiSquare: 1000000. @@ -339,13 +360,17 @@ icarus_stage1_producers.cluster3DCryoE.Hit3DBuilderAlg.MaxMythicalChiSquare: icarus_stage1_producers.cluster3DCryoE.Hit3DBuilderAlg.OutputHistograms: false ### Definitions for a pandora by cryostat -icarus_stage1_producers.pandoraGausCryoW.HitFinderModuleLabel: "cluster3DCryoW" +icarus_stage1_producers.pandoraGausCryoW.HitFinderModuleLabel: "combineHitsCryoW" +# icarus_stage1_producers.pandoraGausCryoW.HitFinderModuleLabel: "" +# icarus_stage1_producers.pandoraGausCryoW.HitCollectionTool.OverrhideHitLabels: ["gaushit2dTPCWW", "gaushit2dTPCWE"] icarus_stage1_producers.pandoraTrackGausCryoW.PFParticleLabel: "pandoraGausCryoW" icarus_stage1_producers.pandoraTrackGausCryoW.UseAllParticles: true icarus_stage1_producers.pandoraKalmanTrackGausCryoW.inputCollection: "pandoraGausCryoW" icarus_stage1_producers.pandoraKalmanTrackGausCryoW.trackInputTag: "pandoraTrackGausCryoW" -icarus_stage1_producers.pandoraGausCryoE.HitFinderModuleLabel: "cluster3DCryoE" +icarus_stage1_producers.pandoraGausCryoE.HitFinderModuleLabel: "combineHitsCryoE" +# icarus_stage1_producers.pandoraGausCryoE.HitFinderModuleLabel: "" +# icarus_stage1_producers.pandoraGausCryoE.HitCollectionTool.OverrhideHitLabels: ["gaushit2dTPCEW", "gaushit2dTPCEE"] icarus_stage1_producers.pandoraTrackGausCryoE.PFParticleLabel: "pandoraGausCryoE" icarus_stage1_producers.pandoraTrackGausCryoE.UseAllParticles: true icarus_stage1_producers.pandoraKalmanTrackGausCryoE.inputCollection: "pandoraGausCryoE" @@ -364,4 +389,28 @@ icarus_stage1_producers.SBNShowerGausCryoW.UseAllParticles: icarus_stage1_producers.SBNShowerGausCryoE.PFParticleLabel: "pandoraGausCryoE" icarus_stage1_producers.SBNShowerGausCryoE.UseAllParticles: true +applyNorm: true + +icarus_stage1_producers.SBNShowerGausCryoE.ShowerFinderTools[7].CalorimetryAlg: @local::icarus_calorimetryalgdata +icarus_stage1_producers.SBNShowerGausCryoE.ShowerFinderTools[7].ApplyCorrectionsInNorm: @local::applyNorm +icarus_stage1_producers.SBNShowerGausCryoE.ShowerFinderTools[7].NormTools: @local::icarus_calonormtools +icarus_stage1_producers.SBNShowerGausCryoW.ShowerFinderTools[7].CalorimetryAlg: @local::icarus_calorimetryalgdata +icarus_stage1_producers.SBNShowerGausCryoW.ShowerFinderTools[7].ApplyCorrectionsInNorm: @local::applyNorm +icarus_stage1_producers.SBNShowerGausCryoW.ShowerFinderTools[7].NormTools: @local::icarus_calonormtools + +icarus_stage1_producers.SBNShowerGausCryoE.ShowerFinderTools[5].CalorimetryAlg: @local::icarus_calorimetryalgdata +icarus_stage1_producers.SBNShowerGausCryoE.ShowerFinderTools[5].ApplyCorrectionsInNorm: @local::applyNorm +icarus_stage1_producers.SBNShowerGausCryoE.ShowerFinderTools[5].NormTools: @local::icarus_calonormtools +icarus_stage1_producers.SBNShowerGausCryoW.ShowerFinderTools[5].CalorimetryAlg: @local::icarus_calorimetryalgdata +icarus_stage1_producers.SBNShowerGausCryoW.ShowerFinderTools[5].ApplyCorrectionsInNorm: @local::applyNorm +icarus_stage1_producers.SBNShowerGausCryoW.ShowerFinderTools[5].NormTools: @local::icarus_calonormtools + +icarus_stage1_producers.SBNShowerGausCryoE.ShowerFinderTools[3].ApplyCorrectionsInNorm: @local::applyNorm +icarus_stage1_producers.SBNShowerGausCryoE.ShowerFinderTools[3].NormTools: @local::icarus_calonormtools +icarus_stage1_producers.SBNShowerGausCryoW.ShowerFinderTools[3].ApplyCorrectionsInNorm: @local::applyNorm +icarus_stage1_producers.SBNShowerGausCryoW.ShowerFinderTools[3].NormTools: @local::icarus_calonormtools + +# Set supera input fcl files +icarus_stage1_analyzers.superaMC.supera_params: "supera_icarus_MC_all_cryo_PMT_CRT_v10.fcl" + END_PROLOG diff --git a/fcl/reco/Stage0/data/CMakeLists.txt b/fcl/reco/Stage0/data/CMakeLists.txt index 2bda0f610..9b8e98380 100644 --- a/fcl/reco/Stage0/data/CMakeLists.txt +++ b/fcl/reco/Stage0/data/CMakeLists.txt @@ -1,3 +1,5 @@ +add_subdirectory(partial) + cet_enable_asserts() install_fhicl() diff --git a/fcl/reco/Stage0/data/partial/CMakeLists.txt b/fcl/reco/Stage0/data/partial/CMakeLists.txt new file mode 100644 index 000000000..13355789a --- /dev/null +++ b/fcl/reco/Stage0/data/partial/CMakeLists.txt @@ -0,0 +1 @@ +install_fhicl() diff --git a/fcl/reco/Stage0/data/partial/decodePMT_icarus.fcl b/fcl/reco/Stage0/data/partial/decodePMT_icarus.fcl new file mode 100644 index 000000000..d22be3e79 --- /dev/null +++ b/fcl/reco/Stage0/data/partial/decodePMT_icarus.fcl @@ -0,0 +1,145 @@ +# +# File: decodePMT_icarus.fcl +# Purpose: PMT readout fragment decoding for studies in ICARUS. +# Author: Gianluca Petrillo (petrillo@slac.stanford.edu) +# Date: May 12, 2021 +# +# +# PMT waveform decoding is performed, extensive debugging messages are +# included in the `debug.log` log file, and ROOT trees are produced for studies. +# This configuration, as is, is not meant for production. +# +# +# Input +# ------ +# +# * artDAQ fragments from all 24 PMT readout boards, named +# `daq:ContainerCAENV1730` +# * trigger fragment `daq:ICARUSTriggerUDP` (will be decoded as well) +# * DAQ configuration as FHiCL in the art/ROOT input file +# +# This configuration requires a data fragment for each PMT readout board +# which is mentioned in `physics.producers.daqPMT.DecoderTool.BoardSetup`, +# which by default is all 24. If the input run misses some PMT readout boards, +# use `decodePMT_icarus_incomplete.fcl` instead. +# +# +# Output +# ------- +# +# Only new data products are written in the art/ROOT output file, including: +# +# * `daqPMT` (std::vector): decoded waveforms, +# with our best reconstruction for their time stamps in LArSoft reference +# +# +# The `Trees-*.root` file (from `TFileService`) includes ROOT tree +# `PMTfragments`. +# +# +# +# Service configuration +# ---------------------- +# +# * `DetectorClocksService` is essential to assign a correct waveform timestamp +# * `Geometry` service bundle is required by `DetectorClocksService` +# * `IICARUSChannelMap` to relate PMT fragment IDs to channels +# * `TFileService` used to write trees (not needed if all trees are disabled) +# +# + + +# ------------------------------------------------------------------------------ +#include "services_common_icarus.fcl" +#include "channelmapping_icarus.fcl" +#include "timing_icarus.fcl" + +#include "rootoutput_icarus.fcl" +#include "decoderdefs_icarus.fcl" + +# ------------------------------------------------------------------------------ +process_name: DecodePMT + + +# ------------------------------------------------------------------------------ +services: { + + @table::icarus_art_services + message: @local::icarus_message_services_interactive_debug + + @table::icarus_geometry_services + DetectorClocksService: @local::icarus_detectorclocks + IICARUSChannelMap: @local::icarus_channelmappinggservice + IPMTTimingCorrectionService: @local::icarus_pmttimingservice + + TFileService: { fileName: "Trees-%ifb_%tc-%p.root" } +} + + +# ------------------------------------------------------------------------------ +physics: { + + producers: { + + triggerconfig: @local::extractTriggerConfig + pmtconfig: @local::extractPMTconfig + + daqTrigger: @local::decodeTriggerAutodetect + + daqPMT: @local::decodePMT + + } + + decoding: [ triggerconfig, pmtconfig, daqTrigger, daqPMT ] + streams: [ rootoutput ] +} + + +# ------------------------------------------------------------------------------ +outputs: { + rootoutput: { + @table::icarus_rootoutput + dataTier: "decoded" + fileProperties: { maxInputFiles: 1 } + checkFileName: false + compressionLevel: 501 + + outputCommands: [ "drop *_*_*_*", "keep *_*_*_DecodePMT" ] + } # rootoutput +} # outputs + + +# ------------------------------------------------------------------------------ + +physics.producers.daqTrigger.DecoderTool.Decoders[0].ToolConfig.TrigConfigLabel: triggerconfig +physics.producers.daqTrigger.DecoderTool.Decoders[1].ToolConfig.TrigConfigLabel: triggerconfig +physics.producers.daqTrigger.DecoderTool.Decoders[2].ToolConfig.TrigConfigLabel: triggerconfig +physics.producers.daqPMT.PMTconfigTag: pmtconfig # required +physics.producers.daqPMT.TriggerTag: daqTrigger # required + +# services.Geometry.Name: icarus_splitwires # for runs < 548x + +# +# customization of PMT decoding +# + +physics.producers.daqPMT.SurviveExceptions: false +physics.producers.daqPMT.DiagnosticOutput: true +physics.producers.daqPMT.PacketDump: false +physics.producers.daqPMT.RequireKnownBoards: true +physics.producers.daqPMT.RequireBoardConfig: true +physics.producers.daqPMT.DataTrees: [ "PMTfragments" ] + +# +# customization of trigger decoding +# + +physics.producers.daqTrigger.DecoderTool.Decoders[0].ToolConfig.DiagnosticOutput: true +physics.producers.daqTrigger.DecoderTool.Decoders[1].ToolConfig.DiagnosticOutput: true +physics.producers.daqTrigger.DecoderTool.Decoders[2].ToolConfig.DiagnosticOutput: true +physics.producers.daqTrigger.DecoderTool.Decoders[0].ToolConfig.Debug: false +physics.producers.daqTrigger.DecoderTool.Decoders[1].ToolConfig.Debug: false +physics.producers.daqTrigger.DecoderTool.Decoders[2].ToolConfig.Debug: false + + +# ------------------------------------------------------------------------------ diff --git a/fcl/reco/Stage0/data/partial/decodePMT_icarus_incomplete.fcl b/fcl/reco/Stage0/data/partial/decodePMT_icarus_incomplete.fcl new file mode 100644 index 000000000..038a09480 --- /dev/null +++ b/fcl/reco/Stage0/data/partial/decodePMT_icarus_incomplete.fcl @@ -0,0 +1,15 @@ +# +# File: decodePMT_icarus_incomplete.fcl +# Purpose: PMT readout fragment decoding for studies in ICARUS. +# Author: Gianluca Petrillo (petrillo@slac.stanford.edu) +# Date: May 12, 2021 +# +# This is a version of `decodePMT_icarus.fcl` which will ignore missing PMT +# readout fragments. +# +# See the documentation on `decodePMT_icarus.fcl` for everything else. +# + +#include "decodePMT_icarus.fcl" + +physics.producers.daqPMT.RequireBoardConfig: false diff --git a/fcl/reco/Stage0/data/partial/decodePMT_icarus_standalone.fcl b/fcl/reco/Stage0/data/partial/decodePMT_icarus_standalone.fcl new file mode 100644 index 000000000..fa70378a8 --- /dev/null +++ b/fcl/reco/Stage0/data/partial/decodePMT_icarus_standalone.fcl @@ -0,0 +1,69 @@ +# +# File: decodePMT_icarus_standalone.fcl +# Purpose: PMT readout fragment decoding for studies in ICARUS. +# Author: Gianluca Petrillo (petrillo@slac.stanford.edu) +# Date: June 10, 2021 +# +# This configuration expects only PMT fragments, and not even all of them: +# as a consequence many timestamp corrections will be skipped. +# PMT waveform decoding is performed, extensive debugging messages are +# included in the `debug.log` log file, and ROOT trees are produced for studies. +# This configuration, as is, is not meant for production. +# +# +# Input +# ------ +# +# * artDAQ fragments from PMT readout boards, named +# `daq:ContainerCAENV1730` or `daq:CAENV1730` (not both!) +# +# +# Output +# ------- +# +# Only new data products are written in the art/ROOT output file, including: +# +# * `daqPMT` (std::vector): decoded waveforms, +# with our best reconstruction for their time stamps in LArSoft reference +# +# +# The `Trees-*.root` file (from `TFileService`) includes ROOT tree +# `PMTfragments`. +# +# +# +# Service configuration +# ---------------------- +# +# * `DetectorClocksService` is essential to assign a correct waveform timestamp +# * `Geometry` service bundle is required by `DetectorClocksService` +# * `IICARUSChannelMap` to relate PMT fragment IDs to channels +# * `TFileService` used to write trees (not needed if all trees are disabled) +# +# + + +# ------------------------------------------------------------------------------ +#include "decodePMT_icarus.fcl" + + +# ------------------------------------------------------------------------------ +physics.decoding: [ daqPMT ] + + +# ------------------------------------------------------------------------------ + +physics.producers.daqPMT.PMTconfigTag: @erase # required +physics.producers.daqPMT.TriggerTag: @erase # required + +# +# customization of PMT decoding +# + +physics.producers.daqPMT.SurviveExceptions: false +physics.producers.daqPMT.DiagnosticOutput: true +physics.producers.daqPMT.PacketDump: true +physics.producers.daqPMT.RequireKnownBoards: false +physics.producers.daqPMT.RequireBoardConfig: false + +# ------------------------------------------------------------------------------ diff --git a/fcl/reco/Stage0/data/partial/decodePMT_icarus_treeonly.fcl b/fcl/reco/Stage0/data/partial/decodePMT_icarus_treeonly.fcl new file mode 100644 index 000000000..5e34eefad --- /dev/null +++ b/fcl/reco/Stage0/data/partial/decodePMT_icarus_treeonly.fcl @@ -0,0 +1,68 @@ +# +# File: decodePMT_icarus_treeonly.fcl +# Purpose: Runs PMT decoding to build a PMT diagnostic tree. +# Author: Gianluca Petrillo (petrillo@slac.stanford.edu) +# Date: September 25, 2022 +# +# It does not save any waveform. +# +# Input +# ------ +# +# * artDAQ fragments from all 24 PMT readout boards, named +# `daq:ContainerCAENV1730` (or any standard ICARUS name) +# * trigger fragment (autodetected among ICARUS standard names) +# * DAQ configuration as FHiCL in the art/ROOT input file +# +# This configuration requires a data fragment for each PMT readout board +# which is mentioned in `physics.producers.daqPMT.DecoderTool.BoardSetup`, +# which by default is all 24. +# +# +# Output +# ------- +# +# In the plain ROOT output file (names `Tree-....root`) a diagnostic tree +# is stored with one entry per PMT data fragment (see `decodePMT_icarus.fcl` +# and the decoder module `DaqDecodeICARUSPMT`), as `daqPMT/PMTfragments`. +# +# All standard trigger and PMT decoding data products are produced with the +# standard names (`daqTrigger` and `daqPMT` respectively). +# The noticeable exception is PMT raw waveforms not the corrections: +# neither are saved. +# +# The log file also dump the trigger information. +# +# + + +# ------------------------------------------------------------------------------ +#include "decodePMT_icarus.fcl" + +# add a trigger dumper to the output on console +physics.analyzers.dumptrigger: { + module_type: DumpTrigger + TriggerTag: "daqTrigger" +} + +physics.dumpers: [ dumptrigger ] +physics.end_paths: [ streams, dumpers ] + +outputs.rootoutput.fileProperties: @erase # don't go one output file per input file +outputs.rootoutput.outputCommands: [ + @sequence::outputs.rootoutput.outputCommands + , "drop raw::OpDetWaveforms_daqPMT_*_DecodePMT" +] + +# disable abundant output on console and the optical waveforms +physics.producers.daqPMT.SaveCorrectionsFrom: [] +physics.producers.daqPMT.DiagnosticOutput: false +physics.producers.daqTrigger.DecoderTool.Decoders[0].ToolConfig.DiagnosticOutput: false +physics.producers.daqTrigger.DecoderTool.Decoders[1].ToolConfig.DiagnosticOutput: false +physics.producers.daqTrigger.DecoderTool.Decoders[2].ToolConfig.DiagnosticOutput: false + +services.message.destinations.LogDebugFile: @erase +services.message.destinations.LogSeeds: @erase +services.TimeTracker: {} # no DB file +services.MemoryTracker: @erase + diff --git a/fcl/reco/Stage0/data/partial/decodeTrigger_icarus.fcl b/fcl/reco/Stage0/data/partial/decodeTrigger_icarus.fcl new file mode 100644 index 000000000..d041c0023 --- /dev/null +++ b/fcl/reco/Stage0/data/partial/decodeTrigger_icarus.fcl @@ -0,0 +1,56 @@ +#include "services_common_icarus.fcl" +#include "channelmapping_icarus.fcl" +#include "rootoutput_icarus.fcl" +#include "decoderdefs_icarus.fcl" + +process_name: DecodeTrg + +services: { + + @table::icarus_art_services + message: @local::icarus_message_services_interactive_debug + + @table::icarus_geometry_services + DetectorClocksService: @local::icarus_detectorclocks + IICARUSChannelMap: @local::icarus_channelmappinggservice # from channelmapping_icarus.fcl +} + + +physics: { + + producers: { + +// pmtconfig: @local::extractPMTconfig + triggerconfig: @local::extractTriggerConfig + + daqTrigger: @local::decodeTriggerAutodetect + +// daqPMT: @local::decodePMT + + } + +// decoding: [ PMTconfig, triggerconfig, daqTrigger, daqPMT ] + decoding: [ triggerconfig, daqTrigger ] + streams: [ rootoutput ] +} + +outputs: { + rootoutput: { + @table::icarus_rootoutput + dataTier: "decoded" + fileProperties: { maxInputFiles: 1 } + checkFileName: false + compressionLevel: 501 + + outputCommands: [ "drop *_*_*_*", "keep *_*_*_DecodeTrg" ] + } # rootoutput +} # outputs + + +physics.producers.daqTrigger.DecoderTool.TrigConfigLabel: triggerconfig +physics.producers.daqTrigger.DecoderTool.Decoders[0].ToolConfig.DiagnosticOutput: true +physics.producers.daqTrigger.DecoderTool.Decoders[0].ToolConfig.Debug: true +physics.producers.daqTrigger.DecoderTool.Decoders[1].ToolConfig.DiagnosticOutput: true +physics.producers.daqTrigger.DecoderTool.Decoders[1].ToolConfig.Debug: true +physics.producers.daqTrigger.DecoderTool.Decoders[2].ToolConfig.DiagnosticOutput: true +physics.producers.daqTrigger.DecoderTool.Decoders[2].ToolConfig.Debug: true diff --git a/fcl/reco/Stage0/data/partial/stage0_run2_icarus_opdetonly.fcl b/fcl/reco/Stage0/data/partial/stage0_run2_icarus_opdetonly.fcl new file mode 100644 index 000000000..a7abf2d87 --- /dev/null +++ b/fcl/reco/Stage0/data/partial/stage0_run2_icarus_opdetonly.fcl @@ -0,0 +1,19 @@ +# +# File: stage0_run2_icarus_opdetonly.fcl +# Purpose: Runs the optical detector and trigger reconstruction parts of Stage0 +# Author: Gianluca Petrillo (petrillo@slac.stanford.edu) +# Date: August 29, 2023 +# +# Written for icaruscode v09_72_00_05p1. +# + +#include "stage0_run2_icarus.fcl" + +source.maxEvents: @erase + +physics.path: [ @sequence::icarus_stage0_PMT ] + +physics.end_paths: [ streamROOT ] + +# be unstoppable +physics.producers.daqPMT.SurviveExceptions: true diff --git a/fcl/reco/Stage0/data/stage0_daqPMT_drop.fcl b/fcl/reco/Stage0/data/stage0_daqPMT_drop.fcl index 844c9871b..f8c65b010 100644 --- a/fcl/reco/Stage0/data/stage0_daqPMT_drop.fcl +++ b/fcl/reco/Stage0/data/stage0_daqPMT_drop.fcl @@ -2,6 +2,8 @@ ## This fhicl file is used to drop daqPMT from the stage0 file ## +#include "services_common_icarus.fcl" + process_name: daqPMTdrop outputs: { diff --git a/fcl/reco/Stage0/mc/stage0_run2_icarus_mc.fcl b/fcl/reco/Stage0/mc/stage0_run2_icarus_mc.fcl index 3456eee69..374fddd02 100644 --- a/fcl/reco/Stage0/mc/stage0_run2_icarus_mc.fcl +++ b/fcl/reco/Stage0/mc/stage0_run2_icarus_mc.fcl @@ -16,7 +16,6 @@ physics.producers: { @table::icarus_stage0_producers physics.path: [ @sequence::icarus_stage0_mc_PMT, MCDecodeTPCROI, @sequence::icarus_stage0_multiTPC, - simChannelROI, @sequence::icarus_stage0_mc_crthit, @sequence::icarus_stage0_mc_crtreco ] diff --git a/fcl/reco/Stage0/mc/stage0_run2_wc_icarus_mc_notriggersim.fcl b/fcl/reco/Stage0/mc/stage0_run2_wc_icarus_mc_notriggersim.fcl index 9d738f348..54f81872a 100644 --- a/fcl/reco/Stage0/mc/stage0_run2_wc_icarus_mc_notriggersim.fcl +++ b/fcl/reco/Stage0/mc/stage0_run2_wc_icarus_mc_notriggersim.fcl @@ -1,6 +1,7 @@ #include "stage0_run2_wc_icarus_mc.fcl" # restore non-shifted labels +physics.producers.ophit.InputModule: "opdaq" physics.producers.emuTrigger.BeamGates: "beamgate" physics.producers.mcophit.SimPhotonsProducer: "pdfastsim" physics.producers.opdetonbeam.Waveforms: "opdaq" diff --git a/fcl/reco/Stage1/data/stage1_run2_shwcal_icarus.fcl b/fcl/reco/Stage1/data/stage1_run2_shwcal_icarus.fcl new file mode 100644 index 000000000..ff80d462b --- /dev/null +++ b/fcl/reco/Stage1/data/stage1_run2_shwcal_icarus.fcl @@ -0,0 +1,34 @@ +# This includes running larcv as part of stage 1 processing + +#include "stage1_run2_icarus.fcl" + +physics.outana: [ @sequence::icarus_analysis_larcv_modules ] +physics.end_paths: [ outana, stream1 ] + +applyNorm: true +applyLifetime: false + +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[7].CalorimetryAlg: @local::icarus_calorimetryalgdata +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[7].ApplyCorrectionsInNorm: @local::applyNorm +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[7].NormTools: @local::icarus_calonormtools +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[7].ApplyMCLifetimeCorrection: @local::applyLifetime +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[7].CalorimetryAlg: @local::icarus_calorimetryalgdata +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[7].ApplyCorrectionsInNorm: @local::applyNorm +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[7].NormTools: @local::icarus_calonormtools +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[7].ApplyMCLifetimeCorrection: @local::applyLifetime + +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[5].CalorimetryAlg: @local::icarus_calorimetryalgdata +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[5].ApplyCorrectionsInNorm: @local::applyNorm +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[5].NormTools: @local::icarus_calonormtools +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[5].ApplyMCLifetimeCorrection: @local::applyLifetime +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[5].CalorimetryAlg: @local::icarus_calorimetryalgdata +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[5].ApplyCorrectionsInNorm: @local::applyNorm +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[5].NormTools: @local::icarus_calonormtools +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[5].ApplyMCLifetimeCorrection: @local::applyLifetime + +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[3].ApplyCorrectionsInNorm: @local::applyNorm +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[3].NormTools: @local::icarus_calonormtools +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[3].ApplyMCLifetimeCorrection: @local::applyLifetime +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[3].ApplyCorrectionsInNorm: @local::applyNorm +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[3].NormTools: @local::icarus_calonormtools +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[3].ApplyMCLifetimeCorrection: @local::applyLifetime diff --git a/fcl/reco/Stage1/mc/stage1_run2_icarus_MC.fcl b/fcl/reco/Stage1/mc/stage1_run2_icarus_MC.fcl index 0009c0806..e6dfbc651 100644 --- a/fcl/reco/Stage1/mc/stage1_run2_icarus_MC.fcl +++ b/fcl/reco/Stage1/mc/stage1_run2_icarus_MC.fcl @@ -105,6 +105,39 @@ physics.producers.mcreco.MCParticleDroppedLabel: "largeant:droppedMCParticles" physics.producers.mcreco.MCRecoPart.SavePathPDGList: [13,-13,211,-211,111,311,310,130,321,-321,2212,2112,2224,2214,2114,1114,3122,1000010020,1000010030,1000020030,1000020040] physics.producers.mcreco.MCRecoPart.TrackIDOffsets: [0,10000000,20000000] #Account for track ID offsets in labeling primaries +runPeriod: 2 + +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[7].CalorimetryAlg: @local::icarus_calorimetryalgmc +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[7].ApplyCorrectionsInNorm: true +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[7].NormTools: @local::icarus_calonormtoolsMC +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[7].NormTools[0].MC: @local::runPeriod +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[7].NormTools[1].MC: @local::runPeriod +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[7].CalorimetryAlg: @local::icarus_calorimetryalgmc +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[7].ApplyCorrectionsInNorm: true +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[7].NormTools: @local::icarus_calonormtoolsMC +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[7].NormTools[0].MC: @local::runPeriod +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[7].NormTools[1].MC: @local::runPeriod + +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[5].CalorimetryAlg: @local::icarus_calorimetryalgmc +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[5].ApplyCorrectionsInNorm: true +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[5].NormTools: @local::icarus_calonormtoolsMC +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[5].NormTools[0].MC: @local::runPeriod +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[5].NormTools[1].MC: @local::runPeriod +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[5].CalorimetryAlg: @local::icarus_calorimetryalgmc +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[5].ApplyCorrectionsInNorm: true +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[5].NormTools: @local::icarus_calonormtoolsMC +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[5].NormTools[0].MC: @local::runPeriod +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[5].NormTools[1].MC: @local::runPeriod + +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[3].ApplyCorrectionsInNorm: true +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[3].NormTools: @local::icarus_calonormtoolsMC +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[3].NormTools[0].MC: @local::runPeriod +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[3].NormTools[1].MC: @local::runPeriod +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[3].ApplyCorrectionsInNorm: true +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[3].NormTools: @local::icarus_calonormtoolsMC +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[3].NormTools[0].MC: @local::runPeriod +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[3].NormTools[1].MC: @local::runPeriod + services.message.destinations : { STDCOUT: @@ -118,6 +151,10 @@ services.message.destinations : limit: -1 reportEvery: 1 } + SimDriftElectrons: + { + limit: 0 + } } } } diff --git a/fcl/reco/Stage1/mc/stage1_run2_icarus_MC_simpledet.fcl b/fcl/reco/Stage1/mc/stage1_run2_icarus_MC_simpledet.fcl new file mode 100644 index 000000000..788f343ed --- /dev/null +++ b/fcl/reco/Stage1/mc/stage1_run2_icarus_MC_simpledet.fcl @@ -0,0 +1,6 @@ +#include "stage1_run2_icarus_MC.fcl" + +physics.producers.mcreco.SimChannelLabel: "shifted" +physics.analyzers.caloskimE.SimChannelproducer: "daq:simpleSC" +physics.analyzers.caloskimW.SimChannelproducer: "daq:simpleSC" +services.BackTrackerService.BackTracker.SimChannelModuleLabel: "daq:simpleSC" diff --git a/fcl/reco/Stage1/mc/stage1_run2_shwcal_mc_icarus.fcl b/fcl/reco/Stage1/mc/stage1_run2_shwcal_mc_icarus.fcl new file mode 100644 index 000000000..df281da09 --- /dev/null +++ b/fcl/reco/Stage1/mc/stage1_run2_shwcal_mc_icarus.fcl @@ -0,0 +1,171 @@ +#include "mchitmodules.fcl" +#include "mctrutht0matching.fcl" +#include "mcreco.fcl" +#include "backtrackerservice.fcl" +#include "particleinventoryservice.fcl" +#include "stage1_icarus_driver_common.fcl" + +process_name: MCstage1p2 + +# Disabled Space-Charge service for calorimetry +services.SpaceChargeService: { + EnableCalEfieldSCE: false + EnableCalSpatialSCE: false + EnableCorrSCE: false + EnableSimEfieldSCE: false + EnableSimSpatialSCE: false + InputFilename: "SCEoffsets/SCEoffsets_ICARUS_E500_voxelTH3.root" + RepresentationType: "Voxelized_TH3" + service_provider: "SpaceChargeServiceICARUS" +} + +services.BackTrackerService: @local::standard_backtrackerservice +# In the 2D-detsim, SimChannel objects are made by the WireCell +# drift simulation (daq), not LArG4 (largeant). Thus, we need +# to overwrite the truth matching labels in the calibration ntuple maker +services.BackTrackerService.BackTracker.SimChannelModuleLabel: "merge" +services.ParticleInventoryService: @local::standard_particleinventoryservice + +## Add the MC module to the list of producers +physics.producers: { + @table::icarus_stage1_producers + + #mcophit: @local::ICARUSMCOpHit + mcopflashTPC0: @local::ICARUSMCOpFlashTPC0 + mcopflashTPC1: @local::ICARUSMCOpFlashTPC1 + mcopflashTPC2: @local::ICARUSMCOpFlashTPC2 + mcopflashTPC3: @local::ICARUSMCOpFlashTPC3 + + cheatopflashTPC0: @local::ICARUSCheatOpFlashTPC0 + cheatopflashTPC1: @local::ICARUSCheatOpFlashTPC1 + cheatopflashTPC2: @local::ICARUSCheatOpFlashTPC2 + cheatopflashTPC3: @local::ICARUSCheatOpFlashTPC3 + + ### mc producers + mcreco: @local::standard_mcreco + mchitfinder: @local::standard_mchitfinder + mcassociationsGausCryoE: @local::standard_mcparticlehitmatching + mcassociationsGausCryoW: @local::standard_mcparticlehitmatching +} + +physics.reco: [ + @sequence::icarus_reco_Gauss2D_CryoE , + @sequence::icarus_reco_Gauss2D_CryoW , + @sequence::icarus_reco_fm, + @sequence::icarus_tpcpmtbarycentermatch, + @sequence::icarus_crttrack, + @sequence::icarus_crtt0tagging, + caloskimCalorimetryCryoE, caloskimCalorimetryCryoW, + mcassociationsGausCryoE, mcassociationsGausCryoW, + mcreco + ] + +physics.outana: [ @sequence::icarus_analysis_modules ] +physics.trigger_paths: [ reco ] +physics.end_paths: [ outana, stream1 ] +outputs.out1.fileName: "%ifb_%tc-%p.root" +outputs.out1.dataTier: "reconstructed" +outputs.out1.outputCommands: [ + "keep *_*_*_*", + "drop *_caloskimCalorimetryCryoE_*_*", + "drop *_caloskimCalorimetryCryoW_*_*" +] + +source: +{ + maxEvents: 10 # Number of events to create +} + +#Redefine TPCPMTBarycenterMatch producers with MC parameters +physics.producers.tpcpmtbarycentermatchCryoE: @local::mc_tpcpmtbarycentermatchproducer_east +physics.producers.tpcpmtbarycentermatchCryoW: @local::mc_tpcpmtbarycentermatchproducer_west + +# Turn on truth-info for track skimmer +physics.analyzers.caloskimE.G4producer: "largeant" +physics.analyzers.caloskimE.SimChannelproducer: "merge" +physics.analyzers.caloskimE.RawDigitproducers: ["MCDecodeTPCROI:PHYSCRATEDATATPCEW", "MCDecodeTPCROI:PHYSCRATEDATATPCEE"] +physics.analyzers.caloskimE.SelectEvents: [reco] + +physics.analyzers.caloskimW.G4producer: "largeant" +physics.analyzers.caloskimW.SimChannelproducer: "merge" +physics.analyzers.caloskimW.RawDigitproducers: ["MCDecodeTPCROI:PHYSCRATEDATATPCWW", "MCDecodeTPCROI:PHYSCRATEDATATPCWE"] +physics.analyzers.caloskimW.SelectEvents: [reco] + +physics.producers.mcassociationsGausCryoE.HitParticleAssociations.HitModuleLabelVec: ["cluster3DCryoE"] +physics.producers.mcassociationsGausCryoW.HitParticleAssociations.HitModuleLabelVec: ["cluster3DCryoW"] + +# Remove missing products in MC +physics.analyzers.simpleLightAna.TriggerLabel: "" +physics.analyzers.simpleLightAna.RWMLabel: "" +physics.analyzers.simpleLightAna.OpDetWaveformLabels: ["opdaq"] + +# Configure mcreco to read SEDLite instead of SED and MCParticleLite in addition to MCParticle +physics.producers.mcreco.G4ModName: @erase +physics.producers.mcreco.SimChannelLabel: "filtersed" +physics.producers.mcreco.MCParticleLabel: "largeant" +physics.producers.mcreco.UseSimEnergyDepositLite: true +physics.producers.mcreco.UseSimEnergyDeposit: false +physics.producers.mcreco.IncludeDroppedParticles: true #this is now true with larsoft v09_89 and newer +physics.producers.mcreco.MCParticleDroppedLabel: "largeant:droppedMCParticles" +physics.producers.mcreco.MCRecoPart.SavePathPDGList: [13,-13,211,-211,111,311,310,130,321,-321,2212,2112,2224,2214,2114,1114,3122,1000010020,1000010030,1000020030,1000020040] +physics.producers.mcreco.MCRecoPart.TrackIDOffsets: [0,10000000,20000000] #Account for track ID offsets in labeling primaries + +message: @local::icarus_message_services_prod + +#icarus_calonormtoolsTest: [@local::driftnorm_sql, @local::yznorm_sql, @local::tpcgain_sql] +#icarus_calonormtoolsMC: [@local::tpcgain_sql] + +runPeriod: 2 + +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[7].CalorimetryAlg: @local::icarus_calorimetryalgmc +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[7].ApplyCorrectionsInNorm: true +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[7].NormTools: @local::icarus_calonormtoolsMC +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[7].NormTools[0].MC: @local::runPeriod +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[7].NormTools[1].MC: @local::runPeriod +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[7].CalorimetryAlg: @local::icarus_calorimetryalgmc +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[7].ApplyCorrectionsInNorm: true +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[7].NormTools: @local::icarus_calonormtoolsMC +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[7].NormTools[0].MC: @local::runPeriod +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[7].NormTools[1].MC: @local::runPeriod + +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[5].CalorimetryAlg: @local::icarus_calorimetryalgmc +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[5].ApplyCorrectionsInNorm: true +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[5].NormTools: @local::icarus_calonormtoolsMC +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[5].NormTools[0].MC: @local::runPeriod +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[5].NormTools[1].MC: @local::runPeriod +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[5].CalorimetryAlg: @local::icarus_calorimetryalgmc +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[5].ApplyCorrectionsInNorm: true +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[5].NormTools: @local::icarus_calonormtoolsMC +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[5].NormTools[0].MC: @local::runPeriod +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[5].NormTools[1].MC: @local::runPeriod + +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[3].ApplyCorrectionsInNorm: true +physics.producers.SBNShowerGausCryoE.ShowerFinderTools[3].NormTools: @local::icarus_calonormtoolsMC +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[3].NormTools[0].MC: @local::runPeriod +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[3].NormTools[1].MC: @local::runPeriod +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[3].ApplyCorrectionsInNorm: true +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[3].NormTools: @local::icarus_calonormtoolsMC +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[3].NormTools[0].MC: @local::runPeriod +physics.producers.SBNShowerGausCryoW.ShowerFinderTools[3].NormTools[1].MC: @local::runPeriod + +services.message.destinations : +{ + STDCOUT: + { + type: "cout" #tells the message service to output this destination to cout + threshold: "ERROR" #tells the message service that this destination applies to WARNING and higher level messages + categories: + { + Cluster3DICARUS: + { + limit: -1 + reportEvery: 1 + } + SimDriftElectrons: + { + limit: 0 + } + } + } +} + diff --git a/fcl/reco/Stage1/overlay/stage1_run2_icarus_overlay_simpledet.fcl b/fcl/reco/Stage1/overlay/stage1_run2_icarus_overlay_simpledet.fcl new file mode 100644 index 000000000..4a8aafe51 --- /dev/null +++ b/fcl/reco/Stage1/overlay/stage1_run2_icarus_overlay_simpledet.fcl @@ -0,0 +1,6 @@ +#include "stage1_run2_icarus_overlay.fcl" + +physics.producers.mcreco.SimChannelLabel: "sedlite" +physics.analyzers.caloskimE.SimChannelproducer: "daq:simpleSC" +physics.analyzers.caloskimW.SimChannelproducer: "daq:simpleSC" +services.BackTrackerService.BackTracker.SimChannelModuleLabel: "daq:simpleSC" diff --git a/fcl/reco/wires/CMakeLists.txt b/fcl/reco/wires/CMakeLists.txt new file mode 100644 index 000000000..2bda0f610 --- /dev/null +++ b/fcl/reco/wires/CMakeLists.txt @@ -0,0 +1,3 @@ +cet_enable_asserts() + +install_fhicl() diff --git a/fcl/reco/wires/restorewires_icarus.fcl b/fcl/reco/wires/restorewires_icarus.fcl new file mode 100644 index 000000000..723c92e43 --- /dev/null +++ b/fcl/reco/wires/restorewires_icarus.fcl @@ -0,0 +1,60 @@ +# Configuration for running the Calibration NTupler +# on a stage-1 reco file +# +#include "services_common_icarus.fcl" +#include "wirechannelroiconverters_sbn.fcl" + +process_name: ntuple + +services: +{ + @table::icarus_wirecalibration_services +} + +#source is a root file +source: +{ + module_type: RootInput + maxEvents: 10 # Number of events to create + saveMemoryObjectThreshold: 0 +} + +# only do analysis +physics: +{ + + producers: { + channel2wire: @local::channelroitowire + } + + filters: {} + + analyzers: + { + } + + out: [rootOutput] + reco: [channel2wire] + trigger_paths: [reco] + end_paths: [out] +} + +physics.producers.channel2wire.WireModuleLabelVec: ["wire2channelroi2d:PHYSCRATEDATATPCEE", "wire2channelroi2d:PHYSCRATEDATATPCEW", "wire2channelroi2d:PHYSCRATEDATATPCWE", "wire2channelroi2d:PHYSCRATEDATATPCWW"] +physics.producers.channel2wire.OutInstanceLabelVec: ["PHYSCRATEDATATPCWW","PHYSCRATEDATATPCWE","PHYSCRATEDATATPCEW","PHYSCRATEDATATPCEE"] + +physics.analyzers.caloskimE.SelectEvents: [ ] +physics.analyzers.caloskimW.SelectEvents: [ ] +physics.analyzers.simpleLightAna.SelectEvents: [ ] +physics.analyzers.supera.SelectEvents: [ ] + +outputs: +{ + rootOutput: + { + module_type: RootOutput + dataTier: "reconstructed" + compressionLevel: 1 + saveMemoryObjectThreshold: 0 + fileName: "%ifb_%tc-%p.root" + } +} diff --git a/fcl/standard/CMakeLists.txt b/fcl/standard/CMakeLists.txt index 9714229ee..178294463 100644 --- a/fcl/standard/CMakeLists.txt +++ b/fcl/standard/CMakeLists.txt @@ -1,8 +1,5 @@ -# Install fcl files +cet_enable_asserts() -install_fhicl() - -# Also put a copy in the source tree. - -FILE(GLOB fcl_files *.fcl) -install_source( EXTRAS ${fcl_files} ) +add_subdirectory(mc) +add_subdirectory(data) +add_subdirectory(overlay) diff --git a/fcl/standard/data/CMakeLists.txt b/fcl/standard/data/CMakeLists.txt new file mode 100644 index 000000000..9714229ee --- /dev/null +++ b/fcl/standard/data/CMakeLists.txt @@ -0,0 +1,8 @@ +# Install fcl files + +install_fhicl() + +# Also put a copy in the source tree. + +FILE(GLOB fcl_files *.fcl) +install_source( EXTRAS ${fcl_files} ) diff --git a/fcl/standard/standard_data_caf_icarus.fcl b/fcl/standard/data/standard_data_caf_icarus.fcl similarity index 100% rename from fcl/standard/standard_data_caf_icarus.fcl rename to fcl/standard/data/standard_data_caf_icarus.fcl diff --git a/fcl/standard/standard_data_larcv_icarus.fcl b/fcl/standard/data/standard_data_larcv_icarus.fcl similarity index 100% rename from fcl/standard/standard_data_larcv_icarus.fcl rename to fcl/standard/data/standard_data_larcv_icarus.fcl diff --git a/fcl/standard/standard_data_stage0_icarus.fcl b/fcl/standard/data/standard_data_stage0_icarus.fcl similarity index 100% rename from fcl/standard/standard_data_stage0_icarus.fcl rename to fcl/standard/data/standard_data_stage0_icarus.fcl diff --git a/fcl/standard/standard_data_stage1_icarus.fcl b/fcl/standard/data/standard_data_stage1_icarus.fcl similarity index 100% rename from fcl/standard/standard_data_stage1_icarus.fcl rename to fcl/standard/data/standard_data_stage1_icarus.fcl diff --git a/fcl/standard/standard_data_stage1larcv_icarus.fcl b/fcl/standard/data/standard_data_stage1larcv_icarus.fcl similarity index 100% rename from fcl/standard/standard_data_stage1larcv_icarus.fcl rename to fcl/standard/data/standard_data_stage1larcv_icarus.fcl diff --git a/fcl/standard/mc/CMakeLists.txt b/fcl/standard/mc/CMakeLists.txt new file mode 100644 index 000000000..9714229ee --- /dev/null +++ b/fcl/standard/mc/CMakeLists.txt @@ -0,0 +1,8 @@ +# Install fcl files + +install_fhicl() + +# Also put a copy in the source tree. + +FILE(GLOB fcl_files *.fcl) +install_source( EXTRAS ${fcl_files} ) diff --git a/fcl/standard/mc/standard_mc_all_detsim_icarus.fcl b/fcl/standard/mc/standard_mc_all_detsim_icarus.fcl new file mode 100644 index 000000000..4b81669ba --- /dev/null +++ b/fcl/standard/mc/standard_mc_all_detsim_icarus.fcl @@ -0,0 +1 @@ +#include "detsim_2d_icarus_refactored_yzsim.fcl" diff --git a/fcl/standard/standard_mc_all_larcv_icarus.fcl b/fcl/standard/mc/standard_mc_all_larcv_icarus.fcl similarity index 100% rename from fcl/standard/standard_mc_all_larcv_icarus.fcl rename to fcl/standard/mc/standard_mc_all_larcv_icarus.fcl diff --git a/fcl/standard/mc/standard_mc_all_stage0_icarus.fcl b/fcl/standard/mc/standard_mc_all_stage0_icarus.fcl new file mode 100644 index 000000000..c90fdc3b2 --- /dev/null +++ b/fcl/standard/mc/standard_mc_all_stage0_icarus.fcl @@ -0,0 +1 @@ +#include "stage0_run2_wcdnn_icarus_mc.fcl" diff --git a/fcl/standard/mc/standard_mc_all_stage1_icarus.fcl b/fcl/standard/mc/standard_mc_all_stage1_icarus.fcl new file mode 100644 index 000000000..7f5fe82b0 --- /dev/null +++ b/fcl/standard/mc/standard_mc_all_stage1_icarus.fcl @@ -0,0 +1 @@ +#include "stage1_run2_icarus_MC.fcl" diff --git a/fcl/standard/standard_mc_beamcosmics_caf_icarus.fcl b/fcl/standard/mc/standard_mc_beamcosmics_caf_icarus.fcl similarity index 100% rename from fcl/standard/standard_mc_beamcosmics_caf_icarus.fcl rename to fcl/standard/mc/standard_mc_beamcosmics_caf_icarus.fcl diff --git a/fcl/standard/mc/standard_mc_beamcosmics_g4_icarus.fcl b/fcl/standard/mc/standard_mc_beamcosmics_g4_icarus.fcl new file mode 100644 index 000000000..a42168087 --- /dev/null +++ b/fcl/standard/mc/standard_mc_beamcosmics_g4_icarus.fcl @@ -0,0 +1 @@ +#include "larg4_icarus_cosmics_sce.fcl" diff --git a/fcl/standard/standard_mc_intime_caf_icarus.fcl b/fcl/standard/mc/standard_mc_intime_caf_icarus.fcl similarity index 100% rename from fcl/standard/standard_mc_intime_caf_icarus.fcl rename to fcl/standard/mc/standard_mc_intime_caf_icarus.fcl diff --git a/fcl/standard/mc/standard_mc_intime_g4_icarus.fcl b/fcl/standard/mc/standard_mc_intime_g4_icarus.fcl new file mode 100644 index 000000000..e3695ae4b --- /dev/null +++ b/fcl/standard/mc/standard_mc_intime_g4_icarus.fcl @@ -0,0 +1 @@ +#include "larg4_icarus_intime_sce.fcl" diff --git a/fcl/standard/standard_mc_mpvmpr_stage1larcv_icarus.fcl b/fcl/standard/mc/standard_mc_mpvmpr_stage1larcv_icarus.fcl similarity index 100% rename from fcl/standard/standard_mc_mpvmpr_stage1larcv_icarus.fcl rename to fcl/standard/mc/standard_mc_mpvmpr_stage1larcv_icarus.fcl diff --git a/fcl/standard/overlay/CMakeLists.txt b/fcl/standard/overlay/CMakeLists.txt new file mode 100644 index 000000000..9714229ee --- /dev/null +++ b/fcl/standard/overlay/CMakeLists.txt @@ -0,0 +1,8 @@ +# Install fcl files + +install_fhicl() + +# Also put a copy in the source tree. + +FILE(GLOB fcl_files *.fcl) +install_source( EXTRAS ${fcl_files} ) diff --git a/fcl/standard/overlay/standard_overlay_caf_iarus.fcl b/fcl/standard/overlay/standard_overlay_caf_iarus.fcl new file mode 100644 index 000000000..ff0de4039 --- /dev/null +++ b/fcl/standard/overlay/standard_overlay_caf_iarus.fcl @@ -0,0 +1 @@ +#include "cafmakerjob_icarus_detsim2d_systtools_and_fluxwgt_overlay.fcl" diff --git a/fcl/standard/overlay/standard_overlay_detsim_icarus.fcl b/fcl/standard/overlay/standard_overlay_detsim_icarus.fcl new file mode 100644 index 000000000..d5a62b5cc --- /dev/null +++ b/fcl/standard/overlay/standard_overlay_detsim_icarus.fcl @@ -0,0 +1 @@ +#include "detsim_2d_icarus_refactored_overlay.fcl" diff --git a/fcl/standard/overlay/standard_overlay_overlay_icarus.fcl b/fcl/standard/overlay/standard_overlay_overlay_icarus.fcl new file mode 100644 index 000000000..6d70a1ace --- /dev/null +++ b/fcl/standard/overlay/standard_overlay_overlay_icarus.fcl @@ -0,0 +1 @@ +#include "overlay_waveforms.fcl" diff --git a/fcl/standard/overlay/standard_overlay_stage0_icarus.fcl b/fcl/standard/overlay/standard_overlay_stage0_icarus.fcl new file mode 100644 index 000000000..d91fab811 --- /dev/null +++ b/fcl/standard/overlay/standard_overlay_stage0_icarus.fcl @@ -0,0 +1 @@ +#include "stage0_run2_wc_icarus_overlay.fcl" diff --git a/fcl/standard/overlay/standard_overlay_stage1_icarus.fcl b/fcl/standard/overlay/standard_overlay_stage1_icarus.fcl new file mode 100644 index 000000000..2ec9c1f23 --- /dev/null +++ b/fcl/standard/overlay/standard_overlay_stage1_icarus.fcl @@ -0,0 +1 @@ +#include "stage1_run2_icarus_overlay.fcl" diff --git a/fcl/standard/standard_mc_all_detsim_icarus.fcl b/fcl/standard/standard_mc_all_detsim_icarus.fcl deleted file mode 100644 index 13685eafc..000000000 --- a/fcl/standard/standard_mc_all_detsim_icarus.fcl +++ /dev/null @@ -1 +0,0 @@ -#include "detsim_2d_icarus_refactored.fcl" diff --git a/fcl/standard/standard_mc_all_stage0_icarus.fcl b/fcl/standard/standard_mc_all_stage0_icarus.fcl deleted file mode 100644 index feb8aca63..000000000 --- a/fcl/standard/standard_mc_all_stage0_icarus.fcl +++ /dev/null @@ -1 +0,0 @@ -#include "stage0_run2_icarus_mc.fcl" diff --git a/fcl/standard/standard_mc_all_stage1_icarus.fcl b/fcl/standard/standard_mc_all_stage1_icarus.fcl deleted file mode 100644 index 86d4b0eba..000000000 --- a/fcl/standard/standard_mc_all_stage1_icarus.fcl +++ /dev/null @@ -1 +0,0 @@ -#include "stage1_run2_1d_icarus_MC.fcl" diff --git a/fcl/standard/standard_mc_all_stage1larcv_icarus.fcl b/fcl/standard/standard_mc_all_stage1larcv_icarus.fcl deleted file mode 100644 index caf161ca4..000000000 --- a/fcl/standard/standard_mc_all_stage1larcv_icarus.fcl +++ /dev/null @@ -1 +0,0 @@ -#include "stage1_run2_1d_larcv_icarus_MC.fcl" diff --git a/fcl/standard/standard_mc_beamcosmics_g4_icarus.fcl b/fcl/standard/standard_mc_beamcosmics_g4_icarus.fcl deleted file mode 100644 index 687f1fe35..000000000 --- a/fcl/standard/standard_mc_beamcosmics_g4_icarus.fcl +++ /dev/null @@ -1 +0,0 @@ -#include "larg4_icarus_cosmics_sce_2d_drift.fcl" diff --git a/fcl/standard/standard_mc_intime_g4_icarus.fcl b/fcl/standard/standard_mc_intime_g4_icarus.fcl deleted file mode 100644 index 05c30a5c9..000000000 --- a/fcl/standard/standard_mc_intime_g4_icarus.fcl +++ /dev/null @@ -1 +0,0 @@ -#include "larg4_icarus_intime_sce_2d_drift.fcl" diff --git a/icaruscode/TPC/Calorimetry/CMakeLists.txt b/icaruscode/TPC/Calorimetry/CMakeLists.txt index a3b1709c5..45b214a16 100644 --- a/icaruscode/TPC/Calorimetry/CMakeLists.txt +++ b/icaruscode/TPC/Calorimetry/CMakeLists.txt @@ -47,6 +47,8 @@ cet_build_plugin(NormalizeDriftSQLite art::tool LIBRARIES ${TOOL_LIBRARIES}) cet_build_plugin(NormalizeDrift art::tool LIBRARIES ${TOOL_LIBRARIES}) cet_build_plugin(NormalizeTPCSQL art::tool LIBRARIES ${TOOL_LIBRARIES}) cet_build_plugin(NormalizeTPC art::tool LIBRARIES ${TOOL_LIBRARIES}) +cet_build_plugin(NormalizeTPCPerPlaneSQL art::tool LIBRARIES ${TOOL_LIBRARIES}) +cet_build_plugin(NormalizeTPCPerPlane art::tool LIBRARIES ${TOOL_LIBRARIES}) cet_build_plugin(NormalizeTPCLocal art::tool LIBRARIES ${TOOL_LIBRARIES}) cet_build_plugin(NormalizeWire art::tool LIBRARIES ${TOOL_LIBRARIES}) cet_build_plugin(NormalizeYZSQL art::tool LIBRARIES ${TOOL_LIBRARIES}) diff --git a/icaruscode/TPC/Calorimetry/NormalizeDriftSQLite_tool.cc b/icaruscode/TPC/Calorimetry/NormalizeDriftSQLite_tool.cc index 36466aabd..6b1e53820 100644 --- a/icaruscode/TPC/Calorimetry/NormalizeDriftSQLite_tool.cc +++ b/icaruscode/TPC/Calorimetry/NormalizeDriftSQLite_tool.cc @@ -142,8 +142,11 @@ double icarus::calo::NormalizeDriftSQLite::Normalize(double dQdx, const art::Eve // Get the hit time double thit = fClockData->TPCTick2TrigTime(hit.PeakTime()) - t0; + //std::cout << "TPC Tick2TrigTime: " << fClockData->TPCTick2TrigTime(hit.PeakTime()) << ", t0: " << t0 << ", hit: " << hit.PeakTime() << std::endl; + if (fVerbose) std::cout << "NormalizeDriftSQLite Tool -- Norm factor: " << exp(thit / thiselifetime) << " at TPC: " << tpc << " Cryo: " << cryo << " Time: " << thit << " Track T0: " << t0 << std::endl; + //std::cout << "dQdx before: " << dQdx << ", dQdx after: " << dQdx*exp(thit / thiselifetime) << ", thit: " << thit << ", lifetime: " << thiselifetime << std::endl; // Scale if (thiselifetime > 0) { dQdx = dQdx*exp(thit / thiselifetime); diff --git a/icaruscode/TPC/Calorimetry/NormalizeTPCPerPlaneSQL_tool.cc b/icaruscode/TPC/Calorimetry/NormalizeTPCPerPlaneSQL_tool.cc new file mode 100644 index 000000000..67fda0e94 --- /dev/null +++ b/icaruscode/TPC/Calorimetry/NormalizeTPCPerPlaneSQL_tool.cc @@ -0,0 +1,146 @@ +// Framework Includes +#include "art/Framework/Core/EDProducer.h" +#include "art/Framework/Principal/Event.h" +#include "art/Framework/Principal/Handle.h" +#include "art/Framework/Services/Registry/ServiceHandle.h" +#include "art/Persistency/Common/PtrMaker.h" +#include "art/Utilities/ToolMacros.h" +#include "cetlib/cpu_timer.h" +#include "fhiclcpp/ParameterSet.h" +#include "messagefacility/MessageLogger/MessageLogger.h" + +#include "larevt/CalibrationDBI/Providers/DBFolder.h" + +// Tool include +#include "larreco/Calorimetry/INormalizeCharge.h" + +// Services +#include "lardata/DetectorInfoServices/DetectorClocksService.h" + +// Lab helpers +#include "wda.h" + +// C++ +#include + +namespace icarus { + namespace calo { + +class NormalizeTPCPerPlaneSQL : public INormalizeCharge +{ +public: + NormalizeTPCPerPlaneSQL(fhicl::ParameterSet const &pset); + + void configure(const fhicl::ParameterSet& pset) override; + double Normalize(double dQdx, const art::Event &e, const recob::Hit &h, const geo::Point_t &location, const geo::Vector_t &direction, double t0) override; + +private: + // Configuration + std::string fDBFileName; + std::string fDBTag; + bool fVerbose; + int fMC; + + lariov::DBFolder fDB; + + // Class to hold data from DB + class ScaleInfo { + public: + std::map scale; + }; + + // Helpers + ScaleInfo GetScaleInfo(uint64_t run); + + // Cache run requests + std::map fScaleInfos; +}; + +DEFINE_ART_CLASS_TOOL(NormalizeTPCPerPlaneSQL) + + } // end namespace calo +} // end namespace icarus + + +icarus::calo::NormalizeTPCPerPlaneSQL::NormalizeTPCPerPlaneSQL(fhicl::ParameterSet const &pset): + fDBFileName(pset.get("DBFileName")), + fDBTag(pset.get("DBTag")), + fVerbose(pset.get("Verbose", false)), + fMC(pset.get("MC")), + fDB(fDBFileName, "", "", fDBTag, true, false) {} + +void icarus::calo::NormalizeTPCPerPlaneSQL::configure(const fhicl::ParameterSet& pset) {} + +icarus::calo::NormalizeTPCPerPlaneSQL::ScaleInfo icarus::calo::NormalizeTPCPerPlaneSQL::GetScaleInfo(uint64_t run) { + // check the cache + if (fScaleInfos.count(run)) { + return fScaleInfos.at(run); + } + + // Look up the run + // + // Translate the run into a fake "timestamp" + fDB.UpdateData((run+1000000000)*1000000000); + + // Collect the run info + ScaleInfo thisscale; + + // Iterate over the rows + for (unsigned ch = 0; ch < 12; ch++) { + double scale; + fDB.GetNamedChannelData(ch, "scale", scale); + + thisscale.scale[ch] = scale; + } + // Set the cache + fScaleInfos[run] = thisscale; + + return thisscale; +} + +double icarus::calo::NormalizeTPCPerPlaneSQL::Normalize(double dQdx, const art::Event &e, + const recob::Hit &hit, const geo::Point_t &location, const geo::Vector_t &direction, double t0) { + + // Get the info + uint64_t runID = -1; + switch (fMC) { + case 1: + runID = 8460; + break; + case 2: + runID = 9301; + break; + case 3: + runID = 11806; + break; + case 4: + runID = 12960; + break; + case 5: + runID = 14079; + break; + default: + runID = e.id().runID().run(); + break; + } + + ScaleInfo const& i = GetScaleInfo(runID); + + // Lookup the TPC, cryo + unsigned tpc = hit.WireID().TPC; + unsigned cryo = hit.WireID().Cryostat; + unsigned plane = hit.WireID().Plane; + + // Get the TPC-Plane index + unsigned itpc_plane = 2*cryo + tpc/2 + plane*4; + + double scale = 1; + + // TODO: what to do if no scale is found? throw an exception?? + if (i.scale.count(itpc_plane)) scale = i.scale.at(itpc_plane); + + if (fVerbose) std::cout << "NormalizeTPCPerPlaneSQL Tool -- Data at Cryo: " << cryo << " TPC: " << tpc << " Plane: " << plane << " itpc_plane: " << itpc_plane << " scale: " << scale << std::endl; + + return dQdx * scale; +} + diff --git a/icaruscode/TPC/Calorimetry/NormalizeTPCPerPlane_tool.cc b/icaruscode/TPC/Calorimetry/NormalizeTPCPerPlane_tool.cc new file mode 100644 index 000000000..08b0c0ec4 --- /dev/null +++ b/icaruscode/TPC/Calorimetry/NormalizeTPCPerPlane_tool.cc @@ -0,0 +1,158 @@ +// Framework Includes +#include "art/Framework/Core/EDProducer.h" +#include "art/Framework/Principal/Event.h" +#include "art/Framework/Principal/Handle.h" +#include "art/Framework/Services/Registry/ServiceHandle.h" +#include "art/Persistency/Common/PtrMaker.h" +#include "art/Utilities/ToolMacros.h" +#include "cetlib/cpu_timer.h" +#include "fhiclcpp/ParameterSet.h" +#include "messagefacility/MessageLogger/MessageLogger.h" + +// Tool include +#include "larreco/Calorimetry/INormalizeCharge.h" + +// Services +#include "lardata/DetectorInfoServices/DetectorClocksService.h" + +// Lab helpers +#include "wda.h" + +// C++ +#include + +namespace icarus { + namespace calo { + +class NormalizeTPCPerPlane : public INormalizeCharge +{ +public: + NormalizeTPCPerPlane(fhicl::ParameterSet const &pset); + + void configure(const fhicl::ParameterSet& pset) override; + double Normalize(double dQdx, const art::Event &e, const recob::Hit &h, const geo::Point_t &location, const geo::Vector_t &direction, double t0) override; + +private: + // Configuration + int fTimeout; + std::string fURL; + bool fVerbose; + + // Class to hold data from DB + class ScaleInfo { + public: + std::map scale; + }; + + // Helpers + ScaleInfo GetScaleInfo(uint64_t run); + std::string URL(uint64_t run); + + // Cache run requests + std::map fScaleInfos; +}; + +DEFINE_ART_CLASS_TOOL(NormalizeTPCPerPlane) + + } // end namespace calo +} // end namespace icarus + + +icarus::calo::NormalizeTPCPerPlane::NormalizeTPCPerPlane(fhicl::ParameterSet const &pset) { + this->configure(pset); +} + +void icarus::calo::NormalizeTPCPerPlane::configure(const fhicl::ParameterSet& pset) { + fURL = pset.get("URL"); + fTimeout = pset.get("Timeout"); + fVerbose = pset.get("Verbose", false); +} + +std::string icarus::calo::NormalizeTPCPerPlane::URL(uint64_t run) { + return fURL + std::to_string(run); +} + +icarus::calo::NormalizeTPCPerPlane::ScaleInfo icarus::calo::NormalizeTPCPerPlane::GetScaleInfo(uint64_t run) { + // check the cache + if (fScaleInfos.count(run)) { + return fScaleInfos.at(run); + } + + // Otherwise, look it up + int error = 0; + std::string url = URL(run); + + if (fVerbose) std::cout << "NormalizeTPCPerPlane Tool -- New Scale info, requesting data from url:\n" << url << std::endl; + + Dataset d = getDataWithTimeout(url.c_str(), "", fTimeout, &error); + if (error) { + throw cet::exception("NormalizeTPCPerPlane") << "Calibration Database access failed. URL: (" << url << ") Error Code: " << error; + } + + if (fVerbose) std::cout << "NormalizeTPCPerPlane Tool -- Received HTTP response:\n" << getHTTPmessage(d) << std::endl; + + if (getHTTPstatus(d) != 200) { + throw cet::exception("NormalizeTPCPerPlane") + << "Calibration Database access failed. URL: (" << url + << "). HTTP error status: " << getHTTPstatus(d) << ". HTTP error message: " << getHTTPmessage(d); + } + + // Collect the run info + ScaleInfo thisscale; + + // Number of rows + int n_tuple = getNtuples(d); + if (n_tuple < 0) { + throw cet::exception("NormalizeTPCPerPlane") << "Calibration Database access failed. URL: (" << url << ") Bad Tuple Number: " << n_tuple; + } + + // Iterate over the rows + // The first 4 are metadata + for (unsigned row = 4; row < (unsigned)n_tuple; row++) { + Tuple tup = getTuple(d, row); + + int err = 0; + // Get the itpc number + int ch = getLongValue(tup, 0, &err); + if (error) { + throw cet::exception("NormalizeTPCPerPlane") << "Calibration Database access failed. URL: (" << url << ") Failed on tuple access, row: " << row << ", col 0. Error Code: " << error; + } + + // and the scale + double scale = getDoubleValue(tup, 3, &err); + if (error) { + throw cet::exception("NormalizeTPCPerPlane") << "Calibration Database access failed. URL: (" << url << ") Failed on tuple access, row: " << row << ", col 1. Error Code: " << error; + } + + thisscale.scale[ch] = scale; + } + + // Set the cache + fScaleInfos[run] = thisscale; + + return thisscale; +} + +double icarus::calo::NormalizeTPCPerPlane::Normalize(double dQdx, const art::Event &e, + const recob::Hit &hit, const geo::Point_t &location, const geo::Vector_t &direction, double t0) { + // Get the info + ScaleInfo i = GetScaleInfo(e.id().runID().run()); + + // Lookup the TPC, cryo + unsigned tpc = hit.WireID().TPC; + unsigned cryo = hit.WireID().Cryostat; + unsigned plane = hit.WireID().Plane; + + // Get the TPC-Plane index + unsigned itpc_plane = 2*cryo + tpc/2 + plane*4; + + double scale = 1; + + // TODO: what to do if no scale is found? throw an exception?? + if (i.scale.count(itpc_plane)) scale = i.scale.at(itpc_plane); + + if (fVerbose) std::cout << "NormalizeTPCPerPlaneSQL Tool -- Data at Cryo: " << cryo << " TPC: " << tpc << " Plane: " << plane << " itpc_plane: " << itpc_plane << " scale: " << scale << std::endl; + + return dQdx * scale; +} + diff --git a/icaruscode/TPC/Calorimetry/NormalizeTPCSQL_tool.cc b/icaruscode/TPC/Calorimetry/NormalizeTPCSQL_tool.cc index 8189bbb45..276ce44b8 100644 --- a/icaruscode/TPC/Calorimetry/NormalizeTPCSQL_tool.cc +++ b/icaruscode/TPC/Calorimetry/NormalizeTPCSQL_tool.cc @@ -39,6 +39,7 @@ class NormalizeTPCSQL : public INormalizeCharge std::string fDBFileName; std::string fDBTag; bool fVerbose; + int fMC; lariov::DBFolder fDB; @@ -65,11 +66,15 @@ icarus::calo::NormalizeTPCSQL::NormalizeTPCSQL(fhicl::ParameterSet const &pset): fDBFileName(pset.get("DBFileName")), fDBTag(pset.get("DBTag")), fVerbose(pset.get("Verbose", false)), + fMC(pset.get("MC")), fDB(fDBFileName, "", "", fDBTag, true, false) {} void icarus::calo::NormalizeTPCSQL::configure(const fhicl::ParameterSet& pset) {} icarus::calo::NormalizeTPCSQL::ScaleInfo icarus::calo::NormalizeTPCSQL::GetScaleInfo(uint64_t run) { + + std::cout << "NormalizeTPCSQL Tool -- Getting scale info for run: " << run << std::endl; + // check the cache if (fScaleInfos.count(run)) { return fScaleInfos.at(run); @@ -98,8 +103,30 @@ icarus::calo::NormalizeTPCSQL::ScaleInfo icarus::calo::NormalizeTPCSQL::GetScale double icarus::calo::NormalizeTPCSQL::Normalize(double dQdx, const art::Event &e, const recob::Hit &hit, const geo::Point_t &location, const geo::Vector_t &direction, double t0) { + + std::cout << "NormalizeTPCSQL Tool -- MC Flag: " << fMC << " Run: " << e.id().runID().run() << ", Subrun: " << e.id().subRunID().run() << std::endl; + // Get the info - ScaleInfo i = GetScaleInfo(e.id().runID().run()); + uint64_t runID = -1; + switch (fMC) { + case 1: + runID = 8460; + break; + case 2: + runID = 9301; + break; + case 3: + runID = 11806; + break; + case 4: + runID = 12960; + break; + default: + runID = e.id().runID().run(); + break; + } + + ScaleInfo const& i = GetScaleInfo(runID); // Lookup the TPC, cryo unsigned tpc = hit.WireID().TPC; diff --git a/icaruscode/TPC/Calorimetry/NormalizeYZSQL_tool.cc b/icaruscode/TPC/Calorimetry/NormalizeYZSQL_tool.cc index 9868bd627..6d04a0e2e 100644 --- a/icaruscode/TPC/Calorimetry/NormalizeYZSQL_tool.cc +++ b/icaruscode/TPC/Calorimetry/NormalizeYZSQL_tool.cc @@ -39,6 +39,7 @@ class NormalizeYZSQL : public INormalizeCharge std::string fDBFileName; std::string fDBTag; bool fVerbose; + int fMC; lariov::DBFolder fDB; @@ -155,12 +156,15 @@ icarus::calo::NormalizeYZSQL::NormalizeYZSQL(fhicl::ParameterSet const &pset): fDBFileName(pset.get("DBFileName")), fDBTag(pset.get("DBTag")), fVerbose(pset.get("Verbose", false)), + fMC(pset.get("MC")), fDB(fDBFileName, "", "", fDBTag, true, false) {} void icarus::calo::NormalizeYZSQL::configure(const fhicl::ParameterSet& pset) {} const icarus::calo::NormalizeYZSQL::ScaleInfo& icarus::calo::NormalizeYZSQL::GetScaleInfo(uint64_t run) { + //std::cout << "NormalizeYZSQL Tool -- Getting scale info for run: " << run << std::endl; + // check the cache if (fScaleInfos.count(run)) { return fScaleInfos.at(run); @@ -230,8 +234,32 @@ const icarus::calo::NormalizeYZSQL::ScaleInfo& icarus::calo::NormalizeYZSQL::Get double icarus::calo::NormalizeYZSQL::Normalize(double dQdx, const art::Event &e, const recob::Hit &hit, const geo::Point_t &location, const geo::Vector_t &direction, double t0) { + std::cout << "NormalizeYZSQL Tool -- MC Flag: " << fMC << " Run: " << e.id().runID().run() << ", Subrun: " << e.id().subRunID().run() << std::endl; + // Get the info - ScaleInfo const& i = GetScaleInfo(e.id().runID().run()); + uint64_t runID = -1; + switch (fMC) { + case 1: + runID = 8460; + break; + case 2: + runID = 9301; + break; + case 3: + runID = 11806; + break; + case 4: + runID = 12960; + break; + case 5: + runID = 14079; + break; + default: + runID = e.id().runID().run(); + break; + } + + ScaleInfo const& i = GetScaleInfo(runID); // plane int plane = hit.WireID().Plane; diff --git a/icaruscode/TPC/Calorimetry/calorimetryICARUS.fcl b/icaruscode/TPC/Calorimetry/calorimetryICARUS.fcl index 6ca52f145..d482bb16e 100644 --- a/icaruscode/TPC/Calorimetry/calorimetryICARUS.fcl +++ b/icaruscode/TPC/Calorimetry/calorimetryICARUS.fcl @@ -6,10 +6,11 @@ BEGIN_PROLOG icarus_calorimetryalgdata: @local::standard_calorimetryalgdata icarus_calorimetryalgmc: @local::standard_calorimetryalgmc -# Calorimetry constants from G. Putnam (Nov 2022) -# Informed by MC calibration -- docdb 28639. -# NOTE: needs to be revisted if/when the data processing is updated -icarus_calorimetryalgmc.CalAreaConstants: [0.01343, 0.01338, 0.01219] +# GP 8/4/25: with re-calibration and application of EMB recombination, +# MC and data gains match. Note that we should not being making any +# updates to the MC that would cause the MC gain to differ from that of +# data. +icarus_calorimetryalgmc.CalAreaConstants: @local::icarus_data_calconst icarus_calorimetryalgmc.ModBoxA: 0.904 icarus_calorimetryalgmc.ModBoxBTF1: "[0]/TMath::Sqrt(TMath::Sin(x*TMath::Pi()/180)**2 + TMath::Cos(x*TMath::Pi()/180)**2/[1]**2)" icarus_calorimetryalgmc.ModBoxBParam: [0.204, 1.25] diff --git a/icaruscode/TPC/Calorimetry/normtools_icarus.fcl b/icaruscode/TPC/Calorimetry/normtools_icarus.fcl index 2a69eb647..6f74ec0e9 100644 --- a/icaruscode/TPC/Calorimetry/normtools_icarus.fcl +++ b/icaruscode/TPC/Calorimetry/normtools_icarus.fcl @@ -24,9 +24,9 @@ yznorm: { } tpcgain: { - tool_type: NormalizeTPC + tool_type: NormalizeTPCPerPlane Timeout: 200 - URL: "https://dbdata0vm.fnal.gov:9443/icarus_con_prod/app/data?f=tpc_dqdxcalibration_data&t=" + URL: "https://dbdata0vm.fnal.gov:9443/icarus_con_prod/app/data?f=tpc_dqdxcalibration_allplanes_data&t=" Verbose: false } @@ -34,14 +34,15 @@ driftnorm_sql: { tool_type: NormalizeDriftSQLite DBFileName: tpc_elifetime_data DBTag: @local::ICARUS_Calibration_GlobalTags.tpc_elifetime_data - Verbose: false + Verbose: true } tpcgain_sql: { - tool_type: NormalizeTPCSQL - DBFileName: tpc_dqdxcalibration_data - DBTag: @local::ICARUS_Calibration_GlobalTags.tpc_dqdxcalibration_data + tool_type: NormalizeTPCPerPlaneSQL + DBFileName: tpc_dqdxcalibration_allplanes_data + DBTag: @local::ICARUS_Calibration_GlobalTags.tpc_dqdxcalibration_allplanes_data Verbose: false + MC: -1 } tpcgain_local: { @@ -56,13 +57,14 @@ yznorm_sql: { DBFileName: tpc_yz_correction_allplanes_data DBTag: @local::ICARUS_Calibration_GlobalTags.tpc_yz_correction_allplanes_data Verbose: false + MC: -1 } -#icarus_calonormtools: [@local::driftnorm, @local::yznorm, @local::tpcgain] - icarus_calonormtools: [@local::driftnorm_sql, @local::yznorm_sql, @local::tpcgain_sql] +icarus_calonormtools: [@local::driftnorm_sql, @local::yznorm_sql, @local::tpcgain_sql] +icarus_calonormtoolsMC: [@local::yznorm_sql, @local::tpcgain_sql] -# Gain with angular dep. recombination. Measurement from: https://arxiv.org/pdf/2407.12969 -# Assume equal on planes -- this is __wrong__ -- will need to be fixed when they are calibrated -icarus_data_calconst: [0.0133333, 0.0133333, 0.0133333] +# GP 8/4/25 -- Update gain to re-measurement with Run 2 stopping muons and +# fixed recombination. +icarus_data_calconst: [0.016751, 0.012755, 0.012513] END_PROLOG diff --git a/icaruscode/TPC/ICARUSWireCell/detsimmodules_wirecell_ICARUS.fcl b/icaruscode/TPC/ICARUSWireCell/detsimmodules_wirecell_ICARUS.fcl index 6bc7c326f..f01f766cc 100644 --- a/icaruscode/TPC/ICARUSWireCell/detsimmodules_wirecell_ICARUS.fcl +++ b/icaruscode/TPC/ICARUSWireCell/detsimmodules_wirecell_ICARUS.fcl @@ -54,19 +54,18 @@ icarus_simwire_wirecell: overlay_drifter: false # default drifter by default # Gain and shaping time - gain0: 17.05212 # mV/fC - gain1: 12.6181926 # mV/fC - gain2: 13.0261362 # mV/fC + gain0: 18.0839 # mV/fC + gain1: 12.2379 # mV/fC + gain2: 13.8819 # mV/fC shaping0: 1.3 # us shaping1: 1.45 # us shaping2: 1.3 # us - # Time offsets for truth matching - time_offset_u: 0.0 # us - time_offset_v: 0.0 # us - time_offset_y: 0.0 # us - + # Time offsets for truth matching -- tuned to 2D deconvolution output + time_offset_u: 2.53 # us + time_offset_v: 2.41 # us + time_offset_y: 2.53 # us } } } @@ -81,6 +80,14 @@ icarus_simwire_wirecell_SConly.wcls_main.outputers:[ icarus_simwire_wirecell_shifted: @local::icarus_simwire_wirecell icarus_simwire_wirecell_shifted.wcls_main.params.SimEnergyDepositLabel: "shifted" +icarus_simwire_wirecell_shifted_overlay: @local::icarus_simwire_wirecell_shifted +icarus_simwire_wirecell_shifted_overlay.wcls_main.structs.coh_noise_scale: 0.0 # disable noise +icarus_simwire_wirecell_shifted_overlay.wcls_main.structs.int_noise_scale: 0.0 # ditto +icarus_simwire_wirecell_shifted_overlay.wcls_main.structs.overlay_drifter: true +icarus_simwire_wirecell_shifted_overlay.wcls_main.plugins: [@sequence::icarus_simwire_wirecell_shifted_overlay.wcls_main.plugins, "WireCellICARUSDrifter"] +icarus_simwire_wirecell_shifted_overlay.wcls_main.inputers: ["wclsSimDepoSetSource:electron", "wclsICARUSDrifter:drifter"] +icarus_simwire_wirecell_shifted_overlay.wcls_main.params.cathode_input_format: "scalar" + icarus_simwire_wirecell_filtersed: @local::icarus_simwire_wirecell icarus_simwire_wirecell_filtersed.wcls_main.params.SimEnergyDepositLabel: "filtersed" diff --git a/icaruscode/TPC/ICARUSWireCell/icarus/wcls-multitpc-sim-drift-simchannel-refactored.jsonnet b/icaruscode/TPC/ICARUSWireCell/icarus/wcls-multitpc-sim-drift-simchannel-refactored.jsonnet index e5a0210df..84e574bcb 100644 --- a/icaruscode/TPC/ICARUSWireCell/icarus/wcls-multitpc-sim-drift-simchannel-refactored.jsonnet +++ b/icaruscode/TPC/ICARUSWireCell/icarus/wcls-multitpc-sim-drift-simchannel-refactored.jsonnet @@ -166,12 +166,21 @@ local wcls_output = { sp_thresholds: wcls.output.thresholds(name='spthresholds', tags=['threshold']), }; -//local deposio = io.numpy.depos(output); -local drifter = sim.drifter; +local overlay_drifter = std.extVar("overlay_drifter"); + +local drifter = if overlay_drifter then { + local xregions = wc.unique_list(std.flattenArrays([v.faces for v in params.det.volumes])), + type: "wclsICARUSDrifter", + data: params.lar + sim.overlay_drifter_data { + TPC: 0, + charge_scale: 1 + }, + } else sim.drifter; + local setdrifter = g.pnode({ type: 'DepoSetDrifter', data: { - drifter: "Drifter" + drifter: if overlay_drifter then "wclsICARUSDrifter" else "Drifter" } }, nin=1, nout=1, uses=[drifter]); diff --git a/icaruscode/TPC/ICARUSWireCell/icarus/wcls-multitpc-sim-drift-simchannel-yzsim-refactored.jsonnet b/icaruscode/TPC/ICARUSWireCell/icarus/wcls-multitpc-sim-drift-simchannel-yzsim-refactored.jsonnet index db363894c..42b0e9eba 100644 --- a/icaruscode/TPC/ICARUSWireCell/icarus/wcls-multitpc-sim-drift-simchannel-yzsim-refactored.jsonnet +++ b/icaruscode/TPC/ICARUSWireCell/icarus/wcls-multitpc-sim-drift-simchannel-yzsim-refactored.jsonnet @@ -44,22 +44,22 @@ local params = base { // fields: [ std.extVar('files_fields'), ] fields: [ - "icarus_fnal_fit_ks_P0nom_P1bin0.json.bz2", - "icarus_fnal_fit_ks_P0nom_P1bin1.json.bz2", - "icarus_fnal_fit_ks_P0nom_P1bin2.json.bz2", - "icarus_fnal_fit_ks_P0nom_P1bin3.json.bz2", - "icarus_fnal_fit_ks_P0nom_P1bin4.json.bz2", - "icarus_fnal_fit_ks_P0nom_P1bin5.json.bz2", - "icarus_fnal_fit_ks_P0nom_P1bin6.json.bz2", - "icarus_fnal_fit_ks_P0nom_P1bin7.json.bz2", - "icarus_fnal_fit_ks_P0nom_P1bin8.json.bz2", - "icarus_fnal_fit_ks_P0nom_P1bin9.json.bz2", - "icarus_fnal_fit_ks_P0nom_P1bin10.json.bz2", - "icarus_fnal_fit_ks_P0nom_P1bin11.json.bz2", - "icarus_fnal_fit_ks_P0nom_P1bin12.json.bz2", - "icarus_fnal_fit_ks_P0nom_P1bin13.json.bz2", - "icarus_fnal_fit_ks_P0nom_P1bin14.json.bz2", - "icarus_fnal_fit_ks_P0nom_P1bin15.json.bz2"] + "icarus_fnal_fit_ks_P0nom_P1bin0_shifted.json.bz2", + "icarus_fnal_fit_ks_P0nom_P1bin1_shifted.json.bz2", + "icarus_fnal_fit_ks_P0nom_P1bin2_shifted.json.bz2", + "icarus_fnal_fit_ks_P0nom_P1bin3_shifted.json.bz2", + "icarus_fnal_fit_ks_P0nom_P1bin4_shifted.json.bz2", + "icarus_fnal_fit_ks_P0nom_P1bin5_shifted.json.bz2", + "icarus_fnal_fit_ks_P0nom_P1bin6_shifted.json.bz2", + "icarus_fnal_fit_ks_P0nom_P1bin7_shifted.json.bz2", + "icarus_fnal_fit_ks_P0nom_P1bin8_shifted.json.bz2", + "icarus_fnal_fit_ks_P0nom_P1bin9_shifted.json.bz2", + "icarus_fnal_fit_ks_P0nom_P1bin10_shifted.json.bz2", + "icarus_fnal_fit_ks_P0nom_P1bin11_shifted.json.bz2", + "icarus_fnal_fit_ks_P0nom_P1bin12_shifted.json.bz2", + "icarus_fnal_fit_ks_P0nom_P1bin13_shifted.json.bz2", + "icarus_fnal_fit_ks_P0nom_P1bin14_shifted.json.bz2", + "icarus_fnal_fit_ks_P0nom_P1bin15_shifted.json.bz2"] }, rc_resp: if std.extVar('file_rcresp') != "" then @@ -221,7 +221,7 @@ local scalers = [{ type: "Scaler", name: "scaler%d" %n, //%std.floor(n/45), data: params.lar { - yzmap_scale_filename: 'yzmap_gain_icarus_v3_run2.json', + yzmap_scale_filename: 'yzmap_gain_icarus_v4_run2.json', bin_width: 10*wc.cm, tpc_width: 1500*wc.mm, bin_height: 10*wc.cm, diff --git a/icaruscode/TPC/SignalProcessing/HitFinder/HitMerger_module.cc b/icaruscode/TPC/SignalProcessing/HitFinder/HitMerger_module.cc index 993b74ed3..90a6d9856 100644 --- a/icaruscode/TPC/SignalProcessing/HitFinder/HitMerger_module.cc +++ b/icaruscode/TPC/SignalProcessing/HitFinder/HitMerger_module.cc @@ -37,6 +37,8 @@ #include "lardata/DetectorInfoServices/DetectorPropertiesService.h" #include "lardata/DetectorInfoServices/LArPropertiesService.h" +#include "sbnobj/ICARUS/TPC/ChannelROI.h" + class HitMerger : public art::EDProducer { public: @@ -62,8 +64,13 @@ class HitMerger : public art::EDProducer /** * @brief Create raw::RawDigit to recob::Hit associations */ - void makeRawDigitAssns(const art::Event&, art::Assns&, RecobHitToPtrMap&) const; + + /** + * @brief Create recob::ChannelROI to recob::Hit associatins + */ + void makeChanROIAssns(const art::Event&, art::Assns&, RecobHitToPtrMap&) const; + // define vector for hits to make sure of uniform use using HitPtrVector = std::vector>; @@ -87,6 +94,7 @@ HitMerger::HitMerger(fhicl::ParameterSet const & pset) : EDProducer{pset} produces< std::vector>(); produces< art::Assns>(); produces< art::Assns>(); + produces< art::Assns>(); // Report. mf::LogInfo("HitMerger") << "HitMerger configured\n"; @@ -139,6 +147,9 @@ void HitMerger::produce(art::Event & evt) /// Associations with raw digits. std::unique_ptr> rawDigitAssns(new art::Assns); + /// Associations with channel ROIs. + std::unique_ptr> chanROIAssns(new art::Assns); + RecobHitToPtrMap recobHitToPtrMap; // Use this handy art utility to make art::Ptr objects to the new recob::Hits for use in the output phase @@ -172,11 +183,14 @@ void HitMerger::produce(art::Event & evt) makeWireAssns(evt, *wireAssns, recobHitToPtrMap); makeRawDigitAssns(evt, *rawDigitAssns, recobHitToPtrMap); + + makeChanROIAssns(evt, *chanROIAssns, recobHitToPtrMap); // Move everything into the event evt.put(std::move(outputHitPtrVec)); evt.put(std::move(wireAssns)); evt.put(std::move(rawDigitAssns)); + evt.put(std::move(chanROIAssns)); return; } @@ -264,6 +278,48 @@ void HitMerger::makeRawDigitAssns(const art::Event& evt, art::Assns &chanROIAssns, RecobHitToPtrMap& recobHitPtrMap) const +{ + // Let's make sure the input associations container is empty + chanROIAssns = art::Assns(); + + // First task is to recover all of the previous chanROI <--> hit associations and map them by channel number + // Create the temporary container + std::unordered_map> channelToChanROIMap; + + // Go through the list of input sources and fill out the map + for(const auto& inputTag : HitMergerfHitProducerLabelVec) + { + art::ValidHandle> hitHandle = evt.getValidHandle>(inputTag); + + art::FindOneP hitToChanROIAssns(hitHandle, evt, inputTag); + + if (hitToChanROIAssns.isValid()) + { + for(size_t chanROIIdx = 0; chanROIIdx < hitToChanROIAssns.size(); chanROIIdx++) + { + art::Ptr chanROI = hitToChanROIAssns.at(chanROIIdx); + + channelToChanROIMap[chanROI->Channel()] = chanROI; + } + } + } + + // Now fill the container + for(const auto& hitPtrPair : recobHitPtrMap) + { + raw::ChannelID_t channel = hitPtrPair.first->Channel(); + + std::unordered_map>::iterator chanChanROIItr = channelToChanROIMap.find(channel); + + if (!(chanChanROIItr != channelToChanROIMap.end())) continue; + + chanROIAssns.addSingle(chanChanROIItr->second, hitPtrPair.second); + } + + return; +} //---------------------------------------------------------------------------- /// End job method. diff --git a/icaruscode/TPC/SignalProcessing/HitFinder/hitfindermodules_icarus.fcl b/icaruscode/TPC/SignalProcessing/HitFinder/hitfindermodules_icarus.fcl index fdce3c80e..093524b07 100644 --- a/icaruscode/TPC/SignalProcessing/HitFinder/hitfindermodules_icarus.fcl +++ b/icaruscode/TPC/SignalProcessing/HitFinder/hitfindermodules_icarus.fcl @@ -124,5 +124,15 @@ icarus_hitconverter: DaignosticOutput: false } +icarus_hitmerger_cryoE: { + module_type: HitMerger + HitProducerLabelVec: ["gaushit2dTPCEW", "gaushit2dTPCEE"] +} + +icarus_hitmerger_cryoW: { + module_type: HitMerger + HitProducerLabelVec: ["gaushit2dTPCWW", "gaushit2dTPCWE"] +} + END_PROLOG diff --git a/ups/product_deps b/ups/product_deps index 442b50987..735740258 100644 --- a/ups/product_deps +++ b/ups/product_deps @@ -251,12 +251,12 @@ wpdir product_dir wire-cell-cfg #################################### product version qual flags fftw v3_3_10 - -icarus_data v09_93_06 - +icarus_data v10_06_00 - icarus_signal_processing v10_06_00_01 - -icarusalg v10_06_00_01 - -icarusutil v09_88_00_02 - +icarusalg v10_06_00_04 - +icarusutil v10_06_00_04 - libwda v2_30_0a - -sbncode v10_06_00_01 - +sbncode v10_06_00_04 - cetmodules v3_24_01 - only_for_build end_product_list ####################################