From bb6e659f84cb6c90c70ab038a2aaffb8514c9e30 Mon Sep 17 00:00:00 2001 From: jzennamo Date: Sun, 8 Dec 2024 21:07:21 -0600 Subject: [PATCH] changes needed for yz sim --- .../detsim_2d_icarus_refactored_yzsim.fcl | 57 + fcl/g4/mergesimsources_icarus.fcl | 741 +++++++++ .../detsimmodules_wirecell_ICARUS.fcl | 4 +- .../detsimmodules_wirecell_ICARUS_YZsim.fcl | 483 ++++++ ...mmodules_wirecell_ICARUS_YZsim_shifted.fcl | 483 ++++++ .../TPC/ICARUSWireCell/icarus/funcs.jsonnet | 1339 +++++++++++++++++ .../TPC/ICARUSWireCell/icarus/params.jsonnet | 18 +- .../TPC/ICARUSWireCell/icarus/sim.jsonnet | 36 +- ...rift-simchannel-shifted-refactored.jsonnet | 2 +- ...-drift-simchannel-yzsim-refactored.jsonnet | 495 ++++++ ...imchannel-yzsim-shifted-refactored.jsonnet | 495 ++++++ ...ultitpc-sim-drift-simchannel-yzsim.jsonnet | 468 ++++++ ...ls-multitpc-sim-drift-simchannel_YZsim.fcl | 461 ++++++ 13 files changed, 5076 insertions(+), 6 deletions(-) create mode 100644 fcl/detsim/detsim_2d_icarus_refactored_yzsim.fcl create mode 100644 icaruscode/TPC/ICARUSWireCell/detsimmodules_wirecell_ICARUS_YZsim.fcl create mode 100644 icaruscode/TPC/ICARUSWireCell/detsimmodules_wirecell_ICARUS_YZsim_shifted.fcl create mode 100644 icaruscode/TPC/ICARUSWireCell/icarus/wcls-multitpc-sim-drift-simchannel-yzsim-refactored.jsonnet create mode 100644 icaruscode/TPC/ICARUSWireCell/icarus/wcls-multitpc-sim-drift-simchannel-yzsim-shifted-refactored.jsonnet create mode 100644 icaruscode/TPC/ICARUSWireCell/icarus/wcls-multitpc-sim-drift-simchannel-yzsim.jsonnet create mode 100644 icaruscode/TPC/ICARUSWireCell/wcls-multitpc-sim-drift-simchannel_YZsim.fcl diff --git a/fcl/detsim/detsim_2d_icarus_refactored_yzsim.fcl b/fcl/detsim/detsim_2d_icarus_refactored_yzsim.fcl new file mode 100644 index 000000000..a6bf8773b --- /dev/null +++ b/fcl/detsim/detsim_2d_icarus_refactored_yzsim.fcl @@ -0,0 +1,57 @@ +#include "services_icarus_simulation.fcl" +#include "larg4_services_icarus.fcl" +#include "detsimmodules_wirecell_ICARUS_YZsim.fcl" +#include "opdetsim_pmt_icarus.fcl" +#include "crtsimmodules_icarus.fcl" +#include "trigger_emulation_icarus.fcl" +#include "rootoutput_icarus.fcl" +#include "mergesimsources_icarus.fcl" + +process_name: DetSim + +services: { + @table::icarus_detsim_services + @table::icarus_g4_services + @table::icarus_larg4_services + #FileCatalogMetadata: @local::art_file_catalog_mc +} # services + +physics: { + + producers: { + @table::icarus_shifting_triggersim.producers + + crtdaq: @local::icarus_crtsim + opdaq: @local::icarus_simpmt + daq: @local::icarus_simwire_wirecell + merge: @local::icarus_merge_yz_wirecell_simchans + + rns: { module_type: "RandomNumberSaver" } + } # producers + + simulate: [ rns, opdaq, @sequence::icarus_shifting_triggersim.path, daq, merge, crtdaq ] + + # define the output stream, there could be more than one if using filters + stream: [ rootoutput ] + +} # physics + +outputs: { + rootoutput: { + @table::icarus_rootoutput + outputCommands: [ + "keep *" +# , "drop *_ionization_*_*" +# , "drop *_pmtlvdsgatesinit_*_*" +# , "drop *_pmtfixedthrinit_*_*" +# , "drop *_pmttriggerwindowsinit_*_*" +# , "drop *_triggersimgatesinit_*_*" + ] + } +} + +physics.producers.daq.wcls_main.configs: ["pgrapher/experiment/icarus/wcls-multitpc-sim-drift-simchannel-yzsim-shifted-refactored.jsonnet"] +physics.producers.crtdaq.G4ModuleLabel: "shifted" +physics.producers.opdaq.InputModule: "pdfastsim" +physics.producers.shifted.InitAuxDetSimChannelLabel: "genericcrt" +physics.producers.shifted.InitSimPhotonsLabel: "pdfastsim" diff --git a/fcl/g4/mergesimsources_icarus.fcl b/fcl/g4/mergesimsources_icarus.fcl index 859073947..d61d570eb 100644 --- a/fcl/g4/mergesimsources_icarus.fcl +++ b/fcl/g4/mergesimsources_icarus.fcl @@ -5,6 +5,7 @@ icarus_merge_sim_sources : { FillMCParticles: false FillSimPhotons: false FillSimChannels: false + SkipTrackIDOffsets: false FillAuxDetSimChannels: false FillSimEnergyDeposits: false FillAuxDetHits: false @@ -57,4 +58,744 @@ icarus_merge_intime_dropped_mcparts: FillMCParticlesAssociated: false } +icarus_merge_yz_wirecell_simchans : +{ + @table::icarus_merge_sim_sources + FillSimChannels: true + SkipTrackIDOffsets: true + FillMCParticles: false + FillSimPhotons: false + FillAuxDetSimChannels: false + FillSimEnergyDeposits: false + FillAuxDetHits: false + + InputSourcesLabels: [ + "daq:simpleSC0" + ,"daq:simpleSC1" + ,"daq:simpleSC2" + ,"daq:simpleSC3" + ,"daq:simpleSC4" + ,"daq:simpleSC5" + ,"daq:simpleSC6" + ,"daq:simpleSC7" + ,"daq:simpleSC8" + ,"daq:simpleSC9" + ,"daq:simpleSC10" + ,"daq:simpleSC11" + ,"daq:simpleSC12" + ,"daq:simpleSC13" + ,"daq:simpleSC14" + ,"daq:simpleSC15" + ,"daq:simpleSC16" + ,"daq:simpleSC17" + ,"daq:simpleSC18" + ,"daq:simpleSC19" + ,"daq:simpleSC20" + ,"daq:simpleSC21" + ,"daq:simpleSC22" + ,"daq:simpleSC23" + ,"daq:simpleSC24" + ,"daq:simpleSC25" + ,"daq:simpleSC26" + ,"daq:simpleSC27" + ,"daq:simpleSC28" + ,"daq:simpleSC29" + ,"daq:simpleSC30" + ,"daq:simpleSC31" + ,"daq:simpleSC32" + ,"daq:simpleSC33" + ,"daq:simpleSC34" + ,"daq:simpleSC35" + ,"daq:simpleSC36" + ,"daq:simpleSC37" + ,"daq:simpleSC38" + ,"daq:simpleSC39" + ,"daq:simpleSC40" + ,"daq:simpleSC41" + ,"daq:simpleSC42" + ,"daq:simpleSC43" + ,"daq:simpleSC44" + ,"daq:simpleSC45" + ,"daq:simpleSC46" + ,"daq:simpleSC47" + ,"daq:simpleSC48" + ,"daq:simpleSC49" + ,"daq:simpleSC50" + ,"daq:simpleSC51" + ,"daq:simpleSC52" + ,"daq:simpleSC53" + ,"daq:simpleSC54" + ,"daq:simpleSC55" + ,"daq:simpleSC56" + ,"daq:simpleSC57" + ,"daq:simpleSC58" + ,"daq:simpleSC59" + ,"daq:simpleSC60" + ,"daq:simpleSC61" + ,"daq:simpleSC62" + ,"daq:simpleSC63" + ,"daq:simpleSC64" + ,"daq:simpleSC65" + ,"daq:simpleSC66" + ,"daq:simpleSC67" + ,"daq:simpleSC68" + ,"daq:simpleSC69" + ,"daq:simpleSC70" + ,"daq:simpleSC71" + ,"daq:simpleSC72" + ,"daq:simpleSC73" + ,"daq:simpleSC74" + ,"daq:simpleSC75" + ,"daq:simpleSC76" + ,"daq:simpleSC77" + ,"daq:simpleSC78" + ,"daq:simpleSC79" + ,"daq:simpleSC80" + ,"daq:simpleSC81" + ,"daq:simpleSC82" + ,"daq:simpleSC83" + ,"daq:simpleSC84" + ,"daq:simpleSC85" + ,"daq:simpleSC86" + ,"daq:simpleSC87" + ,"daq:simpleSC88" + ,"daq:simpleSC89" + ,"daq:simpleSC90" + ,"daq:simpleSC91" + ,"daq:simpleSC92" + ,"daq:simpleSC93" + ,"daq:simpleSC94" + ,"daq:simpleSC95" + ,"daq:simpleSC96" + ,"daq:simpleSC97" + ,"daq:simpleSC98" + ,"daq:simpleSC99" + ,"daq:simpleSC100" + ,"daq:simpleSC101" + ,"daq:simpleSC102" + ,"daq:simpleSC103" + ,"daq:simpleSC104" + ,"daq:simpleSC105" + ,"daq:simpleSC106" + ,"daq:simpleSC107" + ,"daq:simpleSC108" + ,"daq:simpleSC109" + ,"daq:simpleSC110" + ,"daq:simpleSC111" + ,"daq:simpleSC112" + ,"daq:simpleSC113" + ,"daq:simpleSC114" + ,"daq:simpleSC115" + ,"daq:simpleSC116" + ,"daq:simpleSC117" + ,"daq:simpleSC118" + ,"daq:simpleSC119" + ,"daq:simpleSC120" + ,"daq:simpleSC121" + ,"daq:simpleSC122" + ,"daq:simpleSC123" + ,"daq:simpleSC124" + ,"daq:simpleSC125" + ,"daq:simpleSC126" + ,"daq:simpleSC127" + ,"daq:simpleSC128" + ,"daq:simpleSC129" + ,"daq:simpleSC130" + ,"daq:simpleSC131" + ,"daq:simpleSC132" + ,"daq:simpleSC133" + ,"daq:simpleSC134" + ,"daq:simpleSC135" + ,"daq:simpleSC136" + ,"daq:simpleSC137" + ,"daq:simpleSC138" + ,"daq:simpleSC139" + ,"daq:simpleSC140" + ,"daq:simpleSC141" + ,"daq:simpleSC142" + ,"daq:simpleSC143" + ,"daq:simpleSC144" + ,"daq:simpleSC145" + ,"daq:simpleSC146" + ,"daq:simpleSC147" + ,"daq:simpleSC148" + ,"daq:simpleSC149" + ,"daq:simpleSC150" + ,"daq:simpleSC151" + ,"daq:simpleSC152" + ,"daq:simpleSC153" + ,"daq:simpleSC154" + ,"daq:simpleSC155" + ,"daq:simpleSC156" + ,"daq:simpleSC157" + ,"daq:simpleSC158" + ,"daq:simpleSC159" + ,"daq:simpleSC160" + ,"daq:simpleSC161" + ,"daq:simpleSC162" + ,"daq:simpleSC163" + ,"daq:simpleSC164" + ,"daq:simpleSC165" + ,"daq:simpleSC166" + ,"daq:simpleSC167" + ,"daq:simpleSC168" + ,"daq:simpleSC169" + ,"daq:simpleSC170" + ,"daq:simpleSC171" + ,"daq:simpleSC172" + ,"daq:simpleSC173" + ,"daq:simpleSC174" + ,"daq:simpleSC175" + ,"daq:simpleSC176" + ,"daq:simpleSC177" + ,"daq:simpleSC178" + ,"daq:simpleSC179" + ,"daq:simpleSC180" + ,"daq:simpleSC181" + ,"daq:simpleSC182" + ,"daq:simpleSC183" + ,"daq:simpleSC184" + ,"daq:simpleSC185" + ,"daq:simpleSC186" + ,"daq:simpleSC187" + ,"daq:simpleSC188" + ,"daq:simpleSC189" + ,"daq:simpleSC190" + ,"daq:simpleSC191" + ,"daq:simpleSC192" + ,"daq:simpleSC193" + ,"daq:simpleSC194" + ,"daq:simpleSC195" + ,"daq:simpleSC196" + ,"daq:simpleSC197" + ,"daq:simpleSC198" + ,"daq:simpleSC199" + ,"daq:simpleSC200" + ,"daq:simpleSC201" + ,"daq:simpleSC202" + ,"daq:simpleSC203" + ,"daq:simpleSC204" + ,"daq:simpleSC205" + ,"daq:simpleSC206" + ,"daq:simpleSC207" + ,"daq:simpleSC208" + ,"daq:simpleSC209" + ,"daq:simpleSC210" + ,"daq:simpleSC211" + ,"daq:simpleSC212" + ,"daq:simpleSC213" + ,"daq:simpleSC214" + ,"daq:simpleSC215" + ,"daq:simpleSC216" + ,"daq:simpleSC217" + ,"daq:simpleSC218" + ,"daq:simpleSC219" + ,"daq:simpleSC220" + ,"daq:simpleSC221" + ,"daq:simpleSC222" + ,"daq:simpleSC223" + ,"daq:simpleSC224" + ,"daq:simpleSC225" + ,"daq:simpleSC226" + ,"daq:simpleSC227" + ,"daq:simpleSC228" + ,"daq:simpleSC229" + ,"daq:simpleSC230" + ,"daq:simpleSC231" + ,"daq:simpleSC232" + ,"daq:simpleSC233" + ,"daq:simpleSC234" + ,"daq:simpleSC235" + ,"daq:simpleSC236" + ,"daq:simpleSC237" + ,"daq:simpleSC238" + ,"daq:simpleSC239" + ,"daq:simpleSC240" + ,"daq:simpleSC241" + ,"daq:simpleSC242" + ,"daq:simpleSC243" + ,"daq:simpleSC244" + ,"daq:simpleSC245" + ,"daq:simpleSC246" + ,"daq:simpleSC247" + ,"daq:simpleSC248" + ,"daq:simpleSC249" + ,"daq:simpleSC250" + ,"daq:simpleSC251" + ,"daq:simpleSC252" + ,"daq:simpleSC253" + ,"daq:simpleSC254" + ,"daq:simpleSC255" + ,"daq:simpleSC256" + ,"daq:simpleSC257" + ,"daq:simpleSC258" + ,"daq:simpleSC259" + ,"daq:simpleSC260" + ,"daq:simpleSC261" + ,"daq:simpleSC262" + ,"daq:simpleSC263" + ,"daq:simpleSC264" + ,"daq:simpleSC265" + ,"daq:simpleSC266" + ,"daq:simpleSC267" + ,"daq:simpleSC268" + ,"daq:simpleSC269" + ,"daq:simpleSC270" + ,"daq:simpleSC271" + ,"daq:simpleSC272" + ,"daq:simpleSC273" + ,"daq:simpleSC274" + ,"daq:simpleSC275" + ,"daq:simpleSC276" + ,"daq:simpleSC277" + ,"daq:simpleSC278" + ,"daq:simpleSC279" + ,"daq:simpleSC280" + ,"daq:simpleSC281" + ,"daq:simpleSC282" + ,"daq:simpleSC283" + ,"daq:simpleSC284" + ,"daq:simpleSC285" + ,"daq:simpleSC286" + ,"daq:simpleSC287" + ,"daq:simpleSC288" + ,"daq:simpleSC289" + ,"daq:simpleSC290" + ,"daq:simpleSC291" + ,"daq:simpleSC292" + ,"daq:simpleSC293" + ,"daq:simpleSC294" + ,"daq:simpleSC295" + ,"daq:simpleSC296" + ,"daq:simpleSC297" + ,"daq:simpleSC298" + ,"daq:simpleSC299" + ,"daq:simpleSC300" + ,"daq:simpleSC301" + ,"daq:simpleSC302" + ,"daq:simpleSC303" + ,"daq:simpleSC304" + ,"daq:simpleSC305" + ,"daq:simpleSC306" + ,"daq:simpleSC307" + ,"daq:simpleSC308" + ,"daq:simpleSC309" + ,"daq:simpleSC310" + ,"daq:simpleSC311" + ,"daq:simpleSC312" + ,"daq:simpleSC313" + ,"daq:simpleSC314" + ,"daq:simpleSC315" + ,"daq:simpleSC316" + ,"daq:simpleSC317" + ,"daq:simpleSC318" + ,"daq:simpleSC319" + ,"daq:simpleSC320" + ,"daq:simpleSC321" + ,"daq:simpleSC322" + ,"daq:simpleSC323" + ,"daq:simpleSC324" + ,"daq:simpleSC325" + ,"daq:simpleSC326" + ,"daq:simpleSC327" + ,"daq:simpleSC328" + ,"daq:simpleSC329" + ,"daq:simpleSC330" + ,"daq:simpleSC331" + ,"daq:simpleSC332" + ,"daq:simpleSC333" + ,"daq:simpleSC334" + ,"daq:simpleSC335" + ,"daq:simpleSC336" + ,"daq:simpleSC337" + ,"daq:simpleSC338" + ,"daq:simpleSC339" + ,"daq:simpleSC340" + ,"daq:simpleSC341" + ,"daq:simpleSC342" + ,"daq:simpleSC343" + ,"daq:simpleSC344" + ,"daq:simpleSC345" + ,"daq:simpleSC346" + ,"daq:simpleSC347" + ,"daq:simpleSC348" + ,"daq:simpleSC349" + ,"daq:simpleSC350" + ,"daq:simpleSC351" + ,"daq:simpleSC352" + ,"daq:simpleSC353" + ,"daq:simpleSC354" + ,"daq:simpleSC355" + ,"daq:simpleSC356" + ,"daq:simpleSC357" + ,"daq:simpleSC358" + ,"daq:simpleSC359" + ] + + TrackIDOffsets: [ +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0, +0 + ] + + +} + END_PROLOG diff --git a/icaruscode/TPC/ICARUSWireCell/detsimmodules_wirecell_ICARUS.fcl b/icaruscode/TPC/ICARUSWireCell/detsimmodules_wirecell_ICARUS.fcl index fb6d9d486..d92620621 100644 --- a/icaruscode/TPC/ICARUSWireCell/detsimmodules_wirecell_ICARUS.fcl +++ b/icaruscode/TPC/ICARUSWireCell/detsimmodules_wirecell_ICARUS.fcl @@ -12,8 +12,8 @@ icarus_simwire_wirecell: { tool_type: WCLS apps: ["Pgrapher"] - // logsinks: ["stdout"] - // loglevels: ["magnify:debug"] + //logsinks: ["stdout"] + //loglevels: ["magnify:debug"] plugins: ["WireCellPgraph", "WireCellGen","WireCellSio","WireCellRoot","WireCellLarsoft"] // needs to be found via your WIRECELL_PATH configs: ["pgrapher/experiment/icarus/wcls-multitpc-sim-drift-simchannel-refactored.jsonnet"] diff --git a/icaruscode/TPC/ICARUSWireCell/detsimmodules_wirecell_ICARUS_YZsim.fcl b/icaruscode/TPC/ICARUSWireCell/detsimmodules_wirecell_ICARUS_YZsim.fcl new file mode 100644 index 000000000..24a0bcaf5 --- /dev/null +++ b/icaruscode/TPC/ICARUSWireCell/detsimmodules_wirecell_ICARUS_YZsim.fcl @@ -0,0 +1,483 @@ +// We need this for Detector Properties +#include "services_basic_icarus.fcl" +// We need this for diffusion +#include "simulationservices_icarus.fcl" + +BEGIN_PROLOG + +icarus_simwire_wirecell: +{ + module_type : WireCellToolkit + wcls_main: + { + tool_type: WCLS + apps: ["Pgrapher"] + //logsinks: ["stdout"] + //loglevels: ["magnify:debug"] + plugins: ["WireCellPgraph", "WireCellGen","WireCellSio","WireCellRoot","WireCellLarsoft"] + // needs to be found via your WIRECELL_PATH + configs: ["pgrapher/experiment/icarus/wcls-multitpc-sim-drift-simchannel-yzsim-refactored.jsonnet"] + // Contract note: these exact "type:name" must be used to identify + // the configuration data structures for these components in the Jsonnet. + inputers: ["wclsSimDepoSetSource:electron"] + outputers: + [ + //"wclsDepoSetSimChannelSink:postdriftold", + //"wclsDepoFluxWriter:postdrift", + //"wclsDepoFluxWriter:postdrift359", + "wclsDepoFluxWriter:postdrift0", + "wclsDepoFluxWriter:postdrift1", + "wclsDepoFluxWriter:postdrift2", + "wclsDepoFluxWriter:postdrift3", + "wclsDepoFluxWriter:postdrift4", + "wclsDepoFluxWriter:postdrift5", + "wclsDepoFluxWriter:postdrift6", + "wclsDepoFluxWriter:postdrift7", + "wclsDepoFluxWriter:postdrift8", + "wclsDepoFluxWriter:postdrift9", + "wclsDepoFluxWriter:postdrift10", + "wclsDepoFluxWriter:postdrift11", + "wclsDepoFluxWriter:postdrift12", + "wclsDepoFluxWriter:postdrift13", + "wclsDepoFluxWriter:postdrift14", + "wclsDepoFluxWriter:postdrift15", + "wclsDepoFluxWriter:postdrift16", + "wclsDepoFluxWriter:postdrift17", + "wclsDepoFluxWriter:postdrift18", + "wclsDepoFluxWriter:postdrift19", + "wclsDepoFluxWriter:postdrift20", + "wclsDepoFluxWriter:postdrift21", + "wclsDepoFluxWriter:postdrift22", + "wclsDepoFluxWriter:postdrift23", + "wclsDepoFluxWriter:postdrift24", + "wclsDepoFluxWriter:postdrift25", + "wclsDepoFluxWriter:postdrift26", + "wclsDepoFluxWriter:postdrift27", + "wclsDepoFluxWriter:postdrift28", + "wclsDepoFluxWriter:postdrift29", + "wclsDepoFluxWriter:postdrift30", + "wclsDepoFluxWriter:postdrift31", + "wclsDepoFluxWriter:postdrift32", + "wclsDepoFluxWriter:postdrift33", + "wclsDepoFluxWriter:postdrift34", + "wclsDepoFluxWriter:postdrift35", + "wclsDepoFluxWriter:postdrift36", + "wclsDepoFluxWriter:postdrift37", + "wclsDepoFluxWriter:postdrift38", + "wclsDepoFluxWriter:postdrift39", + "wclsDepoFluxWriter:postdrift40", + "wclsDepoFluxWriter:postdrift41", + "wclsDepoFluxWriter:postdrift42", + "wclsDepoFluxWriter:postdrift43", + "wclsDepoFluxWriter:postdrift44", + "wclsDepoFluxWriter:postdrift45", + "wclsDepoFluxWriter:postdrift46", + "wclsDepoFluxWriter:postdrift47", + "wclsDepoFluxWriter:postdrift48", + "wclsDepoFluxWriter:postdrift49", + "wclsDepoFluxWriter:postdrift50", + "wclsDepoFluxWriter:postdrift51", + "wclsDepoFluxWriter:postdrift52", + "wclsDepoFluxWriter:postdrift53", + "wclsDepoFluxWriter:postdrift54", + "wclsDepoFluxWriter:postdrift55", + "wclsDepoFluxWriter:postdrift56", + "wclsDepoFluxWriter:postdrift57", + "wclsDepoFluxWriter:postdrift58", + "wclsDepoFluxWriter:postdrift59", + "wclsDepoFluxWriter:postdrift60", + "wclsDepoFluxWriter:postdrift61", + "wclsDepoFluxWriter:postdrift62", + "wclsDepoFluxWriter:postdrift63", + "wclsDepoFluxWriter:postdrift64", + "wclsDepoFluxWriter:postdrift65", + "wclsDepoFluxWriter:postdrift66", + "wclsDepoFluxWriter:postdrift67", + "wclsDepoFluxWriter:postdrift68", + "wclsDepoFluxWriter:postdrift69", + "wclsDepoFluxWriter:postdrift70", + "wclsDepoFluxWriter:postdrift71", + "wclsDepoFluxWriter:postdrift72", + "wclsDepoFluxWriter:postdrift73", + "wclsDepoFluxWriter:postdrift74", + "wclsDepoFluxWriter:postdrift75", + "wclsDepoFluxWriter:postdrift76", + "wclsDepoFluxWriter:postdrift77", + "wclsDepoFluxWriter:postdrift78", + "wclsDepoFluxWriter:postdrift79", + "wclsDepoFluxWriter:postdrift80", + "wclsDepoFluxWriter:postdrift81", + "wclsDepoFluxWriter:postdrift82", + "wclsDepoFluxWriter:postdrift83", + "wclsDepoFluxWriter:postdrift84", + "wclsDepoFluxWriter:postdrift85", + "wclsDepoFluxWriter:postdrift86", + "wclsDepoFluxWriter:postdrift87", + "wclsDepoFluxWriter:postdrift88", + "wclsDepoFluxWriter:postdrift89", + "wclsDepoFluxWriter:postdrift90", + "wclsDepoFluxWriter:postdrift91", + "wclsDepoFluxWriter:postdrift92", + "wclsDepoFluxWriter:postdrift93", + "wclsDepoFluxWriter:postdrift94", + "wclsDepoFluxWriter:postdrift95", + "wclsDepoFluxWriter:postdrift96", + "wclsDepoFluxWriter:postdrift97", + "wclsDepoFluxWriter:postdrift98", + "wclsDepoFluxWriter:postdrift99", + "wclsDepoFluxWriter:postdrift100", + "wclsDepoFluxWriter:postdrift101", + "wclsDepoFluxWriter:postdrift102", + "wclsDepoFluxWriter:postdrift103", + "wclsDepoFluxWriter:postdrift104", + "wclsDepoFluxWriter:postdrift105", + "wclsDepoFluxWriter:postdrift106", + "wclsDepoFluxWriter:postdrift107", + "wclsDepoFluxWriter:postdrift108", + "wclsDepoFluxWriter:postdrift109", + "wclsDepoFluxWriter:postdrift110", + "wclsDepoFluxWriter:postdrift111", + "wclsDepoFluxWriter:postdrift112", + "wclsDepoFluxWriter:postdrift113", + "wclsDepoFluxWriter:postdrift114", + "wclsDepoFluxWriter:postdrift115", + "wclsDepoFluxWriter:postdrift116", + "wclsDepoFluxWriter:postdrift117", + "wclsDepoFluxWriter:postdrift118", + "wclsDepoFluxWriter:postdrift119", + "wclsDepoFluxWriter:postdrift120", + "wclsDepoFluxWriter:postdrift121", + "wclsDepoFluxWriter:postdrift122", + "wclsDepoFluxWriter:postdrift123", + "wclsDepoFluxWriter:postdrift124", + "wclsDepoFluxWriter:postdrift125", + "wclsDepoFluxWriter:postdrift126", + "wclsDepoFluxWriter:postdrift127", + "wclsDepoFluxWriter:postdrift128", + "wclsDepoFluxWriter:postdrift129", + "wclsDepoFluxWriter:postdrift130", + "wclsDepoFluxWriter:postdrift131", + "wclsDepoFluxWriter:postdrift132", + "wclsDepoFluxWriter:postdrift133", + "wclsDepoFluxWriter:postdrift134", + "wclsDepoFluxWriter:postdrift135", + "wclsDepoFluxWriter:postdrift136", + "wclsDepoFluxWriter:postdrift137", + "wclsDepoFluxWriter:postdrift138", + "wclsDepoFluxWriter:postdrift139", + "wclsDepoFluxWriter:postdrift140", + "wclsDepoFluxWriter:postdrift141", + "wclsDepoFluxWriter:postdrift142", + "wclsDepoFluxWriter:postdrift143", + "wclsDepoFluxWriter:postdrift144", + "wclsDepoFluxWriter:postdrift145", + "wclsDepoFluxWriter:postdrift146", + "wclsDepoFluxWriter:postdrift147", + "wclsDepoFluxWriter:postdrift148", + "wclsDepoFluxWriter:postdrift149", + "wclsDepoFluxWriter:postdrift150", + "wclsDepoFluxWriter:postdrift151", + "wclsDepoFluxWriter:postdrift152", + "wclsDepoFluxWriter:postdrift153", + "wclsDepoFluxWriter:postdrift154", + "wclsDepoFluxWriter:postdrift155", + "wclsDepoFluxWriter:postdrift156", + "wclsDepoFluxWriter:postdrift157", + "wclsDepoFluxWriter:postdrift158", + "wclsDepoFluxWriter:postdrift159", + "wclsDepoFluxWriter:postdrift160", + "wclsDepoFluxWriter:postdrift161", + "wclsDepoFluxWriter:postdrift162", + "wclsDepoFluxWriter:postdrift163", + "wclsDepoFluxWriter:postdrift164", + "wclsDepoFluxWriter:postdrift165", + "wclsDepoFluxWriter:postdrift166", + "wclsDepoFluxWriter:postdrift167", + "wclsDepoFluxWriter:postdrift168", + "wclsDepoFluxWriter:postdrift169", + "wclsDepoFluxWriter:postdrift170", + "wclsDepoFluxWriter:postdrift171", + "wclsDepoFluxWriter:postdrift172", + "wclsDepoFluxWriter:postdrift173", + "wclsDepoFluxWriter:postdrift174", + "wclsDepoFluxWriter:postdrift175", + "wclsDepoFluxWriter:postdrift176", + "wclsDepoFluxWriter:postdrift177", + "wclsDepoFluxWriter:postdrift178", + "wclsDepoFluxWriter:postdrift179", + "wclsDepoFluxWriter:postdrift180", + "wclsDepoFluxWriter:postdrift181", + "wclsDepoFluxWriter:postdrift182", + "wclsDepoFluxWriter:postdrift183", + "wclsDepoFluxWriter:postdrift184", + "wclsDepoFluxWriter:postdrift185", + "wclsDepoFluxWriter:postdrift186", + "wclsDepoFluxWriter:postdrift187", + "wclsDepoFluxWriter:postdrift188", + "wclsDepoFluxWriter:postdrift189", + "wclsDepoFluxWriter:postdrift190", + "wclsDepoFluxWriter:postdrift191", + "wclsDepoFluxWriter:postdrift192", + "wclsDepoFluxWriter:postdrift193", + "wclsDepoFluxWriter:postdrift194", + "wclsDepoFluxWriter:postdrift195", + "wclsDepoFluxWriter:postdrift196", + "wclsDepoFluxWriter:postdrift197", + "wclsDepoFluxWriter:postdrift198", + "wclsDepoFluxWriter:postdrift199", + "wclsDepoFluxWriter:postdrift200", + "wclsDepoFluxWriter:postdrift201", + "wclsDepoFluxWriter:postdrift202", + "wclsDepoFluxWriter:postdrift203", + "wclsDepoFluxWriter:postdrift204", + "wclsDepoFluxWriter:postdrift205", + "wclsDepoFluxWriter:postdrift206", + "wclsDepoFluxWriter:postdrift207", + "wclsDepoFluxWriter:postdrift208", + "wclsDepoFluxWriter:postdrift209", + "wclsDepoFluxWriter:postdrift210", + "wclsDepoFluxWriter:postdrift211", + "wclsDepoFluxWriter:postdrift212", + "wclsDepoFluxWriter:postdrift213", + "wclsDepoFluxWriter:postdrift214", + "wclsDepoFluxWriter:postdrift215", + "wclsDepoFluxWriter:postdrift216", + "wclsDepoFluxWriter:postdrift217", + "wclsDepoFluxWriter:postdrift218", + "wclsDepoFluxWriter:postdrift219", + "wclsDepoFluxWriter:postdrift220", + "wclsDepoFluxWriter:postdrift221", + "wclsDepoFluxWriter:postdrift222", + "wclsDepoFluxWriter:postdrift223", + "wclsDepoFluxWriter:postdrift224", + "wclsDepoFluxWriter:postdrift225", + "wclsDepoFluxWriter:postdrift226", + "wclsDepoFluxWriter:postdrift227", + "wclsDepoFluxWriter:postdrift228", + "wclsDepoFluxWriter:postdrift229", + "wclsDepoFluxWriter:postdrift230", + "wclsDepoFluxWriter:postdrift231", + "wclsDepoFluxWriter:postdrift232", + "wclsDepoFluxWriter:postdrift233", + "wclsDepoFluxWriter:postdrift234", + "wclsDepoFluxWriter:postdrift235", + "wclsDepoFluxWriter:postdrift236", + "wclsDepoFluxWriter:postdrift237", + "wclsDepoFluxWriter:postdrift238", + "wclsDepoFluxWriter:postdrift239", + "wclsDepoFluxWriter:postdrift240", + "wclsDepoFluxWriter:postdrift241", + "wclsDepoFluxWriter:postdrift242", + "wclsDepoFluxWriter:postdrift243", + "wclsDepoFluxWriter:postdrift244", + "wclsDepoFluxWriter:postdrift245", + "wclsDepoFluxWriter:postdrift246", + "wclsDepoFluxWriter:postdrift247", + "wclsDepoFluxWriter:postdrift248", + "wclsDepoFluxWriter:postdrift249", + "wclsDepoFluxWriter:postdrift250", + "wclsDepoFluxWriter:postdrift251", + "wclsDepoFluxWriter:postdrift252", + "wclsDepoFluxWriter:postdrift253", + "wclsDepoFluxWriter:postdrift254", + "wclsDepoFluxWriter:postdrift255", + "wclsDepoFluxWriter:postdrift256", + "wclsDepoFluxWriter:postdrift257", + "wclsDepoFluxWriter:postdrift258", + "wclsDepoFluxWriter:postdrift259", + "wclsDepoFluxWriter:postdrift260", + "wclsDepoFluxWriter:postdrift261", + "wclsDepoFluxWriter:postdrift262", + "wclsDepoFluxWriter:postdrift263", + "wclsDepoFluxWriter:postdrift264", + "wclsDepoFluxWriter:postdrift265", + "wclsDepoFluxWriter:postdrift266", + "wclsDepoFluxWriter:postdrift267", + "wclsDepoFluxWriter:postdrift268", + "wclsDepoFluxWriter:postdrift269", + "wclsDepoFluxWriter:postdrift270", + "wclsDepoFluxWriter:postdrift271", + "wclsDepoFluxWriter:postdrift272", + "wclsDepoFluxWriter:postdrift273", + "wclsDepoFluxWriter:postdrift274", + "wclsDepoFluxWriter:postdrift275", + "wclsDepoFluxWriter:postdrift276", + "wclsDepoFluxWriter:postdrift277", + "wclsDepoFluxWriter:postdrift278", + "wclsDepoFluxWriter:postdrift279", + "wclsDepoFluxWriter:postdrift280", + "wclsDepoFluxWriter:postdrift281", + "wclsDepoFluxWriter:postdrift282", + "wclsDepoFluxWriter:postdrift283", + "wclsDepoFluxWriter:postdrift284", + "wclsDepoFluxWriter:postdrift285", + "wclsDepoFluxWriter:postdrift286", + "wclsDepoFluxWriter:postdrift287", + "wclsDepoFluxWriter:postdrift288", + "wclsDepoFluxWriter:postdrift289", + "wclsDepoFluxWriter:postdrift290", + "wclsDepoFluxWriter:postdrift291", + "wclsDepoFluxWriter:postdrift292", + "wclsDepoFluxWriter:postdrift293", + "wclsDepoFluxWriter:postdrift294", + "wclsDepoFluxWriter:postdrift295", + "wclsDepoFluxWriter:postdrift296", + "wclsDepoFluxWriter:postdrift297", + "wclsDepoFluxWriter:postdrift298", + "wclsDepoFluxWriter:postdrift299", + "wclsDepoFluxWriter:postdrift300", + "wclsDepoFluxWriter:postdrift301", + "wclsDepoFluxWriter:postdrift302", + "wclsDepoFluxWriter:postdrift303", + "wclsDepoFluxWriter:postdrift304", + "wclsDepoFluxWriter:postdrift305", + "wclsDepoFluxWriter:postdrift306", + "wclsDepoFluxWriter:postdrift307", + "wclsDepoFluxWriter:postdrift308", + "wclsDepoFluxWriter:postdrift309", + "wclsDepoFluxWriter:postdrift310", + "wclsDepoFluxWriter:postdrift311", + "wclsDepoFluxWriter:postdrift312", + "wclsDepoFluxWriter:postdrift313", + "wclsDepoFluxWriter:postdrift314", + "wclsDepoFluxWriter:postdrift315", + "wclsDepoFluxWriter:postdrift316", + "wclsDepoFluxWriter:postdrift317", + "wclsDepoFluxWriter:postdrift318", + "wclsDepoFluxWriter:postdrift319", + "wclsDepoFluxWriter:postdrift320", + "wclsDepoFluxWriter:postdrift321", + "wclsDepoFluxWriter:postdrift322", + "wclsDepoFluxWriter:postdrift323", + "wclsDepoFluxWriter:postdrift324", + "wclsDepoFluxWriter:postdrift325", + "wclsDepoFluxWriter:postdrift326", + "wclsDepoFluxWriter:postdrift327", + "wclsDepoFluxWriter:postdrift328", + "wclsDepoFluxWriter:postdrift329", + "wclsDepoFluxWriter:postdrift330", + "wclsDepoFluxWriter:postdrift331", + "wclsDepoFluxWriter:postdrift332", + "wclsDepoFluxWriter:postdrift333", + "wclsDepoFluxWriter:postdrift334", + "wclsDepoFluxWriter:postdrift335", + "wclsDepoFluxWriter:postdrift336", + "wclsDepoFluxWriter:postdrift337", + "wclsDepoFluxWriter:postdrift338", + "wclsDepoFluxWriter:postdrift339", + "wclsDepoFluxWriter:postdrift340", + "wclsDepoFluxWriter:postdrift341", + "wclsDepoFluxWriter:postdrift342", + "wclsDepoFluxWriter:postdrift343", + "wclsDepoFluxWriter:postdrift344", + "wclsDepoFluxWriter:postdrift345", + "wclsDepoFluxWriter:postdrift346", + "wclsDepoFluxWriter:postdrift347", + "wclsDepoFluxWriter:postdrift348", + "wclsDepoFluxWriter:postdrift349", + "wclsDepoFluxWriter:postdrift350", + "wclsDepoFluxWriter:postdrift351", + "wclsDepoFluxWriter:postdrift352", + "wclsDepoFluxWriter:postdrift353", + "wclsDepoFluxWriter:postdrift354", + "wclsDepoFluxWriter:postdrift355", + "wclsDepoFluxWriter:postdrift356", + "wclsDepoFluxWriter:postdrift357", + "wclsDepoFluxWriter:postdrift358", + "wclsDepoFluxWriter:postdrift359", + "wclsFrameSaver:simdigits0", + "wclsFrameSaver:simdigits1", + "wclsFrameSaver:simdigits2", + "wclsFrameSaver:simdigits3" + // ,"wclsFrameSaver:nfdigits", + // "wclsFrameSaver:spsignals", + // "wclsFrameSaver:spthresholds" + ] + // Make available parameters via Jsonnet's std.extVar() + params: { + // Changing this to match Gray's latest data drive field responses + //files_fields: "garfield-icarus-fnal-rev2.json.bz2" + //files_fields: "icarus_fnal_fit_ks_P0nom.json.bz2" + files_fields: '"icarus_final_fit_dqdx0.json.bz2", + "icarus_final_fit_dqdx1.json.bz2", + "icarus_final_fit_dqdx2.json.bz2", + "icarus_final_fit_dqdx3.json.bz2", + "icarus_final_fit_dqdx4.json.bz2", + "icarus_final_fit_dqdx5.json.bz2", + "icarus_final_fit_dqdx6.json.bz2", + "icarus_final_fit_dqdx7.json.bz2", + "icarus_final_fit_dqdx8.json.bz2", + "icarus_final_fit_dqdx9.json.bz2", + "icarus_final_fit_dqdx10.json.bz2", + "icarus_final_fit_dqdx11.json.bz2", + "icarus_final_fit_dqdx12.json.bz2", + "icarus_final_fit_dqdx13.json.bz2", + "icarus_final_fit_dqdx14.json.bz2"' + file_rcresp: "" # use the RCResponse by default + } + structs: { + # load values from simulationservices_icarus.fcl + # Longitudinal diffusion constant [cm2/ns] + DL: @local::icarus_largeantparameters.LongitudinalDiffusion + # Transverse diffusion constant [cm2/ns] + DT: @local::icarus_largeantparameters.TransverseDiffusion + # load values from services_common_icarus.fcl + # Electron lifetime [microseconds] + lifetime: @local::icarus_detproperties.Electronlifetime + + lifetime_TPCEE: @local::icarus_detproperties.Electronlifetime + lifetime_TPCEW: @local::icarus_detproperties.Electronlifetime + lifetime_TPCWE: @local::icarus_detproperties.Electronlifetime + lifetime_TPCWW: @local::icarus_detproperties.Electronlifetime + + # Electron drift speed, assumes a certain applied E-field [mm/us] + # driftSpeed: 1.5756 + # Scaling Parameters from int and coh noise components + int_noise_scale: 1.0 + coh_noise_scale: 1.0 + + # Gain and shaping time + //gain0: 14.9654 # mV/fC + //gain1: 14.9654 # mV/fC + //gain2: 14.9654 # mV/fC + gain0: 17.05212 # mV/fC + gain1: 12.6181926 # mV/fC + gain2: 13.0261362 # mV/fC + + shaping0: 1.3 # us + shaping1: 1.3 # 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 + + } + } +} + +# TUNED FR CONFIG +icarus_simwire_wirecell_fitSR: @local::icarus_simwire_wirecell +# Add in the ER tail +icarus_simwire_wirecell_fitSR.wcls_main.params.file_rcresp: "icarus_fnal_rc_tail.json" +# Add in the tuned field responses +icarus_simwire_wirecell_fitSR.wcls_main.params.files_fields: "icarus_fnal_fit_ks_P0nom.json.bz2" +# futz with shaping+gain values (note these are really just scale factors and should not be taken literally) +icarus_simwire_wirecell_fitSR.wcls_main.structs.gain0: 11.9918701 # mV/fC +icarus_simwire_wirecell_fitSR.wcls_main.structs.gain1: 12.6181926 # mV/fC +icarus_simwire_wirecell_fitSR.wcls_main.structs.gain2: 13.0261362 # mV/fC +icarus_simwire_wirecell_fitSR.wcls_main.structs.shaping1: 1.45 # us + +# TUNED FR CONFIG w/ Front Induction Nominal +icarus_simwire_wirecell_fitSR_P0nom: @local::icarus_simwire_wirecell +# Add in the ER tail +icarus_simwire_wirecell_fitSR_P0nom.wcls_main.params.file_rcresp: "icarus_fnal_rc_tail.json" +# Add in the tuned field responses (except for P0) +icarus_simwire_wirecell_fitSR_P0nom.wcls_main.params.files_fields: "icarus_fnal_fit_ks_P0nom.json.bz2" +# futz with shaping+gain values (note these are really just scale factors and should not be taken literally) +icarus_simwire_wirecell_fitSR_P0nom.wcls_main.structs.gain0: 17.05212 # mV/fC +icarus_simwire_wirecell_fitSR_P0nom.wcls_main.structs.gain1: 12.6181926 # mV/fC +icarus_simwire_wirecell_fitSR_P0nom.wcls_main.structs.gain2: 13.0261362 # mV/fC +icarus_simwire_wirecell_fitSR_P0nom.wcls_main.structs.shaping1: 1.45 # us +END_PROLOG diff --git a/icaruscode/TPC/ICARUSWireCell/detsimmodules_wirecell_ICARUS_YZsim_shifted.fcl b/icaruscode/TPC/ICARUSWireCell/detsimmodules_wirecell_ICARUS_YZsim_shifted.fcl new file mode 100644 index 000000000..e3346c81f --- /dev/null +++ b/icaruscode/TPC/ICARUSWireCell/detsimmodules_wirecell_ICARUS_YZsim_shifted.fcl @@ -0,0 +1,483 @@ +// We need this for Detector Properties +#include "services_basic_icarus.fcl" +// We need this for diffusion +#include "simulationservices_icarus.fcl" + +BEGIN_PROLOG + +icarus_simwire_wirecell: +{ + module_type : WireCellToolkit + wcls_main: + { + tool_type: WCLS + apps: ["Pgrapher"] + //logsinks: ["stdout"] + //loglevels: ["magnify:debug"] + plugins: ["WireCellPgraph", "WireCellGen","WireCellSio","WireCellRoot","WireCellLarsoft"] + // needs to be found via your WIRECELL_PATH + configs: ["pgrapher/experiment/icarus/wcls-multitpc-sim-drift-simchannel-yzsim-shifted-refactored.jsonnet"] + // Contract note: these exact "type:name" must be used to identify + // the configuration data structures for these components in the Jsonnet. + inputers: ["wclsSimDepoSetSource:electron"] + outputers: + [ + //"wclsDepoSetSimChannelSink:postdriftold", + //"wclsDepoFluxWriter:postdrift", + //"wclsDepoFluxWriter:postdrift359", + "wclsDepoFluxWriter:postdrift0", + "wclsDepoFluxWriter:postdrift1", + "wclsDepoFluxWriter:postdrift2", + "wclsDepoFluxWriter:postdrift3", + "wclsDepoFluxWriter:postdrift4", + "wclsDepoFluxWriter:postdrift5", + "wclsDepoFluxWriter:postdrift6", + "wclsDepoFluxWriter:postdrift7", + "wclsDepoFluxWriter:postdrift8", + "wclsDepoFluxWriter:postdrift9", + "wclsDepoFluxWriter:postdrift10", + "wclsDepoFluxWriter:postdrift11", + "wclsDepoFluxWriter:postdrift12", + "wclsDepoFluxWriter:postdrift13", + "wclsDepoFluxWriter:postdrift14", + "wclsDepoFluxWriter:postdrift15", + "wclsDepoFluxWriter:postdrift16", + "wclsDepoFluxWriter:postdrift17", + "wclsDepoFluxWriter:postdrift18", + "wclsDepoFluxWriter:postdrift19", + "wclsDepoFluxWriter:postdrift20", + "wclsDepoFluxWriter:postdrift21", + "wclsDepoFluxWriter:postdrift22", + "wclsDepoFluxWriter:postdrift23", + "wclsDepoFluxWriter:postdrift24", + "wclsDepoFluxWriter:postdrift25", + "wclsDepoFluxWriter:postdrift26", + "wclsDepoFluxWriter:postdrift27", + "wclsDepoFluxWriter:postdrift28", + "wclsDepoFluxWriter:postdrift29", + "wclsDepoFluxWriter:postdrift30", + "wclsDepoFluxWriter:postdrift31", + "wclsDepoFluxWriter:postdrift32", + "wclsDepoFluxWriter:postdrift33", + "wclsDepoFluxWriter:postdrift34", + "wclsDepoFluxWriter:postdrift35", + "wclsDepoFluxWriter:postdrift36", + "wclsDepoFluxWriter:postdrift37", + "wclsDepoFluxWriter:postdrift38", + "wclsDepoFluxWriter:postdrift39", + "wclsDepoFluxWriter:postdrift40", + "wclsDepoFluxWriter:postdrift41", + "wclsDepoFluxWriter:postdrift42", + "wclsDepoFluxWriter:postdrift43", + "wclsDepoFluxWriter:postdrift44", + "wclsDepoFluxWriter:postdrift45", + "wclsDepoFluxWriter:postdrift46", + "wclsDepoFluxWriter:postdrift47", + "wclsDepoFluxWriter:postdrift48", + "wclsDepoFluxWriter:postdrift49", + "wclsDepoFluxWriter:postdrift50", + "wclsDepoFluxWriter:postdrift51", + "wclsDepoFluxWriter:postdrift52", + "wclsDepoFluxWriter:postdrift53", + "wclsDepoFluxWriter:postdrift54", + "wclsDepoFluxWriter:postdrift55", + "wclsDepoFluxWriter:postdrift56", + "wclsDepoFluxWriter:postdrift57", + "wclsDepoFluxWriter:postdrift58", + "wclsDepoFluxWriter:postdrift59", + "wclsDepoFluxWriter:postdrift60", + "wclsDepoFluxWriter:postdrift61", + "wclsDepoFluxWriter:postdrift62", + "wclsDepoFluxWriter:postdrift63", + "wclsDepoFluxWriter:postdrift64", + "wclsDepoFluxWriter:postdrift65", + "wclsDepoFluxWriter:postdrift66", + "wclsDepoFluxWriter:postdrift67", + "wclsDepoFluxWriter:postdrift68", + "wclsDepoFluxWriter:postdrift69", + "wclsDepoFluxWriter:postdrift70", + "wclsDepoFluxWriter:postdrift71", + "wclsDepoFluxWriter:postdrift72", + "wclsDepoFluxWriter:postdrift73", + "wclsDepoFluxWriter:postdrift74", + "wclsDepoFluxWriter:postdrift75", + "wclsDepoFluxWriter:postdrift76", + "wclsDepoFluxWriter:postdrift77", + "wclsDepoFluxWriter:postdrift78", + "wclsDepoFluxWriter:postdrift79", + "wclsDepoFluxWriter:postdrift80", + "wclsDepoFluxWriter:postdrift81", + "wclsDepoFluxWriter:postdrift82", + "wclsDepoFluxWriter:postdrift83", + "wclsDepoFluxWriter:postdrift84", + "wclsDepoFluxWriter:postdrift85", + "wclsDepoFluxWriter:postdrift86", + "wclsDepoFluxWriter:postdrift87", + "wclsDepoFluxWriter:postdrift88", + "wclsDepoFluxWriter:postdrift89", + "wclsDepoFluxWriter:postdrift90", + "wclsDepoFluxWriter:postdrift91", + "wclsDepoFluxWriter:postdrift92", + "wclsDepoFluxWriter:postdrift93", + "wclsDepoFluxWriter:postdrift94", + "wclsDepoFluxWriter:postdrift95", + "wclsDepoFluxWriter:postdrift96", + "wclsDepoFluxWriter:postdrift97", + "wclsDepoFluxWriter:postdrift98", + "wclsDepoFluxWriter:postdrift99", + "wclsDepoFluxWriter:postdrift100", + "wclsDepoFluxWriter:postdrift101", + "wclsDepoFluxWriter:postdrift102", + "wclsDepoFluxWriter:postdrift103", + "wclsDepoFluxWriter:postdrift104", + "wclsDepoFluxWriter:postdrift105", + "wclsDepoFluxWriter:postdrift106", + "wclsDepoFluxWriter:postdrift107", + "wclsDepoFluxWriter:postdrift108", + "wclsDepoFluxWriter:postdrift109", + "wclsDepoFluxWriter:postdrift110", + "wclsDepoFluxWriter:postdrift111", + "wclsDepoFluxWriter:postdrift112", + "wclsDepoFluxWriter:postdrift113", + "wclsDepoFluxWriter:postdrift114", + "wclsDepoFluxWriter:postdrift115", + "wclsDepoFluxWriter:postdrift116", + "wclsDepoFluxWriter:postdrift117", + "wclsDepoFluxWriter:postdrift118", + "wclsDepoFluxWriter:postdrift119", + "wclsDepoFluxWriter:postdrift120", + "wclsDepoFluxWriter:postdrift121", + "wclsDepoFluxWriter:postdrift122", + "wclsDepoFluxWriter:postdrift123", + "wclsDepoFluxWriter:postdrift124", + "wclsDepoFluxWriter:postdrift125", + "wclsDepoFluxWriter:postdrift126", + "wclsDepoFluxWriter:postdrift127", + "wclsDepoFluxWriter:postdrift128", + "wclsDepoFluxWriter:postdrift129", + "wclsDepoFluxWriter:postdrift130", + "wclsDepoFluxWriter:postdrift131", + "wclsDepoFluxWriter:postdrift132", + "wclsDepoFluxWriter:postdrift133", + "wclsDepoFluxWriter:postdrift134", + "wclsDepoFluxWriter:postdrift135", + "wclsDepoFluxWriter:postdrift136", + "wclsDepoFluxWriter:postdrift137", + "wclsDepoFluxWriter:postdrift138", + "wclsDepoFluxWriter:postdrift139", + "wclsDepoFluxWriter:postdrift140", + "wclsDepoFluxWriter:postdrift141", + "wclsDepoFluxWriter:postdrift142", + "wclsDepoFluxWriter:postdrift143", + "wclsDepoFluxWriter:postdrift144", + "wclsDepoFluxWriter:postdrift145", + "wclsDepoFluxWriter:postdrift146", + "wclsDepoFluxWriter:postdrift147", + "wclsDepoFluxWriter:postdrift148", + "wclsDepoFluxWriter:postdrift149", + "wclsDepoFluxWriter:postdrift150", + "wclsDepoFluxWriter:postdrift151", + "wclsDepoFluxWriter:postdrift152", + "wclsDepoFluxWriter:postdrift153", + "wclsDepoFluxWriter:postdrift154", + "wclsDepoFluxWriter:postdrift155", + "wclsDepoFluxWriter:postdrift156", + "wclsDepoFluxWriter:postdrift157", + "wclsDepoFluxWriter:postdrift158", + "wclsDepoFluxWriter:postdrift159", + "wclsDepoFluxWriter:postdrift160", + "wclsDepoFluxWriter:postdrift161", + "wclsDepoFluxWriter:postdrift162", + "wclsDepoFluxWriter:postdrift163", + "wclsDepoFluxWriter:postdrift164", + "wclsDepoFluxWriter:postdrift165", + "wclsDepoFluxWriter:postdrift166", + "wclsDepoFluxWriter:postdrift167", + "wclsDepoFluxWriter:postdrift168", + "wclsDepoFluxWriter:postdrift169", + "wclsDepoFluxWriter:postdrift170", + "wclsDepoFluxWriter:postdrift171", + "wclsDepoFluxWriter:postdrift172", + "wclsDepoFluxWriter:postdrift173", + "wclsDepoFluxWriter:postdrift174", + "wclsDepoFluxWriter:postdrift175", + "wclsDepoFluxWriter:postdrift176", + "wclsDepoFluxWriter:postdrift177", + "wclsDepoFluxWriter:postdrift178", + "wclsDepoFluxWriter:postdrift179", + "wclsDepoFluxWriter:postdrift180", + "wclsDepoFluxWriter:postdrift181", + "wclsDepoFluxWriter:postdrift182", + "wclsDepoFluxWriter:postdrift183", + "wclsDepoFluxWriter:postdrift184", + "wclsDepoFluxWriter:postdrift185", + "wclsDepoFluxWriter:postdrift186", + "wclsDepoFluxWriter:postdrift187", + "wclsDepoFluxWriter:postdrift188", + "wclsDepoFluxWriter:postdrift189", + "wclsDepoFluxWriter:postdrift190", + "wclsDepoFluxWriter:postdrift191", + "wclsDepoFluxWriter:postdrift192", + "wclsDepoFluxWriter:postdrift193", + "wclsDepoFluxWriter:postdrift194", + "wclsDepoFluxWriter:postdrift195", + "wclsDepoFluxWriter:postdrift196", + "wclsDepoFluxWriter:postdrift197", + "wclsDepoFluxWriter:postdrift198", + "wclsDepoFluxWriter:postdrift199", + "wclsDepoFluxWriter:postdrift200", + "wclsDepoFluxWriter:postdrift201", + "wclsDepoFluxWriter:postdrift202", + "wclsDepoFluxWriter:postdrift203", + "wclsDepoFluxWriter:postdrift204", + "wclsDepoFluxWriter:postdrift205", + "wclsDepoFluxWriter:postdrift206", + "wclsDepoFluxWriter:postdrift207", + "wclsDepoFluxWriter:postdrift208", + "wclsDepoFluxWriter:postdrift209", + "wclsDepoFluxWriter:postdrift210", + "wclsDepoFluxWriter:postdrift211", + "wclsDepoFluxWriter:postdrift212", + "wclsDepoFluxWriter:postdrift213", + "wclsDepoFluxWriter:postdrift214", + "wclsDepoFluxWriter:postdrift215", + "wclsDepoFluxWriter:postdrift216", + "wclsDepoFluxWriter:postdrift217", + "wclsDepoFluxWriter:postdrift218", + "wclsDepoFluxWriter:postdrift219", + "wclsDepoFluxWriter:postdrift220", + "wclsDepoFluxWriter:postdrift221", + "wclsDepoFluxWriter:postdrift222", + "wclsDepoFluxWriter:postdrift223", + "wclsDepoFluxWriter:postdrift224", + "wclsDepoFluxWriter:postdrift225", + "wclsDepoFluxWriter:postdrift226", + "wclsDepoFluxWriter:postdrift227", + "wclsDepoFluxWriter:postdrift228", + "wclsDepoFluxWriter:postdrift229", + "wclsDepoFluxWriter:postdrift230", + "wclsDepoFluxWriter:postdrift231", + "wclsDepoFluxWriter:postdrift232", + "wclsDepoFluxWriter:postdrift233", + "wclsDepoFluxWriter:postdrift234", + "wclsDepoFluxWriter:postdrift235", + "wclsDepoFluxWriter:postdrift236", + "wclsDepoFluxWriter:postdrift237", + "wclsDepoFluxWriter:postdrift238", + "wclsDepoFluxWriter:postdrift239", + "wclsDepoFluxWriter:postdrift240", + "wclsDepoFluxWriter:postdrift241", + "wclsDepoFluxWriter:postdrift242", + "wclsDepoFluxWriter:postdrift243", + "wclsDepoFluxWriter:postdrift244", + "wclsDepoFluxWriter:postdrift245", + "wclsDepoFluxWriter:postdrift246", + "wclsDepoFluxWriter:postdrift247", + "wclsDepoFluxWriter:postdrift248", + "wclsDepoFluxWriter:postdrift249", + "wclsDepoFluxWriter:postdrift250", + "wclsDepoFluxWriter:postdrift251", + "wclsDepoFluxWriter:postdrift252", + "wclsDepoFluxWriter:postdrift253", + "wclsDepoFluxWriter:postdrift254", + "wclsDepoFluxWriter:postdrift255", + "wclsDepoFluxWriter:postdrift256", + "wclsDepoFluxWriter:postdrift257", + "wclsDepoFluxWriter:postdrift258", + "wclsDepoFluxWriter:postdrift259", + "wclsDepoFluxWriter:postdrift260", + "wclsDepoFluxWriter:postdrift261", + "wclsDepoFluxWriter:postdrift262", + "wclsDepoFluxWriter:postdrift263", + "wclsDepoFluxWriter:postdrift264", + "wclsDepoFluxWriter:postdrift265", + "wclsDepoFluxWriter:postdrift266", + "wclsDepoFluxWriter:postdrift267", + "wclsDepoFluxWriter:postdrift268", + "wclsDepoFluxWriter:postdrift269", + "wclsDepoFluxWriter:postdrift270", + "wclsDepoFluxWriter:postdrift271", + "wclsDepoFluxWriter:postdrift272", + "wclsDepoFluxWriter:postdrift273", + "wclsDepoFluxWriter:postdrift274", + "wclsDepoFluxWriter:postdrift275", + "wclsDepoFluxWriter:postdrift276", + "wclsDepoFluxWriter:postdrift277", + "wclsDepoFluxWriter:postdrift278", + "wclsDepoFluxWriter:postdrift279", + "wclsDepoFluxWriter:postdrift280", + "wclsDepoFluxWriter:postdrift281", + "wclsDepoFluxWriter:postdrift282", + "wclsDepoFluxWriter:postdrift283", + "wclsDepoFluxWriter:postdrift284", + "wclsDepoFluxWriter:postdrift285", + "wclsDepoFluxWriter:postdrift286", + "wclsDepoFluxWriter:postdrift287", + "wclsDepoFluxWriter:postdrift288", + "wclsDepoFluxWriter:postdrift289", + "wclsDepoFluxWriter:postdrift290", + "wclsDepoFluxWriter:postdrift291", + "wclsDepoFluxWriter:postdrift292", + "wclsDepoFluxWriter:postdrift293", + "wclsDepoFluxWriter:postdrift294", + "wclsDepoFluxWriter:postdrift295", + "wclsDepoFluxWriter:postdrift296", + "wclsDepoFluxWriter:postdrift297", + "wclsDepoFluxWriter:postdrift298", + "wclsDepoFluxWriter:postdrift299", + "wclsDepoFluxWriter:postdrift300", + "wclsDepoFluxWriter:postdrift301", + "wclsDepoFluxWriter:postdrift302", + "wclsDepoFluxWriter:postdrift303", + "wclsDepoFluxWriter:postdrift304", + "wclsDepoFluxWriter:postdrift305", + "wclsDepoFluxWriter:postdrift306", + "wclsDepoFluxWriter:postdrift307", + "wclsDepoFluxWriter:postdrift308", + "wclsDepoFluxWriter:postdrift309", + "wclsDepoFluxWriter:postdrift310", + "wclsDepoFluxWriter:postdrift311", + "wclsDepoFluxWriter:postdrift312", + "wclsDepoFluxWriter:postdrift313", + "wclsDepoFluxWriter:postdrift314", + "wclsDepoFluxWriter:postdrift315", + "wclsDepoFluxWriter:postdrift316", + "wclsDepoFluxWriter:postdrift317", + "wclsDepoFluxWriter:postdrift318", + "wclsDepoFluxWriter:postdrift319", + "wclsDepoFluxWriter:postdrift320", + "wclsDepoFluxWriter:postdrift321", + "wclsDepoFluxWriter:postdrift322", + "wclsDepoFluxWriter:postdrift323", + "wclsDepoFluxWriter:postdrift324", + "wclsDepoFluxWriter:postdrift325", + "wclsDepoFluxWriter:postdrift326", + "wclsDepoFluxWriter:postdrift327", + "wclsDepoFluxWriter:postdrift328", + "wclsDepoFluxWriter:postdrift329", + "wclsDepoFluxWriter:postdrift330", + "wclsDepoFluxWriter:postdrift331", + "wclsDepoFluxWriter:postdrift332", + "wclsDepoFluxWriter:postdrift333", + "wclsDepoFluxWriter:postdrift334", + "wclsDepoFluxWriter:postdrift335", + "wclsDepoFluxWriter:postdrift336", + "wclsDepoFluxWriter:postdrift337", + "wclsDepoFluxWriter:postdrift338", + "wclsDepoFluxWriter:postdrift339", + "wclsDepoFluxWriter:postdrift340", + "wclsDepoFluxWriter:postdrift341", + "wclsDepoFluxWriter:postdrift342", + "wclsDepoFluxWriter:postdrift343", + "wclsDepoFluxWriter:postdrift344", + "wclsDepoFluxWriter:postdrift345", + "wclsDepoFluxWriter:postdrift346", + "wclsDepoFluxWriter:postdrift347", + "wclsDepoFluxWriter:postdrift348", + "wclsDepoFluxWriter:postdrift349", + "wclsDepoFluxWriter:postdrift350", + "wclsDepoFluxWriter:postdrift351", + "wclsDepoFluxWriter:postdrift352", + "wclsDepoFluxWriter:postdrift353", + "wclsDepoFluxWriter:postdrift354", + "wclsDepoFluxWriter:postdrift355", + "wclsDepoFluxWriter:postdrift356", + "wclsDepoFluxWriter:postdrift357", + "wclsDepoFluxWriter:postdrift358", + "wclsDepoFluxWriter:postdrift359", + "wclsFrameSaver:simdigits0", + "wclsFrameSaver:simdigits1", + "wclsFrameSaver:simdigits2", + "wclsFrameSaver:simdigits3" + // ,"wclsFrameSaver:nfdigits", + // "wclsFrameSaver:spsignals", + // "wclsFrameSaver:spthresholds" + ] + // Make available parameters via Jsonnet's std.extVar() + params: { + // Changing this to match Gray's latest data drive field responses + //files_fields: "garfield-icarus-fnal-rev2.json.bz2" + //files_fields: "icarus_fnal_fit_ks_P0nom.json.bz2" + files_fields: '"icarus_final_fit_dqdx0.json.bz2", + "icarus_final_fit_dqdx1.json.bz2", + "icarus_final_fit_dqdx2.json.bz2", + "icarus_final_fit_dqdx3.json.bz2", + "icarus_final_fit_dqdx4.json.bz2", + "icarus_final_fit_dqdx5.json.bz2", + "icarus_final_fit_dqdx6.json.bz2", + "icarus_final_fit_dqdx7.json.bz2", + "icarus_final_fit_dqdx8.json.bz2", + "icarus_final_fit_dqdx9.json.bz2", + "icarus_final_fit_dqdx10.json.bz2", + "icarus_final_fit_dqdx11.json.bz2", + "icarus_final_fit_dqdx12.json.bz2", + "icarus_final_fit_dqdx13.json.bz2", + "icarus_final_fit_dqdx14.json.bz2"' + file_rcresp: "" # use the RCResponse by default + } + structs: { + # load values from simulationservices_icarus.fcl + # Longitudinal diffusion constant [cm2/ns] + DL: @local::icarus_largeantparameters.LongitudinalDiffusion + # Transverse diffusion constant [cm2/ns] + DT: @local::icarus_largeantparameters.TransverseDiffusion + # load values from services_common_icarus.fcl + # Electron lifetime [microseconds] + lifetime: @local::icarus_detproperties.Electronlifetime + + lifetime_TPCEE: @local::icarus_detproperties.Electronlifetime + lifetime_TPCEW: @local::icarus_detproperties.Electronlifetime + lifetime_TPCWE: @local::icarus_detproperties.Electronlifetime + lifetime_TPCWW: @local::icarus_detproperties.Electronlifetime + + # Electron drift speed, assumes a certain applied E-field [mm/us] + # driftSpeed: 1.5756 + # Scaling Parameters from int and coh noise components + int_noise_scale: 1.0 + coh_noise_scale: 1.0 + + # Gain and shaping time + //gain0: 14.9654 # mV/fC + //gain1: 14.9654 # mV/fC + //gain2: 14.9654 # mV/fC + gain0: 17.05212 # mV/fC + gain1: 12.6181926 # mV/fC + gain2: 13.0261362 # mV/fC + + shaping0: 1.3 # us + shaping1: 1.3 # 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 + + } + } +} + +# TUNED FR CONFIG +icarus_simwire_wirecell_fitSR: @local::icarus_simwire_wirecell +# Add in the ER tail +icarus_simwire_wirecell_fitSR.wcls_main.params.file_rcresp: "icarus_fnal_rc_tail.json" +# Add in the tuned field responses +icarus_simwire_wirecell_fitSR.wcls_main.params.files_fields: "icarus_fnal_fit_ks_P0nom.json.bz2" +# futz with shaping+gain values (note these are really just scale factors and should not be taken literally) +icarus_simwire_wirecell_fitSR.wcls_main.structs.gain0: 11.9918701 # mV/fC +icarus_simwire_wirecell_fitSR.wcls_main.structs.gain1: 12.6181926 # mV/fC +icarus_simwire_wirecell_fitSR.wcls_main.structs.gain2: 13.0261362 # mV/fC +icarus_simwire_wirecell_fitSR.wcls_main.structs.shaping1: 1.45 # us + +# TUNED FR CONFIG w/ Front Induction Nominal +icarus_simwire_wirecell_fitSR_P0nom: @local::icarus_simwire_wirecell +# Add in the ER tail +icarus_simwire_wirecell_fitSR_P0nom.wcls_main.params.file_rcresp: "icarus_fnal_rc_tail.json" +# Add in the tuned field responses (except for P0) +icarus_simwire_wirecell_fitSR_P0nom.wcls_main.params.files_fields: "icarus_fnal_fit_ks_P0nom.json.bz2" +# futz with shaping+gain values (note these are really just scale factors and should not be taken literally) +icarus_simwire_wirecell_fitSR_P0nom.wcls_main.structs.gain0: 17.05212 # mV/fC +icarus_simwire_wirecell_fitSR_P0nom.wcls_main.structs.gain1: 12.6181926 # mV/fC +icarus_simwire_wirecell_fitSR_P0nom.wcls_main.structs.gain2: 13.0261362 # mV/fC +icarus_simwire_wirecell_fitSR_P0nom.wcls_main.structs.shaping1: 1.45 # us +END_PROLOG diff --git a/icaruscode/TPC/ICARUSWireCell/icarus/funcs.jsonnet b/icaruscode/TPC/ICARUSWireCell/icarus/funcs.jsonnet index 5f2f0be20..525956189 100644 --- a/icaruscode/TPC/ICARUSWireCell/icarus/funcs.jsonnet +++ b/icaruscode/TPC/ICARUSWireCell/icarus/funcs.jsonnet @@ -81,6 +81,1193 @@ local g = import 'pgraph.jsonnet'; name=name), }.ret, + // Build a depofanout-[signal]-[framesummer]-[pipelines]-fanin graph. + // FrameSummer add up the two "split" anodes into one frame. + // Each branch of the pipelines operates on the summed signal frame. + fansummeryz :: function(fout, sigpipes, summers, actpipes, fin, name="fansummeryz", outtags=[], tag_rules=[]) { + + local fanoutmult = std.length(sigpipes), + local faninmult = std.length(actpipes), + + local fanout = g.pnode({ + type: fout, + name: name, + data: { + multiplicity: fanoutmult, + tag_rules: tag_rules, + }, + }, nin=1, nout=fanoutmult), + + + local fanin = g.pnode({ + type: fin, + name: name, + data: { + multiplicity: faninmult, + tags: outtags, + }, + }, nin=faninmult, nout=1), + + local reduceryz = g.intern(innodes=sigpipes, + outnodes=actpipes, + centernodes=summers, + edges= + // connecting signal and summer + [g.edge(sigpipes[0], summers[0],0,0)] + + [g.edge(sigpipes[1], summers[0],0,1)] + + [g.edge(sigpipes[2], summers[0],0,2)] + + [g.edge(sigpipes[3], summers[0],0,3)] + + [g.edge(sigpipes[4], summers[0],0,4)] + + [g.edge(sigpipes[5], summers[0],0,5)] + + [g.edge(sigpipes[6], summers[0],0,6)] + + [g.edge(sigpipes[7], summers[0],0,7)] + + [g.edge(sigpipes[8], summers[0],0,8)] + + [g.edge(sigpipes[9], summers[0],0,9)] + + [g.edge(sigpipes[10], summers[0],0,10)] + + [g.edge(sigpipes[11], summers[0],0,11)] + + [g.edge(sigpipes[12], summers[0],0,12)] + + [g.edge(sigpipes[13], summers[0],0,13)] + + [g.edge(sigpipes[14], summers[0],0,14)] + + [g.edge(sigpipes[15], summers[0],0,15)] + + [g.edge(sigpipes[16], summers[0],0,16)] + + [g.edge(sigpipes[17], summers[0],0,17)] + + [g.edge(sigpipes[18], summers[0],0,18)] + + [g.edge(sigpipes[19], summers[0],0,19)] + + [g.edge(sigpipes[20], summers[0],0,20)] + + [g.edge(sigpipes[21], summers[0],0,21)] + + [g.edge(sigpipes[22], summers[0],0,22)] + + [g.edge(sigpipes[23], summers[0],0,23)] + + [g.edge(sigpipes[24], summers[0],0,24)] + + [g.edge(sigpipes[25], summers[0],0,25)] + + [g.edge(sigpipes[26], summers[0],0,26)] + + [g.edge(sigpipes[27], summers[0],0,27)] + + [g.edge(sigpipes[28], summers[0],0,28)] + + [g.edge(sigpipes[29], summers[0],0,29)] + + [g.edge(sigpipes[30], summers[0],0,30)] + + [g.edge(sigpipes[31], summers[0],0,31)] + + [g.edge(sigpipes[32], summers[0],0,32)] + + [g.edge(sigpipes[33], summers[0],0,33)] + + [g.edge(sigpipes[34], summers[0],0,34)] + + [g.edge(sigpipes[35], summers[0],0,35)] + + [g.edge(sigpipes[36], summers[0],0,36)] + + [g.edge(sigpipes[37], summers[0],0,37)] + + [g.edge(sigpipes[38], summers[0],0,38)] + + [g.edge(sigpipes[39], summers[0],0,39)] + + [g.edge(sigpipes[40], summers[0],0,40)] + + [g.edge(sigpipes[41], summers[0],0,41)] + + [g.edge(sigpipes[42], summers[0],0,42)] + + [g.edge(sigpipes[43], summers[0],0,43)] + + [g.edge(sigpipes[44], summers[0],0,44)] + + [g.edge(sigpipes[45], summers[0],0,45)] + + [g.edge(sigpipes[46], summers[0],0,46)] + + [g.edge(sigpipes[47], summers[0],0,47)] + + [g.edge(sigpipes[48], summers[0],0,48)] + + [g.edge(sigpipes[49], summers[0],0,49)] + + [g.edge(sigpipes[50], summers[0],0,50)] + + [g.edge(sigpipes[51], summers[0],0,51)] + + [g.edge(sigpipes[52], summers[0],0,52)] + + [g.edge(sigpipes[53], summers[0],0,53)] + + [g.edge(sigpipes[54], summers[0],0,54)] + + [g.edge(sigpipes[55], summers[0],0,55)] + + [g.edge(sigpipes[56], summers[0],0,56)] + + [g.edge(sigpipes[57], summers[0],0,57)] + + [g.edge(sigpipes[58], summers[0],0,58)] + + [g.edge(sigpipes[59], summers[0],0,59)] + + [g.edge(sigpipes[60], summers[0],0,60)] + + [g.edge(sigpipes[61], summers[0],0,61)] + + [g.edge(sigpipes[62], summers[0],0,62)] + + [g.edge(sigpipes[63], summers[0],0,63)] + + [g.edge(sigpipes[64], summers[0],0,64)] + + [g.edge(sigpipes[65], summers[0],0,65)] + + [g.edge(sigpipes[66], summers[0],0,66)] + + [g.edge(sigpipes[67], summers[0],0,67)] + + [g.edge(sigpipes[68], summers[0],0,68)] + + [g.edge(sigpipes[69], summers[0],0,69)] + + [g.edge(sigpipes[70], summers[0],0,70)] + + [g.edge(sigpipes[71], summers[0],0,71)] + + [g.edge(sigpipes[72], summers[0],0,72)] + + [g.edge(sigpipes[73], summers[0],0,73)] + + [g.edge(sigpipes[74], summers[0],0,74)] + + [g.edge(sigpipes[75], summers[0],0,75)] + + [g.edge(sigpipes[76], summers[0],0,76)] + + [g.edge(sigpipes[77], summers[0],0,77)] + + [g.edge(sigpipes[78], summers[0],0,78)] + + [g.edge(sigpipes[79], summers[0],0,79)] + + [g.edge(sigpipes[80], summers[0],0,80)] + + [g.edge(sigpipes[81], summers[0],0,81)] + + [g.edge(sigpipes[82], summers[0],0,82)] + + [g.edge(sigpipes[83], summers[0],0,83)] + + [g.edge(sigpipes[84], summers[0],0,84)] + + [g.edge(sigpipes[85], summers[0],0,85)] + + [g.edge(sigpipes[86], summers[0],0,86)] + + [g.edge(sigpipes[87], summers[0],0,87)] + + [g.edge(sigpipes[88], summers[0],0,88)] + + [g.edge(sigpipes[89], summers[0],0,89)] + + [g.edge(sigpipes[90], summers[1],0,0)] + + [g.edge(sigpipes[91], summers[1],0,1)] + + [g.edge(sigpipes[92], summers[1],0,2)] + + [g.edge(sigpipes[93], summers[1],0,3)] + + [g.edge(sigpipes[94], summers[1],0,4)] + + [g.edge(sigpipes[95], summers[1],0,5)] + + [g.edge(sigpipes[96], summers[1],0,6)] + + [g.edge(sigpipes[97], summers[1],0,7)] + + [g.edge(sigpipes[98], summers[1],0,8)] + + [g.edge(sigpipes[99], summers[1],0,9)] + + [g.edge(sigpipes[100], summers[1],0,10)] + + [g.edge(sigpipes[101], summers[1],0,11)] + + [g.edge(sigpipes[102], summers[1],0,12)] + + [g.edge(sigpipes[103], summers[1],0,13)] + + [g.edge(sigpipes[104], summers[1],0,14)] + + [g.edge(sigpipes[105], summers[1],0,15)] + + [g.edge(sigpipes[106], summers[1],0,16)] + + [g.edge(sigpipes[107], summers[1],0,17)] + + [g.edge(sigpipes[108], summers[1],0,18)] + + [g.edge(sigpipes[109], summers[1],0,19)] + + [g.edge(sigpipes[110], summers[1],0,20)] + + [g.edge(sigpipes[111], summers[1],0,21)] + + [g.edge(sigpipes[112], summers[1],0,22)] + + [g.edge(sigpipes[113], summers[1],0,23)] + + [g.edge(sigpipes[114], summers[1],0,24)] + + [g.edge(sigpipes[115], summers[1],0,25)] + + [g.edge(sigpipes[116], summers[1],0,26)] + + [g.edge(sigpipes[117], summers[1],0,27)] + + [g.edge(sigpipes[118], summers[1],0,28)] + + [g.edge(sigpipes[119], summers[1],0,29)] + + [g.edge(sigpipes[120], summers[1],0,30)] + + [g.edge(sigpipes[121], summers[1],0,31)] + + [g.edge(sigpipes[122], summers[1],0,32)] + + [g.edge(sigpipes[123], summers[1],0,33)] + + [g.edge(sigpipes[124], summers[1],0,34)] + + [g.edge(sigpipes[125], summers[1],0,35)] + + [g.edge(sigpipes[126], summers[1],0,36)] + + [g.edge(sigpipes[127], summers[1],0,37)] + + [g.edge(sigpipes[128], summers[1],0,38)] + + [g.edge(sigpipes[129], summers[1],0,39)] + + [g.edge(sigpipes[130], summers[1],0,40)] + + [g.edge(sigpipes[131], summers[1],0,41)] + + [g.edge(sigpipes[132], summers[1],0,42)] + + [g.edge(sigpipes[133], summers[1],0,43)] + + [g.edge(sigpipes[134], summers[1],0,44)] + + [g.edge(sigpipes[135], summers[1],0,45)] + + [g.edge(sigpipes[136], summers[1],0,46)] + + [g.edge(sigpipes[137], summers[1],0,47)] + + [g.edge(sigpipes[138], summers[1],0,48)] + + [g.edge(sigpipes[139], summers[1],0,49)] + + [g.edge(sigpipes[140], summers[1],0,50)] + + [g.edge(sigpipes[141], summers[1],0,51)] + + [g.edge(sigpipes[142], summers[1],0,52)] + + [g.edge(sigpipes[143], summers[1],0,53)] + + [g.edge(sigpipes[144], summers[1],0,54)] + + [g.edge(sigpipes[145], summers[1],0,55)] + + [g.edge(sigpipes[146], summers[1],0,56)] + + [g.edge(sigpipes[147], summers[1],0,57)] + + [g.edge(sigpipes[148], summers[1],0,58)] + + [g.edge(sigpipes[149], summers[1],0,59)] + + [g.edge(sigpipes[150], summers[1],0,60)] + + [g.edge(sigpipes[151], summers[1],0,61)] + + [g.edge(sigpipes[152], summers[1],0,62)] + + [g.edge(sigpipes[153], summers[1],0,63)] + + [g.edge(sigpipes[154], summers[1],0,64)] + + [g.edge(sigpipes[155], summers[1],0,65)] + + [g.edge(sigpipes[156], summers[1],0,66)] + + [g.edge(sigpipes[157], summers[1],0,67)] + + [g.edge(sigpipes[158], summers[1],0,68)] + + [g.edge(sigpipes[159], summers[1],0,69)] + + [g.edge(sigpipes[160], summers[1],0,70)] + + [g.edge(sigpipes[161], summers[1],0,71)] + + [g.edge(sigpipes[162], summers[1],0,72)] + + [g.edge(sigpipes[163], summers[1],0,73)] + + [g.edge(sigpipes[164], summers[1],0,74)] + + [g.edge(sigpipes[165], summers[1],0,75)] + + [g.edge(sigpipes[166], summers[1],0,76)] + + [g.edge(sigpipes[167], summers[1],0,77)] + + [g.edge(sigpipes[168], summers[1],0,78)] + + [g.edge(sigpipes[169], summers[1],0,79)] + + [g.edge(sigpipes[170], summers[1],0,80)] + + [g.edge(sigpipes[171], summers[1],0,81)] + + [g.edge(sigpipes[172], summers[1],0,82)] + + [g.edge(sigpipes[173], summers[1],0,83)] + + [g.edge(sigpipes[174], summers[1],0,84)] + + [g.edge(sigpipes[175], summers[1],0,85)] + + [g.edge(sigpipes[176], summers[1],0,86)] + + [g.edge(sigpipes[177], summers[1],0,87)] + + [g.edge(sigpipes[178], summers[1],0,88)] + + [g.edge(sigpipes[179], summers[1],0,89)] + + [g.edge(sigpipes[180], summers[2],0,0)] + + [g.edge(sigpipes[181], summers[2],0,1)] + + [g.edge(sigpipes[182], summers[2],0,2)] + + [g.edge(sigpipes[183], summers[2],0,3)] + + [g.edge(sigpipes[184], summers[2],0,4)] + + [g.edge(sigpipes[185], summers[2],0,5)] + + [g.edge(sigpipes[186], summers[2],0,6)] + + [g.edge(sigpipes[187], summers[2],0,7)] + + [g.edge(sigpipes[188], summers[2],0,8)] + + [g.edge(sigpipes[189], summers[2],0,9)] + + [g.edge(sigpipes[190], summers[2],0,10)] + + [g.edge(sigpipes[191], summers[2],0,11)] + + [g.edge(sigpipes[192], summers[2],0,12)] + + [g.edge(sigpipes[193], summers[2],0,13)] + + [g.edge(sigpipes[194], summers[2],0,14)] + + [g.edge(sigpipes[195], summers[2],0,15)] + + [g.edge(sigpipes[196], summers[2],0,16)] + + [g.edge(sigpipes[197], summers[2],0,17)] + + [g.edge(sigpipes[198], summers[2],0,18)] + + [g.edge(sigpipes[199], summers[2],0,19)] + + [g.edge(sigpipes[200], summers[2],0,20)] + + [g.edge(sigpipes[201], summers[2],0,21)] + + [g.edge(sigpipes[202], summers[2],0,22)] + + [g.edge(sigpipes[203], summers[2],0,23)] + + [g.edge(sigpipes[204], summers[2],0,24)] + + [g.edge(sigpipes[205], summers[2],0,25)] + + [g.edge(sigpipes[206], summers[2],0,26)] + + [g.edge(sigpipes[207], summers[2],0,27)] + + [g.edge(sigpipes[208], summers[2],0,28)] + + [g.edge(sigpipes[209], summers[2],0,29)] + + [g.edge(sigpipes[210], summers[2],0,30)] + + [g.edge(sigpipes[211], summers[2],0,31)] + + [g.edge(sigpipes[212], summers[2],0,32)] + + [g.edge(sigpipes[213], summers[2],0,33)] + + [g.edge(sigpipes[214], summers[2],0,34)] + + [g.edge(sigpipes[215], summers[2],0,35)] + + [g.edge(sigpipes[216], summers[2],0,36)] + + [g.edge(sigpipes[217], summers[2],0,37)] + + [g.edge(sigpipes[218], summers[2],0,38)] + + [g.edge(sigpipes[219], summers[2],0,39)] + + [g.edge(sigpipes[220], summers[2],0,40)] + + [g.edge(sigpipes[221], summers[2],0,41)] + + [g.edge(sigpipes[222], summers[2],0,42)] + + [g.edge(sigpipes[223], summers[2],0,43)] + + [g.edge(sigpipes[224], summers[2],0,44)] + + [g.edge(sigpipes[225], summers[2],0,45)] + + [g.edge(sigpipes[226], summers[2],0,46)] + + [g.edge(sigpipes[227], summers[2],0,47)] + + [g.edge(sigpipes[228], summers[2],0,48)] + + [g.edge(sigpipes[229], summers[2],0,49)] + + [g.edge(sigpipes[230], summers[2],0,50)] + + [g.edge(sigpipes[231], summers[2],0,51)] + + [g.edge(sigpipes[232], summers[2],0,52)] + + [g.edge(sigpipes[233], summers[2],0,53)] + + [g.edge(sigpipes[234], summers[2],0,54)] + + [g.edge(sigpipes[235], summers[2],0,55)] + + [g.edge(sigpipes[236], summers[2],0,56)] + + [g.edge(sigpipes[237], summers[2],0,57)] + + [g.edge(sigpipes[238], summers[2],0,58)] + + [g.edge(sigpipes[239], summers[2],0,59)] + + [g.edge(sigpipes[240], summers[2],0,60)] + + [g.edge(sigpipes[241], summers[2],0,61)] + + [g.edge(sigpipes[242], summers[2],0,62)] + + [g.edge(sigpipes[243], summers[2],0,63)] + + [g.edge(sigpipes[244], summers[2],0,64)] + + [g.edge(sigpipes[245], summers[2],0,65)] + + [g.edge(sigpipes[246], summers[2],0,66)] + + [g.edge(sigpipes[247], summers[2],0,67)] + + [g.edge(sigpipes[248], summers[2],0,68)] + + [g.edge(sigpipes[249], summers[2],0,69)] + + [g.edge(sigpipes[250], summers[2],0,70)] + + [g.edge(sigpipes[251], summers[2],0,71)] + + [g.edge(sigpipes[252], summers[2],0,72)] + + [g.edge(sigpipes[253], summers[2],0,73)] + + [g.edge(sigpipes[254], summers[2],0,74)] + + [g.edge(sigpipes[255], summers[2],0,75)] + + [g.edge(sigpipes[256], summers[2],0,76)] + + [g.edge(sigpipes[257], summers[2],0,77)] + + [g.edge(sigpipes[258], summers[2],0,78)] + + [g.edge(sigpipes[259], summers[2],0,79)] + + [g.edge(sigpipes[260], summers[2],0,80)] + + [g.edge(sigpipes[261], summers[2],0,81)] + + [g.edge(sigpipes[262], summers[2],0,82)] + + [g.edge(sigpipes[263], summers[2],0,83)] + + [g.edge(sigpipes[264], summers[2],0,84)] + + [g.edge(sigpipes[265], summers[2],0,85)] + + [g.edge(sigpipes[266], summers[2],0,86)] + + [g.edge(sigpipes[267], summers[2],0,87)] + + [g.edge(sigpipes[268], summers[2],0,88)] + + [g.edge(sigpipes[269], summers[2],0,89)] + + [g.edge(sigpipes[270], summers[3],0,0)] + + [g.edge(sigpipes[271], summers[3],0,1)] + + [g.edge(sigpipes[272], summers[3],0,2)] + + [g.edge(sigpipes[273], summers[3],0,3)] + + [g.edge(sigpipes[274], summers[3],0,4)] + + [g.edge(sigpipes[275], summers[3],0,5)] + + [g.edge(sigpipes[276], summers[3],0,6)] + + [g.edge(sigpipes[277], summers[3],0,7)] + + [g.edge(sigpipes[278], summers[3],0,8)] + + [g.edge(sigpipes[279], summers[3],0,9)] + + [g.edge(sigpipes[280], summers[3],0,10)] + + [g.edge(sigpipes[281], summers[3],0,11)] + + [g.edge(sigpipes[282], summers[3],0,12)] + + [g.edge(sigpipes[283], summers[3],0,13)] + + [g.edge(sigpipes[284], summers[3],0,14)] + + [g.edge(sigpipes[285], summers[3],0,15)] + + [g.edge(sigpipes[286], summers[3],0,16)] + + [g.edge(sigpipes[287], summers[3],0,17)] + + [g.edge(sigpipes[288], summers[3],0,18)] + + [g.edge(sigpipes[289], summers[3],0,19)] + + [g.edge(sigpipes[290], summers[3],0,20)] + + [g.edge(sigpipes[291], summers[3],0,21)] + + [g.edge(sigpipes[292], summers[3],0,22)] + + [g.edge(sigpipes[293], summers[3],0,23)] + + [g.edge(sigpipes[294], summers[3],0,24)] + + [g.edge(sigpipes[295], summers[3],0,25)] + + [g.edge(sigpipes[296], summers[3],0,26)] + + [g.edge(sigpipes[297], summers[3],0,27)] + + [g.edge(sigpipes[298], summers[3],0,28)] + + [g.edge(sigpipes[299], summers[3],0,29)] + + [g.edge(sigpipes[300], summers[3],0,30)] + + [g.edge(sigpipes[301], summers[3],0,31)] + + [g.edge(sigpipes[302], summers[3],0,32)] + + [g.edge(sigpipes[303], summers[3],0,33)] + + [g.edge(sigpipes[304], summers[3],0,34)] + + [g.edge(sigpipes[305], summers[3],0,35)] + + [g.edge(sigpipes[306], summers[3],0,36)] + + [g.edge(sigpipes[307], summers[3],0,37)] + + [g.edge(sigpipes[308], summers[3],0,38)] + + [g.edge(sigpipes[309], summers[3],0,39)] + + [g.edge(sigpipes[310], summers[3],0,40)] + + [g.edge(sigpipes[311], summers[3],0,41)] + + [g.edge(sigpipes[312], summers[3],0,42)] + + [g.edge(sigpipes[313], summers[3],0,43)] + + [g.edge(sigpipes[314], summers[3],0,44)] + + [g.edge(sigpipes[315], summers[3],0,45)] + + [g.edge(sigpipes[316], summers[3],0,46)] + + [g.edge(sigpipes[317], summers[3],0,47)] + + [g.edge(sigpipes[318], summers[3],0,48)] + + [g.edge(sigpipes[319], summers[3],0,49)] + + [g.edge(sigpipes[320], summers[3],0,50)] + + [g.edge(sigpipes[321], summers[3],0,51)] + + [g.edge(sigpipes[322], summers[3],0,52)] + + [g.edge(sigpipes[323], summers[3],0,53)] + + [g.edge(sigpipes[324], summers[3],0,54)] + + [g.edge(sigpipes[325], summers[3],0,55)] + + [g.edge(sigpipes[326], summers[3],0,56)] + + [g.edge(sigpipes[327], summers[3],0,57)] + + [g.edge(sigpipes[328], summers[3],0,58)] + + [g.edge(sigpipes[329], summers[3],0,59)] + + [g.edge(sigpipes[330], summers[3],0,60)] + + [g.edge(sigpipes[331], summers[3],0,61)] + + [g.edge(sigpipes[332], summers[3],0,62)] + + [g.edge(sigpipes[333], summers[3],0,63)] + + [g.edge(sigpipes[334], summers[3],0,64)] + + [g.edge(sigpipes[335], summers[3],0,65)] + + [g.edge(sigpipes[336], summers[3],0,66)] + + [g.edge(sigpipes[337], summers[3],0,67)] + + [g.edge(sigpipes[338], summers[3],0,68)] + + [g.edge(sigpipes[339], summers[3],0,69)] + + [g.edge(sigpipes[340], summers[3],0,70)] + + [g.edge(sigpipes[341], summers[3],0,71)] + + [g.edge(sigpipes[342], summers[3],0,72)] + + [g.edge(sigpipes[343], summers[3],0,73)] + + [g.edge(sigpipes[344], summers[3],0,74)] + + [g.edge(sigpipes[345], summers[3],0,75)] + + [g.edge(sigpipes[346], summers[3],0,76)] + + [g.edge(sigpipes[347], summers[3],0,77)] + + [g.edge(sigpipes[348], summers[3],0,78)] + + [g.edge(sigpipes[349], summers[3],0,79)] + + [g.edge(sigpipes[350], summers[3],0,80)] + + [g.edge(sigpipes[351], summers[3],0,81)] + + [g.edge(sigpipes[352], summers[3],0,82)] + + [g.edge(sigpipes[353], summers[3],0,83)] + + [g.edge(sigpipes[354], summers[3],0,84)] + + [g.edge(sigpipes[355], summers[3],0,85)] + + [g.edge(sigpipes[356], summers[3],0,86)] + + [g.edge(sigpipes[357], summers[3],0,87)] + + [g.edge(sigpipes[358], summers[3],0,88)] + + [g.edge(sigpipes[359], summers[3],0,89)] + // connecting summer and the operator pipelines + + [g.edge(summers[n], actpipes[n]) for n in std.range(0,faninmult-1)], + name=name), + + ret: g.intern(innodes=[fanout], + outnodes=[fanin], + centernodes=[reduceryz], + edges= + [g.edge(fanout, sigpipes[n], n, 0) for n in std.range(0, fanoutmult-1)] + + [g.edge(reduceryz, fanin, n, n) for n in std.range(0, faninmult-1)], + name=name), + }.ret, + + + + // Build a depofanout-[drift]-[signal]-[framesummer]-[pipelines]-fanin graph. + // FrameSummer add up the two "split" anodes into one frame. + // Each branch of the pipelines operates on the summed signal frame. + fandrifter :: function(fout,driftpipes, sigpipes, summers, actpipes, fin, name="fandrifter", outtags=[], tag_rules=[]) { + + local fanoutmult = std.length(driftpipes), + local faninmult = std.length(actpipes), + + local fanout = g.pnode({ + type: fout, + name: name, + data: { + multiplicity: fanoutmult, + tag_rules: tag_rules, + }, + }, nin=1, nout=fanoutmult), + + + local fanin = g.pnode({ + type: fin, + name: name, + data: { + multiplicity: faninmult, + tags: outtags, + }, + }, nin=faninmult, nout=1), + + local drift = g.intern(innodes=driftpipes, + outnodes=actpipes, + centernodes=sigpipes+summers, + edges= + [g.edge(driftpipes[n], sigpipes[n]) for n in std.range(0,fanoutmult-1)] + // connecting signal and summer + + [g.edge(sigpipes[0], summers[0],0,0)] + + [g.edge(sigpipes[1], summers[0],0,1)] + + [g.edge(sigpipes[2], summers[0],0,2)] + + [g.edge(sigpipes[3], summers[0],0,3)] + + [g.edge(sigpipes[4], summers[0],0,4)] + + [g.edge(sigpipes[5], summers[0],0,5)] + + [g.edge(sigpipes[6], summers[0],0,6)] + + [g.edge(sigpipes[7], summers[0],0,7)] + + [g.edge(sigpipes[8], summers[0],0,8)] + + [g.edge(sigpipes[9], summers[0],0,9)] + + [g.edge(sigpipes[10], summers[0],0,10)] + + [g.edge(sigpipes[11], summers[0],0,11)] + + [g.edge(sigpipes[12], summers[0],0,12)] + + [g.edge(sigpipes[13], summers[0],0,13)] + + [g.edge(sigpipes[14], summers[0],0,14)] + + [g.edge(sigpipes[15], summers[0],0,15)] + + [g.edge(sigpipes[16], summers[0],0,16)] + + [g.edge(sigpipes[17], summers[0],0,17)] + + [g.edge(sigpipes[18], summers[0],0,18)] + + [g.edge(sigpipes[19], summers[0],0,19)] + + [g.edge(sigpipes[20], summers[0],0,20)] + + [g.edge(sigpipes[21], summers[0],0,21)] + + [g.edge(sigpipes[22], summers[0],0,22)] + + [g.edge(sigpipes[23], summers[0],0,23)] + + [g.edge(sigpipes[24], summers[0],0,24)] + + [g.edge(sigpipes[25], summers[0],0,25)] + + [g.edge(sigpipes[26], summers[0],0,26)] + + [g.edge(sigpipes[27], summers[0],0,27)] + + [g.edge(sigpipes[28], summers[0],0,28)] + + [g.edge(sigpipes[29], summers[0],0,29)] + + [g.edge(sigpipes[30], summers[0],0,30)] + + [g.edge(sigpipes[31], summers[0],0,31)] + + [g.edge(sigpipes[32], summers[0],0,32)] + + [g.edge(sigpipes[33], summers[0],0,33)] + + [g.edge(sigpipes[34], summers[0],0,34)] + + [g.edge(sigpipes[35], summers[0],0,35)] + + [g.edge(sigpipes[36], summers[0],0,36)] + + [g.edge(sigpipes[37], summers[0],0,37)] + + [g.edge(sigpipes[38], summers[0],0,38)] + + [g.edge(sigpipes[39], summers[0],0,39)] + + [g.edge(sigpipes[40], summers[0],0,40)] + + [g.edge(sigpipes[41], summers[0],0,41)] + + [g.edge(sigpipes[42], summers[0],0,42)] + + [g.edge(sigpipes[43], summers[0],0,43)] + + [g.edge(sigpipes[44], summers[0],0,44)] + + [g.edge(sigpipes[45], summers[0],0,45)] + + [g.edge(sigpipes[46], summers[0],0,46)] + + [g.edge(sigpipes[47], summers[0],0,47)] + + [g.edge(sigpipes[48], summers[0],0,48)] + + [g.edge(sigpipes[49], summers[0],0,49)] + + [g.edge(sigpipes[50], summers[0],0,50)] + + [g.edge(sigpipes[51], summers[0],0,51)] + + [g.edge(sigpipes[52], summers[0],0,52)] + + [g.edge(sigpipes[53], summers[0],0,53)] + + [g.edge(sigpipes[54], summers[0],0,54)] + + [g.edge(sigpipes[55], summers[0],0,55)] + + [g.edge(sigpipes[56], summers[0],0,56)] + + [g.edge(sigpipes[57], summers[0],0,57)] + + [g.edge(sigpipes[58], summers[0],0,58)] + + [g.edge(sigpipes[59], summers[0],0,59)] + + [g.edge(sigpipes[60], summers[0],0,60)] + + [g.edge(sigpipes[61], summers[0],0,61)] + + [g.edge(sigpipes[62], summers[0],0,62)] + + [g.edge(sigpipes[63], summers[0],0,63)] + + [g.edge(sigpipes[64], summers[0],0,64)] + + [g.edge(sigpipes[65], summers[0],0,65)] + + [g.edge(sigpipes[66], summers[0],0,66)] + + [g.edge(sigpipes[67], summers[0],0,67)] + + [g.edge(sigpipes[68], summers[0],0,68)] + + [g.edge(sigpipes[69], summers[0],0,69)] + + [g.edge(sigpipes[70], summers[0],0,70)] + + [g.edge(sigpipes[71], summers[0],0,71)] + + [g.edge(sigpipes[72], summers[0],0,72)] + + [g.edge(sigpipes[73], summers[0],0,73)] + + [g.edge(sigpipes[74], summers[0],0,74)] + + [g.edge(sigpipes[75], summers[0],0,75)] + + [g.edge(sigpipes[76], summers[0],0,76)] + + [g.edge(sigpipes[77], summers[0],0,77)] + + [g.edge(sigpipes[78], summers[0],0,78)] + + [g.edge(sigpipes[79], summers[0],0,79)] + + [g.edge(sigpipes[80], summers[0],0,80)] + + [g.edge(sigpipes[81], summers[0],0,81)] + + [g.edge(sigpipes[82], summers[0],0,82)] + + [g.edge(sigpipes[83], summers[0],0,83)] + + [g.edge(sigpipes[84], summers[0],0,84)] + + [g.edge(sigpipes[85], summers[0],0,85)] + + [g.edge(sigpipes[86], summers[0],0,86)] + + [g.edge(sigpipes[87], summers[0],0,87)] + + [g.edge(sigpipes[88], summers[0],0,88)] + + [g.edge(sigpipes[89], summers[0],0,89)] + + [g.edge(sigpipes[90], summers[1],0,0)] + + [g.edge(sigpipes[91], summers[1],0,1)] + + [g.edge(sigpipes[92], summers[1],0,2)] + + [g.edge(sigpipes[93], summers[1],0,3)] + + [g.edge(sigpipes[94], summers[1],0,4)] + + [g.edge(sigpipes[95], summers[1],0,5)] + + [g.edge(sigpipes[96], summers[1],0,6)] + + [g.edge(sigpipes[97], summers[1],0,7)] + + [g.edge(sigpipes[98], summers[1],0,8)] + + [g.edge(sigpipes[99], summers[1],0,9)] + + [g.edge(sigpipes[100], summers[1],0,10)] + + [g.edge(sigpipes[101], summers[1],0,11)] + + [g.edge(sigpipes[102], summers[1],0,12)] + + [g.edge(sigpipes[103], summers[1],0,13)] + + [g.edge(sigpipes[104], summers[1],0,14)] + + [g.edge(sigpipes[105], summers[1],0,15)] + + [g.edge(sigpipes[106], summers[1],0,16)] + + [g.edge(sigpipes[107], summers[1],0,17)] + + [g.edge(sigpipes[108], summers[1],0,18)] + + [g.edge(sigpipes[109], summers[1],0,19)] + + [g.edge(sigpipes[110], summers[1],0,20)] + + [g.edge(sigpipes[111], summers[1],0,21)] + + [g.edge(sigpipes[112], summers[1],0,22)] + + [g.edge(sigpipes[113], summers[1],0,23)] + + [g.edge(sigpipes[114], summers[1],0,24)] + + [g.edge(sigpipes[115], summers[1],0,25)] + + [g.edge(sigpipes[116], summers[1],0,26)] + + [g.edge(sigpipes[117], summers[1],0,27)] + + [g.edge(sigpipes[118], summers[1],0,28)] + + [g.edge(sigpipes[119], summers[1],0,29)] + + [g.edge(sigpipes[120], summers[1],0,30)] + + [g.edge(sigpipes[121], summers[1],0,31)] + + [g.edge(sigpipes[122], summers[1],0,32)] + + [g.edge(sigpipes[123], summers[1],0,33)] + + [g.edge(sigpipes[124], summers[1],0,34)] + + [g.edge(sigpipes[125], summers[1],0,35)] + + [g.edge(sigpipes[126], summers[1],0,36)] + + [g.edge(sigpipes[127], summers[1],0,37)] + + [g.edge(sigpipes[128], summers[1],0,38)] + + [g.edge(sigpipes[129], summers[1],0,39)] + + [g.edge(sigpipes[130], summers[1],0,40)] + + [g.edge(sigpipes[131], summers[1],0,41)] + + [g.edge(sigpipes[132], summers[1],0,42)] + + [g.edge(sigpipes[133], summers[1],0,43)] + + [g.edge(sigpipes[134], summers[1],0,44)] + + [g.edge(sigpipes[135], summers[1],0,45)] + + [g.edge(sigpipes[136], summers[1],0,46)] + + [g.edge(sigpipes[137], summers[1],0,47)] + + [g.edge(sigpipes[138], summers[1],0,48)] + + [g.edge(sigpipes[139], summers[1],0,49)] + + [g.edge(sigpipes[140], summers[1],0,50)] + + [g.edge(sigpipes[141], summers[1],0,51)] + + [g.edge(sigpipes[142], summers[1],0,52)] + + [g.edge(sigpipes[143], summers[1],0,53)] + + [g.edge(sigpipes[144], summers[1],0,54)] + + [g.edge(sigpipes[145], summers[1],0,55)] + + [g.edge(sigpipes[146], summers[1],0,56)] + + [g.edge(sigpipes[147], summers[1],0,57)] + + [g.edge(sigpipes[148], summers[1],0,58)] + + [g.edge(sigpipes[149], summers[1],0,59)] + + [g.edge(sigpipes[150], summers[1],0,60)] + + [g.edge(sigpipes[151], summers[1],0,61)] + + [g.edge(sigpipes[152], summers[1],0,62)] + + [g.edge(sigpipes[153], summers[1],0,63)] + + [g.edge(sigpipes[154], summers[1],0,64)] + + [g.edge(sigpipes[155], summers[1],0,65)] + + [g.edge(sigpipes[156], summers[1],0,66)] + + [g.edge(sigpipes[157], summers[1],0,67)] + + [g.edge(sigpipes[158], summers[1],0,68)] + + [g.edge(sigpipes[159], summers[1],0,69)] + + [g.edge(sigpipes[160], summers[1],0,70)] + + [g.edge(sigpipes[161], summers[1],0,71)] + + [g.edge(sigpipes[162], summers[1],0,72)] + + [g.edge(sigpipes[163], summers[1],0,73)] + + [g.edge(sigpipes[164], summers[1],0,74)] + + [g.edge(sigpipes[165], summers[1],0,75)] + + [g.edge(sigpipes[166], summers[1],0,76)] + + [g.edge(sigpipes[167], summers[1],0,77)] + + [g.edge(sigpipes[168], summers[1],0,78)] + + [g.edge(sigpipes[169], summers[1],0,79)] + + [g.edge(sigpipes[170], summers[1],0,80)] + + [g.edge(sigpipes[171], summers[1],0,81)] + + [g.edge(sigpipes[172], summers[1],0,82)] + + [g.edge(sigpipes[173], summers[1],0,83)] + + [g.edge(sigpipes[174], summers[1],0,84)] + + [g.edge(sigpipes[175], summers[1],0,85)] + + [g.edge(sigpipes[176], summers[1],0,86)] + + [g.edge(sigpipes[177], summers[1],0,87)] + + [g.edge(sigpipes[178], summers[1],0,88)] + + [g.edge(sigpipes[179], summers[1],0,89)] + + [g.edge(sigpipes[180], summers[2],0,0)] + + [g.edge(sigpipes[181], summers[2],0,1)] + + [g.edge(sigpipes[182], summers[2],0,2)] + + [g.edge(sigpipes[183], summers[2],0,3)] + + [g.edge(sigpipes[184], summers[2],0,4)] + + [g.edge(sigpipes[185], summers[2],0,5)] + + [g.edge(sigpipes[186], summers[2],0,6)] + + [g.edge(sigpipes[187], summers[2],0,7)] + + [g.edge(sigpipes[188], summers[2],0,8)] + + [g.edge(sigpipes[189], summers[2],0,9)] + + [g.edge(sigpipes[190], summers[2],0,10)] + + [g.edge(sigpipes[191], summers[2],0,11)] + + [g.edge(sigpipes[192], summers[2],0,12)] + + [g.edge(sigpipes[193], summers[2],0,13)] + + [g.edge(sigpipes[194], summers[2],0,14)] + + [g.edge(sigpipes[195], summers[2],0,15)] + + [g.edge(sigpipes[196], summers[2],0,16)] + + [g.edge(sigpipes[197], summers[2],0,17)] + + [g.edge(sigpipes[198], summers[2],0,18)] + + [g.edge(sigpipes[199], summers[2],0,19)] + + [g.edge(sigpipes[200], summers[2],0,20)] + + [g.edge(sigpipes[201], summers[2],0,21)] + + [g.edge(sigpipes[202], summers[2],0,22)] + + [g.edge(sigpipes[203], summers[2],0,23)] + + [g.edge(sigpipes[204], summers[2],0,24)] + + [g.edge(sigpipes[205], summers[2],0,25)] + + [g.edge(sigpipes[206], summers[2],0,26)] + + [g.edge(sigpipes[207], summers[2],0,27)] + + [g.edge(sigpipes[208], summers[2],0,28)] + + [g.edge(sigpipes[209], summers[2],0,29)] + + [g.edge(sigpipes[210], summers[2],0,30)] + + [g.edge(sigpipes[211], summers[2],0,31)] + + [g.edge(sigpipes[212], summers[2],0,32)] + + [g.edge(sigpipes[213], summers[2],0,33)] + + [g.edge(sigpipes[214], summers[2],0,34)] + + [g.edge(sigpipes[215], summers[2],0,35)] + + [g.edge(sigpipes[216], summers[2],0,36)] + + [g.edge(sigpipes[217], summers[2],0,37)] + + [g.edge(sigpipes[218], summers[2],0,38)] + + [g.edge(sigpipes[219], summers[2],0,39)] + + [g.edge(sigpipes[220], summers[2],0,40)] + + [g.edge(sigpipes[221], summers[2],0,41)] + + [g.edge(sigpipes[222], summers[2],0,42)] + + [g.edge(sigpipes[223], summers[2],0,43)] + + [g.edge(sigpipes[224], summers[2],0,44)] + + [g.edge(sigpipes[225], summers[2],0,45)] + + [g.edge(sigpipes[226], summers[2],0,46)] + + [g.edge(sigpipes[227], summers[2],0,47)] + + [g.edge(sigpipes[228], summers[2],0,48)] + + [g.edge(sigpipes[229], summers[2],0,49)] + + [g.edge(sigpipes[230], summers[2],0,50)] + + [g.edge(sigpipes[231], summers[2],0,51)] + + [g.edge(sigpipes[232], summers[2],0,52)] + + [g.edge(sigpipes[233], summers[2],0,53)] + + [g.edge(sigpipes[234], summers[2],0,54)] + + [g.edge(sigpipes[235], summers[2],0,55)] + + [g.edge(sigpipes[236], summers[2],0,56)] + + [g.edge(sigpipes[237], summers[2],0,57)] + + [g.edge(sigpipes[238], summers[2],0,58)] + + [g.edge(sigpipes[239], summers[2],0,59)] + + [g.edge(sigpipes[240], summers[2],0,60)] + + [g.edge(sigpipes[241], summers[2],0,61)] + + [g.edge(sigpipes[242], summers[2],0,62)] + + [g.edge(sigpipes[243], summers[2],0,63)] + + [g.edge(sigpipes[244], summers[2],0,64)] + + [g.edge(sigpipes[245], summers[2],0,65)] + + [g.edge(sigpipes[246], summers[2],0,66)] + + [g.edge(sigpipes[247], summers[2],0,67)] + + [g.edge(sigpipes[248], summers[2],0,68)] + + [g.edge(sigpipes[249], summers[2],0,69)] + + [g.edge(sigpipes[250], summers[2],0,70)] + + [g.edge(sigpipes[251], summers[2],0,71)] + + [g.edge(sigpipes[252], summers[2],0,72)] + + [g.edge(sigpipes[253], summers[2],0,73)] + + [g.edge(sigpipes[254], summers[2],0,74)] + + [g.edge(sigpipes[255], summers[2],0,75)] + + [g.edge(sigpipes[256], summers[2],0,76)] + + [g.edge(sigpipes[257], summers[2],0,77)] + + [g.edge(sigpipes[258], summers[2],0,78)] + + [g.edge(sigpipes[259], summers[2],0,79)] + + [g.edge(sigpipes[260], summers[2],0,80)] + + [g.edge(sigpipes[261], summers[2],0,81)] + + [g.edge(sigpipes[262], summers[2],0,82)] + + [g.edge(sigpipes[263], summers[2],0,83)] + + [g.edge(sigpipes[264], summers[2],0,84)] + + [g.edge(sigpipes[265], summers[2],0,85)] + + [g.edge(sigpipes[266], summers[2],0,86)] + + [g.edge(sigpipes[267], summers[2],0,87)] + + [g.edge(sigpipes[268], summers[2],0,88)] + + [g.edge(sigpipes[269], summers[2],0,89)] + + [g.edge(sigpipes[270], summers[3],0,0)] + + [g.edge(sigpipes[271], summers[3],0,1)] + + [g.edge(sigpipes[272], summers[3],0,2)] + + [g.edge(sigpipes[273], summers[3],0,3)] + + [g.edge(sigpipes[274], summers[3],0,4)] + + [g.edge(sigpipes[275], summers[3],0,5)] + + [g.edge(sigpipes[276], summers[3],0,6)] + + [g.edge(sigpipes[277], summers[3],0,7)] + + [g.edge(sigpipes[278], summers[3],0,8)] + + [g.edge(sigpipes[279], summers[3],0,9)] + + [g.edge(sigpipes[280], summers[3],0,10)] + + [g.edge(sigpipes[281], summers[3],0,11)] + + [g.edge(sigpipes[282], summers[3],0,12)] + + [g.edge(sigpipes[283], summers[3],0,13)] + + [g.edge(sigpipes[284], summers[3],0,14)] + + [g.edge(sigpipes[285], summers[3],0,15)] + + [g.edge(sigpipes[286], summers[3],0,16)] + + [g.edge(sigpipes[287], summers[3],0,17)] + + [g.edge(sigpipes[288], summers[3],0,18)] + + [g.edge(sigpipes[289], summers[3],0,19)] + + [g.edge(sigpipes[290], summers[3],0,20)] + + [g.edge(sigpipes[291], summers[3],0,21)] + + [g.edge(sigpipes[292], summers[3],0,22)] + + [g.edge(sigpipes[293], summers[3],0,23)] + + [g.edge(sigpipes[294], summers[3],0,24)] + + [g.edge(sigpipes[295], summers[3],0,25)] + + [g.edge(sigpipes[296], summers[3],0,26)] + + [g.edge(sigpipes[297], summers[3],0,27)] + + [g.edge(sigpipes[298], summers[3],0,28)] + + [g.edge(sigpipes[299], summers[3],0,29)] + + [g.edge(sigpipes[300], summers[3],0,30)] + + [g.edge(sigpipes[301], summers[3],0,31)] + + [g.edge(sigpipes[302], summers[3],0,32)] + + [g.edge(sigpipes[303], summers[3],0,33)] + + [g.edge(sigpipes[304], summers[3],0,34)] + + [g.edge(sigpipes[305], summers[3],0,35)] + + [g.edge(sigpipes[306], summers[3],0,36)] + + [g.edge(sigpipes[307], summers[3],0,37)] + + [g.edge(sigpipes[308], summers[3],0,38)] + + [g.edge(sigpipes[309], summers[3],0,39)] + + [g.edge(sigpipes[310], summers[3],0,40)] + + [g.edge(sigpipes[311], summers[3],0,41)] + + [g.edge(sigpipes[312], summers[3],0,42)] + + [g.edge(sigpipes[313], summers[3],0,43)] + + [g.edge(sigpipes[314], summers[3],0,44)] + + [g.edge(sigpipes[315], summers[3],0,45)] + + [g.edge(sigpipes[316], summers[3],0,46)] + + [g.edge(sigpipes[317], summers[3],0,47)] + + [g.edge(sigpipes[318], summers[3],0,48)] + + [g.edge(sigpipes[319], summers[3],0,49)] + + [g.edge(sigpipes[320], summers[3],0,50)] + + [g.edge(sigpipes[321], summers[3],0,51)] + + [g.edge(sigpipes[322], summers[3],0,52)] + + [g.edge(sigpipes[323], summers[3],0,53)] + + [g.edge(sigpipes[324], summers[3],0,54)] + + [g.edge(sigpipes[325], summers[3],0,55)] + + [g.edge(sigpipes[326], summers[3],0,56)] + + [g.edge(sigpipes[327], summers[3],0,57)] + + [g.edge(sigpipes[328], summers[3],0,58)] + + [g.edge(sigpipes[329], summers[3],0,59)] + + [g.edge(sigpipes[330], summers[3],0,60)] + + [g.edge(sigpipes[331], summers[3],0,61)] + + [g.edge(sigpipes[332], summers[3],0,62)] + + [g.edge(sigpipes[333], summers[3],0,63)] + + [g.edge(sigpipes[334], summers[3],0,64)] + + [g.edge(sigpipes[335], summers[3],0,65)] + + [g.edge(sigpipes[336], summers[3],0,66)] + + [g.edge(sigpipes[337], summers[3],0,67)] + + [g.edge(sigpipes[338], summers[3],0,68)] + + [g.edge(sigpipes[339], summers[3],0,69)] + + [g.edge(sigpipes[340], summers[3],0,70)] + + [g.edge(sigpipes[341], summers[3],0,71)] + + [g.edge(sigpipes[342], summers[3],0,72)] + + [g.edge(sigpipes[343], summers[3],0,73)] + + [g.edge(sigpipes[344], summers[3],0,74)] + + [g.edge(sigpipes[345], summers[3],0,75)] + + [g.edge(sigpipes[346], summers[3],0,76)] + + [g.edge(sigpipes[347], summers[3],0,77)] + + [g.edge(sigpipes[348], summers[3],0,78)] + + [g.edge(sigpipes[349], summers[3],0,79)] + + [g.edge(sigpipes[350], summers[3],0,80)] + + [g.edge(sigpipes[351], summers[3],0,81)] + + [g.edge(sigpipes[352], summers[3],0,82)] + + [g.edge(sigpipes[353], summers[3],0,83)] + + [g.edge(sigpipes[354], summers[3],0,84)] + + [g.edge(sigpipes[355], summers[3],0,85)] + + [g.edge(sigpipes[356], summers[3],0,86)] + + [g.edge(sigpipes[357], summers[3],0,87)] + + [g.edge(sigpipes[358], summers[3],0,88)] + + [g.edge(sigpipes[359], summers[3],0,89)] + // connecting summer and the operator pipelines + + [g.edge(summers[n], actpipes[n]) for n in std.range(0,faninmult-1)], + name=name), + + local signal = g.intern(innodes=sigpipes, + outnodes=actpipes, + centernodes=summers, + edges= + // connecting signal and summer + + [g.edge(sigpipes[0], summers[0],0,0)] + + [g.edge(sigpipes[1], summers[0],0,1)] + + [g.edge(sigpipes[2], summers[0],0,2)] + + [g.edge(sigpipes[3], summers[0],0,3)] + + [g.edge(sigpipes[4], summers[0],0,4)] + + [g.edge(sigpipes[5], summers[0],0,5)] + + [g.edge(sigpipes[6], summers[0],0,6)] + + [g.edge(sigpipes[7], summers[0],0,7)] + + [g.edge(sigpipes[8], summers[0],0,8)] + + [g.edge(sigpipes[9], summers[0],0,9)] + + [g.edge(sigpipes[10], summers[0],0,10)] + + [g.edge(sigpipes[11], summers[0],0,11)] + + [g.edge(sigpipes[12], summers[0],0,12)] + + [g.edge(sigpipes[13], summers[0],0,13)] + + [g.edge(sigpipes[14], summers[0],0,14)] + + [g.edge(sigpipes[15], summers[0],0,15)] + + [g.edge(sigpipes[16], summers[0],0,16)] + + [g.edge(sigpipes[17], summers[0],0,17)] + + [g.edge(sigpipes[18], summers[0],0,18)] + + [g.edge(sigpipes[19], summers[0],0,19)] + + [g.edge(sigpipes[20], summers[0],0,20)] + + [g.edge(sigpipes[21], summers[0],0,21)] + + [g.edge(sigpipes[22], summers[0],0,22)] + + [g.edge(sigpipes[23], summers[0],0,23)] + + [g.edge(sigpipes[24], summers[0],0,24)] + + [g.edge(sigpipes[25], summers[0],0,25)] + + [g.edge(sigpipes[26], summers[0],0,26)] + + [g.edge(sigpipes[27], summers[0],0,27)] + + [g.edge(sigpipes[28], summers[0],0,28)] + + [g.edge(sigpipes[29], summers[0],0,29)] + + [g.edge(sigpipes[30], summers[0],0,30)] + + [g.edge(sigpipes[31], summers[0],0,31)] + + [g.edge(sigpipes[32], summers[0],0,32)] + + [g.edge(sigpipes[33], summers[0],0,33)] + + [g.edge(sigpipes[34], summers[0],0,34)] + + [g.edge(sigpipes[35], summers[0],0,35)] + + [g.edge(sigpipes[36], summers[0],0,36)] + + [g.edge(sigpipes[37], summers[0],0,37)] + + [g.edge(sigpipes[38], summers[0],0,38)] + + [g.edge(sigpipes[39], summers[0],0,39)] + + [g.edge(sigpipes[40], summers[0],0,40)] + + [g.edge(sigpipes[41], summers[0],0,41)] + + [g.edge(sigpipes[42], summers[0],0,42)] + + [g.edge(sigpipes[43], summers[0],0,43)] + + [g.edge(sigpipes[44], summers[0],0,44)] + + [g.edge(sigpipes[45], summers[0],0,45)] + + [g.edge(sigpipes[46], summers[0],0,46)] + + [g.edge(sigpipes[47], summers[0],0,47)] + + [g.edge(sigpipes[48], summers[0],0,48)] + + [g.edge(sigpipes[49], summers[0],0,49)] + + [g.edge(sigpipes[50], summers[0],0,50)] + + [g.edge(sigpipes[51], summers[0],0,51)] + + [g.edge(sigpipes[52], summers[0],0,52)] + + [g.edge(sigpipes[53], summers[0],0,53)] + + [g.edge(sigpipes[54], summers[0],0,54)] + + [g.edge(sigpipes[55], summers[0],0,55)] + + [g.edge(sigpipes[56], summers[0],0,56)] + + [g.edge(sigpipes[57], summers[0],0,57)] + + [g.edge(sigpipes[58], summers[0],0,58)] + + [g.edge(sigpipes[59], summers[0],0,59)] + + [g.edge(sigpipes[60], summers[0],0,60)] + + [g.edge(sigpipes[61], summers[0],0,61)] + + [g.edge(sigpipes[62], summers[0],0,62)] + + [g.edge(sigpipes[63], summers[0],0,63)] + + [g.edge(sigpipes[64], summers[0],0,64)] + + [g.edge(sigpipes[65], summers[0],0,65)] + + [g.edge(sigpipes[66], summers[0],0,66)] + + [g.edge(sigpipes[67], summers[0],0,67)] + + [g.edge(sigpipes[68], summers[0],0,68)] + + [g.edge(sigpipes[69], summers[0],0,69)] + + [g.edge(sigpipes[70], summers[0],0,70)] + + [g.edge(sigpipes[71], summers[0],0,71)] + + [g.edge(sigpipes[72], summers[0],0,72)] + + [g.edge(sigpipes[73], summers[0],0,73)] + + [g.edge(sigpipes[74], summers[0],0,74)] + + [g.edge(sigpipes[75], summers[0],0,75)] + + [g.edge(sigpipes[76], summers[0],0,76)] + + [g.edge(sigpipes[77], summers[0],0,77)] + + [g.edge(sigpipes[78], summers[0],0,78)] + + [g.edge(sigpipes[79], summers[0],0,79)] + + [g.edge(sigpipes[80], summers[0],0,80)] + + [g.edge(sigpipes[81], summers[0],0,81)] + + [g.edge(sigpipes[82], summers[0],0,82)] + + [g.edge(sigpipes[83], summers[0],0,83)] + + [g.edge(sigpipes[84], summers[0],0,84)] + + [g.edge(sigpipes[85], summers[0],0,85)] + + [g.edge(sigpipes[86], summers[0],0,86)] + + [g.edge(sigpipes[87], summers[0],0,87)] + + [g.edge(sigpipes[88], summers[0],0,88)] + + [g.edge(sigpipes[89], summers[0],0,89)] + + [g.edge(sigpipes[90], summers[1],0,0)] + + [g.edge(sigpipes[91], summers[1],0,1)] + + [g.edge(sigpipes[92], summers[1],0,2)] + + [g.edge(sigpipes[93], summers[1],0,3)] + + [g.edge(sigpipes[94], summers[1],0,4)] + + [g.edge(sigpipes[95], summers[1],0,5)] + + [g.edge(sigpipes[96], summers[1],0,6)] + + [g.edge(sigpipes[97], summers[1],0,7)] + + [g.edge(sigpipes[98], summers[1],0,8)] + + [g.edge(sigpipes[99], summers[1],0,9)] + + [g.edge(sigpipes[100], summers[1],0,10)] + + [g.edge(sigpipes[101], summers[1],0,11)] + + [g.edge(sigpipes[102], summers[1],0,12)] + + [g.edge(sigpipes[103], summers[1],0,13)] + + [g.edge(sigpipes[104], summers[1],0,14)] + + [g.edge(sigpipes[105], summers[1],0,15)] + + [g.edge(sigpipes[106], summers[1],0,16)] + + [g.edge(sigpipes[107], summers[1],0,17)] + + [g.edge(sigpipes[108], summers[1],0,18)] + + [g.edge(sigpipes[109], summers[1],0,19)] + + [g.edge(sigpipes[110], summers[1],0,20)] + + [g.edge(sigpipes[111], summers[1],0,21)] + + [g.edge(sigpipes[112], summers[1],0,22)] + + [g.edge(sigpipes[113], summers[1],0,23)] + + [g.edge(sigpipes[114], summers[1],0,24)] + + [g.edge(sigpipes[115], summers[1],0,25)] + + [g.edge(sigpipes[116], summers[1],0,26)] + + [g.edge(sigpipes[117], summers[1],0,27)] + + [g.edge(sigpipes[118], summers[1],0,28)] + + [g.edge(sigpipes[119], summers[1],0,29)] + + [g.edge(sigpipes[120], summers[1],0,30)] + + [g.edge(sigpipes[121], summers[1],0,31)] + + [g.edge(sigpipes[122], summers[1],0,32)] + + [g.edge(sigpipes[123], summers[1],0,33)] + + [g.edge(sigpipes[124], summers[1],0,34)] + + [g.edge(sigpipes[125], summers[1],0,35)] + + [g.edge(sigpipes[126], summers[1],0,36)] + + [g.edge(sigpipes[127], summers[1],0,37)] + + [g.edge(sigpipes[128], summers[1],0,38)] + + [g.edge(sigpipes[129], summers[1],0,39)] + + [g.edge(sigpipes[130], summers[1],0,40)] + + [g.edge(sigpipes[131], summers[1],0,41)] + + [g.edge(sigpipes[132], summers[1],0,42)] + + [g.edge(sigpipes[133], summers[1],0,43)] + + [g.edge(sigpipes[134], summers[1],0,44)] + + [g.edge(sigpipes[135], summers[1],0,45)] + + [g.edge(sigpipes[136], summers[1],0,46)] + + [g.edge(sigpipes[137], summers[1],0,47)] + + [g.edge(sigpipes[138], summers[1],0,48)] + + [g.edge(sigpipes[139], summers[1],0,49)] + + [g.edge(sigpipes[140], summers[1],0,50)] + + [g.edge(sigpipes[141], summers[1],0,51)] + + [g.edge(sigpipes[142], summers[1],0,52)] + + [g.edge(sigpipes[143], summers[1],0,53)] + + [g.edge(sigpipes[144], summers[1],0,54)] + + [g.edge(sigpipes[145], summers[1],0,55)] + + [g.edge(sigpipes[146], summers[1],0,56)] + + [g.edge(sigpipes[147], summers[1],0,57)] + + [g.edge(sigpipes[148], summers[1],0,58)] + + [g.edge(sigpipes[149], summers[1],0,59)] + + [g.edge(sigpipes[150], summers[1],0,60)] + + [g.edge(sigpipes[151], summers[1],0,61)] + + [g.edge(sigpipes[152], summers[1],0,62)] + + [g.edge(sigpipes[153], summers[1],0,63)] + + [g.edge(sigpipes[154], summers[1],0,64)] + + [g.edge(sigpipes[155], summers[1],0,65)] + + [g.edge(sigpipes[156], summers[1],0,66)] + + [g.edge(sigpipes[157], summers[1],0,67)] + + [g.edge(sigpipes[158], summers[1],0,68)] + + [g.edge(sigpipes[159], summers[1],0,69)] + + [g.edge(sigpipes[160], summers[1],0,70)] + + [g.edge(sigpipes[161], summers[1],0,71)] + + [g.edge(sigpipes[162], summers[1],0,72)] + + [g.edge(sigpipes[163], summers[1],0,73)] + + [g.edge(sigpipes[164], summers[1],0,74)] + + [g.edge(sigpipes[165], summers[1],0,75)] + + [g.edge(sigpipes[166], summers[1],0,76)] + + [g.edge(sigpipes[167], summers[1],0,77)] + + [g.edge(sigpipes[168], summers[1],0,78)] + + [g.edge(sigpipes[169], summers[1],0,79)] + + [g.edge(sigpipes[170], summers[1],0,80)] + + [g.edge(sigpipes[171], summers[1],0,81)] + + [g.edge(sigpipes[172], summers[1],0,82)] + + [g.edge(sigpipes[173], summers[1],0,83)] + + [g.edge(sigpipes[174], summers[1],0,84)] + + [g.edge(sigpipes[175], summers[1],0,85)] + + [g.edge(sigpipes[176], summers[1],0,86)] + + [g.edge(sigpipes[177], summers[1],0,87)] + + [g.edge(sigpipes[178], summers[1],0,88)] + + [g.edge(sigpipes[179], summers[1],0,89)] + + [g.edge(sigpipes[180], summers[2],0,0)] + + [g.edge(sigpipes[181], summers[2],0,1)] + + [g.edge(sigpipes[182], summers[2],0,2)] + + [g.edge(sigpipes[183], summers[2],0,3)] + + [g.edge(sigpipes[184], summers[2],0,4)] + + [g.edge(sigpipes[185], summers[2],0,5)] + + [g.edge(sigpipes[186], summers[2],0,6)] + + [g.edge(sigpipes[187], summers[2],0,7)] + + [g.edge(sigpipes[188], summers[2],0,8)] + + [g.edge(sigpipes[189], summers[2],0,9)] + + [g.edge(sigpipes[190], summers[2],0,10)] + + [g.edge(sigpipes[191], summers[2],0,11)] + + [g.edge(sigpipes[192], summers[2],0,12)] + + [g.edge(sigpipes[193], summers[2],0,13)] + + [g.edge(sigpipes[194], summers[2],0,14)] + + [g.edge(sigpipes[195], summers[2],0,15)] + + [g.edge(sigpipes[196], summers[2],0,16)] + + [g.edge(sigpipes[197], summers[2],0,17)] + + [g.edge(sigpipes[198], summers[2],0,18)] + + [g.edge(sigpipes[199], summers[2],0,19)] + + [g.edge(sigpipes[200], summers[2],0,20)] + + [g.edge(sigpipes[201], summers[2],0,21)] + + [g.edge(sigpipes[202], summers[2],0,22)] + + [g.edge(sigpipes[203], summers[2],0,23)] + + [g.edge(sigpipes[204], summers[2],0,24)] + + [g.edge(sigpipes[205], summers[2],0,25)] + + [g.edge(sigpipes[206], summers[2],0,26)] + + [g.edge(sigpipes[207], summers[2],0,27)] + + [g.edge(sigpipes[208], summers[2],0,28)] + + [g.edge(sigpipes[209], summers[2],0,29)] + + [g.edge(sigpipes[210], summers[2],0,30)] + + [g.edge(sigpipes[211], summers[2],0,31)] + + [g.edge(sigpipes[212], summers[2],0,32)] + + [g.edge(sigpipes[213], summers[2],0,33)] + + [g.edge(sigpipes[214], summers[2],0,34)] + + [g.edge(sigpipes[215], summers[2],0,35)] + + [g.edge(sigpipes[216], summers[2],0,36)] + + [g.edge(sigpipes[217], summers[2],0,37)] + + [g.edge(sigpipes[218], summers[2],0,38)] + + [g.edge(sigpipes[219], summers[2],0,39)] + + [g.edge(sigpipes[220], summers[2],0,40)] + + [g.edge(sigpipes[221], summers[2],0,41)] + + [g.edge(sigpipes[222], summers[2],0,42)] + + [g.edge(sigpipes[223], summers[2],0,43)] + + [g.edge(sigpipes[224], summers[2],0,44)] + + [g.edge(sigpipes[225], summers[2],0,45)] + + [g.edge(sigpipes[226], summers[2],0,46)] + + [g.edge(sigpipes[227], summers[2],0,47)] + + [g.edge(sigpipes[228], summers[2],0,48)] + + [g.edge(sigpipes[229], summers[2],0,49)] + + [g.edge(sigpipes[230], summers[2],0,50)] + + [g.edge(sigpipes[231], summers[2],0,51)] + + [g.edge(sigpipes[232], summers[2],0,52)] + + [g.edge(sigpipes[233], summers[2],0,53)] + + [g.edge(sigpipes[234], summers[2],0,54)] + + [g.edge(sigpipes[235], summers[2],0,55)] + + [g.edge(sigpipes[236], summers[2],0,56)] + + [g.edge(sigpipes[237], summers[2],0,57)] + + [g.edge(sigpipes[238], summers[2],0,58)] + + [g.edge(sigpipes[239], summers[2],0,59)] + + [g.edge(sigpipes[240], summers[2],0,60)] + + [g.edge(sigpipes[241], summers[2],0,61)] + + [g.edge(sigpipes[242], summers[2],0,62)] + + [g.edge(sigpipes[243], summers[2],0,63)] + + [g.edge(sigpipes[244], summers[2],0,64)] + + [g.edge(sigpipes[245], summers[2],0,65)] + + [g.edge(sigpipes[246], summers[2],0,66)] + + [g.edge(sigpipes[247], summers[2],0,67)] + + [g.edge(sigpipes[248], summers[2],0,68)] + + [g.edge(sigpipes[249], summers[2],0,69)] + + [g.edge(sigpipes[250], summers[2],0,70)] + + [g.edge(sigpipes[251], summers[2],0,71)] + + [g.edge(sigpipes[252], summers[2],0,72)] + + [g.edge(sigpipes[253], summers[2],0,73)] + + [g.edge(sigpipes[254], summers[2],0,74)] + + [g.edge(sigpipes[255], summers[2],0,75)] + + [g.edge(sigpipes[256], summers[2],0,76)] + + [g.edge(sigpipes[257], summers[2],0,77)] + + [g.edge(sigpipes[258], summers[2],0,78)] + + [g.edge(sigpipes[259], summers[2],0,79)] + + [g.edge(sigpipes[260], summers[2],0,80)] + + [g.edge(sigpipes[261], summers[2],0,81)] + + [g.edge(sigpipes[262], summers[2],0,82)] + + [g.edge(sigpipes[263], summers[2],0,83)] + + [g.edge(sigpipes[264], summers[2],0,84)] + + [g.edge(sigpipes[265], summers[2],0,85)] + + [g.edge(sigpipes[266], summers[2],0,86)] + + [g.edge(sigpipes[267], summers[2],0,87)] + + [g.edge(sigpipes[268], summers[2],0,88)] + + [g.edge(sigpipes[269], summers[2],0,89)] + + [g.edge(sigpipes[270], summers[3],0,0)] + + [g.edge(sigpipes[271], summers[3],0,1)] + + [g.edge(sigpipes[272], summers[3],0,2)] + + [g.edge(sigpipes[273], summers[3],0,3)] + + [g.edge(sigpipes[274], summers[3],0,4)] + + [g.edge(sigpipes[275], summers[3],0,5)] + + [g.edge(sigpipes[276], summers[3],0,6)] + + [g.edge(sigpipes[277], summers[3],0,7)] + + [g.edge(sigpipes[278], summers[3],0,8)] + + [g.edge(sigpipes[279], summers[3],0,9)] + + [g.edge(sigpipes[280], summers[3],0,10)] + + [g.edge(sigpipes[281], summers[3],0,11)] + + [g.edge(sigpipes[282], summers[3],0,12)] + + [g.edge(sigpipes[283], summers[3],0,13)] + + [g.edge(sigpipes[284], summers[3],0,14)] + + [g.edge(sigpipes[285], summers[3],0,15)] + + [g.edge(sigpipes[286], summers[3],0,16)] + + [g.edge(sigpipes[287], summers[3],0,17)] + + [g.edge(sigpipes[288], summers[3],0,18)] + + [g.edge(sigpipes[289], summers[3],0,19)] + + [g.edge(sigpipes[290], summers[3],0,20)] + + [g.edge(sigpipes[291], summers[3],0,21)] + + [g.edge(sigpipes[292], summers[3],0,22)] + + [g.edge(sigpipes[293], summers[3],0,23)] + + [g.edge(sigpipes[294], summers[3],0,24)] + + [g.edge(sigpipes[295], summers[3],0,25)] + + [g.edge(sigpipes[296], summers[3],0,26)] + + [g.edge(sigpipes[297], summers[3],0,27)] + + [g.edge(sigpipes[298], summers[3],0,28)] + + [g.edge(sigpipes[299], summers[3],0,29)] + + [g.edge(sigpipes[300], summers[3],0,30)] + + [g.edge(sigpipes[301], summers[3],0,31)] + + [g.edge(sigpipes[302], summers[3],0,32)] + + [g.edge(sigpipes[303], summers[3],0,33)] + + [g.edge(sigpipes[304], summers[3],0,34)] + + [g.edge(sigpipes[305], summers[3],0,35)] + + [g.edge(sigpipes[306], summers[3],0,36)] + + [g.edge(sigpipes[307], summers[3],0,37)] + + [g.edge(sigpipes[308], summers[3],0,38)] + + [g.edge(sigpipes[309], summers[3],0,39)] + + [g.edge(sigpipes[310], summers[3],0,40)] + + [g.edge(sigpipes[311], summers[3],0,41)] + + [g.edge(sigpipes[312], summers[3],0,42)] + + [g.edge(sigpipes[313], summers[3],0,43)] + + [g.edge(sigpipes[314], summers[3],0,44)] + + [g.edge(sigpipes[315], summers[3],0,45)] + + [g.edge(sigpipes[316], summers[3],0,46)] + + [g.edge(sigpipes[317], summers[3],0,47)] + + [g.edge(sigpipes[318], summers[3],0,48)] + + [g.edge(sigpipes[319], summers[3],0,49)] + + [g.edge(sigpipes[320], summers[3],0,50)] + + [g.edge(sigpipes[321], summers[3],0,51)] + + [g.edge(sigpipes[322], summers[3],0,52)] + + [g.edge(sigpipes[323], summers[3],0,53)] + + [g.edge(sigpipes[324], summers[3],0,54)] + + [g.edge(sigpipes[325], summers[3],0,55)] + + [g.edge(sigpipes[326], summers[3],0,56)] + + [g.edge(sigpipes[327], summers[3],0,57)] + + [g.edge(sigpipes[328], summers[3],0,58)] + + [g.edge(sigpipes[329], summers[3],0,59)] + + [g.edge(sigpipes[330], summers[3],0,60)] + + [g.edge(sigpipes[331], summers[3],0,61)] + + [g.edge(sigpipes[332], summers[3],0,62)] + + [g.edge(sigpipes[333], summers[3],0,63)] + + [g.edge(sigpipes[334], summers[3],0,64)] + + [g.edge(sigpipes[335], summers[3],0,65)] + + [g.edge(sigpipes[336], summers[3],0,66)] + + [g.edge(sigpipes[337], summers[3],0,67)] + + [g.edge(sigpipes[338], summers[3],0,68)] + + [g.edge(sigpipes[339], summers[3],0,69)] + + [g.edge(sigpipes[340], summers[3],0,70)] + + [g.edge(sigpipes[341], summers[3],0,71)] + + [g.edge(sigpipes[342], summers[3],0,72)] + + [g.edge(sigpipes[343], summers[3],0,73)] + + [g.edge(sigpipes[344], summers[3],0,74)] + + [g.edge(sigpipes[345], summers[3],0,75)] + + [g.edge(sigpipes[346], summers[3],0,76)] + + [g.edge(sigpipes[347], summers[3],0,77)] + + [g.edge(sigpipes[348], summers[3],0,78)] + + [g.edge(sigpipes[349], summers[3],0,79)] + + [g.edge(sigpipes[350], summers[3],0,80)] + + [g.edge(sigpipes[351], summers[3],0,81)] + + [g.edge(sigpipes[352], summers[3],0,82)] + + [g.edge(sigpipes[353], summers[3],0,83)] + + [g.edge(sigpipes[354], summers[3],0,84)] + + [g.edge(sigpipes[355], summers[3],0,85)] + + [g.edge(sigpipes[356], summers[3],0,86)] + + [g.edge(sigpipes[357], summers[3],0,87)] + + [g.edge(sigpipes[358], summers[3],0,88)] + + [g.edge(sigpipes[359], summers[3],0,89)] + // connecting summer and the operator pipelines + + [g.edge(summers[n], actpipes[n]) for n in std.range(0,faninmult-1)], + name=name), + + + ret: g.intern(innodes=[fanout], + outnodes=[fanin], + centernodes=[drift], + edges= + [g.edge(fanout, driftpipes[n], n, 0) for n in std.range(0, fanoutmult-1)] + + [g.edge(drift, fanin, n, n) for n in std.range(0, faninmult-1)], + name=name), + }.ret, + + + + + // Build a fanout-[pipelines]-fanin graph. pipelines is a list of // pnode objects, one for each spine of the fan. fanpipe:: function(fout, pipelines, fin, name='fanpipe', outtags=[], fout_tag_rules=[], fin_tag_rules=[]) { @@ -116,4 +1303,156 @@ local g = import 'pgraph.jsonnet'; [g.edge(pipelines[n], fanin, 0, n) for n in std.range(0, fanmult - 1)], name=name), }.ret, + + multifanpipe :: function( fout, pipelines, fin, + fout_nnodes=[1,8,16], fout_multi=[8,2,7], + fin_nnodes=[1,8,16], fin_multi=[8,2,7], + name='multifanpipe', outtags=[], tag_rules=null ) { + local fout_nlayers = std.length(fout_multi), + assert fout_nlayers >= 2 : "fout_nlayers should be >= 2", + local fin_nlayers = std.length(fin_multi), + assert fin_nlayers >= 2 : "fin_nlayers should be >= 2", + local npipe = std.length(pipelines), + assert npipe == fout_nnodes[fout_nlayers-1]*fout_multi[fout_nlayers-1] : + "fout layout error npipe=%d, "%npipe + "fout=%d"%(fout_nnodes[fout_nlayers-1]*fout_multi[fout_nlayers-1]), + assert npipe == fin_nnodes[fin_nlayers-1]*fin_multi[fin_nlayers-1] : + "fin layout error npipe=%d, "%npipe + "fin=%d"%(fin_nnodes[fin_nlayers-1]*fin_multi[fin_nlayers-1]), + + // function to create nodes for one layer + local fout_layer(ilayer,nnodes,nmulti) = { + ret : [ + g.pnode({ + type: fout, + name: name+"_fout_%d"%ilayer + "_%d"%inode, + data: { + multiplicity: nmulti, + tag_rules: [], + }}, nin=1, nout=nmulti + ) for inode in std.range(0,nnodes-1)], + }.ret, + // nodes for all layers + local fout_layers = [ + fout_layer(ilayer, + fout_nnodes[ilayer], + fout_multi[ilayer]) + for ilayer in std.range(0,fout_nlayers-1) + ], + // make edges to make a combo node + local fout_node = g.intern( + innodes = fout_layers[0], + centernodes = if fout_nlayers == 2 then [] else std.flattenArrays([fout_layers[i] for i in std.range(1,fout_nlayers-2)]), + outnodes = fout_layers[fout_nlayers-1], + edges = std.flattenArrays( + [ + [ + g.edge( + fout_layers[ilayer-1][std.floor(inode/fout_multi[ilayer-1])], + fout_layers[ilayer][inode], + inode%fout_multi[ilayer-1], + 0) + for inode in std.range(0,fout_nnodes[ilayer]-1)] + for ilayer in std.range(1,fout_nlayers-1)]) + ), + + // similarly build the multi-layer fan in combo node + // note the backward layer counting + local fin_layer(ilayer,nnodes,nmulti) = { + ret : [ + g.pnode({ + type: fin, + name: name+"_fin_%d"%ilayer + "_%d"%inode, + data: { + multiplicity: nmulti, + tags: outtags, + tag_rules: [tag_rules for irule in std.range(0,nmulti-1)], + }}, nin=nmulti, nout=1 + ) for inode in std.range(0,nnodes-1)], + }.ret, + local fin_layers = [ + fin_layer(ilayer, + fin_nnodes[ilayer], + fin_multi[ilayer]) + for ilayer in std.range(0,fin_nlayers-1) + ], + local fin_node = g.intern( + innodes = fin_layers[fin_nlayers-1], + centernodes = if fin_nlayers == 2 then [] else std.flattenArrays([fin_layers[i] for i in std.range(1,fout_nlayers-2)]), + outnodes = fin_layers[0], + edges = std.flattenArrays( + [ + [ + g.edge( + fin_layers[ilayer][inode], + fin_layers[ilayer-1][std.floor(inode/fin_multi[ilayer-1])], + 0, + inode%fin_multi[ilayer-1]) + for inode in std.range(0,fin_nnodes[ilayer]-1)] + for ilayer in std.range(1,fin_nlayers-1)]) + ), + + // connect comb_fan_out-piples-combo_fan_in + ret : g.intern( + innodes = [fout_node], + centernodes = pipelines, + outnodes = [fin_node], + edges = [g.edge(fout_node,pipelines[n],n,0) for n in std.range(0,npipe-1)] + + [g.edge(pipelines[n],fin_node,0,n) for n in std.range(0,npipe-1)], + ), + }.ret, + + // similar as multifanpipe but jusnt fan-out then pipelines with ending sinks + multifanout :: function( fout, pipelines, + fout_nnodes=[1,8,16], fout_multi=[8,2,7], + name='multifanout', tag_rules=[] ) { + local fout_nlayers = std.length(fout_multi), + assert fout_nlayers >= 2 : "fout_nlayers should be >= 2", + local npipe = std.length(pipelines), + assert npipe == fout_nnodes[fout_nlayers-1]*fout_multi[fout_nlayers-1] : + "fout layout error npipe=%d, "%npipe + "fout=%d"%(fout_nnodes[fout_nlayers-1]*fout_multi[fout_nlayers-1]), + + // function to create nodes for one layer + local fout_layer(ilayer,nnodes,nmulti) = { + ret : [ + g.pnode({ + type: fout, + name: name+"_fout_%d"%ilayer + "_%d"%inode, + data: { + multiplicity: nmulti, + tag_rules: [], + }}, nin=1, nout=nmulti + ) for inode in std.range(0,nnodes-1)], + }.ret, + // nodes for all layers + local fout_layers = [ + fout_layer(ilayer, + fout_nnodes[ilayer], + fout_multi[ilayer]) + for ilayer in std.range(0,fout_nlayers-1) + ], + // make edges to make a combo node + local fout_node = g.intern( + innodes = fout_layers[0], + centernodes = if fout_nlayers == 2 then [] else std.flattenArrays([fout_layers[i] for i in std.range(1,fout_nlayers-2)]), + outnodes = fout_layers[fout_nlayers-1], + edges = std.flattenArrays( + [ + [ + g.edge( + fout_layers[ilayer-1][std.floor(inode/fout_multi[ilayer-1])], + fout_layers[ilayer][inode], + inode%fout_multi[ilayer-1], + 0) + for inode in std.range(0,fout_nnodes[ilayer]-1)] + for ilayer in std.range(1,fout_nlayers-1)]) + ), + + // connect comb_fan_out-piples + ret : g.intern( + innodes = [fout_node], + centernodes = pipelines, + outnodes = [], + edges = [g.edge(fout_node,pipelines[n],n,0) for n in std.range(0,npipe-1)] + ), + }.ret, + } diff --git a/icaruscode/TPC/ICARUSWireCell/icarus/params.jsonnet b/icaruscode/TPC/ICARUSWireCell/icarus/params.jsonnet index 36ac67410..b66182a61 100644 --- a/icaruscode/TPC/ICARUSWireCell/icarus/params.jsonnet +++ b/icaruscode/TPC/ICARUSWireCell/icarus/params.jsonnet @@ -128,7 +128,23 @@ base { files: { wires: "icarus-wires-dualanode-v5.json.bz2", - fields: ["icarus_fnal_fit_ks_P0nom.json.bz2"], + //fields: ["garfield-icarus-fnal-rev2.json.bz2"], + + fields:["icarus_final_fit_dqdx0.json.bz2", + "icarus_final_fit_dqdx1.json.bz2", + "icarus_final_fit_dqdx2.json.bz2", + "icarus_final_fit_dqdx3.json.bz2", + "icarus_final_fit_dqdx4.json.bz2", + "icarus_final_fit_dqdx5.json.bz2", + "icarus_final_fit_dqdx6.json.bz2", + "icarus_final_fit_dqdx7.json.bz2", + "icarus_final_fit_dqdx8.json.bz2", + "icarus_final_fit_dqdx9.json.bz2", + "icarus_final_fit_dqdx10.json.bz2", + "icarus_final_fit_dqdx11.json.bz2", + "icarus_final_fit_dqdx12.json.bz2", + "icarus_final_fit_dqdx13.json.bz2", + "icarus_final_fit_dqdx14.json.bz2"], // noise: ["icarus_noise_model_int_TPCEE.json.bz2","icarus_noise_model_int_TPCEW.json.bz2","icarus_noise_model_int_TPCWE.json.bz2","icarus_noise_model_int_TPCWW.json.bz2"], // coherent_noise: ["icarus_noise_model_coh_TPCEE.json.bz2","icarus_noise_model_coh_TPCEW.json.bz2","icarus_noise_model_coh_TPCWE.json.bz2","icarus_noise_model_coh_TPCWW.json.bz2"], diff --git a/icaruscode/TPC/ICARUSWireCell/icarus/sim.jsonnet b/icaruscode/TPC/ICARUSWireCell/icarus/sim.jsonnet index bd578ea57..2928c97f7 100644 --- a/icaruscode/TPC/ICARUSWireCell/icarus/sim.jsonnet +++ b/icaruscode/TPC/ICARUSWireCell/icarus/sim.jsonnet @@ -18,7 +18,16 @@ function(params, tools) { for n in std.range(0, nanodes-1)], local transforms = [sim.make_depotransform("depotransform-"+tools.anodes[n].name, tools.anodes[n], tools.pirs[0]) for n in std.range(0, nanodes-1)], + + + local transformsyz = [sim.make_depotransform_withplane("depotransform-%d-"%n+tools.anodes[std.floor(n/45)].name+"-plane%d"%std.mod(std.floor(n/15),3),tools.anodes[std.floor(n/45)], [std.mod(std.floor(n/15),3)],tools.pirs[std.mod(n,15)]) + for n in std.range(0, 359)], +// local transformsyz = [sim.make_depotransform_withplane("depotransform-%d-"%n+tools.anodes[std.floor(n/45)].name+"-plane%d"%std.mod(std.floor(n/15),3),tools.anodes[std.floor(n/45)], [std.mod(std.floor(n/15),3)],tools.pirs[0]) + + + local depos2traces = transforms, + local depos2tracesyz = transformsyz, //local depos2traces = zippers, local digitizers = [ @@ -39,6 +48,20 @@ function(params, tools) { }, }, nin=1, nout=1) for n in std.range(0, nanodes-1)], + local reframersyz = [ + g.pnode({ + type: 'Reframer', + name: 'reframer-%d-'%n+tools.anodes[std.floor(n/45)].name, + data: { + anode: wc.tn(tools.anodes[std.floor(n/45)]), + tags: [], // ?? what do? + fill: 0.0, + tbin: params.sim.reframer.tbin, + toffset: 0, + nticks: params.sim.reframer.nticks, + }, + }, nin=1, nout=1) for n in std.range(0, 359)], + // fixme: see https://github.com/WireCell/wire-cell-gen/issues/29 local make_noise_model = function(anode, csdb=null) { @@ -77,10 +100,8 @@ function(params, tools) { analog_pipelines: [g.pipeline([depos2traces[n], reframers[n]], name="simanalogpipe-" + tools.anodes[n].name) for n in std.range(0, nanodes-1)], - signal_pipelines: [g.pipeline([depos2traces[n], reframers[n], digitizers[n]], name="simsigpipe-" + tools.anodes[n].name) for n in std.range(0, nanodes-1)], - splusn_pipelines: [g.pipeline([depos2traces[n], reframers[n], noises[n], digitizers[n]], name="simsignoipipe-" + tools.anodes[n].name) for n in std.range(0, nanodes-1)], @@ -88,5 +109,16 @@ function(params, tools) { signal: f.fanpipe('DepoSetFanout', self.signal_pipelines, 'FrameFanin', "simsignalgraph", outtags), splusn: f.fanpipe('DepoSetFanout', self.splusn_pipelines, 'FrameFanin', "simsplusngraph", outtags), + analog_pipelinesyz: [g.pipeline([depos2tracesyz[n]], + name="simanalogpipe-%d-"%n + tools.anodes[std.floor(n/45)].name) for n in std.range(0, 359)], + signal_pipelinesyz: [g.pipeline([depos2tracesyz[n], reframersyz[n], digitizers[n]], + name="simsigpipe-" + tools.anodes[n].name) for n in std.range(0, nanodes-1)], + splusn_pipelinesyz: [g.pipeline([depos2tracesyz[n], reframersyz[n], noises[n], digitizers[n]], + name="simsignoipipe-" + tools.anodes[n].name) for n in std.range(0, nanodes-1)], + + analogyz: f.fanpipe('DepoSetFanout', self.analog_pipelinesyz, 'FrameFanin', "simanaloggraph", outtags), + signalyz: f.fanpipe('DepoSetFanout', self.signal_pipelinesyz, 'FrameFanin', "simsignalgraph", outtags), + splusnyz: f.fanpipe('DepoSetFanout', self.splusn_pipelinesyz, 'FrameFanin', "simsplusngraph", outtags), + } + sim, // tack on base for user sugar. }.ret diff --git a/icaruscode/TPC/ICARUSWireCell/icarus/wcls-multitpc-sim-drift-simchannel-shifted-refactored.jsonnet b/icaruscode/TPC/ICARUSWireCell/icarus/wcls-multitpc-sim-drift-simchannel-shifted-refactored.jsonnet index a911b6b71..47465a185 100644 --- a/icaruscode/TPC/ICARUSWireCell/icarus/wcls-multitpc-sim-drift-simchannel-shifted-refactored.jsonnet +++ b/icaruscode/TPC/ICARUSWireCell/icarus/wcls-multitpc-sim-drift-simchannel-shifted-refactored.jsonnet @@ -324,7 +324,7 @@ local frame_summers = [ name: 'framesummer%d' %n, data: { align: true, - offset: 0.0*wc.s, + offset: 0.0*wc.s }, }, nin=2, nout=1) for n in std.range(0, 3)]; 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 new file mode 100644 index 000000000..7cb47a35a --- /dev/null +++ b/icaruscode/TPC/ICARUSWireCell/icarus/wcls-multitpc-sim-drift-simchannel-yzsim-refactored.jsonnet @@ -0,0 +1,495 @@ +// Same configuration as in wcls-sim-drift-simchannel.jsonnet +// except that this produces four instances of std::vector +// one per physics module (WW, WE, EE, EW) in ICARUS + +local g = import 'pgraph.jsonnet'; +local f = import 'pgrapher/common/funcs.jsonnet'; +local wc = import 'wirecell.jsonnet'; + +local io = import 'pgrapher/common/fileio.jsonnet'; +local tools_maker = import 'pgrapher/experiment/icarus/icarus_tools.jsonnet'; +local base = import 'pgrapher/experiment/icarus/simparams.jsonnet'; + +// load the electronics response parameters +local er_params = [ + { + gain: std.extVar('gain0')*wc.mV/wc.fC, + shaping: std.extVar('shaping0')*wc.us, + }, + + { + gain: std.extVar('gain1')*wc.mV/wc.fC, + shaping: std.extVar('shaping1')*wc.us, + }, + + { + gain: std.extVar('gain2')*wc.mV/wc.fC, + shaping: std.extVar('shaping2')*wc.us, + }, +]; + +local params = base { + lar: super.lar { + // Longitudinal diffusion constant + DL: std.extVar('DL') * wc.cm2 / wc.ns, + // Transverse diffusion constant + DT: std.extVar('DT') * wc.cm2 / wc.ns, + // Electron lifetime + lifetime: std.extVar('lifetime') * wc.us, + // Electron drift speed, assumes a certain applied E-field + // drift_speed: std.extVar('driftSpeed') * wc.mm / wc.us, + }, + + files: super.files { + // 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"] + }, + + rc_resp: if std.extVar('file_rcresp') != "" then + { + // "icarus_fnal_rc_tail.json" + filename: std.extVar('file_rcresp'), + postgain: 1.0, + start: 0.0, + tick: 0.4*wc.us, + nticks: 4255, + type: "JsonElecResponse", + rc_layers: 1 + } + else super.rc_resp, + + elec: std.mapWithIndex(function (n, eparam) + super.elec[n] + { + gain: eparam.gain, + shaping: eparam.shaping, + }, er_params), +}; + +local tools = tools_maker(params); + +local sim_maker = import 'pgrapher/experiment/icarus/sim.jsonnet'; +local sim = sim_maker(params, tools); + +local nanodes = std.length(tools.anodes); +local anode_iota = std.range(0, nanodes - 1); + + +local output = 'wct-sim-ideal-sig.npz'; + + +//local depos = g.join_sources(g.pnode({type:"DepoMerger", name:"BlipTrackJoiner"}, nin=2, nout=1), +// [sim.ar39(), sim.tracks(tracklist)]); +// local depos = sim.tracks(tracklist, step=1.0 * wc.mm); + +local wcls_maker = import 'pgrapher/ui/wcls/nodes.jsonnet'; +local wcls = wcls_maker(params, tools); +//local wcls_input = { +// // depos: wcls.input.depos(name="", art_tag="ionization"), +// depos: wcls.input.depos(name='electron', art_tag='ionization'), // default art_tag="blopper" +//}; + +//Haiwang DepoSetSource Implementation: +local wcls_input = { + depos: wcls.input.depos(name="", art_tag="IonAndScint"), + deposet: g.pnode({ + type: 'wclsSimDepoSetSource', + name: "electron", + data: { + model: "", + scale: -1, //scale is -1 to correct a sign error in the SimDepoSource converter. + art_tag: "ionization", //name of upstream art producer of depos "label:instance:processName" + assn_art_tag: "", + id_is_track: false, // Use this for "id-is-index" in the output + }, + }, nin=0, nout=1), +}; + +// Collect all the wc/ls output converters for use below. Note the +// "name" MUST match what is used in theh "outputers" parameter in the +// FHiCL that loads this file. +local mega_anode = { + type: 'MegaAnodePlane', + name: 'meganodes', + data: { + anodes_tn: [wc.tn(anode) for anode in tools.anodes], + }, +}; + +// A ``duo'' anode consists of two ``splits'' +local duoanodes = [ +{ + type: 'MegaAnodePlane', + name: 'duoanode%d' %n, + data: { + // anodes_tn: ["AnodePlane:anode110", "AnodePlane:anode120"], + anodes_tn: [wc.tn(a) for a in tools.anodes[2*n:2*(n+1)]], + // anodes_tn: [wc.tn(tools.anodes[2*n]), wc.tn(tools.anodes[2*n+1])], + }, +} +for n in std.range(0,3)]; +local volname = ["EE", "EW", "WE", "WW"]; +local wcls_output = { + // ADC output from simulation + // sim_digits: wcls.output.digits(name="simdigits", tags=["orig"]), + sim_digits: [ + g.pnode({ + type: 'wclsFrameSaver', + name: 'simdigits%d' %n, + data: { + // anode: wc.tn(tools.anode), + anode: wc.tn(duoanodes[n]), + digitize: true, // true means save as RawDigit, else recob::Wire + //frame_tags: ['daq%d' %n], + frame_tags: ['TPC%s' %volname[n]], + // Three options for nticks: + // - If nonzero, force number of ticks in output waveforms. + // - If zero, use whatever input data has. (default) + // - If -1, use value as per LS's detector properties service. + // nticks: params.daq.nticks, + // nticks: -1, + // chanmaskmaps: ['bad'], + }, + }, nin=1, nout=1, uses=[duoanodes[n]]) + for n in std.range(0,3)], + + // The noise filtered "ADC" values. These are truncated for + // art::Event but left as floats for the WCT SP. Note, the tag + // "raw" is somewhat historical as the output is not equivalent to + // "raw data". + nf_digits: wcls.output.digits(name='nfdigits', tags=['raw']), + + // The output of signal processing. Note, there are two signal + // sets each created with its own filter. The "gauss" one is best + // for charge reconstruction, the "wiener" is best for S/N + // separation. Both are used in downstream WC code. + sp_signals: wcls.output.signals(name='spsignals', tags=['gauss', 'wiener']), + + // save "threshold" from normal decon for each channel noise + // used in imaging + sp_thresholds: wcls.output.thresholds(name='spthresholds', tags=['threshold']), +}; + +//local deposio = io.numpy.depos(output); +local drifter = sim.drifter; +local setdrifter = g.pnode({ + type: 'DepoSetDrifter', + data: { + drifter: "Drifter" + } + }, nin=1, nout=1, + uses=[drifter]); + +local localeLiftime = [std.extVar('lifetime') * wc.us,std.extVar('lifetime') * wc.us,std.extVar('lifetime') * wc.us,std.extVar('lifetime') * wc.us,std.extVar('lifetime') * wc.us,std.extVar('lifetime') * wc.us,std.extVar('lifetime') * wc.us,std.extVar('lifetime') * wc.us]; + +local drifters = [{ + local xregions = wc.unique_list(std.flattenArrays([v.faces for v in params.det.volumes])), + + type: "Drifter", + name: "drifter%d" %n, //%std.floor(n/45), + data: params.lar { + rng: wc.tn(tools.random), + xregions: xregions, + time_offset: params.sim.depo_toffset, + drift_speed: params.lar.drift_speed, + fluctuate: params.sim.fluctuate, + + DL: params.lar.DL, + DT: params.lar.DT, + lifetime: localeLiftime[std.floor(n/45)], + charge_scale: 1 //std.mod(n,15)+1 //needs to be 1 + }, + } + for n in std.range(0,359)]; + +local setdrifters = [g.pnode({ + type: 'DepoSetDrifter', + name: 'setdrifters%d' %n, + data: { + drifter: wc.tn(drifters[n]) + #drifter: "Drifter" + } + }, nin=1, nout=1, + uses=[drifters[n]]) + #uses=[drifter]) + for n in std.range(0,359)]; + +local scalers = [{ + + type: "Scaler", + name: "scaler%d" %n, //%std.floor(n/45), + data: params.lar { + yzmap_scale_filename: 'yzmap_gain_icarus_v2_run2.json', + bin_width: 10*wc.cm, + tpc_width: 1500*wc.mm, + bin_height: 10*wc.cm, + anode: wc.tn(tools.anodes[std.floor(n/45)]), + plane: std.mod(std.floor(n/15),3) + }, + } + for n in std.range(0,359)]; + +local setscaler = [g.pnode({ + type: 'DepoSetScaler', + name: 'setscaler%d' %n, + data: { + scaler: wc.tn(scalers[n]) + } + }, nin=1, nout=1, + uses=[scalers[n]]) + for n in std.range(0,359)]; + + +local bagger = sim.make_bagger(); + + +// signal plus noise pipelines +//local sn_pipes = sim.signal_pipelines; +// local sn_pipes = sim.splusn_pipelines; +local analog_pipes = sim.analog_pipelinesyz; + +local perfect = import 'pgrapher/experiment/icarus/chndb-base.jsonnet'; +local chndb = [{ + type: 'OmniChannelNoiseDB', + name: 'ocndbperfect%d' % n, + data: perfect(params, tools.anodes[n], tools.field, n){dft:wc.tn(tools.dft)}, + uses: [tools.anodes[n], tools.field, tools.dft], +} for n in anode_iota]; + + +// local nf_maker = import 'pgrapher/experiment/icarus/nf.jsonnet'; +// local nf_pipes = [nf_maker(params, tools.anodes[n], chndb_pipes[n]) for n in std.range(0, std.length(tools.anodes)-1)]; +// local nf_pipes = [nf_maker(params, tools.anodes[n], chndb[n], n, name='nf%d' % n) for n in anode_iota]; + +local sp_maker = import 'pgrapher/experiment/icarus/sp.jsonnet'; +local sp = sp_maker(params, tools); +local sp_pipes = [sp.make_sigproc(a) for a in tools.anodes]; + +local rng = tools.random; +local wcls_simchannel_sink_old = + g.pnode({ + type: 'wclsDepoSetSimChannelSink', + name: 'postdriftold', + data: { + artlabel: 'simpleSCOld', // where to save in art::Event + anodes_tn: [wc.tn(anode) for anode in tools.anodes], + rng: wc.tn(rng), + tick: params.daq.tick, + start_time: -0.34 * wc.ms, // TriggerOffsetTPC from detectorclocks_icarus.fcl + readout_time: params.daq.readout_time, + nsigma: 3.0, + drift_speed: params.lar.drift_speed, + u_to_rp: 100 * wc.mm, + v_to_rp: 100 * wc.mm, + y_to_rp: 100 * wc.mm, + + // GP: The shaping time of the electronics response (1.3us) shifts the peak + // of the field response time. Eyeballing simulation times, it does this + // by a bit less than the 1.3us (1us). + // + // N.B. for future: there is likely an additional offset on the two induction + // planes due to where the deconvolution precisely defines where the "peak" + // of the pulse is. One may want to refine these parameters to account for that. + // This perturbation shouldn't be more than a tick or two. + u_time_offset: std.extVar('time_offset_u') * wc.us, + v_time_offset: std.extVar('time_offset_v') * wc.us, + y_time_offset: std.extVar('time_offset_y') * wc.us, + + g4_ref_time: -1500 * wc.us, // G4RefTime from detectorclocks_icarus.fcl + use_energy: true, + }, + },nin=1, nout=1, uses=tools.anodes); + +local wcls_simchannel_sink = + [ g.pnode({ + type: 'wclsDepoFluxWriter', + name: 'postdrift%d' %n, + data: { + anodes: [wc.tn(anode) for anode in tools.anodes], + field_response: wc.tn(tools.field), + + // time binning + tick: params.daq.tick, + window_start: -340 * wc.us, // TriggerOffsetTPC from detectorclocks_icarus.fcl + window_duration: params.daq.readout_time, + + nsigma: 3.0, + + reference_time: -1500 * wc.us - self.window_start, // G4RefTime from detectorclocks_icarus.fcl less window start as per Brett Viren + + smear_long: 0.0, + smear_tran: 0.0, + + time_offsets: [std.extVar('time_offset_u') * wc.us, std.extVar('time_offset_v') * wc.us, std.extVar('time_offset_y') * wc.us], + + process_planes: [std.mod(std.floor(n/15),3)], + + // input from art::Event + sed_label: 'ionization', + + // output to art::Event + simchan_label: 'simpleSC%d' %n, + }, + }, nin=1, nout=1, uses=tools.anodes+[tools.field]) + for n in std.range(0,359)]; + +local nicks = ["incoTPCEE","incoTPCEW","incoTPCWE","incoTPCWW", "coheTPCEE","coheTPCEW","coheTPCWE","coheTPCWW"]; +local scale_int = std.extVar('int_noise_scale'); +local scale_coh = std.extVar('coh_noise_scale'); +local models = [ + { + type: "GroupNoiseModel", + name: nicks[n], + data: { + // This can also be given as a JSON/Jsonnet file + spectra: params.files.noisegroups[n], + groups: params.files.wiregroups, + scale: if n<4 then scale_int else scale_coh, + nsamples: params.daq.nticks, + tick: params.daq.tick, + } + } for n in std.range(0,7)]; + +local add_noise = function(model, n,t) g.pnode({ + type: t, + name: "addnoise%d-" %n + model.name, + data: { + rng: wc.tn(tools.random), + dft: wc.tn(tools.dft), + model: wc.tn(model), + nsamples: params.daq.nticks, + }}, nin=1, nout=1, uses=[tools.random, tools.dft, model]); +local noises = [add_noise(models[n], n,"IncoherentAddNoise") for n in std.range(0,3)]; +local coh_noises = [add_noise(models[n],n,"CoherentAddNoise") for n in std.range(4,7)]; + +// local digitizer = sim.digitizer(mega_anode, name="digitizer", tag="orig"); +local digitizers = [ + sim.digitizer(mega_anode, name="digitizer%d-" %n + mega_anode.name, tag="TPC%s"%volname[n]) + for n in std.range(0,3)]; + +local reframer = [ + g.pnode({ + type: 'Reframer', + name: 'reframer-%d-'%n+mega_anode.name, + data: { + anode: wc.tn(mega_anode), + tags: "TPC%s"%volname[n], // ?? what do? + fill: 0.0, + tbin: params.sim.reframer.tbin, + toffset: 0, + nticks: params.sim.reframer.nticks, + }, + }, nin=1, nout=1) for n in std.range(0, 3)]; + +local retaggers = [ +g.pnode({ + type: 'Retagger', + name: 'retagger%d' %n, + data: { + // Note: retagger keeps tag_rules an array to be like frame fanin/fanout. + tag_rules: [{ + // Retagger also handles "frame" and "trace" like fanin/fanout + // merge separately all traces like origN to orig. + frame: { + '.*': 'orig', + }, + merge: { + 'orig\\d': 'daq%d' %n, + }, + }], + }, +}, nin=1, nout=1) +for n in std.range(0, 3)]; + +local frame_summers = [ + g.pnode({ + type: 'FrameSummerYZ', + name: 'framesummer%d' %n, + data: { + multiplicity: 90 + }, + }, nin=90, nout=1) for n in std.range(0, 3)]; + +local deposetfilteryz = [ g.pnode({ + type: 'DepoSetFilterYZ', + name: 'deposetfilteryz_resp%d-'%std.mod(r,15)+'plane%d-'%std.mod(std.floor(r/15),3)+tools.anodes[std.floor(r/45)].name, + data: { + yzmap_filename: 'yzmap_icarus_v2_run2.json', + bin_width: 10*wc.cm, + tpc_width: 1500*wc.mm, + bin_height: 10*wc.cm, + yoffset: 180*wc.cm, + zoffset: 900*wc.cm, + nbinsy: 31, + nbinsz: 180, + resp: std.mod(r,15), + anode: wc.tn(tools.anodes[std.floor(r/45)]), + plane: std.mod(std.floor(r/15),3) + } + }, nin=1, nout=1, + uses=tools.anodes) + for r in std.range(0,359)]; + +local util = import 'pgrapher/experiment/icarus/funcs.jsonnet'; +local outtags = ['orig%d' % n for n in std.range(0, 3)]; + +local actpipes = [g.pipeline([reframer[n], noises[n], coh_noises[n], digitizers[n], /*retaggers[n],*/ wcls_output.sim_digits[n]], name="noise-digitizer%d" %n) for n in std.range(0,3)]; +local driftpipes = [g.pipeline([deposetfilteryz[n], setdrifters[n], setscaler[n], wcls_simchannel_sink[n]], name="depo-set-drifter%d" %n) for n in std.range(0,359)]; +local pipe_drift = util.fandrifter('DepoSetFanout', driftpipes, analog_pipes, frame_summers, actpipes, 'FrameFanin', 'fandrifter', outtags); +local pipe_reducer = util.fansummeryz('DepoSetFanout', analog_pipes, frame_summers, actpipes, 'FrameFanin', 'fansummer', outtags); + +// local retagger = g.pnode({ +// type: 'Retagger', +// data: { +// // Note: retagger keeps tag_rules an array to be like frame fanin/fanout. +// tag_rules: [{ +// // Retagger also handles "frame" and "trace" like fanin/fanout +// // merge separately all traces like origN to orig. +// frame: { +// '.*': 'orig', +// }, +// merge: { +// 'orig\\d': 'daq', +// }, +// }], +// }, +// }, nin=1, nout=1); + +//local frameio = io.numpy.frames(output); +local sink = sim.frame_sink; + + + +// local graph = g.pipeline([wcls_input.depos, drifter, wcls_simchannel_sink.simchannels, bagger, pipe_reducer, retagger, wcls_output.sim_digits, sink]); +//local graph = g.pipeline([wcls_input.depos, drifter, wcls_simchannel_sink, bagger, pipe_reducer, sink]); +//local graph = g.pipeline([wcls_input.deposet, setdrifter, wcls_simchannel_sink_old, wcls_simchannel_sink, pipe_reducer, sink]); + +local graph = g.pipeline([wcls_input.deposet,pipe_drift, sink]); + +local app = { + type: 'Pgrapher', + data: { + edges: g.edges(graph), + }, +}; + + +// Finally, the configuration sequence which is emitted. + +g.uses(graph) + [app] diff --git a/icaruscode/TPC/ICARUSWireCell/icarus/wcls-multitpc-sim-drift-simchannel-yzsim-shifted-refactored.jsonnet b/icaruscode/TPC/ICARUSWireCell/icarus/wcls-multitpc-sim-drift-simchannel-yzsim-shifted-refactored.jsonnet new file mode 100644 index 000000000..5ba3344c2 --- /dev/null +++ b/icaruscode/TPC/ICARUSWireCell/icarus/wcls-multitpc-sim-drift-simchannel-yzsim-shifted-refactored.jsonnet @@ -0,0 +1,495 @@ +// Same configuration as in wcls-sim-drift-simchannel.jsonnet +// except that this produces four instances of std::vector +// one per physics module (WW, WE, EE, EW) in ICARUS + +local g = import 'pgraph.jsonnet'; +local f = import 'pgrapher/common/funcs.jsonnet'; +local wc = import 'wirecell.jsonnet'; + +local io = import 'pgrapher/common/fileio.jsonnet'; +local tools_maker = import 'pgrapher/experiment/icarus/icarus_tools.jsonnet'; +local base = import 'pgrapher/experiment/icarus/simparams.jsonnet'; + +// load the electronics response parameters +local er_params = [ + { + gain: std.extVar('gain0')*wc.mV/wc.fC, + shaping: std.extVar('shaping0')*wc.us, + }, + + { + gain: std.extVar('gain1')*wc.mV/wc.fC, + shaping: std.extVar('shaping1')*wc.us, + }, + + { + gain: std.extVar('gain2')*wc.mV/wc.fC, + shaping: std.extVar('shaping2')*wc.us, + }, +]; + +local params = base { + lar: super.lar { + // Longitudinal diffusion constant + DL: std.extVar('DL') * wc.cm2 / wc.ns, + // Transverse diffusion constant + DT: std.extVar('DT') * wc.cm2 / wc.ns, + // Electron lifetime + lifetime: std.extVar('lifetime') * wc.us, + // Electron drift speed, assumes a certain applied E-field + // drift_speed: std.extVar('driftSpeed') * wc.mm / wc.us, + }, + + files: super.files { + // 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"] + }, + + rc_resp: if std.extVar('file_rcresp') != "" then + { + // "icarus_fnal_rc_tail.json" + filename: std.extVar('file_rcresp'), + postgain: 1.0, + start: 0.0, + tick: 0.4*wc.us, + nticks: 4255, + type: "JsonElecResponse", + rc_layers: 1 + } + else super.rc_resp, + + elec: std.mapWithIndex(function (n, eparam) + super.elec[n] + { + gain: eparam.gain, + shaping: eparam.shaping, + }, er_params), +}; + +local tools = tools_maker(params); + +local sim_maker = import 'pgrapher/experiment/icarus/sim.jsonnet'; +local sim = sim_maker(params, tools); + +local nanodes = std.length(tools.anodes); +local anode_iota = std.range(0, nanodes - 1); + + +local output = 'wct-sim-ideal-sig.npz'; + + +//local depos = g.join_sources(g.pnode({type:"DepoMerger", name:"BlipTrackJoiner"}, nin=2, nout=1), +// [sim.ar39(), sim.tracks(tracklist)]); +// local depos = sim.tracks(tracklist, step=1.0 * wc.mm); + +local wcls_maker = import 'pgrapher/ui/wcls/nodes.jsonnet'; +local wcls = wcls_maker(params, tools); +//local wcls_input = { +// // depos: wcls.input.depos(name="", art_tag="ionization"), +// depos: wcls.input.depos(name='electron', art_tag='ionization'), // default art_tag="blopper" +//}; + +//Haiwang DepoSetSource Implementation: +local wcls_input = { + depos: wcls.input.depos(name="", art_tag="IonAndScint"), + deposet: g.pnode({ + type: 'wclsSimDepoSetSource', + name: "electron", + data: { + model: "", + scale: -1, //scale is -1 to correct a sign error in the SimDepoSource converter. + art_tag: "shifted", //name of upstream art producer of depos "label:instance:processName" + assn_art_tag: "", + id_is_track: false, // Use this for "id-is-index" in the output + }, + }, nin=0, nout=1), +}; + +// Collect all the wc/ls output converters for use below. Note the +// "name" MUST match what is used in theh "outputers" parameter in the +// FHiCL that loads this file. +local mega_anode = { + type: 'MegaAnodePlane', + name: 'meganodes', + data: { + anodes_tn: [wc.tn(anode) for anode in tools.anodes], + }, +}; + +// A ``duo'' anode consists of two ``splits'' +local duoanodes = [ +{ + type: 'MegaAnodePlane', + name: 'duoanode%d' %n, + data: { + // anodes_tn: ["AnodePlane:anode110", "AnodePlane:anode120"], + anodes_tn: [wc.tn(a) for a in tools.anodes[2*n:2*(n+1)]], + // anodes_tn: [wc.tn(tools.anodes[2*n]), wc.tn(tools.anodes[2*n+1])], + }, +} +for n in std.range(0,3)]; +local volname = ["EE", "EW", "WE", "WW"]; +local wcls_output = { + // ADC output from simulation + // sim_digits: wcls.output.digits(name="simdigits", tags=["orig"]), + sim_digits: [ + g.pnode({ + type: 'wclsFrameSaver', + name: 'simdigits%d' %n, + data: { + // anode: wc.tn(tools.anode), + anode: wc.tn(duoanodes[n]), + digitize: true, // true means save as RawDigit, else recob::Wire + //frame_tags: ['daq%d' %n], + frame_tags: ['TPC%s' %volname[n]], + // Three options for nticks: + // - If nonzero, force number of ticks in output waveforms. + // - If zero, use whatever input data has. (default) + // - If -1, use value as per LS's detector properties service. + // nticks: params.daq.nticks, + // nticks: -1, + // chanmaskmaps: ['bad'], + }, + }, nin=1, nout=1, uses=[duoanodes[n]]) + for n in std.range(0,3)], + + // The noise filtered "ADC" values. These are truncated for + // art::Event but left as floats for the WCT SP. Note, the tag + // "raw" is somewhat historical as the output is not equivalent to + // "raw data". + nf_digits: wcls.output.digits(name='nfdigits', tags=['raw']), + + // The output of signal processing. Note, there are two signal + // sets each created with its own filter. The "gauss" one is best + // for charge reconstruction, the "wiener" is best for S/N + // separation. Both are used in downstream WC code. + sp_signals: wcls.output.signals(name='spsignals', tags=['gauss', 'wiener']), + + // save "threshold" from normal decon for each channel noise + // used in imaging + sp_thresholds: wcls.output.thresholds(name='spthresholds', tags=['threshold']), +}; + +//local deposio = io.numpy.depos(output); +local drifter = sim.drifter; +local setdrifter = g.pnode({ + type: 'DepoSetDrifter', + data: { + drifter: "Drifter" + } + }, nin=1, nout=1, + uses=[drifter]); + +local localeLiftime = [std.extVar('lifetime') * wc.us,std.extVar('lifetime') * wc.us,std.extVar('lifetime') * wc.us,std.extVar('lifetime') * wc.us,std.extVar('lifetime') * wc.us,std.extVar('lifetime') * wc.us,std.extVar('lifetime') * wc.us,std.extVar('lifetime') * wc.us]; + +local drifters = [{ + local xregions = wc.unique_list(std.flattenArrays([v.faces for v in params.det.volumes])), + + type: "Drifter", + name: "drifter%d" %n, //%std.floor(n/45), + data: params.lar { + rng: wc.tn(tools.random), + xregions: xregions, + time_offset: params.sim.depo_toffset, + drift_speed: params.lar.drift_speed, + fluctuate: params.sim.fluctuate, + + DL: params.lar.DL, + DT: params.lar.DT, + lifetime: localeLiftime[std.floor(n/45)], + charge_scale: 1 //std.mod(n,15)+1 //needs to be 1 + }, + } + for n in std.range(0,359)]; + +local setdrifters = [g.pnode({ + type: 'DepoSetDrifter', + name: 'setdrifters%d' %n, + data: { + drifter: wc.tn(drifters[n]) + #drifter: "Drifter" + } + }, nin=1, nout=1, + uses=[drifters[n]]) + #uses=[drifter]) + for n in std.range(0,359)]; + +local scalers = [{ + + type: "Scaler", + name: "scaler%d" %n, //%std.floor(n/45), + data: params.lar { + yzmap_scale_filename: 'yzmap_gain_icarus_v2_run2.json', + bin_width: 10*wc.cm, + tpc_width: 1500*wc.mm, + bin_height: 10*wc.cm, + anode: wc.tn(tools.anodes[std.floor(n/45)]), + plane: std.mod(std.floor(n/15),3) + }, + } + for n in std.range(0,359)]; + +local setscaler = [g.pnode({ + type: 'DepoSetScaler', + name: 'setscaler%d' %n, + data: { + scaler: wc.tn(scalers[n]) + } + }, nin=1, nout=1, + uses=[scalers[n]]) + for n in std.range(0,359)]; + + +local bagger = sim.make_bagger(); + + +// signal plus noise pipelines +//local sn_pipes = sim.signal_pipelines; +// local sn_pipes = sim.splusn_pipelines; +local analog_pipes = sim.analog_pipelinesyz; + +local perfect = import 'pgrapher/experiment/icarus/chndb-base.jsonnet'; +local chndb = [{ + type: 'OmniChannelNoiseDB', + name: 'ocndbperfect%d' % n, + data: perfect(params, tools.anodes[n], tools.field, n){dft:wc.tn(tools.dft)}, + uses: [tools.anodes[n], tools.field, tools.dft], +} for n in anode_iota]; + + +// local nf_maker = import 'pgrapher/experiment/icarus/nf.jsonnet'; +// local nf_pipes = [nf_maker(params, tools.anodes[n], chndb_pipes[n]) for n in std.range(0, std.length(tools.anodes)-1)]; +// local nf_pipes = [nf_maker(params, tools.anodes[n], chndb[n], n, name='nf%d' % n) for n in anode_iota]; + +local sp_maker = import 'pgrapher/experiment/icarus/sp.jsonnet'; +local sp = sp_maker(params, tools); +local sp_pipes = [sp.make_sigproc(a) for a in tools.anodes]; + +local rng = tools.random; +local wcls_simchannel_sink_old = + g.pnode({ + type: 'wclsDepoSetSimChannelSink', + name: 'postdriftold', + data: { + artlabel: 'simpleSCOld', // where to save in art::Event + anodes_tn: [wc.tn(anode) for anode in tools.anodes], + rng: wc.tn(rng), + tick: params.daq.tick, + start_time: -0.34 * wc.ms, // TriggerOffsetTPC from detectorclocks_icarus.fcl + readout_time: params.daq.readout_time, + nsigma: 3.0, + drift_speed: params.lar.drift_speed, + u_to_rp: 100 * wc.mm, + v_to_rp: 100 * wc.mm, + y_to_rp: 100 * wc.mm, + + // GP: The shaping time of the electronics response (1.3us) shifts the peak + // of the field response time. Eyeballing simulation times, it does this + // by a bit less than the 1.3us (1us). + // + // N.B. for future: there is likely an additional offset on the two induction + // planes due to where the deconvolution precisely defines where the "peak" + // of the pulse is. One may want to refine these parameters to account for that. + // This perturbation shouldn't be more than a tick or two. + u_time_offset: std.extVar('time_offset_u') * wc.us, + v_time_offset: std.extVar('time_offset_v') * wc.us, + y_time_offset: std.extVar('time_offset_y') * wc.us, + + g4_ref_time: -1500 * wc.us, // G4RefTime from detectorclocks_icarus.fcl + use_energy: true, + }, + },nin=1, nout=1, uses=tools.anodes); + +local wcls_simchannel_sink = + [ g.pnode({ + type: 'wclsDepoFluxWriter', + name: 'postdrift%d' %n, + data: { + anodes: [wc.tn(anode) for anode in tools.anodes], + field_response: wc.tn(tools.field), + + // time binning + tick: params.daq.tick, + window_start: -340 * wc.us, // TriggerOffsetTPC from detectorclocks_icarus.fcl + window_duration: params.daq.readout_time, + + nsigma: 3.0, + + reference_time: -1500 * wc.us - self.window_start, // G4RefTime from detectorclocks_icarus.fcl less window start as per Brett Viren + + smear_long: 0.0, + smear_tran: 0.0, + + time_offsets: [std.extVar('time_offset_u') * wc.us, std.extVar('time_offset_v') * wc.us, std.extVar('time_offset_y') * wc.us], + + process_planes: [std.mod(std.floor(n/15),3)], + + // input from art::Event + sed_label: 'shifted', + + // output to art::Event + simchan_label: 'simpleSC%d' %n, + }, + }, nin=1, nout=1, uses=tools.anodes+[tools.field]) + for n in std.range(0,359)]; + +local nicks = ["incoTPCEE","incoTPCEW","incoTPCWE","incoTPCWW", "coheTPCEE","coheTPCEW","coheTPCWE","coheTPCWW"]; +local scale_int = std.extVar('int_noise_scale'); +local scale_coh = std.extVar('coh_noise_scale'); +local models = [ + { + type: "GroupNoiseModel", + name: nicks[n], + data: { + // This can also be given as a JSON/Jsonnet file + spectra: params.files.noisegroups[n], + groups: params.files.wiregroups, + scale: if n<4 then scale_int else scale_coh, + nsamples: params.daq.nticks, + tick: params.daq.tick, + } + } for n in std.range(0,7)]; + +local add_noise = function(model, n,t) g.pnode({ + type: t, + name: "addnoise%d-" %n + model.name, + data: { + rng: wc.tn(tools.random), + dft: wc.tn(tools.dft), + model: wc.tn(model), + nsamples: params.daq.nticks, + }}, nin=1, nout=1, uses=[tools.random, tools.dft, model]); +local noises = [add_noise(models[n], n,"IncoherentAddNoise") for n in std.range(0,3)]; +local coh_noises = [add_noise(models[n],n,"CoherentAddNoise") for n in std.range(4,7)]; + +// local digitizer = sim.digitizer(mega_anode, name="digitizer", tag="orig"); +local digitizers = [ + sim.digitizer(mega_anode, name="digitizer%d-" %n + mega_anode.name, tag="TPC%s"%volname[n]) + for n in std.range(0,3)]; + +local reframer = [ + g.pnode({ + type: 'Reframer', + name: 'reframer-%d-'%n+mega_anode.name, + data: { + anode: wc.tn(mega_anode), + tags: "TPC%s"%volname[n], // ?? what do? + fill: 0.0, + tbin: params.sim.reframer.tbin, + toffset: 0, + nticks: params.sim.reframer.nticks, + }, + }, nin=1, nout=1) for n in std.range(0, 3)]; + +local retaggers = [ +g.pnode({ + type: 'Retagger', + name: 'retagger%d' %n, + data: { + // Note: retagger keeps tag_rules an array to be like frame fanin/fanout. + tag_rules: [{ + // Retagger also handles "frame" and "trace" like fanin/fanout + // merge separately all traces like origN to orig. + frame: { + '.*': 'orig', + }, + merge: { + 'orig\\d': 'daq%d' %n, + }, + }], + }, +}, nin=1, nout=1) +for n in std.range(0, 3)]; + +local frame_summers = [ + g.pnode({ + type: 'FrameSummerYZ', + name: 'framesummer%d' %n, + data: { + multiplicity: 90 + }, + }, nin=90, nout=1) for n in std.range(0, 3)]; + +local deposetfilteryz = [ g.pnode({ + type: 'DepoSetFilterYZ', + name: 'deposetfilteryz_resp%d-'%std.mod(r,15)+'plane%d-'%std.mod(std.floor(r/15),3)+tools.anodes[std.floor(r/45)].name, + data: { + yzmap_filename: 'yzmap_icarus_v2_run2.json', + bin_width: 10*wc.cm, + tpc_width: 1500*wc.mm, + bin_height: 10*wc.cm, + yoffset: 180*wc.cm, + zoffset: 900*wc.cm, + nbinsy: 31, + nbinsz: 180, + resp: std.mod(r,15), + anode: wc.tn(tools.anodes[std.floor(r/45)]), + plane: std.mod(std.floor(r/15),3) + } + }, nin=1, nout=1, + uses=tools.anodes) + for r in std.range(0,359)]; + +local util = import 'pgrapher/experiment/icarus/funcs.jsonnet'; +local outtags = ['orig%d' % n for n in std.range(0, 3)]; + +local actpipes = [g.pipeline([reframer[n], noises[n], coh_noises[n], digitizers[n], /*retaggers[n],*/ wcls_output.sim_digits[n]], name="noise-digitizer%d" %n) for n in std.range(0,3)]; +local driftpipes = [g.pipeline([deposetfilteryz[n], setdrifters[n], setscaler[n], wcls_simchannel_sink[n]], name="depo-set-drifter%d" %n) for n in std.range(0,359)]; +local pipe_drift = util.fandrifter('DepoSetFanout', driftpipes, analog_pipes, frame_summers, actpipes, 'FrameFanin', 'fandrifter', outtags); +local pipe_reducer = util.fansummeryz('DepoSetFanout', analog_pipes, frame_summers, actpipes, 'FrameFanin', 'fansummer', outtags); + +// local retagger = g.pnode({ +// type: 'Retagger', +// data: { +// // Note: retagger keeps tag_rules an array to be like frame fanin/fanout. +// tag_rules: [{ +// // Retagger also handles "frame" and "trace" like fanin/fanout +// // merge separately all traces like origN to orig. +// frame: { +// '.*': 'orig', +// }, +// merge: { +// 'orig\\d': 'daq', +// }, +// }], +// }, +// }, nin=1, nout=1); + +//local frameio = io.numpy.frames(output); +local sink = sim.frame_sink; + + + +// local graph = g.pipeline([wcls_input.depos, drifter, wcls_simchannel_sink.simchannels, bagger, pipe_reducer, retagger, wcls_output.sim_digits, sink]); +//local graph = g.pipeline([wcls_input.depos, drifter, wcls_simchannel_sink, bagger, pipe_reducer, sink]); +//local graph = g.pipeline([wcls_input.deposet, setdrifter, wcls_simchannel_sink_old, wcls_simchannel_sink, pipe_reducer, sink]); + +local graph = g.pipeline([wcls_input.deposet,pipe_drift, sink]); + +local app = { + type: 'Pgrapher', + data: { + edges: g.edges(graph), + }, +}; + + +// Finally, the configuration sequence which is emitted. + +g.uses(graph) + [app] diff --git a/icaruscode/TPC/ICARUSWireCell/icarus/wcls-multitpc-sim-drift-simchannel-yzsim.jsonnet b/icaruscode/TPC/ICARUSWireCell/icarus/wcls-multitpc-sim-drift-simchannel-yzsim.jsonnet new file mode 100644 index 000000000..9fed61fb4 --- /dev/null +++ b/icaruscode/TPC/ICARUSWireCell/icarus/wcls-multitpc-sim-drift-simchannel-yzsim.jsonnet @@ -0,0 +1,468 @@ +// Same configuration as in wcls-sim-drift-simchannel.jsonnet +// except that this produces four instances of std::vector +// one per physics module (WW, WE, EE, EW) in ICARUS + +local g = import 'pgraph.jsonnet'; +local f = import 'pgrapher/common/funcs.jsonnet'; +local wc = import 'wirecell.jsonnet'; + +local io = import 'pgrapher/common/fileio.jsonnet'; +local tools_maker = import 'pgrapher/experiment/icarus/icarus_tools.jsonnet'; +local base = import 'pgrapher/experiment/icarus/simparams.jsonnet'; + +// load the electronics response parameters +local er_params = [ + { + gain: std.extVar('gain0')*wc.mV/wc.fC, + shaping: std.extVar('shaping0')*wc.us, + }, + + { + gain: std.extVar('gain1')*wc.mV/wc.fC, + shaping: std.extVar('shaping1')*wc.us, + }, + + { + gain: std.extVar('gain2')*wc.mV/wc.fC, + shaping: std.extVar('shaping2')*wc.us, + }, +]; + +local params = base { + lar: super.lar { + // Longitudinal diffusion constant + DL: std.extVar('DL') * wc.cm2 / wc.ns, + // Transverse diffusion constant + DT: std.extVar('DT') * wc.cm2 / wc.ns, + // Electron lifetime + lifetime: std.extVar('lifetime') * wc.us, + // Electron drift speed, assumes a certain applied E-field + // drift_speed: std.extVar('driftSpeed') * wc.mm / wc.us, + }, + + files: super.files { + fields: std.extVar('files_fields'), + }, + + rc_resp: if std.extVar('file_rcresp') != "" then + { + // "icarus_fnal_rc_tail.json" + filename: std.extVar('file_rcresp'), + postgain: 1.0, + start: 0.0, + tick: 0.4*wc.us, + nticks: 4255, + type: "JsonElecResponse", + rc_layers: 1 + } + else super.rc_resp, + + elec: std.mapWithIndex(function (n, eparam) + super.elec[n] + { + gain: eparam.gain, + shaping: eparam.shaping, + }, er_params), +}; + +local tools = tools_maker(params); + +local sim_maker = import 'pgrapher/experiment/icarus/sim.jsonnet'; +local sim = sim_maker(params, tools); + +local nanodes = std.length(tools.anodes); +local anode_iota = std.range(0, nanodes - 1); + + +local output = 'wct-sim-ideal-sig.npz'; + + +//local depos = g.join_sources(g.pnode({type:"DepoMerger", name:"BlipTrackJoiner"}, nin=2, nout=1), +// [sim.ar39(), sim.tracks(tracklist)]); +// local depos = sim.tracks(tracklist, step=1.0 * wc.mm); + +local wcls_maker = import 'pgrapher/ui/wcls/nodes.jsonnet'; +local wcls = wcls_maker(params, tools); +//local wcls_input = { +// // depos: wcls.input.depos(name="", art_tag="ionization"), +// depos: wcls.input.depos(name='electron', art_tag='ionization'), // default art_tag="blopper" +//}; + +//Haiwang DepoSetSource Implementation: +local wcls_input = { + depos: wcls.input.depos(name="", art_tag="IonAndScint"), + deposet: g.pnode({ + type: 'wclsSimDepoSetSource', + name: "electron", + data: { + model: "", + scale: -1, //scale is -1 to correct a sign error in the SimDepoSource converter. + art_tag: "ionization", //name of upstream art producer of depos "label:instance:processName" + assn_art_tag: "", + id_is_track: false, // Use this for "id-is-index" in the output + }, + }, nin=0, nout=1), +}; + +// Collect all the wc/ls output converters for use below. Note the +// "name" MUST match what is used in theh "outputers" parameter in the +// FHiCL that loads this file. +local mega_anode = { + type: 'MegaAnodePlane', + name: 'meganodes', + data: { + anodes_tn: [wc.tn(anode) for anode in tools.anodes], + }, +}; + +// A ``duo'' anode consists of two ``splits'' +local duoanodes = [ +{ + type: 'MegaAnodePlane', + name: 'duoanode%d' %n, + data: { + // anodes_tn: ["AnodePlane:anode110", "AnodePlane:anode120"], + anodes_tn: [wc.tn(a) for a in tools.anodes[2*n:2*(n+1)]], + // anodes_tn: [wc.tn(tools.anodes[2*n]), wc.tn(tools.anodes[2*n+1])], + }, +} +for n in std.range(0,3)]; +local volname = ["EE", "EW", "WE", "WW"]; +local wcls_output = { + // ADC output from simulation + // sim_digits: wcls.output.digits(name="simdigits", tags=["orig"]), + sim_digits: [ + g.pnode({ + type: 'wclsFrameSaver', + name: 'simdigits%d' %n, + data: { + // anode: wc.tn(tools.anode), + anode: wc.tn(duoanodes[n]), + digitize: true, // true means save as RawDigit, else recob::Wire + //frame_tags: ['daq%d' %n], + frame_tags: ['TPC%s' %volname[n]], + // Three options for nticks: + // - If nonzero, force number of ticks in output waveforms. + // - If zero, use whatever input data has. (default) + // - If -1, use value as per LS's detector properties service. + // nticks: params.daq.nticks, + // nticks: -1, + // chanmaskmaps: ['bad'], + }, + }, nin=1, nout=1, uses=[duoanodes[n]]) + for n in std.range(0,3)], + + // The noise filtered "ADC" values. These are truncated for + // art::Event but left as floats for the WCT SP. Note, the tag + // "raw" is somewhat historical as the output is not equivalent to + // "raw data". + nf_digits: wcls.output.digits(name='nfdigits', tags=['raw']), + + // The output of signal processing. Note, there are two signal + // sets each created with its own filter. The "gauss" one is best + // for charge reconstruction, the "wiener" is best for S/N + // separation. Both are used in downstream WC code. + sp_signals: wcls.output.signals(name='spsignals', tags=['gauss', 'wiener']), + + // save "threshold" from normal decon for each channel noise + // used in imaging + sp_thresholds: wcls.output.thresholds(name='spthresholds', tags=['threshold']), +}; + +//local deposio = io.numpy.depos(output); +local drifter = sim.drifter; +local setdrifter = g.pnode({ + type: 'DepoSetDrifter', + data: { + drifter: "Drifter" + } + }, nin=1, nout=1, + uses=[drifter]); + +local localeLiftime = [std.extVar('lifetime') * wc.us,std.extVar('lifetime') * wc.us,std.extVar('lifetime') * wc.us,std.extVar('lifetime') * wc.us,std.extVar('lifetime') * wc.us,std.extVar('lifetime') * wc.us,std.extVar('lifetime') * wc.us,std.extVar('lifetime') * wc.us]; + +local drifters = [{ + local xregions = wc.unique_list(std.flattenArrays([v.faces for v in params.det.volumes])), + + type: "Drifter", + name: "drifter%d" %n, //%std.floor(n/45), + data: params.lar { + rng: wc.tn(tools.random), + xregions: xregions, + time_offset: params.sim.depo_toffset, + drift_speed: params.lar.drift_speed, + fluctuate: params.sim.fluctuate, + + DL: params.lar.DL, + DT: params.lar.DT, + lifetime: localeLiftime[std.floor(n/45)], + charge_scale: 1 + }, + } + for n in std.range(0,359)]; + +local setdrifters = [g.pnode({ + type: 'DepoSetDrifter', + name: 'setdrifters%d' %n, + data: { + drifters: wc.tn(drifters[n]) + } + }, nin=1, nout=1, + uses=[drifters[n]]) + for n in std.range(0,359)]; + +local scalers = [{ + + type: "Scaler", + name: "scaler%d" %std.floor(n/45), + data: params.lar { + yzmap_scale_filename: 'yzmap_gain_icarus_v0.json', + bin_width: 10*wc.cm, + tpc_width: 1500*wc.mm, + bin_height: 10*wc.cm, + anode: wc.tn(tools.anodes[std.floor(n/45)]), + plane: std.mod(std.floor(n/15),3) + }, + } + for n in std.range(0,359)]; + +local setscaler = [g.pnode({ + type: 'DepoSetScaler', + name: 'setscaler%d' %n, + data: { + scaler: wc.tn(scalers[n]) + } + }, nin=1, nout=1, + uses=[scalers[n]]) + for n in std.range(0,359)]; + + +local bagger = sim.make_bagger(); + + +// signal plus noise pipelines +//local sn_pipes = sim.signal_pipelines; +// local sn_pipes = sim.splusn_pipelines; +local analog_pipes = sim.analog_pipelinesyz; + +local perfect = import 'pgrapher/experiment/icarus/chndb-base.jsonnet'; +local chndb = [{ + type: 'OmniChannelNoiseDB', + name: 'ocndbperfect%d' % n, + data: perfect(params, tools.anodes[n], tools.field, n){dft:wc.tn(tools.dft)}, + uses: [tools.anodes[n], tools.field, tools.dft], +} for n in anode_iota]; + + +// local nf_maker = import 'pgrapher/experiment/icarus/nf.jsonnet'; +// local nf_pipes = [nf_maker(params, tools.anodes[n], chndb_pipes[n]) for n in std.range(0, std.length(tools.anodes)-1)]; +// local nf_pipes = [nf_maker(params, tools.anodes[n], chndb[n], n, name='nf%d' % n) for n in anode_iota]; + +local sp_maker = import 'pgrapher/experiment/icarus/sp.jsonnet'; +local sp = sp_maker(params, tools); +local sp_pipes = [sp.make_sigproc(a) for a in tools.anodes]; + +local rng = tools.random; +local wcls_simchannel_sink_old = + g.pnode({ + type: 'wclsDepoSetSimChannelSink', + name: 'postdriftold', + data: { + artlabel: 'simpleSCOld', // where to save in art::Event + anodes_tn: [wc.tn(anode) for anode in tools.anodes], + rng: wc.tn(rng), + tick: params.daq.tick, + start_time: -0.34 * wc.ms, // TriggerOffsetTPC from detectorclocks_icarus.fcl + readout_time: params.daq.readout_time, + nsigma: 3.0, + drift_speed: params.lar.drift_speed, + u_to_rp: 100 * wc.mm, + v_to_rp: 100 * wc.mm, + y_to_rp: 100 * wc.mm, + + // GP: The shaping time of the electronics response (1.3us) shifts the peak + // of the field response time. Eyeballing simulation times, it does this + // by a bit less than the 1.3us (1us). + // + // N.B. for future: there is likely an additional offset on the two induction + // planes due to where the deconvolution precisely defines where the "peak" + // of the pulse is. One may want to refine these parameters to account for that. + // This perturbation shouldn't be more than a tick or two. + u_time_offset: std.extVar('time_offset_u') * wc.us, + v_time_offset: std.extVar('time_offset_v') * wc.us, + y_time_offset: std.extVar('time_offset_y') * wc.us, + + g4_ref_time: -1500 * wc.us, // G4RefTime from detectorclocks_icarus.fcl + use_energy: true, + }, + },nin=1, nout=1, uses=tools.anodes); + +local wcls_simchannel_sink = + g.pnode({ + type: 'wclsDepoFluxWriter', + name: 'postdrift', + data: { + anodes: [wc.tn(anode) for anode in tools.anodes], + field_response: wc.tn(tools.field), + + // time binning + tick: params.daq.tick, + window_start: -340 * wc.us, // TriggerOffsetTPC from detectorclocks_icarus.fcl + window_duration: params.daq.readout_time, + + nsigma: 3.0, + + reference_time: -1500 * wc.us - self.window_start, // G4RefTime from detectorclocks_icarus.fcl less window start as per Brett Viren + + smear_long: 0.0, + smear_tran: 0.0, + + time_offsets: [std.extVar('time_offset_u') * wc.us, std.extVar('time_offset_v') * wc.us, std.extVar('time_offset_y') * wc.us], + + // input from art::Event + sed_label: 'largeant:TPCActive', + + // output to art::Event + simchan_label: 'simpleSC', + }, + }, nin=1, nout=1, uses=tools.anodes+[tools.field]); + +local nicks = ["incoTPCEE","incoTPCEW","incoTPCWE","incoTPCWW", "coheTPCEE","coheTPCEW","coheTPCWE","coheTPCWW"]; +local scale_int = std.extVar('int_noise_scale'); +local scale_coh = std.extVar('coh_noise_scale'); +local models = [ + { + type: "GroupNoiseModel", + name: nicks[n], + data: { + // This can also be given as a JSON/Jsonnet file + spectra: params.files.noisegroups[n], + groups: params.files.wiregroups, + scale: if n<4 then scale_int else scale_coh, + nsamples: params.daq.nticks, + tick: params.daq.tick, + } + } for n in std.range(0,7)]; + +local add_noise = function(model, n,t) g.pnode({ + type: t, + name: "addnoise%d-" %n + model.name, + data: { + rng: wc.tn(tools.random), + dft: wc.tn(tools.dft), + model: wc.tn(model), + nsamples: params.daq.nticks, + }}, nin=1, nout=1, uses=[tools.random, tools.dft, model]); +local noises = [add_noise(models[n], n,"IncoherentAddNoise") for n in std.range(0,3)]; +local coh_noises = [add_noise(models[n],n,"CoherentAddNoise") for n in std.range(4,7)]; + +// local digitizer = sim.digitizer(mega_anode, name="digitizer", tag="orig"); +local digitizers = [ + sim.digitizer(mega_anode, name="digitizer%d-" %n + mega_anode.name, tag="TPC%s"%volname[n]) + for n in std.range(0,3)]; + +local reframer = [ + g.pnode({ + type: 'Reframer', + name: 'reframer-%d-'%n+mega_anode.name, + data: { + anode: wc.tn(mega_anode), + tags: "TPC%s"%volname[n], // ?? what do? + fill: 0.0, + tbin: params.sim.reframer.tbin, + toffset: 0, + nticks: params.sim.reframer.nticks, + }, + }, nin=1, nout=1) for n in std.range(0, 3)]; + +local retaggers = [ +g.pnode({ + type: 'Retagger', + name: 'retagger%d' %n, + data: { + // Note: retagger keeps tag_rules an array to be like frame fanin/fanout. + tag_rules: [{ + // Retagger also handles "frame" and "trace" like fanin/fanout + // merge separately all traces like origN to orig. + frame: { + '.*': 'orig', + }, + merge: { + 'orig\\d': 'daq%d' %n, + }, + }], + }, +}, nin=1, nout=1) +for n in std.range(0, 3)]; + +local frame_summers = [ + g.pnode({ + type: 'FrameSummer', + name: 'framesummer%d' %n, + data: { + multiplicity: 90 + }, + }, nin=90, nout=1) for n in std.range(0, 3)]; + +local deposetfilteryz = [ g.pnode({ + type: 'DepoSetFilterYZ', + name: 'deposetfilteryz_resp%d-'%std.mod(r,15)+'plane%d-'%std.mod(std.floor(r/15),3)+tools.anodes[std.floor(r/45)].name, + data: { + yzmap_filename: 'yzmap_icarus_v0.json', + bin_width: 10*wc.cm, + tpc_width: 1500*wc.mm, + bin_height: 10*wc.cm, + resp: std.mod(r,15), + anode: wc.tn(tools.anodes[std.floor(r/45)]), + plane: std.mod(std.floor(r/15),3) + } + }, nin=1, nout=1, + uses=tools.anodes) + for r in std.range(0,359)]; + +local util = import 'pgrapher/experiment/icarus/funcs.jsonnet'; +local outtags = ['orig%d' % n for n in std.range(0, 3)]; + +local actpipes = [g.pipeline([reframer[n], noises[n], coh_noises[n], digitizers[n], /*retaggers[n],*/ wcls_output.sim_digits[n]], name="noise-digitizer%d" %n) for n in std.range(0,3)]; +local driftpipes = [g.pipeline([deposetfilteryz[n],setdrifters[n], setscaler[n], /*wcls_simchannel_sink[n]*/], name="depo-set-drifter%d" %n) for n in std.range(0,359)]; +local pipe_drift = util.fandrifter('DepoSetFanout', driftpipes, analog_pipes, frame_summers, actpipes, 'FrameFanin', 'fandrifter', outtags); +local pipe_reducer = util.fansummer('DepoSetFanout', analog_pipes, frame_summers, actpipes, 'FrameFanin', 'fansummer', outtags); + +// local retagger = g.pnode({ +// type: 'Retagger', +// data: { +// // Note: retagger keeps tag_rules an array to be like frame fanin/fanout. +// tag_rules: [{ +// // Retagger also handles "frame" and "trace" like fanin/fanout +// // merge separately all traces like origN to orig. +// frame: { +// '.*': 'orig', +// }, +// merge: { +// 'orig\\d': 'daq', +// }, +// }], +// }, +// }, nin=1, nout=1); + +//local frameio = io.numpy.frames(output); +local sink = sim.frame_sink; + + + +// local graph = g.pipeline([wcls_input.depos, drifter, wcls_simchannel_sink.simchannels, bagger, pipe_reducer, retagger, wcls_output.sim_digits, sink]); +//local graph = g.pipeline([wcls_input.depos, drifter, wcls_simchannel_sink, bagger, pipe_reducer, sink]); +//local graph = g.pipeline([wcls_input.deposet, setdrifter, wcls_simchannel_sink_old, wcls_simchannel_sink, pipe_reducer, sink]); + +local graph = g.pipeline([wcls_input.deposet,pipe_drift, sink]); + +local app = { + type: 'Pgrapher', + data: { + edges: g.edges(graph), + }, +}; + + +// Finally, the configuration sequence which is emitted. + +g.uses(graph) + [app] diff --git a/icaruscode/TPC/ICARUSWireCell/wcls-multitpc-sim-drift-simchannel_YZsim.fcl b/icaruscode/TPC/ICARUSWireCell/wcls-multitpc-sim-drift-simchannel_YZsim.fcl new file mode 100644 index 000000000..37b4db151 --- /dev/null +++ b/icaruscode/TPC/ICARUSWireCell/wcls-multitpc-sim-drift-simchannel_YZsim.fcl @@ -0,0 +1,461 @@ +#include "services_common_icarus.fcl" +#include "simulationservices_icarus.fcl" + +services: +{ + TFileService: { } + @table::icarus_common_services +} + +process_name: wclssim +physics :{ + producers: { + plopper : { + module_type : BlipMaker + } + simmer : { + module_type : WireCellToolkit + wcls_main: { + tool_type: WCLS + apps: ["Pgrapher"] + + // logsinks: ["stdout"] + // loglevels: ["magnify:debug"] + + plugins: ["WireCellPgraph", "WireCellGen","WireCellSio","WireCellRoot","WireCellLarsoft"] + + // needs to be found via your WIRECELL_PATH + configs: ["pgrapher/experiment/icarus/wcls-multitpc-sim-drift-simchannel-yzsim-shifted-refactored.jsonnet"] + + + // Contract note: these exact "type:name" must be used to identify + // the configuration data structures for these components in the Jsonnet. + + inputers: ["wclsSimDepoSource:electron"] + outputers: [ + //"wclsSimChannelSink:postdrift", + "wclsSimChannelSink:postdrift0", + "wclsSimChannelSink:postdrift1", + "wclsSimChannelSink:postdrift2", + "wclsSimChannelSink:postdrift3", + "wclsSimChannelSink:postdrift4", + "wclsSimChannelSink:postdrift5", + "wclsSimChannelSink:postdrift6", + "wclsSimChannelSink:postdrift7", + "wclsSimChannelSink:postdrift8", + "wclsSimChannelSink:postdrift9", + "wclsSimChannelSink:postdrift10", + "wclsSimChannelSink:postdrift11", + "wclsSimChannelSink:postdrift12", + "wclsSimChannelSink:postdrift13", + "wclsSimChannelSink:postdrift14", + "wclsSimChannelSink:postdrift15", + "wclsSimChannelSink:postdrift16", + "wclsSimChannelSink:postdrift17", + "wclsSimChannelSink:postdrift18", + "wclsSimChannelSink:postdrift19", + "wclsSimChannelSink:postdrift20", + "wclsSimChannelSink:postdrift21", + "wclsSimChannelSink:postdrift22", + "wclsSimChannelSink:postdrift23", + "wclsSimChannelSink:postdrift24", + "wclsSimChannelSink:postdrift25", + "wclsSimChannelSink:postdrift26", + "wclsSimChannelSink:postdrift27", + "wclsSimChannelSink:postdrift28", + "wclsSimChannelSink:postdrift29", + "wclsSimChannelSink:postdrift30", + "wclsSimChannelSink:postdrift31", + "wclsSimChannelSink:postdrift32", + "wclsSimChannelSink:postdrift33", + "wclsSimChannelSink:postdrift34", + "wclsSimChannelSink:postdrift35", + "wclsSimChannelSink:postdrift36", + "wclsSimChannelSink:postdrift37", + "wclsSimChannelSink:postdrift38", + "wclsSimChannelSink:postdrift39", + "wclsSimChannelSink:postdrift40", + "wclsSimChannelSink:postdrift41", + "wclsSimChannelSink:postdrift42", + "wclsSimChannelSink:postdrift43", + "wclsSimChannelSink:postdrift44", + "wclsSimChannelSink:postdrift45", + "wclsSimChannelSink:postdrift46", + "wclsSimChannelSink:postdrift47", + "wclsSimChannelSink:postdrift48", + "wclsSimChannelSink:postdrift49", + "wclsSimChannelSink:postdrift50", + "wclsSimChannelSink:postdrift51", + "wclsSimChannelSink:postdrift52", + "wclsSimChannelSink:postdrift53", + "wclsSimChannelSink:postdrift54", + "wclsSimChannelSink:postdrift55", + "wclsSimChannelSink:postdrift56", + "wclsSimChannelSink:postdrift57", + "wclsSimChannelSink:postdrift58", + "wclsSimChannelSink:postdrift59", + "wclsSimChannelSink:postdrift60", + "wclsSimChannelSink:postdrift61", + "wclsSimChannelSink:postdrift62", + "wclsSimChannelSink:postdrift63", + "wclsSimChannelSink:postdrift64", + "wclsSimChannelSink:postdrift65", + "wclsSimChannelSink:postdrift66", + "wclsSimChannelSink:postdrift67", + "wclsSimChannelSink:postdrift68", + "wclsSimChannelSink:postdrift69", + "wclsSimChannelSink:postdrift70", + "wclsSimChannelSink:postdrift71", + "wclsSimChannelSink:postdrift72", + "wclsSimChannelSink:postdrift73", + "wclsSimChannelSink:postdrift74", + "wclsSimChannelSink:postdrift75", + "wclsSimChannelSink:postdrift76", + "wclsSimChannelSink:postdrift77", + "wclsSimChannelSink:postdrift78", + "wclsSimChannelSink:postdrift79", + "wclsSimChannelSink:postdrift80", + "wclsSimChannelSink:postdrift81", + "wclsSimChannelSink:postdrift82", + "wclsSimChannelSink:postdrift83", + "wclsSimChannelSink:postdrift84", + "wclsSimChannelSink:postdrift85", + "wclsSimChannelSink:postdrift86", + "wclsSimChannelSink:postdrift87", + "wclsSimChannelSink:postdrift88", + "wclsSimChannelSink:postdrift89", + "wclsSimChannelSink:postdrift90", + "wclsSimChannelSink:postdrift91", + "wclsSimChannelSink:postdrift92", + "wclsSimChannelSink:postdrift93", + "wclsSimChannelSink:postdrift94", + "wclsSimChannelSink:postdrift95", + "wclsSimChannelSink:postdrift96", + "wclsSimChannelSink:postdrift97", + "wclsSimChannelSink:postdrift98", + "wclsSimChannelSink:postdrift99", + "wclsSimChannelSink:postdrift100", + "wclsSimChannelSink:postdrift101", + "wclsSimChannelSink:postdrift102", + "wclsSimChannelSink:postdrift103", + "wclsSimChannelSink:postdrift104", + "wclsSimChannelSink:postdrift105", + "wclsSimChannelSink:postdrift106", + "wclsSimChannelSink:postdrift107", + "wclsSimChannelSink:postdrift108", + "wclsSimChannelSink:postdrift109", + "wclsSimChannelSink:postdrift110", + "wclsSimChannelSink:postdrift111", + "wclsSimChannelSink:postdrift112", + "wclsSimChannelSink:postdrift113", + "wclsSimChannelSink:postdrift114", + "wclsSimChannelSink:postdrift115", + "wclsSimChannelSink:postdrift116", + "wclsSimChannelSink:postdrift117", + "wclsSimChannelSink:postdrift118", + "wclsSimChannelSink:postdrift119", + "wclsSimChannelSink:postdrift120", + "wclsSimChannelSink:postdrift121", + "wclsSimChannelSink:postdrift122", + "wclsSimChannelSink:postdrift123", + "wclsSimChannelSink:postdrift124", + "wclsSimChannelSink:postdrift125", + "wclsSimChannelSink:postdrift126", + "wclsSimChannelSink:postdrift127", + "wclsSimChannelSink:postdrift128", + "wclsSimChannelSink:postdrift129", + "wclsSimChannelSink:postdrift130", + "wclsSimChannelSink:postdrift131", + "wclsSimChannelSink:postdrift132", + "wclsSimChannelSink:postdrift133", + "wclsSimChannelSink:postdrift134", + "wclsSimChannelSink:postdrift135", + "wclsSimChannelSink:postdrift136", + "wclsSimChannelSink:postdrift137", + "wclsSimChannelSink:postdrift138", + "wclsSimChannelSink:postdrift139", + "wclsSimChannelSink:postdrift140", + "wclsSimChannelSink:postdrift141", + "wclsSimChannelSink:postdrift142", + "wclsSimChannelSink:postdrift143", + "wclsSimChannelSink:postdrift144", + "wclsSimChannelSink:postdrift145", + "wclsSimChannelSink:postdrift146", + "wclsSimChannelSink:postdrift147", + "wclsSimChannelSink:postdrift148", + "wclsSimChannelSink:postdrift149", + "wclsSimChannelSink:postdrift150", + "wclsSimChannelSink:postdrift151", + "wclsSimChannelSink:postdrift152", + "wclsSimChannelSink:postdrift153", + "wclsSimChannelSink:postdrift154", + "wclsSimChannelSink:postdrift155", + "wclsSimChannelSink:postdrift156", + "wclsSimChannelSink:postdrift157", + "wclsSimChannelSink:postdrift158", + "wclsSimChannelSink:postdrift159", + "wclsSimChannelSink:postdrift160", + "wclsSimChannelSink:postdrift161", + "wclsSimChannelSink:postdrift162", + "wclsSimChannelSink:postdrift163", + "wclsSimChannelSink:postdrift164", + "wclsSimChannelSink:postdrift165", + "wclsSimChannelSink:postdrift166", + "wclsSimChannelSink:postdrift167", + "wclsSimChannelSink:postdrift168", + "wclsSimChannelSink:postdrift169", + "wclsSimChannelSink:postdrift170", + "wclsSimChannelSink:postdrift171", + "wclsSimChannelSink:postdrift172", + "wclsSimChannelSink:postdrift173", + "wclsSimChannelSink:postdrift174", + "wclsSimChannelSink:postdrift175", + "wclsSimChannelSink:postdrift176", + "wclsSimChannelSink:postdrift177", + "wclsSimChannelSink:postdrift178", + "wclsSimChannelSink:postdrift179", + "wclsSimChannelSink:postdrift180", + "wclsSimChannelSink:postdrift181", + "wclsSimChannelSink:postdrift182", + "wclsSimChannelSink:postdrift183", + "wclsSimChannelSink:postdrift184", + "wclsSimChannelSink:postdrift185", + "wclsSimChannelSink:postdrift186", + "wclsSimChannelSink:postdrift187", + "wclsSimChannelSink:postdrift188", + "wclsSimChannelSink:postdrift189", + "wclsSimChannelSink:postdrift190", + "wclsSimChannelSink:postdrift191", + "wclsSimChannelSink:postdrift192", + "wclsSimChannelSink:postdrift193", + "wclsSimChannelSink:postdrift194", + "wclsSimChannelSink:postdrift195", + "wclsSimChannelSink:postdrift196", + "wclsSimChannelSink:postdrift197", + "wclsSimChannelSink:postdrift198", + "wclsSimChannelSink:postdrift199", + "wclsSimChannelSink:postdrift200", + "wclsSimChannelSink:postdrift201", + "wclsSimChannelSink:postdrift202", + "wclsSimChannelSink:postdrift203", + "wclsSimChannelSink:postdrift204", + "wclsSimChannelSink:postdrift205", + "wclsSimChannelSink:postdrift206", + "wclsSimChannelSink:postdrift207", + "wclsSimChannelSink:postdrift208", + "wclsSimChannelSink:postdrift209", + "wclsSimChannelSink:postdrift210", + "wclsSimChannelSink:postdrift211", + "wclsSimChannelSink:postdrift212", + "wclsSimChannelSink:postdrift213", + "wclsSimChannelSink:postdrift214", + "wclsSimChannelSink:postdrift215", + "wclsSimChannelSink:postdrift216", + "wclsSimChannelSink:postdrift217", + "wclsSimChannelSink:postdrift218", + "wclsSimChannelSink:postdrift219", + "wclsSimChannelSink:postdrift220", + "wclsSimChannelSink:postdrift221", + "wclsSimChannelSink:postdrift222", + "wclsSimChannelSink:postdrift223", + "wclsSimChannelSink:postdrift224", + "wclsSimChannelSink:postdrift225", + "wclsSimChannelSink:postdrift226", + "wclsSimChannelSink:postdrift227", + "wclsSimChannelSink:postdrift228", + "wclsSimChannelSink:postdrift229", + "wclsSimChannelSink:postdrift230", + "wclsSimChannelSink:postdrift231", + "wclsSimChannelSink:postdrift232", + "wclsSimChannelSink:postdrift233", + "wclsSimChannelSink:postdrift234", + "wclsSimChannelSink:postdrift235", + "wclsSimChannelSink:postdrift236", + "wclsSimChannelSink:postdrift237", + "wclsSimChannelSink:postdrift238", + "wclsSimChannelSink:postdrift239", + "wclsSimChannelSink:postdrift240", + "wclsSimChannelSink:postdrift241", + "wclsSimChannelSink:postdrift242", + "wclsSimChannelSink:postdrift243", + "wclsSimChannelSink:postdrift244", + "wclsSimChannelSink:postdrift245", + "wclsSimChannelSink:postdrift246", + "wclsSimChannelSink:postdrift247", + "wclsSimChannelSink:postdrift248", + "wclsSimChannelSink:postdrift249", + "wclsSimChannelSink:postdrift250", + "wclsSimChannelSink:postdrift251", + "wclsSimChannelSink:postdrift252", + "wclsSimChannelSink:postdrift253", + "wclsSimChannelSink:postdrift254", + "wclsSimChannelSink:postdrift255", + "wclsSimChannelSink:postdrift256", + "wclsSimChannelSink:postdrift257", + "wclsSimChannelSink:postdrift258", + "wclsSimChannelSink:postdrift259", + "wclsSimChannelSink:postdrift260", + "wclsSimChannelSink:postdrift261", + "wclsSimChannelSink:postdrift262", + "wclsSimChannelSink:postdrift263", + "wclsSimChannelSink:postdrift264", + "wclsSimChannelSink:postdrift265", + "wclsSimChannelSink:postdrift266", + "wclsSimChannelSink:postdrift267", + "wclsSimChannelSink:postdrift268", + "wclsSimChannelSink:postdrift269", + "wclsSimChannelSink:postdrift270", + "wclsSimChannelSink:postdrift271", + "wclsSimChannelSink:postdrift272", + "wclsSimChannelSink:postdrift273", + "wclsSimChannelSink:postdrift274", + "wclsSimChannelSink:postdrift275", + "wclsSimChannelSink:postdrift276", + "wclsSimChannelSink:postdrift277", + "wclsSimChannelSink:postdrift278", + "wclsSimChannelSink:postdrift279", + "wclsSimChannelSink:postdrift280", + "wclsSimChannelSink:postdrift281", + "wclsSimChannelSink:postdrift282", + "wclsSimChannelSink:postdrift283", + "wclsSimChannelSink:postdrift284", + "wclsSimChannelSink:postdrift285", + "wclsSimChannelSink:postdrift286", + "wclsSimChannelSink:postdrift287", + "wclsSimChannelSink:postdrift288", + "wclsSimChannelSink:postdrift289", + "wclsSimChannelSink:postdrift290", + "wclsSimChannelSink:postdrift291", + "wclsSimChannelSink:postdrift292", + "wclsSimChannelSink:postdrift293", + "wclsSimChannelSink:postdrift294", + "wclsSimChannelSink:postdrift295", + "wclsSimChannelSink:postdrift296", + "wclsSimChannelSink:postdrift297", + "wclsSimChannelSink:postdrift298", + "wclsSimChannelSink:postdrift299", + "wclsSimChannelSink:postdrift300", + "wclsSimChannelSink:postdrift301", + "wclsSimChannelSink:postdrift302", + "wclsSimChannelSink:postdrift303", + "wclsSimChannelSink:postdrift304", + "wclsSimChannelSink:postdrift305", + "wclsSimChannelSink:postdrift306", + "wclsSimChannelSink:postdrift307", + "wclsSimChannelSink:postdrift308", + "wclsSimChannelSink:postdrift309", + "wclsSimChannelSink:postdrift310", + "wclsSimChannelSink:postdrift311", + "wclsSimChannelSink:postdrift312", + "wclsSimChannelSink:postdrift313", + "wclsSimChannelSink:postdrift314", + "wclsSimChannelSink:postdrift315", + "wclsSimChannelSink:postdrift316", + "wclsSimChannelSink:postdrift317", + "wclsSimChannelSink:postdrift318", + "wclsSimChannelSink:postdrift319", + "wclsSimChannelSink:postdrift320", + "wclsSimChannelSink:postdrift321", + "wclsSimChannelSink:postdrift322", + "wclsSimChannelSink:postdrift323", + "wclsSimChannelSink:postdrift324", + "wclsSimChannelSink:postdrift325", + "wclsSimChannelSink:postdrift326", + "wclsSimChannelSink:postdrift327", + "wclsSimChannelSink:postdrift328", + "wclsSimChannelSink:postdrift329", + "wclsSimChannelSink:postdrift330", + "wclsSimChannelSink:postdrift331", + "wclsSimChannelSink:postdrift332", + "wclsSimChannelSink:postdrift333", + "wclsSimChannelSink:postdrift334", + "wclsSimChannelSink:postdrift335", + "wclsSimChannelSink:postdrift336", + "wclsSimChannelSink:postdrift337", + "wclsSimChannelSink:postdrift338", + "wclsSimChannelSink:postdrift339", + "wclsSimChannelSink:postdrift340", + "wclsSimChannelSink:postdrift341", + "wclsSimChannelSink:postdrift342", + "wclsSimChannelSink:postdrift343", + "wclsSimChannelSink:postdrift344", + "wclsSimChannelSink:postdrift345", + "wclsSimChannelSink:postdrift346", + "wclsSimChannelSink:postdrift347", + "wclsSimChannelSink:postdrift348", + "wclsSimChannelSink:postdrift349", + "wclsSimChannelSink:postdrift350", + "wclsSimChannelSink:postdrift351", + "wclsSimChannelSink:postdrift352", + "wclsSimChannelSink:postdrift353", + "wclsSimChannelSink:postdrift354", + "wclsSimChannelSink:postdrift355", + "wclsSimChannelSink:postdrift356", + "wclsSimChannelSink:postdrift357", + "wclsSimChannelSink:postdrift358", + "wclsSimChannelSink:postdrift359", + "wclsFrameSaver:simdigits0", + "wclsFrameSaver:simdigits1", + "wclsFrameSaver:simdigits2", + "wclsFrameSaver:simdigits3" + // ,"wclsFrameSaver:nfdigits", + // "wclsFrameSaver:spsignals", + // "wclsFrameSaver:spthresholds" + ] + + // Make available parameters via Jsonnet's std.extVar() + params: { + files_fields: "garfield-icarus-fnal-rev2.json.bz2" + } + structs: { + # load values from simulationservices_icarus.fcl + # Longitudinal diffusion constant [cm2/ns] + DL: @local::icarus_largeantparameters.LongitudinalDiffusion + + # Transverse diffusion constant [cm2/ns] + DT: @local::icarus_largeantparameters.TransverseDiffusion + + # load values from services_common_icarus.fcl + # Electron lifetime [microseconds] + lifetime: @local::icarus_detproperties.Electronlifetime + + + lifetime_TPCEE: @local::icarus_detproperties.Electronlifetime + lifetime_TPCEW: @local::icarus_detproperties.Electronlifetime + lifetime_TPCWE: @local::icarus_detproperties.Electronlifetime + lifetime_TPCWW: @local::icarus_detproperties.Electronlifetime + + # Electron drift speed, assumes a certain applied E-field [mm/us] + # driftSpeed: 1.5756 + int_noise_scale: 1.0 + coh_noise_scale: 1.09 + } + + } + } + } + p1 : [ plopper, simmer ] + outputFiles : [ out ] + + trigger_paths : [ p1 ] + end_paths: [ outputFiles ] +} +outputs: { + out: { + module_type: RootOutput + fileName: "%ifb_wcsim.root" + // fileName: "wcsim.root" + + outputCommands : [ + // "drop *", "keep recob::Wires_*_*_*" + "keep *_*_*_*" + // "drop *_nfspl1_raw_*", + // "drop *_nfspl1_threshold_*", + // "drop *_nfspl1_wiener_*", + // "drop *_nfspl1_gauss_*", + // "drop *_wcNoiseFilter_*_*", + // "drop *_daq_*_*" + ] + + } +}