Back to home page

EIC code displayed by LXR

 
 

    


Warning, /detector_benchmarks/benchmarks/backwards_ecal/Snakefile is written in an unsupported language. File is not indexed.

0001 def get_n_events(wildcards):
0002     energy = float(wildcards.ENERGY.replace("GeV", "").replace("MeV", "e-3"))
0003     n_events = 1000 if wildcards.PARTICLE == "e-" else 2000
0004     n_events = int(n_events // (energy ** 0.75))
0005     return n_events
0006 
0007 
0008 rule backwards_ecal_sim:
0009     input:
0010         steering_file=ancient("EPIC/EVGEN/SINGLE/{PARTICLE}/{ENERGY}/{PHASE_SPACE}/{PARTICLE}_{ENERGY}_{PHASE_SPACE}.steer"),
0011         warmup=ancient("warmup/{DETECTOR_CONFIG}.edm4hep.root"),
0012         geometry_lib=find_epic_libraries(),
0013     output:
0014         "sim_output/backwards_ecal/{DETECTOR_CONFIG}/{PARTICLE}/{ENERGY}/{PHASE_SPACE}/{PARTICLE}_{ENERGY}_{PHASE_SPACE}.{INDEX}.edm4hep.root",
0015     log:
0016         "sim_output/backwards_ecal/{DETECTOR_CONFIG}/{PARTICLE}/{ENERGY}/{PHASE_SPACE}/{PARTICLE}_{ENERGY}_{PHASE_SPACE}.{INDEX}.edm4hep.root.log",
0017     wildcard_constraints:
0018         PARTICLE="(e-|pi-)",
0019         ENERGY="[0-9]+[kMG]eV",
0020         PHASE_SPACE="(3to50|45to135|130to177)deg",
0021         INDEX=r"\d{4}",
0022     params:
0023         N_EVENTS=get_n_events,
0024         SEED=lambda wildcards: "1" + wildcards.INDEX,
0025         DETECTOR_PATH=os.environ["DETECTOR_PATH"],
0026         DETECTOR_CONFIG=lambda wildcards: wildcards.DETECTOR_CONFIG,
0027         DD4HEP_HASH=get_spack_package_hash("dd4hep"),
0028         NPSIM_HASH=get_spack_package_hash("npsim"),
0029     cache: True
0030     shell:
0031         """
0032 set -m # monitor mode to prevent lingering processes
0033 exec ddsim \
0034   --runType batch \
0035   --enableGun \
0036   --steeringFile "{input.steering_file}" \
0037   --random.seed {params.SEED} \
0038   --filter.tracker edep0 \
0039   -v WARNING \
0040   --numberOfEvents {params.N_EVENTS} \
0041   --compactFile {params.DETECTOR_PATH}/{params.DETECTOR_CONFIG}.xml \
0042   --outputFile {output}
0043 """
0044 
0045 
0046 rule backwards_ecal_recon:
0047     input:
0048         sim="sim_output/backwards_ecal/{DETECTOR_CONFIG}/{PARTICLE}/{ENERGY}/{PHASE_SPACE}/{PARTICLE}_{ENERGY}_{PHASE_SPACE}.{INDEX}.edm4hep.root",
0049         warmup=ancient("warmup/{DETECTOR_CONFIG}.edm4hep.root"),
0050     output:
0051         "sim_output/backwards_ecal/{DETECTOR_CONFIG}/{PARTICLE}/{ENERGY}/{PHASE_SPACE}/{PARTICLE}_{ENERGY}_{PHASE_SPACE}.{INDEX}.eicrecon.edm4eic.root",
0052     log:
0053         "sim_output/backwards_ecal/{DETECTOR_CONFIG}/{PARTICLE}/{ENERGY}/{PHASE_SPACE}/{PARTICLE}_{ENERGY}_{PHASE_SPACE}.{INDEX}.eicrecon.edm4eic.root.log",
0054     wildcard_constraints:
0055         INDEX=r"\d{4}",
0056     params:
0057         DETECTOR_CONFIG=lambda wildcards: wildcards.DETECTOR_CONFIG,
0058         EICRECON_HASH=get_spack_package_hash("eicrecon"),
0059     cache: True
0060     shell: """
0061 set -m # monitor mode to prevent lingering processes
0062 exec env DETECTOR_CONFIG={params.DETECTOR_CONFIG} \
0063   eicrecon {input.sim} -Ppodio:output_file={output} \
0064   -Ppodio:output_collections=MCParticles,EcalEndcapNRecHits,EcalEndcapNClusters
0065 """
0066 
0067 
0068 rule backwards_ecal_local_sim_list:
0069     input:
0070         expand(
0071             "sim_output/backwards_ecal/{{DETECTOR_CONFIG}}/{{PARTICLE}}/{{ENERGY}}/{{PHASE_SPACE}}/{{PARTICLE}}_{{ENERGY}}_{{PHASE_SPACE}}.{INDEX:04d}.eicrecon.edm4eic.root",
0072             INDEX=range(20),
0073         ),
0074     output:
0075         "listing/backwards_ecal/local/{DETECTOR_CONFIG}/{PARTICLE}/{ENERGY}/{PHASE_SPACE}.lst",
0076     run:
0077         with open(output[0], "wt") as fp:
0078             fp.write("\n".join(input))
0079 
0080 
0081 if config.get("stream_from_xrootd", True) not in [False, "", "0", "false"]:
0082     rule backwards_ecal_campaign_sim_list:
0083         output:
0084             "listing/backwards_ecal/{CAMPAIGN}/{DETECTOR_CONFIG}/{PARTICLE}/{ENERGY}/{PHASE_SPACE}.lst",
0085         params:
0086             search_path=lambda wildcards: f"EPIC/RECO/{wildcards.CAMPAIGN}/epic_craterlake/SINGLE/{wildcards.PARTICLE}/{wildcards.ENERGY}/{wildcards.PHASE_SPACE}/",
0087         shell: """
0088     xrdfs root://dtn-eic.jlab.org/ ls /volatile/eic/{params.search_path} \
0089       | awk '{{ print "root://dtn-eic.jlab.org/"$1; }}' \
0090       | sort \
0091       > {output}
0092     if [ ! -s {output} ]; then
0093       echo "Got an empty file listing for path \"\""
0094       exit 1
0095     fi
0096     """
0097 else:
0098     checkpoint backwards_ecal_campaign_sim_list_checkpoint:
0099         output:
0100             "listing/backwards_ecal/{CAMPAIGN}/{DETECTOR_CONFIG}/{PARTICLE}/{ENERGY}/{PHASE_SPACE}.lst.orig",
0101         params:
0102             search_path=lambda wildcards: f"EPIC/RECO/{wildcards.CAMPAIGN}/epic_craterlake/SINGLE/{wildcards.PARTICLE}/{wildcards.ENERGY}/{wildcards.PHASE_SPACE}/",
0103         shell: """
0104     xrdfs root://dtn-eic.jlab.org/ ls /volatile/eic/{params.search_path} \
0105       | sed -e 's#^/volatile/eic/##' \
0106       | sort \
0107       > {output}
0108     if [ ! -s {output} ]; then
0109       echo "Got an empty file listing for path \"\""
0110       exit 1
0111     fi
0112     """
0113 
0114     def get_backwards_ecal_campaign_sim_list(wildcards):
0115         with checkpoints.backwards_ecal_campaign_sim_list_checkpoint.get(**wildcards).output[0].open() as fp:
0116             return [line.rstrip() for line in fp.readlines()]
0117 
0118     rule backwards_ecal_campaign_sim_list:
0119         input:
0120             # depend on paths from the file list
0121             get_backwards_ecal_campaign_sim_list,
0122             orig_list="listing/backwards_ecal/{CAMPAIGN}/{DETECTOR_CONFIG}/{PARTICLE}/{ENERGY}/{PHASE_SPACE}.lst.orig",
0123         output:
0124             "listing/backwards_ecal/{CAMPAIGN}/{DETECTOR_CONFIG}/{PARTICLE}/{ENERGY}/{PHASE_SPACE}.lst",
0125         shell: """
0126     cp {input.orig_list} {output}
0127     """
0128 
0129 
0130 ruleorder: backwards_ecal_local_sim_list > backwards_ecal_campaign_sim_list
0131 
0132 
0133 DETECTOR_CONFIG=os.environ["DETECTOR_CONFIG"]
0134 
0135 rule backwards_ecal:
0136     input:
0137         expand(
0138             "listing/backwards_ecal/{{CAMPAIGN}}/" + DETECTOR_CONFIG + "/{PARTICLE}/{ENERGY}/{PHASE_SPACE}.lst",
0139             PARTICLE=["pi-", "e-"],
0140             ENERGY=[
0141                 "100MeV",
0142                 "200MeV",
0143                 "500MeV",
0144                 "1GeV",
0145                 "2GeV",
0146                 "5GeV",
0147                 "10GeV",
0148                 "20GeV",
0149             ],
0150             PHASE_SPACE=["130to177deg"],
0151         ),
0152         matplotlibrc=".matplotlibrc",
0153         script="benchmarks/backwards_ecal/backwards_ecal.py",
0154     output:
0155         directory("results/backwards_ecal/{CAMPAIGN}/")
0156     log:
0157         scheduler=".logs/results/backwards_ecal/{CAMPAIGN}/scheduler.log",
0158         worker=".logs/results/backwards_ecal/{CAMPAIGN}/worker.log",
0159     threads: workflow.cores
0160     shell:
0161         """
0162 if [[ "{wildcards.CAMPAIGN}" == "local" ]]; then
0163 export PLOT_TITLE="Benchmark simulation"
0164 else
0165 export PLOT_TITLE="\\textbf{{ePIC}} Simulation {wildcards.CAMPAIGN}"
0166 fi
0167 
0168 set -m # monitor mode to prevent lingering processes
0169 cleanup() {{
0170   echo Cleaning up
0171   kill $WORKER_PID $SCHEDULER_PID
0172 }}
0173 trap cleanup EXIT
0174 
0175 PORT=$RANDOM
0176 dask scheduler --port $PORT 2>{log.scheduler} &
0177 export DASK_SCHEDULER=localhost:$PORT
0178 SCHEDULER_PID=$!
0179 dask worker tcp://$DASK_SCHEDULER --nworkers {threads} --nthreads 1 2>{log.worker} &
0180 WORKER_PID=$!
0181 env \
0182 MATPLOTLIBRC={input.matplotlibrc} \
0183 DETECTOR_CONFIG=""" + DETECTOR_CONFIG + """ \
0184 INPUT_PATH_FORMAT=listing/backwards_ecal/{wildcards.CAMPAIGN}/""" + DETECTOR_CONFIG + """/{{particle}}/{{energy}}/130to177deg.lst \
0185 OUTPUT_DIR={output} \
0186 python {input.script}
0187 """