diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a9bee6af7..3edbb7f6b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -9,45 +9,29 @@ on: workflow_dispatch: jobs: - remove-unneeded-software: - runs-on: ubuntu-22.04 - steps: - - uses: actions/checkout@v3 - - run: | - sudo rm -rf \ - "$AGENT_TOOLSDIRECTORY" \ - /opt/google/chrome \ - /opt/microsoft/msedge \ - /opt/microsoft/powershell \ - /opt/pipx \ - /usr/lib/mono \ - /usr/local/julia* \ - /usr/local/lib/android \ - /usr/local/lib/node_modules \ - /usr/local/share/chromium \ - /usr/local/share/powershell \ - /usr/share/dotnet \ - /usr/share/swift - - deps-torch: - runs-on: ubuntu-22.04 - needs: [remove-unneeded-software] - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-python@v4 - with: - python-version: "3.10.12" - cache: "pip" - - run: pip install -r requirements.txt + test-in-container: + runs-on: ubuntu-latest + container: + image: pytorch/pytorch:2.9.1-cuda13.0-cudnn9-runtime - torch-pipeline: - runs-on: ubuntu-22.04 - needs: [deps-torch] steps: - - uses: actions/checkout@v3 - - uses: actions/setup-python@v4 + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Cache pip packages + uses: actions/cache@v4 with: - python-version: "3.10.12" - cache: "pip" - - run: pip install -r requirements.txt - - run: ./scripts/local_test_torch.sh + path: ~/.cache/pip + key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }} + restore-keys: | + ${{ runner.os }}-pip- + + - name: Install dependencies + run: pip install -r requirements.txt + + - name: Install wget + run: | + apt-get update && apt-get install -y wget gcc g++ build-essential + + - name: Run tests + run: ./scripts/local_test_torch.sh diff --git a/mlpf/data/cms/genjob_pu55to75_val_v2.sh b/mlpf/data/cms/genjob_pu55to75_val_v2.sh new file mode 100755 index 000000000..50fbc51f2 --- /dev/null +++ b/mlpf/data/cms/genjob_pu55to75_val_v2.sh @@ -0,0 +1,79 @@ +#!/bin/bash +set -e +set -x + +OUTDIR=/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/ +CMSSWDIR=/scratch/persistent/joosep/CMSSW_15_0_5/ +MLPF_PATH=/home/joosep/particleflow/ + +#seed must be greater than 0 +SAMPLE=$1 +SEED=$2 + +WORKDIR=/scratch/local/joosep/$SLURM_JOBID/$SAMPLE/$SEED +#WORKDIR=`pwd`/$SAMPLE/$SEED +mkdir -p $WORKDIR +mkdir -p $OUTDIR/$SAMPLE/root + +PILEUP=Run3_Flat55To75_PoissonOOTPU +PILEUP_INPUT=filelist:${MLPF_PATH}/mlpf/data/cms/pu_files_local.txt + +N=50 + +env +source /cvmfs/cms.cern.ch/cmsset_default.sh + +cd $CMSSWDIR +eval `scramv1 runtime -sh` +which python +which python3 + +env + +cd $WORKDIR + +#Generate the MC +cmsDriver.py $SAMPLE \ + --conditions auto:phase1_2023_realistic \ + --beamspot Realistic25ns13p6TeVEarly2023Collision \ + -n $N \ + --era Run3_2023 \ + --eventcontent FEVTDEBUGHLT \ + -s GEN,SIM,DIGI:pdigi_valid,L1,DIGI2RAW,HLT:@relval2023 \ + --datatier GEN-SIM \ + --geometry DB:Extended \ + --pileup $PILEUP \ + --pileup_input $PILEUP_INPUT \ + --no_exec \ + --fileout step2_phase1_new.root \ + --customise Validation/RecoParticleFlow/customize_pfanalysis.customize_step2 \ + --python_filename=step2_phase1_new.py + +#Run the reco sequences +cmsDriver.py step3 \ + --conditions auto:phase1_2023_realistic \ + --beamspot Realistic25ns13p6TeVEarly2023Collision \ + --era Run3_2023 \ + -n -1 \ + --eventcontent FEVTDEBUGHLT \ + --runUnscheduled \ + -s RAW2DIGI,L1Reco,RECO,RECOSIM \ + --datatier GEN-SIM-RECO \ + --geometry DB:Extended \ + --no_exec \ + --filein file:step2_phase1_new.root \ + --fileout step3_phase1_new.root \ + --customise Validation/RecoParticleFlow/customize_pfanalysis.customize_step3 \ + --python_filename=step3_phase1_new.py + +pwd +ls -lrt + +echo "process.RandomNumberGeneratorService.generator.initialSeed = $SEED" >> step2_phase1_new.py +cmsRun step2_phase1_new.py > /dev/null +cp step2_phase1_new.root $OUTDIR/$SAMPLE/root/step2_${SEED}.root + +cmsRun step3_phase1_new.py > /dev/null +cp pfntuple.root $OUTDIR/$SAMPLE/root/pfntuple_${SEED}.root + +rm -Rf /scratch/local/joosep/$SLURM_JOBID diff --git a/mlpf/data/cms/genjob_pu55to75_val_v3.sh b/mlpf/data/cms/genjob_pu55to75_val_v3.sh new file mode 100755 index 000000000..efe291062 --- /dev/null +++ b/mlpf/data/cms/genjob_pu55to75_val_v3.sh @@ -0,0 +1,81 @@ +#!/bin/bash +set -e +set -x + +OUTDIR=/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/ +CMSSWDIR=/scratch/persistent/joosep/CMSSW_15_0_5/ +MLPF_PATH=/home/joosep/particleflow/ + +#seed must be greater than 0 +SAMPLE=$1 +SEED=$2 + +WORKDIR=/scratch/local/joosep/$SLURM_JOBID/$SAMPLE/$SEED +#WORKDIR=`pwd`/$SAMPLE/$SEED +mkdir -p $WORKDIR +mkdir -p $OUTDIR/$SAMPLE/root + +PILEUP=Run3_Flat55To75_PoissonOOTPU +PILEUP_INPUT=filelist:${MLPF_PATH}/mlpf/data/cms/pu_files_local_val2.txt + +N=50 + +env +source /cvmfs/cms.cern.ch/cmsset_default.sh + +cd $CMSSWDIR +eval `scramv1 runtime -sh` +which python +which python3 + +env + +cd $WORKDIR + +#Generate the MC +cmsDriver.py $SAMPLE \ + --conditions 140X_mcRun3_2024_realistic_v26 \ + --beamspot DBrealistic \ + -n $N \ + --era Run3_2024 \ + --eventcontent FEVTDEBUGHLT \ + -s GEN,SIM,DIGI:pdigi_valid,L1,DIGI2RAW,HLT:@relval2023 \ + --datatier GEN-SIM \ + --geometry DB:Extended \ + --pileup $PILEUP \ + --pileup_input $PILEUP_INPUT \ + --no_exec \ + --fileout step2_phase1_new.root \ + --customise Validation/RecoParticleFlow/customize_pfanalysis.customize_step2 \ + --python_filename=step2_phase1_new.py + +# --customise_commands "process.mix.input.nbPileupEvents.probFunctionVariable = cms.vint32(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120) \n process.mix.input.nbPileupEvents.probValue = cms.vdouble(0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446,0.00826446)" + +#Run the reco sequences +cmsDriver.py step3 \ + --conditions 140X_mcRun3_2024_realistic_v26 \ + --beamspot DBrealistic \ + --era Run3_2024 \ + -n -1 \ + --eventcontent FEVTDEBUGHLT \ + --runUnscheduled \ + -s RAW2DIGI,L1Reco,RECO,RECOSIM \ + --datatier GEN-SIM-RECO \ + --geometry DB:Extended \ + --no_exec \ + --filein file:step2_phase1_new.root \ + --fileout step3_phase1_new.root \ + --customise Validation/RecoParticleFlow/customize_pfanalysis.customize_step3 \ + --python_filename=step3_phase1_new.py + +pwd +ls -lrt + +echo "process.RandomNumberGeneratorService.generator.initialSeed = $SEED" >> step2_phase1_new.py +cmsRun step2_phase1_new.py > /dev/null +cp step2_phase1_new.root $OUTDIR/$SAMPLE/root/step2_${SEED}.root + +cmsRun step3_phase1_new.py > /dev/null +cp pfntuple.root $OUTDIR/$SAMPLE/root/pfntuple_${SEED}.root + +rm -Rf /scratch/local/joosep/$SLURM_JOBID diff --git a/mlpf/data/cms/prepare_args_val.py b/mlpf/data/cms/prepare_args_val.py index e78c015c2..8d263ddce 100644 --- a/mlpf/data/cms/prepare_args_val.py +++ b/mlpf/data/cms/prepare_args_val.py @@ -3,15 +3,16 @@ import os -outdir = "/local/joosep/mlpf/cms/20250618_cmssw_15_0_5_f8ae2f/" +outdir = "/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/" samples = [ - ("QCDForPF_13p6TeV_TuneCUETP8M1_cfi", 700000, 710050, "genjob_pu55to75_val.sh", outdir + "/pu55to75_val"), - ("QCDForPF_13p6TeV_TuneCUETP8M1_cfi", 700000, 702050, "genjob_nopu_val.sh", outdir + "/nopu_val"), - ("TTbar_13p6TeV_TuneCUETP8M1_cfi", 800000, 802050, "genjob_pu55to75_val.sh", outdir + "/pu55to75_val"), - ("TTbar_13p6TeV_TuneCUETP8M1_cfi", 800000, 802050, "genjob_nopu_val.sh", outdir + "/nopu_val"), - ("PhotonJet_Pt_10_13p6TeV_TuneCUETP8M1_cfi", 900000, 902050, "genjob_pu55to75_val.sh", outdir + "/pu55to75_val"), - ("PhotonJet_Pt_10_13p6TeV_TuneCUETP8M1_cfi", 900000, 902050, "genjob_nopu_val.sh", outdir + "/nopu_val"), + ("QCDForPF_13p6TeV_TuneCUETP8M1_cfi", 700000, 701050, "genjob_pu55to75_val_v3.sh", outdir + "/pu55to75_val"), + # ("QCDForPF_13p6TeV_TuneCUETP8M1_cfi", 700000, 710050, "genjob_pu55to75_val.sh", outdir + "/pu55to75_val"), + # ("QCDForPF_13p6TeV_TuneCUETP8M1_cfi", 700000, 702050, "genjob_nopu_val.sh", outdir + "/nopu_val"), + # ("TTbar_13p6TeV_TuneCUETP8M1_cfi", 800000, 802050, "genjob_pu55to75_val.sh", outdir + "/pu55to75_val"), + # ("TTbar_13p6TeV_TuneCUETP8M1_cfi", 800000, 802050, "genjob_nopu_val.sh", outdir + "/nopu_val"), + # ("PhotonJet_Pt_10_13p6TeV_TuneCUETP8M1_cfi", 900000, 902050, "genjob_pu55to75_val.sh", outdir + "/pu55to75_val"), + # ("PhotonJet_Pt_10_13p6TeV_TuneCUETP8M1_cfi", 900000, 902050, "genjob_nopu_val.sh", outdir + "/nopu_val"), ] if __name__ == "__main__": diff --git a/mlpf/data/cms/pu_files_local_val2.txt b/mlpf/data/cms/pu_files_local_val2.txt new file mode 100644 index 000000000..b253b8762 --- /dev/null +++ b/mlpf/data/cms/pu_files_local_val2.txt @@ -0,0 +1,100 @@ +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/868bd0fc-ab87-4836-987a-009a89334314.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/254b8626-0a60-4f76-84bc-528ed9bf4028.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/6c7034d9-bab5-499f-ac2b-0d2dad0fc831.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/4c4502f0-4622-44c7-b30e-d39fe3e1bbd5.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/eb4ea6a0-53b3-41fa-bb26-4694612bd38e.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/abe960a7-cc73-4c2d-8dd0-7a34610fecfd.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/6bcbcb1a-7736-4c7b-b925-7aedf087fd0c.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/e3b50d04-c783-4d10-9412-0b862fff9397.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/4553d463-7ab4-4174-9a49-606e084fb6d7.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/7f5fdf57-d9f0-4ab8-8d27-c55cc05f6a10.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/20e67f0e-7c7d-4ab1-8ee8-83f3054a9b64.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/ca9cbc2f-ecf8-4e4c-96ca-8db9376b667a.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/7cdca843-6e7c-427a-996c-dbc2c93a7cbe.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/cd37e663-8809-45b4-956d-86ab9faf15f8.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/c1ec3eed-ae1d-4112-bdf5-93124e0058d0.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/3ca37924-5eb9-4681-8fed-59ea7af93004.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/f0397197-d51c-419e-8d79-40b8a38ae84f.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/3afb2c5d-6048-41c4-b509-1c588ff22c4a.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/e55fda6e-f4d0-4b2e-a9be-fd2dc6b0d54f.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/284f4d3b-7959-4070-a004-24f28f186a29.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/eed965e8-c16e-4ca7-95f4-7f9244ebd7f0.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/f76535f4-1e3d-4538-bcf9-3be725ad4c89.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/92f58fd0-cc55-4cc0-8130-041f6ae97221.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/0b908e5a-bccf-40d3-acf8-4995e08bb931.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/a27f46f2-424f-4ea1-98b0-d8626711195a.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/e2fda9eb-8cda-42e2-960b-e67b8398ad38.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/6068febc-17b6-4c7d-b1c2-3ef5e455cf47.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/5642b79a-32f3-4b6d-9be2-640bd2a5e8a2.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/2a3a0054-e344-4f21-a564-cb370801ddf7.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/569bf4c4-e68c-4361-bc96-f0ddf0d790a1.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/4941d073-9cd1-49b9-9d45-eb320b063c14.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/e54b0c5d-6111-4767-9408-da23a689217f.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/e351a3be-8316-48aa-82a3-f6c2605a8fc4.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/8599020b-2e11-4599-a187-98010da229cb.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/9ef49fc3-b6aa-471c-8959-e5fbf737f4f4.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/ea5a885c-371f-4e0d-b88c-a503b6ae9639.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/a8b37365-46c8-499a-9e81-ebaa445a05c5.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/7a5e7c7c-35a7-4287-9538-1aa4e9aa7254.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/adbb2885-f619-4a2e-807e-3e5691151577.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/aa33c777-c202-4285-bc91-73c69fa6755f.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/4a3c24f8-a4e0-46a0-84cb-57d67efb7111.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/ace54945-77a7-4ffd-a024-f2f237ccd021.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/6afe44e0-690b-4634-a32c-ebd705cbfd07.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/44c88040-2361-43a9-bbe4-a5b014f4f2e5.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/6a18dbd4-1741-40fa-bca4-7fe021832d52.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/1f141624-c992-443e-a328-31b5cf75e18e.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/06241e2f-9c12-4d18-9aa7-e60b1ece1cee.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/d54ba98f-990a-43eb-9137-80a46570d398.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/517694e4-12d7-44ec-98ac-85414f9d9b26.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/8ec67618-7494-43ca-992d-d738dc904e5c.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/473acffa-0691-4d57-b354-1b18fc80da49.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/b23f0226-8424-49cf-bd19-9eaf50030c2e.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/39ea49f7-6464-4864-a889-eb2eb688f9da.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/498fd9e9-bc25-42d8-a32f-d613965d85f1.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/c39c4355-95c3-42dc-a8e5-f047a5eb4a3e.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/2f05df1d-91b2-4ae2-be05-e93d4e780cd1.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/ab1ebb2e-a10e-405a-a732-be8bb9413212.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/41d2d282-cced-4197-a0ef-9a51cc9f036d.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/1d5248aa-c06a-4246-9aaa-7877d26f7770.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/2e9ab8db-fa66-4660-836c-6e6cd6420862.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/4f40ca1c-6634-43c4-a1c1-61e5bc8450c6.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/363d5f69-3331-404d-a2aa-24277a5b62bd.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/ceb90e16-3231-48f0-8a79-d9ae00200672.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/e928d6a2-5952-45cf-ac72-a2cc5cd5f16e.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/c9bdc242-b9c8-43fa-b3df-a67dbd958e30.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/d15a342a-9303-4697-ab2b-903514be1f73.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/16494d37-5116-4faa-b7d5-b8b8cd8476a7.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/1e5ec87c-83a0-4144-b451-b6efe00e2a2f.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/c9f047d1-bdba-4050-9b57-79cd9b727720.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/049294f5-fd84-4270-991d-0c0ab4efe65f.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/6a5ba4cb-6010-4b9b-ac2d-78c699dc6579.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/4dbc3bb2-da2e-451b-9fa4-6de8920c0385.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/e2bf6238-b81a-4bc6-bad7-4e76d5877793.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/8949ce13-468c-4a4e-a1bc-84060a9798b8.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/e11018c2-1a8f-4e58-b29a-0c751687e9c8.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/d52c2280-e636-4e64-b941-db16379b7131.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/1c9f9ce0-dca1-47d1-a267-4369a06e8b21.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/1af3d728-9a4e-4b13-867e-941f3a44af5e.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/b31c6e0e-4192-4767-bd26-802c94f31f86.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/635c713a-0a53-46d0-9c84-2ecdf55a84a9.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/9d8d134e-8caf-4300-8571-400efdbadc56.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/f1dca930-ee74-41cd-9b24-c64c662b5443.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/c374f9d8-ef17-4cde-8096-1744166aeb97.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/d16b02b3-a586-458b-b6ad-75fc8b982ce9.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/8f52e12e-a328-4f38-a18a-0b2461efbb5d.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/89aa992b-9137-4f26-9ac0-6f2419a42525.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/a3d432d0-360f-4ccd-a1b3-540a8246a74c.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/36abce8c-280e-42cc-813a-946e581719e1.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/33f8bbfc-8463-4ad3-8e49-ab45aaaf70de.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/bc118829-386b-4acd-9dbb-0fb06f4eb1c3.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/0e917484-df18-4c46-a0b6-3732d9e8b327.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/a447a799-e2d0-46bc-ae96-2d28ceeb85b1.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/3f0a96c3-ae9a-42f3-b580-6b9d2ed2c3a9.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/f28a4189-6027-4bd6-b228-faac9834258a.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/8327e4f9-ad29-40c3-a192-def18506baa2.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/1e3e734f-b28f-4a71-8ec1-b5a88c780f00.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/600431e5-05a0-47f5-b429-9141ebd817b9.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/6deeba91-1221-43ac-a2a0-2dc16bdaed1a.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/58a44ed4-2500-4553-9539-801abf929ecc.root +file:/local/joosep/cms/store/mc/RunIII2024Summer24GS/MinBias_TuneCP5_13p6TeV-pythia8/GEN-SIM/140X_mcRun3_2024_realistic_v20-v1/120000/02813942-aba2-41a6-9427-31db9b0374cf.root diff --git a/mlpf/heptfds/cld_pf_edm4hep/ttbar.py b/mlpf/heptfds/cld_pf_edm4hep/ttbar.py index fd0dc776c..3b94be629 100644 --- a/mlpf/heptfds/cld_pf_edm4hep/ttbar.py +++ b/mlpf/heptfds/cld_pf_edm4hep/ttbar.py @@ -1,6 +1,6 @@ from pathlib import Path -import tensorflow as tf +import numpy as np import tensorflow_datasets as tfds from utils_edm import ( NUM_SPLITS, @@ -56,13 +56,13 @@ def _info(self) -> tfds.core.DatasetInfo: None, max(len(X_FEATURES_TRK), len(X_FEATURES_CL)), ), - dtype=tf.float32, + dtype=np.float32, ), - "ytarget": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), - "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), - "genmet": tfds.features.Scalar(dtype=tf.float32), - "genjets": tfds.features.Tensor(shape=(None, 4), dtype=tf.float32), - "targetjets": tfds.features.Tensor(shape=(None, 4), dtype=tf.float32), + "ytarget": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), + "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), + "genmet": tfds.features.Scalar(dtype=np.float32), + "genjets": tfds.features.Tensor(shape=(None, 4), dtype=np.float32), + "targetjets": tfds.features.Tensor(shape=(None, 4), dtype=np.float32), } ), supervised_keys=None, diff --git a/mlpf/heptfds/clic_pf_edm4hep/gamma.py b/mlpf/heptfds/clic_pf_edm4hep/gamma.py index 5d7e8360e..a94c286ba 100644 --- a/mlpf/heptfds/clic_pf_edm4hep/gamma.py +++ b/mlpf/heptfds/clic_pf_edm4hep/gamma.py @@ -1,6 +1,6 @@ from pathlib import Path -import tensorflow as tf +import numpy as np import tensorflow_datasets as tfds from utils_edm import ( NUM_SPLITS, @@ -56,13 +56,13 @@ def _info(self) -> tfds.core.DatasetInfo: None, max(len(X_FEATURES_TRK), len(X_FEATURES_CL)), ), - dtype=tf.float32, + dtype=np.float32, ), - "ytarget": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), - "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), - "genmet": tfds.features.Scalar(dtype=tf.float32), - "genjets": tfds.features.Tensor(shape=(None, 4), dtype=tf.float32), - "targetjets": tfds.features.Tensor(shape=(None, 4), dtype=tf.float32), + "ytarget": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), + "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), + "genmet": tfds.features.Scalar(dtype=np.float32), + "genjets": tfds.features.Tensor(shape=(None, 4), dtype=np.float32), + "targetjets": tfds.features.Tensor(shape=(None, 4), dtype=np.float32), } ), homepage="https://github.com/jpata/particleflow", diff --git a/mlpf/heptfds/clic_pf_edm4hep/qq.py b/mlpf/heptfds/clic_pf_edm4hep/qq.py index 88aaff67a..ccd8817f3 100644 --- a/mlpf/heptfds/clic_pf_edm4hep/qq.py +++ b/mlpf/heptfds/clic_pf_edm4hep/qq.py @@ -1,6 +1,6 @@ from pathlib import Path -import tensorflow as tf +import numpy as np from utils_edm import X_FEATURES_CL, X_FEATURES_TRK, Y_FEATURES, generate_examples, split_sample, NUM_SPLITS import tensorflow_datasets as tfds @@ -61,13 +61,13 @@ def _info(self) -> tfds.core.DatasetInfo: None, max(len(X_FEATURES_TRK), len(X_FEATURES_CL)), ), - dtype=tf.float32, + dtype=np.float32, ), - "ytarget": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), - "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), - "genmet": tfds.features.Scalar(dtype=tf.float32), - "genjets": tfds.features.Tensor(shape=(None, 4), dtype=tf.float32), - "targetjets": tfds.features.Tensor(shape=(None, 4), dtype=tf.float32), + "ytarget": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), + "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), + "genmet": tfds.features.Scalar(dtype=np.float32), + "genjets": tfds.features.Tensor(shape=(None, 4), dtype=np.float32), + "targetjets": tfds.features.Tensor(shape=(None, 4), dtype=np.float32), } ), homepage="https://github.com/jpata/particleflow", diff --git a/mlpf/heptfds/clic_pf_edm4hep/ttbar.py b/mlpf/heptfds/clic_pf_edm4hep/ttbar.py index fbc83e427..5443bbe39 100644 --- a/mlpf/heptfds/clic_pf_edm4hep/ttbar.py +++ b/mlpf/heptfds/clic_pf_edm4hep/ttbar.py @@ -1,6 +1,6 @@ from pathlib import Path -import tensorflow as tf +import numpy as np from utils_edm import X_FEATURES_CL, X_FEATURES_TRK, Y_FEATURES, generate_examples, split_sample, NUM_SPLITS import tensorflow_datasets as tfds @@ -60,13 +60,13 @@ def _info(self) -> tfds.core.DatasetInfo: None, max(len(X_FEATURES_TRK), len(X_FEATURES_CL)), ), - dtype=tf.float32, + dtype=np.float32, ), - "ytarget": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), - "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), - "genmet": tfds.features.Scalar(dtype=tf.float32), - "genjets": tfds.features.Tensor(shape=(None, 4), dtype=tf.float32), - "targetjets": tfds.features.Tensor(shape=(None, 4), dtype=tf.float32), + "ytarget": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), + "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), + "genmet": tfds.features.Scalar(dtype=np.float32), + "genjets": tfds.features.Tensor(shape=(None, 4), dtype=np.float32), + "targetjets": tfds.features.Tensor(shape=(None, 4), dtype=np.float32), } ), homepage="https://github.com/jpata/particleflow", diff --git a/mlpf/heptfds/clic_pf_edm4hep/ttbar_pu10.py b/mlpf/heptfds/clic_pf_edm4hep/ttbar_pu10.py index 3c79e04db..e511bf064 100644 --- a/mlpf/heptfds/clic_pf_edm4hep/ttbar_pu10.py +++ b/mlpf/heptfds/clic_pf_edm4hep/ttbar_pu10.py @@ -1,6 +1,6 @@ from pathlib import Path -import tensorflow as tf +import numpy as np from utils_edm import ( X_FEATURES_CL, X_FEATURES_TRK, @@ -56,10 +56,10 @@ def _info(self) -> tfds.core.DatasetInfo: None, max(len(X_FEATURES_TRK), len(X_FEATURES_CL)), ), - dtype=tf.float32, + dtype=np.float32, ), - "ygen": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), - "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), + "ygen": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), + "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), } ), supervised_keys=None, diff --git a/mlpf/heptfds/clic_pf_edm4hep/ww_fullhad.py b/mlpf/heptfds/clic_pf_edm4hep/ww_fullhad.py index a2e8af850..9245f14aa 100644 --- a/mlpf/heptfds/clic_pf_edm4hep/ww_fullhad.py +++ b/mlpf/heptfds/clic_pf_edm4hep/ww_fullhad.py @@ -1,6 +1,6 @@ from pathlib import Path -import tensorflow as tf +import numpy as np from utils_edm import X_FEATURES_CL, X_FEATURES_TRK, Y_FEATURES, generate_examples, split_sample, NUM_SPLITS import tensorflow_datasets as tfds @@ -56,13 +56,13 @@ def _info(self) -> tfds.core.DatasetInfo: None, max(len(X_FEATURES_TRK), len(X_FEATURES_CL)), ), - dtype=tf.float32, + dtype=np.float32, ), - "ytarget": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), - "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), - "genmet": tfds.features.Scalar(dtype=tf.float32), - "genjets": tfds.features.Tensor(shape=(None, 4), dtype=tf.float32), - "targetjets": tfds.features.Tensor(shape=(None, 4), dtype=tf.float32), + "ytarget": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), + "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), + "genmet": tfds.features.Scalar(dtype=np.float32), + "genjets": tfds.features.Tensor(shape=(None, 4), dtype=np.float32), + "targetjets": tfds.features.Tensor(shape=(None, 4), dtype=np.float32), } ), homepage="https://github.com/jpata/particleflow", diff --git a/mlpf/heptfds/clic_pf_edm4hep_hits/qq.py b/mlpf/heptfds/clic_pf_edm4hep_hits/qq.py index adbaf782d..fbaf112a4 100644 --- a/mlpf/heptfds/clic_pf_edm4hep_hits/qq.py +++ b/mlpf/heptfds/clic_pf_edm4hep_hits/qq.py @@ -1,6 +1,6 @@ from pathlib import Path -import tensorflow as tf +import numpy as np from utils_edm import ( X_FEATURES_CH, X_FEATURES_TRK, @@ -58,10 +58,10 @@ def _info(self) -> tfds.core.DatasetInfo: None, max(len(X_FEATURES_TRK), len(X_FEATURES_CH)), ), - dtype=tf.float32, + dtype=np.float32, ), - "ygen": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), - "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), + "ygen": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), + "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), } ), supervised_keys=None, diff --git a/mlpf/heptfds/clic_pf_edm4hep_hits/qq_10k.py b/mlpf/heptfds/clic_pf_edm4hep_hits/qq_10k.py index d0a21ee60..29a721727 100644 --- a/mlpf/heptfds/clic_pf_edm4hep_hits/qq_10k.py +++ b/mlpf/heptfds/clic_pf_edm4hep_hits/qq_10k.py @@ -1,6 +1,6 @@ from pathlib import Path -import tensorflow as tf +import numpy as np from utils_edm import ( X_FEATURES_CH, X_FEATURES_TRK, @@ -42,10 +42,10 @@ def _info(self) -> tfds.core.DatasetInfo: None, max(len(X_FEATURES_TRK), len(X_FEATURES_CH)), ), - dtype=tf.float32, + dtype=np.float32, ), - "ygen": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), - "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), + "ygen": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), + "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), } ), supervised_keys=None, diff --git a/mlpf/heptfds/clic_pf_edm4hep_hits/single_ele.py b/mlpf/heptfds/clic_pf_edm4hep_hits/single_ele.py index 9d6978724..04812410c 100644 --- a/mlpf/heptfds/clic_pf_edm4hep_hits/single_ele.py +++ b/mlpf/heptfds/clic_pf_edm4hep_hits/single_ele.py @@ -1,6 +1,6 @@ from pathlib import Path -import tensorflow as tf +import numpy as np from utils_edm import ( X_FEATURES_CH, X_FEATURES_TRK, @@ -56,10 +56,10 @@ def _info(self) -> tfds.core.DatasetInfo: None, max(len(X_FEATURES_TRK), len(X_FEATURES_CH)), ), - dtype=tf.float32, + dtype=np.float32, ), - "ygen": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), - "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), + "ygen": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), + "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), } ), supervised_keys=None, diff --git a/mlpf/heptfds/clic_pf_edm4hep_hits/single_gamma.py b/mlpf/heptfds/clic_pf_edm4hep_hits/single_gamma.py index ad4a0e018..43e6c6738 100644 --- a/mlpf/heptfds/clic_pf_edm4hep_hits/single_gamma.py +++ b/mlpf/heptfds/clic_pf_edm4hep_hits/single_gamma.py @@ -1,6 +1,6 @@ from pathlib import Path -import tensorflow as tf +import numpy as np from utils_edm import ( X_FEATURES_CH, X_FEATURES_TRK, @@ -56,10 +56,10 @@ def _info(self) -> tfds.core.DatasetInfo: None, max(len(X_FEATURES_TRK), len(X_FEATURES_CH)), ), - dtype=tf.float32, + dtype=np.float32, ), - "ygen": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), - "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), + "ygen": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), + "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), } ), supervised_keys=None, diff --git a/mlpf/heptfds/clic_pf_edm4hep_hits/single_kaon0L.py b/mlpf/heptfds/clic_pf_edm4hep_hits/single_kaon0L.py index 1edda0adc..89533e2a1 100644 --- a/mlpf/heptfds/clic_pf_edm4hep_hits/single_kaon0L.py +++ b/mlpf/heptfds/clic_pf_edm4hep_hits/single_kaon0L.py @@ -1,6 +1,6 @@ from pathlib import Path -import tensorflow as tf +import numpy as np from utils_edm import ( X_FEATURES_CH, X_FEATURES_TRK, @@ -56,10 +56,10 @@ def _info(self) -> tfds.core.DatasetInfo: None, max(len(X_FEATURES_TRK), len(X_FEATURES_CH)), ), - dtype=tf.float32, + dtype=np.float32, ), - "ygen": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), - "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), + "ygen": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), + "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), } ), supervised_keys=None, diff --git a/mlpf/heptfds/clic_pf_edm4hep_hits/single_mu.py b/mlpf/heptfds/clic_pf_edm4hep_hits/single_mu.py index 37abbb3fc..03235a5df 100644 --- a/mlpf/heptfds/clic_pf_edm4hep_hits/single_mu.py +++ b/mlpf/heptfds/clic_pf_edm4hep_hits/single_mu.py @@ -1,6 +1,6 @@ from pathlib import Path -import tensorflow as tf +import numpy as np from utils_edm import ( X_FEATURES_CH, X_FEATURES_TRK, @@ -56,10 +56,10 @@ def _info(self) -> tfds.core.DatasetInfo: None, max(len(X_FEATURES_TRK), len(X_FEATURES_CH)), ), - dtype=tf.float32, + dtype=np.float32, ), - "ygen": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), - "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), + "ygen": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), + "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), } ), supervised_keys=None, diff --git a/mlpf/heptfds/clic_pf_edm4hep_hits/single_neutron.py b/mlpf/heptfds/clic_pf_edm4hep_hits/single_neutron.py index 6ad530258..046396aab 100644 --- a/mlpf/heptfds/clic_pf_edm4hep_hits/single_neutron.py +++ b/mlpf/heptfds/clic_pf_edm4hep_hits/single_neutron.py @@ -1,6 +1,6 @@ from pathlib import Path -import tensorflow as tf +import numpy as np from utils_edm import ( X_FEATURES_CH, X_FEATURES_TRK, @@ -56,10 +56,10 @@ def _info(self) -> tfds.core.DatasetInfo: None, max(len(X_FEATURES_TRK), len(X_FEATURES_CH)), ), - dtype=tf.float32, + dtype=np.float32, ), - "ygen": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), - "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), + "ygen": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), + "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), } ), supervised_keys=None, diff --git a/mlpf/heptfds/clic_pf_edm4hep_hits/single_pi.py b/mlpf/heptfds/clic_pf_edm4hep_hits/single_pi.py index 33d498b51..cd12b49d1 100644 --- a/mlpf/heptfds/clic_pf_edm4hep_hits/single_pi.py +++ b/mlpf/heptfds/clic_pf_edm4hep_hits/single_pi.py @@ -1,6 +1,6 @@ from pathlib import Path -import tensorflow as tf +import numpy as np from utils_edm import ( X_FEATURES_CH, X_FEATURES_TRK, @@ -56,10 +56,10 @@ def _info(self) -> tfds.core.DatasetInfo: None, max(len(X_FEATURES_TRK), len(X_FEATURES_CH)), ), - dtype=tf.float32, + dtype=np.float32, ), - "ygen": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), - "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), + "ygen": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), + "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), } ), supervised_keys=None, diff --git a/mlpf/heptfds/clic_pf_edm4hep_hits/single_pi0.py b/mlpf/heptfds/clic_pf_edm4hep_hits/single_pi0.py index 6a9694007..92cf40cf2 100644 --- a/mlpf/heptfds/clic_pf_edm4hep_hits/single_pi0.py +++ b/mlpf/heptfds/clic_pf_edm4hep_hits/single_pi0.py @@ -1,6 +1,6 @@ from pathlib import Path -import tensorflow as tf +import numpy as np from utils_edm import ( X_FEATURES_CH, X_FEATURES_TRK, @@ -56,10 +56,10 @@ def _info(self) -> tfds.core.DatasetInfo: None, max(len(X_FEATURES_TRK), len(X_FEATURES_CH)), ), - dtype=tf.float32, + dtype=np.float32, ), - "ygen": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), - "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), + "ygen": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), + "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), } ), supervised_keys=None, diff --git a/mlpf/heptfds/clic_pf_edm4hep_hits/ttbar.py b/mlpf/heptfds/clic_pf_edm4hep_hits/ttbar.py index 0d7832737..5f837b5a4 100644 --- a/mlpf/heptfds/clic_pf_edm4hep_hits/ttbar.py +++ b/mlpf/heptfds/clic_pf_edm4hep_hits/ttbar.py @@ -1,6 +1,6 @@ from pathlib import Path -import tensorflow as tf +import numpy as np from utils_edm import ( X_FEATURES_CH, X_FEATURES_TRK, @@ -58,10 +58,10 @@ def _info(self) -> tfds.core.DatasetInfo: None, max(len(X_FEATURES_TRK), len(X_FEATURES_CH)), ), - dtype=tf.float32, + dtype=np.float32, ), - "ygen": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), - "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), + "ygen": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), + "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), } ), supervised_keys=None, diff --git a/mlpf/heptfds/clic_pf_edm4hep_hits/ttbar_10k.py b/mlpf/heptfds/clic_pf_edm4hep_hits/ttbar_10k.py index 6ffad1784..1d79c5f4d 100644 --- a/mlpf/heptfds/clic_pf_edm4hep_hits/ttbar_10k.py +++ b/mlpf/heptfds/clic_pf_edm4hep_hits/ttbar_10k.py @@ -1,6 +1,6 @@ from pathlib import Path -import tensorflow as tf +import numpy as np from utils_edm import ( X_FEATURES_CH, X_FEATURES_TRK, @@ -42,10 +42,10 @@ def _info(self) -> tfds.core.DatasetInfo: None, max(len(X_FEATURES_TRK), len(X_FEATURES_CH)), ), - dtype=tf.float32, + dtype=np.float32, ), - "ygen": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), - "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), + "ygen": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), + "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), } ), supervised_keys=None, diff --git a/mlpf/heptfds/cms_pf/cms_utils.py b/mlpf/heptfds/cms_pf/cms_utils.py index bc42fc470..4b60a8709 100644 --- a/mlpf/heptfds/cms_pf/cms_utils.py +++ b/mlpf/heptfds/cms_pf/cms_utils.py @@ -149,6 +149,7 @@ def prepare_data_cms(fn): genmets = [] genjets = [] targetjets = [] + ypythias = [] try: if fn.endswith(".pkl"): @@ -166,6 +167,7 @@ def prepare_data_cms(fn): genmet = event["genmet"][0][0] genjet = event["genjet"] targetjet = event["targetjet"] + ypythia = event["pythia"] # remove PS and BREM from inputs msk_ps = (Xelem["typ"] == 2) | (Xelem["typ"] == 3) | (Xelem["typ"] == 7) @@ -210,8 +212,9 @@ def prepare_data_cms(fn): genmets.append(genmet) genjets.append(genjet) targetjets.append(targetjet) + ypythias.append(ypythia) - return Xs, ytargets, ycands, genmets, genjets, targetjets + return Xs, ytargets, ycands, genmets, genjets, targetjets, ypythias def split_list(lst, x): @@ -251,7 +254,7 @@ def generate_examples(files): for fi in files: print(datetime.datetime.now(), "started reading file", fi) - Xs, ytargets, ycands, genmets, genjets, targetjets = prepare_data_cms(str(fi)) + Xs, ytargets, ycands, genmets, genjets, targetjets, ypythias = prepare_data_cms(str(fi)) if len(Xs) == 0: print("Error: file {} is broken".format(fi)) for ii in range(len(Xs)): @@ -261,6 +264,7 @@ def generate_examples(files): gm = genmets[ii].astype(np.float32) gj = genjets[ii].astype(np.float32) tj = targetjets[ii].astype(np.float32) + yp = ypythias[ii].astype(np.float32) uniqs, counts = np.unique(yg[:, 0], return_counts=True) - yield str(fi) + "_" + str(ii), {"X": x, "ytarget": yg, "ycand": yc, "genmet": gm, "genjets": gj, "targetjets": tj} + yield str(fi) + "_" + str(ii), {"X": x, "ytarget": yg, "ycand": yc, "genmet": gm, "genjets": gj, "targetjets": tj, "pythia": yp} diff --git a/mlpf/heptfds/cms_pf/qcd.py b/mlpf/heptfds/cms_pf/qcd.py index b64d0076e..0044d37e9 100644 --- a/mlpf/heptfds/cms_pf/qcd.py +++ b/mlpf/heptfds/cms_pf/qcd.py @@ -1,7 +1,7 @@ """CMS PF QCD dataset.""" import cms_utils -import tensorflow as tf +import numpy as np import tensorflow_datasets as tfds X_FEATURES = cms_utils.X_FEATURES @@ -21,7 +21,7 @@ class CmsPfQcd(tfds.core.GeneratorBasedBuilder): """DatasetBuilder for cms_pf_qcd dataset.""" - VERSION = tfds.core.Version("2.7.1") + VERSION = tfds.core.Version("2.8.0") RELEASE_NOTES = { "1.3.0": "12_2_0_pre2 generation with updated caloparticle/trackingparticle", "1.3.1": "Remove PS again", @@ -40,6 +40,7 @@ class CmsPfQcd(tfds.core.GeneratorBasedBuilder): "2.6.0": "Regenerate with 20250508_cmssw_15_0_5_d3c6d1", "2.7.0": "Remove split_caloparticle", "2.7.1": "Use fixed split_caloparticle", + "2.8.0": "Add Pythia", } MANUAL_DOWNLOAD_INSTRUCTIONS = """ rsync -r --progress lxplus.cern.ch:/eos/user/j/jpata/mlpf/tensorflow_datasets/cms/cms_pf_qcd ~/tensorflow_datasets/ @@ -59,12 +60,13 @@ def _info(self) -> tfds.core.DatasetInfo: description=_DESCRIPTION, features=tfds.features.FeaturesDict( { - "X": tfds.features.Tensor(shape=(None, len(X_FEATURES)), dtype=tf.float32), - "ytarget": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), - "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), - "genmet": tfds.features.Scalar(dtype=tf.float32), - "genjets": tfds.features.Tensor(shape=(None, 4), dtype=tf.float32), - "targetjets": tfds.features.Tensor(shape=(None, 4), dtype=tf.float32), + "X": tfds.features.Tensor(shape=(None, len(X_FEATURES)), dtype=np.float32), + "ytarget": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), + "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), + "genmet": tfds.features.Scalar(dtype=np.float32), + "genjets": tfds.features.Tensor(shape=(None, 4), dtype=np.float32), + "targetjets": tfds.features.Tensor(shape=(None, 4), dtype=np.float32), + "pythia": tfds.features.Tensor(shape=(None, 5), dtype=np.float32), } ), homepage="https://github.com/jpata/particleflow", diff --git a/mlpf/heptfds/cms_pf/qcd_13p6.py b/mlpf/heptfds/cms_pf/qcd_13p6.py index 1737005eb..236c627e2 100644 --- a/mlpf/heptfds/cms_pf/qcd_13p6.py +++ b/mlpf/heptfds/cms_pf/qcd_13p6.py @@ -1,7 +1,7 @@ """CMS PF QCD 13p6 dataset.""" import cms_utils -import tensorflow as tf +import numpy as np import tensorflow_datasets as tfds X_FEATURES = cms_utils.X_FEATURES @@ -20,9 +20,10 @@ class CmsPfQcd13p6(tfds.core.GeneratorBasedBuilder): """DatasetBuilder for cms_pf_qcd dataset.""" - VERSION = tfds.core.Version("2.6.0") + VERSION = tfds.core.Version("2.8.0") RELEASE_NOTES = { "2.6.0": "First version", + "2.8.0": "Add Pythia", } MANUAL_DOWNLOAD_INSTRUCTIONS = """ rsync -r --progress lxplus.cern.ch:/eos/user/j/jpata/mlpf/tensorflow_datasets/cms/cms_pf_qcd ~/tensorflow_datasets/ @@ -42,12 +43,12 @@ def _info(self) -> tfds.core.DatasetInfo: description=_DESCRIPTION, features=tfds.features.FeaturesDict( { - "X": tfds.features.Tensor(shape=(None, len(X_FEATURES)), dtype=tf.float32), - "ytarget": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), - "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), - "genmet": tfds.features.Scalar(dtype=tf.float32), - "genjets": tfds.features.Tensor(shape=(None, 4), dtype=tf.float32), - "targetjets": tfds.features.Tensor(shape=(None, 4), dtype=tf.float32), + "X": tfds.features.Tensor(shape=(None, len(X_FEATURES)), dtype=np.float32), + "ytarget": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), + "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), + "genmet": tfds.features.Scalar(dtype=np.float32), + "genjets": tfds.features.Tensor(shape=(None, 4), dtype=np.float32), + "targetjets": tfds.features.Tensor(shape=(None, 4), dtype=np.float32), } ), homepage="https://github.com/jpata/particleflow", diff --git a/mlpf/heptfds/cms_pf/qcd_nopu.py b/mlpf/heptfds/cms_pf/qcd_nopu.py index 49f16f2ff..b089a79a1 100644 --- a/mlpf/heptfds/cms_pf/qcd_nopu.py +++ b/mlpf/heptfds/cms_pf/qcd_nopu.py @@ -1,7 +1,7 @@ """CMS PF TTbar dataset.""" import cms_utils -import tensorflow as tf +import numpy as np import tensorflow_datasets as tfds @@ -22,7 +22,7 @@ class CmsPfQcdNopu(tfds.core.GeneratorBasedBuilder): """DatasetBuilder for cms_pf_qcd_nopu dataset.""" - VERSION = tfds.core.Version("2.7.2") + VERSION = tfds.core.Version("2.8.0") RELEASE_NOTES = { "2.0.0": "New truth def based primarily on CaloParticles", "2.4.0": "Add gp_to_track, gp_to_cluster, jet_idx", @@ -32,6 +32,7 @@ class CmsPfQcdNopu(tfds.core.GeneratorBasedBuilder): "2.7.0": "Remove split_caloparticle", "2.7.1": "Use fixed split_caloparticle", "2.7.2": "Bump stats to 20M", + "2.8.0": "Add Pythia", } MANUAL_DOWNLOAD_INSTRUCTIONS = """ rsync -r --progress lxplus.cern.ch:/eos/user/j/jpata/mlpf/tensorflow_datasets/cms/cms_pf_qcd_nopu ~/tensorflow_datasets/ @@ -51,12 +52,13 @@ def _info(self) -> tfds.core.DatasetInfo: description=_DESCRIPTION, features=tfds.features.FeaturesDict( { - "X": tfds.features.Tensor(shape=(None, len(X_FEATURES)), dtype=tf.float32), - "ytarget": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), - "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), - "genmet": tfds.features.Scalar(dtype=tf.float32), - "genjets": tfds.features.Tensor(shape=(None, 4), dtype=tf.float32), - "targetjets": tfds.features.Tensor(shape=(None, 4), dtype=tf.float32), + "X": tfds.features.Tensor(shape=(None, len(X_FEATURES)), dtype=np.float32), + "ytarget": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), + "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), + "genmet": tfds.features.Scalar(dtype=np.float32), + "genjets": tfds.features.Tensor(shape=(None, 4), dtype=np.float32), + "targetjets": tfds.features.Tensor(shape=(None, 4), dtype=np.float32), + "pythia": tfds.features.Tensor(shape=(None, 5), dtype=np.float32), } ), homepage="https://github.com/jpata/particleflow", diff --git a/mlpf/heptfds/cms_pf/singleele.py b/mlpf/heptfds/cms_pf/singleele.py index 291e05c57..e0ef36b97 100644 --- a/mlpf/heptfds/cms_pf/singleele.py +++ b/mlpf/heptfds/cms_pf/singleele.py @@ -1,7 +1,7 @@ """CMS PF SingleEle dataset.""" import cms_utils -import tensorflow as tf +import numpy as np import tensorflow_datasets as tfds X_FEATURES = cms_utils.X_FEATURES @@ -42,12 +42,13 @@ def _info(self) -> tfds.core.DatasetInfo: description=_DESCRIPTION, features=tfds.features.FeaturesDict( { - "X": tfds.features.Tensor(shape=(None, len(X_FEATURES)), dtype=tf.float32), - "ytarget": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), - "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), - "genmet": tfds.features.Scalar(dtype=tf.float32), - "genjets": tfds.features.Tensor(shape=(None, 4), dtype=tf.float32), - "targetjets": tfds.features.Tensor(shape=(None, 4), dtype=tf.float32), + "X": tfds.features.Tensor(shape=(None, len(X_FEATURES)), dtype=np.float32), + "ytarget": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), + "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), + "genmet": tfds.features.Scalar(dtype=np.float32), + "genjets": tfds.features.Tensor(shape=(None, 4), dtype=np.float32), + "targetjets": tfds.features.Tensor(shape=(None, 4), dtype=np.float32), + "pythia": tfds.features.Tensor(shape=(None, 5), dtype=np.float32), } ), homepage="https://github.com/jpata/particleflow", diff --git a/mlpf/heptfds/cms_pf/ttbar.py b/mlpf/heptfds/cms_pf/ttbar.py index 27762c72c..f95215f68 100644 --- a/mlpf/heptfds/cms_pf/ttbar.py +++ b/mlpf/heptfds/cms_pf/ttbar.py @@ -1,7 +1,7 @@ """CMS PF TTbar dataset.""" import cms_utils -import tensorflow as tf +import numpy as np import tensorflow_datasets as tfds X_FEATURES = cms_utils.X_FEATURES @@ -21,7 +21,7 @@ class CmsPfTtbar(tfds.core.GeneratorBasedBuilder, skip_registration=True): """DatasetBuilder for cms_pf_ttbar dataset.""" - VERSION = tfds.core.Version("2.7.1") + VERSION = tfds.core.Version("2.8.0") RELEASE_NOTES = { "1.0.0": "Initial release.", "1.1.0": "Add muon type, fix electron GSF association", @@ -45,6 +45,7 @@ class CmsPfTtbar(tfds.core.GeneratorBasedBuilder, skip_registration=True): "2.6.0": "Regenerate with 20250508_cmssw_15_0_5_d3c6d1", "2.7.0": "Remove split_caloparticle", "2.7.1": "Use fixed split_caloparticle", + "2.8.0": "Add Pythia", } MANUAL_DOWNLOAD_INSTRUCTIONS = """ rsync -r --progress lxplus.cern.ch:/eos/user/j/jpata/mlpf/tensorflow_datasets/cms/cms_pf_ttbar ~/tensorflow_datasets/ @@ -64,12 +65,13 @@ def _info(self) -> tfds.core.DatasetInfo: description=_DESCRIPTION, features=tfds.features.FeaturesDict( { - "X": tfds.features.Tensor(shape=(None, len(X_FEATURES)), dtype=tf.float32), - "ytarget": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), - "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), - "genmet": tfds.features.Scalar(dtype=tf.float32), - "genjets": tfds.features.Tensor(shape=(None, 4), dtype=tf.float32), - "targetjets": tfds.features.Tensor(shape=(None, 4), dtype=tf.float32), + "X": tfds.features.Tensor(shape=(None, len(X_FEATURES)), dtype=np.float32), + "ytarget": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), + "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), + "genmet": tfds.features.Scalar(dtype=np.float32), + "genjets": tfds.features.Tensor(shape=(None, 4), dtype=np.float32), + "targetjets": tfds.features.Tensor(shape=(None, 4), dtype=np.float32), + "pythia": tfds.features.Tensor(shape=(None, 5), dtype=np.float32), } ), homepage="https://github.com/jpata/particleflow", diff --git a/mlpf/heptfds/cms_pf/ttbar_nopu.py b/mlpf/heptfds/cms_pf/ttbar_nopu.py index 53863a147..25ac8ea60 100644 --- a/mlpf/heptfds/cms_pf/ttbar_nopu.py +++ b/mlpf/heptfds/cms_pf/ttbar_nopu.py @@ -1,7 +1,7 @@ """CMS PF TTbar dataset.""" import cms_utils -import tensorflow as tf +import numpy as np import tensorflow_datasets as tfds @@ -22,7 +22,7 @@ class CmsPfTtbarNopu(tfds.core.GeneratorBasedBuilder): """DatasetBuilder for cms_pf_ttbar_nopu dataset.""" - VERSION = tfds.core.Version("2.7.1") + VERSION = tfds.core.Version("2.8.0") RELEASE_NOTES = { "1.7.1": "First version", "1.8.0": "Add ispu, genjets, genmet; disable genjet_idx; improved merging", @@ -35,6 +35,7 @@ class CmsPfTtbarNopu(tfds.core.GeneratorBasedBuilder): "2.6.0": "Regenerate with 20250508_cmssw_15_0_5_d3c6d1", "2.7.0": "Remove split_caloparticle", "2.7.1": "Use fixed split_caloparticle", + "2.8.0": "Add Pythia", } MANUAL_DOWNLOAD_INSTRUCTIONS = """ rsync -r --progress lxplus.cern.ch:/eos/user/j/jpata/mlpf/tensorflow_datasets/cms/cms_pf_ttbar_nopu ~/tensorflow_datasets/ @@ -54,12 +55,13 @@ def _info(self) -> tfds.core.DatasetInfo: description=_DESCRIPTION, features=tfds.features.FeaturesDict( { - "X": tfds.features.Tensor(shape=(None, len(X_FEATURES)), dtype=tf.float32), - "ytarget": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), - "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), - "genmet": tfds.features.Scalar(dtype=tf.float32), - "genjets": tfds.features.Tensor(shape=(None, 4), dtype=tf.float32), - "targetjets": tfds.features.Tensor(shape=(None, 4), dtype=tf.float32), + "X": tfds.features.Tensor(shape=(None, len(X_FEATURES)), dtype=np.float32), + "ytarget": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), + "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), + "genmet": tfds.features.Scalar(dtype=np.float32), + "genjets": tfds.features.Tensor(shape=(None, 4), dtype=np.float32), + "targetjets": tfds.features.Tensor(shape=(None, 4), dtype=np.float32), + "pythia": tfds.features.Tensor(shape=(None, 5), dtype=np.float32), } ), homepage="https://github.com/jpata/particleflow", diff --git a/mlpf/heptfds/cms_pf/ztt.py b/mlpf/heptfds/cms_pf/ztt.py index ac1d36c25..702635b7c 100644 --- a/mlpf/heptfds/cms_pf/ztt.py +++ b/mlpf/heptfds/cms_pf/ztt.py @@ -1,7 +1,7 @@ """CMS PF TTbar dataset.""" import cms_utils -import tensorflow as tf +import numpy as np import tensorflow_datasets as tfds X_FEATURES = cms_utils.X_FEATURES @@ -21,13 +21,14 @@ class CmsPfZtt(tfds.core.GeneratorBasedBuilder, skip_registration=True): """DatasetBuilder for cms_pf_ztt dataset.""" - VERSION = tfds.core.Version("2.7.1") + VERSION = tfds.core.Version("2.8.0") RELEASE_NOTES = { "2.5.0": "Remove neutrinos from genjets, split to 10", "2.5.1": "Associate ele with GSF first", "2.6.0": "Regenerate with 20250508_cmssw_15_0_5_d3c6d1", "2.7.0": "Remove split_caloparticle", "2.7.1": "Use fixed split_caloparticle", + "2.8.0": "Add Pythia", } MANUAL_DOWNLOAD_INSTRUCTIONS = """ rsync -r --progress lxplus.cern.ch:/eos/user/j/jpata/mlpf/tensorflow_datasets/cms/cms_pf_ztt ~/tensorflow_datasets/ @@ -47,12 +48,13 @@ def _info(self) -> tfds.core.DatasetInfo: description=_DESCRIPTION, features=tfds.features.FeaturesDict( { - "X": tfds.features.Tensor(shape=(None, len(X_FEATURES)), dtype=tf.float32), - "ytarget": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), - "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), - "genmet": tfds.features.Scalar(dtype=tf.float32), - "genjets": tfds.features.Tensor(shape=(None, 4), dtype=tf.float32), - "targetjets": tfds.features.Tensor(shape=(None, 4), dtype=tf.float32), + "X": tfds.features.Tensor(shape=(None, len(X_FEATURES)), dtype=np.float32), + "ytarget": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), + "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), + "genmet": tfds.features.Scalar(dtype=np.float32), + "genjets": tfds.features.Tensor(shape=(None, 4), dtype=np.float32), + "targetjets": tfds.features.Tensor(shape=(None, 4), dtype=np.float32), + "pythia": tfds.features.Tensor(shape=(None, 5), dtype=np.float32), } ), homepage="https://github.com/jpata/particleflow", diff --git a/mlpf/heptfds/cms_pf/ztt_nopu.py b/mlpf/heptfds/cms_pf/ztt_nopu.py index 1eddb6437..de2f29240 100644 --- a/mlpf/heptfds/cms_pf/ztt_nopu.py +++ b/mlpf/heptfds/cms_pf/ztt_nopu.py @@ -1,7 +1,7 @@ """CMS PF TTbar dataset.""" import cms_utils -import tensorflow as tf +import numpy as np import tensorflow_datasets as tfds X_FEATURES = cms_utils.X_FEATURES @@ -21,13 +21,14 @@ class CmsPfZttNopu(tfds.core.GeneratorBasedBuilder): """DatasetBuilder for cms_pf_ztt_nopu dataset.""" - VERSION = tfds.core.Version("2.7.1") + VERSION = tfds.core.Version("2.8.0") RELEASE_NOTES = { "2.5.0": "Remove neutrinos from genjets, split to 10", "2.5.1": "Associate ele with GSF first", "2.6.0": "Regenerate with 20250508_cmssw_15_0_5_d3c6d1", "2.7.0": "Remove split_caloparticle", "2.7.1": "Use fixed split_caloparticle", + "2.8.0": "Add Pythia", } MANUAL_DOWNLOAD_INSTRUCTIONS = """ rsync -r --progress lxplus.cern.ch:/eos/user/j/jpata/mlpf/tensorflow_datasets/cms/cms_pf_ztt ~/tensorflow_datasets/ @@ -47,12 +48,13 @@ def _info(self) -> tfds.core.DatasetInfo: description=_DESCRIPTION, features=tfds.features.FeaturesDict( { - "X": tfds.features.Tensor(shape=(None, len(X_FEATURES)), dtype=tf.float32), - "ytarget": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), - "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=tf.float32), - "genmet": tfds.features.Scalar(dtype=tf.float32), - "genjets": tfds.features.Tensor(shape=(None, 4), dtype=tf.float32), - "targetjets": tfds.features.Tensor(shape=(None, 4), dtype=tf.float32), + "X": tfds.features.Tensor(shape=(None, len(X_FEATURES)), dtype=np.float32), + "ytarget": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), + "ycand": tfds.features.Tensor(shape=(None, len(Y_FEATURES)), dtype=np.float32), + "genmet": tfds.features.Scalar(dtype=np.float32), + "genjets": tfds.features.Tensor(shape=(None, 4), dtype=np.float32), + "targetjets": tfds.features.Tensor(shape=(None, 4), dtype=np.float32), + "pythia": tfds.features.Tensor(shape=(None, 5), dtype=np.float32), } ), homepage="https://github.com/jpata/particleflow", diff --git a/mlpf/model/logger.py b/mlpf/logger.py similarity index 64% rename from mlpf/model/logger.py rename to mlpf/logger.py index cf0614a19..28913ec53 100644 --- a/mlpf/model/logger.py +++ b/mlpf/logger.py @@ -1,4 +1,8 @@ import logging +import psutil +import shutil +import subprocess +import os from functools import lru_cache @@ -8,14 +12,15 @@ def _logging(rank, _logger, msg): _logger.info(msg) -def _configLogger(name, filename=None, loglevel=logging.INFO): +def _configLogger(name, rank=0, filename=None, loglevel=logging.INFO): # define a Handler which writes INFO messages or higher to the sys.stdout logger = logging.getLogger(name) logger.setLevel(loglevel) if filename: logfile = logging.FileHandler(filename) logfile.setLevel(loglevel) - logfile.setFormatter(logging.Formatter("[%(asctime)s] %(levelname)s: %(message)s")) + fmt = logging.Formatter(f"rank{rank} " + "[%(asctime)s] %(levelname)s : %(message)s") + logfile.setFormatter(fmt) logger.addHandler(logfile) @@ -75,3 +80,23 @@ def error(self, msg, *args, color=None, **kwargs): def warn_once(msg, logger=_logger): # Keep track of 10 different messages and then warn again logger.warning(msg) + + +def log_memory(stage, rank, tensorboard_writer=None, step=None): + process = psutil.Process(os.getpid()) + mem = process.memory_info() + _logger.debug(f"RAM memory usage at {stage} on rank {rank}: rss={mem.rss / 1024**2:.2f} MB, vms={mem.vms / 1024**2:.2f} MB") + if tensorboard_writer and step: + tensorboard_writer.add_scalar(f"memory/rss_MB/{stage}", mem.rss / 1024**2, step) + tensorboard_writer.add_scalar(f"memory/vms_MB/{stage}", mem.vms / 1024**2, step) + + +def log_smi(rank): + if (rank == 0) or (rank == "cpu"): + smi_command = shutil.which("nvidia-smi") or shutil.which("rocm-smi") + if smi_command: + try: + result = subprocess.run([smi_command], capture_output=True, text=True, check=True) + _logger.info(result.stdout) + except (subprocess.CalledProcessError, FileNotFoundError) as e: + _logger.info("SMI error: {}".format(e)) diff --git a/mlpf/model/PFDataset.py b/mlpf/model/PFDataset.py index 7e48258ca..3aadff3ba 100644 --- a/mlpf/model/PFDataset.py +++ b/mlpf/model/PFDataset.py @@ -6,7 +6,7 @@ import torch import torch.utils.data -from mlpf.model.logger import _logger +from mlpf.logger import _logger # https://github.com/pytorch/pytorch/issues/11201#issuecomment-895047235 @@ -20,20 +20,26 @@ def __init__(self, ds, sort, pad_to_multiple=None): self.ds.dataset_info = SimpleNamespace() self.ds.dataset_info.name = tmp.name self.ds.dataset_info.features = tmp.features + self.ds.dataset_info.config_name = tmp.config_name self.sort = sort self.pad_to_multiple = pad_to_multiple - self.rep = self.ds.__repr__() def __getitem__(self, item): if isinstance(item, int): item = [item] + assert len(item) == 1 + # getitems requires a list records = self.ds.data_source.__getitems__(item) + ret = [self.ds.dataset_info.features.deserialize_example_np(record, decoders=self.ds.decoders) for record in records] + assert len(ret) == 1 + ret = ret[0] - if len(item) == 1: - ret = ret[0] + Xshape = ret["X"].shape + _logger.debug(f"Getting item={item}, ds={self.ds.dataset_info.name}:{self.ds.dataset_info.config_name}, X={Xshape}") # sort the elements in each event in pT descending order + # the transformer is permutation-covariant, but this can be helpful for other types of models if self.sort: sortidx = np.argsort(ret["X"][:, 1])[::-1] ret["X"] = ret["X"][sortidx] @@ -113,7 +119,7 @@ def __len__(self): return len(self.ds) def __repr__(self): - return self.rep + return "TFDSDataSource(ds={}, pad_to_multiple={})".format(self.ds.__repr__(), self.pad_to_multiple) class PFDataset: @@ -150,10 +156,11 @@ def __init__(self, **kwargs): self.attrs = list(kwargs.keys()) # write out the possible attributes here explicitly - self.X = kwargs.get("X") + self.X = kwargs["X"] self.ytarget = kwargs.get("ytarget") self.ytarget_pt_orig = kwargs.get("ytarget_pt_orig", None) self.ytarget_e_orig = kwargs.get("ytarget_e_orig", None) + self.pythia = kwargs.get("pythia", None) self.ycand = kwargs.get("ycand", None) self.genmet = kwargs.get("genmet", None) self.genjets = kwargs.get("genjets", None) @@ -188,39 +195,100 @@ def __call__(self, inputs): return PFBatch(**ret) +class ResumableSampler(torch.utils.data.Sampler): + """A wrapper for a sampler that allows saving and restoring the state.""" + + def __init__(self, sampler): + _logger.debug("Creating ResumableSampler.") + self.sampler = sampler + self.start_index = 0 + self.name = "" + + def __iter__(self): + indices = list(self.sampler) + return iter(indices[self.start_index :]) + + def __len__(self): + return len(self.sampler) + + def load_state_dict(self, state_dict): + self.start_index = state_dict["start_index"] + _logger.info(f"ResumableSampler {self.name} loading state: start_index={self.start_index}") + + def reset(self): + _logger.info(f"ResumableSampler {self.name} resetting") + self.load_state_dict({"start_index": 0}) + + def set_epoch(self, epoch): + if hasattr(self.sampler, "set_epoch"): + self.sampler.set_epoch(epoch) + + class InterleavedIterator(object): """Will combine DataLoaders of different lengths and batch sizes.""" def __init__(self, data_loaders): - self.idx = 0 + _logger.info(f"Creating InterleavedIterator with {len(data_loaders)} data loaders.") self.data_loaders = data_loaders self.data_loaders_iter = [iter(dl) for dl in data_loaders] - max_loader_size = max([len(dl) for dl in data_loaders]) + dl_lens = [len(dl) for dl in data_loaders] + _logger.debug(f"InterleavedIterator len(data_loaders)={dl_lens}") + max_loader_size = max(dl_lens) self.loader_ds_indices = [] - # iterate loaders interleaved + # iterate loaders interleaved up to the maximum size for i in range(max_loader_size): for iloader, loader in enumerate(data_loaders): if i < len(loader): self.loader_ds_indices.append(iloader) + # cursor to keep track which data loader index to yield from self.cur_index = 0 + self.batches_yielded_per_loader = [0] * len(self.data_loaders) self._len = None + self.name = "" + + _logger.debug(f"InterleavedIterator at {self.cur_index}/{len(self.loader_ds_indices)}") + + def reset(self): + _logger.debug(f"Resetting InterleavedIterator {self.name} state") + self.cur_index = 0 + for loader in self.data_loaders: + if hasattr(loader.sampler, "reset"): + loader.sampler.reset() + self.data_loaders_iter = [iter(dl) for dl in self.data_loaders] + self.batches_yielded_per_loader = [0] * len(self.data_loaders) def __iter__(self): + # Only reset if the iterator is exhausted + _logger.debug(f"Resetting InterleavedIterator {self.name}: {self.cur_index}/{len(self.loader_ds_indices)}") + if self.cur_index >= len(self.loader_ds_indices): + _logger.debug(f"Resetting exhausted InterleavedIterator {self.name}, {self.cur_index}>={len(self.loader_ds_indices)}.") + self.reset() return self def __next__(self): - try: - iloader = self.loader_ds_indices[self.cur_index] - except IndexError: - self.cur_index = 0 # reset the curser index - self.data_loaders_iter = [iter(dl) for dl in self.data_loaders] # reset the loader + _logger.debug(f"InterleavedIterator {self.name}.__next__ {self.cur_index}/{len(self.loader_ds_indices)}") + if self.cur_index >= len(self.loader_ds_indices): + _logger.debug(f"InterleavedIterator {self.name}.__next__ raising StopIteration") raise StopIteration + iloader = self.loader_ds_indices[self.cur_index] + try: + ret = next(self.data_loaders_iter[iloader]) + # This should not happen, and is here for debugging + except StopIteration as e: + _logger.error( + f"Unexpected StopIteration from data loader {self.name}:" + + f" iloader={iloader}, " + + f"batches_yielded_per_loader={self.batches_yielded_per_loader} " + + f"len(loader)={len(self.data_loaders_iter[iloader])}" + ) + raise e self.cur_index += 1 - return next(self.data_loaders_iter[iloader]) + self.batches_yielded_per_loader[iloader] += 1 + return ret def __len__(self): if self._len: @@ -228,26 +296,91 @@ def __len__(self): else: # compute and cache the length len_ = 0 - for iloader in range(len(self.data_loaders_iter)): - len_ += len(self.data_loaders_iter[iloader]) + for loader in self.data_loaders: + len_ += len(loader) self._len = len_ return len_ + def state_dict(self): + return { + "cur_index": self.cur_index, + "batches_yielded_per_loader": self.batches_yielded_per_loader, + } + + def load_state_dict(self, state_dict): + self.cur_index = state_dict["cur_index"] + self.batches_yielded_per_loader = state_dict["batches_yielded_per_loader"] + _logger.info( + f"InterleavedIterator {self.name} loading state: cur_index={self.cur_index}, batches_yielded_per_loader={self.batches_yielded_per_loader}" + ) + + for i, loader in enumerate(self.data_loaders): + start_index = self.batches_yielded_per_loader[i] * loader.batch_size + _logger.info(f"InterleavedIterator {self.name} advancing sampler {i} to {start_index}") + loader.sampler.load_state_dict({"start_index": start_index}) + + # create fresh iterators from the original dataloaders + # these will use the advanced samplers and have fresh workers and empty queues + self.data_loaders_iter = [iter(dl) for dl in self.data_loaders] + + +class EndlessIterator(object): + def __init__(self, data_loader, samplers, world_size): + _logger.info("Creating EndlessIterator.") + self.data_loader = data_loader + self.samplers = samplers + self.world_size = world_size + self.epoch = 0 + self.iterator = iter(self.data_loader) + self.name = "" + + def __iter__(self): + return self + + def __next__(self): + try: + return next(self.iterator) + except StopIteration: + self.epoch += 1 + _logger.info(f"EndlessIterator {self.name} caught StopIteration, advancing epoch to {self.epoch}") + for sampler in self.samplers: + sampler.set_epoch(self.epoch) + self.iterator = iter(self.data_loader) + return next(self.iterator) + + def __len__(self): + return len(self.data_loader) + + def state_dict(self): + return {"epoch": self.epoch, "loader_state_dict": self.data_loader.state_dict()} + + def load_state_dict(self, state_dict): + self.epoch = state_dict["epoch"] + _logger.info(f"EndlessIterator {self.name} setting epoch={self.epoch}") + _logger.info(f"EndlessIterator {self.name} loading state.") + self.data_loader.load_state_dict(state_dict["loader_state_dict"]) + for sampler in self.samplers: + sampler.set_epoch(self.epoch) + self.iterator = iter(self.data_loader) + def set_worker_sharing_strategy(worker_id: int) -> None: torch.multiprocessing.set_sharing_strategy(SHARING_STRATEGY) -def get_interleaved_dataloaders(world_size, rank, config, use_cuda, use_ray): +def get_interleaved_dataloaders(world_size, rank, config, use_cuda, use_ray, shuffle_train=True): loaders = {} - for split in ["train", "valid"]: # build train, valid dataset and dataloaders + samplers = {} + # build train, valid dataset and dataloaders + for split in ["train", "valid"]: loaders[split] = [] + samplers[split] = [] for type_ in config[f"{split}_dataset"][config["dataset"]]: dataset = [] for sample in config[f"{split}_dataset"][config["dataset"]][type_]["samples"]: version = config[f"{split}_dataset"][config["dataset"]][type_]["samples"][sample]["version"] split_configs = config[f"{split}_dataset"][config["dataset"]][type_]["samples"][sample]["splits"] - print("split_configs", split_configs) + _logger.info(f"sample={sample} split={split} split_configs={split_configs}") nevents = None if not (config[f"n{split}"] is None): @@ -269,7 +402,9 @@ def get_interleaved_dataloaders(world_size, rank, config, use_cuda, use_ray): dataset.append(ds) dataset = torch.utils.data.ConcatDataset(dataset) - shuffle = split == "train" + shuffle = False + if shuffle_train: + shuffle = split == "train" if world_size > 1: sampler = torch.utils.data.distributed.DistributedSampler(dataset, shuffle=shuffle) else: @@ -278,6 +413,9 @@ def get_interleaved_dataloaders(world_size, rank, config, use_cuda, use_ray): else: sampler = torch.utils.data.SequentialSampler(dataset) + sampler = ResumableSampler(sampler) + sampler.name = f"{type_}:{split}" + # build dataloaders batch_size = config[f"{split}_dataset"][config["dataset"]][type_]["batch_size"] * config["gpu_batch_multiplier"] loader = torch.utils.data.DataLoader( @@ -291,10 +429,15 @@ def get_interleaved_dataloaders(world_size, rank, config, use_cuda, use_ray): # pin_memory_device="cuda:{}".format(rank) if use_cuda else "", drop_last=True, worker_init_fn=set_worker_sharing_strategy, - # persistent_workers=True, + persistent_workers=config["num_workers"] > 0, ) loaders[split].append(loader) + samplers[split].append(sampler) loaders[split] = InterleavedIterator(loaders[split]) - return loaders + if split == "train": + loaders[split] = EndlessIterator(loaders[split], samplers[split], world_size) + loaders[split].name = f"{type_}:{split}" + + return loaders, samplers diff --git a/mlpf/model/distributed_ray.py b/mlpf/model/distributed_ray.py index 5227d8fe0..9e86f8d06 100644 --- a/mlpf/model/distributed_ray.py +++ b/mlpf/model/distributed_ray.py @@ -9,10 +9,10 @@ import csv from mlpf.model.mlpf import MLPF -from mlpf.model.logger import _logger, _configLogger +from mlpf.logger import _logger, _configLogger from mlpf.model.PFDataset import get_interleaved_dataloaders from mlpf.utils import create_comet_experiment -from mlpf.model.training import train_all_epochs, get_optimizer +from mlpf.model.training import train_all_steps, get_optimizer from mlpf.model.utils import ( load_checkpoint, @@ -97,7 +97,7 @@ def set_searchspace_and_run_trial(search_space, config, args): if rank == 0: logging.warning("OOM error encountered, skipping this hyperparameter configuration.") skiplog_file_path = Path(config["raytune"]["local_dir"]) / args.hpo / "skipped_configurations.txt" - lines = ["{}: {}\n".format(item[0], item[1]) for item in search_space.items()] + lines = ["{}: {}".format(item[0], item[1]) for item in search_space.items()] with open(skiplog_file_path, "a") as f: f.write("#" * 80 + "\n") @@ -257,7 +257,7 @@ def train_ray_trial(config, args, outdir=None): _logger.info("Creating experiment dir {}".format(outdir)) _logger.info(f"Model directory {outdir}", color="bold") - loaders = get_interleaved_dataloaders(world_size, rank, config, use_cuda, use_ray=True) + loaders, samplers = get_interleaved_dataloaders(world_size, rank, config, use_cuda, use_ray=True) if args.comet: comet_experiment = create_comet_experiment(config["comet_name"], comet_offline=config["comet_offline"], outdir=outdir) @@ -284,35 +284,39 @@ def train_ray_trial(config, args, outdir=None): else: comet_experiment = None - steps_per_epoch = len(loaders["train"]) - start_epoch = 1 - lr_schedule = get_lr_schedule(config, optimizer, config["num_epochs"], steps_per_epoch, last_epoch=-1) + lr_schedule = get_lr_schedule(config, optimizer, config["num_steps"]) checkpoint_dir = os.path.join(outdir, "checkpoints") checkpoint_dir = Path(outdir) / "checkpoints" checkpoint_dir.mkdir(parents=True, exist_ok=True) + start_step = 1 checkpoint = ray.train.get_checkpoint() if checkpoint: with checkpoint.as_directory() as _checkpoint_dir: - checkpoint = torch.load(Path(_checkpoint_dir) / "checkpoint.pth", map_location=torch.device(rank)) - model, optimizer = load_checkpoint(checkpoint, model, optimizer) - start_epoch = checkpoint["extra_state"]["epoch"] + 1 - lr_schedule = get_lr_schedule(config, optimizer, config["num_epochs"], steps_per_epoch, last_epoch=start_epoch - 1) - - train_all_epochs( + checkpoint_path = Path(_checkpoint_dir) / "checkpoint.pth" + _logger.info(f"Loading checkpoint from {checkpoint_path}") + checkpoint = torch.load(checkpoint_path, map_location=torch.device(rank)) + model, optimizer, lr_schedule = load_checkpoint(checkpoint, model, optimizer, lr_schedule) + start_step = checkpoint["extra_state"]["step"] + 1 + if "train_loader_state_dict" in checkpoint["extra_state"]: + loaders["train"].load_state_dict(checkpoint["extra_state"]["train_loader_state_dict"]) + if "valid_loader_state_dict" in checkpoint["extra_state"]: + loaders["valid"].load_state_dict(checkpoint["extra_state"]["valid_loader_state_dict"]) + + train_all_steps( rank, world_size, model, optimizer, loaders["train"], loaders["valid"], - config["num_epochs"], + config["num_steps"], config["patience"], outdir, config, trainable=config["model"]["trainable"], - start_epoch=start_epoch, + start_step=start_step, lr_schedule=lr_schedule, use_ray=True, checkpoint_freq=config["checkpoint_freq"], @@ -321,4 +325,6 @@ def train_ray_trial(config, args, outdir=None): dtype=getattr(torch, config["dtype"]), val_freq=config["val_freq"], checkpoint_dir=checkpoint_dir, + train_sampler=samplers["train"], + valid_sampler=samplers["valid"], ) diff --git a/mlpf/model/inference.py b/mlpf/model/inference.py index e3f459132..f8884cdee 100644 --- a/mlpf/model/inference.py +++ b/mlpf/model/inference.py @@ -1,6 +1,8 @@ import os import time from pathlib import Path +import sys +import gc import awkward import fastjet @@ -9,28 +11,28 @@ import torch import tqdm import vector -from jet_utils import match_two_jet_collections -from plotting.plot_utils import ( - get_class_names, - compute_met_and_ratio, +from mlpf.jet_utils import match_two_jet_collections +from mlpf.plotting.plot_utils import ( + # get_class_names, + # compute_met_and_ratio, load_eval_data, plot_jets, plot_jet_ratio, - plot_jet_response_binned, - plot_jet_response_binned_vstarget, - plot_jet_response_binned_eta, - plot_met, - plot_met_ratio, - plot_met_response_binned, + # plot_jet_response_binned, + # plot_jet_response_binned_vstarget, + # plot_jet_response_binned_eta, + # plot_met, + # plot_met_ratio, + # plot_met_response_binned, plot_num_elements, - plot_particles, - plot_particle_ratio, - plot_particle_response, - plot_pu_fraction, + # plot_particles, + # plot_particle_ratio, + # plot_particle_response, + # plot_pu_fraction, ) -from .logger import _logger -from .utils import unpack_predictions, unpack_target +from mlpf.logger import _logger +from mlpf.model.utils import unpack_predictions, unpack_target def predict_one_batch(conv_type, model, i, batch, rank, jetdef, jet_ptcut, jet_match_dr, outpath, dir_name, sample): @@ -131,8 +133,18 @@ def predict_one_batch(conv_type, model, i, batch, rank, jetdef, jet_ptcut, jet_m } ) + outdict = { + "inputs": Xs, + "particles": awkvals, + "jets": jets_coll, + "matched_jets": matched_jets, + "genmet": batch.genmet.cpu(), + } + if batch.pythia is not None: + outdict["pythia"] = batch.pythia.cpu() + awkward.to_parquet( - awkward.Array({"inputs": Xs, "particles": awkvals, "jets": jets_coll, "matched_jets": matched_jets, "genmet": batch.genmet.cpu()}), + awkward.Array(outdict), outfile, ) _logger.info(f"Saved predictions at {outfile}") @@ -152,11 +164,10 @@ def run_predictions(world_size, rank, model, loader, sample, outpath, jetdef, je model.eval() - # only show progress bar on rank 0 - if (world_size > 1) and (rank != 0): - iterator = enumerate(loader) - else: - iterator = tqdm.tqdm(enumerate(loader), total=len(loader), desc=f"Running predictions on sample {sample} on rank={rank}") + is_interactive = ((world_size <= 1) or (rank == 0)) and sys.stdout.isatty() + iterator = enumerate(loader) + if is_interactive: + iterator = tqdm.tqdm(iterator, total=len(loader), desc=f"Running predictions on sample {sample} on rank={rank}") ti = time.time() for i, batch in iterator: @@ -169,17 +180,21 @@ def run_predictions(world_size, rank, model, loader, sample, outpath, jetdef, je def make_plots(outpath, sample, dataset, dir_name="", ntest_files=-1): """Uses the predictions stored as .parquet files from run_predictions to make plots.""" + import matplotlib.pyplot as plt + ret_dict = {} mplhep.style.use(mplhep.styles.CMS) - class_names = get_class_names(sample) + # class_names = get_class_names(sample) os.system(f"mkdir -p {outpath}/plots{dir_name}/{sample}") plots_path = Path(f"{outpath}/plots{dir_name}/{sample}/") pred_path = Path(f"{outpath}/preds{dir_name}/{sample}/") yvals, X, _ = load_eval_data(str(pred_path / "*.parquet"), ntest_files) + _logger.info(f"Loaded data for plotting from {pred_path}") plot_num_elements(X, cp_dir=plots_path) + _logger.info("Plotted number of elements") # plot_elements(X, yvals, cp_dir=plots_path, dataset=dataset, sample=sample) @@ -189,6 +204,7 @@ def make_plots(outpath, sample, dataset, dir_name="", ntest_files=-1): dataset=dataset, sample=sample, ) + _logger.info("Plotted jets") ret_dict["jet_ratio"] = plot_jet_ratio( yvals, cp_dir=plots_path, @@ -197,56 +213,79 @@ def make_plots(outpath, sample, dataset, dir_name="", ntest_files=-1): dataset=dataset, sample=sample, ) - plot_jet_ratio( - yvals, - cp_dir=plots_path, - bins=np.linspace(0.5, 1.5, 500), - logy=True, - file_modifier="_bins_0p5_1p5", - dataset=dataset, - sample=sample, - ) - plot_jet_ratio( - yvals, - cp_dir=plots_path, - bins=np.linspace(0, 2, 500), - logy=True, - file_modifier="_bins_0_2", - dataset=dataset, - sample=sample, - ) - plot_jet_response_binned(yvals, cp_dir=plots_path, dataset=dataset, sample=sample) - plot_jet_response_binned_vstarget(yvals, cp_dir=plots_path, dataset=dataset, sample=sample) - plot_jet_response_binned_eta(yvals, cp_dir=plots_path, dataset=dataset, sample=sample) - # plot_jet_response_binned_separate(yvals, cp_dir=plots_path, title=title) - met_data = compute_met_and_ratio(yvals) - plot_met(met_data, cp_dir=plots_path, dataset=dataset, sample=sample) - plot_met_ratio(met_data, cp_dir=plots_path, dataset=dataset, sample=sample) - plot_met_ratio(met_data, cp_dir=plots_path, bins=np.linspace(0, 20, 100), logy=True, dataset=dataset, sample=sample) - plot_met_ratio( - met_data, - cp_dir=plots_path, - bins=np.linspace(0, 2, 500), - logy=False, - file_modifier="_bins_0_2", - dataset=dataset, - sample=sample, - ) - plot_met_ratio( - met_data, - cp_dir=plots_path, - bins=np.linspace(0, 5, 500), - logy=False, - file_modifier="_bins_0_5", - dataset=dataset, - sample=sample, - ) - plot_met_response_binned(met_data, cp_dir=plots_path, dataset=dataset, sample=sample) + # commented out to save memory and make the validation runtime faster + # _logger.info("Plotted jet ratio") + # plot_jet_ratio( + # yvals, + # cp_dir=plots_path, + # bins=np.linspace(0.5, 1.5, 500), + # logy=True, + # file_modifier="_bins_0p5_1p5", + # dataset=dataset, + # sample=sample, + # ) + # _logger.info("Plotted jet ratio with bins 0.5-1.5") + # plot_jet_ratio( + # yvals, + # cp_dir=plots_path, + # bins=np.linspace(0, 2, 500), + # logy=True, + # file_modifier="_bins_0_2", + # dataset=dataset, + # sample=sample, + # ) + # _logger.info("Plotted jet ratio with bins 0-2") + # plot_jet_response_binned(yvals, cp_dir=plots_path, dataset=dataset, sample=sample) + # _logger.info("Plotted binned jet response") + # plot_jet_response_binned_vstarget(yvals, cp_dir=plots_path, dataset=dataset, sample=sample) + # _logger.info("Plotted binned jet response vs target") + # plot_jet_response_binned_eta(yvals, cp_dir=plots_path, dataset=dataset, sample=sample) + # _logger.info("Plotted binned jet response vs eta") + # plot_jet_response_binned_separate(yvals, cp_dir=plots_path, title=title) - plot_particles(yvals, cp_dir=plots_path, dataset=dataset, sample=sample) - plot_particle_ratio(yvals, class_names, cp_dir=plots_path, dataset=dataset, sample=sample) - plot_particle_response(X, yvals, class_names, cp_dir=plots_path, dataset=dataset, sample=sample) - plot_pu_fraction(yvals, cp_dir=plots_path, dataset=dataset, sample=sample) + # met_data = compute_met_and_ratio(yvals) + # _logger.info("Computed MET and ratio") + # plot_met(met_data, cp_dir=plots_path, dataset=dataset, sample=sample) + # _logger.info("Plotted MET") + # plot_met_ratio(met_data, cp_dir=plots_path, dataset=dataset, sample=sample) + # _logger.info("Plotted MET ratio") + # plot_met_ratio(met_data, cp_dir=plots_path, bins=np.linspace(0, 20, 100), logy=True, dataset=dataset, sample=sample) + # _logger.info("Plotted MET ratio with bins 0-20") + # plot_met_ratio( + # met_data, + # cp_dir=plots_path, + # bins=np.linspace(0, 2, 500), + # logy=False, + # file_modifier="_bins_0_2", + # dataset=dataset, + # sample=sample, + # ) + # _logger.info("Plotted MET ratio with bins 0-2") + # plot_met_ratio( + # met_data, + # cp_dir=plots_path, + # bins=np.linspace(0, 5, 500), + # logy=False, + # file_modifier="_bins_0_5", + # dataset=dataset, + # sample=sample, + # ) + # _logger.info("Plotted MET ratio with bins 0-5") + # plot_met_response_binned(met_data, cp_dir=plots_path, dataset=dataset, sample=sample) + # _logger.info("Plotted binned MET response") + + # plot_particles(yvals, cp_dir=plots_path, dataset=dataset, sample=sample) + # _logger.info("Plotted particles") + # plot_particle_ratio(yvals, class_names, cp_dir=plots_path, dataset=dataset, sample=sample) + # _logger.info("Plotted particle ratio") + # plot_particle_response(X, yvals, class_names, cp_dir=plots_path, dataset=dataset, sample=sample) + # _logger.info("Plotted particle response") + # plot_pu_fraction(yvals, cp_dir=plots_path, dataset=dataset, sample=sample) + # _logger.info("Plotted PU fraction") + + del X, yvals + plt.close("all") + gc.collect() return ret_dict diff --git a/mlpf/model/losses.py b/mlpf/model/losses.py index 1945cc060..083bce76f 100644 --- a/mlpf/model/losses.py +++ b/mlpf/model/losses.py @@ -4,7 +4,7 @@ from torch.nn import functional as F from torch import Tensor, nn -from mlpf.model.logger import _logger +from mlpf.logger import _logger def sliced_wasserstein_loss(y_pred, y_true, num_projections=200): @@ -33,7 +33,7 @@ def mlpf_loss(y, ypred, batch): loss = {} loss_obj_id = FocalLoss(gamma=2.0, reduction="none") - msk_pred_particle = torch.unsqueeze((ypred["cls_id"] != 0).to(dtype=torch.float32), dim=-1) + # msk_pred_particle = torch.unsqueeze((ypred["cls_id"] != 0).to(dtype=torch.float32), dim=-1) msk_true_particle = torch.unsqueeze((y["cls_id"] != 0).to(dtype=torch.float32), dim=-1) nelem = torch.sum(batch.mask) npart = torch.sum(y["cls_id"] != 0) @@ -44,23 +44,24 @@ def mlpf_loss(y, ypred, batch): # in case of the 3D-padded mode, pytorch expects (batch, num_classes, ...) ypred["cls_binary"] = ypred["cls_binary"].permute((0, 2, 1)) ypred["cls_id_onehot"] = ypred["cls_id_onehot"].permute((0, 2, 1)) - ypred["ispu"] = ypred["ispu"].permute((0, 2, 1)) + # ypred["ispu"] = ypred["ispu"].permute((0, 2, 1)) # binary loss for particle / no-particle classification - # loss_binary_classification = loss_obj_id(ypred["cls_binary"], (y["cls_id"] != 0).long()).reshape(y["cls_id"].shape) - loss_binary_classification = 10 * torch.nn.functional.cross_entropy(ypred["cls_binary"], (y["cls_id"] != 0).long(), reduction="none") + # loss_binary_classification = 10.0 * loss_obj_id(ypred["cls_binary"], (y["cls_id"] != 0).long()).reshape(y["cls_id"].shape) + loss_binary_classification = 10.0 * torch.nn.functional.cross_entropy(ypred["cls_binary"], (y["cls_id"] != 0).long(), reduction="none") # compare the particle type, only for cases where there was a true particle loss_pid_classification = loss_obj_id(ypred["cls_id_onehot"], y["cls_id"]).reshape(y["cls_id"].shape) loss_pid_classification[y["cls_id"] == 0] *= 0 # compare particle "PU-ness", only for cases where there was a true particle - loss_pu = torch.nn.functional.cross_entropy(ypred["ispu"], y["ispu"].long(), reduction="none") - loss_pu[y["cls_id"] == 0] *= 0 + # loss_pu = torch.nn.functional.cross_entropy(ypred["ispu"], y["ispu"].long(), reduction="none") + # loss_pu = loss_obj_id(ypred["ispu"], y["ispu"].long()).reshape(y["cls_id"].shape) + # loss_pu[y["cls_id"] == 0] *= 0 # do not compute PU loss if no PU samples in this batch - if y["ispu"].long().sum() == 0: - loss_pu *= 0 + # if y["ispu"].long().sum() == 0: + # loss_pu *= 0 # compare particle momentum, only for cases where there was a true particle loss_regression_pt = torch.nn.functional.mse_loss(ypred["pt"], y["pt"], reduction="none") @@ -78,7 +79,7 @@ def mlpf_loss(y, ypred, batch): # set the loss to 0 on padded elements in the batch loss_binary_classification[batch.mask == 0] *= 0 loss_pid_classification[batch.mask == 0] *= 0 - loss_pu[batch.mask == 0] *= 0 + # loss_pu[batch.mask == 0] *= 0 loss_regression_pt[batch.mask == 0] *= 0 loss_regression_eta[batch.mask == 0] *= 0 loss_regression_sin_phi[batch.mask == 0] *= 0 @@ -86,7 +87,6 @@ def mlpf_loss(y, ypred, batch): loss_regression_energy[batch.mask == 0] *= 0 # add weight based on target pt - # sqrt_elem_pt = torch.sqrt(batch.X[:, :, 1]) sqrt_target_pt = torch.sqrt(torch.exp(y["pt"]) * batch.X[:, :, 1]) loss_regression_pt *= sqrt_target_pt loss_regression_energy *= sqrt_target_pt @@ -99,38 +99,35 @@ def mlpf_loss(y, ypred, batch): loss["Regression_energy"] = loss_regression_energy.sum() / npart # average over all elements that were not padded - # loss["Classification_binary"] = (sqrt_elem_pt*loss_binary_classification).sum() / nelem loss["Classification_binary"] = loss_binary_classification.sum() / nelem loss["Classification"] = loss_pid_classification.sum() / nelem - loss["ispu"] = loss_pu.sum() / nelem + # loss["ispu"] = loss_pu.sum() / nelem # compute predicted pt from model output - pred_pt = torch.unsqueeze(torch.exp(ypred["pt"]) * batch.X[..., 1], dim=-1) * msk_pred_particle - pred_px = pred_pt * torch.unsqueeze(ypred["cos_phi"].detach(), dim=-1) * msk_pred_particle - pred_py = pred_pt * torch.unsqueeze(ypred["sin_phi"].detach(), dim=-1) * msk_pred_particle - # pred_pz = pred_pt * torch.unsqueeze(torch.sinh(ypred["eta"].detach()), dim=-1) * msk_pred_particle - # pred_mass2 = pred_e**2 - pred_pt**2 - pred_pz**2 + # pred_pt = torch.unsqueeze(torch.exp(ypred["pt"]) * batch.X[..., 1], dim=-1) * msk_pred_particle + # pred_px = pred_pt * torch.unsqueeze(ypred["cos_phi"].detach(), dim=-1) * msk_pred_particle + # pred_py = pred_pt * torch.unsqueeze(ypred["sin_phi"].detach(), dim=-1) * msk_pred_particle # compute MET, sum across particle axis in event - pred_met = torch.sqrt(torch.sum(pred_px, dim=-2) ** 2 + torch.sum(pred_py, dim=-2) ** 2).detach() - loss["MET"] = torch.nn.functional.huber_loss(pred_met.squeeze(dim=-1), batch.genmet).mean() + # pred_met = torch.sqrt(torch.sum(pred_px, dim=-2) ** 2 + torch.sum(pred_py, dim=-2) ** 2).detach() + # loss["MET"] = torch.nn.functional.huber_loss(pred_met.squeeze(dim=-1), batch.genmet).mean() - was_input_pred = torch.concat([torch.softmax(ypred["cls_binary"].transpose(1, 2), dim=-1), ypred["momentum"]], dim=-1) * batch.mask.unsqueeze( - dim=-1 - ) - was_input_true = torch.concat([torch.nn.functional.one_hot((y["cls_id"] != 0).to(torch.long)), y["momentum"]], dim=-1) * batch.mask.unsqueeze( - dim=-1 - ) + # was_input_pred = torch.concat([torch.softmax(ypred["cls_binary"].transpose(1, 2), dim=-1), ypred["momentum"]], dim=-1) * batch.mask.unsqueeze( + # dim=-1 + # ) + # was_input_true = torch.concat([torch.nn.functional.one_hot((y["cls_id"] != 0).to(torch.long)), y["momentum"]], dim=-1) * batch.mask.unsqueeze( + # dim=-1 + # ) # standardize Wasserstein loss - std = was_input_true[batch.mask].std(dim=0) - loss["Sliced_Wasserstein_Loss"] = sliced_wasserstein_loss(was_input_pred / std, was_input_true / std).mean() + # std = was_input_true[batch.mask].std(dim=0) + # loss["Sliced_Wasserstein_Loss"] = sliced_wasserstein_loss(was_input_pred / std, was_input_true / std).mean() # this is the final loss to be optimized loss["Total"] = ( loss["Classification_binary"] + loss["Classification"] - + loss["ispu"] + # + loss["ispu"] + loss["Regression_pt"] + loss["Regression_eta"] + loss["Regression_sin_phi"] diff --git a/mlpf/model/mlpf.py b/mlpf/model/mlpf.py index 11caec48f..254418202 100644 --- a/mlpf/model/mlpf.py +++ b/mlpf/model/mlpf.py @@ -1,15 +1,14 @@ import math import numpy as np +from typing import Union, List import torch import torch.nn as nn from torch.nn.attention import SDPBackend, sdpa_kernel -from mlpf.model.logger import _logger +from mlpf.logger import _logger from mlpf.model.gnn_lsh import CombinedGraphLayer -ATT_MAT_IDX = 0 - def trunc_normal_(tensor, mean=0.0, std=1.0, a=-2.0, b=2.0): # From https://github.com/rwightman/pytorch-image-models/blob/ @@ -353,18 +352,17 @@ def __init__( width = num_heads * head_dim # embedding of the inputs + if self.input_encoding == "joint": + self.nn0_id = ffn(self.input_dim, embedding_dim, width, self.act, dropout_ff) + self.nn0_reg = ffn(self.input_dim, embedding_dim, width, self.act, dropout_ff) + elif self.input_encoding == "split": + self.nn0_id = nn.ModuleList() + for ielem in range(len(self.elemtypes_nonzero)): + self.nn0_id.append(ffn(self.input_dim, embedding_dim, width, self.act, dropout_ff)) + self.nn0_reg = nn.ModuleList() + for ielem in range(len(self.elemtypes_nonzero)): + self.nn0_reg.append(ffn(self.input_dim, embedding_dim, width, self.act, dropout_ff)) if self.num_convs != 0: - if self.input_encoding == "joint": - self.nn0_id = ffn(self.input_dim, embedding_dim, width, self.act, dropout_ff) - self.nn0_reg = ffn(self.input_dim, embedding_dim, width, self.act, dropout_ff) - elif self.input_encoding == "split": - self.nn0_id = nn.ModuleList() - for ielem in range(len(self.elemtypes_nonzero)): - self.nn0_id.append(ffn(self.input_dim, embedding_dim, width, self.act, dropout_ff)) - self.nn0_reg = nn.ModuleList() - for ielem in range(len(self.elemtypes_nonzero)): - self.nn0_reg.append(ffn(self.input_dim, embedding_dim, width, self.act, dropout_ff)) - if self.conv_type == "attention": self.conv_id = nn.ModuleList() self.conv_reg = nn.ModuleList() @@ -431,7 +429,7 @@ def __init__( # DNN that acts on the node level to predict the PID self.nn_binary_particle = ffn(decoding_dim, 2, width, self.act, dropout_ff) self.nn_pid = ffn(decoding_dim, num_classes, width, self.act, dropout_ff) - self.nn_pu = ffn(decoding_dim, 2, width, self.act, dropout_ff) + # self.nn_pu = ffn(decoding_dim, 2, width, self.act, dropout_ff) # elementwise DNN for node momentum regression embed_dim = decoding_dim @@ -450,19 +448,18 @@ def forward(self, X_features, mask): Xfeat_normed = X_features embeddings_id, embeddings_reg = [], [] + if self.input_encoding == "joint": + embedding_id = self.nn0_id(Xfeat_normed) + embedding_reg = self.nn0_reg(Xfeat_normed) + elif self.input_encoding == "split": + embedding_id = torch.stack([nn0(Xfeat_normed) for nn0 in self.nn0_id], axis=-1) + elemtype_mask = torch.cat([X_features[..., 0:1] == elemtype for elemtype in self.elemtypes_nonzero], axis=-1) + embedding_id = torch.sum(embedding_id * elemtype_mask.unsqueeze(-2), axis=-1) + + embedding_reg = torch.stack([nn0(Xfeat_normed) for nn0 in self.nn0_reg], axis=-1) + elemtype_mask = torch.cat([X_features[..., 0:1] == elemtype for elemtype in self.elemtypes_nonzero], axis=-1) + embedding_reg = torch.sum(embedding_reg * elemtype_mask.unsqueeze(-2), axis=-1) if self.num_convs != 0: - if self.input_encoding == "joint": - embedding_id = self.nn0_id(Xfeat_normed) - embedding_reg = self.nn0_reg(Xfeat_normed) - elif self.input_encoding == "split": - embedding_id = torch.stack([nn0(Xfeat_normed) for nn0 in self.nn0_id], axis=-1) - elemtype_mask = torch.cat([X_features[..., 0:1] == elemtype for elemtype in self.elemtypes_nonzero], axis=-1) - embedding_id = torch.sum(embedding_id * elemtype_mask.unsqueeze(-2), axis=-1) - - embedding_reg = torch.stack([nn0(Xfeat_normed) for nn0 in self.nn0_reg], axis=-1) - elemtype_mask = torch.cat([X_features[..., 0:1] == elemtype for elemtype in self.elemtypes_nonzero], axis=-1) - embedding_reg = torch.sum(embedding_reg * elemtype_mask.unsqueeze(-2), axis=-1) - for num, conv in enumerate(self.conv_id): conv_input = embedding_id if num == 0 else embeddings_id[-1] out_padded = conv(conv_input, mask, embedding_id) @@ -471,6 +468,9 @@ def forward(self, X_features, mask): conv_input = embedding_reg if num == 0 else embeddings_reg[-1] out_padded = conv(conv_input, mask, embedding_reg) embeddings_reg.append(out_padded) + else: + embeddings_id.append(embedding_id) + embeddings_reg.append(embedding_reg) # id input if self.learned_representation_mode == "concat": @@ -483,7 +483,8 @@ def forward(self, X_features, mask): preds_binary_particle = self.nn_binary_particle(final_embedding_id) preds_pid = self.nn_pid(final_embedding_id) - preds_pu = self.nn_pu(final_embedding_id) + # preds_pu = self.nn_pu(final_embedding_id) + preds_pu = torch.zeros_like(preds_binary_particle) # pred_charge = self.nn_charge(final_embedding_id) @@ -515,3 +516,27 @@ def forward(self, X_features, mask): preds_energy = e_real + torch.nn.functional.relu(self.nn_energy(X_features, final_embedding_reg, X_features[..., 5:6])) preds_momentum = torch.cat([preds_pt, preds_eta, preds_sin_phi, preds_cos_phi, preds_energy], axis=-1) return preds_binary_particle, preds_pid, preds_momentum, preds_pu + + +def configure_model_trainable(model: MLPF, trainable: Union[str, List[str]], is_training: bool): + """Set only the given layers as trainable in the model""" + + if isinstance(model, torch.nn.parallel.DistributedDataParallel): + raise Exception("configure trainability before distributing the model") + if is_training: + model.train() + if trainable != "all": + model.eval() + + # first set all parameters as non-trainable + for param in model.parameters(): + param.requires_grad = False + + # now explicitly enable specific layers + for layer in trainable: + layer = getattr(model, layer) + layer.train() + for param in layer.parameters(): + param.requires_grad = True + else: + model.eval() diff --git a/mlpf/model/monitoring.py b/mlpf/model/monitoring.py index 2f8419144..a2ad0ea4c 100644 --- a/mlpf/model/monitoring.py +++ b/mlpf/model/monitoring.py @@ -1,7 +1,7 @@ import psutil import resource from collections import defaultdict -from mlpf.model.logger import _logger +from mlpf.logger import _logger def monitor_open_files(): @@ -75,7 +75,11 @@ def log_step_to_tensorboard(batch, loss_accum, lr_schedule, tensorboard_writer, # get the number of elements, excluding padded elements num_elems = batch.X[batch.mask].shape[0] - tensorboard_writer.add_scalar("step/loss", loss_accum / num_elems, step) tensorboard_writer.add_scalar("step/num_elems", num_elems, step) tensorboard_writer.add_scalar("step/num_batch", batch.X.shape[0], step) tensorboard_writer.add_scalar("step/learning_rate", lr_schedule.get_last_lr()[0], step) + + +def log_dataloader_to_tensorboard(loader_state_dict, tensorboard_writer, step): + for k in ["cur_index"]: + tensorboard_writer.add_scalar("step/{}".format(k), loader_state_dict[k], step) diff --git a/mlpf/model/plots.py b/mlpf/model/plots.py index 50f6074b0..f06596d54 100644 --- a/mlpf/model/plots.py +++ b/mlpf/model/plots.py @@ -6,18 +6,23 @@ import glob import os +from mlpf.logger import _logger + def log_confusion_matrices(cm_X_target, cm_X_pred, cm_id, comet_experiment, epoch): if comet_experiment: comet_experiment.log_confusion_matrix( matrix=cm_X_target, title="Element to target", row_label="X", column_label="target", epoch=epoch, file_name="cm_X_target.json" ) + _logger.info("logged confusion matrix: Element to target") comet_experiment.log_confusion_matrix( matrix=cm_X_pred, title="Element to pred", row_label="X", column_label="pred", epoch=epoch, file_name="cm_X_pred.json" ) + _logger.info("logged confusion matrix: Element to pred") comet_experiment.log_confusion_matrix( matrix=cm_id, title="Target to pred", row_label="target", column_label="pred", epoch=epoch, file_name="cm_id.json" ) + _logger.info("logged confusion matrix: Target to pred") def validation_plots(batch, ypred_raw, ytarget, ypred, tensorboard_writer, epoch, outdir): @@ -34,6 +39,7 @@ def validation_plots(batch, ypred_raw, ytarget, ypred, tensorboard_writer, epoch ).numpy() df = pandas.DataFrame(arr) df.to_parquet(f"{outdir}/batch0_epoch{epoch}.parquet") + _logger.info(f"saved batch0_epoch{epoch}.parquet") if tensorboard_writer: sig_prob = torch.softmax(ypred_binary, axis=-1)[:, 1].to(torch.float32) @@ -48,6 +54,7 @@ def validation_plots(batch, ypred_raw, ytarget, ypred, tensorboard_writer, epoch plt.xlabel("log [E/E_elem]") plt.yscale("log") tensorboard_writer.add_figure("energy_elemtype{}".format(int(xcls)), fig, global_step=epoch) + _logger.info(f"plotted energy_elemtype{int(xcls)}") fig = plt.figure() msk = X[:, 0] == xcls @@ -59,6 +66,7 @@ def validation_plots(batch, ypred_raw, ytarget, ypred, tensorboard_writer, epoch plt.xlabel("log [pt/pt_elem]") plt.yscale("log") tensorboard_writer.add_figure("pt_elemtype{}".format(int(xcls)), fig, global_step=epoch) + _logger.info(f"plotted pt_elemtype{int(xcls)}") fig = plt.figure(figsize=(5, 5)) msk = (X[:, 0] == xcls) & (ytarget_flat[:, 0] != 0) & (ypred_binary_cls != 0) @@ -70,6 +78,7 @@ def validation_plots(batch, ypred_raw, ytarget, ypred, tensorboard_writer, epoch plt.xlabel("log [E_target/E_elem]") plt.ylabel("log [E_pred/E_elem]") tensorboard_writer.add_figure("energy_elemtype{}_corr".format(int(xcls)), fig, global_step=epoch) + _logger.info(f"plotted energy_elemtype{int(xcls)}_corr") fig = plt.figure(figsize=(5, 5)) msk = (X[:, 0] == xcls) & (ytarget_flat[:, 0] != 0) & (ypred_binary_cls != 0) @@ -81,6 +90,7 @@ def validation_plots(batch, ypred_raw, ytarget, ypred, tensorboard_writer, epoch plt.xlabel("log [pt_target/pt_elem]") plt.ylabel("log [pt_pred/pt_elem]") tensorboard_writer.add_figure("pt_elemtype{}_corr".format(int(xcls)), fig, global_step=epoch) + _logger.info(f"plotted pt_elemtype{int(xcls)}_corr") fig = plt.figure(figsize=(5, 5)) msk = (X[:, 0] == xcls) & (ytarget_flat[:, 0] != 0) & (ypred_binary_cls != 0) @@ -92,6 +102,7 @@ def validation_plots(batch, ypred_raw, ytarget, ypred, tensorboard_writer, epoch plt.xlabel("eta_target") plt.ylabel("eta_pred") tensorboard_writer.add_figure("eta_elemtype{}_corr".format(int(xcls)), fig, global_step=epoch) + _logger.info(f"plotted eta_elemtype{int(xcls)}_corr") fig = plt.figure(figsize=(5, 5)) msk = (X[:, 0] == xcls) & (ytarget_flat[:, 0] != 0) & (ypred_binary_cls != 0) @@ -103,6 +114,7 @@ def validation_plots(batch, ypred_raw, ytarget, ypred, tensorboard_writer, epoch plt.xlabel("sin_phi_target") plt.ylabel("sin_phi_pred") tensorboard_writer.add_figure("sphi_elemtype{}_corr".format(int(xcls)), fig, global_step=epoch) + _logger.info(f"plotted sphi_elemtype{int(xcls)}_corr") fig = plt.figure(figsize=(5, 5)) msk = (X[:, 0] == xcls) & (ytarget_flat[:, 0] != 0) & (ypred_binary_cls != 0) @@ -114,6 +126,7 @@ def validation_plots(batch, ypred_raw, ytarget, ypred, tensorboard_writer, epoch plt.xlabel("cos_phi_target") plt.ylabel("cos_phi_pred") tensorboard_writer.add_figure("cphi_elemtype{}_corr".format(int(xcls)), fig, global_step=epoch) + _logger.info(f"plotted cphi_elemtype{int(xcls)}_corr") fig = plt.figure() msk = X[:, 0] == xcls @@ -122,32 +135,48 @@ def validation_plots(batch, ypred_raw, ytarget, ypred, tensorboard_writer, epoch plt.hist(sig_prob[msk & (ytarget_flat[:, 0] != 0)], bins=b, histtype="step") plt.xlabel("particle proba") tensorboard_writer.add_figure("sig_proba_elemtype{}".format(int(xcls)), fig, global_step=epoch) + _logger.info(f"plotted sig_proba_elemtype{int(xcls)}") try: tensorboard_writer.add_histogram("pt_target", torch.clamp(batch.ytarget[batch.mask][:, 2], -10, 10), global_step=epoch) + _logger.info("plotted pt_target histogram") tensorboard_writer.add_histogram("pt_pred", torch.clamp(ypred_raw[2][batch.mask][:, 0], -10, 10), global_step=epoch) + _logger.info("plotted pt_pred histogram") ratio = (ypred_raw[2][batch.mask][:, 0] / batch.ytarget[batch.mask][:, 2])[batch.ytarget[batch.mask][:, 0] != 0] tensorboard_writer.add_histogram("pt_ratio", torch.clamp(ratio, -10, 10), global_step=epoch) + _logger.info("plotted pt_ratio histogram") tensorboard_writer.add_histogram("eta_target", torch.clamp(batch.ytarget[batch.mask][:, 3], -10, 10), global_step=epoch) + _logger.info("plotted eta_target histogram") tensorboard_writer.add_histogram("eta_pred", torch.clamp(ypred_raw[2][batch.mask][:, 1], -10, 10), global_step=epoch) + _logger.info("plotted eta_pred histogram") ratio = (ypred_raw[2][batch.mask][:, 1] / batch.ytarget[batch.mask][:, 3])[batch.ytarget[batch.mask][:, 0] != 0] tensorboard_writer.add_histogram("eta_ratio", torch.clamp(ratio, -10, 10), global_step=epoch) + _logger.info("plotted eta_ratio histogram") tensorboard_writer.add_histogram("sphi_target", torch.clamp(batch.ytarget[batch.mask][:, 4], -10, 10), global_step=epoch) + _logger.info("plotted sphi_target histogram") tensorboard_writer.add_histogram("sphi_pred", torch.clamp(ypred_raw[2][batch.mask][:, 2], -10, 10), global_step=epoch) + _logger.info("plotted sphi_pred histogram") ratio = (ypred_raw[2][batch.mask][:, 2] / batch.ytarget[batch.mask][:, 4])[batch.ytarget[batch.mask][:, 0] != 0] tensorboard_writer.add_histogram("sphi_ratio", torch.clamp(ratio, -10, 10), global_step=epoch) + _logger.info("plotted sphi_ratio histogram") tensorboard_writer.add_histogram("cphi_target", torch.clamp(batch.ytarget[batch.mask][:, 5], -10, 10), global_step=epoch) + _logger.info("plotted cphi_target histogram") tensorboard_writer.add_histogram("cphi_pred", torch.clamp(ypred_raw[2][batch.mask][:, 3], -10, 10), global_step=epoch) + _logger.info("plotted cphi_pred histogram") ratio = (ypred_raw[2][batch.mask][:, 3] / batch.ytarget[batch.mask][:, 5])[batch.ytarget[batch.mask][:, 0] != 0] tensorboard_writer.add_histogram("cphi_ratio", torch.clamp(ratio, -10, 10), global_step=epoch) + _logger.info("plotted cphi_ratio histogram") tensorboard_writer.add_histogram("energy_target", torch.clamp(batch.ytarget[batch.mask][:, 6], -10, 10), global_step=epoch) + _logger.info("plotted energy_target histogram") tensorboard_writer.add_histogram("energy_pred", torch.clamp(ypred_raw[2][batch.mask][:, 4], -10, 10), global_step=epoch) + _logger.info("plotted energy_pred histogram") ratio = (ypred_raw[2][batch.mask][:, 4] / batch.ytarget[batch.mask][:, 6])[batch.ytarget[batch.mask][:, 0] != 0] tensorboard_writer.add_histogram("energy_ratio", torch.clamp(ratio, -10, 10), global_step=epoch) + _logger.info("plotted energy_ratio histogram") except ValueError as e: print(e) @@ -169,5 +198,6 @@ def validation_plots(batch, ypred_raw, ytarget, ypred, tensorboard_writer, epoch plt.title("event {}, m={:.2E}".format(ibatch, np.mean(attn_matrix[ibatch][attn_matrix[ibatch] > 0]))) plt.suptitle(attn_name) tensorboard_writer.add_figure(attn_name, fig, global_step=epoch) + _logger.info(f"plotted attention matrix {attn_name}") except ValueError as e: print(e) diff --git a/mlpf/model/training.py b/mlpf/model/training.py index 38549ab67..3e441e74d 100644 --- a/mlpf/model/training.py +++ b/mlpf/model/training.py @@ -1,15 +1,49 @@ +""" +This script defines the training, validation, and testing workflow for the MLPF model. + +The main entry point is `device_agnostic_run`, which handles CPU, single-GPU, and multi-GPU (DDP) training configurations. + +The overall training flow is as follows: +1. `device_agnostic_run`: Sets up the environment and launches the `run` function for each process/GPU. +2. `run`: Initializes the process group, model, optimizer, data loaders, and learning rate scheduler. It then calls `train_all_steps` to begin the main training loop. +3. `train_all_steps`: The core training loop that iterates over training steps. + - For each step, it calls `train_step` to perform a forward and backward pass. + - Manages checkpointing, learning rate scheduling, and early stopping. + - Periodically, it calls `_run_validation_cycle` to evaluate the model. +4. `_run_validation_cycle`: + - Calls `evaluate` to compute validation loss. + - Calls `run_test` to generate predictions on the test datasets. + - Calls `make_plots` (from inference.py) to create performance plots. + +Key Functions: +- `device_agnostic_run`: Entry point that manages device configuration (CPU/GPU/multi-GPU). +- `run`: Main function for a single process, responsible for setup and starting the training loop. +- `train_all_steps`: Orchestrates the entire training process over all steps. +- `train_step`: Executes a single training step (forward pass, loss calculation, backward pass, optimizer step). +- `evaluate`: Computes model performance and loss on the validation dataset. +- `model_step`: Performs a single forward pass through the model and computes the loss. +- `optimizer_step`: Executes the backward pass and updates model weights. +- `_log_and_checkpoint_step`: Handles logging and periodic checkpoint saving. +- `_run_validation_cycle`: Coordinates the validation, testing, and plotting process at regular intervals. +- `run_test`: Runs inference on a specified test dataset. +- `get_optimizer`: Utility to create an optimizer based on the configuration. +- `configure_model_trainable`: Utility to set specific model layers as trainable. +- `override_config`: Merges command-line arguments into the configuration dictionary. +""" + import os import os.path as osp import time from pathlib import Path from tempfile import TemporaryDirectory +import gc import tqdm import yaml import json -import sklearn -import sklearn.metrics import numpy as np -from typing import Union, List +from typing import Union +import sys +from packaging.version import Version # comet needs to be imported before torch from comet_ml import OfflineExperiment, Experiment # noqa: F401, isort:skip @@ -19,7 +53,8 @@ import torch.multiprocessing as mp from torch.utils.tensorboard import SummaryWriter -from mlpf.model.logger import _logger, _configLogger +from mlpf.optimizers import get_optimizer +from mlpf.logger import _logger, _configLogger, log_smi, log_memory from mlpf.model.utils import ( unpack_predictions, unpack_target, @@ -31,42 +66,18 @@ save_HPs, get_lr_schedule, count_parameters, + load_lr_schedule, ) -from mlpf.model.monitoring import log_open_files_to_tensorboard, log_step_to_tensorboard +from mlpf.model.monitoring import log_step_to_tensorboard, log_dataloader_to_tensorboard from mlpf.model.inference import make_plots, run_predictions -from mlpf.model.mlpf import MLPF +from mlpf.model.mlpf import MLPF, configure_model_trainable from mlpf.model.PFDataset import Collater, PFDataset, get_interleaved_dataloaders from mlpf.model.losses import mlpf_loss from mlpf.utils import create_comet_experiment -from mlpf.model.plots import validation_plots -from mlpf.optimizers.lamb import Lamb - - -def configure_model_trainable(model: MLPF, trainable: Union[str, List[str]], is_training: bool): - """Set only the given layers as trainable in the model""" - - if isinstance(model, torch.nn.parallel.DistributedDataParallel): - raise Exception("configure trainability before distributing the model") - if is_training: - model.train() - if trainable != "all": - model.eval() - - # first set all parameters as non-trainable - for param in model.parameters(): - param.requires_grad = False - - # now explicitly enable specific layers - for layer in trainable: - layer = getattr(model, layer) - layer.train() - for param in layer.parameters(): - param.requires_grad = True - else: - model.eval() def model_step(batch, model, loss_fn): + _logger.debug(f"model_step X={batch.X.shape}") ypred_raw = model(batch.X, batch.mask) ypred = unpack_predictions(ypred_raw) ytarget = unpack_target(batch.ytarget, model) @@ -80,52 +91,24 @@ def optimizer_step(model, loss_opt, optimizer, lr_schedule, scaler): param.grad = None # Backward pass and optimization + _logger.debug(f"optimizer_step scale={scaler.get_scale():.2E}") scaler.scale(loss_opt).backward() scaler.step(optimizer) scaler.update() if lr_schedule: - # ReduceLROnPlateau scheduler should only be updated after each full epoch + # ReduceLROnPlateau scheduler should only be updated after each validation step if not isinstance(lr_schedule, torch.optim.lr_scheduler.ReduceLROnPlateau): lr_schedule.step() -def get_optimizer(model, config): - """ - Returns the optimizer for the given model based on the configuration provided. - Parameters: - model (torch.nn.Module): The model for which the optimizer is to be created. - config (dict): Configuration dictionary containing optimizer settings. - Must include the key "lr" for learning rate. - Optionally includes the key "optimizer" to specify the type of optimizer. - Supported values for "optimizer" are "adamw", "lamb", and "sgd". - If "optimizer" is not provided, "adamw" is used by default. - Returns: - torch.optim.Optimizer: The optimizer specified in the configuration. - Raises: - ValueError: If the specified optimizer type is not supported. - """ - - wd = config["weight_decay"] if "weight_decay" in config else 0.01 - if "optimizer" not in config: - return torch.optim.AdamW(model.parameters(), lr=config["lr"], weight_decay=wd) - if config["optimizer"] == "adamw": - return torch.optim.AdamW(model.parameters(), lr=config["lr"], weight_decay=wd) - elif config["optimizer"] == "lamb": - return Lamb(model.parameters(), lr=config["lr"], weight_decay=wd) - elif config["optimizer"] == "sgd": - return torch.optim.SGD(model.parameters(), lr=config["lr"], weight_decay=wd) - else: - raise ValueError(f"Unsupported optimizer type: {config['optimizer']}") - - -def train_epoch( +def train_step( rank: Union[int, str], world_size: int, model: MLPF, optimizer, - train_loader, + batch, lr_schedule, - epoch: int, + step: int, tensorboard_writer=None, comet_experiment=None, comet_step_freq=None, @@ -133,17 +116,18 @@ def train_epoch( device_type="cuda", dtype=torch.float32, scaler=None, + loader_state_dict={}, ): - """Run one training epoch + """Run one training step Args: rank: Device rank (GPU id or 'cpu') world_size: Number of devices being used model: The neural network model optimizer: The optimizer - train_loader: Training data loader + batch: Training batch lr_schedule: Learning rate scheduler - epoch: Current epoch number + step: Current step number tensorboard_writer: TensorBoard writer object comet_experiment: Comet.ml experiment object comet_step_freq: How often to log to comet @@ -152,82 +136,77 @@ def train_epoch( dtype: Torch dtype for computations Returns: - dict: Dictionary of epoch losses + dict: Dictionary of step losses """ + if world_size > 1: + dist.barrier() + model.train() - epoch_loss = {} + step_loss = {} - # Only show progress bar on rank 0 - if (world_size > 1) and (rank != 0): - iterator = enumerate(train_loader) - else: - iterator = tqdm.tqdm(enumerate(train_loader), total=len(train_loader), desc=f"Epoch {epoch} train loop on rank={rank}") + batch = batch.to(rank, non_blocking=True) - for itrain, batch in iterator: - batch = batch.to(rank, non_blocking=True) + with torch.autocast(device_type=device_type, dtype=dtype, enabled=device_type == "cuda"): + loss_opt, loss, _, _, _ = model_step(batch, model, mlpf_loss) - with torch.autocast(device_type=device_type, dtype=dtype, enabled=device_type == "cuda"): - loss_opt, loss, _, _, _ = model_step(batch, model, mlpf_loss) + optimizer_step(model, loss_opt, optimizer, lr_schedule, scaler) - optimizer_step(model, loss_opt, optimizer, lr_schedule, scaler) + # Accumulate losses + for loss_name in loss: + if loss_name not in step_loss: + step_loss[loss_name] = 0.0 + step_loss[loss_name] += loss[loss_name] - # Accumulate losses - for loss_name in loss: - if loss_name not in epoch_loss: - epoch_loss[loss_name] = 0.0 - epoch_loss[loss_name] += loss[loss_name] + # Log step metrics + if tensorboard_writer is not None: + # log_open_files_to_tensorboard(tensorboard_writer, step) + log_step_to_tensorboard(batch, loss["Total"], lr_schedule, tensorboard_writer, step) + log_dataloader_to_tensorboard(loader_state_dict, tensorboard_writer, step) + tensorboard_writer.flush() - # Log step metrics - step = (epoch - 1) * len(train_loader) + itrain - if tensorboard_writer is not None and step % 100 == 0: - log_open_files_to_tensorboard(tensorboard_writer, step) - log_step_to_tensorboard(batch, loss["Total"], lr_schedule, tensorboard_writer, step) - tensorboard_writer.flush() - - # Save step checkpoint - extra_state = {"step": step, "lr_schedule_state_dict": lr_schedule.state_dict()} - save_checkpoint(f"{checkpoint_dir}/step_weights.pth", model, optimizer, extra_state) - - if comet_experiment is not None and (itrain % comet_step_freq == 0): - comet_experiment.log_metrics(loss, prefix="train", step=step) - comet_experiment.log_metric("learning_rate", lr_schedule.get_last_lr(), step=step) + if comet_experiment is not None and (step % comet_step_freq == 0): + comet_experiment.log_metrics(loss, prefix="train", step=step) + comet_experiment.log_metric("learning_rate", lr_schedule.get_last_lr(), step=step) # Average losses across steps - num_steps = torch.tensor(float(len(train_loader)), device=rank, dtype=torch.float32) + num_steps = torch.tensor(1.0, device=rank, dtype=torch.float32) if world_size > 1: torch.distributed.all_reduce(num_steps) - for loss_name in epoch_loss: + for loss_name in step_loss: + _logger.debug(f"train_step {loss_name}={step_loss[loss_name]}") if world_size > 1: - torch.distributed.all_reduce(epoch_loss[loss_name]) - epoch_loss[loss_name] = epoch_loss[loss_name].cpu().item() / num_steps.cpu().item() + torch.distributed.all_reduce(step_loss[loss_name]) + step_loss[loss_name] = step_loss[loss_name].cpu().item() / num_steps.cpu().item() if world_size > 1: dist.barrier() + _logger.debug(f"train_step reduced {step_loss}") - return epoch_loss + return step_loss -def eval_epoch( +def evaluate( rank: Union[int, str], world_size: int, model: MLPF, valid_loader, - epoch: int, + step: int, tensorboard_writer=None, comet_experiment=None, outdir=None, device_type="cuda", dtype=torch.float32, + make_plots=False, ): - """Run one evaluation epoch + """Run one evaluation step Args: rank: Device rank (GPU id or 'cpu') world_size: Number of devices being used model: The neural network model valid_loader: Validation data loader - epoch: Current epoch number + step: Current step number tensorboard_writer: TensorBoard writer object comet_experiment: Comet.ml experiment object outdir: Output directory path @@ -235,92 +214,291 @@ def eval_epoch( dtype: Torch dtype for computations Returns: - dict: Dictionary of epoch losses + dict: Dictionary of evaluation losses """ - model.eval() - epoch_loss = {} - # Confusion matrix tracking - cm_X_target = np.zeros((13, 13)) - cm_X_pred = np.zeros((13, 13)) - cm_id = np.zeros((13, 13)) + if world_size > 1: + dist.barrier() + + model.eval() + eval_loss = {} # Only show progress bar on rank 0 - if (world_size > 1) and (rank != 0): - iterator = enumerate(valid_loader) - else: - iterator = tqdm.tqdm(enumerate(valid_loader), total=len(valid_loader), desc=f"Epoch {epoch} eval loop on rank={rank}") + is_interactive = ((world_size <= 1) or (rank == 0)) and sys.stdout.isatty() + assert len(valid_loader) > 0 + iterator = enumerate(valid_loader) + if is_interactive: + iterator = tqdm.tqdm(iterator, total=len(valid_loader), desc=f"Step {step} eval loop on rank={rank}") for ival, batch in iterator: batch = batch.to(rank, non_blocking=True) with torch.autocast(device_type=device_type, dtype=dtype, enabled=device_type == "cuda"): with torch.no_grad(): - loss_opt, loss, ypred_raw, ypred, ytarget = model_step(batch, model, mlpf_loss) - - # Update confusion matrices - cm_X_target += sklearn.metrics.confusion_matrix( - batch.X[:, :, 0][batch.mask].detach().cpu().numpy(), ytarget["cls_id"][batch.mask].detach().cpu().numpy(), labels=range(13) - ) - cm_X_pred += sklearn.metrics.confusion_matrix( - batch.X[:, :, 0][batch.mask].detach().cpu().numpy(), ypred["cls_id"][batch.mask].detach().cpu().numpy(), labels=range(13) - ) - cm_id += sklearn.metrics.confusion_matrix( - ytarget["cls_id"][batch.mask].detach().cpu().numpy(), ypred["cls_id"][batch.mask].detach().cpu().numpy(), labels=range(13) - ) + _, loss, ypred_raw, ypred, ytarget = model_step(batch, model, mlpf_loss) # Save validation plots for first batch - if (rank == 0 or rank == "cpu") and ival == 0: - validation_plots(batch, ypred_raw, ytarget, ypred, tensorboard_writer, epoch, outdir) + # if (rank == 0 or rank == "cpu") and ival == 0 and make_plots: + # validation_plots(batch, ypred_raw, ytarget, ypred, tensorboard_writer, step, outdir) # Accumulate losses for loss_name in loss: - if loss_name not in epoch_loss: - epoch_loss[loss_name] = 0.0 - epoch_loss[loss_name] += loss[loss_name] - - # Log confusion matrices - if comet_experiment: - comet_experiment.log_confusion_matrix( - matrix=cm_X_target, title="Element to target", row_label="X", column_label="target", epoch=epoch, file_name="cm_X_target.json" - ) - comet_experiment.log_confusion_matrix( - matrix=cm_X_pred, title="Element to pred", row_label="X", column_label="pred", epoch=epoch, file_name="cm_X_pred.json" - ) - comet_experiment.log_confusion_matrix( - matrix=cm_id, title="Target to pred", row_label="target", column_label="pred", epoch=epoch, file_name="cm_id.json" - ) + if loss_name not in eval_loss: + eval_loss[loss_name] = 0.0 + eval_loss[loss_name] += loss[loss_name] # Average losses across steps num_steps = torch.tensor(float(len(valid_loader)), device=rank, dtype=torch.float32) if world_size > 1: torch.distributed.all_reduce(num_steps) - for loss_name in epoch_loss: + for loss_name in eval_loss: if world_size > 1: - torch.distributed.all_reduce(epoch_loss[loss_name]) - epoch_loss[loss_name] = epoch_loss[loss_name].cpu().item() / num_steps.cpu().item() + torch.distributed.all_reduce(eval_loss[loss_name]) + eval_loss[loss_name] = eval_loss[loss_name].cpu().item() / num_steps.cpu().item() if world_size > 1: dist.barrier() - return epoch_loss + return eval_loss -def train_all_epochs( +def _log_and_checkpoint_step( rank, world_size, + step, model, optimizer, + lr_schedule, + losses_train, + tensorboard_writer_train, + comet_experiment, + checkpoint_freq, + checkpoint_dir, train_loader, valid_loader, - num_epochs, + train_sampler, + valid_sampler, + num_patience, +): + """Helper function to log training information and save periodic checkpoints.""" + + # Log training losses to TensorBoard and CometML on the main process + if (rank == 0) or (rank == "cpu"): + # Log training losses + for loss, value in losses_train.items(): + tensorboard_writer_train.add_scalar(f"step/loss_{loss}", value, step) + + tensorboard_writer_train.flush() + + if comet_experiment: + comet_experiment.log_metrics(losses_train, prefix="step_train_loss", step=step) + + # Save a periodic checkpoint + if checkpoint_freq and (step % checkpoint_freq == 0): + if (rank == 0) or (rank == "cpu"): + extra_state = { + "step": step, + "optimizer_state_dict": optimizer.state_dict(), + "lr_schedule_state_dict": lr_schedule.state_dict(), + "train_loader_state_dict": train_loader.state_dict(), + "valid_loader_state_dict": valid_loader.state_dict(), + } + + checkpoint_path = f"{checkpoint_dir}/checkpoint-{step:02d}.pth" + save_checkpoint(checkpoint_path, model, optimizer, extra_state) + + # Clean up old checkpoints, keeping the last num_patience + checkpoints = sorted(Path(checkpoint_dir).glob("checkpoint-*.pth"), key=os.path.getmtime) + for i in range(len(checkpoints) - num_patience): + _logger.info("removing old checkpoint {}".format(checkpoints[i])) + os.remove(checkpoints[i]) + + +def _run_validation_cycle( + rank, + world_size, + model, + optimizer, + lr_schedule, + valid_loader, + step, + num_steps, + losses_train, + best_val_loss, + stale_steps, + outdir, + config, + device_type, + dtype, + tensorboard_writer_valid, + comet_experiment, + checkpoint_dir, + train_time, + t0_initial, + use_ray, + train_loader, + valid_sampler, + train_sampler, +): + """Run the validation, testing, and plotting cycle.""" + + _logger.info(f"Running validation on rank{rank}") + valid_loader.reset() + + # Run validation + log_memory("evaluate_start", rank, tensorboard_writer_valid, step) + losses_valid = evaluate( + rank=rank, + world_size=world_size, + model=model, + valid_loader=valid_loader, + step=step, + tensorboard_writer=tensorboard_writer_valid, + comet_experiment=comet_experiment, + outdir=outdir, + device_type=device_type, + dtype=dtype, + make_plots=config["make_plots"], + ) + log_memory("evaluate_end", rank, tensorboard_writer_valid, step) + valid_time = time.time() - train_time - t0_initial + total_time = time.time() - t0_initial + + # Update learning rate scheduler that depends on validation loss + if lr_schedule and isinstance(lr_schedule, torch.optim.lr_scheduler.ReduceLROnPlateau): + lr_schedule.step(losses_valid["Total"]) + + # Log validation metrics to CometML + if comet_experiment: + comet_experiment.log_metrics(losses_valid, prefix="step_valid_loss", step=step) + comet_experiment.log_metric("learning_rate", lr_schedule.get_last_lr(), step=step) + + # All subsequent actions are only done on the main process + if (rank == 0) or (rank == "cpu"): + # Save the best model checkpoint if validation loss improves + if losses_valid["Total"] < best_val_loss: + best_val_loss = losses_valid["Total"] + stale_steps = 0 + else: + stale_steps += 1 + + # Log validation losses to TensorBoard + for loss, value in losses_valid.items(): + tensorboard_writer_valid.add_scalar(f"step/loss_{loss}", value, step) + + # Save step statistics to a JSON file + history_path = Path(outdir) / "history" + history_path.mkdir(parents=True, exist_ok=True) + stats = { + "train": losses_train, + "valid": losses_valid, + "step_train_time": train_time, + "step_valid_time": valid_time, + "step_total_time": total_time, + } + with open(f"{history_path}/step_{step}.json", "w") as f: + json.dump(stats, f) + + # Calculate and log ETA + steps_remaining = num_steps - step + time_per_step = (time.time() - t0_initial) / step + eta = steps_remaining * time_per_step / 60 + + # Log a summary of the validation step + _logger.info( + f"VALIDATION | Step={step}/{num_steps} | " + f"Train Loss={losses_train['Total']:.4f} | " + f"Valid Loss={losses_valid['Total']:.4f} | " + f"Stale={stale_steps} | " + f"ETA={eta:.1f}m" + ) + + tensorboard_writer_valid.flush() + + # Run inference and plotting on test datasets for this step + testdir_name = f"_step_{step}" + log_memory("run_test_start", rank, tensorboard_writer_valid, step) + for sample in config["enabled_test_datasets"]: + run_test(rank, world_size, config, outdir, model, sample, testdir_name, dtype) + log_memory("run_test_end", rank, tensorboard_writer_valid, step) + + plot_metrics_sample = {} + if (rank == 0) or (rank == "cpu"): + log_memory("make_plots_start", rank, tensorboard_writer_valid, step) + for sample in config["enabled_test_datasets"]: + plot_metrics = make_plots(outdir, sample, config["dataset"], testdir_name, config["ntest"]) + plot_metrics_sample[sample] = plot_metrics + # Log key jet metrics to TensorBoard and CometML + for k in ["med", "iqr", "match_frac"]: + metric_name = f"step/{sample}/jet_ratio/jet_ratio_target_to_pred_pt/{k}" + metric_value = plot_metrics["jet_ratio"]["jet_ratio_target_to_pred_pt"][k] + tensorboard_writer_valid.add_scalar(metric_name, metric_value, step) + if comet_experiment: + comet_experiment.log_metric(metric_name, metric_value, step=step) + # Add jet metrics to the JSON log file + with open(f"{history_path}/step_{step}.json", "r+") as f: + data = json.load(f) + data.update({metric_name: metric_value}) + f.seek(0) + json.dump(data, f) + f.truncate() + log_memory("make_plots_end", rank, tensorboard_writer_valid, step) + + # Ray-specific reporting and checkpointing + if use_ray: + import ray + + metrics = { + "loss": losses_train["Total"], + "val_loss": losses_valid["Total"], + "step": step, + **{f"train_{k}": v for k, v in losses_train.items()}, + **{f"valid_{k}": v for k, v in losses_valid.items()}, + } + if (rank == 0) or (rank == "cpu"): + with TemporaryDirectory() as temp_checkpoint_dir: + extra_state = { + "step": step, + "optimizer_state_dict": optimizer.state_dict(), + "lr_schedule_state_dict": lr_schedule.state_dict(), + "train_loader_state_dict": train_loader.state_dict(), + "valid_loader_state_dict": valid_loader.state_dict(), + } + for sample in plot_metrics_sample.keys(): + for metric in ["iqr", "match_frac"]: + metric_name = f"step/{sample}/jet_ratio/jet_ratio_target_to_pred_pt/{metric}" + metrics[metric_name] = plot_metrics_sample[sample]["jet_ratio"]["jet_ratio_target_to_pred_pt"][metric] + metrics[f"step/{sample}/jet_ratio/jet_ratio_target_to_pred_pt/combined"] = ( + metrics[f"step/{sample}/jet_ratio/jet_ratio_target_to_pred_pt/iqr"] + - metrics[f"step/{sample}/jet_ratio/jet_ratio_target_to_pred_pt/match_frac"] + ) + save_checkpoint(Path(temp_checkpoint_dir) / "checkpoint.pth", model, optimizer, extra_state) + ray.train.report(metrics, checkpoint=ray.train.Checkpoint.from_directory(temp_checkpoint_dir)) + else: + ray.train.report(metrics) + + gc.collect() + if device_type == "cuda": + torch.cuda.empty_cache() + + return best_val_loss, stale_steps + + +def train_all_steps( + rank, + world_size, + model, + optimizer, + train_loader, + valid_loader, + num_steps, patience, outdir, config, trainable="all", dtype=torch.float32, - start_epoch=1, + start_step=1, lr_schedule=None, use_ray=False, checkpoint_freq=None, @@ -328,40 +506,17 @@ def train_all_epochs( comet_step_freq=None, val_freq=None, checkpoint_dir: str = "", + train_sampler=None, + valid_sampler=None, ): - """Main training loop that handles all epochs and validation - - Args: - rank: Device rank (GPU id or 'cpu') - world_size: Number of devices being used - model: The neural network model - optimizer: The optimizer - train_loader: Training data loader - valid_loader: Validation data loader - num_epochs: Total number of epochs to train - patience: Early stopping patience - outdir: Output directory for logs and checkpoints - trainable: Which model parts to train ("all" or list of layer names) - dtype: Torch dtype for computations - start_epoch: Epoch to start/resume from - lr_schedule: Learning rate scheduler - use_ray: Whether using Ray for distributed training - checkpoint_freq: How often to save checkpoints - comet_experiment: Comet.ml experiment object - comet_step_freq: How often to log to comet - val_freq: How often to run validation - checkpoint_dir: Directory to save checkpoints - """ + """Main training loop that handles all steps and validation""" + _logger.info(f"Starting training from step {start_step} to {num_steps} on rank {rank} of {world_size}") + assert len(train_loader) > 0 - # run per-worker setup here so all processes / threads get configured. - # Ignore divide by 0 errors + # Per-worker setup np.seterr(divide="ignore", invalid="ignore") - # disable GUI - import matplotlib - matplotlib.use("agg") - - # Setup tensorboard writers + # Setup TensorBoard writers on the main process if (rank == 0) or (rank == "cpu"): tensorboard_writer_train = SummaryWriter(f"{outdir}/runs/train") tensorboard_writer_valid = SummaryWriter(f"{outdir}/runs/valid") @@ -373,23 +528,36 @@ def train_all_epochs( t0_initial = time.time() # Early stopping setup - stale_epochs = torch.tensor(0, device=rank) + stale_steps = 0 best_val_loss = float("inf") scaler = torch.amp.GradScaler() + train_iterator = iter(train_loader) + + # Use tqdm for progress bar only on the main process in an interactive session + is_interactive = ((world_size <= 1) or (rank == 0)) and sys.stdout.isatty() + iterator = range(start_step, num_steps + 1) + if is_interactive: + iterator = tqdm.tqdm(iterator, initial=start_step, total=num_steps, desc=f"Training on rank={rank}") + + # loop over the dataset + for step in iterator: + step_start_time = time.time() - for epoch in range(start_epoch, num_epochs + 1): - epoch_start_time = time.time() + # Get next training batch + batch = next(train_iterator) + _logger.debug(f"rank={rank} batch={batch.X.shape}") - # Training epoch - losses_train = train_epoch( + # Run a single training step + log_memory("train_step_start", rank, tensorboard_writer_train, step) + losses_train = train_step( rank=rank, world_size=world_size, model=model, optimizer=optimizer, - train_loader=train_loader, + batch=batch, lr_schedule=lr_schedule, - epoch=epoch, + step=step, tensorboard_writer=tensorboard_writer_train, comet_experiment=comet_experiment, comet_step_freq=comet_step_freq, @@ -397,175 +565,89 @@ def train_all_epochs( device_type=device_type, dtype=dtype, scaler=scaler, + loader_state_dict=train_loader.state_dict()["loader_state_dict"], ) - train_time = time.time() - epoch_start_time + log_memory("train_step_end", rank, tensorboard_writer_train, step) + train_time = time.time() - step_start_time - # Validation epoch - losses_valid = eval_epoch( - rank=rank, - world_size=world_size, - model=model, - valid_loader=valid_loader, - epoch=epoch, - tensorboard_writer=tensorboard_writer_valid, - comet_experiment=comet_experiment, - outdir=outdir, - device_type=device_type, - dtype=dtype, - ) - valid_time = time.time() - train_time - epoch_start_time - total_time = time.time() - epoch_start_time - - if lr_schedule: - # ReduceLROnPlateau scheduler should only be updated after each full epoch - # Other schedulers are updated after each step inside the optimizer_step() function - if isinstance(lr_schedule, torch.optim.lr_scheduler.ReduceLROnPlateau): - lr_schedule.step(losses_valid["Total"]) - - # Log metrics - if comet_experiment: - comet_experiment.log_metrics(losses_train, prefix="epoch_train_loss", epoch=epoch) - comet_experiment.log_metrics(losses_valid, prefix="epoch_valid_loss", epoch=epoch) - comet_experiment.log_metric("learning_rate", lr_schedule.get_last_lr(), epoch=epoch) - comet_experiment.log_epoch_end(epoch) - - # Handle checkpointing and logging on rank 0 - if (rank == 0) or (rank == "cpu"): - # Log learning rate - tensorboard_writer_train.add_scalar("epoch/learning_rate", lr_schedule.get_last_lr()[0], epoch) - - # Prepare checkpoint state - extra_state = {"epoch": epoch, "lr_schedule_state_dict": lr_schedule.state_dict()} + # Log a brief training status every 100 steps on the main process + if step % 100 == 0: + # Get the current learning rate, handling the case of multiple parameter groups + current_lr = lr_schedule.get_last_lr()[0] + _logger.info(f"Step {step}/{num_steps} rank{rank} | " f"Train Loss: {losses_train['Total']:.4f} | " f"LR: {current_lr:.2e}") - # Save best model if validation loss improved - if losses_valid["Total"] < best_val_loss: - best_val_loss = losses_valid["Total"] - stale_epochs = 0 - save_checkpoint(f"{checkpoint_dir}/best_weights.pth", model, optimizer, extra_state) - else: - stale_epochs += 1 - - # Periodic epoch checkpointing - if checkpoint_freq and (epoch % checkpoint_freq == 0): - checkpoint_path = f"{checkpoint_dir}/checkpoint-{epoch:02d}-{losses_valid['Total']:.6f}.pth" - save_checkpoint(checkpoint_path, model, optimizer, extra_state) - - # Update loss history - for loss in losses_train: - tensorboard_writer_train.add_scalar(f"epoch/loss_{loss}", losses_train[loss], epoch) - tensorboard_writer_valid.add_scalar(f"epoch/loss_{loss}", losses_valid[loss], epoch) - - # Save epoch stats to JSON - history_path = Path(outdir) / "history" - history_path.mkdir(parents=True, exist_ok=True) - stats = { - "train": losses_train, - "valid": losses_valid, - "epoch_train_time": train_time, - "epoch_valid_time": valid_time, - "epoch_total_time": total_time, - } - with open(f"{history_path}/epoch_{epoch}.json", "w") as f: - json.dump(stats, f) - - # Calculate and log ETA - epochs_remaining = num_epochs - epoch - time_per_epoch = (time.time() - t0_initial) / epoch - eta = epochs_remaining * time_per_epoch / 60 - - # Log epoch summary - _logger.info( - f"Rank {rank}: epoch={epoch}/{num_epochs} " - f"train_loss={losses_train['Total']:.4f} " - f"valid_loss={losses_valid['Total']:.4f} " - f"stale={stale_epochs} " - f"epoch_train_time={train_time/60:.2f}m " - f"epoch_valid_time={valid_time/60:.2f}m " - f"epoch_total_time={total_time/60:.2f}m " - f"eta={eta:.1f}m", - color="bold", - ) + # check smi status + log_smi(rank) - # Flush tensorboard - tensorboard_writer_train.flush() - tensorboard_writer_valid.flush() + # Synchronize all processes at the end of the step + if world_size > 1: + dist.barrier() - # evaluate the model at this epoch on test datasets, make plots, track metrics - testdir_name = f"_epoch_{epoch}" - for sample in config["enabled_test_datasets"]: - run_test(rank, world_size, config, outdir, model, sample, testdir_name, dtype) - if (rank == 0) or (rank == "cpu"): # plot only on rank 0 - for sample in config["enabled_test_datasets"]: - plot_metrics = make_plots(outdir, sample, config["dataset"], testdir_name, config["ntest"]) - - # track the following jet metrics in tensorboard - for k in ["med", "iqr", "match_frac"]: - tensorboard_writer_valid.add_scalar( - "epoch/{}/jet_ratio/jet_ratio_target_to_pred_pt/{}".format(sample, k), - plot_metrics["jet_ratio"]["jet_ratio_target_to_pred_pt"][k], - epoch, - ) - if comet_experiment: - comet_experiment.log_metric( - "epoch/{}/jet_ratio/jet_ratio_target_to_pred_pt/{}".format(sample, k), - plot_metrics["jet_ratio"]["jet_ratio_target_to_pred_pt"][k], - epoch=epoch, - ) - # Add jet metrics entry to the JSON logging file - additional_stats = { - "epoch/{}/jet_ratio/jet_ratio_target_to_pred_pt/{}".format(sample, k): plot_metrics["jet_ratio"][ - "jet_ratio_target_to_pred_pt" - ][k] - } - with open(f"{history_path}/epoch_{epoch}.json", "r+") as f: - data = json.load(f) - data.update(additional_stats) - f.seek(0) - json.dump(data, f) - f.truncate() - - # Ray training specific logging - if use_ray: - import ray - - metrics = { - "loss": losses_train["Total"], - "val_loss": losses_valid["Total"], - "epoch": epoch, - **{f"train_{k}": v for k, v in losses_train.items()}, - **{f"valid_{k}": v for k, v in losses_valid.items()}, - } + # Log training info and save periodic checkpoint immediately after training + _log_and_checkpoint_step( + rank, + world_size, + step, + model, + optimizer, + lr_schedule, + losses_train, + tensorboard_writer_train, + comet_experiment, + checkpoint_freq, + checkpoint_dir, + train_loader, + valid_loader, + train_sampler, + valid_sampler, + config["patience"], + ) - if (rank == 0) or (rank == "cpu"): - with TemporaryDirectory() as temp_checkpoint_dir: - temp_checkpoint_dir = Path(temp_checkpoint_dir) - save_checkpoint(temp_checkpoint_dir / "checkpoint.pth", model, optimizer, extra_state) - ray.train.report( - metrics, - checkpoint=ray.train.Checkpoint.from_directory(temp_checkpoint_dir) if rank == 0 else None, - ) - else: - ray.train.report(metrics) + # Run validation, testing, and plotting cycle at specified frequency, or at the last step + if (step % val_freq == 0) or (step == num_steps): + best_val_loss, stale_steps = _run_validation_cycle( + rank, + world_size, + model, + optimizer, + lr_schedule, + valid_loader, + step, + num_steps, + losses_train, + best_val_loss, + stale_steps, + outdir, + config, + device_type, + dtype, + tensorboard_writer_valid, + comet_experiment, + checkpoint_dir, + train_time, + t0_initial, + use_ray, + train_loader, + valid_sampler, + train_sampler, + ) - # Check early stopping - if stale_epochs > patience: - _logger.info(f"Breaking due to stale epochs: {stale_epochs}") + # Check for early stopping + if stale_steps > patience: + _logger.info(f"Stopping early due to stale steps: {stale_steps} > {patience}") break - # Synchronize processes - if world_size > 1: - dist.barrier() - # End loop over epochs, training completed + # End of training loop _logger.info(f"Training completed. Total time on device {rank}: {(time.time() - t0_initial)/60:.3f}min") - # Clean up + # Clean up TensorBoard writers if (rank == 0) or (rank == "cpu"): tensorboard_writer_train.close() tensorboard_writer_valid.close() def run_test(rank, world_size, config, outdir, model, sample, testdir_name, dtype): - batch_size = config["gpu_batch_multiplier"] + batch_size = config["test_dataset"][sample]["batch_size"] * config["gpu_batch_multiplier"] version = config["test_dataset"][sample]["version"] split_configs = config["test_dataset"][sample]["splits"] @@ -590,10 +672,16 @@ def run_test(rank, world_size, config, outdir, model, sample, testdir_name, dtyp else: sampler = torch.utils.data.RandomSampler(ds) + vals_for_test = ["X", "ytarget", "ytarget_pt_orig", "ytarget_e_orig", "ycand", "genjets", "targetjets"] + + # pythia branch was introduced for cms in version 2.8.0 + if sample.startswith("cms_") and Version(version) >= Version("2.8.0"): + vals_for_test += ["pythia"] + test_loader = torch.utils.data.DataLoader( ds, batch_size=batch_size, - collate_fn=Collater(["X", "ytarget", "ytarget_pt_orig", "ytarget_e_orig", "ycand", "genjets", "targetjets"], ["genmet"]), + collate_fn=Collater(vals_for_test, ["genmet"]), sampler=sampler, num_workers=config["num_workers"], prefetch_factor=config["prefetch_factor"], @@ -640,9 +728,9 @@ def run_test(rank, world_size, config, outdir, model, sample, testdir_name, dtyp dist.barrier() # block until all workers finished executing run_predictions() -def run(rank, world_size, config, outdir, logfile): - if (rank == 0) or (rank == "cpu"): # keep writing the logs - _configLogger("mlpf", filename=logfile) +def run(rank: int | str, world_size: int, config: dict, outdir: str, logfile: str): + # per-rank log + _configLogger("mlpf", rank, filename=f"{logfile}.{rank}") use_cuda = rank != "cpu" @@ -652,11 +740,11 @@ def run(rank, world_size, config, outdir, logfile): if world_size > 1: os.environ["MASTER_ADDR"] = "localhost" os.environ["MASTER_PORT"] = "12355" - dist.init_process_group("nccl", rank=rank, world_size=world_size) # (nccl should be faster than gloo) + dist.init_process_group("nccl", rank=int(rank), world_size=world_size) # (nccl should be faster than gloo) - start_epoch = 1 checkpoint_dir = Path(outdir) / "checkpoints" - checkpoint_dir.mkdir(parents=True, exist_ok=True) + if (rank == 0) | (rank == "cpu"): + checkpoint_dir.mkdir(parents=True, exist_ok=True) model_kwargs = { "input_dim": len(X_FEATURES[config["dataset"]]), @@ -672,17 +760,18 @@ def run(rank, world_size, config, outdir, logfile): **config["model"][config["conv_type"]], } + start_step = 1 + lr_schedule = None + checkpoint = None + # load a pre-trained checkpoint (continue an aborted training or fine-tune) if config["load"]: model = MLPF(**model_kwargs).to(torch.device(rank)) optimizer = get_optimizer(model, config) + lr_schedule = get_lr_schedule(config, optimizer, config["num_steps"]) checkpoint = torch.load(config["load"], map_location=torch.device(rank)) - - if config["start_epoch"] is None: - start_epoch = int(os.path.basename(config["load"]).split("-")[1]) + 1 - else: - start_epoch = config["start_epoch"] + start_step = checkpoint["extra_state"]["step"] + 1 missing_keys, strict = [], True for k in model.state_dict().keys(): @@ -704,24 +793,23 @@ def run(rank, world_size, config, outdir, logfile): _logger.warning("Use option --relaxed-load if you insist to ignore the missing parameters") raise KeyError - if (rank == 0) or (rank == "cpu"): - _logger.info("Loaded model weights from {}".format(config["load"]), color="bold") + _logger.info("Loaded model weights from {}".format(config["load"]), color="bold") + _logger.info(f"Restoring training from step {start_step}") + load_lr_schedule(lr_schedule, checkpoint, start_step=start_step) model, optimizer = load_checkpoint(checkpoint, model, optimizer, strict) - # if we are rewinding the epoch counter to 1, then we also want to set the learning rate to the initial value - if start_epoch == 1: - for g in optimizer.param_groups: - if g["lr"] != config["lr"]: - _logger.info("optimizer param group lr changed {} -> {}".format(g["lr"], config["lr"])) - g["lr"] = config["lr"] - else: # instantiate a new model in the outdir created model = MLPF(**model_kwargs) optimizer = get_optimizer(model, config) + lr_schedule = get_lr_schedule(config, optimizer, config["num_steps"]) model.to(rank) - model.compile() + # CPU: the compilation does not work with bs>1 + # Nvidia: compilation should generally be used, but can be disabled + # ROCM: compilation seems to be needed for ROCm to work properly + if rank != "cpu": + model.compile() configure_model_trainable(model, config["model"]["trainable"], True) if world_size > 1: @@ -729,14 +817,12 @@ def run(rank, world_size, config, outdir, logfile): model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[rank]) trainable_params, nontrainable_params, table = count_parameters(model) - print(table) - - if (rank == 0) or (rank == "cpu"): - _logger.info(model) - _logger.info(f"Trainable parameters: {trainable_params}") - _logger.info(f"Non-trainable parameters: {nontrainable_params}") - _logger.info(f"Total parameters: {trainable_params + nontrainable_params}") - _logger.info(table.to_string(index=False)) + _logger.info(str(table)) + _logger.info(model) + _logger.info(f"Trainable parameters: {trainable_params}") + _logger.info(f"Non-trainable parameters: {nontrainable_params}") + _logger.info(f"Total parameters: {trainable_params + nontrainable_params}") + _logger.info(table.to_string(index=False)) if config["train"]: if (rank == 0) or (rank == "cpu"): @@ -768,31 +854,39 @@ def run(rank, world_size, config, outdir, logfile): else: comet_experiment = None - loaders = get_interleaved_dataloaders( + loaders, samplers = get_interleaved_dataloaders( world_size, rank, config, use_cuda, use_ray=False, ) - steps_per_epoch = len(loaders["train"]) - last_epoch = -1 if start_epoch == 1 else start_epoch - 1 - lr_schedule = get_lr_schedule(config, optimizer, config["num_epochs"], steps_per_epoch, last_epoch) - train_all_epochs( + if config["load"] and checkpoint: + train_loader = loaders["train"] + valid_loader = loaders["valid"] + if "train_loader_state_dict" in checkpoint["extra_state"]: + train_loader.load_state_dict(checkpoint["extra_state"]["train_loader_state_dict"]) + if "valid_loader_state_dict" in checkpoint["extra_state"]: + valid_loader.load_state_dict(checkpoint["extra_state"]["valid_loader_state_dict"]) + + for split in loaders.keys(): + _logger.info("loader {} rank={} len={}".format(split, rank, len(loaders[split]))) + + train_all_steps( rank, world_size, model, optimizer, loaders["train"], loaders["valid"], - config["num_epochs"], + config["num_steps"], config["patience"], outdir, config, trainable=config["model"]["trainable"], dtype=dtype, - start_epoch=start_epoch, + start_step=start_step, lr_schedule=lr_schedule, use_ray=False, checkpoint_freq=config["checkpoint_freq"], @@ -800,28 +894,10 @@ def run(rank, world_size, config, outdir, logfile): comet_step_freq=config["comet_step_freq"], val_freq=config["val_freq"], checkpoint_dir=str(checkpoint_dir), + train_sampler=samplers["train"], + valid_sampler=samplers["valid"], ) - checkpoint = torch.load(f"{checkpoint_dir}/best_weights.pth", map_location=torch.device(rank)) - model, optimizer = load_checkpoint(checkpoint, model, optimizer) - - if not (config["load"] is None): - testdir_name = "_" + Path(config["load"]).stem - else: - testdir_name = "_best_weights" - - if config["test"]: - for sample in config["enabled_test_datasets"]: - run_test(rank, world_size, config, outdir, model, sample, testdir_name, dtype) - - # make plots only on rank 0 - if (rank == 0) or (rank == "cpu"): - if config["make_plots"]: - ntest_files = -1 - for sample in config["enabled_test_datasets"]: - _logger.info(f"Plotting distributions for {sample}") - make_plots(outdir, sample, config["dataset"], testdir_name, ntest_files) - if world_size > 1: dist.destroy_process_group() @@ -830,9 +906,12 @@ def override_config(config: dict, args): """override config dictionary with values from argparse Namespace""" for arg in vars(args): arg_value = getattr(args, arg) - if (arg_value is not None) and (arg in config): - _logger.info("overriding config item {}={} with {} from cmdline".format(arg, config[arg], arg_value)) - config[arg] = arg_value + if arg_value is not None: + if arg in config: + _logger.info("overriding config item {}={} with {} from cmdline".format(arg, config[arg], arg_value)) + config[arg] = arg_value + else: + _logger.info("skipping {}".format(arg)) if "attention_type" in args and args.attention_type is not None: config["model"]["attention"]["attention_type"] = args.attention_type @@ -842,21 +921,14 @@ def override_config(config: dict, args): config["model"][model]["num_convs"] = args.num_convs config["enabled_test_datasets"] = list(config["test_dataset"].keys()) - if len(args.test_datasets) != 0: - config["enabled_test_datasets"] = args.test_datasets + if "test_datasets" in args: + if len(args.test_datasets) != 0: + config["enabled_test_datasets"] = args.test_datasets config["train"] = args.train config["test"] = args.test - config["make_plots"] = args.make_plots - config["start_epoch"] = None - - if "start_epoch" in args and args.start_epoch is not None: - args.start_epoch = int(args.start_epoch) - config["start_epoch"] = args.start_epoch - - if config["load"] is None: - if config["start_epoch"] is None: - config["start_epoch"] = 1 + if "make_plots" in args: + config["make_plots"] = args.make_plots return config @@ -867,7 +939,7 @@ def device_agnostic_run(config, world_size, outdir): logfile = f"{outdir}/train.log" else: logfile = f"{outdir}/test.log" - _configLogger("mlpf", filename=logfile) + _configLogger("mlpf", 0, filename=logfile) if config["gpus"]: assert ( diff --git a/mlpf/model/utils.py b/mlpf/model/utils.py index f7ece3da8..70453b15e 100644 --- a/mlpf/model/utils.py +++ b/mlpf/model/utils.py @@ -258,7 +258,7 @@ def print_optimizer_stats(optimizer, stage): print(f" {key}: {value}") -def load_checkpoint(checkpoint, model, optimizer, strict=True): +def load_checkpoint(checkpoint, model, optimizer, strict=True, start_step=0): if isinstance(model, torch.nn.parallel.DistributedDataParallel): model.module.load_state_dict(checkpoint["model_state_dict"], strict=strict) else: @@ -270,10 +270,17 @@ def load_checkpoint(checkpoint, model, optimizer, strict=True): logging.info("Loaded optimizer state") print_optimizer_stats(optimizer, "After loading optimizer state") + if "rng_state" in checkpoint["extra_state"]: + torch.set_rng_state(checkpoint["extra_state"]["rng_state"].cpu()) + logging.info("Loaded RNG state") + return model, optimizer def save_checkpoint(checkpoint_path, model, optimizer=None, extra_state=None): + if extra_state is None: + extra_state = {} + extra_state["rng_state"] = torch.get_rng_state() torch.save( { "model_state_dict": get_model_state_dict(model), @@ -284,31 +291,29 @@ def save_checkpoint(checkpoint_path, model, optimizer=None, extra_state=None): ) -def load_lr_schedule(lr_schedule, checkpoint): - "Loads the lr_schedule's state dict from checkpoint" +def load_lr_schedule(lr_schedule, checkpoint, start_step=0): + """Loads the lr_schedule's state dict from checkpoint and sets the last_epoch to start_step""" if "lr_schedule_state_dict" in checkpoint["extra_state"].keys(): - lr_schedule.load_state_dict(checkpoint["extra_state"]["lr_schedule_state_dict"]) - return lr_schedule + state_dict = checkpoint["extra_state"]["lr_schedule_state_dict"] + lr_schedule.load_state_dict(state_dict) + lr_schedule.last_epoch = start_step else: raise KeyError("Couldn't find LR schedule state dict in checkpoint. extra_state contains: {}".format(checkpoint["extra_state"].keys())) -def get_lr_schedule(config, opt, epochs=None, steps_per_epoch=None, last_epoch=-1): - # we step the schedule every mini-batch so need to multiply by steps_per_epoch - last_batch = last_epoch * steps_per_epoch - 1 if last_epoch != -1 else -1 +def get_lr_schedule(config, opt, num_steps, last_batch=-1): if config["lr_schedule"] == "constant": - lr_schedule = ConstantLR(opt, factor=1.0, total_iters=steps_per_epoch * epochs) + lr_schedule = ConstantLR(opt, factor=1.0, total_iters=num_steps) elif config["lr_schedule"] == "onecycle": lr_schedule = OneCycleLR( opt, max_lr=config["lr"], - steps_per_epoch=steps_per_epoch, - epochs=epochs, + total_steps=num_steps, last_epoch=last_batch, pct_start=config["lr_schedule_config"]["onecycle"]["pct_start"] or 0.3, ) elif config["lr_schedule"] == "cosinedecay": - lr_schedule = CosineAnnealingLR(opt, T_max=steps_per_epoch * epochs, last_epoch=last_batch, eta_min=config["lr"] * 0.1) + lr_schedule = CosineAnnealingLR(opt, T_max=num_steps, last_epoch=last_batch, eta_min=config["lr"] * 0.1) elif config["lr_schedule"] == "reduce_lr_on_plateau": lr_schedule = torch.optim.lr_scheduler.ReduceLROnPlateau( opt, diff --git a/mlpf/optimizers/__init__.py b/mlpf/optimizers/__init__.py new file mode 100644 index 000000000..af8355dbf --- /dev/null +++ b/mlpf/optimizers/__init__.py @@ -0,0 +1,35 @@ +import torch +from mlpf.optimizers.lamb import Lamb +from mlpf.logger import _logger + + +def get_optimizer(model, config): + """ + Returns the optimizer for the given model based on the configuration provided. + Parameters: + model (torch.nn.Module): The model for which the optimizer is to be created. + config (dict): Configuration dictionary containing optimizer settings. + Must include the key "lr" for learning rate. + Optionally includes the key "optimizer" to specify the type of optimizer. + Supported values for "optimizer" are "adamw", "lamb", and "sgd". + If "optimizer" is not provided, "adamw" is used by default. + Returns: + torch.optim.Optimizer: The optimizer specified in the configuration. + Raises: + ValueError: If the specified optimizer type is not supported. + """ + + wd = config["weight_decay"] if "weight_decay" in config else 0.01 + if "optimizer" not in config: + ret = torch.optim.AdamW(model.parameters(), lr=config["lr"], weight_decay=wd) + if config["optimizer"] == "adamw": + ret = torch.optim.AdamW(model.parameters(), lr=config["lr"], weight_decay=wd) + elif config["optimizer"] == "lamb": + ret = Lamb(model.parameters(), lr=config["lr"], weight_decay=wd) + elif config["optimizer"] == "sgd": + ret = torch.optim.SGD(model.parameters(), lr=config["lr"], weight_decay=wd) + else: + raise ValueError(f"Unsupported optimizer type: {config['optimizer']}") + + _logger.info(f"Created optimizer: {ret}") + return ret diff --git a/mlpf/pipeline.py b/mlpf/pipeline.py index d9e143803..159eced77 100644 --- a/mlpf/pipeline.py +++ b/mlpf/pipeline.py @@ -23,7 +23,7 @@ from mlpf.model.training import device_agnostic_run, override_config from mlpf.model.distributed_ray import run_hpo, run_ray_training from mlpf.model.PFDataset import SHARING_STRATEGY -from utils import create_experiment_dir +from mlpf.utils import create_experiment_dir def get_parser(): @@ -49,8 +49,7 @@ def get_parser(): parser_train.add_argument("--prefetch-factor", type=int, default=None, help="Number of samples to fetch & prefetch per worker") parser_train.add_argument("--load", type=str, default=None, help="Load a checkpoint and continue training") parser_train.add_argument("--relaxed-load", action="store_true", help="Loosely load model parameters, ignoring missing keys") - parser_train.add_argument("--num-epochs", type=int, default=None, help="Number of training epochs") - parser_train.add_argument("--start-epoch", type=int, default=None, help="The initial epoch counter") + parser_train.add_argument("--num-steps", type=int, default=None, help="Number of training steps") parser_train.add_argument("--patience", type=int, default=None, help="Patience before early stopping") parser_train.add_argument("--lr", type=float, default=None, help="Learning rate") parser_train.add_argument("--lr-schedule", type=str, default=None, choices=["constant", "cosinedecay", "onecycle", "reduce_lr_on_plateau"]) @@ -92,7 +91,7 @@ def get_parser(): parser_ray.add_argument("--ray-gpus", type=int, default=0, help="GPUs per worker for Ray Train") parser_ray.add_argument("--ray-cpus", type=int, help="CPUs per worker for Ray Train") parser_ray.add_argument("--ray-local", action="store_true", help="Run Ray Train cluster locally") - parser_ray.add_argument("--num-epochs", type=int, default=None, help="Number of training epochs") + parser_ray.add_argument("--num-steps", type=int, default=None, help="Number of training steps") parser_ray.add_argument("--load", type=str, default=None, help="Load a checkpoint and continue training") parser_ray.add_argument("--comet", action="store_true", help="Use comet.ml logging") parser_ray.add_argument("--comet-offline", action="store_true", help="Save comet logs locally") @@ -103,7 +102,6 @@ def get_parser(): parser_ray.add_argument("--num-convs", type=int, default=None, help="Number of GNN/Attention layers") parser_ray.add_argument("--test-datasets", nargs="+", default=[], help="Test samples to process after training") parser_ray.add_argument("--make-plots", action="store_true", help="Generate plots of test predictions") - parser_ray.add_argument("--start-epoch", type=int, default=None, help="The initial epoch counter") # --- 'ray-hpo' command parser --- parser_hpo = subparsers.add_parser("ray-hpo", help="Run hyperparameter optimization with Ray Tune") diff --git a/mlpf/plotting/corrections.py b/mlpf/plotting/corrections.py new file mode 100644 index 000000000..894ed1c7b --- /dev/null +++ b/mlpf/plotting/corrections.py @@ -0,0 +1,361 @@ +import click +import awkward +import numpy as np +from scipy.interpolate import griddata, RegularGridInterpolator +from mlpf.plotting.utils import compute_response +import matplotlib.pyplot as plt +import mplhep +from mlpf.plotting.plot_utils import sample_label, cms_label, med_iqr, sample_name_to_process, midpoints +from mlpf.plotting.utils import Gauss, to_bh, compute_scale_res + +# settings from notebook +mplhep.style.use("CMS") +np.seterr(divide="ignore") +legend_fontsize = 20 +sample_label_fontsize = 40 +addtext_fontsize = 25 +jet_label_coords_single = 0.02, 0.86 +sample_label_coords = 0.02, 0.96 +jet_label_corr = "Corr. jet " +jet_label_raw = "Raw jet " +pf_linestyle = "-." +mlpf_linestyle = "-" + + +def jet_response_plot( + resp_pf, + resp_mlpf, + data_baseline, + data_mlpf, + response="response", + genjet_min_pt=0, + genjet_max_pt=5000, + genjet_min_eta=-6, + genjet_max_eta=6, + jet_label="", + additional_label="", + jet_pt="Jet_pt_corr", + genjet_pt="GenJet_pt", + genjet_eta="GenJet_eta", + additional_cut=lambda data: data["Jet_pt"] > 0, # dummy + mlpf_label="MLPF", + physics_process="unknown", +): + + plt.figure() + ax = plt.axes() + b = np.linspace(0, 2, 101) + + cms_label(ax) + sample_label(ax, physics_process, x=sample_label_coords[0], y=sample_label_coords[1], fontsize=sample_label_fontsize) + ax.text( + jet_label_coords_single[0], + jet_label_coords_single[1], + jet_label + additional_label, + transform=ax.transAxes, + fontsize=addtext_fontsize, + ) + + # the additional cut is not available in this context, so we disable it + # add_cut_pf = additional_cut(data_baseline) + # add_cut_mlpf = additional_cut(data_mlpf) + add_cut_pf = awkward.ones_like(resp_pf[response], dtype=bool) + add_cut_mlpf = awkward.ones_like(resp_mlpf[response], dtype=bool) + + jet_response_pf = awkward.flatten( + resp_pf[response][ + (resp_pf[genjet_pt] >= genjet_min_pt) + & (resp_pf[genjet_pt] < genjet_max_pt) + & (resp_pf[genjet_eta] >= genjet_min_eta) + & (resp_pf[genjet_eta] < genjet_max_eta) + & add_cut_pf + ] + ) + jet_response_mlpf = awkward.flatten( + resp_mlpf[response][ + (resp_mlpf[genjet_pt] >= genjet_min_pt) + & (resp_mlpf[genjet_pt] < genjet_max_pt) + & (resp_mlpf[genjet_eta] >= genjet_min_eta) + & (resp_mlpf[genjet_eta] < genjet_max_eta) + & add_cut_mlpf + ] + ) + + h0 = to_bh(jet_response_pf, b) + h1 = to_bh(jet_response_mlpf, b) + + norm_pf, mean_pf, std_pf = compute_scale_res(jet_response_pf) + norm_mlpf, mean_mlpf, std_mlpf = compute_scale_res(jet_response_mlpf) + med_pf, iqr_pf = med_iqr(jet_response_pf) + med_mlpf, iqr_mlpf = med_iqr(jet_response_mlpf) + + default_cycler = plt.rcParams["axes.prop_cycle"] + pf_color = list(default_cycler)[1]["color"] + mlpf_color = list(default_cycler)[2]["color"] + + plt.plot([], []) + x0 = mplhep.histplot( + h0, + histtype="step", + lw=2, + label="PF\nmean: {:.2f} std: {:.2f}\nmed: {:.2f} IQR: {:.2f}".format(mean_pf, std_pf, med_pf, iqr_pf), + ls=pf_linestyle, + color=pf_color, + ) + x1 = mplhep.histplot( + h1, + histtype="step", + lw=2, + label="{}\nmean: {:.2f} std: {:.2f}\nmed: {:.2f} IQR: {:.2f}".format(mlpf_label, mean_mlpf, std_mlpf, med_mlpf, iqr_mlpf), + ls=mlpf_linestyle, + color=mlpf_color, + ) + if norm_pf > 0: + plt.plot(h0.axes[0].centers, Gauss(h0.axes[0].centers, norm_pf, mean_pf, std_pf), color=pf_color) + if norm_mlpf > 0: + plt.plot(h1.axes[0].centers, Gauss(h1.axes[0].centers, norm_mlpf, mean_mlpf, std_mlpf), color=mlpf_color) + + handles, labels = ax.get_legend_handles_labels() + handles = [x0[0].stairs, x1[0].stairs] + ax.legend(handles, labels, loc=(0.50, 0.50), fontsize=legend_fontsize) + jl = jet_label_corr if jet_pt.endswith("_corr") else jet_label_raw + plt.xlabel(jl + "pT response") + plt.ylabel("Count") + + ax.set_ylim(0, 1.5 * ax.get_ylim()[1]) + + ax.ticklabel_format(axis="y", style="sci", scilimits=(0, 0)) + ax.yaxis.get_offset_text().set_x(-0.01) + ax.yaxis.get_offset_text().set_ha("right") + return ( + (med_pf, np.std(jet_response_pf), len(jet_response_pf), std_pf), + (med_mlpf, np.std(jet_response_mlpf), len(jet_response_mlpf), std_mlpf), + ) + + +def save_jet_response_plots( + eta_reco_bins, + pt_gen_bins, + resp_pf, + resp_mlpf, + data_pf, + data_mlpf, + outpath, + jet_type="ak4", + sample="QCD", + response_type="response_raw", + suffix="raw", +): + jet_prefixes = {"ak4": "Jet", "ak8": "FatJet"} + jet_prefix = jet_prefixes[jet_type] + genjet_prefixes = {"ak4": "GenJet", "ak8": "GenJetAK8"} + genjet_prefix = genjet_prefixes[jet_type] + process_name = sample_name_to_process(sample) + + for ibin_eta in range(len(eta_reco_bins) - 1): + for ibin_pt in range(len(pt_gen_bins) - 1): + jet_response_plot( + resp_pf, + resp_mlpf, + data_pf, + data_mlpf, + response=response_type, + jet_pt=f"{jet_prefix}_pt_{suffix}", + genjet_eta=jet_prefix + "_eta", # here we intentionally cut on recojet instead of genjet + genjet_pt=genjet_prefix + "_pt", + genjet_min_eta=eta_reco_bins[ibin_eta], + genjet_max_eta=eta_reco_bins[ibin_eta + 1], + genjet_min_pt=pt_gen_bins[ibin_pt], + genjet_max_pt=pt_gen_bins[ibin_pt + 1], + jet_label=f"{jet_type} jets", + physics_process=process_name, + additional_label=", %.0f<$p_{{T,ptcl}}$<%.0f, %.2f<$\eta_{{reco}}$<%.2f" + % (pt_gen_bins[ibin_pt], pt_gen_bins[ibin_pt + 1], eta_reco_bins[ibin_eta], eta_reco_bins[ibin_eta + 1]), + ) + plt.savefig(f"{outpath}/{jet_type}_jet_pt_ratio_{suffix}_etabin{ibin_eta}_ptbin{ibin_pt}.pdf") + plt.close() + + +def save_jet_correction_heatmaps(corr_map_pf, corr_map_mlpf, eta_reco_bins, pt_gen_bins, outpath, jet_type, sample_name): + """Saves a 2D heatmap of jet corrections.""" + import matplotlib.colors + + for cmap, name in [(corr_map_pf, "pf"), (corr_map_mlpf, "mlpf")]: + plt.figure() + ax = plt.axes() + plt.imshow(cmap, norm=matplotlib.colors.Normalize(vmin=1.0, vmax=2.5)) + plt.colorbar(shrink=0.5, label="1/median") + plt.xticks(range(len(pt_gen_bins) - 1), ["{:.0f}".format(x) for x in midpoints(np.array(pt_gen_bins))]) + plt.yticks(range(len(eta_reco_bins) - 1), ["{:.2f}".format(x) for x in midpoints(np.array(eta_reco_bins))]) + plt.xlabel("$p_{T,ptcl}$ (GeV)") + plt.ylabel("$\eta_{reco}$") + ax.text( + jet_label_coords_single[0], + jet_label_coords_single[1], + f"{name.upper()} {jet_type} jets", + transform=ax.transAxes, + fontsize=addtext_fontsize, + ) + plt.savefig(f"{outpath}/{jet_type}_correction_map_{name}.pdf") + plt.close() + + +def fill_nan(reciprocal): + mask = np.isnan(reciprocal) | np.isinf(reciprocal) + if not np.any(mask): + return reciprocal + + valid_coords = np.where(~mask) + if len(valid_coords[0]) == 0: # all are nan + return np.ones_like(reciprocal) + + nan_coords = np.where(mask) + valid_values = reciprocal[~mask] + + imputed_values = griddata(np.vstack(valid_coords).T, valid_values, np.vstack(nan_coords).T, method="nearest") + reciprocal = reciprocal.copy() + reciprocal[nan_coords] = imputed_values + return reciprocal + + +def calculate_correction_map(resp_data, eta_bins, pt_bins, jet_type="ak4", response_type="response_raw"): + jet_prefixes = {"ak4": "Jet", "ak8": "FatJet"} + jet_prefix = jet_prefixes[jet_type] + genjet_prefixes = {"ak4": "GenJet", "ak8": "GenJetAK8"} + genjet_prefix = genjet_prefixes[jet_type] + + resp_stats_med = np.zeros((len(eta_bins) - 1, len(pt_bins) - 1)) + + for ibin_eta in range(len(eta_bins) - 1): + for ibin_pt in range(len(pt_bins) - 1): + + mask = ( + (resp_data[genjet_prefix + "_pt"] >= pt_bins[ibin_pt]) + & (resp_data[genjet_prefix + "_pt"] < pt_bins[ibin_pt + 1]) + & (resp_data[jet_prefix + "_eta"] >= eta_bins[ibin_eta]) + & (resp_data[jet_prefix + "_eta"] < eta_bins[ibin_eta + 1]) + ) + + response_raw = awkward.flatten(resp_data[response_type][mask]) + median, _ = med_iqr(response_raw) + print(f"Response eta_bin={ibin_eta} pt_bin={ibin_pt} resp={len(response_raw)} median={median}") + resp_stats_med[ibin_eta, ibin_pt] = median + + reciprocal_med = 1.0 / resp_stats_med + reciprocal_med = fill_nan(reciprocal_med) + + return reciprocal_med + + +@click.command() +@click.option("--input-pf-parquet", required=True, type=str) +@click.option("--input-mlpf-parquet", required=True, type=str) +@click.option("--corrections-file", required=True, type=str) +@click.option("--jet-type", default="ak4", type=click.Choice(["ak4", "ak8"])) +@click.option("--output-dir", default=None, type=str, help="Directory to save validation plots.") +@click.option("--sample-name", default="QCD", type=str, help="Sample name for plots.") +def make_corrections(input_pf_parquet, input_mlpf_parquet, corrections_file, jet_type, output_dir, sample_name): + """Generates jet energy correction maps.""" + + data_pf = awkward.from_parquet(input_pf_parquet) + print("loaded {}: {}".format(input_pf_parquet, len(data_pf["Jet_pt"]))) + data_mlpf = awkward.from_parquet(input_mlpf_parquet) + print("loaded {}: {}".format(input_mlpf_parquet, len(data_mlpf["Jet_pt"]))) + + if jet_type == "ak4": + jet_coll = "Jet" + genjet_coll = "GenJet" + deltar_cut = 0.2 + eta_reco_bins = [-6, -5.191, -4.0, -2.964, -1.392, 0, 1.392, 2.964, 4.0, 5.191, 6] + pt_gen_bins = [10, 20, 30, 40, 50, 80, 120, 200, 500, 3000] + else: # ak8 + jet_coll = "FatJet" + genjet_coll = "GenJetAK8" + deltar_cut = 0.4 + eta_reco_bins = [-6, -5.191, -4.0, -2.964, -1.392, 0, 1.392, 2.964, 4.0, 5.191, 6] + pt_gen_bins = [200, 300, 400, 500, 3000] + + print("computing PF response") + resp_pf = compute_response(data_pf, jet_coll=jet_coll, genjet_coll=genjet_coll, deltar_cut=deltar_cut) + print("computing MLPF response") + resp_mlpf = compute_response(data_mlpf, jet_coll=jet_coll, genjet_coll=genjet_coll, deltar_cut=deltar_cut) + + if output_dir: + import os + + os.makedirs(output_dir, exist_ok=True) + save_jet_response_plots(eta_reco_bins, pt_gen_bins, resp_pf, resp_mlpf, data_pf, data_mlpf, output_dir, jet_type, sample_name) + + corr_map_pf = calculate_correction_map(resp_pf, eta_reco_bins, pt_gen_bins, jet_type=jet_type) + corr_map_mlpf = calculate_correction_map(resp_mlpf, eta_reco_bins, pt_gen_bins, jet_type=jet_type) + if output_dir: + save_jet_correction_heatmaps(corr_map_pf, corr_map_mlpf, eta_reco_bins, pt_gen_bins, output_dir, jet_type, sample_name) + + interp_pf = RegularGridInterpolator( + (midpoints(np.array(eta_reco_bins)), midpoints(np.array(pt_gen_bins))), + corr_map_pf, + method="linear", + bounds_error=False, + fill_value=None, + ) + interp_mlpf = RegularGridInterpolator( + (midpoints(np.array(eta_reco_bins)), midpoints(np.array(pt_gen_bins))), + corr_map_mlpf, + method="linear", + bounds_error=False, + fill_value=None, + ) + + corr_pf_interp = interp_pf( + np.stack( + [ + awkward.to_numpy(awkward.flatten(data_pf[jet_coll + "_eta"])), + awkward.to_numpy(awkward.flatten(data_pf[jet_coll + "_pt_raw"])), + ] + ).T + ) + corr_pf_interp = awkward.unflatten(corr_pf_interp, awkward.count(data_pf[jet_coll + "_eta"], axis=1)) + data_pf[jet_coll + "_pt_corr"] = data_pf[jet_coll + "_pt_raw"] * corr_pf_interp + + corr_mlpf_interp = interp_mlpf( + np.stack( + [ + awkward.to_numpy(awkward.flatten(data_mlpf[jet_coll + "_eta"])), + awkward.to_numpy(awkward.flatten(data_mlpf[jet_coll + "_pt_raw"])), + ] + ).T + ) + corr_mlpf_interp = awkward.unflatten(corr_mlpf_interp, awkward.count(data_mlpf[jet_coll + "_eta"], axis=1)) + data_mlpf[jet_coll + "_pt_corr"] = data_mlpf[jet_coll + "_pt_raw"] * corr_mlpf_interp + + print("computing corrected PF response") + resp_pf_corr = compute_response(data_pf, jet_coll=jet_coll, genjet_coll=genjet_coll, deltar_cut=deltar_cut) + print("computing corrected MLPF response") + resp_mlpf_corr = compute_response(data_mlpf, jet_coll=jet_coll, genjet_coll=genjet_coll, deltar_cut=deltar_cut) + + # get the per-bin medians after corrections + corr_map_pf2 = calculate_correction_map(resp_pf_corr, eta_reco_bins, pt_gen_bins, jet_type=jet_type, response_type="response") + corr_map_mlpf2 = calculate_correction_map(resp_mlpf_corr, eta_reco_bins, pt_gen_bins, jet_type=jet_type, response_type="response") + save_jet_correction_heatmaps(corr_map_pf2, corr_map_mlpf2, eta_reco_bins, pt_gen_bins, output_dir, jet_type + "corr", sample_name) + + save_jet_response_plots( + eta_reco_bins, + pt_gen_bins, + resp_pf_corr, + resp_mlpf_corr, + data_pf, + data_mlpf, + output_dir, + jet_type, + sample_name, + response_type="response", + suffix="corr", + ) + + np.savez(corrections_file, corr_map_pf=corr_map_pf, corr_map_mlpf=corr_map_mlpf, eta_bins=eta_reco_bins, pt_bins=pt_gen_bins) + + print(f"Saved correction maps to {corrections_file}") + + +if __name__ == "__main__": + make_corrections() diff --git a/mlpf/plotting/data_preparation.py b/mlpf/plotting/data_preparation.py new file mode 100644 index 000000000..14def83a5 --- /dev/null +++ b/mlpf/plotting/data_preparation.py @@ -0,0 +1,123 @@ +import click +import glob +import os +import awkward +import uproot +import tqdm +from concurrent.futures import ProcessPoolExecutor +import numpy as np + + +def load_nano(fn): + """Loads events from a nanoaod file.""" + tt = uproot.open(fn).get("Events") + ret = {} + for k in [ + "Jet_pt", + "Jet_eta", + "Jet_phi", + "Jet_genJetIdx", + "Jet_rawFactor", + "Jet_chMultiplicity", + "Jet_neMultiplicity", + "Jet_chEmEF", + "Jet_chHEF", + "Jet_neEmEF", + "Jet_neHEF", + "Jet_neHadMultiplicity", + "FatJet_pt", + "FatJet_eta", + "FatJet_phi", + "FatJet_genJetAK8Idx", + "FatJet_rawFactor", + "GenJet_pt", + "GenJet_eta", + "GenJet_phi", + "GenJet_partonFlavour", + "GenJetAK8_pt", + "GenJetAK8_eta", + "GenJetAK8_phi", + "GenMET_pt", + "GenMET_phi", + "PFMET_pt", + "PFMET_phi", + "PuppiMET_pt", + "PuppiMET_phi", + "RawPFMET_pt", + "RawPFMET_phi", + "Pileup_nPU", + "Pileup_nTrueInt", + "GenVtx_z", + "PV_z", + ]: + ret[k] = tt.arrays(k)[k] + return [ + ret, + ] + + +def load_multiprocess(files, max_workers=None): + with ProcessPoolExecutor(max_workers=max_workers) as executor: + results = list(tqdm.tqdm(executor.map(load_nano, files), total=len(files))) + successful_results = [r for r in results if r is not None] + return awkward.concatenate(successful_results) + + +@click.command() +@click.option("--input-dir", required=True, type=str, help="Input directory with ROOT files") +@click.option("--sample", required=True, type=str, help="Sample name (e.g., QCD_PU_13p6)") +@click.option("--output-dir", default=".", type=str, help="Output directory for parquet files") +@click.option("--max-files", default=-1, type=int, help="Maximum number of files to process") +@click.option("--max-workers", default=2, type=int, help="Number of worker processes") +def prepare_data(input_dir, sample, output_dir, max_files, max_workers): + """Loads ROOT files, processes them, and saves to Parquet format.""" + + os.makedirs(output_dir, exist_ok=True) + + pf_files = glob.glob(f"{input_dir}/{sample}_pf/step4_NANO_jme_*.root") + mlpf_files = glob.glob(f"{input_dir}/{sample}_mlpf/step4_NANO_jme_*.root") + + pf_files_d = {os.path.basename(fn): fn for fn in pf_files} + mlpf_files_d = {os.path.basename(fn): fn for fn in mlpf_files} + + common_files = list(set(pf_files_d.keys()).intersection(set(mlpf_files_d.keys()))) + if max_files != -1: + common_files = common_files[:max_files] + + print(f"Found {len(common_files)} common files.") + + for mlpf_or_pf in ["mlpf", "pf"]: + output_file = f"{output_dir}/{sample}_{mlpf_or_pf}.parquet" + + if mlpf_or_pf == "pf": + files_to_process = [pf_files_d[fn] for fn in common_files] + else: + files_to_process = [mlpf_files_d[fn] for fn in common_files] + + print(f"Processing {len(files_to_process)} files for {sample}_{mlpf_or_pf}") + + data = load_multiprocess(files_to_process, max_workers=max_workers) + + if data is None: + print(f"No data loaded for {sample}_{mlpf_or_pf}") + continue + + data = awkward.Array({k: awkward.flatten(data[k], axis=1) for k in data.fields}) + + if "Jet_pt" in data.fields: + data["Jet_pt_raw"] = data["Jet_pt"] * (1.0 - data["Jet_rawFactor"]) + if "FatJet_pt" in data.fields: + data["FatJet_pt_raw"] = data["FatJet_pt"] * (1.0 - data["FatJet_rawFactor"]) + + if "GenVtx_z" in data.fields and "PV_z" in data.fields: + abs_dz = np.abs(data["GenVtx_z"] - data["PV_z"]) + mask_dz = abs_dz < 0.2 + print("Applying dz cut: {}/{}".format(np.sum(mask_dz), len(mask_dz))) + data = data[mask_dz] + + awkward.to_parquet(data, output_file) + print(f"Saved data to {output_file}") + + +if __name__ == "__main__": + prepare_data() diff --git a/mlpf/plotting/plot_jet_response_comparison_v1.py b/mlpf/plotting/plot_jet_response_comparison_v1.py new file mode 100644 index 000000000..09bfdfc4e --- /dev/null +++ b/mlpf/plotting/plot_jet_response_comparison_v1.py @@ -0,0 +1,219 @@ +import click +import awkward +import numpy as np +import matplotlib + +matplotlib.use("Agg") +import matplotlib.pyplot as plt +import mplhep +import boost_histogram as bh +from pathlib import Path + +from mlpf.plotting.utils import compute_response +from mlpf.plotting.plot_utils import EVALUATION_DATASET_NAMES, sample_name_to_process + +default_cycler = plt.rcParams["axes.prop_cycle"] +gen_color = "#648df4" +pf_color = "#f3a041" +mlpf_color = "#d23b3d" +pf_linestyle = "-." +mlpf_linestyle = "-" +legend_loc_met = (0.45, 0.65) +legend_loc_jet_response = (0.05, 0.65) +pf_label = "PF-PUPPI" +mlpf_label = "MLPF-PUPPI" + + +def to_bh(data, bins): + """Converts numpy array to boost_histogram object.""" + h1 = bh.Histogram(bh.axis.Variable(bins)) + h1.fill(data) + return h1 + + +def apply_dz(data): + """Applies a cut on the z-coordinate of the primary vertex.""" + abs_dz = np.abs(data["GenVtx_z"] - data["PV_z"]) + mask_dz = abs_dz < 0.2 + return data[mask_dz] + + +def varbins(*args): + """Helper function to define variable width bins.""" + newlist = [] + for arg in args[:-1]: + newlist.append(arg[:-1]) + newlist.append(args[-1]) + return np.concatenate(newlist) + + +def plot_met_comparison(data_pf, data_mlpf, output_dir, sample_name, tev): + """Plots the MET comparison between PF and MLPF""" + plt.figure() + ax = plt.axes() + + bins = np.linspace(0, 500, 51) + + sample_label_coords = 0.02, 0.96 + sample_label_fontsize = 30 + legend_fontsize = 30 + + h_pf = to_bh(data_pf["PuppiMET_pt"], bins=bins) + h_mlpf = to_bh(data_mlpf["PuppiMET_pt"], bins=bins) + mplhep.histplot(h_pf, histtype="step", lw=2, density=True, color=pf_color, ls=pf_linestyle) + mplhep.histplot(h_mlpf, histtype="step", lw=2, density=True, color=mlpf_color, ls=mlpf_linestyle) + + plt.xlabel("$p_{T,miss}$ (GeV)") + plt.ylabel("Normalized count") + plt.ylim(1e-3, 1e-1) + plt.yscale("log") + + process_name = sample_name_to_process(sample_name) + plot_sample_name = EVALUATION_DATASET_NAMES.get(process_name, sample_name) + + ax.text( + sample_label_coords[0], + sample_label_coords[1], + plot_sample_name, + transform=ax.transAxes, + fontsize=sample_label_fontsize, + ha="left", + va="top", + ) + + mplhep.cms.label("", data=False, rlabel=f"Run 3 ({tev} TeV)") + + ax.set_ylim(bottom=1e-5) + legend_elements = [ + matplotlib.lines.Line2D([0], [0], color=pf_color, ls=pf_linestyle, lw=2, label=pf_label), + matplotlib.lines.Line2D([0], [0], color=mlpf_color, ls=mlpf_linestyle, lw=2, label=mlpf_label), + ] + ax.legend(handles=legend_elements, fontsize=legend_fontsize, loc=legend_loc_met) + output_path = Path(output_dir) + output_path.mkdir(parents=True, exist_ok=True) + plt.savefig(output_path / f"{sample_name}_met_dist_comp.pdf") + plt.close() + + +def plot_jet_response_comparison(resp_pf, resp_mlpf, output_dir, sample_name, jet_type, jet_label, tev): + """Plots the jet response comparison for PF and MLPF""" + plt.figure() + ax = plt.axes() + b = np.linspace(0, 2, 101) + + sample_label_coords = 0.02, 0.96 + jet_label_coords_single = 0.02, 0.88 + sample_label_fontsize = 30 + addtext_fontsize = 25 + legend_fontsize = 30 + + response_pf = awkward.flatten(resp_pf["response_raw"]) + response_mlpf = awkward.flatten(resp_mlpf["response_raw"]) + + h_pf = to_bh(response_pf, bins=b) + h_mlpf = to_bh(response_mlpf, bins=b) + + mplhep.histplot(h_pf, histtype="step", lw=2, density=True, color=pf_color, ls=pf_linestyle) + mplhep.histplot(h_mlpf, histtype="step", lw=2, density=True, color=mlpf_color, ls=mlpf_linestyle) + + plt.xlabel("Raw jet $p_T / p_{T,ptcl}$ response") + plt.ylabel("Normalized count") + + process_name = sample_name_to_process(sample_name) + plot_sample_name = EVALUATION_DATASET_NAMES.get(process_name, sample_name) + + ax.text( + sample_label_coords[0], + sample_label_coords[1], + plot_sample_name, + transform=ax.transAxes, + fontsize=sample_label_fontsize, + ha="left", + va="top", + ) + + mplhep.cms.label("", data=False, rlabel=f"Run 3 ({tev} TeV)") + ax.text( + jet_label_coords_single[0], + jet_label_coords_single[1], + jet_label, + transform=ax.transAxes, + fontsize=addtext_fontsize, + ha="left", + va="top", + ) + ax.set_ylim(0, ax.get_ylim()[1] * 1.5) + legend_elements = [ + matplotlib.lines.Line2D([0], [0], color=pf_color, ls=pf_linestyle, lw=2, label=pf_label), + matplotlib.lines.Line2D([0], [0], color=mlpf_color, ls=mlpf_linestyle, lw=2, label=mlpf_label), + ] + ax.legend(handles=legend_elements, fontsize=legend_fontsize, loc=legend_loc_jet_response) + output_path = Path(output_dir) + output_path.mkdir(parents=True, exist_ok=True) + plt.savefig(output_path / f"{sample_name}_{jet_type}_jet_pt_ratio_comp.pdf") + plt.close() + + +@click.command() +@click.option("--input-pf-parquet", required=True, type=str, help="Input parquet file for PF sample.") +@click.option("--input-mlpf-parquet", required=True, type=str, help="Input parquet file for MLPF sample.") +@click.option("--output-dir", required=True, type=str, help="Output directory for plots.") +@click.option("--jet-type", default="ak4", type=click.Choice(["ak4", "ak8"]), help="Jet type to plot.") +@click.option("--sample-name", required=True, type=str, help="Sample name for plot labels (e.g., QCD_PU).") +@click.option("--tev", required=True, type=str, help="Center of mass energy") +def main(input_pf_parquet, input_mlpf_parquet, output_dir, jet_type, sample_name, tev): + """ + Generates a comparison plot of the jet response distribution + """ + mplhep.style.use("CMS") + matplotlib.rcParams["axes.labelsize"] = 35 + + data_pf = awkward.from_parquet(input_pf_parquet) + data_mlpf = awkward.from_parquet(input_mlpf_parquet) + + jet_label = f"AK{jet_type[2:]} jets" + + # Fiducial cuts + max_jet_abs_eta = 2.5 + fiducial_cuts = "eta_less_2p5" + + if fiducial_cuts == "eta_less_2p5": + eta_label = f", $|η|$ < {max_jet_abs_eta}" + jet_label += eta_label + for data in [data_pf, data_mlpf]: + msk_rj_eta = np.abs(data["Jet_eta"]) < max_jet_abs_eta + for k in data.fields: + if k.startswith("Jet_"): + data[k] = data[k][msk_rj_eta] + msk_gj_eta = np.abs(data["GenJet_eta"]) < max_jet_abs_eta + for k in data.fields: + if k.startswith("GenJet_"): + data[k] = data[k][msk_gj_eta] + + data_pf = apply_dz(data_pf) + data_mlpf = apply_dz(data_mlpf) + + jet_prefixes = {"ak4": "Jet", "ak8": "FatJet"} + jet_prefix = jet_prefixes[jet_type] + genjet_prefixes = {"ak4": "GenJet", "ak8": "GenJetAK8"} + genjet_prefix = genjet_prefixes[jet_type] + + data_pf[f"{jet_prefix}_pt_raw"] = data_pf[f"{jet_prefix}_pt"] * (1.0 - data_pf[f"{jet_prefix}_rawFactor"]) + data_mlpf[f"{jet_prefix}_pt_raw"] = data_mlpf[f"{jet_prefix}_pt"] * (1.0 - data_mlpf[f"{jet_prefix}_rawFactor"]) + + # Placeholder for corrected pt + data_pf[f"{jet_prefix}_pt_corr"] = data_pf[f"{jet_prefix}_pt_raw"] + data_mlpf[f"{jet_prefix}_pt_corr"] = data_mlpf[f"{jet_prefix}_pt_raw"] + + deltar_cut = 0.2 if jet_type == "ak4" else 0.4 + resp_pf = compute_response(data_pf, jet_coll=jet_prefix, genjet_coll=genjet_prefix, deltar_cut=deltar_cut) + resp_mlpf = compute_response(data_mlpf, jet_coll=jet_prefix, genjet_coll=genjet_prefix, deltar_cut=deltar_cut) + + plot_jet_response_comparison(resp_pf, resp_mlpf, output_dir, sample_name, jet_type, jet_label, tev) + plot_met_comparison(data_pf, data_mlpf, output_dir, sample_name, tev) + + print(f"Generated plots in {output_dir}") + + +if __name__ == "__main__": + main() diff --git a/mlpf/plotting/plot_jet_response_comparison_v2.py b/mlpf/plotting/plot_jet_response_comparison_v2.py new file mode 100644 index 000000000..fff2062d4 --- /dev/null +++ b/mlpf/plotting/plot_jet_response_comparison_v2.py @@ -0,0 +1,270 @@ +import click +import awkward +import numpy as np +import matplotlib + +matplotlib.use("Agg") +import matplotlib.pyplot as plt +import mplhep +import boost_histogram as bh +from pathlib import Path + +from mlpf.plotting.utils import compute_response +from mlpf.plotting.plot_utils import EVALUATION_DATASET_NAMES, sample_name_to_process + +default_cycler = plt.rcParams["axes.prop_cycle"] +gen_color = "#648df4" +pf_color = "#f3a041" +mlpf_color = "#d23b3d" +pf_linestyle = "-." +mlpf_linestyle = "-" +legend_loc_met = (0.4, 0.55) +legend_loc_jet_response = (0.50, 0.60) + + +def to_bh(data, bins): + """Converts numpy array to boost_histogram object.""" + h1 = bh.Histogram(bh.axis.Variable(bins)) + h1.fill(data) + return h1 + + +def apply_dz(data): + """Applies a cut on the z-coordinate of the primary vertex.""" + abs_dz = np.abs(data["GenVtx_z"] - data["PV_z"]) + mask_dz = abs_dz < 0.2 + return data[mask_dz] + + +def varbins(*args): + """Helper function to define variable width bins.""" + newlist = [] + for arg in args[:-1]: + newlist.append(arg[:-1]) + newlist.append(args[-1]) + return np.concatenate(newlist) + + +def plot_met_comparison( + data_sample1_pf, data_sample1_mlpf, data_sample2_pf, data_sample2_mlpf, output_dir, sample_name, sample1_label, sample2_label +): + """Plots the MET comparison between 13.6 TeV and 14 TeV samples, for PF and MLPF.""" + plt.figure() + ax = plt.axes() + + bins = np.linspace(0, 500, 51) + + sample_label_coords = 0.02, 0.96 + sample_label_fontsize = 30 + legend_fontsize = 30 + + h_13p6_pf = to_bh(data_sample1_pf["PuppiMET_pt"], bins=bins) + h_13p6_mlpf = to_bh(data_sample1_mlpf["PuppiMET_pt"], bins=bins) + h_14_pf = to_bh(data_sample2_pf["PuppiMET_pt"], bins=bins) + h_14_mlpf = to_bh(data_sample2_mlpf["PuppiMET_pt"], bins=bins) + mplhep.histplot(h_14_pf, histtype="step", lw=1, density=True, ls="--", color=pf_color) + mplhep.histplot(h_13p6_pf, histtype="step", lw=1, density=True, color=pf_color) + mplhep.histplot(h_14_mlpf, histtype="step", lw=2, density=True, ls="--", color=mlpf_color) + mplhep.histplot(h_13p6_mlpf, histtype="step", lw=2, density=True, color=mlpf_color) + + plt.xlabel("$p_{T,miss}$ (GeV)") + plt.ylabel("Normalized count") + plt.ylim(1e-3, 1e-1) + plt.yscale("log") + + process_name = sample_name_to_process(sample_name) + plot_sample_name = EVALUATION_DATASET_NAMES.get(process_name, sample_name) + + ax.text( + sample_label_coords[0], + sample_label_coords[1], + plot_sample_name, + transform=ax.transAxes, + fontsize=sample_label_fontsize, + ha="left", + va="top", + ) + + mplhep.cms.label("", data=False, rlabel="Run 3 configuration") + + ax.set_ylim(bottom=1e-5) + legend_elements = [ + matplotlib.lines.Line2D([0], [0], color=pf_color, ls="--", lw=1, label=f"{sample2_label}, PF"), + matplotlib.lines.Line2D([0], [0], color=pf_color, ls="-", lw=1, label=f"{sample1_label}, PF"), + matplotlib.lines.Line2D([0], [0], color=mlpf_color, ls="--", lw=2, label=f"{sample2_label}, MLPF"), + matplotlib.lines.Line2D([0], [0], color=mlpf_color, ls="-", lw=2, label=f"{sample1_label}, MLPF"), + ] + ax.legend(handles=legend_elements, fontsize=legend_fontsize, loc=legend_loc_met) + output_path = Path(output_dir) + output_path.mkdir(parents=True, exist_ok=True) + plt.savefig(output_path / f"{sample_name}_met_dist_14vs13p6.pdf") + plt.close() + + +def plot_jet_response_comparison( + resp_sample1_pf, resp_sample1_mlpf, resp_sample2_pf, resp_sample2_mlpf, output_dir, sample_name, jet_type, jet_label, sample1_label, sample2_label +): + """Plots the jet response comparison between 13.6 TeV and 14 TeV samples, for PF and MLPF.""" + plt.figure() + ax = plt.axes() + b = np.linspace(0, 2, 101) + + sample_label_coords = 0.02, 0.96 + jet_label_coords_single = 0.02, 0.88 + sample_label_fontsize = 30 + addtext_fontsize = 25 + legend_fontsize = 24 + + response_13p6_pf = awkward.flatten(resp_sample1_pf["response_raw"]) + response_13p6_mlpf = awkward.flatten(resp_sample1_mlpf["response_raw"]) + response_14_pf = awkward.flatten(resp_sample2_pf["response_raw"]) + response_14_mlpf = awkward.flatten(resp_sample2_mlpf["response_raw"]) + + h_13p6_pf = to_bh(response_13p6_pf, bins=b) + h_13p6_mlpf = to_bh(response_13p6_mlpf, bins=b) + h_14_pf = to_bh(response_14_pf, bins=b) + h_14_mlpf = to_bh(response_14_mlpf, bins=b) + + mplhep.histplot(h_14_pf, histtype="step", lw=1, density=True, ls="--", color=pf_color) + mplhep.histplot(h_13p6_pf, histtype="step", lw=1, density=True, color=pf_color) + mplhep.histplot(h_14_mlpf, histtype="step", lw=2, density=True, ls="--", color=mlpf_color) + mplhep.histplot(h_13p6_mlpf, histtype="step", lw=2, density=True, color=mlpf_color) + + plt.xlabel("Raw jet $p_T / p_{T,ptcl}$ response") + plt.ylabel("Normalized count") + + process_name = sample_name_to_process(sample_name) + plot_sample_name = EVALUATION_DATASET_NAMES.get(process_name, sample_name) + + ax.text( + sample_label_coords[0], + sample_label_coords[1], + plot_sample_name, + transform=ax.transAxes, + fontsize=sample_label_fontsize, + ha="left", + va="top", + ) + + mplhep.cms.label("", data=False, rlabel="Run 3 configuration") + ax.text( + jet_label_coords_single[0], + jet_label_coords_single[1], + jet_label, + transform=ax.transAxes, + fontsize=addtext_fontsize, + ha="left", + va="top", + ) + ax.set_ylim(0, ax.get_ylim()[1] * 1.5) + legend_elements = [ + matplotlib.lines.Line2D([0], [0], color=pf_color, ls="--", lw=1, label=f"{sample2_label}, PF"), + matplotlib.lines.Line2D([0], [0], color=pf_color, ls="-", lw=1, label=f"{sample1_label}, PF"), + matplotlib.lines.Line2D([0], [0], color=mlpf_color, ls="--", lw=2, label=f"{sample2_label}, MLPF"), + matplotlib.lines.Line2D([0], [0], color=mlpf_color, ls="-", lw=2, label=f"{sample1_label}, MLPF"), + ] + ax.legend(handles=legend_elements, fontsize=legend_fontsize, loc=legend_loc_jet_response) + output_path = Path(output_dir) + output_path.mkdir(parents=True, exist_ok=True) + plt.savefig(output_path / f"{sample_name}_{jet_type}_jet_pt_ratio_14vs13p6.pdf") + plt.close() + + +@click.command() +@click.option("--input-sample1-pf-parquet", required=True, type=str, help="Input parquet file for sample1 PF sample.") +@click.option("--input-sample1-mlpf-parquet", required=True, type=str, help="Input parquet file for sample1 MLPF sample.") +@click.option("--input-sample2-pf-parquet", required=True, type=str, help="Input parquet file for sample2 PF sample.") +@click.option("--input-sample2-mlpf-parquet", required=True, type=str, help="Input parquet file for sample2 MLPF sample.") +@click.option("--output-dir", required=True, type=str, help="Output directory for plots.") +@click.option("--jet-type", default="ak4", type=click.Choice(["ak4", "ak8"]), help="Jet type to plot.") +@click.option("--sample-name", required=True, type=str, help="Sample name for plot labels (e.g., QCD_PU).") +@click.option("--sample1-label", default="13.6 TeV", type=str, help="Label for the first sample (e.g., 13.6 TeV).") +@click.option("--sample2-label", default="14 TeV", type=str, help="Label for the second sample (e.g., 14 TeV).") +def main( + input_sample1_pf_parquet, + input_sample1_mlpf_parquet, + input_sample2_pf_parquet, + input_sample2_mlpf_parquet, + output_dir, + jet_type, + sample_name, + sample1_label, + sample2_label, +): + """ + Generates a comparison plot of the jet response distribution + for 14 TeV and 13.6 TeV samples. + """ + mplhep.style.use("CMS") + matplotlib.rcParams["axes.labelsize"] = 35 + + data_sample1_pf = awkward.from_parquet(input_sample1_pf_parquet) + data_sample1_mlpf = awkward.from_parquet(input_sample1_mlpf_parquet) + data_sample2_pf = awkward.from_parquet(input_sample2_pf_parquet) + data_sample2_mlpf = awkward.from_parquet(input_sample2_mlpf_parquet) + + jet_label = f"AK{jet_type[2:]} jets" + + # Fiducial cuts + max_jet_abs_eta = 2.5 + fiducial_cuts = "eta_less_2p5" + + if fiducial_cuts == "eta_less_2p5": + eta_label = f", 0 < $|η|$ < {max_jet_abs_eta}" + jet_label += eta_label + for data in [data_sample1_pf, data_sample1_mlpf, data_sample2_pf, data_sample2_mlpf]: + msk_rj_eta = np.abs(data["Jet_eta"]) < max_jet_abs_eta + for k in data.fields: + if k.startswith("Jet_"): + data[k] = data[k][msk_rj_eta] + msk_gj_eta = np.abs(data["GenJet_eta"]) < max_jet_abs_eta + for k in data.fields: + if k.startswith("GenJet_"): + data[k] = data[k][msk_gj_eta] + + data_sample1_pf = apply_dz(data_sample1_pf) + data_sample1_mlpf = apply_dz(data_sample1_mlpf) + data_sample2_pf = apply_dz(data_sample2_pf) + data_sample2_mlpf = apply_dz(data_sample2_mlpf) + + jet_prefixes = {"ak4": "Jet", "ak8": "FatJet"} + jet_prefix = jet_prefixes[jet_type] + genjet_prefixes = {"ak4": "GenJet", "ak8": "GenJetAK8"} + genjet_prefix = genjet_prefixes[jet_type] + + data_sample1_pf[f"{jet_prefix}_pt_raw"] = data_sample1_pf[f"{jet_prefix}_pt"] * (1.0 - data_sample1_pf[f"{jet_prefix}_rawFactor"]) + data_sample1_mlpf[f"{jet_prefix}_pt_raw"] = data_sample1_mlpf[f"{jet_prefix}_pt"] * (1.0 - data_sample1_mlpf[f"{jet_prefix}_rawFactor"]) + data_sample2_pf[f"{jet_prefix}_pt_raw"] = data_sample2_pf[f"{jet_prefix}_pt"] * (1.0 - data_sample2_pf[f"{jet_prefix}_rawFactor"]) + data_sample2_mlpf[f"{jet_prefix}_pt_raw"] = data_sample2_mlpf[f"{jet_prefix}_pt"] * (1.0 - data_sample2_mlpf[f"{jet_prefix}_rawFactor"]) + + # Placeholder for corrected pt + data_sample1_pf[f"{jet_prefix}_pt_corr"] = data_sample1_pf[f"{jet_prefix}_pt_raw"] + data_sample1_mlpf[f"{jet_prefix}_pt_corr"] = data_sample1_mlpf[f"{jet_prefix}_pt_raw"] + data_sample2_pf[f"{jet_prefix}_pt_corr"] = data_sample2_pf[f"{jet_prefix}_pt_raw"] + data_sample2_mlpf[f"{jet_prefix}_pt_corr"] = data_sample2_mlpf[f"{jet_prefix}_pt_raw"] + + deltar_cut = 0.2 if jet_type == "ak4" else 0.4 + resp_sample1_pf = compute_response(data_sample1_pf, jet_coll=jet_prefix, genjet_coll=genjet_prefix, deltar_cut=deltar_cut) + resp_sample1_mlpf = compute_response(data_sample1_mlpf, jet_coll=jet_prefix, genjet_coll=genjet_prefix, deltar_cut=deltar_cut) + resp_sample2_pf = compute_response(data_sample2_pf, jet_coll=jet_prefix, genjet_coll=genjet_prefix, deltar_cut=deltar_cut) + resp_sample2_mlpf = compute_response(data_sample2_mlpf, jet_coll=jet_prefix, genjet_coll=genjet_prefix, deltar_cut=deltar_cut) + + plot_jet_response_comparison( + resp_sample1_pf, + resp_sample1_mlpf, + resp_sample2_pf, + resp_sample2_mlpf, + output_dir, + sample_name, + jet_type, + jet_label, + sample1_label, + sample2_label, + ) + plot_met_comparison(data_sample1_pf, data_sample1_mlpf, data_sample2_pf, data_sample2_mlpf, output_dir, sample_name, sample1_label, sample2_label) + + print(f"Generated plots in {output_dir}") + + +if __name__ == "__main__": + main() diff --git a/mlpf/plotting/plot_loss_curves.py b/mlpf/plotting/plot_loss_curves.py new file mode 100644 index 000000000..28120eb17 --- /dev/null +++ b/mlpf/plotting/plot_loss_curves.py @@ -0,0 +1,252 @@ +import click +import json +import glob +import pandas +import matplotlib + +matplotlib.use("Agg") +import matplotlib.pyplot as plt +import numpy as np +import mplhep +from pathlib import Path +from matplotlib.lines import Line2D + + +def load_history(path, min_epoch=None, max_epoch=None): + """ + Load training history from a directory of json files. + The json files are expected to be named epoch_*.json. + """ + ret = {} + files = list(glob.glob(path)) + if not files: + raise FileNotFoundError(f"No history files found at {path}") + + for fi in files: + data = json.load(open(fi)) + data2 = {} + for k1 in ["train", "valid"]: + if k1 in data: + for k2 in data[k1].keys(): + data2[f"{k1}_{k2}"] = data[k1][k2] + epoch = int(fi.split("_")[-1].split(".")[0]) + ret[epoch] = data2 + + if not ret: + return pandas.DataFrame() + + if not max_epoch: + max_epoch = max(ret.keys()) + if not min_epoch: + min_epoch = min(ret.keys()) + + ret2 = [] + # fill in missing epochs with NaNs + for i in range(min_epoch, max_epoch + 1): + if i in ret: + ret2.append(ret[i]) + else: + dummy = {} + for k in ret[min_epoch].keys(): + dummy[k] = np.nan + ret2.append(dummy) + + return pandas.DataFrame(ret2) + + +def loss_plot(epochs, train, test, margin=0.05, smoothing=False, ylabel="", title=""): + """ + Plots training and validation loss curves. + """ + fig = plt.figure() + ax = plt.axes() + + alpha = 0.2 if smoothing else 1.0 + l0 = "Training" + l1 = "Validation" + + p0 = plt.plot(epochs, train, alpha=alpha, label=l0, marker="o", ls="--") + p1 = plt.plot(epochs, test, alpha=alpha, label=l1, marker="x") + + if smoothing: + train_smooth = np.convolve(train[~np.isnan(train)], np.ones(5) / 5, mode="valid") + epochs_smooth = epochs[len(epochs) - len(train_smooth) :] + plt.plot(epochs_smooth, train_smooth, color=p0[0].get_color(), lw=2) + + test_smooth = np.convolve(test[~np.isnan(test)], np.ones(5) / 5, mode="valid") + plt.plot(epochs_smooth, test_smooth, color=p1[0].get_color(), lw=2) + + # get last valid value + last_valid_loss = test[~np.isnan(test)][-1] + + if last_valid_loss is not np.nan: + plt.ylim(last_valid_loss * (1.0 - margin), last_valid_loss * (1.0 + margin)) + + plt.legend(loc=3, frameon=False, fontsize=30) + plt.xlabel("epoch") + plt.ylabel(ylabel) + mplhep.cms.label("", data=False, rlabel="Run 3 configuration") + return fig, ax + + +@click.command() +@click.option("--input-dirs", "-i", multiple=True, required=True, help="Input directories containing history/epoch_*.json files.") +@click.option("--labels", "-l", multiple=True, help="Labels for each input directory. Must be the same number as input-dirs.") +@click.option("--output-dir", "-o", required=True, type=str, help="Output directory for plots.") +def main(input_dirs, labels, output_dir): + """ + Generates loss curve plots from training history files. + """ + mplhep.style.use("CMS") + matplotlib.rcParams["axes.labelsize"] = 35 + + if labels and len(input_dirs) != len(labels): + raise ValueError("Number of input directories and labels must be the same.") + + histories = [] + for d in input_dirs: + history = load_history(f"{d}/history/epoch_*.json") + histories.append(history) + + output_path = Path(output_dir) + output_path.mkdir(parents=True, exist_ok=True) + + # Plot individual loss curves for each history + for i, history in enumerate(histories): + history["train_Total"] = history["train_Total"] - history["train_ispu"].values + history["valid_Total"] = history["valid_Total"] - history["valid_ispu"].values + if history.empty: + print(f"No history found for {input_dirs[i]}, skipping.") + continue + + label = labels[i] if labels else Path(input_dirs[i]).name + + # Total loss + fig, ax = loss_plot( + history.index + 1, history["train_Total"].values, history["valid_Total"].values, margin=0.1, ylabel="Total loss", title=label + ) + plt.xticks(range(1, len(history) + 1)) + plt.savefig(output_path / f"{label}_loss.pdf") + plt.close(fig) + + # Classification loss + if "train_Classification" in history.columns: + fig, ax = loss_plot( + history.index + 1, + history["train_Classification"].values * 100, + history["valid_Classification"].values * 100, + margin=0.05, + ylabel="Particle ID loss x100", + title=label, + ) + plt.xticks(range(1, len(history) + 1)) + plt.savefig(output_path / f"{label}_cls_loss.pdf") + plt.close(fig) + + # Binary classification loss + if "train_Classification_binary" in history.columns: + fig, ax = loss_plot( + history.index + 1, + history["train_Classification_binary"].values, + history["valid_Classification_binary"].values, + margin=0.1, + ylabel="Binary classification loss", + title=label, + ) + plt.xticks(range(1, len(history) + 1)) + plt.savefig(output_path / f"{label}_cls_bin_loss.pdf") + plt.close(fig) + + # Regression loss + reg_losses = [f"Regression_{_loss}" for _loss in ["energy", "pt", "eta", "sin_phi", "cos_phi"]] + if all([f"train_{loss}" in history.columns for loss in reg_losses]): + reg_loss = sum([history[f"train_{loss}"].values for loss in reg_losses]) + val_reg_loss = sum([history[f"valid_{loss}"].values for loss in reg_losses]) + fig, ax = loss_plot(history.index + 1, reg_loss, val_reg_loss, margin=0.2, ylabel="Regression loss", title=label) + plt.xticks(range(1, len(history) + 1)) + plt.savefig(output_path / f"{label}_reg_loss.pdf") + plt.close(fig) + + # PU classification loss + if "train_ispu" in history.columns: + fig, ax = loss_plot( + history.index + 1, + history["train_ispu"].values, + history["valid_ispu"].values, + margin=0.5, + ylabel="PU classification loss", + title=label, + ) + plt.xticks(range(1, len(history) + 1)) + plt.savefig(output_path / f"{label}_ispu_loss.pdf") + plt.close(fig) + + # Combined loss plot with 4 axes + fig, axs = plt.subplots(4, 1, figsize=(12, 20), sharex=True) + # fig.suptitle(label, fontsize=35) + + loss_info = [ + {"name": "Total", "label": "Total Loss"}, + {"name": "Classification", "label": "PID Classification Loss"}, + {"name": "Classification_binary", "label": "Binary Classification Loss"}, + {"name": "Regression", "label": "Regression Loss"}, + ] + + for i, (ax, info) in enumerate(zip(axs, loss_info)): + loss_name = info["name"] + ylabel = info["label"] + + train_loss_col = f"train_{loss_name}" + valid_loss_col = f"valid_{loss_name}" + + if loss_name == "Regression": + reg_losses = [f"Regression_{_loss}" for _loss in ["energy", "pt", "eta", "sin_phi", "cos_phi"]] + if all([f"train_{loss}" in history.columns for loss in reg_losses]): + train_loss = sum([history[f"train_{loss}"].values for loss in reg_losses]) + valid_loss = sum([history[f"valid_{loss}"].values for loss in reg_losses]) + else: + continue + else: + if train_loss_col in history.columns and valid_loss_col in history.columns: + train_loss = history[train_loss_col].values + valid_loss = history[valid_loss_col].values + else: + continue + + ax.plot(history.index + 1, train_loss, ls="--", color="black", marker="o") + ax.plot(history.index + 1, valid_loss, ls="-", color="black", marker="s") + ax.set_title(ylabel, y=0.8, x=0.45) + ax.tick_params(axis="y", labelsize=25) + + # Add a single legend for the figure + custom_lines = [Line2D([0], [0], color="black", lw=2, ls="-"), Line2D([0], [0], color="black", lw=2, ls="--")] + custom_labels = ["Validation", "Training"] + ax.legend(handles=custom_lines, labels=custom_labels, loc="upper right", fontsize=30) + + plt.xlabel("Epoch") + fig.subplots_adjust(hspace=0.1) + plt.savefig(output_path / f"{label}_all_losses_subplots.pdf") + plt.tight_layout() + plt.close(fig) + + # Plot comparison if multiple histories + if len(histories) > 1: + plt.figure() + ax = plt.axes() + for i, history in enumerate(histories): + if history.empty: + continue + label = labels[i] if labels else Path(input_dirs[i]).name + plt.plot(history.index + 1, history["valid_Total"], marker="o", label=label) + plt.ylabel("Total valid. loss") + plt.xlabel("epoch") + plt.legend(loc="best") + mplhep.cms.label("", data=False, rlabel="Run 3 configuration") + plt.savefig(output_path / "loss_comparison.pdf") + plt.close() + + print(f"Generated plots in {output_dir}") + + +if __name__ == "__main__": + main() diff --git a/mlpf/plotting/plot_met_validation.py b/mlpf/plotting/plot_met_validation.py new file mode 100644 index 000000000..7f93fa235 --- /dev/null +++ b/mlpf/plotting/plot_met_validation.py @@ -0,0 +1,554 @@ +import click +import os +import awkward +import numpy as np +import matplotlib + +matplotlib.use("Agg") +import matplotlib.pyplot as plt +import mplhep +import boost_histogram as bh +from pathlib import Path +from matplotlib.lines import Line2D +from mlpf.plotting.plot_utils import EVALUATION_DATASET_NAMES, med_iqr, sample_name_to_process +from mlpf.plotting.plot_utils import labels as XLABELS + + +def midpoints(x): + return (x[1:] + x[:-1]) / 2 + + +def to_bh(data, bins): + h1 = bh.Histogram(bh.axis.Variable(bins)) + h1.fill(data) + return h1 + + +def plot_met_distribution( + data_pf, + data_mlpf, + bins, + xlabel, + filename, + logy, + sample_name, + gen_color, + pf_color, + mlpf_color, + pf_label, + mlpf_label, + legend_loc, + legend_fontsize, + sample_label_coords, + sample_label_fontsize, + ratio_ylim, + pf_linestyle, + mlpf_linestyle, + tev, +): + f, (a0, a1) = plt.subplots(2, 1, gridspec_kw={"height_ratios": [3, 1]}, sharex=True) + + # Gen MET + h0 = to_bh(data_pf["GenMET_pt"], bins) + + # PF MET (Puppi) + h1 = to_bh(data_pf["PuppiMET_pt"], bins) + + # MLPF MET + h2 = to_bh(data_mlpf["PuppiMET_pt"], bins) + + plt.sca(a0) + x0 = mplhep.histplot(h0, histtype="step", lw=2, label="Gen.", ls="--", color=gen_color) + x1 = mplhep.histplot(h1, histtype="step", lw=2, label="PF-PUPPI", ls=pf_linestyle, color=pf_color) + x2 = mplhep.histplot(h2, histtype="step", lw=2, label=mlpf_label, ls=mlpf_linestyle, color=mlpf_color) + + if logy: + plt.yscale("log") + a0.set_ylim(bottom=1, top=a0.get_ylim()[1] * 1000) + + mplhep.cms.label("", data=False, com=tev, year="Run 3", ax=a0) + a0.text( + sample_label_coords[0], + sample_label_coords[1], + sample_name, + transform=a0.transAxes, + fontsize=sample_label_fontsize, + ha="left", + va="top", + ) + + handles, labels = a0.get_legend_handles_labels() + handles = [x0[0].stairs, x1[0].stairs, x2[0].stairs] + a0.legend(handles, labels, loc=legend_loc, fontsize=legend_fontsize) + plt.ylabel("Count") + + plt.sca(a1) + plt.plot([], []) + + ratio = h1 / h1 + sigma_ratio = ratio * np.sqrt(1 / h1.counts() + 1.0 / h1.counts()) + mplhep.histplot(ratio, histtype="step", lw=2, ls=pf_linestyle, color=pf_color) + mplhep.histplot(ratio, yerr=sigma_ratio.counts(), edgecolor=pf_color, ls=pf_linestyle, lw=2, histtype="band", facecolor=pf_color) + mplhep.histplot(h2 / h1, histtype="step", lw=2, ls=mlpf_linestyle, color=mlpf_color) + plt.ylim(0.0, ratio_ylim) + plt.ylabel("MLPF / PF") + plt.xlabel(xlabel) + # plt.xscale("log") + plt.xlim(min(bins), max(bins)) + plt.savefig(filename) + plt.close() + + +def met_response_plot( + resp_pf, + resp_mlpf, + data_pf, + data_mlpf, + genmet_min_pt, + genmet_max_pt, + additional_label, + additional_cut, + filename, + sample_name, + mlpf_label, + legend_loc, + legend_fontsize, + sample_label_coords, + sample_label_fontsize, + addtext_fontsize, + jet_label_coords_single, + pf_color, + mlpf_color, + pf_linestyle, + mlpf_linestyle, + tev, +): + plt.figure() + ax = plt.axes() + b = np.linspace(0, 5, 101) + + mplhep.cms.label("", data=False, com=tev, year="Run 3", ax=ax) + ax.text( + sample_label_coords[0], + sample_label_coords[1], + sample_name, + transform=ax.transAxes, + fontsize=sample_label_fontsize, + ha="left", + va="top", + ) + ax.text( + jet_label_coords_single[0], + jet_label_coords_single[1], + "PUPPI MET" + additional_label, + transform=ax.transAxes, + fontsize=addtext_fontsize, + ha="left", + va="top", + ) + + add_cut_pf = additional_cut(data_pf) + add_cut_mlpf = additional_cut(data_mlpf) + + mask_pf = (resp_pf["GenMET_pt"] >= genmet_min_pt) & (resp_pf["GenMET_pt"] < genmet_max_pt) & add_cut_pf + met_response_pf = resp_pf["response"][mask_pf] + + mask_mlpf = (resp_mlpf["GenMET_pt"] >= genmet_min_pt) & (resp_mlpf["GenMET_pt"] < genmet_max_pt) & add_cut_mlpf + met_response_mlpf = resp_mlpf["response"][mask_mlpf] + + h0 = to_bh(met_response_pf, b) + h1 = to_bh(met_response_mlpf, b) + + med_pf, iqr_pf = med_iqr(met_response_pf) + med_mlpf, iqr_mlpf = med_iqr(met_response_mlpf) + + x0 = mplhep.histplot( + h0, + histtype="step", + lw=2, + label="PF-PUPPI\nmed: {:.2f} IQR: {:.2f}".format(med_pf, iqr_pf), + ls=pf_linestyle, + color=pf_color, + ) + x1 = mplhep.histplot( + h1, + histtype="step", + lw=2, + label="{}\nmed: {:.2f} IQR: {:.2f}".format(mlpf_label, med_mlpf, iqr_mlpf), + ls=mlpf_linestyle, + color=mlpf_color, + ) + + handles, labels = ax.get_legend_handles_labels() + handles = [x0[0].stairs, x1[0].stairs] + ax.legend(handles, labels, loc=legend_loc, fontsize=legend_fontsize) + + plt.xlabel("MET response") + plt.ylabel("Count") + + ax.set_ylim(0, 1.5 * ax.get_ylim()[1]) + ax.ticklabel_format(axis="y", style="sci", scilimits=(0, 0)) + ax.yaxis.get_offset_text().set_x(-0.01) + ax.yaxis.get_offset_text().set_ha("right") + + # plt.savefig(filename) + plt.close() + return ((med_pf, iqr_pf), (med_mlpf, iqr_mlpf)) + + +def get_met_response_in_bins( + resp_pf, + resp_mlpf, + data_pf, + data_mlpf, + variable_bins, + output_dir, + sample_name, + mlpf_label, + tev, + **kwargs, +): + med_vals_pf, iqr_vals_pf = [], [] + med_vals_mlpf, iqr_vals_mlpf = [], [] + + for ibin in range(len(variable_bins) - 1): + min_bin_val, max_bin_val = variable_bins[ibin], variable_bins[ibin + 1] + + stats_pf, stats_mlpf = met_response_plot( + resp_pf, + resp_mlpf, + data_pf, + data_mlpf, + genmet_min_pt=min_bin_val, + genmet_max_pt=max_bin_val, + additional_label=f", {min_bin_val:.0f} < GenMET pT < {max_bin_val:.0f} GeV", + additional_cut=lambda data: data["Pileup_nTrueInt"] >= 0, + filename=os.path.join(output_dir, f"met_response_bin_genmet_pt_{ibin}.pdf"), + sample_name=sample_name, + mlpf_label=mlpf_label, + tev=tev, + **kwargs, + ) + med_vals_pf.append(stats_pf[0]) + iqr_vals_pf.append(stats_pf[1]) + med_vals_mlpf.append(stats_mlpf[0]) + iqr_vals_mlpf.append(stats_mlpf[1]) + + return ( + np.array(med_vals_pf), + np.array(iqr_vals_pf), + np.array(med_vals_mlpf), + np.array(iqr_vals_mlpf), + ) + + +def plot_met_response_vs_pu(resp_pf, resp_mlpf, data_pf, data_mlpf, output_dir, sample_name, mlpf_label, tev, **kwargs): + stats_pu_pf = [] + stats_pu_mlpf = [] + + pu_bins = [(55, 60), (60, 65), (65, 70), (70, 75)] + met_bins_for_pu = [(0, 30), (30, 60), (60, 100), (100, 200), (200, 5000)] + + for pt_range in met_bins_for_pu: + pt_min, pt_max = pt_range + row_stats_pf = [] + row_stats_mlpf = [] + for pu_min, pu_max in pu_bins: + filename = os.path.join(output_dir, f"met_response_pt{pt_min}to{pt_max}_pu{pu_min}to{pu_max}.pdf") + + s_pf, s_mlpf = met_response_plot( + resp_pf, + resp_mlpf, + data_pf, + data_mlpf, + genmet_min_pt=pt_min, + genmet_max_pt=pt_max, + additional_label=f", {pt_min}<$p_{{T,gen}}$<{pt_max}, {pu_min}≤$N_{{PV}}$<{pu_max}", + additional_cut=lambda data: (data["Pileup_nTrueInt"] >= pu_min) & (data["Pileup_nTrueInt"] < pu_max), + filename=filename, + sample_name=sample_name, + mlpf_label=mlpf_label, + tev=tev, + **kwargs, + ) + row_stats_pf.append(s_pf) + row_stats_mlpf.append(s_mlpf) + stats_pu_pf.append(row_stats_pf) + stats_pu_mlpf.append(row_stats_mlpf) + + stats_pu_pf = np.array(stats_pu_pf) + stats_pu_mlpf = np.array(stats_pu_mlpf) + + with np.errstate(divide="ignore", invalid="ignore"): + resolution_pf = np.nan_to_num(stats_pu_pf[:, :, 1] / stats_pu_pf[:, :, 0]) + resolution_mlpf = np.nan_to_num(stats_pu_mlpf[:, :, 1] / stats_pu_mlpf[:, :, 0]) + + markers = ["o", "v", "^", "x", "s"] + fig, ax = plt.subplots() + + pu_bin_centers = [b[0] + (b[1] - b[0]) / 2 for b in pu_bins] + + for i, pt_range in enumerate(met_bins_for_pu): + label = f"{pt_range[0]}-{pt_range[1]} GeV" + ax.plot( + pu_bin_centers, + resolution_pf[i], + label=label, + marker=markers[i % len(markers)], + color=kwargs["pf_color"], + linestyle=kwargs["pf_linestyle"], + ) + ax.plot( + pu_bin_centers, + resolution_mlpf[i], + marker=markers[i % len(markers)], + color=kwargs["mlpf_color"], + linestyle=kwargs["mlpf_linestyle"], + ) + + pt_handles = [] + for i, pt_range in enumerate(met_bins_for_pu): + label = f"{pt_range[0]}-{pt_range[1]}" + if pt_range[1] > 1000: + label = f">{pt_range[0]}" + pt_handles.append(Line2D([0], [0], color="black", marker=markers[i % len(markers)], linestyle="None", label=label)) + + leg1 = ax.legend(handles=pt_handles, title=XLABELS["gen_met"], loc=(0.6, 0.43)) + ax.add_artist(leg1) + + algo_handles = [ + Line2D([0], [0], color=kwargs["pf_color"], lw=2, label="PF-PUPPI", ls=kwargs["pf_linestyle"]), + Line2D([0], [0], color=kwargs["mlpf_color"], lw=2, label=mlpf_label, ls=kwargs["mlpf_linestyle"]), + ] + ax.legend(handles=algo_handles, title="Algorithm", loc=(0.3, 0.55)) + + ax.set_xlabel("True $N_{PV}$") + ax.set_ylabel("MET response resolution (IQR/med.)") + ax.set_ylim(0, 1.5) + mplhep.cms.label(ax=ax, data=False, com=tev, year="Run 3") + ax.text( + kwargs["sample_label_coords"][0], + kwargs["sample_label_coords"][1], + sample_name, + transform=ax.transAxes, + fontsize=kwargs["sample_label_fontsize"], + ha="left", + va="top", + ) + ax.text( + kwargs["jet_label_coords_single"][0], + kwargs["jet_label_coords_single"][1], + "PUPPI MET", + transform=ax.transAxes, + fontsize=kwargs["addtext_fontsize"], + ha="left", + va="top", + ) + + fig.savefig(os.path.join(output_dir, "met_resolution_vs_npv.pdf")) + plt.close(fig) + + +@click.command() +@click.option("--input-pf-parquet", required=True, type=str) +@click.option("--input-mlpf-parquet", required=True, type=str) +@click.option("--output-dir", required=True, type=str) +@click.option("--sample-name", required=True, type=str, help="Sample name (e.g., QCD_PU_13p6)") +@click.option("--tev", default=13.6, type=float, help="Center of mass energy in TeV (for plot labels)") +def make_plots(input_pf_parquet, input_mlpf_parquet, output_dir, sample_name, tev): + """Generates MET validation plots.""" + + output_dir = str(Path(output_dir, sample_name, "met")) + os.makedirs(output_dir, exist_ok=True) + mplhep.style.use("CMS") + matplotlib.rcParams["axes.labelsize"] = 35 + + process_name = sample_name_to_process(sample_name) + plot_sample_name = EVALUATION_DATASET_NAMES.get(process_name, sample_name) + + # plotting style variables + legend_fontsize = 30 + legend_loc = (0.5, 0.55) + legend_loc_scalereso = (0.50, 0.65) + legend_loc_met_response = (0.3, 0.45) + sample_label_fontsize = 30 + addtext_fontsize = 25 + jet_label_coords_single = 0.02, 0.88 + sample_label_coords = 0.02, 0.96 + gen_color = "#648df4" + pf_color = "#f3a041" + mlpf_color = "#d23b3d" + pf_linestyle = "-." + mlpf_linestyle = "-" + pf_label = "PF-PUPPI" + mlpf_label = "MLPF-PUPPI" + + def varbins(*args): + newlist = [] + for arg in args[:-1]: + newlist.append(arg[:-1]) + newlist.append(args[-1]) + return np.concatenate(newlist) + + if sample_name.startswith("QCD_"): + met_bins = varbins(np.linspace(0, 500, 21)) + met_bins_for_response = np.array([5, 20, 40, 60, 80, 100, 150, 200, 300, 500]) + ratio_ylim = 2 + elif sample_name.startswith("TTbar_"): + met_bins = varbins(np.linspace(0, 500, 21)) + met_bins_for_response = np.array([5, 20, 40, 60, 80, 100, 150, 250]) + ratio_ylim = 2 + elif sample_name.startswith("PhotonJet_"): + met_bins = varbins(np.linspace(0, 200, 41)) + met_bins_for_response = np.array([5, 20, 40, 60, 80, 100, 150, 200]) + ratio_ylim = 2 + else: + met_bins = np.linspace(0, 500, 51) + # met_bins = np.logspace(-1, 3, 21) + met_bins_for_response = np.linspace(1, 500, 26) + ratio_ylim = 2 + + data_pf = awkward.from_parquet(input_pf_parquet) + data_mlpf = awkward.from_parquet(input_mlpf_parquet) + + plot_style_kwargs = { + "legend_loc": legend_loc, + "legend_fontsize": legend_fontsize, + "sample_label_coords": sample_label_coords, + "sample_label_fontsize": sample_label_fontsize, + "addtext_fontsize": addtext_fontsize, + "jet_label_coords_single": jet_label_coords_single, + "pf_color": pf_color, + "mlpf_color": mlpf_color, + "pf_linestyle": pf_linestyle, + "mlpf_linestyle": mlpf_linestyle, + } + + # MET distribution + plot_met_distribution( + data_pf, + data_mlpf, + met_bins, + XLABELS["met"], + os.path.join(output_dir, "met_pt.pdf"), + logy=True, + sample_name=plot_sample_name, + gen_color=gen_color, + pf_color=pf_color, + mlpf_color=mlpf_color, + pf_label=pf_label, + mlpf_label=mlpf_label, + legend_loc=legend_loc, + legend_fontsize=legend_fontsize, + sample_label_coords=sample_label_coords, + sample_label_fontsize=sample_label_fontsize, + ratio_ylim=ratio_ylim, + pf_linestyle=pf_linestyle, + mlpf_linestyle=mlpf_linestyle, + tev=tev, + ) + + # Define MET response, avoiding division by zero + genmet_pt_pf = data_pf["GenMET_pt"] + genmet_pt_mlpf = data_mlpf["GenMET_pt"] + + msk = genmet_pt_pf != 0 + resp_pf = { + "response": np.divide(data_pf["PuppiMET_pt"][msk], genmet_pt_pf[msk]), + "GenMET_pt": genmet_pt_pf, + } + msk = genmet_pt_mlpf != 0 + resp_mlpf = { + "response": np.divide(data_mlpf["PuppiMET_pt"][msk], genmet_pt_mlpf[msk]), + "GenMET_pt": genmet_pt_mlpf, + } + + # overall MET response plot + plot_style_kwargs_response = plot_style_kwargs.copy() + plot_style_kwargs_response["legend_loc"] = legend_loc_met_response + met_response_plot( + resp_pf, + resp_mlpf, + data_pf, + data_mlpf, + genmet_min_pt=5, + genmet_max_pt=10000, + additional_label=", $\mathrm{MET}_{ptcl} > 5$", + additional_cut=lambda data: data["Pileup_nTrueInt"] >= 0, + filename=os.path.join(output_dir, "met_response.pdf"), + sample_name=plot_sample_name, + mlpf_label=mlpf_label, + tev=tev, + **plot_style_kwargs_response, + ) + + # get response in bins of GenMET pt + ( + med_pf_vs_pt, + iqr_pf_vs_pt, + med_mlpf_vs_pt, + iqr_mlpf_vs_pt, + ) = get_met_response_in_bins( + resp_pf, + resp_mlpf, + data_pf, + data_mlpf, + variable_bins=met_bins_for_response, + output_dir=output_dir, + sample_name=plot_sample_name, + mlpf_label=mlpf_label, + tev=tev, + **plot_style_kwargs, + ) + + # Plot scale vs pt + fig, ax = plt.subplots() + ax.plot(midpoints(met_bins_for_response), med_pf_vs_pt, label="PF-PUPPI", color=pf_color, linestyle=pf_linestyle, lw=3) + ax.plot(midpoints(met_bins_for_response), med_mlpf_vs_pt, label=mlpf_label, color=mlpf_color, linestyle=mlpf_linestyle, lw=3) + ax.set_xlabel(XLABELS["gen_met"]) + ax.set_ylabel("Mean response") + ax.legend(fontsize=legend_fontsize, loc=legend_loc_scalereso) + ax.set_xscale("log") + ax.set_ylim(0.0, 4.0) + plt.axhline(1.0, color="black", ls="--") + mplhep.cms.label(ax=ax, data=False, com=tev, year="Run 3") + ax.text( + sample_label_coords[0], sample_label_coords[1], plot_sample_name, transform=ax.transAxes, fontsize=sample_label_fontsize, ha="left", va="top" + ) + ax.text( + jet_label_coords_single[0], jet_label_coords_single[1], "PUPPI MET", transform=ax.transAxes, fontsize=addtext_fontsize, ha="left", va="top" + ) + fig.savefig(os.path.join(output_dir, "met_scale_vs_pt.pdf")) + plt.close(fig) + + # Plot resolution vs pt + fig, ax = plt.subplots() + with np.errstate(divide="ignore", invalid="ignore"): + res_pf = np.nan_to_num(iqr_pf_vs_pt / med_pf_vs_pt) + res_mlpf = np.nan_to_num(iqr_mlpf_vs_pt / med_mlpf_vs_pt) + ax.plot(midpoints(met_bins_for_response), res_pf, label="PF-PUPPI", color=pf_color, linestyle=pf_linestyle, lw=3) + ax.plot(midpoints(met_bins_for_response), res_mlpf, label=mlpf_label, color=mlpf_color, linestyle=mlpf_linestyle, lw=3) + ax.set_xlabel(XLABELS["gen_met"]) + ax.set_ylabel("Response resolution") + ax.legend(fontsize=legend_fontsize, loc=legend_loc_scalereso) + ax.set_xscale("log") + ax.set_ylim(0.0, 2.0) + mplhep.cms.label(ax=ax, data=False, com=tev, year="Run 3") + ax.text( + sample_label_coords[0], sample_label_coords[1], plot_sample_name, transform=ax.transAxes, fontsize=sample_label_fontsize, ha="left", va="top" + ) + ax.text( + jet_label_coords_single[0], jet_label_coords_single[1], "PUPPI MET", transform=ax.transAxes, fontsize=addtext_fontsize, ha="left", va="top" + ) + fig.savefig(os.path.join(output_dir, "met_resolution_vs_pt.pdf")) + plt.close(fig) + + # Plot PU-dependent MET response + if "PU" in sample_name: + plot_met_response_vs_pu(resp_pf, resp_mlpf, data_pf, data_mlpf, output_dir, plot_sample_name, mlpf_label, tev, **plot_style_kwargs) + + print(f"Generated plots in {output_dir}") + + +if __name__ == "__main__": + make_plots() diff --git a/mlpf/plotting/plot_utils.py b/mlpf/plotting/plot_utils.py index ef30ff65a..8663e070b 100644 --- a/mlpf/plotting/plot_utils.py +++ b/mlpf/plotting/plot_utils.py @@ -10,6 +10,7 @@ import sklearn import sklearn.metrics import tqdm +import sys import vector SAMPLE_LABEL_CMS = { @@ -85,7 +86,7 @@ labels = { "met": "$p_{\mathrm{T}}^{\mathrm{miss}}$ (GeV)", - "gen_met": "$p_{\mathrm{T,truth}}^\mathrm{miss}$ (GeV)", + "gen_met": "$p_{\mathrm{T,ptcl}}^\mathrm{miss}$ (GeV)", "gen_mom": "$p_{\mathrm{truth}}$ (GeV)", "gen_jet": "jet $p_{\mathrm{T,truth}}$ (GeV)", "target_jet": "jet $p_{\mathrm{T,target}}$ (GeV)", @@ -145,6 +146,24 @@ def get_class_names(sample_name): "cms": [10, 20, 40, 60, 80, 100, 200, 400, 800], } +SAMPLE_NAME_TO_PROCESS = { + "QCD_PU": "cms_pf_qcd", + "QCD_PU_13p6": "cms_pf_qcd", + "QCD_PU_13p6_v2": "cms_pf_qcd", + "QCD_PU_13p6_v3": "cms_pf_qcd", + "QCD_noPU_13p6": "cms_pf_qcd_nopu", + "TTbar_PU": "cms_pf_ttbar", + "TTbar_PU_13p6": "cms_pf_ttbar", + "TTbar_noPU_13p6": "cms_pf_ttbar_nopu", + "PhotonJet_PU": "cms_pf_photonjet", + "PhotonJet_noPU_13p6": "cms_pf_photonjet_nopu", + "PhotonJet_PU_13p6": "cms_pf_photonjet", +} + + +def sample_name_to_process(sample_name): + return SAMPLE_NAME_TO_PROCESS[sample_name] + def load_loss_history(path, min_epoch=None, max_epoch=None): ret = {} @@ -198,6 +217,10 @@ def format_dataset_name(dataset): return EVALUATION_DATASET_NAMES[dataset] +def midpoints(x): + return (x[1:] + x[:-1]) / 2 + + def med_iqr(arr): if len(arr) > 0: p25 = np.percentile(arr, 25) @@ -297,11 +320,17 @@ def load_eval_data(path, max_files=None): if max_files is not None: filelist = filelist[:max_files] + assert len(filelist) > 0 + + is_interactive = sys.stdout.isatty() + if is_interactive: + filelist = tqdm.tqdm(filelist, total=len(filelist), desc="Loading eval data") - for fi in tqdm.tqdm(filelist, desc="Loading eval data"): + for fi in filelist: dd = awkward.from_parquet(fi) yvals.append(dd) filenames.append(fi) + assert len(yvals) > 0 data = awkward.concatenate(yvals, axis=0) X = data["inputs"] diff --git a/mlpf/plotting/plot_validation.py b/mlpf/plotting/plot_validation.py new file mode 100644 index 000000000..50aaf7eda --- /dev/null +++ b/mlpf/plotting/plot_validation.py @@ -0,0 +1,1090 @@ +import click +import os +import awkward +import numpy as np +import matplotlib + +matplotlib.use("Agg") +import matplotlib.pyplot as plt +import mplhep +from pathlib import Path +from scipy.interpolate import RegularGridInterpolator +from matplotlib.lines import Line2D +from mlpf.plotting.utils import compute_response, Gauss, to_bh, compute_scale_res +from mlpf.plotting.plot_utils import EVALUATION_DATASET_NAMES, med_iqr, sample_name_to_process, midpoints + + +def apply_jet_eta(eta_min, eta_max, data): + if eta_min == 0: + eta_label = f", $|η|$ < {eta_max}" + else: + eta_label = f", {eta_min} < $|η|$ < {eta_max}" + + msk_rj_eta = (np.abs(data["Jet_eta"]) >= eta_min) & (np.abs(data["Jet_eta"]) < eta_max) + for k in data.fields: + if k.startswith("Jet_"): + data[k] = data[k][msk_rj_eta] + msk_gj_eta = (np.abs(data["GenJet_eta"]) >= eta_min) & (np.abs(data["GenJet_eta"]) < eta_max) + for k in data.fields: + if k.startswith("GenJet_"): + data[k] = data[k][msk_gj_eta] + return eta_label + + +jet_fiducial_cuts = { + "inclusive": {"eta": [0, 5.0]}, + "eta_0_2p5": {"eta": [0, 2.5]}, + "eta_2p5_3": {"eta": [2.5, 3]}, + "eta_3_5": {"eta": [3, 5]}, +} + + +@click.command() +@click.option("--input-pf-parquet", required=True, type=str) +@click.option("--input-mlpf-parquet", required=True, type=str) +@click.option("--corrections-file", required=True, type=str, help="NPZ file with correction maps.") +@click.option("--output-dir", required=True, type=str) +@click.option("--jet-type", default="ak4", type=click.Choice(["ak4", "ak8"])) +@click.option("--sample-name", required=True, type=str, help="Sample name (e.g., QCD_PU_13p6)") +@click.option("--fiducial-cuts", default="inclusive", type=click.Choice(jet_fiducial_cuts.keys())) +@click.option("--tev", default=13.6, type=float, help="Center of mass energy in TeV for plotting.") +def make_plots(input_pf_parquet, input_mlpf_parquet, corrections_file, output_dir, jet_type, sample_name, fiducial_cuts, tev): + """Applies corrections and generates validation plots.""" + + output_dir = str(Path(output_dir, sample_name, jet_type, fiducial_cuts)) + + os.makedirs(output_dir, exist_ok=True) + mplhep.style.use("CMS") + matplotlib.rcParams["axes.labelsize"] = 35 + + process_name = sample_name_to_process(sample_name) + plot_sample_name = EVALUATION_DATASET_NAMES.get(process_name, sample_name) + + # plotting style variables + legend_fontsize = 30 + legend_fontsize_jet_response = 20 + legend_loc = (0.5, 0.45) + legend_loc_effpur = (0.5, 0.68) + legend_loc_scalereso = (0.40, 0.50) + legend_loc_jet_response = (0.05, 0.55) + sample_label_fontsize = 30 + addtext_fontsize = 25 + jet_label_coords = 0.02, 0.86 + jet_label_coords_single = 0.02, 0.88 + sample_label_coords = 0.02, 0.96 + gen_color = "#648df4" + pf_color = "#f3a041" + mlpf_color = "#d23b3d" + gen_linestyle = "--" + pf_linestyle = "-." + mlpf_linestyle = "-" + pf_label = "PF-PUPPI" + mlpf_label = "MLPF-PUPPI" + + jet_prefixes = {"ak4": "Jet", "ak8": "FatJet"} + jet_prefix = jet_prefixes[jet_type] + genjet_prefixes = {"ak4": "GenJet", "ak8": "GenJetAK8"} + genjet_prefix = genjet_prefixes[jet_type] + + # fiducial cut for kinematic distributions only + min_jet_pt = 0 + if jet_prefix == "Jet": + min_jet_pt = 10 + elif jet_prefix == "FatJet": + min_jet_pt = 150 + + def varbins(*args): + newlist = [] + for arg in args[:-1]: + newlist.append(arg[:-1]) + newlist.append(args[-1]) + return np.concatenate(newlist) + + eta_bins_for_response = np.linspace(-5, 5, 81) + eta_bins_for_kinematics = np.linspace(-5, 5, 51) + eta_bins_for_pureff = np.linspace(-5, 5, 51) + + if sample_name.startswith("QCD_"): + if jet_type == "ak4": + pt_bins_for_response = np.array([10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 250, 300, 350, 400, 450, 500, 600, 700, 800, 900, 1000, 2000]) + # pt_bins_for_kinematics = varbins(np.linspace(20, 100, 21), np.linspace(100, 200, 5), np.linspace(200, 1000, 5), np.linspace(1000, 2000, 2)) + pt_bins_for_kinematics = np.logspace(1, 3.61, 41) + pt_bins_for_pureff = varbins(np.linspace(1, 20, 5), np.linspace(20, 100, 21), np.linspace(100, 200, 5), np.linspace(200, 1000, 5)) + pt_bins_for_pu = [(0, 30), (30, 60), (60, 100), (100, 200), (200, 5000)] + elif jet_type == "ak8": + pt_bins_for_response = varbins(np.linspace(20, 1000, 5)) + # pt_bins_for_kinematics = [100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1250, 1500, 1750, 2000] + pt_bins_for_kinematics = np.logspace(2, 3.61, 41) + pt_bins_for_pureff = varbins(np.linspace(1, 20, 5), np.linspace(20, 100, 5), np.linspace(100, 1000, 5)) + pt_bins_for_pu = [(100, 500), (500, 1000), (1000, 1500), (1500, 2000), (2000, 2500)] + elif sample_name.startswith("TTbar_"): + if jet_type == "ak4": + pt_bins_for_response = np.array([10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 250, 500]) + # pt_bins_for_kinematics = varbins(np.linspace(10, 100, 21), np.linspace(100, 250, 5), np.linspace(250, 500, 2)) + pt_bins_for_kinematics = np.logspace(1, 3.31, 41) + pt_bins_for_pureff = varbins(np.linspace(1, 20, 5), np.linspace(20, 100, 21), np.linspace(100, 250, 5)) + elif jet_type == "ak8": + pt_bins_for_response = varbins(np.linspace(10, 400, 5)) + # pt_bins_for_kinematics = varbins(np.linspace(10, 400, 5)) + pt_bins_for_kinematics = np.logspace(1, 2.70, 41) + pt_bins_for_pureff = varbins(np.linspace(1, 400, 5)) + pt_bins_for_pu = [(0, 30), (30, 60), (60, 100), (100, 200), (200, 5000)] + elif sample_name.startswith("PhotonJet_"): + if jet_type == "ak4": + pt_bins_for_response = np.array([10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 125, 150, 175, 200, 250, 300]) + # pt_bins_for_kinematics = varbins(np.linspace(20, 60, 21), np.linspace(60, 120, 2)) + pt_bins_for_kinematics = np.logspace(1, 2.31, 41) + pt_bins_for_pureff = varbins(np.linspace(5, 20, 5), np.linspace(20, 60, 21), np.linspace(60, 120, 2)) + elif jet_type == "ak8": + pt_bins_for_response = varbins(np.linspace(1, 1000, 5)) + # pt_bins_for_kinematics = varbins(np.linspace(1, 1000, 5)) + pt_bins_for_kinematics = np.logspace(1, 3, 41) + pt_bins_for_pureff = varbins(np.linspace(1, 1000, 5)) + pt_bins_for_pu = [(0, 30), (30, 60), (60, 100)] + + def plot_kinematic_distribution( + data_pf, + data_mlpf, + jet_prefix, + genjet_prefix, + variable_gen, + variable_reco, + bins, + xlabel, + filename, + tev, + logy=True, + raw_or_corr="raw", + jet_label="", + ): + f, (a0, a1) = plt.subplots(2, 1, gridspec_kw={"height_ratios": [3, 1]}, sharex=True) + + jet_pt_var = f"{jet_prefix}_pt_{raw_or_corr}" + genjet_pt_var = f"{genjet_prefix}_pt" + + print(f"Jet kinematic plots with pT > {min_jet_pt}") + + # Gen jets + gen_jet_mask = data_pf[genjet_pt_var] > min_jet_pt + + h0 = to_bh(awkward.flatten(data_pf[f"{genjet_prefix}_{variable_gen}"][gen_jet_mask]), bins) + + # PF jets + pf_jet_mask = data_pf[jet_pt_var] > min_jet_pt + if jet_prefix == "Jet": + pf_jet_mask = pf_jet_mask & ((data_pf["Jet_neMultiplicity"] > 1) | (np.abs(data_pf["Jet_eta"]) < 3)) + + h1 = to_bh(awkward.flatten(data_pf[f"{jet_prefix}_{variable_reco}"][pf_jet_mask]), bins) + + # MLPF jets + mlpf_jet_mask = data_mlpf[jet_pt_var] > min_jet_pt + if jet_prefix == "Jet": + mlpf_jet_mask = mlpf_jet_mask & ((data_mlpf["Jet_neMultiplicity"] > 1) | (np.abs(data_mlpf["Jet_eta"]) < 3)) + + h2 = to_bh(awkward.flatten(data_mlpf[f"{jet_prefix}_{variable_reco}"][mlpf_jet_mask]), bins) + + plt.sca(a0) + x0 = mplhep.histplot(h0, histtype="step", lw=2, label="Gen.", ls=gen_linestyle) + x1 = mplhep.histplot(h1, histtype="step", lw=2, label=pf_label, ls=pf_linestyle) + x2 = mplhep.histplot(h2, histtype="step", lw=2, label=mlpf_label, ls=mlpf_linestyle) + + if logy: + plt.yscale("log") + mult = 10000 + a0.set_ylim(bottom=1, top=a0.get_ylim()[1] * mult) + + mplhep.cms.label("", data=False, com=tev, year="Run 3", ax=a0) + a0.text( + sample_label_coords[0], + sample_label_coords[1], + plot_sample_name, + transform=a0.transAxes, + fontsize=sample_label_fontsize, + ha="left", + va="top", + ) + + jet_label_text = jet_label + a0.text(jet_label_coords[0], jet_label_coords[1], jet_label_text, transform=a0.transAxes, fontsize=addtext_fontsize, ha="left", va="top") + + handles, labels = a0.get_legend_handles_labels() + handles = [x0[0].stairs, x1[0].stairs, x2[0].stairs] + a0.legend(handles, labels, loc=legend_loc, fontsize=legend_fontsize) + plt.ylabel("Count") + + plt.sca(a1) + ratio = h0 / h0 + sigma_ratio = ratio * np.sqrt(1 / h0.counts() + 1.0 / h0.counts()) + + mplhep.histplot(ratio, histtype="step", lw=2, ls=gen_linestyle, color=gen_color) + mplhep.histplot(ratio, yerr=sigma_ratio.counts(), edgecolor=gen_color, ls=gen_linestyle, lw=2, histtype="band", facecolor=gen_color) + mplhep.histplot(h1 / h0, histtype="step", lw=2, ls=pf_linestyle, color=pf_color) + mplhep.histplot(h2 / h0, histtype="step", lw=2, ls=mlpf_linestyle, color=mlpf_color) + plt.ylim(0, 2) + plt.ylabel("Reco / Gen") + plt.xlabel(xlabel) + + if variable_reco.startswith("pt"): + plt.xscale("log") + + plt.xlim(min(bins), max(bins)) + plt.savefig(os.path.join(output_dir, filename)) + plt.close() + + def jet_response_plot( + resp_pf, + resp_mlpf, + data_baseline, + data_mlpf, + tev, + response="response", + genjet_min_pt=0, + genjet_max_pt=5000, + genjet_min_eta=-6, + genjet_max_eta=6, + jet_label="", + additional_label="", + jet_pt="Jet_pt_corr", + genjet_pt="GenJet_pt", + genjet_eta="GenJet_eta", + additional_cut=lambda data: data["Pileup_nTrueInt"] >= 0, + filename="jet_response.pdf", + save_figure=False, + ): + plt.figure() + ax = plt.axes() + b = np.linspace(0, 2, 101) + + mplhep.cms.label("", data=False, com=tev, year="Run 3", ax=ax) + ax.text( + sample_label_coords[0], + sample_label_coords[1], + plot_sample_name, + transform=ax.transAxes, + fontsize=sample_label_fontsize, + ha="left", + va="top", + ) + ax.text( + jet_label_coords_single[0], + jet_label_coords_single[1], + jet_label + additional_label, + transform=ax.transAxes, + fontsize=addtext_fontsize, + ha="left", + va="top", + ) + + add_cut_pf = additional_cut(data_baseline) + add_cut_mlpf = additional_cut(data_mlpf) + + jet_response_pf = awkward.flatten( + resp_pf[response][ + (resp_pf[genjet_pt] >= genjet_min_pt) + & (resp_pf[genjet_pt] < genjet_max_pt) + & (resp_pf[genjet_eta] >= genjet_min_eta) + & (resp_pf[genjet_eta] < genjet_max_eta) + & add_cut_pf + ] + ) + jet_response_mlpf = awkward.flatten( + resp_mlpf[response][ + (resp_mlpf[genjet_pt] >= genjet_min_pt) + & (resp_mlpf[genjet_pt] < genjet_max_pt) + & (resp_mlpf[genjet_eta] >= genjet_min_eta) + & (resp_mlpf[genjet_eta] < genjet_max_eta) + & add_cut_mlpf + ] + ) + + h0 = to_bh(jet_response_pf, b) + h1 = to_bh(jet_response_mlpf, b) + + norm_pf, mean_pf, std_pf = compute_scale_res(jet_response_pf) + norm_mlpf, mean_mlpf, std_mlpf = compute_scale_res(jet_response_mlpf) + med_pf, iqr_pf = med_iqr(jet_response_pf) + med_mlpf, iqr_mlpf = med_iqr(jet_response_mlpf) + + x0 = mplhep.histplot( + h0, + histtype="step", + lw=2, + label="PF-PUPPI\nmean: {:.2f} std: {:.2f}\nmed: {:.2f} IQR: {:.2f}".format(mean_pf, std_pf, med_pf, iqr_pf), + ls=pf_linestyle, + color=pf_color, + ) + x1 = mplhep.histplot( + h1, + histtype="step", + lw=2, + label="{}\nmean: {:.2f} std: {:.2f}\nmed: {:.2f} IQR: {:.2f}".format(mlpf_label, mean_mlpf, std_mlpf, med_mlpf, iqr_mlpf), + ls=mlpf_linestyle, + color=mlpf_color, + ) + if norm_pf > 0: + plt.plot(h0.axes[0].centers, Gauss(h0.axes[0].centers, norm_pf, mean_pf, std_pf), color=pf_color) + if norm_mlpf > 0: + plt.plot(h1.axes[0].centers, Gauss(h1.axes[0].centers, norm_mlpf, mean_mlpf, std_mlpf), color=mlpf_color) + + handles, labels = ax.get_legend_handles_labels() + handles = [x0[0].stairs, x1[0].stairs] + ax.legend(handles, labels, loc=legend_loc_jet_response, fontsize=legend_fontsize_jet_response) + + jet_label_corr = "Corr. jet " + jet_label_raw = "Raw jet " + jl = jet_label_corr if jet_pt.endswith("_corr") else jet_label_raw + plt.xlabel(jl + "$p_{T}/p_{T,ptcl}$ response") + plt.ylabel("Count") + + ax.set_ylim(0, 1.5 * ax.get_ylim()[1]) + ax.ticklabel_format(axis="y", style="sci", scilimits=(0, 0)) + ax.yaxis.get_offset_text().set_x(-0.01) + ax.yaxis.get_offset_text().set_ha("right") + + if save_figure: + plt.savefig(os.path.join(output_dir, filename)) + plt.close() + return ((med_pf, iqr_pf, mean_pf, std_pf), (med_mlpf, iqr_mlpf, mean_mlpf, std_mlpf)) + + def get_response_in_bins( + resp_pf, + resp_mlpf, + data_pf, + data_mlpf, + variable_bins, + variable_name, + tev, + response_type="response", + jet_prefix="Jet", + genjet_prefix="GenJet", + jet_label="", + ): + med_vals_pf, iqr_vals_pf, mean_vals_pf, sigma_vals_pf = [], [], [], [] + med_vals_mlpf, iqr_vals_mlpf, mean_vals_mlpf, sigma_vals_mlpf = [], [], [], [] + + varname_pretty = "" + if variable_name == "GenJet_eta" or variable_name == "GenJetAK8_eta": + varname_pretty = "$\\eta_{ptcl}$" + elif variable_name == "GenJet_pt" or variable_name == "GenJetAK8_pt": + varname_pretty = "$p_{T,ptcl}$" + else: + raise Exception(f"Unknown variable name {variable_name}") + + for ibin in range(len(variable_bins) - 1): + min_bin_val, max_bin_val = variable_bins[ibin], variable_bins[ibin + 1] + + stats_pf, stats_mlpf = jet_response_plot( + resp_pf, + resp_mlpf, + data_pf, + data_mlpf, + tev, + response=response_type, + genjet_min_pt=min_bin_val if "pt" in variable_name else 0, + genjet_max_pt=max_bin_val if "pt" in variable_name else 5000, + genjet_min_eta=min_bin_val if "eta" in variable_name else -6, + genjet_max_eta=max_bin_val if "eta" in variable_name else 6, + jet_label=jet_label, + additional_label=f", {min_bin_val:.2f}<{varname_pretty}<{max_bin_val:.2f}", + jet_pt=f"{jet_prefix}_pt_corr" if response_type == "response" else f"{jet_prefix}_pt_raw", + genjet_pt=f"{genjet_prefix}_pt", + genjet_eta=f"{genjet_prefix}_eta", + filename=f"{jet_prefix}_response_{response_type}_bin_{variable_name.replace(genjet_prefix+'_', '')}_{ibin}.pdf", + ) + med_vals_pf.append(stats_pf[0]) + iqr_vals_pf.append(stats_pf[1]) + mean_vals_pf.append(stats_pf[2]) + sigma_vals_pf.append(stats_pf[3]) + med_vals_mlpf.append(stats_mlpf[0]) + iqr_vals_mlpf.append(stats_mlpf[1]) + mean_vals_mlpf.append(stats_mlpf[2]) + sigma_vals_mlpf.append(stats_mlpf[3]) + + return ( + np.array(med_vals_pf), + np.array(iqr_vals_pf), + np.array(mean_vals_pf), + np.array(sigma_vals_pf), + np.array(med_vals_mlpf), + np.array(iqr_vals_mlpf), + np.array(mean_vals_mlpf), + np.array(sigma_vals_mlpf), + ) + + def plot_efficiency_vs_kin( + h_total_gen, + h_matched_pf, + h_matched_mlpf, + bins, + xlabel, + output_dir, + filename, + jet_label, + tev, + ): + fig, ax = plt.subplots() + + eff_pf = h_matched_pf / h_total_gen + eff_mlpf = h_matched_mlpf / h_total_gen + + mplhep.histplot(eff_pf, ax=ax, label="PF-PUPPI", color=pf_color, linestyle=pf_linestyle, lw=3) + mplhep.histplot(eff_mlpf, ax=ax, label=mlpf_label, color=mlpf_color, linestyle=mlpf_linestyle, lw=3) + + ax.set_xlabel(xlabel) + ax.set_ylabel("Jet efficiency") + ax.legend(fontsize=legend_fontsize, loc=legend_loc_effpur) + if "p_T" in xlabel: + ax.set_xscale("log") + ax.set_ylim(0.0, 1.5) + ax.set_xlim(np.min(h_total_gen.axes[0]), np.max(h_total_gen.axes[0])) + plt.axhline(1.0, color="black", ls="--") + mplhep.cms.label(ax=ax, data=False, com=tev, year="Run 3") + ax.text( + sample_label_coords[0], + sample_label_coords[1], + plot_sample_name, + transform=ax.transAxes, + fontsize=sample_label_fontsize, + ha="left", + va="top", + ) + ax.text( + jet_label_coords_single[0], + jet_label_coords_single[1], + jet_label, + transform=ax.transAxes, + fontsize=addtext_fontsize, + ha="left", + va="top", + ) + fig.savefig(os.path.join(output_dir, filename)) + plt.close(fig) + + def plot_purity_vs_kin( + h_total_pf, + h_total_mlpf, + h_matched_pf, + h_matched_mlpf, + bins, + xlabel, + output_dir, + filename, + jet_label, + tev, + ): + fig, ax = plt.subplots() + + pur_pf = h_matched_pf / h_total_pf + pur_mlpf = h_matched_mlpf / h_total_mlpf + + mplhep.histplot(pur_pf, ax=ax, label="PF-PUPPI", color=pf_color, linestyle=pf_linestyle, lw=3) + mplhep.histplot(pur_mlpf, ax=ax, label=mlpf_label, color=mlpf_color, linestyle=mlpf_linestyle, lw=3) + + ax.set_xlabel(xlabel) + ax.set_ylabel("Jet purity") + ax.legend(fontsize=legend_fontsize, loc=legend_loc_effpur) + if "p_T" in xlabel: + ax.set_xscale("log") + ax.set_ylim(0.0, 1.5) + ax.set_xlim(np.min(h_total_pf.axes[0]), np.max(h_total_pf.axes[0])) + plt.axhline(1.0, color="black", ls="--") + mplhep.cms.label(ax=ax, data=False, com=tev, year="Run 3") + ax.text( + sample_label_coords[0], + sample_label_coords[1], + plot_sample_name, + transform=ax.transAxes, + fontsize=sample_label_fontsize, + ha="left", + va="top", + ) + ax.text( + jet_label_coords_single[0], + jet_label_coords_single[1], + jet_label, + transform=ax.transAxes, + fontsize=addtext_fontsize, + ha="left", + va="top", + ) + fig.savefig(os.path.join(output_dir, filename)) + plt.close(fig) + + data_pf = awkward.from_parquet(input_pf_parquet) + data_mlpf = awkward.from_parquet(input_mlpf_parquet) + + jet_label = "" + if jet_type == "ak4": + deltar_cut = 0.2 + jet_label = f"AK4 jets, $p_T$ > {min_jet_pt} GeV" + elif jet_type == "ak8": + deltar_cut = 0.4 + jet_label = f"AK8 jets, $p_T$ > {min_jet_pt} GeV" + + if jet_type == "ak4": + jet_label_inclusive = "AK4 jets" + elif jet_type == "ak8": + jet_label_inclusive = "AK8 jets" + + chosen_cuts = jet_fiducial_cuts[fiducial_cuts] + for data in [data_pf, data_mlpf]: + eta_label = apply_jet_eta(chosen_cuts["eta"][0], chosen_cuts["eta"][1], data) + jet_label += eta_label + jet_label_inclusive += eta_label + + corrections = np.load(corrections_file) + corr_map_pf = corrections["corr_map_pf"] + corr_map_mlpf = corrections["corr_map_mlpf"] + eta_bins = corrections["eta_bins"] + pt_bins = corrections["pt_bins"] + + interp_pf = RegularGridInterpolator( + (midpoints(np.array(eta_bins)), midpoints(np.array(pt_bins))), corr_map_pf, method="linear", bounds_error=False, fill_value=None + ) + interp_mlpf = RegularGridInterpolator( + (midpoints(np.array(eta_bins)), midpoints(np.array(pt_bins))), corr_map_mlpf, method="linear", bounds_error=False, fill_value=None + ) + + corr_pf_interp = interp_pf( + np.stack( + [awkward.to_numpy(awkward.flatten(data_pf[jet_prefix + "_eta"])), awkward.to_numpy(awkward.flatten(data_pf[jet_prefix + "_pt_raw"]))] + ).T + ) + corr_pf_interp = awkward.unflatten(corr_pf_interp, awkward.count(data_pf[jet_prefix + "_eta"], axis=1)) + data_pf[jet_prefix + "_pt_corr"] = data_pf[jet_prefix + "_pt_raw"] * corr_pf_interp + + corr_mlpf_interp = interp_mlpf( + np.stack( + [awkward.to_numpy(awkward.flatten(data_mlpf[jet_prefix + "_eta"])), awkward.to_numpy(awkward.flatten(data_mlpf[jet_prefix + "_pt_raw"]))] + ).T + ) + corr_mlpf_interp = awkward.unflatten(corr_mlpf_interp, awkward.count(data_mlpf[jet_prefix + "_eta"], axis=1)) + data_mlpf[jet_prefix + "_pt_corr"] = data_mlpf[jet_prefix + "_pt_raw"] * corr_mlpf_interp + + # Plot kinematic distributions + plot_kinematic_distribution( + data_pf, + data_mlpf, + jet_prefix, + genjet_prefix, + "pt", + "pt_raw", + pt_bins_for_kinematics, + "Raw $p_T$ (GeV)", + f"{jet_type}_pt_raw.pdf", + raw_or_corr="raw", + jet_label=jet_label, + tev=tev, + ) + plot_kinematic_distribution( + data_pf, + data_mlpf, + jet_prefix, + genjet_prefix, + "pt", + "pt_corr", + pt_bins_for_kinematics, + "Corrected $p_T$ (GeV)", + f"{jet_type}_pt_corr.pdf", + raw_or_corr="corr", + jet_label=jet_label, + tev=tev, + ) + plot_kinematic_distribution( + data_pf, + data_mlpf, + jet_prefix, + genjet_prefix, + "eta", + "eta", + eta_bins_for_kinematics, + "$\\eta$", + f"{jet_type}_eta.pdf", + logy=True, + jet_label=jet_label, + tev=tev, + ) + resp_pf = compute_response(data_pf, jet_coll=jet_prefix, genjet_coll=genjet_prefix, deltar_cut=deltar_cut) + resp_mlpf = compute_response(data_mlpf, jet_coll=jet_prefix, genjet_coll=genjet_prefix, deltar_cut=deltar_cut) + + # Efficiency: fraction of gen jets that are matched to reco + gen_jet_mask = data_pf[f"{genjet_prefix}_pt"] > 0 + h_total_gen_pt = to_bh(awkward.flatten(data_pf[f"{genjet_prefix}_pt"][gen_jet_mask]), pt_bins_for_pureff) + h_total_gen_eta = to_bh(awkward.flatten(data_pf[f"{genjet_prefix}_eta"][gen_jet_mask]), eta_bins_for_pureff) + + h_matched_pf_gen_pt = to_bh(awkward.flatten(resp_pf[f"{genjet_prefix}_pt_unfiltered"]), pt_bins_for_pureff) + h_matched_pf_gen_eta = to_bh(awkward.flatten(resp_pf[f"{genjet_prefix}_eta_unfiltered"]), eta_bins_for_pureff) + + h_matched_mlpf_gen_pt = to_bh(awkward.flatten(resp_mlpf[f"{genjet_prefix}_pt_unfiltered"]), pt_bins_for_pureff) + h_matched_mlpf_gen_eta = to_bh(awkward.flatten(resp_mlpf[f"{genjet_prefix}_eta_unfiltered"]), eta_bins_for_pureff) + + plot_efficiency_vs_kin( + h_total_gen_pt, + h_matched_pf_gen_pt, + h_matched_mlpf_gen_pt, + pt_bins_for_pureff, + "$p_{T,ptcl}$ (GeV)", + output_dir, + f"{jet_type}_efficiency_vs_pt.pdf", + jet_label_inclusive, + tev=tev, + ) + plot_efficiency_vs_kin( + h_total_gen_eta, + h_matched_pf_gen_eta, + h_matched_mlpf_gen_eta, + eta_bins_for_pureff, + "$\\eta_{ptcl}$", + output_dir, + f"{jet_type}_efficiency_vs_eta.pdf", + jet_label_inclusive, + tev=tev, + ) + + # Purity: fraction of reco jets matched to gen + pf_jet_mask = data_pf[f"{jet_prefix}_pt_raw"] > 0 + mlpf_jet_mask = data_mlpf[f"{jet_prefix}_pt_raw"] > 0 + if jet_prefix == "Jet": + pf_jet_mask = pf_jet_mask & ((data_pf["Jet_neMultiplicity"] > 1) | (np.abs(data_pf["Jet_eta"]) < 3)) + mlpf_jet_mask = mlpf_jet_mask & ((data_mlpf["Jet_neMultiplicity"] > 1) | (np.abs(data_mlpf["Jet_eta"]) < 3)) + + h_total_pf_pt = to_bh(awkward.flatten(data_pf[f"{jet_prefix}_pt_raw"][pf_jet_mask]), pt_bins_for_pureff) + h_total_pf_eta = to_bh(awkward.flatten(data_pf[f"{jet_prefix}_eta"][pf_jet_mask]), eta_bins_for_pureff) + h_total_mlpf_pt = to_bh(awkward.flatten(data_mlpf[f"{jet_prefix}_pt_raw"][mlpf_jet_mask]), pt_bins_for_pureff) + h_total_mlpf_eta = to_bh(awkward.flatten(data_mlpf[f"{jet_prefix}_eta"][mlpf_jet_mask]), eta_bins_for_pureff) + + h_matched_pf_reco_pt = to_bh(awkward.flatten(resp_pf[f"{jet_prefix}_pt_raw_unfiltered"]), pt_bins_for_pureff) + h_matched_pf_reco_eta = to_bh(awkward.flatten(resp_pf[f"{jet_prefix}_eta_unfiltered"]), eta_bins_for_pureff) + + h_matched_mlpf_reco_pt = to_bh(awkward.flatten(resp_mlpf[f"{jet_prefix}_pt_raw_unfiltered"]), pt_bins_for_pureff) + h_matched_mlpf_reco_eta = to_bh(awkward.flatten(resp_mlpf[f"{jet_prefix}_eta_unfiltered"]), eta_bins_for_pureff) + + plot_purity_vs_kin( + h_total_pf_pt, + h_total_mlpf_pt, + h_matched_pf_reco_pt, + h_matched_mlpf_reco_pt, + pt_bins_for_pureff, + "$p_T$ (GeV)", + output_dir, + f"{jet_type}_purity_vs_pt.pdf", + jet_label_inclusive, + tev=tev, + ) + plot_purity_vs_kin( + h_total_pf_eta, + h_total_mlpf_eta, + h_matched_pf_reco_eta, + h_matched_mlpf_reco_eta, + eta_bins_for_pureff, + "$\\eta$", + output_dir, + f"{jet_type}_purity_vs_eta.pdf", + jet_label_inclusive, + tev=tev, + ) + + # overall jet response ratio plots + jet_response_plot( + resp_pf, + resp_mlpf, + data_pf, + data_mlpf, + tev, + response="response_raw", + jet_pt=f"{jet_prefix}_pt_raw", + jet_label=jet_label, + genjet_pt=f"{genjet_prefix}_pt", + genjet_eta=f"{genjet_prefix}_eta", + filename=f"{jet_type}_jet_pt_ratio_raw.pdf", + save_figure=True, + ) + jet_response_plot( + resp_pf, + resp_mlpf, + data_pf, + data_mlpf, + tev, + response="response", + jet_pt=f"{jet_prefix}_pt_corr", + jet_label=jet_label_inclusive, + genjet_pt=f"{genjet_prefix}_pt", + genjet_eta=f"{genjet_prefix}_eta", + filename=f"{jet_type}_jet_pt_ratio_corr.pdf", + save_figure=True, + ) + + med_pf_vs_pt, iqr_pf_vs_pt, mean_pf_vs_pt, sigma_pf_vs_pt, med_mlpf_vs_pt, iqr_mlpf_vs_pt, mean_mlpf_vs_pt, sigma_mlpf_vs_pt = ( + get_response_in_bins( + resp_pf, + resp_mlpf, + data_pf, + data_mlpf, + variable_bins=pt_bins_for_response, + variable_name=f"{genjet_prefix}_pt", + tev=tev, + jet_prefix=jet_prefix, + genjet_prefix=genjet_prefix, + jet_label=jet_label_inclusive, + ) + ) + ( + med_pf_vs_pt_raw, + iqr_pf_vs_pt_raw, + mean_pf_vs_pt_raw, + sigma_pf_vs_pt_raw, + med_mlpf_vs_pt_raw, + iqr_mlpf_vs_pt_raw, + mean_mlpf_vs_pt_raw, + sigma_mlpf_vs_pt_raw, + ) = get_response_in_bins( + resp_pf, + resp_mlpf, + data_pf, + data_mlpf, + variable_bins=pt_bins_for_response, + variable_name=f"{genjet_prefix}_pt", + tev=tev, + response_type="response_raw", + jet_prefix=jet_prefix, + genjet_prefix=genjet_prefix, + jet_label=jet_label_inclusive, + ) + + med_pf_vs_eta, iqr_pf_vs_eta, mean_pf_vs_eta, sigma_pf_vs_eta, med_mlpf_vs_eta, iqr_mlpf_vs_eta, mean_mlpf_vs_eta, sigma_mlpf_vs_eta = ( + get_response_in_bins( + resp_pf, + resp_mlpf, + data_pf, + data_mlpf, + variable_bins=eta_bins_for_response, + variable_name=f"{genjet_prefix}_eta", + tev=tev, + jet_prefix=jet_prefix, + genjet_prefix=genjet_prefix, + jet_label=jet_label_inclusive, + ) + ) + ( + med_pf_vs_eta_raw, + iqr_pf_vs_eta_raw, + mean_pf_vs_eta_raw, + sigma_pf_vs_eta_raw, + med_mlpf_vs_eta_raw, + iqr_mlpf_vs_eta_raw, + mean_mlpf_vs_eta_raw, + sigma_mlpf_vs_eta_raw, + ) = get_response_in_bins( + resp_pf, + resp_mlpf, + data_pf, + data_mlpf, + variable_bins=eta_bins_for_response, + variable_name=f"{genjet_prefix}_eta", + tev=tev, + response_type="response_raw", + jet_prefix=jet_prefix, + genjet_prefix=genjet_prefix, + jet_label=jet_label_inclusive, + ) + + # Plot scale vs pt + fig, ax = plt.subplots() + ax.plot(midpoints(pt_bins_for_response), mean_pf_vs_pt, label="PF-PUPPI", color=pf_color, linestyle=pf_linestyle, lw=3) + ax.plot(midpoints(pt_bins_for_response), mean_mlpf_vs_pt, label=mlpf_label, color=mlpf_color, linestyle=mlpf_linestyle, lw=3) + ax.plot(midpoints(pt_bins_for_response), mean_pf_vs_pt_raw, label="PF-PUPPI raw", color=pf_color, linestyle=pf_linestyle, lw=0.5) + ax.plot(midpoints(pt_bins_for_response), mean_mlpf_vs_pt_raw, label=f"{mlpf_label} raw", color=mlpf_color, linestyle=mlpf_linestyle, lw=0.5) + ax.set_xlabel("GenJet $p_T$ (GeV)") + ax.set_ylabel("Mean response") + ax.legend(fontsize=legend_fontsize, loc=legend_loc_scalereso) + ax.set_xscale("log") + ax.set_ylim(0.5, 1.5) + plt.axhline(1.0, color="black", ls="--") + mplhep.cms.label(ax=ax, data=False, com=tev, year="Run 3") + ax.text( + sample_label_coords[0], sample_label_coords[1], plot_sample_name, transform=ax.transAxes, fontsize=sample_label_fontsize, ha="left", va="top" + ) + ax.text( + jet_label_coords_single[0], + jet_label_coords_single[1], + jet_label_inclusive, + transform=ax.transAxes, + fontsize=addtext_fontsize, + ha="left", + va="top", + ) + fig.savefig(os.path.join(output_dir, f"{jet_type}_scale_vs_pt.pdf")) + plt.close(fig) + + # Plot resolution vs pt + fig, (ax, rax) = plt.subplots(2, 1, gridspec_kw={"height_ratios": [3, 1]}, sharex=True) + fig.subplots_adjust(hspace=0.1) + + res_pf_vs_pt = sigma_pf_vs_pt / mean_pf_vs_pt + res_mlpf_vs_pt = sigma_mlpf_vs_pt / mean_mlpf_vs_pt + + ax.plot(midpoints(pt_bins_for_response), res_pf_vs_pt, label="PF-PUPPI", color=pf_color, linestyle=pf_linestyle, lw=3) + ax.plot( + midpoints(pt_bins_for_response), + res_mlpf_vs_pt, + label=f"{mlpf_label}", + color=mlpf_color, + linestyle=mlpf_linestyle, + lw=3, + ) + # ax.plot( + # midpoints(pt_bins_for_response), sigma_pf_vs_pt_raw / mean_pf_vs_pt_raw, label="PF-PUPPI raw", color=pf_color, linestyle=pf_linestyle, lw=0.5 + # ) + # ax.plot( + # midpoints(pt_bins_for_response), + # sigma_mlpf_vs_pt_raw / mean_mlpf_vs_pt_raw, + # label=f"{mlpf_label} raw", + # color=mlpf_color, + # linestyle=mlpf_linestyle, + # lw=0.5, + # ) + ax.set_ylabel("Response resolution") + ax.legend(fontsize=legend_fontsize, loc=legend_loc_scalereso) + ax.set_ylim(0.0, 1.0) + mplhep.cms.label(ax=ax, data=False, com=tev, year="Run 3") + ax.text( + sample_label_coords[0], sample_label_coords[1], plot_sample_name, transform=ax.transAxes, fontsize=sample_label_fontsize, ha="left", va="top" + ) + ax.text( + jet_label_coords_single[0], + jet_label_coords_single[1], + jet_label_inclusive, + transform=ax.transAxes, + fontsize=addtext_fontsize, + ha="left", + va="top", + ) + + with np.errstate(divide="ignore", invalid="ignore"): + ratio = res_mlpf_vs_pt / res_pf_vs_pt + + rax.plot(midpoints(pt_bins_for_response), ratio, color=mlpf_color, linestyle=mlpf_linestyle, lw=3) + rax.set_xlabel("Jet $p_{T,ptcl}$ (GeV)") + rax.set_ylabel("MLPF / PF") + rax.set_xscale("log") + rax.set_ylim(0.5, 1.5) + rax.axhline(1.0, color="black", ls="--") + rax.set_xlim(min(pt_bins_for_response), max(pt_bins_for_response)) + rax.tick_params(axis="x", pad=10) + + fig.savefig(os.path.join(output_dir, f"{jet_type}_resolution_vs_pt.pdf")) + plt.close(fig) + + # Plot scale vs eta + fig, ax = plt.subplots() + ax.plot(midpoints(eta_bins_for_response), mean_pf_vs_eta, label="PF-PUPPI", color=pf_color, linestyle=pf_linestyle, lw=3) + ax.plot(midpoints(eta_bins_for_response), mean_mlpf_vs_eta, label=mlpf_label, color=mlpf_color, linestyle=mlpf_linestyle, lw=3) + ax.plot(midpoints(eta_bins_for_response), mean_pf_vs_eta_raw, label="PF-PUPPI raw", color=pf_color, linestyle=pf_linestyle, lw=0.5) + ax.plot(midpoints(eta_bins_for_response), mean_mlpf_vs_eta_raw, label=f"{mlpf_label} raw", color=mlpf_color, linestyle=mlpf_linestyle, lw=0.5) + ax.set_xlabel("$\\eta_{ptcl}$") + ax.set_ylabel("Mean response") + ax.legend(fontsize=legend_fontsize, loc=legend_loc_scalereso) + ax.set_ylim(0.5, 1.5) + plt.axhline(1.0, color="black", ls="--") + mplhep.cms.label(ax=ax, data=False, com=tev, year="Run 3") + ax.text( + sample_label_coords[0], sample_label_coords[1], plot_sample_name, transform=ax.transAxes, fontsize=sample_label_fontsize, ha="left", va="top" + ) + ax.text( + jet_label_coords_single[0], + jet_label_coords_single[1], + jet_label_inclusive, + transform=ax.transAxes, + fontsize=addtext_fontsize, + ha="left", + va="top", + ) + fig.savefig(os.path.join(output_dir, f"{jet_type}_scale_vs_eta.pdf")) + plt.close(fig) + + # Plot resolution vs eta + fig, (ax, rax) = plt.subplots(2, 1, gridspec_kw={"height_ratios": [3, 1]}, sharex=True) + fig.subplots_adjust(hspace=0.05) + + res_pf_vs_eta = sigma_pf_vs_eta / mean_pf_vs_eta + res_mlpf_vs_eta = sigma_mlpf_vs_eta / mean_mlpf_vs_eta + + ax.plot(midpoints(eta_bins_for_response), res_pf_vs_eta, label="PF-PUPPI", color=pf_color, linestyle=pf_linestyle, lw=3) + ax.plot( + midpoints(eta_bins_for_response), + res_mlpf_vs_eta, + label=f"{mlpf_label}", + color=mlpf_color, + linestyle=mlpf_linestyle, + lw=3, + ) + # ax.plot( + # midpoints(eta_bins_for_response), + # sigma_pf_vs_eta_raw / mean_pf_vs_eta_raw, + # label="PF-PUPPI raw", + # color=pf_color, + # linestyle=pf_linestyle, + # lw=0.5, + # ) + # ax.plot( + # midpoints(eta_bins_for_response), + # sigma_mlpf_vs_eta_raw / mean_mlpf_vs_eta_raw, + # label=f"{mlpf_label} raw", + # color=mlpf_color, + # linestyle=mlpf_linestyle, + # lw=0.5, + # ) + ax.set_ylabel("Response resolution") + ax.legend(fontsize=legend_fontsize, loc=legend_loc_scalereso) + ax.set_ylim(0.0, 1.0) + mplhep.cms.label(ax=ax, data=False, com=tev, year="Run 3") + ax.text( + sample_label_coords[0], sample_label_coords[1], plot_sample_name, transform=ax.transAxes, fontsize=sample_label_fontsize, ha="left", va="top" + ) + ax.text( + jet_label_coords_single[0], + jet_label_coords_single[1], + jet_label_inclusive, + transform=ax.transAxes, + fontsize=addtext_fontsize, + ha="left", + va="top", + ) + + with np.errstate(divide="ignore", invalid="ignore"): + ratio = res_mlpf_vs_eta / res_pf_vs_eta + + rax.plot(midpoints(eta_bins_for_response), ratio, color=mlpf_color, linestyle=mlpf_linestyle, lw=3) + rax.set_xlabel("$\\eta_{ptcl}$") + rax.set_ylabel("MLPF / PF") + rax.set_ylim(0.5, 1.5) + rax.axhline(1.0, color="black", ls="--") + rax.set_xlim(min(eta_bins_for_response), max(eta_bins_for_response)) + rax.tick_params(axis="x", pad=10) + + fig.savefig(os.path.join(output_dir, f"{jet_type}_resolution_vs_eta.pdf")) + plt.close(fig) + + # Plot PU-dependent jet response + if "PU" in sample_name: + + def plot_response_vs_pu(resp_pf, resp_mlpf, data_pf, data_mlpf, tev): + stats_pu_pf = [] + stats_pu_mlpf = [] + + # Define PU bins from notebook + pu_bins = [(55, 60), (60, 65), (65, 70), (70, 75)] + if not pu_bins: + return + + for pt_range in pt_bins_for_pu: + pt_min, pt_max = pt_range + row_stats_pf = [] + row_stats_mlpf = [] + for pu_min, pu_max in pu_bins: + filename = f"{jet_type}_jet_pt_ratio_corr_pt{pt_min}to{pt_max}_pu{pu_min}to{pu_max}.pdf" + + s_pf, s_mlpf = jet_response_plot( + resp_pf, + resp_mlpf, + data_pf, + data_mlpf, + tev, + response="response", + genjet_min_pt=pt_min, + genjet_max_pt=pt_max, + jet_label=jet_label_inclusive, + additional_label=f", {pt_min}<$p_{{T,ptcl}}$<{pt_max}, {pu_min}≤$N_{{PV}}$<{pu_max}", + jet_pt=f"{jet_prefix}_pt_corr", + genjet_pt=f"{genjet_prefix}_pt", + genjet_eta=f"{genjet_prefix}_eta", + additional_cut=lambda data: (data["Pileup_nTrueInt"] >= pu_min) & (data["Pileup_nTrueInt"] < pu_max), + filename=filename, + ) + row_stats_pf.append(s_pf) + row_stats_mlpf.append(s_mlpf) + stats_pu_pf.append(row_stats_pf) + stats_pu_mlpf.append(row_stats_mlpf) + + stats_pu_pf = np.array(stats_pu_pf) + stats_pu_mlpf = np.array(stats_pu_mlpf) + + with np.errstate(divide="ignore", invalid="ignore"): + # resolution = sigma / median + resolution_pf = np.nan_to_num(stats_pu_pf[:, :, 3] / stats_pu_pf[:, :, 0]) + resolution_mlpf = np.nan_to_num(stats_pu_mlpf[:, :, 3] / stats_pu_mlpf[:, :, 0]) + + markers = ["o", "v", "^", "x", "s"] + fig, ax = plt.subplots() + + pu_bin_centers = [b[0] + (b[1] - b[0]) / 2 for b in pu_bins] + + for i, pt_range in enumerate(pt_bins_for_pu): + label = f"{pt_range[0]}-{pt_range[1]} GeV" + ax.plot( + pu_bin_centers, + resolution_pf[i], + label=label, + marker=markers[i % len(markers)], + color=pf_color, + linestyle=pf_linestyle, + ) + ax.plot( + pu_bin_centers, + resolution_mlpf[i], + marker=markers[i % len(markers)], + color=mlpf_color, + linestyle=mlpf_linestyle, + ) + + handles, labels = ax.get_legend_handles_labels() + + pt_handles = [] + for i, pt_range in enumerate(pt_bins_for_pu): + label = f"{pt_range[0]}-{pt_range[1]}" + if pt_range[1] > 1000: + label = f">{pt_range[0]}" + pt_handles.append(Line2D([0], [0], color="black", marker=markers[i % len(markers)], linestyle="None", label=label)) + + leg1 = ax.legend(handles=pt_handles, title=r"$p_{T,ptcl}$ (GeV)", loc=(0.6, 0.43)) + ax.add_artist(leg1) + + algo_handles = [ + Line2D([0], [0], color=pf_color, lw=2, label="PF-PUPPI", ls=pf_linestyle), + Line2D([0], [0], color=mlpf_color, lw=2, label=mlpf_label, ls=mlpf_linestyle), + ] + ax.legend(handles=algo_handles, title="Algorithm", loc=(0.3, 0.55)) + + ax.set_xlabel("True $N_{PV}$") + ax.set_ylabel("Response resolution (σ/median)") + ax.set_ylim(0, 1.5) + mplhep.cms.label(ax=ax, data=False, com=tev, year="Run 3") + ax.text( + sample_label_coords[0], + sample_label_coords[1], + plot_sample_name, + transform=ax.transAxes, + fontsize=sample_label_fontsize, + ha="left", + va="top", + ) + ax.text( + jet_label_coords_single[0], + jet_label_coords_single[1], + jet_label_inclusive, + transform=ax.transAxes, + fontsize=addtext_fontsize, + ha="left", + va="top", + ) + + fig.savefig(os.path.join(output_dir, f"{jet_type}_resolution_vs_npv.pdf")) + plt.close(fig) + + plot_response_vs_pu(resp_pf, resp_mlpf, data_pf, data_mlpf, tev) + + print(f"Generated plots in {output_dir}") + + +if __name__ == "__main__": + make_plots() diff --git a/mlpf/plotting/utils.py b/mlpf/plotting/utils.py new file mode 100644 index 000000000..920f4b7ef --- /dev/null +++ b/mlpf/plotting/utils.py @@ -0,0 +1,177 @@ +import awkward +import numpy as np +import numba +import boost_histogram as bh +from scipy.optimize import curve_fit + + +@numba.njit +def deltaphi_nb(phi1, phi2): + diff = phi1 - phi2 + return np.arctan2(np.sin(diff), np.cos(diff)) + + +@numba.njit +def deltar_nb(eta1, phi1, eta2, phi2): + deta = eta1 - eta2 + dphi = deltaphi_nb(phi1, phi2) + return np.sqrt(deta**2 + dphi**2) + + +# algo from http://cms.cern.ch/iCMS/jsp/openfile.jsp?tp=draft&files=AN2023_061_v2.pdf, section 3.2 (jet matching) +@numba.njit +def match_jets_nb(j1_eta, j1_phi, j2_eta, j2_phi, deltar_cut): + assert len(j1_eta) == len(j2_eta) + assert len(j1_phi) == len(j2_phi) + assert len(j1_eta) == len(j1_phi) + iev = len(j1_eta) + jet_inds_1_ev = [] + jet_inds_2_ev = [] + drs_ev = [] + for ev in range(iev): + jet_inds_1 = [] + jet_inds_2 = [] + drs = [] + + while True: + if len(j1_eta[ev]) == 0 or len(j2_eta[ev]) == 0: + jet_inds_1_ev.append(np.array(jet_inds_1, dtype=np.int64)) + jet_inds_2_ev.append(np.array(jet_inds_2, dtype=np.int64)) + drs_ev.append(np.array(drs, dtype=np.float64)) + break + + drs_jets = 999 * np.ones((len(j1_eta[ev]), len(j2_eta[ev])), dtype=np.float64) + + for ij1 in range(len(j1_eta[ev])): + if ij1 in jet_inds_1: + continue + for ij2 in range(len(j2_eta[ev])): + if ij2 in jet_inds_2: + continue + + eta1 = j1_eta[ev][ij1] + eta2 = j2_eta[ev][ij2] + phi1 = j1_phi[ev][ij1] + phi2 = j2_phi[ev][ij2] + dr = deltar_nb(eta1, phi1, eta2, phi2) + drs_jets[ij1, ij2] = dr + + if np.all(drs_jets == 999): + jet_inds_1_ev.append(np.array(jet_inds_1, dtype=np.int64)) + jet_inds_2_ev.append(np.array(jet_inds_2, dtype=np.int64)) + drs_ev.append(np.array(drs, dtype=np.float64)) + break + + flat_index = np.argmin(drs_jets) + num_rows, num_cols = drs_jets.shape + ij1_min = flat_index // num_cols + ij2_min = flat_index % num_cols + + jet_inds_1.append(ij1_min) + jet_inds_2.append(ij2_min) + drs.append(drs_jets[ij1_min, ij2_min]) + + if len(jet_inds_1) == len(j1_eta[ev]) or len(jet_inds_2) == len(j2_eta[ev]): + jet_inds_1_ev.append(np.array(jet_inds_1, dtype=np.int64)) + jet_inds_2_ev.append(np.array(jet_inds_2, dtype=np.int64)) + drs_ev.append(np.array(drs, dtype=np.float64)) + break + return jet_inds_1_ev, jet_inds_2_ev, drs_ev + + +def compute_response(data, jet_coll="Jet", genjet_coll="GenJet", deltar_cut=0.2): + rj_idx, gj_idx, drs = match_jets_nb( + data[jet_coll + "_eta"], data[jet_coll + "_phi"], data[genjet_coll + "_eta"], data[genjet_coll + "_phi"], deltar_cut + ) + + rj_idx = awkward.Array(rj_idx) + gj_idx = awkward.Array(gj_idx) + drs = awkward.Array(drs) + + # sort by genjet pt, pick leading 3 gen jets + pair_sort = awkward.argsort(data[genjet_coll + "_pt"][gj_idx], axis=1, ascending=False)[:, :3] + + gj_pt = data[genjet_coll + "_pt"][gj_idx][pair_sort] + gj_eta = data[genjet_coll + "_eta"][gj_idx][pair_sort] + + if jet_coll + "_pt_corr" not in data.fields: + data[jet_coll + "_pt_corr"] = data[jet_coll + "_pt_raw"] + + rj_pt_corr = data[jet_coll + "_pt_corr"][rj_idx][pair_sort] + rj_pt_raw = data[jet_coll + "_pt_raw"][rj_idx][pair_sort] + rj_eta = data[jet_coll + "_eta"][rj_idx][pair_sort] + dr = drs[pair_sort] + + mask_top3 = dr < deltar_cut + + # get response based on top 3 jet pairs + if jet_coll == "Jet": + mask_top3 = mask_top3 & (((data["Jet_neMultiplicity"][rj_idx][pair_sort] > 1)) | (np.abs(data["Jet_eta"][rj_idx][pair_sort]) < 3)) + + response_corr = rj_pt_corr / gj_pt + response_raw = rj_pt_raw / gj_pt + + # For efficiency and purity, use all jets + mask = drs < deltar_cut + if jet_coll == "Jet": + mask = mask & (((data["Jet_neMultiplicity"][rj_idx] > 1)) | (np.abs(data["Jet_eta"][rj_idx]) < 3)) + + gj_pt_unfiltered = data[genjet_coll + "_pt"][gj_idx] + gj_eta_unfiltered = data[genjet_coll + "_eta"][gj_idx] + rj_pt_raw_unfiltered = data[jet_coll + "_pt_raw"][rj_idx] + rj_pt_corr_unfiltered = data[jet_coll + "_pt_corr"][rj_idx] + rj_eta_unfiltered = data[jet_coll + "_eta"][rj_idx] + + return { + # Top 3 jet pairs, sorted by genjet pt + "response": response_corr[mask_top3], + "response_raw": response_raw[mask_top3], + "dr": dr[mask_top3], + jet_coll + "_pt_corr": rj_pt_corr[mask_top3], + jet_coll + "_pt_raw": rj_pt_raw[mask_top3], + jet_coll + "_eta": rj_eta[mask_top3], + genjet_coll + "_pt": gj_pt[mask_top3], + genjet_coll + "_eta": gj_eta[mask_top3], + # All jet pairs, for efficiency/purity calculation + f"{jet_coll}_pt_corr_unfiltered": rj_pt_corr_unfiltered[mask], + f"{jet_coll}_pt_raw_unfiltered": rj_pt_raw_unfiltered[mask], + f"{jet_coll}_eta_unfiltered": rj_eta_unfiltered[mask], + f"{genjet_coll}_pt_unfiltered": gj_pt_unfiltered[mask], + f"{genjet_coll}_eta_unfiltered": gj_eta_unfiltered[mask], + } + + +def to_bh(data, bins): + h1 = bh.Histogram(bh.axis.Variable(bins)) + h1.fill(data) + return h1 + + +def Gauss(x, a, x0, sigma): + if sigma > 0: + return a * np.exp(-((x - x0) ** 2) / (2 * sigma**2)) + else: + return 0 + + +def compute_scale_res(response): + h0 = to_bh(response, np.linspace(0, 2, 100)) + if h0.values().sum() > 0: + try: + parameters1, _ = curve_fit( + Gauss, + h0.axes[0].centers, + h0.values() / h0.values().sum(), + p0=[1.0, 1.0, 1.0], + maxfev=1000000, + method="dogbox", + bounds=[(-np.inf, 0.5, 0.0), (np.inf, 1.5, 2.0)], + ) + norm = parameters1[0] * h0.values().sum() + mean = parameters1[1] + sigma = parameters1[2] + return norm, mean, sigma + except RuntimeError: + return 0, 0, 0 + else: + return 0, 0, 0 diff --git a/mlpf/raytune/pt_search_space.py b/mlpf/raytune/pt_search_space.py index d1647c6c9..50dd74a67 100644 --- a/mlpf/raytune/pt_search_space.py +++ b/mlpf/raytune/pt_search_space.py @@ -3,30 +3,34 @@ raytune_num_samples = 1 # Number of random samples to draw from search space. Set to 1 for grid search. samp = grid_search -# gnn scan search_space = { # dataset parameters - # "ntrain": samp([500]), - # "ntest": samp([10000]), - # "nvalid": samp([500]), - # "num_epochs": samp([10]), + "ntest": samp([1000]), + "nvalid": samp([1000]), + # training length parameters + "num_steps": samp([10000]), + "val_freq": samp([10000]), + "checkpoint_freq": samp([10000]), # optimizer parameters "optimizer": samp(["adamw", "lamb"]), "lr": samp([2e-4, 4e-4, 8e-4]), - "weight_decay": samp([0.001, 0.01, 0.03, 0.1]), - "lr_schedule": samp(["cosinedecay"]), + # "weight_decay": samp([0.001, 0.01, 0.03, 0.1]), + # "lr_schedule": samp(["cosinedecay"]), # "pct_start": samp([0.05, 0.1, 0.2]), - # "gpu_batch_multiplier": samp([256]), + "gpu_batch_multiplier": samp([1, 4, 8]), # "patience": samp([9999]), # model arch parameters - # "activation": samp(["elu", "relu", "relu6", "leakyrelu"]), - # "conv_type": samp(["attention"]), # can be "gnn_lsh", "gravnet", "attention" - # "embedding_dim": samp([32, 64, 128, 252, 512, 1024]), - # "width": samp([32, 64, 128, 256, 512, 1024]), - # "num_convs": samp([1, 2, 3, 4, 5]), - # "dropout": samp([0.0, 0.01, 0.1, 0.4]), + "activation": samp(["elu", "relu", "relu6", "leakyrelu"]), + "conv_type": samp(["attention"]), # can be "gnn_lsh", "attention" + # attention parameters + "num_convs": samp([1, 2, 3, 4, 5]), + "num_heads": samp([8, 16, 32]), + "head_dim": samp([8, 16, 32]), + "dropout": samp([0.0, 0.01, 0.1, 0.2]), # only for gnn-lsh # "bin_size": samp([80, 160, 320, 640]), + # "embedding_dim": samp([32, 64, 128, 252, 512, 1024]), + # "width": samp([32, 64, 128, 256, 512, 1024]), # "max_num_bins": samp([200]), # "distance_dim": samp([128]), # "layernorm": samp([True, False]), @@ -37,8 +41,21 @@ def set_hps_from_search_space(search_space, config): - varaible_names = ["optimizer", "lr", "weight_decay", "lr_schedule", "gpu_batch_multiplier", "ntrain", "ntest", "nvalid", "num_epochs", "patience"] - for var in varaible_names: + variable_names = [ + "optimizer", + "lr", + "weight_decay", + "lr_schedule", + "gpu_batch_multiplier", + "ntrain", + "ntest", + "nvalid", + "num_steps", + "val_freq", + "checkpoint_freq", + "patience", + ] + for var in variable_names: if var in search_space.keys(): config[var] = search_space[var] @@ -46,9 +63,9 @@ def set_hps_from_search_space(search_space, config): conv_type = search_space["conv_type"] config["conv_type"] = conv_type - common_varaible_names = ["num_convs", "activation"] + common_variable_names = ["num_convs", "activation"] if conv_type == "gnn_lsh" or conv_type == "gravnet" or conv_type == "attention": - for var in common_varaible_names: + for var in common_variable_names: if var in search_space.keys(): config["model"][conv_type][var] = search_space[var] @@ -58,7 +75,7 @@ def set_hps_from_search_space(search_space, config): if var in search_space.keys(): config["model"][conv_type][var] = search_space[var] - gnn_lsh_varaible_names = [ + gnn_lsh_variable_names = [ "width", "embedding_dim", "bin_size", @@ -69,7 +86,7 @@ def set_hps_from_search_space(search_space, config): "ffn_dist_hidden_dim", ] if conv_type == "gnn_lsh": - for var in gnn_lsh_varaible_names: + for var in gnn_lsh_variable_names: if var in search_space.keys(): config["model"][conv_type][var] = search_space[var] diff --git a/notebooks/cms/cms-mlpf-outputs.ipynb b/notebooks/cms/cms-mlpf-outputs.ipynb index ec7cddcb2..1d4c11692 100644 --- a/notebooks/cms/cms-mlpf-outputs.ipynb +++ b/notebooks/cms/cms-mlpf-outputs.ipynb @@ -11,6 +11,8 @@ "import json\n", "import glob\n", "import tqdm\n", + "import matplotlib\n", + "matplotlib.rcParams['axes.labelsize'] = 35\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", @@ -2208,8 +2210,8 @@ "\n", "\n", " alpha = 0.2 if smoothing else 1.0\n", - " l0 = None if smoothing else \"training set\"\n", - " l1 = None if smoothing else \"validation set\"\n", + " l0 = None if smoothing else \"Training\"\n", + " l1 = None if smoothing else \"Validation\"\n", " \n", " p0 = plt.plot(epochs, train, alpha=alpha, label=l0, marker=\"o\", ls=\"--\")\n", " # plt.plot([8], train[7], marker=\"o\", ms=10, color=p0[0].get_markerfacecolor(), alpha=0.5)\n", @@ -2223,12 +2225,12 @@ " plt.plot(epochs, test_smooth, color=p1[0].get_color(), lw=2, label=l1)\n", "\n", " plt.ylim(test[-1] * (1.0 - margin), test[-1] * (1.0 + margin))\n", - " plt.legend(loc=3, frameon=False)\n", + " plt.legend(loc=3, frameon=False, fontsize=30)\n", " plt.xlabel(\"epoch\")\n", " # ax.ticklabel_format(axis=\"both\", style=\"sci\", scilimits=(0,0))\n", " # ax.yaxis.get_offset_text().set_x(-0.005) # Adjust this value as needed\n", " # ax.yaxis.get_offset_text().set_ha(\"right\")\n", - " hep.cms.label(\"\", data=False, com=14, year='Run 3')" + " hep.cms.label(\"\", data=False, rlabel='Run 3 configuration')" ] }, { @@ -2238,7 +2240,7 @@ "metadata": {}, "outputs": [], "source": [ - "history = load_history(\"/scratch/persistent/joosep/huggingface/particleflow/cms/v2.6.0pre1/pyg-cms_20250722_101813_274478/history/epoch_*.json\", max_epoch=10)" + "history = load_history(\"/mnt/work/huggingface/particleflow/cms/v2.6.0pre1/pyg-cms_20250722_101813_274478/history/epoch_*.json\", max_epoch=10)" ] }, { @@ -2248,7 +2250,7 @@ "metadata": {}, "outputs": [], "source": [ - "p0 = loss_plot(history.index+1, history[\"train_Total\"].values, history[\"valid_Total\"].values, margin=0.05)\n", + "p0 = loss_plot(history.index+1, history[\"train_Total\"].values, history[\"valid_Total\"].values, margin=0.1)\n", "plt.ylabel(\"Total loss\")\n", "plt.xticks(range(1,len(history)+1))\n", "plt.savefig(\"{}/loss.pdf\".format(outpath))" @@ -3248,7 +3250,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.10" + "version": "3.11.13" } }, "nbformat": 4, diff --git a/notebooks/cms/cms-validate-onnx.ipynb b/notebooks/cms/cms-validate-onnx.ipynb index a1a7c8095..bf2f6b9b5 100644 --- a/notebooks/cms/cms-validate-onnx.ipynb +++ b/notebooks/cms/cms-validate-onnx.ipynb @@ -652,13 +652,6 @@ "metadata": {}, "outputs": [], "source": [ - "#take the intermediate outputs of the first event for all layers\n", - "att_filenames = (\n", - " [\"attn_conv_reg_{}_0\".format(ilayer) for ilayer in range(model_kwargs[\"num_convs\"])] +\n", - " [\"attn_conv_id_{}_0\".format(ilayer) for ilayer in range(model_kwargs[\"num_convs\"])] \n", - " )\n", - "\n", - "\n", "#separate elements by type\n", "typs = [\n", " 1, #track\n", @@ -676,39 +669,65 @@ "X = X_feat_list[0].numpy()\n", "y = y_target_list[0].numpy()\n", "\n", - "energy_marker_sizes = np.linspace(1,30,10)\n", - "energy_bins = np.logspace(0,3,10)\n", + "energy_marker_sizes = np.linspace(1,40,11)\n", + "energy_bins = np.logspace(0,2,10)\n", "energy_markers = energy_marker_sizes[np.searchsorted(energy_bins, X[:, 5])]\n", "\n", "fig, axs = plt.subplots(2, model_kwargs[\"num_convs\"], figsize=(5*model_kwargs[\"num_convs\"],2*5))\n", "axs = axs.flatten()\n", "iattn = 0\n", - "for layertype in [\"reg\", \"id\"]:\n", + "for layertype in [\"id\", \"reg\"]:\n", " for layernum in range(model_kwargs[\"num_convs\"]):\n", " att_fn = \"attn_conv_{}_{}_0.npz\".format(layertype, layernum)\n", " att_file = np.load(att_fn)\n", - " tsne = sklearn.manifold.TSNE()\n", + " tsne = sklearn.manifold.TSNE(perplexity=30)\n", " embed_2d = tsne.fit_transform(att_file[\"x\"][0])\n", " ax = axs[iattn]\n", " plt.sca(axs[iattn])\n", - " for typ in typs:\n", - " msk = X[:, 0]==typ\n", - " alpha = np.ones(len(msk), dtype=np.float32)\n", - " alpha[y[:, 0]==0] = 0.2\n", - " plt.scatter(\n", - " embed_2d[msk, 0],\n", - " embed_2d[msk, 1],\n", - " label=ELEM_NAMES_CMS[typ],\n", - " alpha=alpha[msk],\n", - " s=energy_markers[msk]\n", - " )\n", + " if layertype == \"id\":\n", + " for typ in typs:\n", + " msk = X[:, 0]==typ\n", + " alpha = np.ones(len(msk), dtype=np.float32)\n", + " alpha[y[:, 0]==0] = 0.2\n", + " plt.scatter(\n", + " embed_2d[msk, 0],\n", + " embed_2d[msk, 1],\n", + " label=ELEM_NAMES_CMS[typ],\n", + " alpha=alpha[msk],\n", + " s=energy_markers[msk],\n", + " linewidths=0.05,\n", + " edgecolors=\"black\"\n", + " )\n", + " elif layertype == \"reg\":\n", + " for cut in [\"eta_pos\", \"eta_neg\"]:\n", + " msk = X[:, 0]!=0\n", + " if cut == \"eta_pos\":\n", + " msk = msk & (X[:, 2]>=0)\n", + " label=\"$\\eta \\geq$0\"\n", + " elif cut == \"eta_neg\":\n", + " msk = msk & (X[:, 2]<0)\n", + " label=\"$\\eta$<0\"\n", + " alpha = np.ones(len(msk), dtype=np.float32)\n", + " alpha[y[:, 0]==0] = 0.2\n", + " plt.scatter(\n", + " embed_2d[msk, 0],\n", + " embed_2d[msk, 1],\n", + " label=label,\n", + " alpha=alpha[msk],\n", + " s=energy_markers[msk],\n", + " linewidths=0.05,\n", + " edgecolors=\"black\",\n", + " )\n", " ax.set_xticks([])\n", " ax.set_yticks([])\n", - " plt.legend(fontsize=12, ncols=2)\n", - " plt.title(r\"$z_{{{}}}$\".format(layertype+str(layernum)), fontsize=12)\n", + " legend = plt.legend(fontsize=12, ncols=3, columnspacing=0.8)\n", + " for handle in legend.legend_handles:\n", + " handle.set_alpha(np.ones_like(handle.get_alpha()))\n", + " plt.title(r\"$z_{{{}}}$\".format(layertype+str(layernum)), fontsize=24)\n", " plt.xlim(-150,150)\n", " plt.ylim(-150,150)\n", - " iattn += 1" + " iattn += 1\n", + "plt.savefig(\"embeddings.pdf\")" ] }, { @@ -791,7 +810,7 @@ "outputs": [], "source": [ "def plot_attention_dr(layertype):\n", - " fig, axes = plt.subplots(2, model_kwargs[\"num_convs\"], figsize=(model_kwargs[\"num_convs\"]*6, 2*6), constrained_layout=True, gridspec_kw={'height_ratios': [1, 1]})\n", + " fig, axes = plt.subplots(2, model_kwargs[\"num_convs\"], figsize=(model_kwargs[\"num_convs\"]*6, 2*6), constrained_layout=False, gridspec_kw={'height_ratios': [1, 1]})\n", " for nlayer in range(model_kwargs[\"num_convs\"]):\n", " att_mat = np.load(\"attn_conv_{}_{}_0.npz\".format(layertype, nlayer))[\"att\"]\n", " \n", @@ -803,7 +822,7 @@ " # Top row: Attention Matrices\n", " ax = axes[0, nlayer]\n", " im = ax.imshow(att_mat[0], cmap=cmap_choice, norm=imshow_norm)\n", - " #fig.colorbar(im, ax=ax, fraction=0.046)\n", + " fig.colorbar(im, ax=ax, fraction=0.046)\n", " ax.set_title(\"self-attention $A^{\" + (layertype + str(nlayer)) + \"}_{ij}$\")\n", " ax.set_xlabel(\"elem. i\")\n", " ax.set_ylabel(\"elem. j\")\n", @@ -821,14 +840,20 @@ " cmap=cmap_choice,\n", " norm=matplotlib.colors.LogNorm(vmin=1, vmax=1e6)\n", " )\n", - " #fig.colorbar(im, ax=ax, fraction=0.046)\n", + " fig.colorbar(im, ax=ax, fraction=0.046)\n", " ax.set_yscale(\"log\")\n", " ax.set_xscale(\"log\")\n", " #ax.set_title(titles_corr[i])\n", " ax.set_xlabel(\"$\\Delta R_{ij}$\")\n", " ax.set_ylabel(\"$A_{ij}$\")\n", " ax.set_box_aspect(1)\n", - " plt.tight_layout()" + " ax.yaxis.set_label_coords(0.0, 1.15)\n", + " \n", + " fig.subplots_adjust(\n", + " hspace=-0.04,\n", + " wspace=0.40\n", + " )\n", + " # plt.tight_layout()" ] }, { @@ -838,7 +863,8 @@ "metadata": {}, "outputs": [], "source": [ - "plot_attention_dr(\"id\")" + "plot_attention_dr(\"id\")\n", + "plt.savefig(\"attention_id.pdf\")" ] }, { @@ -848,16 +874,9 @@ "metadata": {}, "outputs": [], "source": [ - "plot_attention_dr(\"reg\")" + "plot_attention_dr(\"reg\")\n", + "plt.savefig(\"attention_reg.pdf\")" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5852e242-269f-453c-a933-c31797e4d6d5", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -876,7 +895,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.10" + "version": "3.11.13" } }, "nbformat": 4, diff --git a/notebooks/cms/cms-validate-postprocessing.ipynb b/notebooks/cms/cms-validate-postprocessing.ipynb index 4af448f1b..f7f052073 100644 --- a/notebooks/cms/cms-validate-postprocessing.ipynb +++ b/notebooks/cms/cms-validate-postprocessing.ipynb @@ -85,14 +85,15 @@ "#https://jpata.web.cern.ch/jpata/mlpf/cms/20240823_simcluster/nopu/TTbar_14TeV_TuneCUETP8M1_cfi/raw\n", "\n", "sample = \"TTbar_14TeV_TuneCUETP8M1_cfi\"\n", - "sample_name = \"cms_pf_ttbar_nopu\"\n", + "sample_name = \"cms_pf_ttbar\"\n", "\n", "def load_pickle_file(file_path):\n", " with bz2.BZ2File(file_path, \"r\") as f:\n", " return pickle.load(f)\n", "\n", - "file_pattern = f\"/local/joosep/mlpf/cms/20250508_cmssw_15_0_5_d3c6d1/nopu/{sample}/raw/*.pkl.bz2\"\n", - "files_to_load = sorted(list(glob.glob(file_pattern)))[:1000]" + "file_pattern = f\"/local/joosep/mlpf/cms/20250508_cmssw_15_0_5_d3c6d1/pu55to75/{sample}/raw/*.pkl.bz2\"\n", + "files_to_load = sorted(list(glob.glob(file_pattern)))[:50]\n", + "len(files_to_load)" ] }, { @@ -300,6 +301,16 @@ "sample_label(ax, sample_name)" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "11f5a31c-a405-4a27-8e4e-b9e0ea6597aa", + "metadata": {}, + "outputs": [], + "source": [ + "plt.hist(awkward.flatten(arrs_awk[\"ytarget\"][\"ispu\"]), bins=np.linspace(0,1,100))" + ] + }, { "cell_type": "code", "execution_count": null, @@ -313,7 +324,7 @@ "eta_min = 0\n", "eta_max = 5\n", "msk_eta1 = (np.abs(arrs_awk[\"pythia\"][\"eta\"])>=eta_min) & (np.abs(arrs_awk[\"pythia\"][\"eta\"])0.5)\n", - "msk_eta2 = (np.abs(arrs_awk[\"ytarget\"][\"eta\"])>=eta_min) & (np.abs(arrs_awk[\"ytarget\"][\"eta\"])=eta_min) & (np.abs(arrs_awk[\"ytarget\"][\"eta\"])0.5) & (arrs_awk[\"ytarget\"][\"ispu\"]<0.5)\n", "\n", "plt.hist2d(\n", " awkward.to_numpy(awkward.sum(arrs_awk[\"pythia\"][\"pt\"][msk_eta1], axis=1)),\n", @@ -324,12 +335,186 @@ "plt.xscale(\"log\")\n", "plt.yscale(\"log\")\n", "mplhep.cms.label(\"Preliminary\", data=False, com=14, year='Run 3')\n", - "sample_label(ax, sample_name)\n", + "sample_label(ax, sample_name, additional_text=\"\\n$p_{PU}<0.5$\")\n", + "plt.colorbar(label=\"Counts\")\n", + "plt.xlabel(\"Pythia $\\sum p_T$ (GeV)\")\n", + "plt.ylabel(\"Target $\\sum p_T$ (GeV)\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "2f224183-2982-46e1-99f9-e00763b3f748", + "metadata": {}, + "outputs": [], + "source": [ + "fig = plt.figure(figsize=(12,10))\n", + "ax = plt.axes()\n", + "\n", + "eta_min = 0\n", + "eta_max = 5\n", + "msk_eta1 = (np.abs(arrs_awk[\"pythia\"][\"eta\"])>=eta_min) & (np.abs(arrs_awk[\"pythia\"][\"eta\"])0.5)\n", + "msk_eta2 = (np.abs(arrs_awk[\"ytarget\"][\"eta\"])>=eta_min) & (np.abs(arrs_awk[\"ytarget\"][\"eta\"])0.5) & (arrs_awk[\"ytarget\"][\"ispu\"]<0.6)\n", + "\n", + "plt.hist2d(\n", + " awkward.to_numpy(awkward.sum(arrs_awk[\"pythia\"][\"pt\"][msk_eta1], axis=1)),\n", + " awkward.to_numpy(awkward.sum(arrs_awk[\"ytarget\"][\"pt\"][msk_eta2], axis=1)),\n", + " bins=np.logspace(2,4,200), norm=matplotlib.colors.LogNorm(), cmap=\"hot_r\"\n", + ");\n", + "plt.plot([1e2, 1e4], [1e2, 1e4], ls=\"--\", color=\"black\")\n", + "plt.xscale(\"log\")\n", + "plt.yscale(\"log\")\n", + "mplhep.cms.label(\"Preliminary\", data=False, com=14, year='Run 3')\n", + "sample_label(ax, sample_name, additional_text=\"\\n$p_{PU}<0.6$\")\n", + "plt.colorbar(label=\"Counts\")\n", + "plt.xlabel(\"Pythia $\\sum p_T$ (GeV)\")\n", + "plt.ylabel(\"Target $\\sum p_T$ (GeV)\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dd960cf0-22ee-45bb-8767-84b3d9136c4b", + "metadata": {}, + "outputs": [], + "source": [ + "fig = plt.figure(figsize=(12,10))\n", + "ax = plt.axes()\n", + "\n", + "eta_min = 0\n", + "eta_max = 5\n", + "msk_eta1 = (np.abs(arrs_awk[\"pythia\"][\"eta\"])>=eta_min) & (np.abs(arrs_awk[\"pythia\"][\"eta\"])0.5)\n", + "msk_eta2 = (np.abs(arrs_awk[\"ytarget\"][\"eta\"])>=eta_min) & (np.abs(arrs_awk[\"ytarget\"][\"eta\"])0.5) & (arrs_awk[\"ytarget\"][\"ispu\"]<0.7)\n", + "\n", + "plt.hist2d(\n", + " awkward.to_numpy(awkward.sum(arrs_awk[\"pythia\"][\"pt\"][msk_eta1], axis=1)),\n", + " awkward.to_numpy(awkward.sum(arrs_awk[\"ytarget\"][\"pt\"][msk_eta2], axis=1)),\n", + " bins=np.logspace(2,4,200), norm=matplotlib.colors.LogNorm(), cmap=\"hot_r\"\n", + ");\n", + "plt.plot([1e2, 1e4], [1e2, 1e4], ls=\"--\", color=\"black\")\n", + "plt.xscale(\"log\")\n", + "plt.yscale(\"log\")\n", + "mplhep.cms.label(\"Preliminary\", data=False, com=14, year='Run 3')\n", + "sample_label(ax, sample_name, additional_text=\"\\n$p_{PU}<0.7$\")\n", "plt.colorbar(label=\"Counts\")\n", "plt.xlabel(\"Pythia $\\sum p_T$ (GeV)\")\n", "plt.ylabel(\"Target $\\sum p_T$ (GeV)\")" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "b01adeb5-cae4-4900-abeb-b99989261759", + "metadata": {}, + "outputs": [], + "source": [ + "fig = plt.figure(figsize=(12,10))\n", + "ax = plt.axes()\n", + "\n", + "eta_min = 0\n", + "eta_max = 5\n", + "msk_eta1 = (np.abs(arrs_awk[\"pythia\"][\"eta\"])>=eta_min) & (np.abs(arrs_awk[\"pythia\"][\"eta\"])0.5)\n", + "msk_eta2 = (np.abs(arrs_awk[\"ytarget\"][\"eta\"])>=eta_min) & (np.abs(arrs_awk[\"ytarget\"][\"eta\"])0.5) & (arrs_awk[\"ytarget\"][\"ispu\"]<0.8)\n", + "\n", + "plt.hist2d(\n", + " awkward.to_numpy(awkward.sum(arrs_awk[\"pythia\"][\"pt\"][msk_eta1], axis=1)),\n", + " awkward.to_numpy(awkward.sum(arrs_awk[\"ytarget\"][\"pt\"][msk_eta2], axis=1)),\n", + " bins=np.logspace(2,4,200), norm=matplotlib.colors.LogNorm(), cmap=\"hot_r\"\n", + ");\n", + "plt.plot([1e2, 1e4], [1e2, 1e4], ls=\"--\", color=\"black\")\n", + "plt.xscale(\"log\")\n", + "plt.yscale(\"log\")\n", + "mplhep.cms.label(\"Preliminary\", data=False, com=14, year='Run 3')\n", + "sample_label(ax, sample_name, additional_text=\"\\n$p_{PU}<0.8$\")\n", + "plt.colorbar(label=\"Counts\")\n", + "plt.xlabel(\"Pythia $\\sum p_T$ (GeV)\")\n", + "plt.ylabel(\"Target $\\sum p_T$ (GeV)\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e44c6125-1525-4e34-9e93-f01325c2299e", + "metadata": {}, + "outputs": [], + "source": [ + "fig = plt.figure(figsize=(12,10))\n", + "ax = plt.axes()\n", + "\n", + "eta_min = 0\n", + "eta_max = 5\n", + "msk_eta1 = (np.abs(arrs_awk[\"pythia\"][\"eta\"])>=eta_min) & (np.abs(arrs_awk[\"pythia\"][\"eta\"])0.5)\n", + "msk_eta2 = (np.abs(arrs_awk[\"ytarget\"][\"eta\"])>=eta_min) & (np.abs(arrs_awk[\"ytarget\"][\"eta\"])0.5) & (arrs_awk[\"ytarget\"][\"ispu\"]<0.9)\n", + "\n", + "plt.hist2d(\n", + " awkward.to_numpy(awkward.sum(arrs_awk[\"pythia\"][\"pt\"][msk_eta1], axis=1)),\n", + " awkward.to_numpy(awkward.sum(arrs_awk[\"ytarget\"][\"pt\"][msk_eta2], axis=1)),\n", + " bins=np.logspace(2,4,200), norm=matplotlib.colors.LogNorm(), cmap=\"hot_r\"\n", + ");\n", + "plt.plot([1e2, 1e4], [1e2, 1e4], ls=\"--\", color=\"black\")\n", + "plt.xscale(\"log\")\n", + "plt.yscale(\"log\")\n", + "mplhep.cms.label(\"Preliminary\", data=False, com=14, year='Run 3')\n", + "sample_label(ax, sample_name, additional_text=\"\\n$p_{PU}<0.9$\")\n", + "plt.colorbar(label=\"Counts\")\n", + "plt.xlabel(\"Pythia $\\sum p_T$ (GeV)\")\n", + "plt.ylabel(\"Target $\\sum p_T$ (GeV)\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "45291fab-1177-458f-8224-a43aa2f4944e", + "metadata": {}, + "outputs": [], + "source": [ + "fig = plt.figure(figsize=(12,10))\n", + "ax = plt.axes()\n", + "\n", + "eta_min = 0\n", + "eta_max = 5\n", + "msk_eta1 = (np.abs(arrs_awk[\"pythia\"][\"eta\"])>=eta_min) & (np.abs(arrs_awk[\"pythia\"][\"eta\"])0.5) & (np.abs(arrs_awk[\"pythia\"][\"pt\"])<2)\n", + "msk_eta2 = (np.abs(arrs_awk[\"ytarget\"][\"eta\"])>=eta_min) & (np.abs(arrs_awk[\"ytarget\"][\"eta\"])0.5) & (np.abs(arrs_awk[\"ytarget\"][\"pt\"])<2)\n", + "\n", + "plt.scatter(\n", + " awkward.to_numpy(awkward.sum(arrs_awk[\"pythia\"][\"pt\"][msk_eta1], axis=1)),\n", + " awkward.to_numpy(awkward.sum(arrs_awk[\"ytarget\"][\"pt\"][msk_eta2]*(1.3 - 1.3*arrs_awk[\"ytarget\"][\"ispu\"][msk_eta2]), axis=1)),\n", + ");\n", + "plt.plot([0, 500], [0, 500], ls=\"--\", color=\"black\")\n", + "mplhep.cms.label(\"Preliminary\", data=False, com=14, year='Run 3')\n", + "sample_label(ax, sample_name, additional_text=\"\\n$0.5 < p_T < 2$ GeV\")\n", + "plt.colorbar(label=\"Counts\")\n", + "plt.xlabel(\"Pythia $\\sum p_T$ (GeV)\")\n", + "plt.ylabel(\"Target $\\sum p_T * 1.3*(1 - p_{PU})$ (GeV)\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "932ebea1-1523-4c7d-9ce4-6272c5eaa55f", + "metadata": {}, + "outputs": [], + "source": [ + "fig = plt.figure(figsize=(12,10))\n", + "ax = plt.axes()\n", + "\n", + "eta_min = 0\n", + "eta_max = 5\n", + "msk_eta1 = (np.abs(arrs_awk[\"pythia\"][\"eta\"])>=eta_min) & (np.abs(arrs_awk[\"pythia\"][\"eta\"])5)\n", + "msk_eta2 = (np.abs(arrs_awk[\"ytarget\"][\"eta\"])>=eta_min) & (np.abs(arrs_awk[\"ytarget\"][\"eta\"])5)\n", + "\n", + "plt.scatter(\n", + " awkward.to_numpy(awkward.sum(arrs_awk[\"pythia\"][\"pt\"][msk_eta1], axis=1)),\n", + " awkward.to_numpy(awkward.sum(arrs_awk[\"ytarget\"][\"pt\"][msk_eta2]*(1 - arrs_awk[\"ytarget\"][\"ispu\"][msk_eta2]), axis=1)),\n", + ");\n", + "plt.plot([0, 2000], [0, 2000], ls=\"--\", color=\"black\")\n", + "mplhep.cms.label(\"Preliminary\", data=False, com=14, year='Run 3')\n", + "sample_label(ax, sample_name, additional_text=\"\\n$p_T > 5$ GeV\")\n", + "plt.colorbar(label=\"Counts\")\n", + "plt.xlabel(\"Pythia $\\sum p_T$ (GeV)\")\n", + "plt.ylabel(\"Target $\\sum p_T * (1 - p_{PU})$ (GeV)\")" + ] + }, { "cell_type": "code", "execution_count": null, @@ -932,6 +1117,22 @@ " awkward.flatten(arrs_flat[\"Xelem\"][\"typ\"][(arrs_flat[\"ytarget\"][\"pid\"]==11) & (arrs_flat[\"ytarget\"][\"pt\"]>5)]),\n", " return_counts=True)" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d22c90b8-f5fd-4aab-9886-1677a05cf53f", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f2727e50-24db-4715-95e0-b267189e2917", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/notebooks/cms/cms-validate-root-vs-postprocessing.ipynb b/notebooks/cms/cms-validate-root-vs-postprocessing.ipynb index 1f93e09d0..0e3da93ba 100644 --- a/notebooks/cms/cms-validate-root-vs-postprocessing.ipynb +++ b/notebooks/cms/cms-validate-root-vs-postprocessing.ipynb @@ -64,8 +64,9 @@ "particle_label = \"$p_T$ > 0.5 GeV, $|\\eta|$ < 5\"\n", "\n", "default_cycler = plt.rcParams['axes.prop_cycle']\n", - "pythia_color = list(default_cycler)[0][\"color\"]\n", - "target_color = list(default_cycler)[1][\"color\"]\n", + "\n", + "pythia_color = \"#648df4\"\n", + "target_color = \"#944b8a\"\n", "\n", "pythia_linestyle = \"--\"\n", "target_linestyle = \"-\"" @@ -103,7 +104,7 @@ "outputs": [], "source": [ "#files = [pickle.load(open(fn, \"rb\")) for fn in glob.glob(\"/local/joosep/mlpf/cms/20250508_cmssw_15_0_5_d3c6d1/validation_plots/out*.pkl\")]\n", - "files = [pickle.load(open(fn, \"rb\")) for fn in glob.glob(\"../../out*.pkl\")]\n", + "files = [pickle.load(open(fn, \"rb\")) for fn in glob.glob(\"/mnt/work/particleflow/20250508_cmssw_15_0_5_d3c6d1/validation_plots/out*.pkl\")]\n", "ret = reduce(add_results, files, {})\n", "\n", "sample_keys = sorted(set([\"/\".join(k.split(\"/\")[0:2]) for k in ret.keys() if not k.startswith(\"combined\")]))\n", @@ -151,7 +152,7 @@ "for sample in sample_keys_combined:\n", " plt.figure(figsize=(8,8))\n", " ax = plt.axes()\n", - " r = mplhep.hist2dplot(ret[f\"{sample}/met_pythia_vs_target_pumask\"][bh.rebin(2), bh.rebin(2)], cmap=\"jet\", norm=matplotlib.colors.LogNorm())\n", + " r = mplhep.hist2dplot(ret[f\"{sample}/met_pythia_vs_target_pumask\"][bh.rebin(2), bh.rebin(2)], cmap=\"viridis\", norm=matplotlib.colors.LogNorm(), edgecolor='face')\n", " plt.xscale(\"log\")\n", " plt.yscale(\"log\")\n", " #cms_label(ax)\n", @@ -166,6 +167,16 @@ " plt.savefig(\"{}_particle_met_2d.pdf\".format(sample.replace(\"/\", \"_\")), bbox_inches=\"tight\")" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "44a895d1-f5f9-4f09-8134-126c34da6422", + "metadata": {}, + "outputs": [], + "source": [ + "sample_keys_combined" + ] + }, { "cell_type": "code", "execution_count": null, @@ -177,8 +188,11 @@ "#for sample in ['combined/nopu/TTbar_14TeV_TuneCUETP8M1_cfi']:\n", " f, (a0, a1) = plt.subplots(2, 1, gridspec_kw={\"height_ratios\": [3, 1]}, sharex=True)\n", " plt.sca(a0)\n", - " mplhep.histplot(ret[f\"{sample}/particles_pt_pythia\"], label=\"Pythia\", lw=2, color=pythia_color, ls=pythia_linestyle)\n", - " mplhep.histplot(ret[f\"{sample}/particles_pt_target_pumask\"], label=\"Target\", lw=2, color=target_color, ls=target_linestyle)\n", + " h0 = ret[f\"{sample}/particles_pt_pythia\"]\n", + " h1 = ret[f\"{sample}/particles_pt_target_pumask\"]\n", + " \n", + " mplhep.histplot(h0, label=\"Pythia\", lw=2, color=pythia_color, ls=pythia_linestyle)\n", + " mplhep.histplot(h1, label=\"Target\", lw=2, color=target_color, ls=target_linestyle)\n", " plt.xscale(\"log\")\n", " plt.yscale(\"log\")\n", " plt.legend(loc=(0.65, 0.7), fontsize=legend_fontsize)\n", @@ -189,11 +203,18 @@ " plt.ylabel(\"Count\")\n", "\n", " plt.sca(a1)\n", - " mplhep.histplot(ret[f\"{sample}/particles_pt_target_pumask\"]/ret[f\"{sample}/particles_pt_pythia\"], lw=2, color=target_color, ls=target_linestyle)\n", + "\n", + " ratio = h0/h0\n", + " sigma_ratio = ratio * np.sqrt(1/h0.counts() + 1.0/h0.counts())\n", + "\n", + " mplhep.histplot(h0/h0, lw=2, color=pythia_color, ls=pythia_linestyle)\n", + " mplhep.histplot(h0/h0, yerr=sigma_ratio.counts(), edgecolor=pythia_color, ls=pythia_linestyle, lw=2, histtype=\"band\", facecolor=pythia_color)\n", + " mplhep.histplot(h1/h0, lw=2, color=target_color, ls=target_linestyle)\n", " plt.ylim(0,2)\n", " plt.xlim(0.5,1000)\n", + " if sample == \"combined/pu55to75/TTbar_14TeV_TuneCUETP8M1_cfi\":\n", + " plt.xlim(0.5,400)\n", " plt.ylabel(\"Tgt. / Pythia\")\n", - " plt.axhline(1.0, color=\"black\", ls=\"--\")\n", " plt.xlabel(\"Particle \" + plot_utils.labels[\"pt\"])\n", " plt.savefig(\"{}_particles_pt.pdf\".format(sample.replace(\"/\", \"_\")), bbox_inches=\"tight\")" ] @@ -226,6 +247,16 @@ "# plt.show()" ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "9b8d22c9-9a07-424d-8da1-d4f2ab8a9c95", + "metadata": {}, + "outputs": [], + "source": [ + "sample_keys" + ] + }, { "cell_type": "code", "execution_count": null, @@ -236,10 +267,10 @@ "for sample in sample_keys:\n", " f, (a0, a1) = plt.subplots(2, 1, gridspec_kw={\"height_ratios\": [3, 1]}, sharex=True)\n", " plt.sca(a0)\n", - " mplhep.histplot(ret[f\"{sample}/jets_pt_genjet\"], label=\"Pythia\", lw=2, color=pythia_color, ls=pythia_linestyle)\n", - " # mplhep.histplot(ret[f\"{sample}/jets_pt_cand\"], label=\"PF\")\n", - " # mplhep.histplot(ret[f\"{sample}/jets_pt_target\"], label=\"Target\")\n", - " mplhep.histplot(ret[f\"{sample}/jets_pt_target_pumask\"], label=\"Target\", lw=2, color=target_color, ls=target_linestyle)\n", + " h0 = ret[f\"{sample}/jets_pt_genjet\"]\n", + " h1 = ret[f\"{sample}/jets_pt_target_pumask\"]\n", + " mplhep.histplot(h0, label=\"Pythia\", lw=2, color=pythia_color, ls=pythia_linestyle)\n", + " mplhep.histplot(h1, label=\"Target\", lw=2, color=target_color, ls=target_linestyle)\n", " plt.xscale(\"log\")\n", " plt.legend(fontsize=legend_fontsize)\n", " mplhep.cms.label(\"\", data=False, com=14, year='Run 3')\n", @@ -250,11 +281,20 @@ " plt.ylim(1,1e8)\n", "\n", " plt.sca(a1)\n", - " mplhep.histplot(ret[f\"{sample}/jets_pt_target_pumask\"]/ret[f\"{sample}/jets_pt_genjet\"], lw=2, color=target_color, ls=target_linestyle)\n", + " \n", + " ratio = h0/h0\n", + " sigma_ratio = ratio * np.sqrt(1/h0.counts() + 1.0/h0.counts())\n", + "\n", + " mplhep.histplot(h0/h0, lw=2, color=pythia_color, ls=pythia_linestyle)\n", + " mplhep.histplot(h0/h0, yerr=sigma_ratio.counts(), edgecolor=pythia_color, ls=pythia_linestyle, lw=2, histtype=\"band\", facecolor=pythia_color)\n", + " mplhep.histplot(h1/h0, lw=2, color=target_color, ls=target_linestyle)\n", " plt.ylim(0,2)\n", " plt.xlim(3,2000)\n", + " if sample == \"pu55to75/TTbar_14TeV_TuneCUETP8M1_cfi\":\n", + " plt.xlim(3,1000)\n", " plt.axhline(1.0, color=\"black\", ls=\"--\")\n", " plt.xlabel(\"Jet \" + plot_utils.labels[\"pt\"])\n", + " plt.ylabel(\"Tgt. / Pythia\")\n", " plt.savefig(\"{}_jet_pt.pdf\".format(sample.replace(\"/\", \"_\")), bbox_inches=\"tight\")\n", " plt.show()" ] @@ -339,7 +379,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.10" + "version": "3.11.13" } }, "nbformat": 4, diff --git a/notebooks/cms/cmssw-runtimes.ipynb b/notebooks/cms/cmssw-runtimes.ipynb index 0a6193d03..bcf96b49e 100644 --- a/notebooks/cms/cmssw-runtimes.ipynb +++ b/notebooks/cms/cmssw-runtimes.ipynb @@ -40,9 +40,8 @@ "jet_label_coords_single = 0.02, 0.86\n", "sample_label_coords = 0.02, 0.96\n", "\n", - "default_cycler = plt.rcParams['axes.prop_cycle']\n", - "pf_color = list(default_cycler)[1][\"color\"]\n", - "mlpf_color = list(default_cycler)[2][\"color\"]\n", + "pf_color = \"#f3a041\"\n", + "mlpf_color = \"#d23b3d\"\n", "\n", "pf_linestyle = \"-.\"\n", "mlpf_linestyle = \"-\"" @@ -134,8 +133,8 @@ "metadata": {}, "outputs": [], "source": [ - "times_pf = load_runtimes(\"/local/joosep/mlpf/results/cms/CMSSW_15_0_5_mlpf_v2.6.0pre1_p05_ccd0c7/timing_l4/log_pf_cpu*_par8.txt\")\n", - "times_mlpf = load_runtimes(\"/local/joosep/mlpf/results/cms/CMSSW_15_0_5_mlpf_v2.6.0pre1_p05_ccd0c7/timing_l4/log_mlpf_gpu*_par8.txt\")" + "times_pf = load_runtimes(\"/mnt/work/particleflow/CMSSW_15_0_5_mlpf_v2.6.0pre1_puppi_2372e2/timing_l4/log_pf_cpu*_par8.txt\")\n", + "times_mlpf = load_runtimes(\"/mnt/work/particleflow/CMSSW_15_0_5_mlpf_v2.6.0pre1_puppi_2372e2/timing_l4/log_mlpf_gpu*_par8.txt\")" ] }, { @@ -231,8 +230,8 @@ " times_joined_drop[\"PFBlockProducer\"]+times_joined_drop[\"PFProducer\"],\n", " times_joined_drop[\"MLPFProducer\"],\n", " bins=b,\n", - " norm=matplotlib.colors.LogNorm(vmin=0.1),\n", - " cmap=\"turbo\"\n", + " norm=matplotlib.colors.LogNorm(vmin=1),\n", + " cmap=\"viridis\", edgecolor=\"face\"\n", ");\n", "plt.xlabel(\"PF, $t^{CPU}_{ev}$ [s]\")\n", "plt.ylabel(\"MLPF, $t^{GPU}_{ev}$ [s]\")\n", @@ -287,7 +286,7 @@ "metadata": {}, "outputs": [], "source": [ - "df_gpu = pd.read_csv(\"/local/joosep/mlpf/results/cms/CMSSW_15_0_5_mlpf_v2.6.0pre1_p05_ccd0c7/timing_l4/gpu.log\", header=None)\n", + "df_gpu = pd.read_csv(\"/mnt/work/particleflow/CMSSW_15_0_5_mlpf_v2.6.0pre1_puppi_2372e2/timing_l4/gpu.log\", header=None)\n", "df_gpu[0] = [pd.to_datetime(x) for x in df_gpu[0]]\n", "df_gpu[5] = [float(x.split()[0]) for x in df_gpu[5]]\n", "df_gpu[4] = [float(x.split()[0]) for x in df_gpu[4]]" @@ -318,14 +317,6 @@ "a0.text(sample_label_coords[0], 0.60, \"Nvidia L4, CMSSW_15_0_5\\nnative ONNXRuntime\\n8 jobs, 8 threads per job\", fontsize=legend_fontsize, transform=a0.transAxes)\n", "plt.savefig(\"{}/gpu_util.pdf\".format(outpath), bbox_inches=\"tight\")" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "201c002b-d9d6-497f-9a5f-0de08fdf8959", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -344,7 +335,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.10" + "version": "3.11.13" } }, "nbformat": 4, diff --git a/notebooks/cms/cmssw-validation-data.ipynb b/notebooks/cms/cmssw-validation-data.ipynb index 000a50c41..741b68611 100644 --- a/notebooks/cms/cmssw-validation-data.ipynb +++ b/notebooks/cms/cmssw-validation-data.ipynb @@ -1,5 +1,15 @@ { "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "e5bed26b-c2af-48fd-b3d0-95fd72aa51f6", + "metadata": {}, + "outputs": [], + "source": [ + "!mkdir -p cmssw/JetMET0" + ] + }, { "cell_type": "code", "execution_count": null, @@ -53,8 +63,8 @@ "reco_gen_ratio = \"Rec. / Gen.\"\n", "\n", "default_cycler = plt.rcParams['axes.prop_cycle']\n", - "pf_color = list(default_cycler)[1][\"color\"]\n", - "mlpf_color = list(default_cycler)[2][\"color\"]\n", + "pf_color = \"#f3a041\"\n", + "mlpf_color = \"#d23b3d\"\n", "\n", "pf_linestyle = \"-.\"\n", "mlpf_linestyle = \"-\"\n", @@ -105,7 +115,9 @@ "\n", "import plot_utils\n", "import jet_utils\n", - "import correctionlib" + "import correctionlib\n", + "\n", + "from mlpf.plotting.utils import to_bh" ] }, { @@ -169,8 +181,8 @@ "metadata": {}, "outputs": [], "source": [ - "pf_files = glob.glob(\"/local/joosep/mlpf/results/cms/CMSSW_15_0_5_mlpf_v2.6.0pre1_puppi_2372e2/cuda_False/JetMET0_pf/step4_NANO_*.root\")\n", - "mlpf_new_files = glob.glob(\"/local/joosep/mlpf/results/cms/CMSSW_15_0_5_mlpf_v2.6.0pre1_puppi_2372e2/cuda_False/JetMET0_mlpf/step4_NANO_*.root\")\n", + "pf_files = glob.glob(\"/mnt/work/particleflow/CMSSW_15_0_5_mlpf_v2.6.0pre1_puppi_2372e2/cuda_False/JetMET0_pf/step4_NANO_*.root\")\n", + "mlpf_new_files = glob.glob(\"/mnt/work/particleflow/CMSSW_15_0_5_mlpf_v2.6.0pre1_puppi_2372e2/cuda_False/JetMET0_mlpf/step4_NANO_*.root\")\n", "\n", "pf_files_d = {os.path.basename(fn): fn for fn in pf_files}\n", "mlpf_new_files_d = {os.path.basename(fn): fn for fn in mlpf_new_files}\n", @@ -321,11 +333,12 @@ "metadata": {}, "outputs": [], "source": [ - "eta_reco_bins = [-5.191, -2.964, -1.392, 0, 1.392, 2.964, 5.191]\n", + "eta_reco_bins = [-6, -5.191, -4.0, -2.964, -1.392, 0, 1.392, 2.964, 4.0, 5.191, 6]\n", "pt_gen_bins = [10, 20, 30, 40, 50, 80, 120, 200, 500, 3000]\n", "\n", - "fi = np.load(\"../../corrections/jec_qcdpu_ak4.npz\")\n", - "reciprocal_med_pf, reciprocal_med_mlpf = fi[\"reciprocal_med_pf\"], fi[\"reciprocal_med_mlpf\"]\n", + "fi = np.load(\"../../jec_ak4.npz\")\n", + "print(fi.keys())\n", + "reciprocal_med_pf, reciprocal_med_mlpf = fi[\"corr_map_pf\"], fi[\"corr_map_mlpf\"]\n", "\n", "interp_pf = RegularGridInterpolator(\n", " (midpoints(np.array(eta_reco_bins)), midpoints(np.array(pt_gen_bins))),\n", @@ -1101,25 +1114,20 @@ "metadata": {}, "outputs": [], "source": [ - "fig = plt.figure()\n", - "ax = plt.axes()\n", + "f, (a0, a1) = plt.subplots(2, 1, gridspec_kw={\"height_ratios\": [3, 1]}, sharex=True)\n", "\n", - "bins = np.linspace(0, 500, 101)\n", + "plt.sca(a0)\n", "\n", - "plt.plot([], [])\n", - "x = plt.hist(\n", - " data_baseline[\"PFMET_pt\"][evmask_pf],\n", - " bins=bins, histtype=\"step\", label=\"PF\", ls=pf_linestyle, lw=1\n", - ");\n", + "bins = np.linspace(0, 300, 61)\n", "\n", - "plt.hist(\n", - " data_baseline[\"PuppiMET_pt\"][evmask_pf],\n", - " bins=bins, histtype=\"step\", label=\"PF-PUPPI\", ls=pf_linestyle, lw=2, color=x[2][0].get_edgecolor()\n", + "h0 = to_bh(data_baseline[\"PuppiMET_pt\"][evmask_pf], bins)\n", + "x0 = mplhep.histplot(\n", + " h0, histtype=\"step\", label=\"PF-PUPPI\", ls=pf_linestyle, lw=2, color=pf_color,\n", ");\n", "\n", - "x = plt.hist(\n", - " data_mlpf[\"PFMET_pt\"][evmask_mlpf],\n", - " bins=bins, histtype=\"step\", label=\"MLPF-PUPPI\", ls=mlpf_linestyle, lw=2\n", + "h1 = to_bh(data_mlpf[\"PuppiMET_pt\"][evmask_mlpf], bins)\n", + "x1 = mplhep.histplot(\n", + " h1, histtype=\"step\", label=\"MLPF-PUPPI\", ls=mlpf_linestyle, lw=2, color=mlpf_color,\n", ");\n", "\n", "# plt.hist(\n", @@ -1135,9 +1143,22 @@ "mplhep.cms.label(\"\", data=True, rlabel=f\"{int_lumi:.0f}\" + \" pb$^{-1}$ (13.6 TeV)\")\n", "ax.text(sample_label_coords[0], sample_label_coords[1], event_label, va=\"top\", transform=ax.transAxes, fontsize=sample_label_fontsize)\n", "plt.ylim(1, 1e5)\n", - "plt.legend(loc=\"best\", fontsize=legend_fontsize)\n", - "plt.xlabel(plot_utils.labels[\"met\"])\n", + "handles, labels = a0.get_legend_handles_labels()\n", + "handles = [x0[0].stairs, x1[0].stairs]\n", + "a0.legend(handles, labels, loc=(0.5, 0.65), fontsize=legend_fontsize)\n", "plt.ylabel(\"Counts\")\n", + "\n", + "plt.sca(a1)\n", + "ratio = h0/h0\n", + "sigma_ratio = ratio * np.sqrt(1/h0.counts() + 1.0/h0.counts())\n", + "\n", + "mplhep.histplot(h0/h0, color=pf_color, ls=pf_linestyle, lw=2)\n", + "mplhep.histplot(h0/h0, yerr=sigma_ratio.counts(), edgecolor=pf_color, ls=pf_linestyle, lw=2, histtype=\"band\", facecolor=pf_color)\n", + "mplhep.histplot(h1/h0, color=mlpf_color, ls=mlpf_linestyle, lw=2)\n", + "plt.ylim(0,2)\n", + "plt.ylabel(\"MLPF / PF\")\n", + "plt.xlim(0, 300)\n", + "plt.xlabel(plot_utils.labels[\"met\"])\n", "plt.savefig(\"cmssw/JetMET0/jetmet0_met.pdf\")" ] }, @@ -1148,33 +1169,47 @@ "metadata": {}, "outputs": [], "source": [ - "fig = plt.figure()\n", - "ax = plt.axes()\n", + "f, (a0, a1) = plt.subplots(2, 1, gridspec_kw={\"height_ratios\": [3, 1]}, sharex=True)\n", "\n", - "bins = np.linspace(0, 1500, 101)\n", + "plt.sca(a0)\n", + "bins = np.linspace(60, 1500, 61)\n", "\n", - "plt.plot([], [])\n", - "plt.hist(\n", - " lj_pt_pf,\n", - " bins=bins, histtype=\"step\", label=\"PF-PUPPI\", ls=pf_linestyle, lw=2\n", + "h0 = to_bh(lj_pt_pf, bins)\n", + "mplhep.histplot(\n", + " h0,\n", + " histtype=\"step\", label=\"PF-PUPPI\", ls=pf_linestyle, lw=2, color=pf_color\n", ");\n", "\n", - "plt.hist(\n", - " lj_pt_mlpf,\n", - " bins=bins, histtype=\"step\", label=\"MLPF-PUPPI\", ls=mlpf_linestyle, lw=2\n", + "h1 = to_bh(lj_pt_mlpf, bins)\n", + "mplhep.histplot(\n", + " h1,\n", + " histtype=\"step\", label=\"MLPF-PUPPI\", ls=mlpf_linestyle, lw=2, color=mlpf_color\n", ");\n", - "# plt.hist(\n", - "# awkward.flatten(awkward.Array(data_mlpf[0])[\"Jet_pt\"]),\n", - "# bins=np.linspace(10,100,21), histtype=\"step\", label=\"MLPF\"\n", - "# );\n", "\n", "plt.yscale(\"log\")\n", "mplhep.cms.label(\"\", data=True, rlabel=f\"{int_lumi:.0f}\" + \" pb$^{-1}$ (13.6 TeV)\")\n", "ax.text(sample_label_coords[0], sample_label_coords[1], event_label, va=\"top\", transform=ax.transAxes, fontsize=sample_label_fontsize)\n", "plt.ylim(1, 1e5)\n", - "plt.legend(loc=(0.52, 0.55), fontsize=legend_fontsize)\n", - "plt.xlabel(\"Leading jet \" + plot_utils.labels[\"pt\"])\n", + "\n", + "handles, labels = a0.get_legend_handles_labels()\n", + "handles = [x0[0].stairs, x1[0].stairs]\n", + "a0.legend(handles, labels, loc=(0.5, 0.65), fontsize=legend_fontsize)\n", + "\n", "plt.ylabel(\"Counts\")\n", + "\n", + "plt.sca(a1)\n", + "\n", + "ratio = h0/h0\n", + "sigma_ratio = ratio * np.sqrt(1/h0.counts() + 1.0/h0.counts())\n", + "\n", + "mplhep.histplot(h0/h0, color=pf_color, ls=pf_linestyle, lw=2)\n", + "mplhep.histplot(h0/h0, yerr=sigma_ratio.counts(), edgecolor=pf_color, ls=pf_linestyle, lw=2, histtype=\"band\", facecolor=pf_color)\n", + "mplhep.histplot(h1/h0, color=mlpf_color, ls=mlpf_linestyle, lw=2)\n", + "plt.ylim(0,2)\n", + "plt.ylabel(\"MLPF / PF\")\n", + "\n", + "plt.xlim(60,1500)\n", + "plt.xlabel(\"Leading jet \" + plot_utils.labels[\"pt\"])\n", "plt.savefig(\"cmssw/JetMET0/jetmet0_leading_jet_pt.pdf\")" ] }, @@ -1208,7 +1243,7 @@ "mplhep.cms.label(\"\", data=True, rlabel=f\"{int_lumi:.0f}\" + \" pb$^{-1}$ (13.6 TeV)\")\n", "ax.text(sample_label_coords[0], sample_label_coords[1], event_label, va=\"top\", transform=ax.transAxes, fontsize=sample_label_fontsize)\n", "plt.ylim(1, 1e5)\n", - "plt.legend(loc=(0.52, 0.55), fontsize=legend_fontsize)\n", + "plt.legend(loc=(0.50, 0.55), fontsize=legend_fontsize)\n", "plt.xlabel(\"Subleading jet \" + plot_utils.labels[\"pt\"])\n", "plt.ylabel(\"Counts\")\n", "plt.savefig(\"cmssw/JetMET0/jetmet0_subleading_jet_pt.pdf\")" @@ -1221,33 +1256,48 @@ "metadata": {}, "outputs": [], "source": [ - "fig = plt.figure()\n", - "ax = plt.axes()\n", + "f, (a0, a1) = plt.subplots(2, 1, gridspec_kw={\"height_ratios\": [3, 1]}, sharex=True)\n", "\n", - "bins = np.linspace(0, 5000, 101)\n", + "plt.sca(a0)\n", + "bins = np.linspace(0, 5000, 41)\n", "\n", - "plt.plot([], [])\n", - "plt.hist(\n", - " dijet_mass_pf,\n", - " bins=bins, histtype=\"step\", label=\"PF-PUPPI\", ls=pf_linestyle, lw=2\n", + "h0 = to_bh(dijet_mass_pf, bins)\n", + "h1 = to_bh(dijet_mass_mlpf, bins)\n", + "\n", + "x0 = mplhep.histplot(\n", + " h0,\n", + " histtype=\"step\", label=\"PF-PUPPI\", ls=pf_linestyle, lw=2, color=pf_color,\n", ");\n", "\n", - "plt.hist(\n", - " dijet_mass_mlpf,\n", - " bins=bins, histtype=\"step\", label=\"MLPF-PUPPI\", ls=mlpf_linestyle, lw=2\n", + "x1 = mplhep.histplot(\n", + " h1,\n", + " histtype=\"step\", label=\"MLPF-PUPPI\", ls=mlpf_linestyle, lw=2, color=mlpf_color,\n", ");\n", - "# plt.hist(\n", - "# awkward.flatten(awkward.Array(data_mlpf[0])[\"Jet_pt\"]),\n", - "# bins=np.linspace(10,100,21), histtype=\"step\", label=\"MLPF\"\n", - "# );\n", "\n", "plt.yscale(\"log\")\n", "mplhep.cms.label(\"\", data=True, rlabel=f\"{int_lumi:.0f}\" + \" pb$^{-1}$ (13.6 TeV)\")\n", "ax.text(sample_label_coords[0], sample_label_coords[1], event_label, va=\"top\", transform=ax.transAxes, fontsize=sample_label_fontsize)\n", "plt.ylim(1, 1e5)\n", - "plt.legend(loc=(0.52, 0.55), fontsize=legend_fontsize)\n", - "plt.xlabel(\"Dijet mass (GeV)\")\n", + "\n", + "handles, labels = a0.get_legend_handles_labels()\n", + "handles = [x0[0].stairs, x1[0].stairs]\n", + "a0.legend(handles, labels, loc=(0.5, 0.65), fontsize=legend_fontsize)\n", "plt.ylabel(\"Counts\")\n", + "\n", + "plt.sca(a1)\n", + "\n", + "#σR = R * √(1/N1 + 1/N2)\n", + "ratio = h0/h0\n", + "sigma_ratio = ratio * np.sqrt(1/h0.counts() + 1.0/h0.counts())\n", + "\n", + "mplhep.histplot(h0/h0, color=pf_color, ls=pf_linestyle, lw=2)\n", + "mplhep.histplot(h0/h0, yerr=sigma_ratio.counts(), edgecolor=pf_color, ls=pf_linestyle, lw=2, histtype=\"band\", facecolor=pf_color)\n", + "mplhep.histplot(h1/h0, color=mlpf_color, ls=mlpf_linestyle, lw=2)\n", + "plt.ylim(0,2)\n", + "plt.ylabel(\"MLPF / PF\")\n", + "plt.xlim(0,5000)\n", + "\n", + "plt.xlabel(\"Dijet mass (GeV)\")\n", "plt.savefig(\"cmssw/JetMET0/jetmet0_dijet_mass.pdf\")" ] }, @@ -1258,33 +1308,54 @@ "metadata": {}, "outputs": [], "source": [ - "fig = plt.figure()\n", - "ax = plt.axes()\n", + "f, (a0, a1) = plt.subplots(2, 1, gridspec_kw={\"height_ratios\": [3, 1]}, sharex=True)\n", "\n", - "bins = np.linspace(0, 1, 101)\n", + "bins = np.linspace(0, 0.6, 61)\n", "\n", - "plt.plot([], [])\n", - "plt.hist(\n", - " (lj_pt_pf - slj_pt_pf)/(lj_pt_pf + slj_pt_pf),\n", - " bins=bins, histtype=\"step\", label=\"PF-PUPPI\", ls=pf_linestyle, lw=2\n", + "plt.sca(a0)\n", + "\n", + "h0 = to_bh(((lj_pt_pf - slj_pt_pf)/(lj_pt_pf + slj_pt_pf)), bins)\n", + "x0 = mplhep.histplot(\n", + " h0, histtype=\"step\", label=\"PF-PUPPI\", ls=pf_linestyle, lw=2, color=pf_color\n", ");\n", - "plt.hist(\n", - " (lj_pt_mlpf - slj_pt_mlpf)/(lj_pt_mlpf + slj_pt_mlpf),\n", - " bins=bins, histtype=\"step\", label=\"MLPF-PUPPI\", ls=mlpf_linestyle, lw=2\n", + "\n", + "h1 = to_bh((lj_pt_mlpf - slj_pt_mlpf)/(lj_pt_mlpf + slj_pt_mlpf), bins)\n", + "x1 = mplhep.histplot(\n", + " h1, histtype=\"step\", label=\"MLPF-PUPPI\", ls=mlpf_linestyle, lw=2, color=mlpf_color\n", ");\n", - "# plt.hist(s\n", - "# awkward.flatten(awkward.Array(data_mlpf[0])[\"Jet_pt\"]),\n", - "# bins=np.linspace(10,100,21), histtype=\"step\", label=\"MLPF\"\n", - "# );\n", "\n", "mplhep.cms.label(\"\", data=True, rlabel=f\"{int_lumi:.0f}\" + \" pb$^{-1}$ (13.6 TeV)\")\n", "ax.text(sample_label_coords[0], sample_label_coords[1], event_label, va=\"top\", transform=ax.transAxes, fontsize=sample_label_fontsize)\n", - "plt.ylim(0, ax.get_ylim()[1]*1.5)\n", - "plt.legend(loc=(0.52, 0.55), fontsize=legend_fontsize)\n", - "plt.xlabel(r\"Dijet asymmetry $(p^{1}_{T}-p^{2}_{T})/(p^{1}_{T}+p^{2}_{T})$\")\n", + "plt.ylim(1, 1e4)\n", + "plt.yscale(\"log\")\n", + "plt.ylabel(\"Counts\")\n", + "handles, labels = a0.get_legend_handles_labels()\n", + "handles = [x0[0].stairs, x1[0].stairs]\n", + "a0.legend(handles, labels, loc=(0.5, 0.65), fontsize=legend_fontsize)\n", "plt.ylabel(\"Counts\")\n", + "\n", + "plt.sca(a1)\n", + "ratio = h0/h0\n", + "sigma_ratio = ratio * np.sqrt(1/h0.counts() + 1.0/h0.counts())\n", + "\n", + "mplhep.histplot(h0/h0, color=pf_color, ls=pf_linestyle, lw=2)\n", + "mplhep.histplot(h0/h0, yerr=sigma_ratio.counts(), edgecolor=pf_color, ls=pf_linestyle, lw=2, histtype=\"band\", facecolor=pf_color)\n", + "mplhep.histplot(h1/h0, color=mlpf_color, ls=mlpf_linestyle, lw=2)\n", + "plt.ylim(0,2)\n", + "plt.ylabel(\"MLPF / PF\")\n", + "\n", + "plt.xlim(0,0.6)\n", + "plt.xlabel(r\"Dijet asymmetry $(p^{1}_{T}-p^{2}_{T})/(p^{1}_{T}+p^{2}_{T})$\")\n", "plt.savefig(\"cmssw/JetMET0/jetmet0_dijet_asymmetry.pdf\")" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "3a4bf368-c491-49fd-8149-45c823d0dbed", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -1303,7 +1374,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.10" + "version": "3.11.13" } }, "nbformat": 4, diff --git a/notebooks/cms/cmssw-validation.ipynb b/notebooks/cms/cmssw-validation.ipynb index 10514e97e..3cb9202d7 100644 --- a/notebooks/cms/cmssw-validation.ipynb +++ b/notebooks/cms/cmssw-validation.ipynb @@ -46,14 +46,14 @@ }, "outputs": [], "source": [ - "folder = \"PhotonJet_PU_13p6\"\n", - "physics_process = \"cms_pf_photonjet\"\n", + "folder = \"QCD_PU_13p6\"\n", + "physics_process = \"cms_pf_qcd\"\n", "#path = \"/scratch/persistent/joosep/mlpf/results/CMSSW_15_0_5_mlpf_v2.6.0pre1_p05_ccd0c7/cuda_False/\"\n", "path1 = \"/local/joosep/mlpf/results/cms/CMSSW_15_0_5_mlpf_v2.6.0pre1_puppi_2372e2/cuda_False/\"\n", - "path2 = \"/local/joosep/mlpf/results/cms/CMSSW_15_0_5_mlpf_v2.6.0pre1_mlpfpu_499270/cuda_False/\"\n", + "path2 = \"/local/joosep/mlpf/results/cms/CMSSW_15_0_5_mlpf_v2.6.0pre1_puppi_2372e2/cuda_False/\"\n", "max_files = -1\n", "\n", - "mlpf_label = \"MLPF-PU80\"" + "mlpf_label = \"MLPF-PUPPI\"" ] }, { @@ -72,9 +72,9 @@ "jet_label_coords_single = 0.02, 0.86\n", "sample_label_coords = 0.02, 0.96\n", "\n", - "min_rj_pt = 8\n", + "min_rj_pt = 5\n", "min_fatjet_pt = 150\n", - "jet_label_ak4 = \"AK4 jets\"\n", + "jet_label_ak4 = \"AK4 jets, $p_{T}$ > \"+str(min_rj_pt)+ \" GeV\"\n", "jet_label_ak8 = \"AK8 jets, $p_{T}$ > \"+str(min_fatjet_pt)+ \" GeV\"\n", "jet_label_corr = \"Corr. jet \"\n", "jet_label_raw = \"Raw jet \"\n", @@ -258,7 +258,7 @@ "source": [ "#path = \"/local/joosep/mlpf/results/cms/CMSSW_15_0_5_mlpf_v2.5.0_p01_f8ae2f/cuda_False/\"\n", "pf_files = glob.glob(\"{}/{}_pf/step4_NANO_jme_*.root\".format(path1, folder))\n", - "mlpf_files = glob.glob(\"{}/{}_mlpfpu/step4_NANO_jme_*.root\".format(path2, folder))\n", + "mlpf_files = glob.glob(\"{}/{}_mlpf/step4_NANO_jme_*.root\".format(path2, folder))\n", "\n", "pf_files_d = {os.path.basename(fn): fn for fn in pf_files}\n", "mlpf_files_d = {os.path.basename(fn): fn for fn in mlpf_files}" @@ -287,7 +287,7 @@ }, "outputs": [], "source": [ - "common_files = list(set(pf_files_d.keys()).intersection(set(mlpf_files_d.keys())))[:10]\n", + "common_files = list(set(pf_files_d.keys()).intersection(set(mlpf_files_d.keys())))[:1000]\n", "len(common_files)" ] }, @@ -317,6 +317,7 @@ "metadata": {}, "outputs": [], "source": [ + "#if True:\n", "if not (os.path.isfile(folder + \"_pf.parquet\") and os.path.isfile(folder + \"_mlpf.parquet\")):\n", " data_baseline = load_multiprocess([pf_files_d[fn] for fn in common_files], 8)\n", " data_mlpf = load_multiprocess([mlpf_files_d[fn] for fn in common_files], 8)\n", @@ -341,10 +342,10 @@ "#load the 14 tev sample, if it exists\n", "has_14TeV = False\n", "if (folder.startswith(\"TTbar_PU\") or folder.startswith(\"QCD_PU\")):\n", - " p = \"{}/{}_pf/step4_NANO_jme_*.root\".format(path, folder.replace(\"_13p6\", \"\"))\n", + " p = \"{}/{}_pf/step4_NANO_jme_*.root\".format(path1, folder.replace(\"_13p6\", \"\"))\n", " print(p)\n", - " pf_files = glob.glob(\"{}/{}_pf/step4_NANO_jme_*.root\".format(path, folder.replace(\"_13p6\", \"\")))\n", - " mlpf_files = glob.glob(\"{}/{}_mlpfpu/step4_NANO_jme_*.root\".format(path, folder.replace(\"_13p6\", \"\")))\n", + " pf_files = glob.glob(\"{}/{}_pf/step4_NANO_jme_*.root\".format(path1, folder.replace(\"_13p6\", \"\")))\n", + " mlpf_files = glob.glob(\"{}/{}_mlpf/step4_NANO_jme_*.root\".format(path2, folder.replace(\"_13p6\", \"\")))\n", " assert(len(pf_files)>0)\n", " assert(len(mlpf_files)>0)\n", " \n", @@ -407,7 +408,21 @@ " data_mlpf_14[\"Jet_pt_raw\"] = data_mlpf_14[\"Jet_pt\"]*(1.0 - data_mlpf_14[\"Jet_rawFactor\"])\n", " \n", " data_baseline_14[\"FatJet_pt_raw\"] = data_baseline_14[\"FatJet_pt\"]*(1.0 - data_baseline_14[\"FatJet_rawFactor\"])\n", - " data_mlpf_14[\"FatJet_pt_raw\"] = data_mlpf_14[\"FatJet_pt\"]*(1.0 - data_mlpf_14[\"FatJet_rawFactor\"])" + " data_mlpf_14[\"FatJet_pt_raw\"] = data_mlpf_14[\"FatJet_pt\"]*(1.0 - data_mlpf_14[\"FatJet_rawFactor\"])\n", + "\n", + "#placeholders before corrections are calculated\n", + "data_baseline[\"Jet_pt_corr\"] = data_baseline[\"Jet_pt_raw\"] * 1\n", + "data_mlpf[\"Jet_pt_corr\"] = data_mlpf[\"Jet_pt_raw\"] * 1\n", + "\n", + "data_baseline[\"FatJet_pt_corr\"] = data_baseline[\"FatJet_pt_raw\"] * 1\n", + "data_mlpf[\"FatJet_pt_corr\"] = data_mlpf[\"FatJet_pt_raw\"] * 1\n", + "\n", + "if has_14TeV:\n", + " data_baseline_14[\"Jet_pt_corr\"] = data_baseline_14[\"Jet_pt_raw\"] * 1\n", + " data_mlpf_14[\"Jet_pt_corr\"] = data_mlpf_14[\"Jet_pt_raw\"] * 1\n", + " \n", + " data_baseline_14[\"FatJet_pt_corr\"] = data_baseline_14[\"FatJet_pt_raw\"] * 1\n", + " data_mlpf_14[\"FatJet_pt_corr\"] = data_mlpf_14[\"FatJet_pt_raw\"] * 1" ] }, { @@ -432,12 +447,12 @@ "metadata": {}, "outputs": [], "source": [ - "# Load pre-derived corrections (for now, these are not used in the responses)\n", - "corr_pf = correctionlib.CorrectionSet.from_file(\"../../corrections/pf_ak4.json\")\n", - "corr_mlpf = correctionlib.CorrectionSet.from_file(\"../../corrections/mlpf.json\")\n", + "# # Load pre-derived corrections (for now, these are not used in the responses)\n", + "# corr_pf = correctionlib.CorrectionSet.from_file(\"../../corrections/pf_ak4.json\")\n", + "# corr_mlpf = correctionlib.CorrectionSet.from_file(\"../../corrections/mlpf.json\")\n", "\n", - "corr_pf_ak8 = correctionlib.CorrectionSet.from_file(\"../../corrections/pf_ak8.json\")\n", - "corr_mlpf_ak8 = correctionlib.CorrectionSet.from_file(\"../../corrections/mlpf_ak8.json\")" + "# corr_pf_ak8 = correctionlib.CorrectionSet.from_file(\"../../corrections/pf_ak8.json\")\n", + "# corr_mlpf_ak8 = correctionlib.CorrectionSet.from_file(\"../../corrections/mlpf_ak8.json\")" ] }, { @@ -447,7 +462,7 @@ "metadata": {}, "outputs": [], "source": [ - "list(corr_pf.keys()), list(corr_pf_ak8.keys())" + "# list(corr_pf.keys()), list(corr_pf_ak8.keys())" ] }, { @@ -457,7 +472,7 @@ "metadata": {}, "outputs": [], "source": [ - "list(corr_mlpf.keys()), list(corr_mlpf_ak8.keys())" + "# list(corr_mlpf.keys()), list(corr_mlpf_ak8.keys())" ] }, { @@ -467,7 +482,7 @@ "metadata": {}, "outputs": [], "source": [ - "c = corr_pf[\"Summer22Run3_MC_L2Relative_AK4PUPPI\"]" + "# c = corr_pf[\"Summer22Run3_MC_L2Relative_AK4PUPPI\"]" ] }, { @@ -477,13 +492,13 @@ "metadata": {}, "outputs": [], "source": [ - "xs = np.linspace(0,500,100)\n", - "ys1 = [corr_pf[\"Summer22Run3_MC_L2Relative_AK4PUPPI\"].evaluate(0.0, x) for x in xs]\n", - "ys2 = [corr_mlpf[\"Summer22Run3_MC_L2Relative_AK4MLPFPU\"].evaluate(0.0, x) for x in xs]\n", - "plt.plot(xs, ys1, label=\"PF\")\n", - "plt.plot(xs, ys2, label=\"MLPF\")\n", - "plt.legend()\n", - "plt.xlabel(\"jet raw pt\")" + "# xs = np.linspace(0,500,100)\n", + "# ys1 = [corr_pf[\"Summer22Run3_MC_L2Relative_AK4PUPPI\"].evaluate(0.0, x) for x in xs]\n", + "# ys2 = [corr_mlpf[\"Summer22Run3_MC_L2Relative_AK4MLPFPU\"].evaluate(0.0, x) for x in xs]\n", + "# plt.plot(xs, ys1, label=\"PF\")\n", + "# plt.plot(xs, ys2, label=\"MLPF\")\n", + "# plt.legend()\n", + "# plt.xlabel(\"jet raw pt\")" ] }, { @@ -493,18 +508,18 @@ "metadata": {}, "outputs": [], "source": [ - "data_baseline[\"Jet_pt_corr\"] = data_baseline[\"Jet_pt_raw\"]*corr_pf[\"Summer22Run3_MC_L2Relative_AK4PUPPI\"].evaluate(data_baseline[\"Jet_eta\"], data_baseline[\"Jet_pt_raw\"])\n", - "data_mlpf[\"Jet_pt_corr\"] = data_mlpf[\"Jet_pt_raw\"]*corr_mlpf[\"Summer22Run3_MC_L2Relative_AK4MLPFPU\"].evaluate(data_mlpf[\"Jet_eta\"], data_mlpf[\"Jet_pt_raw\"])\n", + "# data_baseline[\"Jet_pt_corr\"] = data_baseline[\"Jet_pt_raw\"]*corr_pf[\"Summer22Run3_MC_L2Relative_AK4PUPPI\"].evaluate(data_baseline[\"Jet_eta\"], data_baseline[\"Jet_pt_raw\"])\n", + "# data_mlpf[\"Jet_pt_corr\"] = data_mlpf[\"Jet_pt_raw\"]*corr_mlpf[\"Summer22Run3_MC_L2Relative_AK4MLPFPU\"].evaluate(data_mlpf[\"Jet_eta\"], data_mlpf[\"Jet_pt_raw\"])\n", "\n", - "data_baseline[\"FatJet_pt_corr\"] = data_baseline[\"FatJet_pt_raw\"]*corr_pf_ak8[\"Summer22Run3_MC_L2Relative_AK8PUPPI\"].evaluate(data_baseline[\"FatJet_eta\"], data_baseline[\"FatJet_pt_raw\"])\n", - "data_mlpf[\"FatJet_pt_corr\"] = data_mlpf[\"FatJet_pt_raw\"]*corr_mlpf_ak8[\"Summer22Run3_MC_L2Relative_AK8MLPFPU\"].evaluate(data_mlpf[\"FatJet_eta\"], data_mlpf[\"FatJet_pt_raw\"])\n", + "# data_baseline[\"FatJet_pt_corr\"] = data_baseline[\"FatJet_pt_raw\"]*corr_pf_ak8[\"Summer22Run3_MC_L2Relative_AK8PUPPI\"].evaluate(data_baseline[\"FatJet_eta\"], data_baseline[\"FatJet_pt_raw\"])\n", + "# data_mlpf[\"FatJet_pt_corr\"] = data_mlpf[\"FatJet_pt_raw\"]*corr_mlpf_ak8[\"Summer22Run3_MC_L2Relative_AK8MLPFPU\"].evaluate(data_mlpf[\"FatJet_eta\"], data_mlpf[\"FatJet_pt_raw\"])\n", "\n", - "if has_14TeV:\n", - " data_baseline_14[\"Jet_pt_corr\"] = data_baseline_14[\"Jet_pt_raw\"]*corr_pf[\"Summer22Run3_MC_L2Relative_AK4PUPPI\"].evaluate(data_baseline_14[\"Jet_eta\"], data_baseline_14[\"Jet_pt_raw\"])\n", - " data_mlpf_14[\"Jet_pt_corr\"] = data_mlpf_14[\"Jet_pt_raw\"]*corr_mlpf[\"Summer22Run3_MC_L2Relative_AK4MLPFPU\"].evaluate(data_mlpf_14[\"Jet_eta\"], data_mlpf_14[\"Jet_pt_raw\"])\n", + "# if has_14TeV:\n", + "# data_baseline_14[\"Jet_pt_corr\"] = data_baseline_14[\"Jet_pt_raw\"]*corr_pf[\"Summer22Run3_MC_L2Relative_AK4PUPPI\"].evaluate(data_baseline_14[\"Jet_eta\"], data_baseline_14[\"Jet_pt_raw\"])\n", + "# data_mlpf_14[\"Jet_pt_corr\"] = data_mlpf_14[\"Jet_pt_raw\"]*corr_mlpf[\"Summer22Run3_MC_L2Relative_AK4MLPFPU\"].evaluate(data_mlpf_14[\"Jet_eta\"], data_mlpf_14[\"Jet_pt_raw\"])\n", " \n", - " data_baseline_14[\"FatJet_pt_corr\"] = data_baseline_14[\"FatJet_pt_raw\"]*corr_pf_ak8[\"Summer22Run3_MC_L2Relative_AK8PUPPI\"].evaluate(data_baseline_14[\"FatJet_eta\"], data_baseline_14[\"FatJet_pt_raw\"])\n", - " data_mlpf_14[\"FatJet_pt_corr\"] = data_mlpf_14[\"FatJet_pt_raw\"]*corr_mlpf_ak8[\"Summer22Run3_MC_L2Relative_AK8MLPFPU\"].evaluate(data_mlpf_14[\"FatJet_eta\"], data_mlpf_14[\"FatJet_pt_raw\"])" + "# data_baseline_14[\"FatJet_pt_corr\"] = data_baseline_14[\"FatJet_pt_raw\"]*corr_pf_ak8[\"Summer22Run3_MC_L2Relative_AK8PUPPI\"].evaluate(data_baseline_14[\"FatJet_eta\"], data_baseline_14[\"FatJet_pt_raw\"])\n", + "# data_mlpf_14[\"FatJet_pt_corr\"] = data_mlpf_14[\"FatJet_pt_raw\"]*corr_mlpf_ak8[\"Summer22Run3_MC_L2Relative_AK8MLPFPU\"].evaluate(data_mlpf_14[\"FatJet_eta\"], data_mlpf_14[\"FatJet_pt_raw\"])" ] }, { @@ -514,7 +529,7 @@ "metadata": {}, "outputs": [], "source": [ - "np.min(data_baseline[\"GenJet_pt\"]), np.min(data_baseline[\"Jet_pt_corr\"]), np.min(data_baseline[\"Jet_pt_raw\"])" + "# np.min(data_baseline[\"GenJet_pt\"]), np.min(data_baseline[\"Jet_pt_corr\"]), np.min(data_baseline[\"Jet_pt_raw\"])" ] }, { @@ -524,7 +539,7 @@ "metadata": {}, "outputs": [], "source": [ - "np.min(data_baseline[\"GenJetAK8_pt\"]), np.min(data_baseline[\"FatJet_pt_corr\"]), np.min(data_baseline[\"FatJet_pt_raw\"])" + "# np.min(data_baseline[\"GenJetAK8_pt\"]), np.min(data_baseline[\"FatJet_pt_corr\"]), np.min(data_baseline[\"FatJet_pt_raw\"])" ] }, { @@ -715,21 +730,14 @@ "metadata": {}, "outputs": [], "source": [ + "#Compute response, noting that the corrected response is computed using placeholder values\n", "resp_pf_ak4 = compute_response(data_baseline, jet_coll=\"Jet\", genjet_coll=\"GenJet\", deltar_cut=0.2)\n", "resp_mlpf_ak4 = compute_response(data_mlpf, jet_coll=\"Jet\", genjet_coll=\"GenJet\", deltar_cut=0.2, tag=\"mlpf\")\n", "\n", "if has_14TeV:\n", " resp_pf_ak4_14tev = compute_response(data_baseline_14, jet_coll=\"Jet\", genjet_coll=\"GenJet\", deltar_cut=0.2)\n", - " resp_mlpf_ak4_14tev = compute_response(data_mlpf_14, jet_coll=\"Jet\", genjet_coll=\"GenJet\", deltar_cut=0.2, tag=\"mlpf\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a2712c4f-f4a3-4584-adf0-5992d805ce24", - "metadata": {}, - "outputs": [], - "source": [ + " resp_mlpf_ak4_14tev = compute_response(data_mlpf_14, jet_coll=\"Jet\", genjet_coll=\"GenJet\", deltar_cut=0.2, tag=\"mlpf\")\n", + "\n", "resp_pf_ak8 = compute_response(data_baseline, jet_coll=\"FatJet\", genjet_coll=\"GenJetAK8\", deltar_cut=0.4)\n", "resp_mlpf_ak8 = compute_response(data_mlpf, jet_coll=\"FatJet\", genjet_coll=\"GenJetAK8\", deltar_cut=0.4, tag=\"mlpf\")" ] @@ -737,31 +745,31 @@ { "cell_type": "code", "execution_count": null, - "id": "165e17a5-49ea-4862-bb74-a72f73b6ad71", + "id": "f43a175d-1b47-422d-ab4f-77c798a21c5f", "metadata": {}, "outputs": [], "source": [ "f, (a0, a1) = plt.subplots(2, 1, gridspec_kw={\"height_ratios\": [3, 1]}, sharex=True)\n", "\n", - "msk_jet_gen = (\n", + "msk_jet_gen_barrel = (\n", " (data_baseline[\"GenJet_pt\"]>min_rj_pt)\n", - " #& ((np.abs(data_baseline[\"GenJet_eta\"])<3))\n", + " & (np.abs(data_baseline[\"GenJet_eta\"])<2.5)\n", ")\n", "\n", - "msk_jet_pf = (\n", + "msk_jet_pf_barrel = (\n", " (data_baseline[\"Jet_pt_raw\"]>min_rj_pt)\n", " & ((data_baseline[\"Jet_neMultiplicity\"]>1) | (np.abs(data_baseline[\"Jet_eta\"])<3))\n", - " #& ((np.abs(data_baseline[\"Jet_eta\"])<3))\n", + " & (np.abs(data_baseline[\"Jet_eta\"])<2.5)\n", ")\n", - "msk_jet_mlpf = (\n", + "msk_jet_mlpf_barrel = (\n", " (data_mlpf[\"Jet_pt_raw\"]>min_rj_pt)\n", " & ((data_mlpf[\"Jet_neMultiplicity\"]>1) | (np.abs(data_mlpf[\"Jet_eta\"])<3))\n", - " #& ((np.abs(data_mlpf[\"Jet_eta\"])<3))\n", + " & (np.abs(data_mlpf[\"Jet_eta\"])<2.5)\n", ")\n", "\n", - "h0 = to_bh(awkward.flatten(data_baseline[\"GenJet_pt\"][msk_jet_gen]), jet_bins)\n", - "h1 = to_bh(awkward.flatten(data_baseline[\"Jet_pt_raw\"][msk_jet_pf]), jet_bins)\n", - "h2 = to_bh(awkward.flatten(data_mlpf[\"Jet_pt_raw\"][msk_jet_mlpf]), jet_bins)\n", + "h0 = to_bh(awkward.flatten(data_baseline[\"GenJet_pt\"][msk_jet_gen_barrel]), jet_bins)\n", + "h1 = to_bh(awkward.flatten(data_baseline[\"Jet_pt_raw\"][msk_jet_pf_barrel]), jet_bins)\n", + "h2 = to_bh(awkward.flatten(data_mlpf[\"Jet_pt_raw\"][msk_jet_mlpf_barrel]), jet_bins)\n", "\n", "plt.sca(a0)\n", "x0 = mplhep.histplot(h0, histtype=\"step\", lw=2, label=\"Gen.\", binwnorm=1.0, ls=\"--\")\n", @@ -772,10 +780,10 @@ "plt.yscale(\"log\")\n", "cms_label(a0)\n", "sample_label(a0, physics_process, x=sample_label_coords[0], y=sample_label_coords[1], fontsize=sample_label_fontsize)\n", - "a0.text(jet_label_coords[0], jet_label_coords[1], jet_label_ak4, transform=a0.transAxes, fontsize=addtext_fontsize)\n", + "a0.text(jet_label_coords[0], jet_label_coords[1], jet_label_ak4 + \", $|\\eta|<2.5$\", transform=a0.transAxes, fontsize=addtext_fontsize)\n", "handles, labels = a0.get_legend_handles_labels()\n", "handles = [x0[0].stairs, x1[0].stairs, x2[0].stairs]\n", - "a0.legend(handles, labels, loc=(0.5, 0.5), fontsize=legend_fontsize)\n", + "a0.legend(handles, labels, loc=(0.5, 0.45), fontsize=legend_fontsize)\n", "plt.ylim(10, a0.get_ylim()[1]*1000)\n", "plt.ylabel(\"Count\")\n", "\n", @@ -791,28 +799,39 @@ "plt.xscale(\"log\")\n", "\n", "plt.xlim(min(jet_bins), max(jet_bins))\n", - "plt.savefig(\"{}/ak4_jet_pt_raw.pdf\".format(outpath))" + "plt.savefig(\"{}/ak4_eta2p5_jet_pt_raw.pdf\".format(outpath))" ] }, { "cell_type": "code", "execution_count": null, - "id": "e9e7d34c-ea0d-4e21-92ef-3da5a87ea1bc", + "id": "165e17a5-49ea-4862-bb74-a72f73b6ad71", "metadata": {}, "outputs": [], "source": [ "f, (a0, a1) = plt.subplots(2, 1, gridspec_kw={\"height_ratios\": [3, 1]}, sharex=True)\n", "\n", + "msk_jet_gen = (\n", + " (data_baseline[\"GenJet_pt\"]>min_rj_pt)\n", + ")\n", + "\n", + "msk_jet_pf = (\n", + " (data_baseline[\"Jet_pt_raw\"]>min_rj_pt)\n", + " & ((data_baseline[\"Jet_neMultiplicity\"]>1) | (np.abs(data_baseline[\"Jet_eta\"])<3))\n", + ")\n", + "msk_jet_mlpf = (\n", + " (data_mlpf[\"Jet_pt_raw\"]>min_rj_pt)\n", + " & ((data_mlpf[\"Jet_neMultiplicity\"]>1) | (np.abs(data_mlpf[\"Jet_eta\"])<3))\n", + ")\n", + "\n", "h0 = to_bh(awkward.flatten(data_baseline[\"GenJet_pt\"][msk_jet_gen]), jet_bins)\n", - "h1 = to_bh(awkward.flatten(data_baseline[\"Jet_pt_corr\"][msk_jet_pf]), jet_bins)\n", - "h2 = to_bh(awkward.flatten(data_mlpf[\"Jet_pt_corr\"][msk_jet_mlpf]), jet_bins)\n", - "#h3 = to_bh(awkward.flatten(data_mlpf_new[\"Jet_pt_raw\"]), jet_bins)\n", + "h1 = to_bh(awkward.flatten(data_baseline[\"Jet_pt_raw\"][msk_jet_pf]), jet_bins)\n", + "h2 = to_bh(awkward.flatten(data_mlpf[\"Jet_pt_raw\"][msk_jet_mlpf]), jet_bins)\n", "\n", "plt.sca(a0)\n", "x0 = mplhep.histplot(h0, histtype=\"step\", lw=2, label=\"Gen.\", binwnorm=1.0, ls=\"--\")\n", "x1 = mplhep.histplot(h1, histtype=\"step\", lw=2, label=\"PF-PUPPI\", binwnorm=1.0, ls=pf_linestyle)\n", "x2 = mplhep.histplot(h2, histtype=\"step\", lw=2, label=mlpf_label, binwnorm=1.0, ls=mlpf_linestyle)\n", - "#x3 = mplhep.histplot(h3, histtype=\"step\", lw=2, label=\"MLPF-PU p<0.1\", binwnorm=1.0, ls=\"-\")\n", "\n", "# plt.xscale(\"log\")\n", "plt.yscale(\"log\")\n", @@ -821,7 +840,7 @@ "a0.text(jet_label_coords[0], jet_label_coords[1], jet_label_ak4, transform=a0.transAxes, fontsize=addtext_fontsize)\n", "handles, labels = a0.get_legend_handles_labels()\n", "handles = [x0[0].stairs, x1[0].stairs, x2[0].stairs]\n", - "a0.legend(handles, labels, loc=(0.5, 0.5), fontsize=legend_fontsize)\n", + "a0.legend(handles, labels, loc=(0.5, 0.45), fontsize=legend_fontsize)\n", "plt.ylim(10, a0.get_ylim()[1]*1000)\n", "plt.ylabel(\"Count\")\n", "\n", @@ -832,12 +851,12 @@ "#mplhep.histplot(h3 / h0, histtype=\"step\", lw=2, ls=\"-\")\n", "plt.ylim(0.8, 1.2)\n", "plt.ylabel(reco_gen_ratio)\n", - "plt.xlabel(jet_label_corr + plot_utils.labels[\"pt_ptcl\"])\n", + "plt.xlabel(jet_label_raw + plot_utils.labels[\"pt_ptcl\"])\n", "\n", "plt.xscale(\"log\")\n", "\n", "plt.xlim(min(jet_bins), max(jet_bins))\n", - "plt.savefig(\"{}/ak4_jet_pt.pdf\".format(outpath))" + "plt.savefig(\"{}/ak4_jet_pt_raw.pdf\".format(outpath))" ] }, { @@ -884,52 +903,6 @@ "plt.savefig(\"{}/ak4_jet_eta.pdf\".format(outpath))" ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "575fa5e7-1cf3-48f7-9ecb-b7a651cec4f9", - "metadata": {}, - "outputs": [], - "source": [ - "f, (a0, a1) = plt.subplots(2, 1, gridspec_kw={\"height_ratios\": [3, 1]}, sharex=True)\n", - "\n", - "h0 = to_bh(awkward.flatten(data_baseline[\"GenJetAK8_pt\"]), fatjet_bins)\n", - "h1 = to_bh(awkward.flatten(data_baseline[\"FatJet_pt_corr\"][data_baseline[\"FatJet_pt_raw\"]>min_fatjet_pt]), fatjet_bins)\n", - "h2 = to_bh(awkward.flatten(data_mlpf[\"FatJet_pt_corr\"][data_mlpf[\"FatJet_pt_raw\"]>min_fatjet_pt]), fatjet_bins)\n", - "#h3 = to_bh(awkward.flatten(data_mlpf_new[\"FatJet_pt\"]), fatjet_bins)\n", - "\n", - "plt.sca(a0)\n", - "x0 = mplhep.histplot(h0, histtype=\"step\", lw=2, label=\"Gen.\", binwnorm=1.0, ls=\"--\")\n", - "x1 = mplhep.histplot(h1, histtype=\"step\", lw=2, label=\"PF-PUPPI\", binwnorm=1.0, ls=pf_linestyle)\n", - "x2 = mplhep.histplot(h2, histtype=\"step\", lw=2, label=mlpf_label, binwnorm=1.0, ls=mlpf_linestyle)\n", - "#x3 = mplhep.histplot(h3, histtype=\"step\", lw=2, label=\"MLPF-PU new\", binwnorm=1.0, ls=\"-\")\n", - "\n", - "# plt.xscale(\"log\")\n", - "plt.yscale(\"log\")\n", - "cms_label(a0)\n", - "sample_label(a0, physics_process, x=sample_label_coords[0], y=sample_label_coords[1], fontsize=sample_label_fontsize)\n", - "a0.text(jet_label_coords[0], jet_label_coords[1], jet_label_ak8, transform=a0.transAxes, fontsize=addtext_fontsize)\n", - "handles, labels = a0.get_legend_handles_labels()\n", - "handles = [x0[0].stairs, x1[0].stairs, x2[0].stairs]\n", - "a0.legend(handles, labels, loc=(0.5, 0.5), fontsize=legend_fontsize)\n", - "plt.ylim(1, 10**6)\n", - "plt.ylabel(\"Count\")\n", - "\n", - "plt.sca(a1)\n", - "mplhep.histplot(h0 / h0, histtype=\"step\", lw=2, ls=\"--\")\n", - "mplhep.histplot(h1 / h0, histtype=\"step\", lw=2, ls=pf_linestyle)\n", - "mplhep.histplot(h2 / h0, histtype=\"step\", lw=2, ls=mlpf_linestyle)\n", - "#mplhep.histplot(h3 / h0, histtype=\"step\", lw=2, ls=\"-\")\n", - "plt.ylim(0.8,1.2)\n", - "plt.ylabel(reco_gen_ratio)\n", - "plt.xlabel(jet_label_raw + plot_utils.labels[\"pt_ptcl\"])\n", - "\n", - "#plt.xscale(\"log\")\n", - "\n", - "plt.xlim(min(fatjet_bins), max(fatjet_bins))\n", - "plt.savefig(\"{}/ak8_jet_pt.pdf\".format(outpath))" - ] - }, { "cell_type": "code", "execution_count": null, @@ -940,8 +913,8 @@ "f, (a0, a1) = plt.subplots(2, 1, gridspec_kw={\"height_ratios\": [3, 1]}, sharex=True)\n", "\n", "h0 = to_bh(awkward.flatten(data_baseline[\"GenJetAK8_eta\"][data_baseline[\"GenJetAK8_pt\"]>min_fatjet_pt]), jet_bins_eta)\n", - "h1 = to_bh(awkward.flatten(data_baseline[\"FatJet_eta\"][data_baseline[\"FatJet_pt_raw\"]>min_rj_pt]), jet_bins_eta)\n", - "h2 = to_bh(awkward.flatten(data_mlpf[\"FatJet_eta\"][data_mlpf[\"FatJet_pt_raw\"]>min_rj_pt]), jet_bins_eta)\n", + "h1 = to_bh(awkward.flatten(data_baseline[\"FatJet_eta\"][data_baseline[\"FatJet_pt_raw\"]>min_fatjet_pt]), jet_bins_eta)\n", + "h2 = to_bh(awkward.flatten(data_mlpf[\"FatJet_eta\"][data_mlpf[\"FatJet_pt_raw\"]>min_fatjet_pt]), jet_bins_eta)\n", "#h3 = to_bh(awkward.flatten(data_mlpf_new[\"Jet_pt_raw\"]), jet_bins)\n", "\n", "plt.sca(a0)\n", @@ -1087,7 +1060,7 @@ " \n", " handles, labels = ax.get_legend_handles_labels()\n", " handles = [x0[0].stairs, x1[0].stairs]\n", - " ax.legend(handles, labels, loc=(0.50, 0.55), fontsize=20)\n", + " ax.legend(handles, labels, loc=(0.50, 0.65), fontsize=20)\n", " jl = jet_label_corr if jet_pt.endswith(\"_corr\") else jet_label_raw\n", " plt.xlabel(jl + plot_utils.labels[\"pt_response\"])\n", " plt.ylabel(\"Count\")\n", @@ -1100,17 +1073,6 @@ " return ((med_pf, np.std(jet_response_pf), len(jet_response_pf), std_pf), (med_mlpf, np.std(jet_response_mlpf), len(jet_response_mlpf), std_mlpf))" ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "547745cd-c56c-4f39-8c23-3834b24be328", - "metadata": {}, - "outputs": [], - "source": [ - "jet_response_plot(resp_pf_ak4, resp_mlpf_ak4, data_baseline, data_mlpf)\n", - "plt.savefig(\"{}/ak4_jet_pt_ratio.pdf\".format(outpath))" - ] - }, { "cell_type": "code", "execution_count": null, @@ -1229,7 +1191,6 @@ "outputs": [], "source": [ "#Get AK4 response median in bins\n", - "\n", "if folder == \"QCD_PU_13p6\":\n", " reciprocal_med_pf, reciprocal_med_mlpf = get_median_map(\n", " eta_reco_bins,\n", @@ -1461,50 +1422,233 @@ { "cell_type": "code", "execution_count": null, - "id": "42c67817-3817-4e5b-8224-97015985b47b", + "id": "6e122a8e-e63c-414c-be68-ed48a6e196ee", "metadata": {}, "outputs": [], "source": [ - "#Compute interpolated pt correction\n", "corr_pf_interp = interp_pf(np.stack([\n", - " awkward.to_numpy(awkward.flatten(resp_pf_ak4[\"Jet_eta\"])),\n", - " awkward.to_numpy(awkward.flatten(resp_pf_ak4[\"Jet_pt_raw\"]))\n", + " awkward.to_numpy(awkward.flatten(data_baseline[\"Jet_eta\"])),\n", + " awkward.to_numpy(awkward.flatten(data_baseline[\"Jet_pt_raw\"]))\n", " ]).T)\n", - "corr_pf_interp = awkward.unflatten(corr_pf_interp, awkward.count(resp_pf_ak4[\"Jet_eta\"], axis=1))\n", + "corr_pf_interp = awkward.unflatten(corr_pf_interp, awkward.count(data_baseline[\"Jet_eta\"], axis=1))\n", "\n", "corr_mlpf_interp = interp_mlpf(np.stack([\n", - " awkward.to_numpy(awkward.flatten(resp_mlpf_ak4[\"Jet_eta\"])),\n", - " awkward.to_numpy(awkward.flatten(resp_mlpf_ak4[\"Jet_pt_raw\"]))\n", + " awkward.to_numpy(awkward.flatten(data_mlpf[\"Jet_eta\"])),\n", + " awkward.to_numpy(awkward.flatten(data_mlpf[\"Jet_pt_raw\"]))\n", " ]).T)\n", - "corr_mlpf_interp = awkward.unflatten(corr_mlpf_interp, awkward.count(resp_mlpf_ak4[\"Jet_eta\"], axis=1))\n", + "corr_mlpf_interp = awkward.unflatten(corr_mlpf_interp, awkward.count(data_mlpf[\"Jet_eta\"], axis=1))\n", "\n", "\n", "corr_pf_interp_ak8 = interp_pf_ak8(np.stack([\n", - " awkward.to_numpy(awkward.flatten(resp_pf_ak8[\"FatJet_eta\"])),\n", - " awkward.to_numpy(awkward.flatten(resp_pf_ak8[\"FatJet_pt_raw\"]))\n", + " awkward.to_numpy(awkward.flatten(data_baseline[\"FatJet_eta\"])),\n", + " awkward.to_numpy(awkward.flatten(data_baseline[\"FatJet_pt_raw\"]))\n", " ]).T)\n", - "corr_pf_interp_ak8 = awkward.unflatten(corr_pf_interp_ak8, awkward.count(resp_pf_ak8[\"FatJet_eta\"], axis=1))\n", + "corr_pf_interp_ak8 = awkward.unflatten(corr_pf_interp_ak8, awkward.count(data_baseline[\"FatJet_eta\"], axis=1))\n", "\n", "corr_mlpf_interp_ak8 = interp_mlpf_ak8(np.stack([\n", - " awkward.to_numpy(awkward.flatten(resp_mlpf_ak8[\"FatJet_eta\"])),\n", - " awkward.to_numpy(awkward.flatten(resp_mlpf_ak8[\"FatJet_pt_raw\"]))\n", + " awkward.to_numpy(awkward.flatten(data_mlpf[\"FatJet_eta\"])),\n", + " awkward.to_numpy(awkward.flatten(data_mlpf[\"FatJet_pt_raw\"]))\n", " ]).T)\n", - "corr_mlpf_interp_ak8 = awkward.unflatten(corr_mlpf_interp_ak8, awkward.count(resp_mlpf_ak8[\"FatJet_eta\"], axis=1))" + "corr_mlpf_interp_ak8 = awkward.unflatten(corr_mlpf_interp_ak8, awkward.count(data_mlpf[\"FatJet_eta\"], axis=1))\n", + "\n", + "data_baseline[\"Jet_pt_corr\"] = data_baseline[\"Jet_pt_raw\"] * corr_pf_interp\n", + "data_mlpf[\"Jet_pt_corr\"] = data_mlpf[\"Jet_pt_raw\"] * corr_mlpf_interp\n", + "\n", + "data_baseline[\"FatJet_pt_corr\"] = data_baseline[\"FatJet_pt_raw\"] * corr_pf_interp_ak8\n", + "data_mlpf[\"FatJet_pt_corr\"] = data_mlpf[\"FatJet_pt_raw\"] * corr_mlpf_interp_ak8\n", + "\n", + "if has_14TeV:\n", + " corr_pf_interp = interp_pf(np.stack([\n", + " awkward.to_numpy(awkward.flatten(data_baseline_14[\"Jet_eta\"])),\n", + " awkward.to_numpy(awkward.flatten(data_baseline_14[\"Jet_pt_raw\"]))\n", + " ]).T)\n", + " corr_pf_interp = awkward.unflatten(corr_pf_interp, awkward.count(data_baseline_14[\"Jet_eta\"], axis=1))\n", + " \n", + " corr_mlpf_interp = interp_mlpf(np.stack([\n", + " awkward.to_numpy(awkward.flatten(data_mlpf_14[\"Jet_eta\"])),\n", + " awkward.to_numpy(awkward.flatten(data_mlpf_14[\"Jet_pt_raw\"]))\n", + " ]).T)\n", + " corr_mlpf_interp = awkward.unflatten(corr_mlpf_interp, awkward.count(data_mlpf_14[\"Jet_eta\"], axis=1))\n", + " \n", + " \n", + " corr_pf_interp_ak8 = interp_pf_ak8(np.stack([\n", + " awkward.to_numpy(awkward.flatten(data_baseline_14[\"FatJet_eta\"])),\n", + " awkward.to_numpy(awkward.flatten(data_baseline_14[\"FatJet_pt_raw\"]))\n", + " ]).T)\n", + " corr_pf_interp_ak8 = awkward.unflatten(corr_pf_interp_ak8, awkward.count(data_baseline_14[\"FatJet_eta\"], axis=1))\n", + " \n", + " corr_mlpf_interp_ak8 = interp_mlpf_ak8(np.stack([\n", + " awkward.to_numpy(awkward.flatten(data_mlpf_14[\"FatJet_eta\"])),\n", + " awkward.to_numpy(awkward.flatten(data_mlpf_14[\"FatJet_pt_raw\"]))\n", + " ]).T)\n", + " corr_mlpf_interp_ak8 = awkward.unflatten(corr_mlpf_interp_ak8, awkward.count(data_mlpf_14[\"FatJet_eta\"], axis=1))\n", + "\n", + " data_baseline_14[\"Jet_pt_corr\"] = data_baseline_14[\"Jet_pt_raw\"] * corr_pf_interp\n", + " data_mlpf_14[\"Jet_pt_corr\"] = data_mlpf_14[\"Jet_pt_raw\"] * corr_mlpf_interp\n", + " \n", + " data_baseline_14[\"FatJet_pt_corr\"] = data_baseline_14[\"FatJet_pt_raw\"] * corr_pf_interp_ak8\n", + " data_mlpf_14[\"FatJet_pt_corr\"] = data_mlpf_14[\"FatJet_pt_raw\"] * corr_mlpf_interp_ak8" ] }, { "cell_type": "code", "execution_count": null, - "id": "dd240722-0b11-4933-8b68-1317c5be927b", + "id": "e1eaf926-ac45-4f40-8253-554e5374c691", "metadata": {}, "outputs": [], "source": [ - "#Apply interpolated correction to compute corrected response\n", - "resp_pf_ak4[\"response_corr_interp\"] = corr_pf_interp * resp_pf_ak4[\"Jet_pt_raw\"] / resp_pf_ak4[\"GenJet_pt\"] \n", - "resp_mlpf_ak4[\"response_corr_interp\"] = corr_mlpf_interp * resp_mlpf_ak4[\"Jet_pt_raw\"] / resp_mlpf_ak4[\"GenJet_pt\"]\n", + "f, (a0, a1) = plt.subplots(2, 1, gridspec_kw={\"height_ratios\": [3, 1]}, sharex=True)\n", + "\n", + "h0 = to_bh(awkward.flatten(data_baseline[\"GenJet_pt\"][msk_jet_gen_barrel]), jet_bins)\n", + "h1 = to_bh(awkward.flatten(data_baseline[\"Jet_pt_corr\"][msk_jet_pf_barrel]), jet_bins)\n", + "h2 = to_bh(awkward.flatten(data_mlpf[\"Jet_pt_corr\"][msk_jet_mlpf_barrel]), jet_bins)\n", + "#h3 = to_bh(awkward.flatten(data_mlpf_new[\"Jet_pt_raw\"]), jet_bins)\n", + "\n", + "plt.sca(a0)\n", + "x0 = mplhep.histplot(h0, histtype=\"step\", lw=2, label=\"Gen.\", binwnorm=1.0, ls=\"--\")\n", + "x1 = mplhep.histplot(h1, histtype=\"step\", lw=2, label=\"PF-PUPPI\", binwnorm=1.0, ls=pf_linestyle)\n", + "x2 = mplhep.histplot(h2, histtype=\"step\", lw=2, label=mlpf_label, binwnorm=1.0, ls=mlpf_linestyle)\n", + "#x3 = mplhep.histplot(h3, histtype=\"step\", lw=2, label=\"MLPF-PU p<0.1\", binwnorm=1.0, ls=\"-\")\n", + "\n", + "# plt.xscale(\"log\")\n", + "plt.yscale(\"log\")\n", + "cms_label(a0)\n", + "sample_label(a0, physics_process, x=sample_label_coords[0], y=sample_label_coords[1], fontsize=sample_label_fontsize)\n", + "a0.text(jet_label_coords[0], jet_label_coords[1], jet_label_ak4 + \", $|\\eta|<2.5$\", transform=a0.transAxes, fontsize=addtext_fontsize)\n", + "handles, labels = a0.get_legend_handles_labels()\n", + "handles = [x0[0].stairs, x1[0].stairs, x2[0].stairs]\n", + "a0.legend(handles, labels, loc=(0.5, 0.45), fontsize=legend_fontsize)\n", + "plt.ylim(10, a0.get_ylim()[1]*1000)\n", + "plt.ylabel(\"Count\")\n", + "\n", + "plt.sca(a1)\n", + "mplhep.histplot(h0 / h0, histtype=\"step\", lw=2, ls=\"--\")\n", + "mplhep.histplot(h1 / h0, histtype=\"step\", lw=2, ls=pf_linestyle)\n", + "mplhep.histplot(h2 / h0, histtype=\"step\", lw=2, ls=mlpf_linestyle)\n", + "#mplhep.histplot(h3 / h0, histtype=\"step\", lw=2, ls=\"-\")\n", + "plt.ylim(0.8, 1.2)\n", + "plt.ylabel(reco_gen_ratio)\n", + "plt.xlabel(jet_label_corr + plot_utils.labels[\"pt_ptcl\"])\n", + "\n", + "plt.xscale(\"log\")\n", + "\n", + "plt.xlim(min(jet_bins), max(jet_bins))\n", + "plt.savefig(\"{}/ak4_eta2p5_jet_pt.pdf\".format(outpath))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fb990265-fb5e-4685-9cd7-7f42bb168019", + "metadata": {}, + "outputs": [], + "source": [ + "f, (a0, a1) = plt.subplots(2, 1, gridspec_kw={\"height_ratios\": [3, 1]}, sharex=True)\n", + "\n", + "h0 = to_bh(awkward.flatten(data_baseline[\"GenJet_pt\"][msk_jet_gen]), jet_bins)\n", + "h1 = to_bh(awkward.flatten(data_baseline[\"Jet_pt_corr\"][msk_jet_pf]), jet_bins)\n", + "h2 = to_bh(awkward.flatten(data_mlpf[\"Jet_pt_corr\"][msk_jet_mlpf]), jet_bins)\n", + "\n", + "plt.sca(a0)\n", + "x0 = mplhep.histplot(h0, histtype=\"step\", lw=2, label=\"Gen.\", binwnorm=1.0, ls=\"--\")\n", + "x1 = mplhep.histplot(h1, histtype=\"step\", lw=2, label=\"PF-PUPPI\", binwnorm=1.0, ls=pf_linestyle)\n", + "x2 = mplhep.histplot(h2, histtype=\"step\", lw=2, label=mlpf_label, binwnorm=1.0, ls=mlpf_linestyle)\n", + "\n", + "plt.yscale(\"log\")\n", + "cms_label(a0)\n", + "sample_label(a0, physics_process, x=sample_label_coords[0], y=sample_label_coords[1], fontsize=sample_label_fontsize)\n", + "a0.text(jet_label_coords[0], jet_label_coords[1], jet_label_ak4, transform=a0.transAxes, fontsize=addtext_fontsize)\n", + "handles, labels = a0.get_legend_handles_labels()\n", + "handles = [x0[0].stairs, x1[0].stairs, x2[0].stairs]\n", + "a0.legend(handles, labels, loc=(0.5, 0.5), fontsize=legend_fontsize)\n", + "plt.ylim(10, a0.get_ylim()[1]*1000)\n", + "plt.ylabel(\"Count\")\n", + "\n", + "plt.sca(a1)\n", + "mplhep.histplot(h0 / h0, histtype=\"step\", lw=2, ls=\"--\")\n", + "mplhep.histplot(h1 / h0, histtype=\"step\", lw=2, ls=pf_linestyle)\n", + "mplhep.histplot(h2 / h0, histtype=\"step\", lw=2, ls=mlpf_linestyle)\n", + "#mplhep.histplot(h3 / h0, histtype=\"step\", lw=2, ls=\"-\")\n", + "plt.ylim(0.8, 1.2)\n", + "plt.ylabel(reco_gen_ratio)\n", + "plt.xlabel(jet_label_corr + plot_utils.labels[\"pt_ptcl\"])\n", + "\n", + "plt.xscale(\"log\")\n", "\n", - "resp_pf_ak8[\"response_corr_interp\"] = corr_pf_interp_ak8 * resp_pf_ak8[\"FatJet_pt_raw\"] / resp_pf_ak8[\"GenJetAK8_pt\"] \n", - "resp_mlpf_ak8[\"response_corr_interp\"] = corr_mlpf_interp_ak8 * resp_mlpf_ak8[\"FatJet_pt_raw\"] / resp_mlpf_ak8[\"GenJetAK8_pt\"] " + "plt.xlim(min(jet_bins), max(jet_bins))\n", + "plt.savefig(\"{}/ak4_jet_pt.pdf\".format(outpath))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8d2d39a2-a05d-4415-aaf0-dafc6f4e299d", + "metadata": {}, + "outputs": [], + "source": [ + "f, (a0, a1) = plt.subplots(2, 1, gridspec_kw={\"height_ratios\": [3, 1]}, sharex=True)\n", + "\n", + "h0 = to_bh(awkward.flatten(data_baseline[\"GenJetAK8_pt\"]), fatjet_bins)\n", + "h1 = to_bh(awkward.flatten(data_baseline[\"FatJet_pt_corr\"][data_baseline[\"FatJet_pt_raw\"]>min_fatjet_pt]), fatjet_bins)\n", + "h2 = to_bh(awkward.flatten(data_mlpf[\"FatJet_pt_corr\"][data_mlpf[\"FatJet_pt_raw\"]>min_fatjet_pt]), fatjet_bins)\n", + "#h3 = to_bh(awkward.flatten(data_mlpf_new[\"FatJet_pt\"]), fatjet_bins)\n", + "\n", + "plt.sca(a0)\n", + "x0 = mplhep.histplot(h0, histtype=\"step\", lw=2, label=\"Gen.\", binwnorm=1.0, ls=\"--\")\n", + "x1 = mplhep.histplot(h1, histtype=\"step\", lw=2, label=\"PF-PUPPI\", binwnorm=1.0, ls=pf_linestyle)\n", + "x2 = mplhep.histplot(h2, histtype=\"step\", lw=2, label=mlpf_label, binwnorm=1.0, ls=mlpf_linestyle)\n", + "#x3 = mplhep.histplot(h3, histtype=\"step\", lw=2, label=\"MLPF-PU new\", binwnorm=1.0, ls=\"-\")\n", + "\n", + "# plt.xscale(\"log\")\n", + "plt.yscale(\"log\")\n", + "cms_label(a0)\n", + "sample_label(a0, physics_process, x=sample_label_coords[0], y=sample_label_coords[1], fontsize=sample_label_fontsize)\n", + "a0.text(jet_label_coords[0], jet_label_coords[1], jet_label_ak8, transform=a0.transAxes, fontsize=addtext_fontsize)\n", + "handles, labels = a0.get_legend_handles_labels()\n", + "handles = [x0[0].stairs, x1[0].stairs, x2[0].stairs]\n", + "a0.legend(handles, labels, loc=(0.5, 0.5), fontsize=legend_fontsize)\n", + "plt.ylim(1, 10**6)\n", + "plt.ylabel(\"Count\")\n", + "\n", + "plt.sca(a1)\n", + "mplhep.histplot(h0 / h0, histtype=\"step\", lw=2, ls=\"--\")\n", + "mplhep.histplot(h1 / h0, histtype=\"step\", lw=2, ls=pf_linestyle)\n", + "mplhep.histplot(h2 / h0, histtype=\"step\", lw=2, ls=mlpf_linestyle)\n", + "#mplhep.histplot(h3 / h0, histtype=\"step\", lw=2, ls=\"-\")\n", + "plt.ylim(0.8,1.2)\n", + "plt.ylabel(reco_gen_ratio)\n", + "plt.xlabel(jet_label_raw + plot_utils.labels[\"pt_ptcl\"])\n", + "\n", + "#plt.xscale(\"log\")\n", + "\n", + "plt.xlim(min(fatjet_bins), max(fatjet_bins))\n", + "plt.savefig(\"{}/ak8_jet_pt.pdf\".format(outpath))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4b9da529-346c-4bfc-b76d-3ebca3eea17f", + "metadata": {}, + "outputs": [], + "source": [ + "resp_pf_ak4 = compute_response(data_baseline, jet_coll=\"Jet\", genjet_coll=\"GenJet\", deltar_cut=0.2)\n", + "resp_mlpf_ak4 = compute_response(data_mlpf, jet_coll=\"Jet\", genjet_coll=\"GenJet\", deltar_cut=0.2, tag=\"mlpf\")\n", + "\n", + "if has_14TeV:\n", + " resp_pf_ak4_14tev = compute_response(data_baseline_14, jet_coll=\"Jet\", genjet_coll=\"GenJet\", deltar_cut=0.2)\n", + " resp_mlpf_ak4_14tev = compute_response(data_mlpf_14, jet_coll=\"Jet\", genjet_coll=\"GenJet\", deltar_cut=0.2, tag=\"mlpf\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "71bea78a-6eaa-4491-9aa1-53f71e56f3e6", + "metadata": {}, + "outputs": [], + "source": [ + "jet_response_plot(resp_pf_ak4, resp_mlpf_ak4, data_baseline, data_mlpf)\n", + "plt.savefig(\"{}/ak4_jet_pt_ratio.pdf\".format(outpath))" ] }, { @@ -1521,7 +1665,7 @@ " resp_mlpf_ak4,\n", " data_baseline,\n", " data_mlpf,\n", - " response=\"response_corr_interp\",\n", + " response=\"response\",\n", " jet_pt=\"Jet_pt_corr\",\n", " genjet_eta = \"Jet_eta\",\n", " genjet_min_eta=eta_reco_bins[ibin_eta],\n", @@ -1541,7 +1685,7 @@ "metadata": {}, "outputs": [], "source": [ - "jet_response_plot(resp_pf_ak4, resp_mlpf_ak4, data_baseline, data_mlpf, response=\"response_corr_interp\")" + "jet_response_plot(resp_pf_ak4, resp_mlpf_ak4, data_baseline, data_mlpf, response=\"response\")" ] }, { @@ -1610,24 +1754,6 @@ " additional_label=\", 20<$p_T$<30, 3<$|\\eta|$<5\")" ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "013ca453-596e-4c38-bba5-adf78f756f99", - "metadata": {}, - "outputs": [], - "source": [ - "jet_response_plot(\n", - " resp_pf_ak4, resp_mlpf_ak4,\n", - " data_baseline, data_mlpf,\n", - " response=\"response_corr_interp\",\n", - " genjet_min_pt=20,\n", - " genjet_max_pt=30,\n", - " genjet_min_eta=3, genjet_max_eta=5,\n", - " jet_pt=\"Jet_pt_raw\",\n", - " additional_label=\", 20<$p_T$<30, 3<$|\\eta|$<5\")" - ] - }, { "cell_type": "markdown", "id": "a499bd2a-e63f-47e9-963c-78491b24ce58", @@ -1655,7 +1781,7 @@ " additional_label=\", $N_{PV}\\in[\"+f\"{_bl},{_bh}\"+\"]$\",\n", " genjet_min_pt=pt_bins[0],\n", " genjet_max_pt=pt_bins[1],\n", - " response=\"response_corr_interp\",\n", + " response=\"response\",\n", " )\n", " stats_pu_pf.append((pt_bins, (_bl, _bh), s_pf))\n", " stats_pu_mlpf.append((pt_bins, (_bl, _bh), s_mlpf))\n", @@ -1764,6 +1890,7 @@ " label_rj_bin=\"Jet_pt_raw\",\n", " fn=\"ak4\",\n", " title=jet_label_ak4,\n", + " additional_eta_barrel_cut=False\n", " ):\n", " response_bins = np.linspace(0, 2, 100)\n", " \n", @@ -1781,13 +1908,24 @@ " eff_vals_mlpf = []\n", " purity_vals_mlpf = []\n", "\n", + " extra = \"\"\n", + "\n", " for ibin in range(len(jet_bins)-1):\n", " min_bin_val = jet_bins[ibin]\n", " max_bin_val = jet_bins[ibin+1]\n", + "\n", + " mask = (\n", + " (resp_pf[label_gj_bin]>=min_bin_val) \n", + " & (resp_pf[label_gj_bin]=min_rj_pt) \n", + " \n", + " if additional_eta_barrel_cut:\n", + " mask = mask & (np.abs(resp_pf[\"Jet_eta\"])<2.5)\n", + " extra = \"_eta2p5\"\n", " \n", - " jet_response_pf = awkward.flatten(\n", - " resp_pf[response][(resp_pf[label_gj_bin]>=min_bin_val) \n", - " & (resp_pf[label_gj_bin]=min_bin_val) \n", - " & (resp_mlpf[label_gj_bin]=min_bin_val) \n", + " & (resp_mlpf[label_gj_bin]=min_rj_pt) \n", + " if additional_eta_barrel_cut:\n", + " mask = mask & (np.abs(resp_mlpf[\"Jet_eta\"])<2.5)\n", + " \n", + " jet_response_mlpf = awkward.flatten(resp_mlpf[response][mask])\n", " norm, mean, sigma = compute_scale_res(jet_response_mlpf)\n", " mean_vals_mlpf.append(mean)\n", " sigma_vals_mlpf.append(sigma)\n", @@ -1846,7 +1992,7 @@ " plt.xlabel((jet_label_corr if response==\"response\" else jet_label_raw) + plot_utils.labels[\"pt_response\"])\n", " plt.ylabel(\"Count\")\n", "\n", - " plt.savefig(\"{}/{}_jet_response_bin_{}_{}.pdf\".format(outpath, fn, label_gj_bin, ibin))\n", + " plt.savefig(\"{}/{}_jet_response_bin_{}_{}{}.pdf\".format(outpath, fn, label_gj_bin, ibin, extra))\n", " if ibin>0:\n", " plt.clf()\n", " \n", @@ -1856,6 +2002,14 @@ " )" ] }, + { + "cell_type": "markdown", + "id": "76ee4dc8-46f8-4450-b13c-9000dd57e0b6", + "metadata": {}, + "source": [ + "## Inclusive jet response" + ] + }, { "cell_type": "code", "execution_count": null, @@ -1864,7 +2018,7 @@ "outputs": [], "source": [ "stats_pf, stats_mlpf = get_response_in_bins(\n", - " resp_pf_ak4, resp_mlpf_ak4, data_baseline, data_mlpf, response=\"response_corr_interp\",\n", + " resp_pf_ak4, resp_mlpf_ak4, data_baseline, data_mlpf, response=\"response\",\n", ")" ] }, @@ -2031,6 +2185,189 @@ "plt.savefig(\"{}/ak4_jet_purity.pdf\".format(outpath))" ] }, + { + "cell_type": "markdown", + "id": "1b1b821a-9fb2-4957-8c29-4067e560ebf9", + "metadata": {}, + "source": [ + "## Jets in barrel" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "029964a9-00ee-43b7-bdf1-d630de8e3064", + "metadata": {}, + "outputs": [], + "source": [ + "stats_pf_barrel, stats_mlpf_barrel = get_response_in_bins(\n", + " resp_pf_ak4, resp_mlpf_ak4, data_baseline, data_mlpf, response=\"response\", additional_eta_barrel_cut=True\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c9d3a15d-d025-45fe-86ea-b910075b5922", + "metadata": {}, + "outputs": [], + "source": [ + "stats_pf_raw_barrel, stats_mlpf_raw_barrel = get_response_in_bins(\n", + " resp_pf_ak4, resp_mlpf_ak4, data_baseline, data_mlpf, response=\"response_raw\", additional_eta_barrel_cut=True\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4ac8b7da-530d-4132-98bb-d20f32f716c2", + "metadata": {}, + "outputs": [], + "source": [ + "fig = plt.figure()\n", + "ax = plt.axes()\n", + "\n", + "plt.plot([], [])\n", + "l = plt.plot(midpoints(jet_bins), np.array(stats_pf_barrel[0]), marker=\"o\", label=\"PF-PUPPI\")\n", + "plt.plot(midpoints(jet_bins), np.array(stats_pf_raw_barrel[0]), color=l[0].get_color(), ls=\"--\")\n", + "l = plt.plot(midpoints(jet_bins), np.array(stats_mlpf_barrel[0]), marker=\"^\", label=mlpf_label)\n", + "plt.plot(midpoints(jet_bins), np.array(stats_mlpf_raw_barrel[0]), color=l[0].get_color(), ls=\"--\")\n", + "\n", + "if physics_process.startswith(\"cms_pf_qcd\"):\n", + " plt.xscale(\"log\")\n", + "plt.ylabel(jet_label_corr + plot_utils.labels[\"pt_response_median\"])\n", + "cms_label(ax)\n", + "sample_label(ax, physics_process, x=sample_label_coords[0], y=sample_label_coords[1], fontsize=sample_label_fontsize)\n", + "ax.text(jet_label_coords_single[0], jet_label_coords_single[1], jet_label_ak4 + \", $|\\eta|<2.5$\", transform=ax.transAxes, fontsize=addtext_fontsize)\n", + "plt.axhline(1.0, color=\"black\", ls=\"--\")\n", + "plt.ylim(0.5, 1.5)\n", + "plt.xlabel(\"Ref. jet \" + plot_utils.labels[\"pt_ptcl\"])\n", + "plt.legend(fontsize=legend_fontsize)\n", + "\n", + "handles, labels = ax.get_legend_handles_labels()\n", + "median_line = Line2D([0], [0], color='black', linestyle='-', label='MC corrected')\n", + "fit_mean_line = Line2D([0], [0], color='black', linestyle='--', label='Raw')\n", + "handles.extend([median_line, fit_mean_line])\n", + "plt.legend(loc=(0.45, 0.5), handles=handles, fontsize=legend_fontsize)\n", + "\n", + "plt.savefig(\"{}/ak4_eta2p5_jet_response_median.pdf\".format(outpath))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "63a98ff2-f25d-4dc5-98b6-845e507a0a8e", + "metadata": {}, + "outputs": [], + "source": [ + "fig = plt.figure()\n", + "ax = plt.axes()\n", + "plt.plot([], [])\n", + "\n", + "l = plt.plot(\n", + " midpoints(jet_bins),\n", + " np.array(stats_pf[1])/np.array(stats_pf_barrel[0]),\n", + " label=\"PF-PUPPI\", marker=\"o\")\n", + "\n", + "plt.plot(\n", + " midpoints(jet_bins),\n", + " np.array(stats_pf_raw[1])/np.array(stats_pf_raw_barrel[0]),\n", + " color=l[0].get_color(), ls=\"--\")\n", + "\n", + "l = plt.plot(\n", + " midpoints(jet_bins),\n", + " np.array(stats_mlpf[1])/np.array(stats_mlpf_barrel[0]),\n", + " label=mlpf_label, marker=\"^\")\n", + "\n", + "plt.plot(\n", + " midpoints(jet_bins),\n", + " np.array(stats_mlpf_raw[1])/np.array(stats_mlpf_raw_barrel[0]),\n", + " color=l[0].get_color(), ls=\"--\")\n", + "\n", + "if physics_process.startswith(\"cms_pf_qcd\"):\n", + " plt.xscale(\"log\")\n", + "cms_label(ax)\n", + "sample_label(ax, physics_process, x=sample_label_coords[0], y=sample_label_coords[1], fontsize=sample_label_fontsize)\n", + "\n", + "handles, labels = ax.get_legend_handles_labels()\n", + "median_line = Line2D([0], [0], color='black', linestyle='-', label='MC corrected')\n", + "fit_mean_line = Line2D([0], [0], color='black', linestyle='--', label='Raw')\n", + "handles.extend([median_line, fit_mean_line])\n", + "plt.legend(loc=(0.45, 0.5), handles=handles, fontsize=legend_fontsize)\n", + "\n", + "plt.ylabel(jet_label_corr + plot_utils.labels[\"pt_response_iqr_median\"])\n", + "ax.text(jet_label_coords_single[0], jet_label_coords_single[1], jet_label_ak4 + \", $|\\eta|<2.5$\", transform=ax.transAxes, fontsize=addtext_fontsize)\n", + "plt.ylim(0, 0.8)\n", + "plt.xlabel(\"Ref. jet \" + plot_utils.labels[\"pt_ptcl\"])\n", + "plt.savefig(\"{}/ak4_eta2p5_jet_response_iqr_over_median.pdf\".format(outpath))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "957fbc09-8de8-4bfb-8dad-b2dc32787e02", + "metadata": {}, + "outputs": [], + "source": [ + "fig = plt.figure()\n", + "ax = plt.axes()\n", + "plt.plot([], [])\n", + "\n", + "plt.plot(\n", + " midpoints(jet_bins),\n", + " np.array(stats_pf_barrel[2]),\n", + " label=\"PF-PUPPI\", marker=\"o\")\n", + "\n", + "plt.plot(\n", + " midpoints(jet_bins),\n", + " np.array(stats_mlpf_barrel[2]),\n", + " label=mlpf_label, marker=\"^\")\n", + "\n", + "if physics_process.startswith(\"cms_pf_qcd\"):\n", + " plt.xscale(\"log\")\n", + "cms_label(ax)\n", + "sample_label(ax, physics_process, x=sample_label_coords[0], y=sample_label_coords[1], fontsize=sample_label_fontsize)\n", + "plt.ylabel(\"Jet efficiency\")\n", + "ax.text(jet_label_coords_single[0], jet_label_coords_single[1], jet_label_ak4 + \", $|\\eta|<2.5$\", transform=ax.transAxes, fontsize=addtext_fontsize)\n", + "plt.ylim(0.0, 2.0)\n", + "plt.xlabel(\"Ref. jet \" + plot_utils.labels[\"pt_ptcl\"])\n", + "plt.legend(fontsize=legend_fontsize)\n", + "plt.savefig(\"{}/ak4_eta2p5_jet_match_frac.pdf\".format(outpath))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c4247e02-be9e-4d89-80e8-b3c3f990a500", + "metadata": {}, + "outputs": [], + "source": [ + "fig = plt.figure()\n", + "ax = plt.axes()\n", + "plt.plot([], [])\n", + "\n", + "plt.plot(\n", + " midpoints(jet_bins),\n", + " np.array(stats_pf_barrel[3]),\n", + " label=\"PF-PUPPI\", marker=\"o\")\n", + "\n", + "plt.plot(\n", + " midpoints(jet_bins),\n", + " np.array(stats_mlpf_barrel[3]),\n", + " label=mlpf_label, marker=\"^\")\n", + "\n", + "if physics_process.startswith(\"cms_pf_qcd\"):\n", + " plt.xscale(\"log\")\n", + "cms_label(ax)\n", + "sample_label(ax, physics_process, x=sample_label_coords[0], y=sample_label_coords[1], fontsize=sample_label_fontsize)\n", + "plt.legend(fontsize=legend_fontsize)\n", + "plt.ylabel(\"Jet purity\")\n", + "ax.text(jet_label_coords_single[0], jet_label_coords_single[1], jet_label_ak4 + \", $|\\eta|<2.5$\", transform=ax.transAxes, fontsize=addtext_fontsize)\n", + "plt.ylim(0.0, 1.5)\n", + "plt.xlabel(\"Jet \" + plot_utils.labels[\"pt\"])\n", + "plt.savefig(\"{}/ak4_jet_purity.pdf\".format(outpath))" + ] + }, { "cell_type": "markdown", "id": "750464d4-541a-4b6e-9fe2-03f04de2e75f", @@ -2514,7 +2851,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.10" + "version": "3.11.13" } }, "nbformat": 4, diff --git a/notebooks/cms/pu-performance.ipynb b/notebooks/cms/pu-performance.ipynb index 81099667a..67fb71084 100644 --- a/notebooks/cms/pu-performance.ipynb +++ b/notebooks/cms/pu-performance.ipynb @@ -24,16 +24,6 @@ "from plot_utils import experiment_label, sample_label, EVALUATION_DATASET_NAMES" ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "7f32d737-f053-4d8e-bfbf-5091224ef2b2", - "metadata": {}, - "outputs": [], - "source": [ - "!ls ../../experiments//pyg-cms_20250722_101813_274478/preds_checkpoint-10-3.812332/" - ] - }, { "cell_type": "code", "execution_count": null, @@ -43,7 +33,7 @@ "source": [ "which_process = 'cms_pf_ttbar'\n", "#modify path as appropriate\n", - "files = list(glob.glob('/cms/store/user/jpata/mlpf/models/pyg-cms_20250722_101813_274478//preds_checkpoint-10-3.812332/{}/*.parquet'.format(which_process)))[:100]\n", + "files = list(glob.glob('../../experiments/pyg-cms_20250722_101813_274478/orig_preds_checkpoint-10-3.812332/{}/*.parquet'.format(which_process)))[:100]\n", "arr = ak.concatenate([ak.from_parquet(file) for file in tqdm(files)])" ] }, @@ -338,6 +328,50 @@ "plt.ylabel(\"threshold @ FPR 80%\")\n", "plt.legend()" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "99d838a9-0822-4056-ad77-3c1ab075ca6f", + "metadata": {}, + "outputs": [], + "source": [ + "tgt_cls = arr[\"particles\"][\"target\"][\"cls_id\"]\n", + "tgt_msk = tgt_cls != 0\n", + "tgt_pt = arr[\"particles\"][\"target\"][\"pt\"]\n", + "tgt_eta = arr[\"particles\"][\"target\"][\"eta\"]\n", + "tgt_phi = arr[\"particles\"][\"target\"][\"phi\"]\n", + "tgt_energy = arr[\"particles\"][\"target\"][\"energy\"]\n", + "tgt_ispu = arr[\"particles\"][\"target\"][\"ispu\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "dae68b2b-a99f-403e-8b31-7beedcd11f6e", + "metadata": {}, + "outputs": [], + "source": [ + "tgt_pt[tgt_msk]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ccee267b-0c5a-44ec-9da2-7cd9fd95191e", + "metadata": {}, + "outputs": [], + "source": [ + "tgt_pt*tgt_ispu" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9381cc19-8683-47a6-bdc5-67fee406e1cb", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/notebooks/graph-crosscheck.ipynb b/notebooks/graph-crosscheck.ipynb deleted file mode 100644 index 0ae0b91b0..000000000 --- a/notebooks/graph-crosscheck.ipynb +++ /dev/null @@ -1,303 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "38a1e641-6202-4380-80f4-4f2af9daef64", - "metadata": {}, - "outputs": [], - "source": [ - "import pickle\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "44442629-2ceb-4e71-ba79-0ae13bf1e48f", - "metadata": {}, - "outputs": [], - "source": [ - "d = pickle.load(open(\"../pfntuple_700000.pkl\", \"rb\"))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "bee71d9f-5b75-448c-ad85-e7eb5ddcab42", - "metadata": {}, - "outputs": [], - "source": [ - "def compute_met(pt, phi):\n", - " px = np.sum(pt*np.cos(phi))\n", - " py = np.sum(pt*np.sin(phi))\n", - " met = np.sqrt(px**2+py**2)\n", - " return met" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "037180dd-f820-4b19-a6b1-a1d78de21fc5", - "metadata": {}, - "outputs": [], - "source": [ - "d[0][\"full_graph\"].nodes[sim[0]]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "bff17a0a-4233-4bc3-85e0-5eae36d266ee", - "metadata": {}, - "outputs": [], - "source": [ - "for ig in [100]:\n", - " g = d[ig][\"full_graph\"]\n", - " gen = [n for n in g.nodes if n[0]==\"gen\" and np.abs(g.nodes[n][\"typ\"]) not in [12,14,16] and g.nodes[n][\"status\"] in [1,2]]\n", - " sim = [n for n in g.nodes if (n[0]==\"tp\" or n[0]==\"sc\")]\n", - " pf = [n for n in g.nodes if n[0]==\"pfcand\"]\n", - " elem = [n for n in g.nodes if n[0]==\"elem\" and g.nodes[n][\"typ\"] not in [2,3,7]]\n", - "\n", - " elem_eta = np.array([g.nodes[n][\"eta\"] for n in elem])\n", - " elem_phi = np.array([g.nodes[n][\"phi\"] for n in elem])\n", - " elem_e = np.array([g.nodes[n][\"e\"] for n in elem])\n", - " elem_typ = np.array([g.nodes[n][\"typ\"] for n in elem])\n", - "\n", - " gen_eta = np.array([g.nodes[n][\"eta\"] for n in gen])\n", - " gen_phi = np.array([g.nodes[n][\"phi\"] for n in gen])\n", - " gen_pt = np.array([g.nodes[n][\"pt\"] for n in gen])\n", - " gen_pid = np.array([g.nodes[n][\"typ\"] for n in gen])\n", - " \n", - " sim_eta = np.array([g.nodes[n][\"eta\"] for n in sim])\n", - " sim_phi = np.array([g.nodes[n][\"phi\"] for n in sim])\n", - " sim_pt = np.array([g.nodes[n][\"pt\"] for n in sim])\n", - " sim_pid = np.array([g.nodes[n][\"typ\"] for n in sim])\n", - " \n", - " pf_eta = np.array([g.nodes[n][\"eta\"] for n in pf])\n", - " pf_phi = np.array([np.arctan2(g.nodes[n][\"sin_phi\"], g.nodes[n][\"cos_phi\"]) for n in pf])\n", - " pf_pt = np.array([g.nodes[n][\"pt\"] for n in pf])\n", - " pf_pid = np.array([g.nodes[n][\"typ\"] for n in pf])\n", - "\n", - " msk = np.abs(gen_eta)<5\n", - " genmet = compute_met(gen_pt[msk], gen_phi[msk])\n", - " simmet = compute_met(sim_pt, sim_phi)\n", - " pfmet = compute_met(pf_pt, pf_phi)\n", - " if (simmet - genmet)>80:\n", - " print(ig, genmet, simmet, pfmet)\n", - " continue" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5bec242b-63bc-4c14-a88d-275ce597c11a", - "metadata": {}, - "outputs": [], - "source": [ - "import pandas\n", - "\n", - "df0 = pandas.DataFrame()\n", - "df0[\"eta\"] = elem_eta\n", - "df0[\"phi\"] = elem_phi\n", - "df0[\"e\"] = elem_e\n", - "df0[\"typ\"] = elem_typ\n", - "\n", - "df1 = pandas.DataFrame()\n", - "df1[\"eta\"] = gen_eta\n", - "df1[\"phi\"] = gen_phi\n", - "df1[\"pt\"] = gen_pt\n", - "df1[\"pid\"] = gen_pid\n", - "df1[\"id\"] = gen\n", - "\n", - "df2 = pandas.DataFrame()\n", - "df2[\"eta\"] = sim_eta\n", - "df2[\"phi\"] = sim_phi\n", - "df2[\"pt\"] = sim_pt\n", - "df2[\"pid\"] = sim_pid\n", - "df2[\"id\"] = sim\n", - "\n", - "df3 = pandas.DataFrame()\n", - "df3[\"eta\"] = pf_eta\n", - "df3[\"phi\"] = pf_phi\n", - "df3[\"pt\"] = pf_pt\n", - "df3[\"pid\"] = pf_pid" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "51f5c845-dd58-467f-ac4b-fd2f3eabfebc", - "metadata": {}, - "outputs": [], - "source": [ - "etaval = 1.537387\n", - "phival = -2.255354" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d05e70a1-b08d-4b5e-a8d0-53e0f83568e7", - "metadata": {}, - "outputs": [], - "source": [ - "df0[(np.abs(df0[\"eta\"]-etaval)<0.1) & (np.abs(df0[\"phi\"]-phival)<0.1)].sort_values(by=\"e\", ascending=False)[:20]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "71d70d9c-fea3-49bd-a7ee-7edee3ae1237", - "metadata": {}, - "outputs": [], - "source": [ - "g.nodes[(\"gen\", 2)]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ac64f139-f958-47b3-baa9-9aa08a3141e0", - "metadata": {}, - "outputs": [], - "source": [ - "list(g.neighbors((\"gen\", 2225)))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7a1364f0-6031-4d6b-986c-21408c5951ed", - "metadata": {}, - "outputs": [], - "source": [ - "df1[(np.abs(df1[\"eta\"]-etaval)<0.1) & (np.abs(df1[\"phi\"]-phival)<0.1)].sort_values(by=\"pt\", ascending=False)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a19f51a6-7a34-4cac-81ae-59edbaceb635", - "metadata": {}, - "outputs": [], - "source": [ - "df2[(np.abs(df2[\"eta\"]-etaval)<0.1) & (np.abs(df2[\"phi\"]-phival)<0.1)].sort_values(by=\"pt\", ascending=False)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3718ebd9-db13-47d5-95a2-3181df939fdd", - "metadata": {}, - "outputs": [], - "source": [ - "df1.sort_values(by=\"pt\", ascending=False)[:20]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "727b4e63-b948-4c16-aa17-9085d1abc346", - "metadata": {}, - "outputs": [], - "source": [ - "df2.sort_values(by=\"pt\", ascending=False)[:10]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4ba12ecf-2c91-4049-9ece-757c10d6e23c", - "metadata": {}, - "outputs": [], - "source": [ - "g.nodes[(\"tp\", 132)]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a09fe16b-d768-45c3-8119-bd374b852f90", - "metadata": {}, - "outputs": [], - "source": [ - "g.nodes[('elem', 180)]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "c2101fee-ca52-4ef3-9614-0873931ee87a", - "metadata": {}, - "outputs": [], - "source": [ - "for n in list(g.neighbors((\"tp\", 132))):\n", - " print(n, g.edges[(\"tp\", 132), n])" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b6083815-d823-488a-8c42-02ce709b4c37", - "metadata": {}, - "outputs": [], - "source": [ - "df3.sort_values(by=\"pt\", ascending=False)[:10]" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "563a66a6-8ced-414c-8503-cdbd5d3bfecc", - "metadata": {}, - "outputs": [], - "source": [ - "plt.figure(figsize=(10,10))\n", - "plt.scatter(gen_eta, gen_phi, s=5*gen_pt)\n", - "plt.scatter(sim_eta, sim_phi, s=5*sim_pt, marker=\"s\", alpha=0.5)\n", - "plt.scatter(pf_eta, pf_phi, s=5*pf_pt, marker=\"x\", alpha=0.5)\n", - "plt.xlim(-5,5)\n", - "plt.ylim(-5,5)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "418ddd4f-b6f7-441c-aa19-c6a7ca011259", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "ffdaad22-6b0c-4e7d-a914-b47ebc5b54d3", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.14" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/notebooks/pu_vs_nopu.ipynb b/notebooks/pu_vs_nopu.ipynb deleted file mode 100644 index c0f0298f1..000000000 --- a/notebooks/pu_vs_nopu.ipynb +++ /dev/null @@ -1,460 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "ff60a49a-f645-46d5-afc2-d278390431f7", - "metadata": {}, - "outputs": [], - "source": [ - "import pickle\n", - "import numpy as np\n", - "import matplotlib.pyplot as plt\n", - "import awkward\n", - "import vector\n", - "import fastjet\n", - "import numba\n", - "import particle\n", - "import bz2\n", - "import glob" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "30d14006-4e6b-413f-bdb6-fd64038ba981", - "metadata": {}, - "outputs": [], - "source": [ - "@numba.njit\n", - "def deltaphi(phi1, phi2):\n", - " diff = phi1 - phi2\n", - " return np.arctan2(np.sin(diff), np.cos(diff))\n", - "\n", - "@numba.njit\n", - "def deltar(eta1, phi1, eta2, phi2):\n", - " deta = eta1 - eta2\n", - " dphi = deltaphi(phi1, phi2)\n", - " return np.sqrt(deta**2 + dphi**2)\n", - "\n", - "@numba.njit\n", - "def match_jets(jets1, jets2, deltaR_cut):\n", - " iev = len(jets1)\n", - " jet_inds_1_ev = []\n", - " jet_inds_2_ev = []\n", - " for ev in range(iev):\n", - " j1 = jets1[ev]\n", - " j2 = jets2[ev]\n", - "\n", - " jet_inds_1 = []\n", - " jet_inds_2 = []\n", - " for ij1 in range(len(j1)):\n", - " drs = np.zeros(len(j2), dtype=np.float64)\n", - " for ij2 in range(len(j2)):\n", - " eta1 = j1.eta[ij1]\n", - " eta2 = j2.eta[ij2]\n", - " phi1 = j1.phi[ij1]\n", - " phi2 = j2.phi[ij2]\n", - "\n", - " # Workaround for https://github.com/scikit-hep/vector/issues/303\n", - " # dr = j1[ij1].deltaR(j2[ij2])\n", - " dr = deltar(eta1, phi1, eta2, phi2)\n", - " drs[ij2] = dr\n", - " if len(drs) > 0:\n", - " min_idx_dr = np.argmin(drs)\n", - " if drs[min_idx_dr] < deltaR_cut:\n", - " jet_inds_1.append(ij1)\n", - " jet_inds_2.append(min_idx_dr)\n", - " jet_inds_1_ev.append(jet_inds_1)\n", - " jet_inds_2_ev.append(jet_inds_2)\n", - " return jet_inds_1_ev, jet_inds_2_ev\n", - "\n", - "def map_pdgid_to_candid(pdgid, charge):\n", - " if pdgid in [22, 11, 13]:\n", - " return pdgid\n", - "\n", - " # charged hadron\n", - " if abs(charge) > 0:\n", - " return 211\n", - "\n", - " # neutral hadron\n", - " return 130" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "dada0adc-9dac-41cc-9acd-1e7dfceb4860", - "metadata": {}, - "outputs": [], - "source": [ - "jetdef = fastjet.JetDefinition(fastjet.antikt_algorithm, 0.4)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d4961bee-cf9c-4a95-9343-5eefddc3ad96", - "metadata": {}, - "outputs": [], - "source": [ - "data = []\n", - "for fn in glob.glob(\"/media/joosep/data/cms/v3_3/nopu/TTbar_14TeV_TuneCUETP8M1_cfi/raw/pfntuple_*.pkl.bz2\"):\n", - " this_data = pickle.load(bz2.BZ2File(fn, \"rb\"))\n", - " # this_data = pickle.load(open(fn, \"rb\"))\n", - " data.append(this_data)\n", - "data = sum(data, [])\n", - "print(len(data))\n", - "\n", - "sample_title = \"ttbar_noPU\"\n", - "#sample_title = \"ttbar_PU\"\n", - "#sample_title = \"QCD_PU\"\n", - "#sample_title = \"SingleEle\"\n", - "#sample_title = \"SingleGamma\"\n", - "#sample_title = \"SingleNeutron\"\n", - "#sample_title = \"SinglePi0\"\n", - "#sample_title = \"SinglePiMinus\"\n", - "#sample_title = \"SingleProtonMinus\"" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "37b52e79-40ba-4f53-8dce-a3c5acaa4ae3", - "metadata": {}, - "outputs": [], - "source": [ - "def to_awk(label):\n", - " dd_mlpf = awkward.from_iter([data[i][label][data[i][label][\"typ\"]!=0][[\"typ\", \"pt\", \"eta\", \"sin_phi\", \"cos_phi\", \"e\", \"ispu\"]] for i in range(len(data))])\n", - " p4 = vector.awk(awkward.zip(\n", - " {\n", - " \"pt\": dd_mlpf[:, :, 1],\n", - " \"eta\": dd_mlpf[:, :, 2],\n", - " \"phi\": np.arctan2(dd_mlpf[:, :, 3], dd_mlpf[:, :, 4]),\n", - " \"energy\": dd_mlpf[:, :, 5],\n", - " }\n", - " ))\n", - " \n", - " other = awkward.zip({\n", - " \"type\": np.abs(dd_mlpf[:, :, 0]),\n", - " \"ispu\": np.abs(dd_mlpf[:, :, 6]),\n", - " })\n", - " return p4, other\n", - "\n", - "\n", - "def jet_to_awk(jets):\n", - " return vector.awk(\n", - " awkward.zip(\n", - " {\n", - " \"pt\": jets.pt,\n", - " \"eta\": jets.eta,\n", - " \"phi\": jets.phi,\n", - " \"energy\": jets.energy,\n", - " }\n", - " )\n", - " )" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4a3500b5-3132-4364-9738-b0a5d304ffbd", - "metadata": {}, - "outputs": [], - "source": [ - "gen_mlpf_p4, gen_mlpf = to_awk(\"ygen\")\n", - "px = awkward.sum(gen_mlpf_p4.pt*np.cos(gen_mlpf_p4.phi), axis=1)\n", - "py = awkward.sum(gen_mlpf_p4.pt*np.sin(gen_mlpf_p4.phi), axis=1)\n", - "gen_mlpf_met = np.sqrt(px**2 + py**2)\n", - "\n", - "px = awkward.sum((gen_mlpf_p4.pt*np.cos(gen_mlpf_p4.phi))[gen_mlpf[\"ispu\"]<1], axis=1)\n", - "py = awkward.sum((gen_mlpf_p4.pt*np.sin(gen_mlpf_p4.phi))[gen_mlpf[\"ispu\"]<1], axis=1)\n", - "gen_mlpf_met_nopu = np.sqrt(px**2 + py**2)\n", - "\n", - "cluster = fastjet.ClusterSequence(gen_mlpf_p4.to_xyzt(), jetdef)\n", - "gen_mlpf_jets = jet_to_awk(cluster.inclusive_jets(min_pt=10.0))\n", - "\n", - "cluster = fastjet.ClusterSequence(gen_mlpf_p4.to_xyzt()[gen_mlpf[\"ispu\"]<1], jetdef)\n", - "gen_mlpf_jets_nopu = jet_to_awk(cluster.inclusive_jets(min_pt=10.0))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "368fbc6b-6127-4aee-93b4-f87ee6983202", - "metadata": {}, - "outputs": [], - "source": [ - "plt.figure(figsize=(5,5))\n", - "plt.hist(awkward.flatten(gen_mlpf[\"ispu\"]), bins=np.linspace(0,1,100));\n", - "plt.yscale('log')\n", - "plt.xlabel(\"MLPF truth ispu\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "90d54cba-47d4-4b06-b348-8dab897bb776", - "metadata": {}, - "outputs": [], - "source": [ - "cand_pf_p4, cand_pf = to_awk(\"ycand\")\n", - "px = awkward.sum(cand_pf_p4.pt*np.cos(cand_pf_p4.phi), axis=1)\n", - "py = awkward.sum(cand_pf_p4.pt*np.sin(cand_pf_p4.phi), axis=1)\n", - "cand_pf_met = np.sqrt(px**2 + py**2)\n", - "\n", - "cluster = fastjet.ClusterSequence(cand_pf_p4.to_xyzt(), jetdef)\n", - "cand_pf_jets = jet_to_awk(cluster.inclusive_jets(min_pt=10.0))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "53c02ed4-0e52-48db-ab26-26b25e9e37e5", - "metadata": {}, - "outputs": [], - "source": [ - "dd_gen = awkward.from_iter([data[i][\"pythia\"] for i in range(len(data))])\n", - "gen_pythia_p4 = vector.awk(awkward.zip({\"pt\": dd_gen[:, :, 1], \"eta\": dd_gen[:, :, 2], \"phi\": dd_gen[:, :, 3], \"energy\": dd_gen[:, :, 4]}))\n", - " \n", - "gen_pythia = awkward.zip({\"type\": np.abs(dd_gen[:, :, 0])})\n", - "msk = (gen_pythia[\"type\"]!=12) & (gen_pythia[\"type\"]!=14) & (gen_pythia[\"type\"]!=16)# & (np.abs(gen_pythia_p4.eta)<5)\n", - "\n", - "gen_pythia_p4 = gen_pythia_p4[msk]\n", - "gen_pythia_p4_abseta5 = gen_pythia_p4[(np.abs(gen_pythia_p4.eta)<5) & (gen_pythia_p4.pt>1)]\n", - "gen_pythia = gen_pythia[msk]\n", - "\n", - "all_pdgs = []\n", - "for ev in gen_pythia[\"type\"]:\n", - " pdgs = [particle.PDGID(p) for p in ev]\n", - " pdgs = [map_pdgid_to_candid(int(p), p.charge) for p in pdgs]\n", - " all_pdgs.append(pdgs)\n", - "gen_pythia = awkward.zip({\"type\": all_pdgs})\n", - "\n", - "px = awkward.sum(gen_pythia_p4.pt*np.cos(gen_pythia_p4.phi), axis=1)\n", - "py = awkward.sum(gen_pythia_p4.pt*np.sin(gen_pythia_p4.phi), axis=1)\n", - "gen_pythia_met = np.sqrt(px**2 + py**2)\n", - "\n", - "gen_cmssw_met = np.array([data[i][\"genmet\"][0,0] for i in range(len(data))])\n", - "\n", - "cluster = fastjet.ClusterSequence(gen_pythia_p4.to_xyzt(), jetdef)\n", - "gen_pythia_jets = jet_to_awk(cluster.inclusive_jets(min_pt=10.0))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "08e55e35-49a8-4965-a619-8406e3391c25", - "metadata": {}, - "outputs": [], - "source": [ - "gen_cmssw_jet = awkward.from_iter([data[i][\"genjet\"] for i in range(len(data))])\n", - "\n", - "gen_cmssw_jet = gen_cmssw_jet[gen_cmssw_jet[:, :, 0]>10]\n", - "gen_cmssw_jet = vector.awk(awkward.zip(\n", - " {\n", - " \"pt\": gen_cmssw_jet[:, :, 0],\n", - " \"eta\": gen_cmssw_jet[:, :, 1],\n", - " \"phi\": gen_cmssw_jet[:, :, 2],\n", - " \"energy\": gen_cmssw_jet[:, :, 3],\n", - " }\n", - "))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d0bf5d1e-3cf6-46f5-b9d1-f6e3087790ae", - "metadata": {}, - "outputs": [], - "source": [ - "plt.figure(figsize=(5,5))\n", - "plt.scatter(gen_cmssw_met, gen_pythia_met)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "4a79fafe-8b70-41d5-9479-d9dcfd0e9c44", - "metadata": {}, - "outputs": [], - "source": [ - "plt.figure(figsize=(5,5))\n", - "b = np.logspace(-1, 3, 101)\n", - "plt.hist(gen_cmssw_met, bins=b, histtype=\"step\", lw=1, label=\"CMSSW genMetTrue\");\n", - "plt.hist(gen_pythia_met, bins=b, histtype=\"step\", lw=1, label=\"Pythia\");\n", - "plt.hist(gen_mlpf_met, bins=b, histtype=\"step\", lw=1, label=\"MLPF truth\");\n", - "plt.hist(gen_mlpf_met_nopu, bins=b, histtype=\"step\", lw=1, label=\"MLPF truth, no PU\");\n", - "plt.hist(cand_pf_met, bins=b, histtype=\"step\", lw=1, label=\"PF reco\");\n", - "plt.yscale(\"log\")\n", - "plt.xscale(\"log\")\n", - "plt.legend()\n", - "plt.xlabel(\"MET\")\n", - "plt.title(sample_title)\n", - "plt.savefig(sample_title + \"_met.pdf\")\n", - "plt.savefig(sample_title + \"_met.png\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "361f9dec-7ceb-4d6a-943b-c94c80d4d523", - "metadata": {}, - "outputs": [], - "source": [ - "plt.figure(figsize=(5,5))\n", - "b = np.linspace(0, 200, 101)\n", - "plt.hist(gen_cmssw_met, bins=b, histtype=\"step\", lw=1, label=\"CMSSW genMetTrue\");\n", - "plt.hist(gen_pythia_met, bins=b, histtype=\"step\", lw=1, label=\"Pythia\");\n", - "plt.hist(gen_mlpf_met, bins=b, histtype=\"step\", lw=1, label=\"MLPF truth\");\n", - "plt.hist(gen_mlpf_met_nopu, bins=b, histtype=\"step\", lw=1, label=\"MLPF truth, no PU\");\n", - "plt.hist(cand_pf_met, bins=b, histtype=\"step\", lw=1, label=\"PF reco\");\n", - "#plt.yscale(\"log\")\n", - "#plt.xscale(\"log\")\n", - "plt.legend()\n", - "plt.xlabel(\"MET\")\n", - "plt.title(sample_title)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5d9017ed-1184-432e-bc39-d61a23a6b9d6", - "metadata": {}, - "outputs": [], - "source": [ - "plt.figure(figsize=(5,5))\n", - "plt.scatter(gen_cmssw_met, gen_mlpf_met, label=\"MLPF truth\", marker=\".\", alpha=0.5)\n", - "plt.scatter(gen_cmssw_met, gen_mlpf_met_nopu, label=\"MLPF truth, no PU\", marker=\".\", alpha=0.5)\n", - "plt.xlabel(\"genMetTrue\")\n", - "plt.ylabel(\"MLPF truth MET\")\n", - "plt.legend(loc=\"best\")\n", - "plt.title(sample_title)\n", - "plt.savefig(sample_title + \"_met_corr.pdf\")\n", - "plt.savefig(sample_title + \"_met_corr.png\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "d4d80ecf-5aa7-4fcd-9bb8-725ec67a7d71", - "metadata": {}, - "outputs": [], - "source": [ - "plt.figure(figsize=(5,5))\n", - "b = np.logspace(-1,1,100)\n", - "plt.plot([], [])\n", - "msk = gen_cmssw_met>5\n", - "plt.hist((gen_pythia_met/gen_cmssw_met)[msk], bins=b, histtype=\"step\", lw=1, label=\"Pythia\");\n", - "plt.hist((gen_mlpf_met/gen_cmssw_met)[msk], bins=b, histtype=\"step\", lw=1, label=\"MLPF truth\");\n", - "plt.hist((gen_mlpf_met_nopu/gen_cmssw_met)[msk], bins=b, histtype=\"step\", lw=1, label=\"MLPF truth, no PU\");\n", - "plt.hist((cand_pf_met/gen_cmssw_met)[msk], bins=b, histtype=\"step\", lw=1, label=\"CMSSW, reco PF\");\n", - "plt.legend()\n", - "plt.yscale(\"log\")\n", - "plt.xscale(\"log\")\n", - "plt.xlabel(\"MET / CMSSW genMetTrue\")\n", - "plt.title(sample_title + \", genMetTrue>5\")\n", - "plt.savefig(sample_title + \"_met_ratio.pdf\")\n", - "plt.savefig(sample_title + \"_met_ratio.png\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e5739f7a-a986-43ed-bae8-4ea33afef4dc", - "metadata": {}, - "outputs": [], - "source": [ - "plt.figure(figsize=(5,5))\n", - "b = np.linspace(0,200,100)\n", - "plt.hist(awkward.flatten(gen_cmssw_jet.pt), bins=b, histtype=\"step\", lw=1, label=\"CMSSW\");\n", - "plt.hist(awkward.flatten(gen_pythia_jets.pt), bins=b, histtype=\"step\", lw=1, label=\"Pythia\");\n", - "plt.hist(awkward.flatten(gen_mlpf_jets.pt), bins=b, histtype=\"step\", lw=1, label=\"MLPF truth\");\n", - "plt.hist(awkward.flatten(gen_mlpf_jets_nopu.pt), bins=b, histtype=\"step\", lw=1, label=\"MLPF truth, no PU\");\n", - "plt.hist(awkward.flatten(cand_pf_jets.pt), bins=b, histtype=\"step\", lw=1, label=\"CMSSW, reco PF\");\n", - "plt.xlabel(\"jet pt\")\n", - "plt.legend()\n", - "plt.yscale(\"log\")\n", - "plt.title(sample_title)\n", - "plt.savefig(sample_title + \"_jet_pt.pdf\")\n", - "plt.savefig(sample_title + \"_jet_pt.png\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "74cc44cc-6e81-44ce-9cad-1d4872ab55c5", - "metadata": {}, - "outputs": [], - "source": [ - "plt.figure(figsize=(5,5))\n", - "\n", - "b = np.linspace(0,4,100)\n", - "\n", - "plt.plot([], [])\n", - "\n", - "idx1, idx2 = match_jets(gen_cmssw_jet, gen_pythia_jets, 0.01)\n", - "plt.hist(awkward.flatten(gen_pythia_jets[idx2].pt/gen_cmssw_jet[idx1].pt), bins=b, label=\"Pythia\", histtype=\"step\", lw=1);\n", - "\n", - "idx1, idx2 = match_jets(gen_cmssw_jet, gen_mlpf_jets, 0.01)\n", - "plt.hist(awkward.flatten(gen_mlpf_jets[idx2].pt/gen_cmssw_jet[idx1].pt), bins=b, label=\"MLPF truth\", histtype=\"step\", lw=1);\n", - "\n", - "idx1, idx2 = match_jets(gen_cmssw_jet, gen_mlpf_jets_nopu, 0.01)\n", - "plt.hist(awkward.flatten(gen_mlpf_jets_nopu[idx2].pt/gen_cmssw_jet[idx1].pt), bins=b, label=\"MLPF truth, no PU\", histtype=\"step\", lw=1);\n", - "\n", - "idx1, idx2 = match_jets(gen_cmssw_jet, cand_pf_jets, 0.01)\n", - "plt.hist(awkward.flatten(cand_pf_jets[idx2].pt/gen_cmssw_jet[idx1].pt), bins=b, label=\"PF reco\", histtype=\"step\", lw=1);\n", - "\n", - "plt.legend()\n", - "plt.yscale(\"log\")\n", - "plt.xlabel(\"jet pt / CMSSW genjet pt\")\n", - "plt.title(sample_title)\n", - "plt.savefig(sample_title + \"_jet_pt_ratio.pdf\")\n", - "plt.savefig(sample_title + \"_jet_pt_ratio.png\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a421d388-5ce3-491e-a3b6-947f1d6fda86", - "metadata": {}, - "outputs": [], - "source": [ - "iev = 4\n", - "plt.figure(figsize=(10, 10))\n", - "msk = gen_mlpf[\"ispu\"][iev]==0\n", - "plt.scatter(\n", - " gen_mlpf_p4[iev].eta, gen_mlpf_p4[iev].phi, s=10*gen_mlpf_p4[iev].pt, alpha=np.clip(1e-1+1.0-gen_mlpf[\"ispu\"][iev], 0, 1)\n", - ")\n", - "\n", - "plt.scatter(\n", - " gen_pythia_p4[iev].eta, gen_pythia_p4[iev].phi, s=10*gen_pythia_p4[iev].pt,\n", - " marker=\"x\"\n", - ")\n", - "plt.xlim(-7,7)\n", - "plt.ylim(-4,4)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.14" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/parameters/pytorch/pyg-clic.yaml b/parameters/pytorch/pyg-clic.yaml index b0afcaeec..aef775b07 100644 --- a/parameters/pytorch/pyg-clic.yaml +++ b/parameters/pytorch/pyg-clic.yaml @@ -65,6 +65,7 @@ model: attention_type: flash use_pre_layernorm: True +optimizer: adamw lr_schedule_config: onecycle: pct_start: 0.3 diff --git a/parameters/pytorch/pyg-cms-small.yaml b/parameters/pytorch/pyg-cms-small.yaml new file mode 100644 index 000000000..a6bbbeb27 --- /dev/null +++ b/parameters/pytorch/pyg-cms-small.yaml @@ -0,0 +1,131 @@ +train: yes +test: yes +make_plots: no +comet: yes +dataset: cms +sort_data: no +data_dir: +gpus: 1 +gpu_batch_multiplier: 1 +load: +finetune: +num_steps: 100000 +patience: 10 +val_freq: 20000 +checkpoint_freq: 1000 +lr: 0.0004 +lr_schedule: cosinedecay # constant, cosinedecay, onecycle +conv_type: attention +ntrain: +ntest: 1000 +nvalid: 10000 +num_workers: 0 +prefetch_factor: +comet_name: particleflow-pt +comet_offline: False +comet_step_freq: 10 +dtype: bfloat16 +pad_to_multiple: 256 + +model: + trainable: all + + learned_representation_mode: last #last, concat + input_encoding: split #split, joint + pt_mode: direct-elemtype-split + eta_mode: linear + sin_phi_mode: linear + cos_phi_mode: linear + energy_mode: direct-elemtype-split + + + gnn_lsh: + conv_type: gnn_lsh + embedding_dim: 512 + width: 512 + num_convs: 8 + dropout_ff: 0.0 + activation: "elu" + # gnn-lsh specific parameters + bin_size: 320 + max_num_bins: 200 + distance_dim: 128 + layernorm: True + num_node_messages: 2 + ffn_dist_hidden_dim: 128 + ffn_dist_num_layers: 2 + + attention: + conv_type: attention + num_convs: 3 + dropout_ff: 0.0 + dropout_conv_id_mha: 0.0 + dropout_conv_id_ff: 0.0 + dropout_conv_reg_mha: 0.0 + dropout_conv_reg_ff: 0.0 + activation: "elu" + head_dim: 16 + num_heads: 16 + attention_type: flash + use_pre_layernorm: True + +optimizer: adamw +lr_schedule_config: + onecycle: + pct_start: 0.3 + +raytune: + local_dir: # Note: please specify an absolute path + sched: asha # asha, hyperband + search_alg: bohb # bayes, bohb, hyperopt, nevergrad, scikit + default_metric: "step/cms_pf_qcd/jet_ratio/jet_ratio_target_to_pred_pt/combined" + default_mode: "min" + # Tune schedule specific parameters + asha: + max_t: 200 + reduction_factor: 4 + brackets: 1 + grace_period: 10 + hyperband: + max_t: 200 + reduction_factor: 4 + hyperopt: + n_random_steps: 10 + nevergrad: + n_random_steps: 10 + +train_dataset: + cms: + physical_pu: + batch_size: 2 + samples: + cms_pf_qcd: + version: 2.7.1 + splits: [1] + physical_nopu: + batch_size: 32 + samples: + cms_pf_qcd_nopu: + version: 2.7.1 + splits: [1] + +valid_dataset: + cms: + physical_pu: + batch_size: 2 + samples: + cms_pf_qcd: + version: 2.7.1 + splits: [1] + physical_nopu: + batch_size: 32 + samples: + cms_pf_qcd_nopu: + version: 2.7.1 + splits: [1] + +test_dataset: + cms_pf_qcd_nopu: + batch_size: 32 + version: 2.7.1 + splits: [1] diff --git a/parameters/pytorch/pyg-cms.yaml b/parameters/pytorch/pyg-cms.yaml index 7b95187d1..2e71e04dd 100644 --- a/parameters/pytorch/pyg-cms.yaml +++ b/parameters/pytorch/pyg-cms.yaml @@ -1,30 +1,30 @@ train: yes test: yes -make_plots: yes +make_plots: no comet: yes dataset: cms -sort_data: yes +sort_data: no data_dir: gpus: 1 gpu_batch_multiplier: 1 load: finetune: -num_epochs: 10 -patience: 20 -lr: 0.0002 +num_steps: 100000 +patience: 10 +val_freq: 20000 +checkpoint_freq: 1000 +lr: 0.0004 lr_schedule: cosinedecay # constant, cosinedecay, onecycle conv_type: attention ntrain: -ntest: -nvalid: +ntest: 5000 +nvalid: 10000 num_workers: 0 prefetch_factor: -checkpoint_freq: 1 comet_name: particleflow-pt comet_offline: False comet_step_freq: 10 dtype: bfloat16 -val_freq: # run an extra validation run every val_freq training steps pad_to_multiple: 256 model: @@ -65,12 +65,13 @@ model: dropout_conv_id_ff: 0.0 dropout_conv_reg_mha: 0.0 dropout_conv_reg_ff: 0.0 - activation: "relu" + activation: "elu" head_dim: 16 num_heads: 16 attention_type: flash use_pre_layernorm: True +optimizer: adamw lr_schedule_config: onecycle: pct_start: 0.3 @@ -78,8 +79,8 @@ lr_schedule_config: raytune: local_dir: # Note: please specify an absolute path sched: asha # asha, hyperband - search_alg: hyperopt # bayes, bohb, hyperopt, nevergrad, scikit - default_metric: "val_loss" + search_alg: bohb # bayes, bohb, hyperopt, nevergrad, scikit + default_metric: "step/cms_pf_qcd/jet_ratio/jet_ratio_target_to_pred_pt/combined" default_mode: "min" # Tune schedule specific parameters asha: @@ -98,76 +99,79 @@ raytune: train_dataset: cms: physical_pu: - batch_size: 1 + batch_size: 2 samples: cms_pf_ttbar: - version: 2.7.1 + version: 2.8.0 splits: [1,2,3,4,5,6,7,8,9,10] cms_pf_qcd: - version: 2.7.1 + version: 2.8.0 splits: [1,2,3,4,5,6,7,8,9,10] cms_pf_ztt: - version: 2.7.1 + version: 2.8.0 splits: [1,2,3,4,5,6,7,8,9,10] physical_nopu: - batch_size: 16 + batch_size: 32 samples: cms_pf_ttbar_nopu: - version: 2.7.1 + version: 2.8.0 splits: [1,2,3,4,5,6,7,8,9,10] cms_pf_qcd_nopu: - version: 2.7.1 - splits: [1,2,3,4,5,6,7,8,9,10] + version: 2.8.0 + splits: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40] cms_pf_ztt_nopu: - version: 2.7.1 + version: 2.8.0 splits: [1,2,3,4,5,6,7,8,9,10] valid_dataset: cms: physical_pu: - batch_size: 1 + batch_size: 2 samples: cms_pf_ttbar: - version: 2.7.1 + version: 2.8.0 splits: [1,2,3,4,5,6,7,8,9,10] cms_pf_qcd: - version: 2.7.1 + version: 2.8.0 splits: [1,2,3,4,5,6,7,8,9,10] cms_pf_ztt: - version: 2.7.1 + version: 2.8.0 splits: [1,2,3,4,5,6,7,8,9,10] physical_nopu: - batch_size: 16 + batch_size: 32 samples: cms_pf_ttbar_nopu: - version: 2.7.1 + version: 2.8.0 splits: [1,2,3,4,5,6,7,8,9,10] cms_pf_qcd_nopu: - version: 2.7.1 - splits: [1,2,3,4,5,6,7,8,9,10] + version: 2.8.0 + splits: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40] cms_pf_ztt_nopu: - version: 2.7.1 + version: 2.8.0 splits: [1,2,3,4,5,6,7,8,9,10] test_dataset: cms_pf_ttbar: - version: 2.7.1 + batch_size: 1 + version: 2.8.0 splits: [1,2,3,4,5,6,7,8,9,10] cms_pf_qcd: - version: 2.7.1 + batch_size: 1 + version: 2.8.0 splits: [1,2,3,4,5,6,7,8,9,10] -# cms_pf_qcd13p6: -# version: 2.7.1 -# splits: [1,2,3,4,5,6,7,8,9,10] cms_pf_ztt: - version: 2.7.1 + batch_size: 1 + version: 2.8.0 splits: [1,2,3,4,5,6,7,8,9,10] cms_pf_ttbar_nopu: - version: 2.7.1 + batch_size: 32 + version: 2.8.0 splits: [1,2,3,4,5,6,7,8,9,10] cms_pf_qcd_nopu: - version: 2.7.1 - splits: [1,2,3,4,5,6,7,8,9,10] + batch_size: 32 + version: 2.8.0 + splits: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40] cms_pf_ztt_nopu: - version: 2.7.1 + batch_size: 32 + version: 2.8.0 splits: [1,2,3,4,5,6,7,8,9,10] diff --git a/requirements.txt b/requirements.txt index c415b3866..21d20293d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -26,6 +26,7 @@ plotly pre-commit protobuf pyarrow +pytest ray[tune] scikit-learn scikit-optimize @@ -34,7 +35,6 @@ seaborn setGPU tensorflow tensorflow-datasets -tf2onnx torch torch_runstats torchaudio diff --git a/scripts/cmssw/validation_job.sh b/scripts/cmssw/validation_job.sh index 6f5b1a8f5..2c1f5a7b2 100755 --- a/scripts/cmssw/validation_job.sh +++ b/scripts/cmssw/validation_job.sh @@ -17,7 +17,7 @@ if [ $SITE == "T2_EE_Estonia" ]; then cd /scratch/persistent/joosep/CMSSW_15_0_5 eval `scram runtime -sh` cd $PREVDIR - export OUTDIR=/local/$USER/mlpf/results/cms/${CMSSW_VERSION}_mlpf_v2.6.0pre1_puppi_2372e2/ + export OUTDIR=/local/$USER/mlpf/results/cms/${CMSSW_VERSION}_mlpf_v2.6.0pre1_puppi_117d32/ export WORKDIR=/scratch/local/$USER/${SLURM_JOB_ID} fi @@ -88,7 +88,7 @@ mkdir -p $OUTDIR/cuda_${USE_CUDA}/${SAMPLE}_${JOBTYPE} #cp step4_NANO_btv.root $OUTDIR/cuda_${USE_CUDA}/${SAMPLE}_${JOBTYPE}/step4_NANO_btv_${NJOB}.root cp step4_NANO_jme.root $OUTDIR/cuda_${USE_CUDA}/${SAMPLE}_${JOBTYPE}/step4_NANO_jme_${NJOB}.root -#python3 ~/particleflow/mlpf/plotting/cms_fwlite.py step3_inMINIAODSIM.root step3_inMINIAODSIM.pkl -#cp step3_inMINIAODSIM.pkl $OUTDIR/cuda_${USE_CUDA}/${SAMPLE}_${JOBTYPE}/step3_MINI_${NJOB}.pkl +python3 ~/particleflow/mlpf/plotting/cms_fwlite.py step3_inMINIAODSIM.root step3_inMINIAODSIM.pkl +cp step3_inMINIAODSIM.pkl $OUTDIR/cuda_${USE_CUDA}/${SAMPLE}_${JOBTYPE}/step3_MINI_${NJOB}.pkl rm -Rf $WORKDIR diff --git a/scripts/joosep-desktop/cms-plots.sh b/scripts/joosep-desktop/cms-plots.sh new file mode 100755 index 000000000..72d71b7af --- /dev/null +++ b/scripts/joosep-desktop/cms-plots.sh @@ -0,0 +1,240 @@ +#!/bin/bash + +export PYTHONPATH=`pwd` +export QT_QPA_PLATFORM=offscreen +IMG=~/HEP-KBFI/singularity/pytorch.simg\:2025-09-01 +NANO_PATH=/mnt/work/particleflow/CMSSW_15_0_5_mlpf_v2.6.0pre1_puppi_117d32/cuda_False + +singularity exec -B /mnt/work/ $IMG \ + python3 mlpf/plotting/data_preparation.py \ + --input-dir $NANO_PATH \ + --sample QCD_PU & + +singularity exec -B /mnt/work/ $IMG \ + python3 mlpf/plotting/data_preparation.py \ + --input-dir $NANO_PATH \ + --sample QCD_PU_13p6 & + +singularity exec -B /mnt/work/ $IMG \ + python3 mlpf/plotting/data_preparation.py \ + --input-dir $NANO_PATH \ + --sample QCD_PU_13p6_v3 & + +# singularity exec -B /mnt/work/ $IMG \ +# python3 mlpf/plotting/data_preparation.py \ +# --input-dir $NANO_PATH \ +# --sample TTbar_PU & + +# singularity exec -B /mnt/work/ $IMG \ +# python3 mlpf/plotting/data_preparation.py \ +# --input-dir $NANO_PATH \ +# --sample TTbar_PU_13p6 & + +# singularity exec -B /mnt/work/ $IMG \ +# python3 mlpf/plotting/data_preparation.py \ +# --input-dir $NANO_PATH \ +# --sample QCD_noPU_13p6 & + +# singularity exec -B /mnt/work/ $IMG \ +# python3 mlpf/plotting/data_preparation.py \ +# --input-dir $NANO_PATH \ +# --sample TTbar_noPU_13p6 & + +# singularity exec -B /mnt/work/ $IMG \ +# python3 mlpf/plotting/data_preparation.py \ +# --input-dir $NANO_PATH \ +# --sample PhotonJet_PU_13p6 & + +# singularity exec -B /mnt/work/ $IMG \ +# python3 mlpf/plotting/data_preparation.py \ +# --input-dir $NANO_PATH \ +# --sample PhotonJet_noPU_13p6 & + +wait + + +# Exctract jet corrections + +sample=QCD_PU +singularity exec -B /mnt/work/ $IMG \ + python3 mlpf/plotting/corrections.py \ + --input-pf-parquet ${sample}_pf.parquet \ + --input-mlpf-parquet ${sample}_mlpf.parquet \ + --corrections-file jec_ak4_${sample}.npz \ + --output-dir ./plots/${sample}/ak4/jec \ + --jet-type ak4 \ + --sample-name ${sample} & + +sample=QCD_PU_13p6 +singularity exec -B /mnt/work/ $IMG \ + python3 mlpf/plotting/corrections.py \ + --input-pf-parquet ${sample}_pf.parquet \ + --input-mlpf-parquet ${sample}_mlpf.parquet \ + --corrections-file jec_ak4_${sample}.npz \ + --output-dir ./plots/${sample}/ak4/jec \ + --jet-type ak4 \ + --sample-name ${sample} & + +sample=QCD_PU_13p6_v3 +singularity exec -B /mnt/work/ $IMG \ + python3 mlpf/plotting/corrections.py \ + --input-pf-parquet ${sample}_pf.parquet \ + --input-mlpf-parquet ${sample}_mlpf.parquet \ + --corrections-file jec_ak4_${sample}.npz \ + --output-dir ./plots/${sample}/ak4/jec \ + --jet-type ak4 \ + --sample-name ${sample} & + +# singularity exec -B /mnt/work/ $IMG \ +# python3 mlpf/plotting/corrections.py \ +# --input-pf-parquet ${sample}_pf.parquet \ +# --input-mlpf-parquet ${sample}_mlpf.parquet \ +# --corrections-file jec_ak8.npz \ +# --output-dir ./plots/${sample}/ak8/jec \ +# --jet-type ak8 \ +# --sample-name ${sample} & +wait + +sample=QCD_PU +singularity exec -B /mnt/work/ $IMG \ + python3 mlpf/plotting/plot_validation.py \ + --input-pf-parquet ${sample}_pf.parquet \ + --input-mlpf-parquet ${sample}_mlpf.parquet \ + --corrections-file jec_ak4_${sample}.npz \ + --output-dir ./plots \ + --jet-type ak4 \ + --sample-name ${sample} \ + --fiducial-cuts eta_0_2p5 \ + --tev 14 & + +singularity exec -B /mnt/work/ $IMG \ + python3 mlpf/plotting/plot_met_validation.py \ + --input-pf-parquet ${sample}_pf.parquet \ + --input-mlpf-parquet ${sample}_mlpf.parquet \ + --sample-name ${sample} \ + --output-dir ./plots \ + --tev 14 & +wait + +#Do jet-level plots +# for sample in QCD_noPU_13p6 QCD_PU_13p6 TTbar_PU_13p6 TTbar_noPU_13p6 PhotonJet_noPU_13p6 PhotonJet_PU_13p6; do +for sample in QCD_PU_13p6 QCD_PU_13p6_v3; do + # singularity exec -B /mnt/work/ $IMG \ + # python3 mlpf/plotting/plot_validation.py \ + # --input-pf-parquet ${sample}_pf.parquet \ + # --input-mlpf-parquet ${sample}_mlpf.parquet \ + # --corrections-file jec_ak4.npz \ + # --output-dir ./plots \ + # --jet-type ak4 \ + # --sample-name ${sample} \ + # --fiducial-cuts inclusive & + + singularity exec -B /mnt/work/ $IMG \ + python3 mlpf/plotting/plot_validation.py \ + --input-pf-parquet ${sample}_pf.parquet \ + --input-mlpf-parquet ${sample}_mlpf.parquet \ + --corrections-file jec_ak4_${sample}.npz \ + --output-dir ./plots \ + --jet-type ak4 \ + --sample-name ${sample} \ + --fiducial-cuts eta_0_2p5 \ + --tev 13.6 & + + # singularity exec -B /mnt/work/ $IMG \ + # python3 mlpf/plotting/plot_validation.py \ + # --input-pf-parquet ${sample}_pf.parquet \ + # --input-mlpf-parquet ${sample}_mlpf.parquet \ + # --corrections-file jec_ak4.npz \ + # --output-dir ./plots \ + # --jet-type ak4 \ + # --sample-name ${sample} \ + # --fiducial-cuts eta_2p5_3 & + + # singularity exec -B /mnt/work/ $IMG \ + # python3 mlpf/plotting/plot_validation.py \ + # --input-pf-parquet ${sample}_pf.parquet \ + # --input-mlpf-parquet ${sample}_mlpf.parquet \ + # --corrections-file jec_ak4.npz \ + # --output-dir ./plots \ + # --jet-type ak4 \ + # --sample-name ${sample} \ + # --fiducial-cuts eta_3_5 & + + # singularity exec -B /mnt/work/ $IMG \ + # python3 mlpf/plotting/plot_validation.py \ + # --input-pf-parquet ${sample}_pf.parquet \ + # --input-mlpf-parquet ${sample}_mlpf.parquet \ + # --corrections-file jec_ak8.npz \ + # --output-dir ./plots \ + # --jet-type ak8 \ + # --sample-name ${sample} \ + # --fiducial-cuts inclusive & + + singularity exec -B /mnt/work/ $IMG \ + python3 mlpf/plotting/plot_met_validation.py \ + --input-pf-parquet ${sample}_pf.parquet \ + --input-mlpf-parquet ${sample}_mlpf.parquet \ + --sample-name ${sample} \ + --output-dir ./plots \ + --tev 13.6 & + +wait +done + +# #Do the 14 TeV to 13.6 TeV comparison +# for sample in QCD_PU_13p6 TTbar_PU_13p6; do +# singularity exec -B /mnt/work $IMG \ +# python mlpf/plotting/plot_jet_response_comparison_v1.py \ +# --input-pf-parquet ${sample}_pf.parquet \ +# --input-mlpf-parquet ${sample}_mlpf.parquet \ +# --output-dir ./plots \ +# --sample-name $sample \ +# --jet-type ak4 \ +# --tev 13.6 & +# done +# wait + +# for sample in QCD_PU; do +# singularity exec -B /mnt/work $IMG \ +# python mlpf/plotting/plot_jet_response_comparison_v1.py \ +# --input-pf-parquet ${sample}_pf.parquet \ +# --input-mlpf-parquet ${sample}_mlpf.parquet \ +# --output-dir ./plots \ +# --sample-name $sample \ +# --jet-type ak4 \ +# --tev 14 & + +# singularity exec -B /mnt/work $IMG \ +# python mlpf/plotting/plot_jet_response_comparison_v1.py \ +# --input-pf-parquet ${sample}_13p6_pf.parquet \ +# --input-mlpf-parquet ${sample}_13p6_mlpf.parquet \ +# --output-dir ./plots \ +# --sample-name ${sample}_13p6 \ +# --jet-type ak4 \ +# --tev 13.6 & + +# singularity exec -B /mnt/work $IMG \ +# python mlpf/plotting/plot_jet_response_comparison_v1.py \ +# --input-pf-parquet ${sample}_13p6_v2_pf.parquet \ +# --input-mlpf-parquet ${sample}_13p6_v2_mlpf.parquet \ +# --output-dir ./plots \ +# --sample-name ${sample}_13p6_v2 \ +# --jet-type ak4 \ +# --tev 13.6 & +# done +# wait + +# for sample in QCD_PU; do +# singularity exec -B /mnt/work $IMG \ +# python mlpf/plotting/plot_jet_response_comparison_v2.py \ +# --input-sample1-pf-parquet ${sample}_13p6_pf.parquet \ +# --input-sample1-mlpf-parquet ${sample}_13p6_mlpf.parquet \ +# --input-sample2-pf-parquet ${sample}_13p6_v2_pf.parquet \ +# --input-sample2-mlpf-parquet ${sample}_13p6_v2_mlpf.parquet \ +# --output-dir ./plots \ +# --sample-name $sample \ +# --sample1-label paper \ +# --sample2-label onlyCOM \ +# --jet-type ak4 & +# done +# wait diff --git a/scripts/local_test_torch.sh b/scripts/local_test_torch.sh index 69d180438..f27d13c56 100755 --- a/scripts/local_test_torch.sh +++ b/scripts/local_test_torch.sh @@ -5,6 +5,14 @@ export PWD=`pwd` export PYTHONPATH=`pwd` export KERAS_BACKEND=torch +# Quick unit tests +python -m pytest tests/test_dataloader.py +python -m pytest tests/test_dataloader_behavior.py +python -m pytest tests/test_endless_interleaved_iterator.py +python -m pytest tests/test_resumable_sampler.py +python -m pytest tests/test_interleaved_iterator.py +python -m pytest tests/test_lr_schedule.py + #create data directories rm -Rf local_test_data/TTbar_14TeV_TuneCUETP8M1_cfi mkdir -p local_test_data/TTbar_14TeV_TuneCUETP8M1_cfi/root @@ -22,8 +30,7 @@ mkdir -p local_test_data/TTbar_14TeV_TuneCUETP8M1_cfi/raw for file in `\ls -1 local_test_data/TTbar_14TeV_TuneCUETP8M1_cfi/root/*.root`; do python mlpf/data/cms/postprocessing2.py \ --input $file \ - --outpath local_test_data/TTbar_14TeV_TuneCUETP8M1_cfi/raw \ - --num-events 10 + --outpath local_test_data/TTbar_14TeV_TuneCUETP8M1_cfi/raw done #create the tensorflow dataset for the last split config only @@ -40,8 +47,8 @@ python mlpf/pipeline.py \ --prefix MLPF_test_ \ --pipeline \ train \ - --num-epochs 2 \ - --nvalid 1 \ + --num-steps 2 \ + --checkpoint-freq 2 \ --gpus 0 \ --make-plots \ --conv-type attention \ @@ -49,33 +56,14 @@ python mlpf/pipeline.py \ --attention-type math \ --num-convs 1 +ls experiments/MLPF_test_*/checkpoints/* + # Capture the experiment directory created by the first run for the next steps export EXP_DIR=$(ls -d experiments/MLPF_test_*/) # -------------------------------------------------------------------------------------------- -# Test 2: Resume training from the previous epoch in the SAME directory -# --experiment-dir is specified to ensure it writes to the same directory. -# -------------------------------------------------------------------------------------------- -python mlpf/pipeline.py \ - --config parameters/pytorch/pyg-cms.yaml \ - --data-dir ./tensorflow_datasets/ \ - --experiment-dir ${EXP_DIR} \ - --pipeline \ - train \ - --num-epochs 3 \ - --nvalid 1 \ - --gpus 0 \ - --make-plots \ - --conv-type attention \ - --dtype float32 \ - --attention-type math \ - --num-convs 1 \ - --load ${EXP_DIR}/checkpoints/checkpoint-02-*.pth - -# -------------------------------------------------------------------------------------------- -# Test 3: Fine-tuning from a checkpoint in a NEW directory +# Test 2: Fine-tuning from a checkpoint in a NEW directory # --experiment-dir is omitted, so a new one is created. -# --start-epoch 1 resets the epoch counter for the new run. # -------------------------------------------------------------------------------------------- python mlpf/pipeline.py \ --config parameters/pytorch/pyg-cms.yaml \ @@ -83,33 +71,32 @@ python mlpf/pipeline.py \ --prefix MLPF_test_ \ --pipeline \ train \ - --num-epochs 3 \ - --nvalid 1 \ + --num-steps 4 \ + --checkpoint-freq 2 \ --gpus 0 \ --make-plots \ --conv-type attention \ --dtype float32 \ --attention-type math \ --num-convs 1 \ - --load ${EXP_DIR}/checkpoints/checkpoint-02-*.pth \ - --start-epoch 1 + --load ${EXP_DIR}/checkpoints/checkpoint-02.pth -ls -lrt experiments/*/checkpoints/* +ls experiments/MLPF_test_*/checkpoints/* -# # -------------------------------------------------------------------------------------------- -# # Test 4: Ray Train training using the 'ray-train' sub-command -# # -------------------------------------------------------------------------------------------- -python mlpf/pipeline.py \ - --config parameters/pytorch/pyg-cms.yaml \ - --data-dir ${PWD}/tensorflow_datasets/ \ - --experiments-dir ${PWD}/experiments \ - --prefix MLPF_test_ \ - --pipeline \ - ray-train \ - --num-epochs 2 \ - --ray-cpus 2 \ - --ray-local \ - --conv-type attention \ - --dtype float32 \ - --attention-type math \ - --num-convs 1 +## -------------------------------------------------------------------------------------------- +## Test 3: Ray Train training using the 'ray-train' sub-command +## -------------------------------------------------------------------------------------------- +#python mlpf/pipeline.py \ +# --config parameters/pytorch/pyg-cms.yaml \ +# --data-dir ${PWD}/tensorflow_datasets/ \ +# --experiments-dir ${PWD}/experiments \ +# --prefix MLPF_test_ \ +# --pipeline \ +# ray-train \ +# --num-steps 4 \ +# --ray-cpus 2 \ +# --ray-local \ +# --conv-type attention \ +# --dtype float32 \ +# --attention-type math \ +# --num-convs 1 diff --git a/scripts/lumi/pytorch-cms-8.sh b/scripts/lumi/pytorch-cms-8.sh index 6420c1f18..1788e1186 100755 --- a/scripts/lumi/pytorch-cms-8.sh +++ b/scripts/lumi/pytorch-cms-8.sh @@ -5,7 +5,7 @@ #SBATCH --nodes=1 #SBATCH --ntasks-per-node=1 #SBATCH --cpus-per-task=32 -#SBATCH --mem=400G +#SBATCH --mem=450G #SBATCH --gpus-per-task=8 #SBATCH --partition=standard-g #SBATCH --no-requeue @@ -23,13 +23,13 @@ export MIOPEN_USER_DB_PATH=/tmp/${USER}-${SLURM_JOB_ID}-miopen-cache export MIOPEN_CUSTOM_CACHE_DIR=${MIOPEN_USER_DB_PATH} export ROCM_PATH=/opt/rocm export KERAS_BACKEND=torch -export NCCL_SOCKET_IFNAME=hsn0,hsn1,hsn2,hsn3 -export NCCL_NET_GDR_LEVEL=PHB -export NCCL_DEBUG=INFO +export NCCL_SOCKET_IFNAME=hsn +export NCCL_NET_GDR_LEVEL=3 +export NCCL_DEBUG=DEBUG export PYTHONPATH=`pwd` env singularity exec \ -B /scratch/project_465001293 \ -B /tmp \ - $IMG ./scripts/lumi/train.sh + $IMG $1 diff --git a/scripts/lumi/train.sh b/scripts/lumi/train.sh index 5e354bc6d..1ec19429d 100755 --- a/scripts/lumi/train.sh +++ b/scripts/lumi/train.sh @@ -9,13 +9,13 @@ python3 mlpf/pipeline.py \ --config parameters/pytorch/pyg-cms.yaml \ train \ --gpus 8 \ - --gpu-batch-multiplier 16 \ - --num-workers 8 \ - --prefetch-factor 10 \ - --checkpoint-freq 1 \ + --gpu-batch-multiplier 4 \ + --num-workers 1 \ + --prefetch-factor 1 \ --conv-type attention \ --dtype bfloat16 \ - --optimizer lamb \ - --lr 0.005 \ - --ntest 1000 \ - --test-datasets cms_pf_qcd + --optimizer adamw \ + --lr 0.001 \ + --num-steps 500000 \ + --val-freq 10000 \ + --checkpoint-freq 100 diff --git a/scripts/tallinn/a100/pytorch.sh b/scripts/tallinn/a100/pytorch.sh index 67a7c0614..0d6cf75b9 100755 --- a/scripts/tallinn/a100/pytorch.sh +++ b/scripts/tallinn/a100/pytorch.sh @@ -1,10 +1,10 @@ #!/bin/bash #SBATCH --partition gpu #SBATCH --gres gpu:a100:1 -#SBATCH --mem-per-gpu 300G +#SBATCH --mem-per-gpu 400G #SBATCH -o logs/slurm-%x-%j-%N.out -IMG=/home/software/singularity/pytorch.simg:2024-12-03 +IMG=/home/software/singularity/pytorch.simg:2025-09-01 cd ~/particleflow ulimit -n 100000 @@ -16,12 +16,12 @@ singularity exec -B /scratch/persistent -B /local --nv \ --config parameters/pytorch/pyg-cms.yaml \ train \ --gpus 1 \ - --gpu-batch-multiplier 10 \ - --checkpoint-freq 1 \ - --num-workers 8 \ - --prefetch-factor 10 \ + --gpu-batch-multiplier 16 \ + --num-workers 2 \ + --prefetch-factor 2 \ + --conv-type attention \ + --dtype bfloat16 \ + --optimizer adamw \ --comet \ - --ntrain 5000 \ - --nvalid 1000 \ - --ntest 1000 \ - --test-datasets cms_pf_qcd + --test-datasets cms_pf_qcd \ + --num-steps 1000000 diff --git a/scripts/tallinn/generate_tfds.sh b/scripts/tallinn/generate_tfds.sh index a59ceb324..0ad636c21 100644 --- a/scripts/tallinn/generate_tfds.sh +++ b/scripts/tallinn/generate_tfds.sh @@ -5,7 +5,7 @@ export KERAS_BACKEND=tensorflow export PYTHONPATH="mlpf" -export IMG=/home/software/singularity/pytorch.simg:2024-08-18 +export IMG=/home/software/singularity/pytorch.simg:2025-09-01 export CMD="singularity exec -B /local -B /scratch/persistent -B /scratch/local $IMG tfds build" export PYTHONUNBUFFERED=1 diff --git a/scripts/tallinn/qcd_pu_13p6_v2.txt b/scripts/tallinn/qcd_pu_13p6_v2.txt new file mode 100644 index 000000000..aa266fc3d --- /dev/null +++ b/scripts/tallinn/qcd_pu_13p6_v2.txt @@ -0,0 +1,1050 @@ +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700000.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700001.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700002.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700003.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700004.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700005.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700006.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700007.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700008.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700009.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700010.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700011.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700012.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700013.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700014.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700015.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700016.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700017.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700018.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700019.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700020.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700021.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700022.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700023.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700024.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700025.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700026.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700027.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700028.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700029.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700030.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700031.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700032.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700033.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700034.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700035.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700036.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700037.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700038.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700039.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700040.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700041.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700042.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700043.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700044.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700045.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700046.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700047.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700048.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700049.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700050.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700051.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700052.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700053.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700054.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700055.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700056.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700057.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700058.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700059.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700060.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700061.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700062.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700063.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700064.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700065.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700066.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700067.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700068.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700069.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700070.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700071.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700072.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700073.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700074.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700075.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700076.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700077.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700078.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700079.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700080.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700081.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700082.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700083.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700084.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700085.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700086.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700087.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700088.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700089.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700090.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700091.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700092.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700093.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700094.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700095.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700096.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700097.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700098.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700099.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700100.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700101.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700102.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700103.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700104.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700105.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700106.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700107.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700108.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700109.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700110.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700111.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700112.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700113.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700114.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700115.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700116.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700117.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700118.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700119.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700120.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700121.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700122.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700123.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700124.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700125.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700126.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700127.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700128.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700129.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700130.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700131.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700132.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700133.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700134.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700135.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700136.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700137.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700138.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700139.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700140.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700141.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700142.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700143.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700144.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700145.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700146.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700147.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700148.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700149.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700150.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700151.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700152.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700153.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700154.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700155.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700156.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700157.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700158.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700159.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700160.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700161.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700162.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700163.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700164.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700165.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700166.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700167.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700168.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700169.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700170.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700171.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700172.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700173.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700174.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700175.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700176.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700177.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700178.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700179.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700180.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700181.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700182.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700183.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700184.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700185.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700186.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700187.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700188.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700189.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700190.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700191.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700192.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700193.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700194.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700195.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700196.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700197.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700198.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700199.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700200.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700201.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700202.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700203.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700204.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700205.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700206.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700207.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700208.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700209.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700210.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700211.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700212.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700213.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700214.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700215.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700216.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700217.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700218.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700219.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700220.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700221.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700222.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700223.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700224.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700225.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700226.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700227.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700228.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700229.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700230.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700231.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700232.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700233.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700234.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700235.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700236.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700237.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700238.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700239.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700240.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700241.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700242.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700243.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700244.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700245.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700246.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700247.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700248.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700249.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700250.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700251.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700252.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700253.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700254.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700255.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700256.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700257.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700258.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700259.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700260.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700261.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700262.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700263.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700264.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700265.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700266.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700267.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700268.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700269.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700270.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700271.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700272.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700273.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700274.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700275.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700276.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700277.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700278.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700279.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700280.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700281.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700282.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700283.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700284.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700285.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700286.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700287.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700288.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700289.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700290.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700291.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700292.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700293.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700294.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700295.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700296.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700297.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700298.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700299.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700300.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700301.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700302.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700303.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700304.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700305.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700306.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700307.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700308.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700309.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700310.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700311.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700312.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700313.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700314.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700315.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700316.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700317.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700318.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700319.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700320.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700321.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700322.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700323.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700324.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700325.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700326.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700327.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700328.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700329.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700330.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700331.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700332.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700333.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700334.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700335.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700336.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700337.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700338.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700339.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700340.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700341.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700342.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700343.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700344.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700345.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700346.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700347.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700348.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700349.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700350.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700351.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700352.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700353.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700354.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700355.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700356.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700357.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700358.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700359.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700360.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700361.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700362.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700363.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700364.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700365.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700366.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700367.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700368.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700369.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700370.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700371.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700372.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700373.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700374.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700375.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700376.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700377.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700378.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700379.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700380.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700381.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700382.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700383.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700384.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700385.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700386.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700387.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700388.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700389.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700390.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700391.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700392.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700393.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700394.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700395.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700396.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700397.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700398.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700399.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700400.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700401.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700402.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700403.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700404.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700405.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700406.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700407.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700408.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700409.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700410.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700411.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700412.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700413.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700414.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700415.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700416.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700417.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700418.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700419.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700420.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700421.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700422.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700423.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700424.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700425.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700426.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700427.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700428.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700429.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700430.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700431.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700432.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700433.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700434.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700435.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700436.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700437.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700438.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700439.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700440.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700441.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700442.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700443.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700444.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700445.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700446.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700447.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700448.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700449.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700450.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700451.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700452.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700453.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700454.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700455.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700456.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700457.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700458.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700459.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700460.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700461.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700462.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700463.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700464.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700465.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700466.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700467.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700468.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700469.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700470.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700471.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700472.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700473.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700474.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700475.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700476.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700477.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700478.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700479.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700480.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700481.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700482.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700483.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700484.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700485.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700486.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700487.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700488.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700489.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700490.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700491.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700492.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700493.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700494.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700495.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700496.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700497.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700498.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700499.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700500.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700501.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700502.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700503.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700504.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700505.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700506.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700507.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700508.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700509.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700510.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700511.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700512.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700513.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700514.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700515.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700516.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700517.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700518.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700519.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700520.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700521.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700522.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700523.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700524.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700525.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700526.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700527.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700528.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700529.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700530.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700531.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700532.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700533.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700534.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700535.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700536.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700537.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700538.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700539.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700540.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700541.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700542.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700543.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700544.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700545.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700546.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700547.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700548.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700549.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700550.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700551.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700552.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700553.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700554.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700555.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700556.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700557.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700558.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700559.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700560.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700561.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700562.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700563.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700564.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700565.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700566.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700567.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700568.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700569.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700570.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700571.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700572.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700573.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700574.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700575.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700576.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700577.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700578.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700579.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700580.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700581.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700582.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700583.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700584.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700585.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700586.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700587.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700588.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700589.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700590.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700591.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700592.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700593.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700594.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700595.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700596.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700597.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700598.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700599.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700600.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700601.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700602.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700603.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700604.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700605.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700606.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700607.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700608.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700609.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700610.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700611.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700612.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700613.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700614.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700615.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700616.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700617.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700618.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700619.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700620.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700621.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700622.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700623.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700624.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700625.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700626.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700627.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700628.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700629.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700630.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700631.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700632.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700633.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700634.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700635.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700636.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700637.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700638.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700639.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700640.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700641.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700642.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700643.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700644.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700645.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700646.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700647.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700648.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700649.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700650.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700651.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700652.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700653.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700654.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700655.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700656.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700657.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700658.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700659.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700660.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700661.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700662.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700663.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700664.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700665.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700666.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700667.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700668.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700669.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700670.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700671.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700672.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700673.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700674.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700675.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700676.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700677.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700678.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700679.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700680.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700681.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700682.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700683.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700684.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700685.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700686.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700687.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700688.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700689.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700690.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700691.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700692.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700693.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700694.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700695.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700696.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700697.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700698.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700699.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700700.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700701.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700702.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700703.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700704.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700705.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700706.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700707.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700708.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700709.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700710.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700711.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700712.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700713.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700714.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700715.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700716.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700717.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700718.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700719.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700720.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700721.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700722.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700723.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700724.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700725.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700726.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700727.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700728.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700729.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700730.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700731.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700732.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700733.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700734.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700735.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700736.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700737.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700738.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700739.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700740.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700741.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700742.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700743.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700744.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700745.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700746.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700747.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700748.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700749.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700750.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700751.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700752.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700753.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700754.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700755.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700756.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700757.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700758.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700759.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700760.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700761.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700762.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700763.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700764.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700765.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700766.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700767.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700768.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700769.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700770.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700771.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700772.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700773.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700774.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700775.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700776.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700777.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700778.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700779.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700780.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700781.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700782.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700783.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700784.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700785.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700786.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700787.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700788.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700789.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700790.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700791.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700792.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700793.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700794.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700795.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700796.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700797.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700798.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700799.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700800.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700801.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700802.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700803.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700804.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700805.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700806.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700807.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700808.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700809.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700810.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700811.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700812.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700813.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700814.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700815.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700816.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700817.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700818.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700819.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700820.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700821.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700822.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700823.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700824.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700825.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700826.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700827.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700828.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700829.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700830.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700831.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700832.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700833.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700834.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700835.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700836.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700837.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700838.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700839.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700840.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700841.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700842.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700843.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700844.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700845.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700846.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700847.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700848.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700849.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700850.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700851.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700852.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700853.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700854.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700855.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700856.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700857.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700858.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700859.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700860.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700861.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700862.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700863.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700864.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700865.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700866.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700867.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700868.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700869.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700870.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700871.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700872.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700873.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700874.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700875.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700876.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700877.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700878.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700879.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700880.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700881.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700882.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700883.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700884.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700885.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700886.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700887.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700888.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700889.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700890.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700891.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700892.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700893.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700894.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700895.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700896.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700897.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700898.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700899.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700900.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700901.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700902.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700903.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700904.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700905.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700906.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700907.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700908.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700909.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700910.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700911.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700912.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700913.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700914.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700915.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700916.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700917.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700918.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700919.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700920.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700921.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700922.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700923.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700924.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700925.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700926.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700927.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700928.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700929.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700930.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700931.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700932.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700933.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700934.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700935.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700936.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700937.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700938.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700939.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700940.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700941.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700942.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700943.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700944.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700945.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700946.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700947.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700948.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700949.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700950.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700951.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700952.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700953.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700954.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700955.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700956.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700957.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700958.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700959.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700960.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700961.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700962.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700963.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700964.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700965.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700966.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700967.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700968.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700969.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700970.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700971.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700972.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700973.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700974.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700975.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700976.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700977.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700978.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700979.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700980.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700981.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700982.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700983.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700984.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700985.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700986.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700987.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700988.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700989.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700990.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700991.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700992.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700993.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700994.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700995.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700996.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700997.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700998.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700999.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701000.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701001.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701002.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701003.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701004.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701005.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701006.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701007.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701008.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701009.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701010.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701011.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701012.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701013.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701014.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701015.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701016.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701017.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701018.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701019.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701020.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701021.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701022.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701023.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701024.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701025.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701026.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701027.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701028.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701029.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701030.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701031.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701032.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701033.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701034.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701035.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701036.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701037.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701038.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701039.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701040.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701041.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701042.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701043.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701044.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701045.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701046.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701047.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701048.root +file:/local/joosep/mlpf/cms/20251001_cmssw_15_0_5_e42b72/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701049.root diff --git a/scripts/tallinn/qcd_pu_13p6_v3.txt b/scripts/tallinn/qcd_pu_13p6_v3.txt new file mode 100644 index 000000000..51f02ab4d --- /dev/null +++ b/scripts/tallinn/qcd_pu_13p6_v3.txt @@ -0,0 +1,1050 @@ +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700000.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700001.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700002.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700003.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700004.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700005.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700006.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700007.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700008.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700009.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700010.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700011.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700012.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700013.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700014.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700015.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700016.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700017.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700018.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700019.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700020.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700021.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700022.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700023.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700024.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700025.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700026.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700027.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700028.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700029.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700030.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700031.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700032.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700033.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700034.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700035.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700036.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700037.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700038.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700039.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700040.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700041.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700042.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700043.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700044.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700045.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700046.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700047.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700048.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700049.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700050.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700051.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700052.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700053.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700054.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700055.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700056.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700057.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700058.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700059.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700060.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700061.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700062.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700063.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700064.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700065.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700066.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700067.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700068.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700069.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700070.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700071.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700072.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700073.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700074.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700075.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700076.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700077.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700078.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700079.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700080.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700081.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700082.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700083.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700084.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700085.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700086.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700087.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700088.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700089.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700090.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700091.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700092.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700093.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700094.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700095.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700096.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700097.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700098.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700099.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700100.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700101.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700102.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700103.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700104.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700105.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700106.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700107.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700108.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700109.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700110.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700111.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700112.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700113.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700114.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700115.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700116.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700117.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700118.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700119.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700120.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700121.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700122.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700123.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700124.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700125.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700126.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700127.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700128.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700129.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700130.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700131.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700132.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700133.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700134.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700135.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700136.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700137.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700138.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700139.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700140.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700141.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700142.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700143.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700144.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700145.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700146.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700147.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700148.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700149.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700150.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700151.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700152.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700153.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700154.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700155.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700156.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700157.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700158.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700159.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700160.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700161.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700162.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700163.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700164.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700165.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700166.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700167.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700168.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700169.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700170.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700171.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700172.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700173.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700174.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700175.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700176.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700177.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700178.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700179.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700180.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700181.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700182.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700183.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700184.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700185.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700186.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700187.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700188.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700189.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700190.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700191.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700192.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700193.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700194.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700195.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700196.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700197.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700198.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700199.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700200.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700201.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700202.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700203.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700204.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700205.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700206.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700207.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700208.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700209.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700210.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700211.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700212.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700213.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700214.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700215.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700216.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700217.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700218.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700219.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700220.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700221.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700222.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700223.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700224.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700225.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700226.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700227.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700228.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700229.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700230.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700231.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700232.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700233.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700234.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700235.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700236.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700237.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700238.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700239.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700240.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700241.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700242.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700243.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700244.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700245.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700246.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700247.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700248.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700249.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700250.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700251.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700252.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700253.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700254.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700255.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700256.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700257.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700258.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700259.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700260.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700261.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700262.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700263.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700264.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700265.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700266.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700267.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700268.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700269.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700270.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700271.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700272.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700273.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700274.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700275.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700276.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700277.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700278.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700279.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700280.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700281.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700282.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700283.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700284.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700285.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700286.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700287.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700288.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700289.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700290.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700291.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700292.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700293.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700294.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700295.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700296.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700297.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700298.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700299.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700300.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700301.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700302.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700303.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700304.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700305.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700306.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700307.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700308.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700309.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700310.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700311.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700312.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700313.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700314.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700315.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700316.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700317.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700318.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700319.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700320.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700321.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700322.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700323.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700324.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700325.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700326.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700327.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700328.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700329.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700330.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700331.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700332.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700333.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700334.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700335.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700336.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700337.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700338.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700339.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700340.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700341.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700342.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700343.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700344.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700345.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700346.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700347.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700348.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700349.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700350.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700351.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700352.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700353.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700354.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700355.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700356.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700357.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700358.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700359.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700360.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700361.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700362.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700363.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700364.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700365.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700366.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700367.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700368.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700369.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700370.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700371.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700372.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700373.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700374.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700375.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700376.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700377.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700378.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700379.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700380.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700381.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700382.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700383.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700384.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700385.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700386.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700387.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700388.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700389.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700390.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700391.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700392.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700393.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700394.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700395.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700396.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700397.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700398.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700399.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700400.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700401.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700402.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700403.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700404.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700405.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700406.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700407.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700408.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700409.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700410.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700411.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700412.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700413.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700414.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700415.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700416.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700417.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700418.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700419.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700420.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700421.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700422.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700423.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700424.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700425.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700426.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700427.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700428.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700429.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700430.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700431.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700432.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700433.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700434.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700435.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700436.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700437.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700438.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700439.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700440.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700441.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700442.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700443.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700444.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700445.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700446.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700447.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700448.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700449.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700450.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700451.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700452.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700453.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700454.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700455.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700456.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700457.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700458.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700459.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700460.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700461.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700462.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700463.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700464.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700465.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700466.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700467.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700468.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700469.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700470.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700471.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700472.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700473.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700474.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700475.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700476.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700477.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700478.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700479.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700480.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700481.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700482.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700483.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700484.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700485.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700486.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700487.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700488.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700489.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700490.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700491.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700492.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700493.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700494.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700495.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700496.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700497.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700498.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700499.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700500.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700501.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700502.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700503.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700504.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700505.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700506.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700507.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700508.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700509.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700510.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700511.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700512.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700513.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700514.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700515.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700516.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700517.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700518.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700519.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700520.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700521.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700522.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700523.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700524.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700525.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700526.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700527.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700528.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700529.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700530.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700531.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700532.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700533.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700534.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700535.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700536.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700537.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700538.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700539.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700540.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700541.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700542.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700543.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700544.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700545.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700546.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700547.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700548.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700549.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700550.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700551.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700552.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700553.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700554.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700555.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700556.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700557.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700558.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700559.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700560.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700561.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700562.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700563.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700564.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700565.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700566.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700567.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700568.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700569.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700570.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700571.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700572.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700573.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700574.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700575.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700576.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700577.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700578.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700579.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700580.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700581.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700582.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700583.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700584.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700585.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700586.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700587.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700588.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700589.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700590.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700591.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700592.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700593.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700594.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700595.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700596.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700597.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700598.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700599.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700600.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700601.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700602.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700603.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700604.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700605.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700606.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700607.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700608.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700609.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700610.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700611.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700612.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700613.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700614.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700615.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700616.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700617.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700618.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700619.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700620.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700621.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700622.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700623.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700624.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700625.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700626.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700627.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700628.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700629.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700630.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700631.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700632.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700633.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700634.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700635.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700636.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700637.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700638.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700639.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700640.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700641.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700642.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700643.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700644.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700645.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700646.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700647.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700648.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700649.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700650.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700651.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700652.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700653.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700654.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700655.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700656.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700657.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700658.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700659.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700660.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700661.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700662.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700663.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700664.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700665.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700666.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700667.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700668.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700669.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700670.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700671.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700672.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700673.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700674.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700675.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700676.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700677.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700678.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700679.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700680.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700681.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700682.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700683.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700684.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700685.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700686.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700687.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700688.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700689.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700690.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700691.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700692.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700693.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700694.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700695.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700696.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700697.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700698.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700699.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700700.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700701.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700702.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700703.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700704.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700705.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700706.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700707.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700708.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700709.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700710.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700711.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700712.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700713.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700714.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700715.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700716.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700717.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700718.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700719.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700720.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700721.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700722.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700723.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700724.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700725.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700726.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700727.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700728.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700729.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700730.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700731.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700732.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700733.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700734.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700735.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700736.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700737.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700738.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700739.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700740.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700741.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700742.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700743.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700744.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700745.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700746.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700747.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700748.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700749.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700750.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700751.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700752.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700753.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700754.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700755.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700756.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700757.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700758.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700759.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700760.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700761.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700762.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700763.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700764.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700765.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700766.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700767.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700768.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700769.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700770.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700771.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700772.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700773.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700774.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700775.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700776.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700777.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700778.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700779.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700780.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700781.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700782.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700783.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700784.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700785.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700786.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700787.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700788.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700789.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700790.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700791.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700792.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700793.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700794.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700795.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700796.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700797.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700798.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700799.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700800.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700801.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700802.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700803.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700804.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700805.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700806.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700807.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700808.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700809.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700810.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700811.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700812.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700813.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700814.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700815.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700816.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700817.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700818.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700819.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700820.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700821.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700822.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700823.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700824.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700825.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700826.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700827.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700828.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700829.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700830.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700831.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700832.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700833.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700834.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700835.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700836.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700837.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700838.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700839.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700840.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700841.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700842.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700843.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700844.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700845.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700846.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700847.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700848.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700849.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700850.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700851.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700852.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700853.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700854.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700855.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700856.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700857.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700858.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700859.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700860.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700861.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700862.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700863.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700864.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700865.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700866.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700867.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700868.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700869.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700870.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700871.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700872.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700873.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700874.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700875.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700876.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700877.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700878.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700879.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700880.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700881.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700882.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700883.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700884.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700885.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700886.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700887.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700888.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700889.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700890.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700891.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700892.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700893.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700894.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700895.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700896.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700897.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700898.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700899.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700900.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700901.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700902.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700903.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700904.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700905.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700906.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700907.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700908.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700909.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700910.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700911.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700912.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700913.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700914.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700915.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700916.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700917.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700918.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700919.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700920.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700921.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700922.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700923.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700924.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700925.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700926.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700927.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700928.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700929.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700930.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700931.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700932.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700933.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700934.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700935.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700936.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700937.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700938.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700939.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700940.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700941.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700942.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700943.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700944.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700945.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700946.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700947.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700948.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700949.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700950.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700951.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700952.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700953.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700954.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700955.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700956.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700957.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700958.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700959.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700960.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700961.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700962.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700963.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700964.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700965.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700966.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700967.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700968.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700969.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700970.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700971.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700972.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700973.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700974.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700975.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700976.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700977.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700978.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700979.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700980.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700981.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700982.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700983.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700984.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700985.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700986.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700987.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700988.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700989.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700990.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700991.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700992.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700993.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700994.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700995.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700996.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700997.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700998.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_700999.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701000.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701001.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701002.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701003.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701004.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701005.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701006.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701007.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701008.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701009.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701010.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701011.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701012.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701013.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701014.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701015.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701016.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701017.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701018.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701019.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701020.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701021.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701022.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701023.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701024.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701025.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701026.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701027.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701028.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701029.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701030.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701031.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701032.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701033.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701034.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701035.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701036.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701037.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701038.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701039.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701040.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701041.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701042.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701043.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701044.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701045.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701046.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701047.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701048.root +file:/local/joosep/mlpf/cms/20251125_cmssw_15_0_5_117d32/pu55to75_val/QCDForPF_13p6TeV_TuneCUETP8M1_cfi/root/step2_701049.root diff --git a/scripts/tallinn/submit_tfds.sh b/scripts/tallinn/submit_tfds.sh index fc5de0c3e..71f01d6bf 100755 --- a/scripts/tallinn/submit_tfds.sh +++ b/scripts/tallinn/submit_tfds.sh @@ -3,24 +3,23 @@ SUB=scripts/tallinn/generate_tfds.sh export MANUAL_DIR=/local/joosep/mlpf/cms/20250508_cmssw_15_0_5_d3c6d1/ -export DATA_DIR=/scratch/local/joosep/tensorflow_datasets/cms/2.7.1/ -# for i in `seq 1 10`; do -# sbatch $SUB cms_pf/ttbar_nopu $i nopu -# sbatch $SUB cms_pf/ztt_nopu $i nopu -# sbatch $SUB cms_pf/qcd $i pu55to75 -# sbatch $SUB cms_pf/ttbar $i pu55to75 -# sbatch $SUB cms_pf/ztt $i pu55to75 -# done +export DATA_DIR=/local/joosep/tensorflow_datasets/cms/2.8.0/ +for i in `seq 1 10`; do + sbatch $SUB cms_pf/ttbar_nopu $i nopu + sbatch $SUB cms_pf/ztt_nopu $i nopu + sbatch $SUB cms_pf/qcd $i pu55to75 + sbatch $SUB cms_pf/ttbar $i pu55to75 + sbatch $SUB cms_pf/ztt $i pu55to75 +done -# export DATA_DIR=/scratch/local/joosep/tensorflow_datasets/cms/2.7.2/ -# for i in `seq 1 40`; do -# sbatch $SUB cms_pf/qcd_nopu $i nopu -# done +for i in `seq 1 40`; do + sbatch $SUB cms_pf/qcd_nopu $i nopu +done -# export DATA_DIR=/local/joosep/mlpf/tensorflow_datasets/clic -# export MANUAL_DIR=/local/joosep/mlpf/clic_edm4hep/ -# for i in `seq 1 10`; do -# sbatch $SUB clic_pf_edm4hep/ttbar $i -# sbatch $SUB clic_pf_edm4hep/qq $i -# sbatch $SUB clic_pf_edm4hep/ww_fullhad $i -# done +export DATA_DIR=/local/joosep/mlpf/tensorflow_datasets/clic +export MANUAL_DIR=/local/joosep/mlpf/clic_edm4hep/ +for i in `seq 1 10`; do + sbatch $SUB clic_pf_edm4hep/ttbar $i + sbatch $SUB clic_pf_edm4hep/qq $i + sbatch $SUB clic_pf_edm4hep/ww_fullhad $i +done diff --git a/scripts/tallinn/submit_validate_cms.sh b/scripts/tallinn/submit_validate_cms.sh index 0814f95dd..db4243c55 100755 --- a/scripts/tallinn/submit_validate_cms.sh +++ b/scripts/tallinn/submit_validate_cms.sh @@ -3,57 +3,62 @@ SUBSCRIPT=scripts/tallinn/cmssw-el8.sh SITE=T2_EE_Estonia -END=`wc -l scripts/tallinn/jetmet0.txt | cut -f1 -d' '` -for ifile in $(seq 1 $END); do - sbatch $SUBSCRIPT scripts/cmssw/validation_job_data.sh False mlpf scripts/tallinn/jetmet0.txt JetMET0 $ifile $SITE - sbatch $SUBSCRIPT scripts/cmssw/validation_job_data.sh False pf scripts/tallinn/jetmet0.txt JetMET0 $ifile $SITE -done - -END=`wc -l scripts/tallinn/photonjet_pu_13p6.txt | cut -f1 -d' '` -for ifile in $(seq 1 $END); do - sbatch $SUBSCRIPT scripts/cmssw/validation_job.sh False mlpf scripts/tallinn/photonjet_pu_13p6.txt PhotonJet_PU_13p6 $ifile $SITE - sbatch $SUBSCRIPT scripts/cmssw/validation_job.sh False pf scripts/tallinn/photonjet_pu_13p6.txt PhotonJet_PU_13p6 $ifile $SITE -done - -END=`wc -l scripts/tallinn/photonjet_nopu_13p6.txt | cut -f1 -d' '` -for ifile in $(seq 1 $END); do - sbatch $SUBSCRIPT scripts/cmssw/validation_job.sh False mlpf scripts/tallinn/photonjet_nopu_13p6.txt PhotonJet_noPU_13p6 $ifile $SITE - sbatch $SUBSCRIPT scripts/cmssw/validation_job.sh False pf scripts/tallinn/photonjet_nopu_13p6.txt PhotonJet_noPU_13p6 $ifile $SITE -done - -END=`wc -l scripts/tallinn/ttbar_pu.txt | cut -f1 -d' '` -for ifile in $(seq 1 $END); do - sbatch $SUBSCRIPT scripts/cmssw/validation_job.sh False mlpf scripts/tallinn/ttbar_pu.txt TTbar_PU $ifile $SITE - sbatch $SUBSCRIPT scripts/cmssw/validation_job.sh False pf scripts/tallinn/ttbar_pu.txt TTbar_PU $ifile $SITE -done - -END=`wc -l scripts/tallinn/ttbar_pu_13p6.txt | cut -f1 -d' '` -for ifile in $(seq 1 $END); do - sbatch $SUBSCRIPT scripts/cmssw/validation_job.sh False mlpf scripts/tallinn/ttbar_pu_13p6.txt TTbar_PU_13p6 $ifile $SITE - sbatch $SUBSCRIPT scripts/cmssw/validation_job.sh False pf scripts/tallinn/ttbar_pu_13p6.txt TTbar_PU_13p6 $ifile $SITE -done - -END=`wc -l scripts/tallinn/ttbar_nopu_13p6.txt | cut -f1 -d' '` -for ifile in $(seq 1 $END); do - sbatch $SUBSCRIPT scripts/cmssw/validation_job.sh False mlpf scripts/tallinn/ttbar_nopu_13p6.txt TTbar_noPU_13p6 $ifile $SITE - sbatch $SUBSCRIPT scripts/cmssw/validation_job.sh False pf scripts/tallinn/ttbar_nopu_13p6.txt TTbar_noPU_13p6 $ifile $SITE -done +# END=`wc -l scripts/tallinn/jetmet0.txt | cut -f1 -d' '` +# for ifile in $(seq 1 $END); do +# sbatch $SUBSCRIPT scripts/cmssw/validation_job_data.sh False mlpf scripts/tallinn/jetmet0.txt JetMET0 $ifile $SITE +# sbatch $SUBSCRIPT scripts/cmssw/validation_job_data.sh False pf scripts/tallinn/jetmet0.txt JetMET0 $ifile $SITE +# done +# +# END=`wc -l scripts/tallinn/photonjet_pu_13p6.txt | cut -f1 -d' '` +# for ifile in $(seq 1 $END); do +# sbatch $SUBSCRIPT scripts/cmssw/validation_job.sh False mlpf scripts/tallinn/photonjet_pu_13p6.txt PhotonJet_PU_13p6 $ifile $SITE +# sbatch $SUBSCRIPT scripts/cmssw/validation_job.sh False pf scripts/tallinn/photonjet_pu_13p6.txt PhotonJet_PU_13p6 $ifile $SITE +# done +# +# END=`wc -l scripts/tallinn/photonjet_nopu_13p6.txt | cut -f1 -d' '` +# for ifile in $(seq 1 $END); do +# sbatch $SUBSCRIPT scripts/cmssw/validation_job.sh False mlpf scripts/tallinn/photonjet_nopu_13p6.txt PhotonJet_noPU_13p6 $ifile $SITE +# sbatch $SUBSCRIPT scripts/cmssw/validation_job.sh False pf scripts/tallinn/photonjet_nopu_13p6.txt PhotonJet_noPU_13p6 $ifile $SITE +# done +# +# END=`wc -l scripts/tallinn/ttbar_pu.txt | cut -f1 -d' '` +# for ifile in $(seq 1 $END); do +# sbatch $SUBSCRIPT scripts/cmssw/validation_job.sh False mlpf scripts/tallinn/ttbar_pu.txt TTbar_PU $ifile $SITE +# sbatch $SUBSCRIPT scripts/cmssw/validation_job.sh False pf scripts/tallinn/ttbar_pu.txt TTbar_PU $ifile $SITE +# done +# +# END=`wc -l scripts/tallinn/ttbar_pu_13p6.txt | cut -f1 -d' '` +# for ifile in $(seq 1 $END); do +# sbatch $SUBSCRIPT scripts/cmssw/validation_job.sh False mlpf scripts/tallinn/ttbar_pu_13p6.txt TTbar_PU_13p6 $ifile $SITE +# sbatch $SUBSCRIPT scripts/cmssw/validation_job.sh False pf scripts/tallinn/ttbar_pu_13p6.txt TTbar_PU_13p6 $ifile $SITE +# done +# +# END=`wc -l scripts/tallinn/ttbar_nopu_13p6.txt | cut -f1 -d' '` +# for ifile in $(seq 1 $END); do +# sbatch $SUBSCRIPT scripts/cmssw/validation_job.sh False mlpf scripts/tallinn/ttbar_nopu_13p6.txt TTbar_noPU_13p6 $ifile $SITE +# sbatch $SUBSCRIPT scripts/cmssw/validation_job.sh False pf scripts/tallinn/ttbar_nopu_13p6.txt TTbar_noPU_13p6 $ifile $SITE +# done END=`wc -l scripts/tallinn/qcd_pu.txt | cut -f1 -d' '` -for ifile in $(seq 1 $END); do +for ifile in $(seq 10 $END); do sbatch $SUBSCRIPT scripts/cmssw/validation_job.sh False mlpf scripts/tallinn/qcd_pu.txt QCD_PU $ifile $SITE sbatch $SUBSCRIPT scripts/cmssw/validation_job.sh False pf scripts/tallinn/qcd_pu.txt QCD_PU $ifile $SITE done END=`wc -l scripts/tallinn/qcd_pu_13p6.txt | cut -f1 -d' '` -for ifile in $(seq 200 $END); do +for ifile in $(seq 1 1000); do sbatch $SUBSCRIPT scripts/cmssw/validation_job.sh False mlpf scripts/tallinn/qcd_pu_13p6.txt QCD_PU_13p6 $ifile $SITE sbatch $SUBSCRIPT scripts/cmssw/validation_job.sh False pf scripts/tallinn/qcd_pu_13p6.txt QCD_PU_13p6 $ifile $SITE done +# END=`wc -l scripts/tallinn/qcd_nopu_13p6.txt | cut -f1 -d' '` +# for ifile in $(seq 1 $END); do +# sbatch $SUBSCRIPT scripts/cmssw/validation_job.sh False mlpf scripts/tallinn/qcd_nopu_13p6.txt QCD_noPU_13p6 $ifile $SITE +# sbatch $SUBSCRIPT scripts/cmssw/validation_job.sh False pf scripts/tallinn/qcd_nopu_13p6.txt QCD_noPU_13p6 $ifile $SITE +# done -END=`wc -l scripts/tallinn/qcd_nopu_13p6.txt | cut -f1 -d' '` -for ifile in $(seq 1 $END); do - sbatch $SUBSCRIPT scripts/cmssw/validation_job.sh False mlpf scripts/tallinn/qcd_nopu_13p6.txt QCD_noPU_13p6 $ifile $SITE - sbatch $SUBSCRIPT scripts/cmssw/validation_job.sh False pf scripts/tallinn/qcd_nopu_13p6.txt QCD_noPU_13p6 $ifile $SITE +END=`wc -l scripts/tallinn/qcd_pu_13p6_v3.txt | cut -f1 -d' '` +for ifile in $(seq 1 1000); do + sbatch $SUBSCRIPT scripts/cmssw/validation_job.sh False mlpf scripts/tallinn/qcd_pu_13p6_v3.txt QCD_PU_13p6_v3 $ifile $SITE + sbatch $SUBSCRIPT scripts/cmssw/validation_job.sh False pf scripts/tallinn/qcd_pu_13p6_v3.txt QCD_PU_13p6_v3 $ifile $SITE done diff --git a/tests/test_dataloader.py b/tests/test_dataloader.py new file mode 100644 index 000000000..8c0bcba74 --- /dev/null +++ b/tests/test_dataloader.py @@ -0,0 +1,214 @@ +import os +import shutil +import tempfile +import unittest +from unittest.mock import patch + +import torch +import torch.optim as optim +from torch.utils.data import Dataset + +from mlpf.model.PFDataset import get_interleaved_dataloaders +from mlpf.model.utils import save_checkpoint, load_checkpoint +from mlpf.model.mlpf import MLPF + + +class MockTorchDataset(Dataset): + """A mock torch dataset that returns dictionaries.""" + + def __init__(self, size=100): + self.size = size + + def __len__(self): + return self.size + + def __getitem__(self, idx): + return {"X": torch.tensor([[float(idx), 1.0]]), "ytarget": torch.tensor([[float(idx), 1.0]]), "genmet": 0.0} + + +class TestDataloaderRestoration(unittest.TestCase): + def setUp(self): + self.tempdir = tempfile.mkdtemp() + + def tearDown(self): + shutil.rmtree(self.tempdir) + + @patch("mlpf.model.PFDataset.PFDataset") + def test_restoration(self, MockPFDataset): + """Ensures that the dataloader state is correctly saved and restored.""" + # Configure the mock PFDataset to return our mock torch dataset + mock_pf_instance = MockPFDataset.return_value + mock_pf_instance.ds = MockTorchDataset() + + # Set seed once for reproducibility + torch.manual_seed(0) + + # 1. Create mock config + config = { + "dataset": "cms", + "data_dir": "/tmp/dummy_data", + "train_dataset": { + "cms": { + "type1": { + "batch_size": 2, + "samples": {"sample1": {"version": "1.0.0", "splits": ["split1"]}}, + } + } + }, + "valid_dataset": { # needed for get_interleaved_dataloaders + "cms": { + "type1": { + "batch_size": 2, + "samples": {"sample1": {"version": "1.0.0", "splits": ["split1"]}}, + } + } + }, + "ntrain": 100, + "nvalid": 100, + "num_workers": 2, + "prefetch_factor": 2, + "sort_data": False, + "pad_to_multiple_elements": None, + "gpu_batch_multiplier": 1, + } + + world_size = 1 + rank = 0 + + # --- Ground Truth Run: run uninterrupted to get the target data sequence --- + loaders_gt, _ = get_interleaved_dataloaders(world_size, rank, config, use_cuda=False, use_ray=False, shuffle_train=False) + train_loader_gt = loaders_gt["train"] + gt_data = [] + for i, batch in enumerate(train_loader_gt): + if i >= 10: + break + gt_data.append(batch.X.clone()) + print(gt_data) + + # --- Interrupted Run --- + + # This run will be stopped mid-way and a checkpoint will be saved. + # We need to re-seed to ensure this run starts with the same shuffle as the ground truth run. + torch.manual_seed(0) + loaders1, _ = get_interleaved_dataloaders(world_size, rank, config, use_cuda=False, use_ray=False, shuffle_train=False) + train_loader1 = loaders1["train"] + + run1_data = [] + for i in range(5): + batch = next(train_loader1) + run1_data.append(batch.X.clone()) + print(run1_data) + + model = MLPF(input_dim=2, num_classes=2) + optimizer = optim.Adam(model.parameters()) + checkpoint_path = os.path.join(self.tempdir, "checkpoint.pth") + extra_state = {"step": 5, "train_loader_state_dict": train_loader1.state_dict()} + save_checkpoint(checkpoint_path, model, optimizer, extra_state) + + # --- Restored Run --- + + # This run will load the checkpoint and continue where the previous run left off. + # It does not need to be re-seeded, as the RNG state is restored from the checkpoint. + checkpoint = torch.load(checkpoint_path) + load_checkpoint(checkpoint, model, optimizer) + loaders2, _ = get_interleaved_dataloaders(world_size, rank, config, use_cuda=False, use_ray=False, shuffle_train=False) + train_loader2 = loaders2["train"] + train_loader2.load_state_dict(checkpoint["extra_state"]["train_loader_state_dict"]) + + run2_data = [] + for i in range(5): + batch = next(train_loader2) + run2_data.append(batch.X.clone()) + print(run2_data) + + # --- Verification --- + combined_data = run1_data + run2_data + + self.assertEqual(len(combined_data), len(gt_data)) + for i in range(len(gt_data)): + self.assertTrue(torch.equal(combined_data[i], gt_data[i])) + + @patch("mlpf.model.PFDataset.PFDataset") + def test_restoration_until_exhausted(self, MockPFDataset): + """ + Tests that a restored dataloader can be iterated until it is + fully exhausted, and that it correctly transitions to the next epoch. + """ + mock_pf_instance = MockPFDataset.return_value + mock_pf_instance.ds = MockTorchDataset(size=21) # 10 batches per epoch + + torch.manual_seed(0) + config = { + "dataset": "cms", + "data_dir": "/tmp/dummy_data", + "train_dataset": { + "cms": { + "type1": { + "batch_size": 2, + "samples": {"sample1": {"version": "1.0.0", "splits": ["split1"]}}, + } + } + }, + "valid_dataset": { # needed for get_interleaved_dataloaders + "cms": { + "type1": { + "batch_size": 2, + "samples": {"sample1": {"version": "1.0.0", "splits": ["split1"]}}, + } + } + }, + "ntrain": 100, + "nvalid": 100, + "num_workers": 2, + "prefetch_factor": 2, + "sort_data": False, + "pad_to_multiple_elements": None, + "gpu_batch_multiplier": 1, + } + world_size = 1 + rank = 0 + + num_total_batches = 21 // 2 # 10 + num_batches_to_test = int(num_total_batches * 1.5) # 15 batches + stop_at_batch = 4 + + # --- Ground Truth Run: get the full data sequence for 1.5 epochs --- + torch.manual_seed(0) + loaders_gt, _ = get_interleaved_dataloaders(world_size, rank, config, use_cuda=False, use_ray=False, shuffle_train=False) + train_loader_gt = loaders_gt["train"] + gt_iterator = iter(train_loader_gt) + gt_data = [] + for _ in range(num_batches_to_test): + gt_data.append(next(gt_iterator).X.clone()) + self.assertEqual(len(gt_data), num_batches_to_test) + + # --- Interrupted Run --- + torch.manual_seed(0) + loaders1, _ = get_interleaved_dataloaders(world_size, rank, config, use_cuda=False, use_ray=False, shuffle_train=False) + train_loader1 = loaders1["train"] + run1_data = [] + iterator1 = iter(train_loader1) + for _ in range(stop_at_batch): + run1_data.append(next(iterator1).X.clone()) + + model = MLPF(input_dim=2, num_classes=2) + optimizer = optim.Adam(model.parameters()) + checkpoint_path = os.path.join(self.tempdir, "checkpoint.pth") + extra_state = {"step": stop_at_batch, "train_loader_state_dict": train_loader1.state_dict()} + save_checkpoint(checkpoint_path, model, optimizer, extra_state) + + # --- Restored Run --- + checkpoint = torch.load(checkpoint_path) + loaders2, _ = get_interleaved_dataloaders(world_size, rank, config, use_cuda=False, use_ray=False, shuffle_train=False) + train_loader2 = loaders2["train"] + train_loader2.load_state_dict(checkpoint["extra_state"]["train_loader_state_dict"]) + run2_data = [] + iterator2 = iter(train_loader2) + for _ in range(num_batches_to_test - stop_at_batch): # 11 batches + run2_data.append(next(iterator2).X.clone()) + + # --- Verification --- + combined_data = run1_data + run2_data + self.assertEqual(len(combined_data), len(gt_data)) + for i in range(len(gt_data)): + self.assertTrue(torch.equal(combined_data[i], gt_data[i]), f"Batch {i} differs") diff --git a/tests/test_dataloader_behavior.py b/tests/test_dataloader_behavior.py new file mode 100644 index 000000000..e30f420e2 --- /dev/null +++ b/tests/test_dataloader_behavior.py @@ -0,0 +1,44 @@ +import unittest +import torch +from torch.utils.data import DataLoader, Dataset + + +# A mock dataset that returns dictionaries, similar to the real one +class MockDictDataset(Dataset): + def __init__(self, size=20, offset=0): + self.size = size + self.offset = offset + + def __len__(self): + return self.size + + def __getitem__(self, idx): + return {"X": torch.tensor([[float(idx + self.offset)]])} + + +class TestDataLoaderBehavior(unittest.TestCase): + def test_fast_forward(self): + """ + Tests if a DataLoader iterator behaves as expected after + being manually fast-forwarded. + """ + dataset = MockDictDataset(size=20, offset=0) + loader = DataLoader(dataset, batch_size=2) # 10 batches + + # Fast-forward by 3 steps + iterator = iter(loader) + for _ in range(3): + _ = next(iterator) + + # The next batch should be batch index 3, with values [6, 7] + next_batch = next(iterator) + self.assertTrue(torch.equal(next_batch["X"], torch.tensor([[[6.0]], [[7.0]]]))) + + # Now, let's fast-forward until the end + # We already took 4 batches (3 in loop, 1 manually) + for _ in range(6): # Take the remaining 6 batches + next(iterator) + + # The next call should raise StopIteration + with self.assertRaises(StopIteration): + next(iterator) diff --git a/tests/test_endless_interleaved_iterator.py b/tests/test_endless_interleaved_iterator.py new file mode 100644 index 000000000..195444b84 --- /dev/null +++ b/tests/test_endless_interleaved_iterator.py @@ -0,0 +1,136 @@ +import unittest +import torch +from torch.utils.data import DataLoader, Dataset, SequentialSampler + +from mlpf.model.PFDataset import InterleavedIterator, EndlessIterator, ResumableSampler + + +# A mock dataset that returns dictionaries, similar to the real one +class MockDictDataset(Dataset): + def __init__(self, size=20, offset=0): + self.size = size + self.offset = offset + + def __len__(self): + return self.size + + def __getitem__(self, idx): + return {"X": torch.tensor([float(idx + self.offset)])} + + +class TestEndlessInterleavedIterator(unittest.TestCase): + def test_save_restore_with_endless(self): + """ + Tests that the combination of EndlessIterator and InterleavedIterator + can be saved and restored correctly. + """ + # --- Ground truth run --- + d1_gt = MockDictDataset(size=20, offset=0) + d2_gt = MockDictDataset(size=20, offset=100) + s1_gt = ResumableSampler(SequentialSampler(d1_gt)) + s2_gt = ResumableSampler(SequentialSampler(d2_gt)) + l1_gt = DataLoader(d1_gt, batch_size=2, sampler=s1_gt) + l2_gt = DataLoader(d2_gt, batch_size=2, sampler=s2_gt) + gt_iter = InterleavedIterator([l1_gt, l2_gt]) + # We will run for 10 steps total, so we need the first 10 batches + gt_data = [batch["X"].clone() for i, batch in enumerate(gt_iter) if i < 10] + + # --- Interrupted Run (run1) --- + torch.manual_seed(0) + d1_1 = MockDictDataset(size=20, offset=0) + d2_1 = MockDictDataset(size=20, offset=100) + s1_1 = ResumableSampler(SequentialSampler(d1_1)) + s2_1 = ResumableSampler(SequentialSampler(d2_1)) + l1_1 = DataLoader(d1_1, batch_size=2, sampler=s1_1) + l2_1 = DataLoader(d2_1, batch_size=2, sampler=s2_1) + inter_iter1 = InterleavedIterator([l1_1, l2_1]) + endless_iter1 = EndlessIterator(inter_iter1, samplers=[s1_1, s2_1], world_size=1) + + run1_data = [] + for i in range(5): + batch = next(endless_iter1) + run1_data.append(batch["X"].clone()) + state = endless_iter1.state_dict() + + # --- Restored Run (run2) --- + torch.manual_seed(0) # Re-seed to ensure loaders are identical before loading state + d1_2 = MockDictDataset(size=20, offset=0) + d2_2 = MockDictDataset(size=20, offset=100) + s1_2 = ResumableSampler(SequentialSampler(d1_2)) + s2_2 = ResumableSampler(SequentialSampler(d2_2)) + l1_2 = DataLoader(d1_2, batch_size=2, sampler=s1_2) + l2_2 = DataLoader(d2_2, batch_size=2, sampler=s2_2) + inter_iter2 = InterleavedIterator([l1_2, l2_2]) + endless_iter2 = EndlessIterator(inter_iter2, samplers=[s1_2, s2_2], world_size=1) + endless_iter2.load_state_dict(state) + + run2_data = [] + for i in range(5): + batch = next(endless_iter2) + run2_data.append(batch["X"].clone()) + + # --- Verification --- + combined_data = run1_data + run2_data + + self.assertEqual(len(combined_data), len(gt_data)) + for i in range(len(gt_data)): + self.assertTrue(torch.equal(combined_data[i], gt_data[i])) + + def test_endless_iterator_with_empty_dataloaders(self): + """ + Tests that EndlessIterator wrapping an empty InterleavedIterator + (because all dataloaders are empty) does not result in an unhandled exception. + This is the condition that likely causes the user-reported IndexError. + """ + d1 = MockDictDataset(size=0) + d2 = MockDictDataset(size=0) + s1 = ResumableSampler(SequentialSampler(d1)) + s2 = ResumableSampler(SequentialSampler(d2)) + l1 = DataLoader(d1, batch_size=2, sampler=s1) + l2 = DataLoader(d2, batch_size=2, sampler=s2) + inter_iter = InterleavedIterator([l1, l2]) + endless_iter = EndlessIterator(inter_iter, samplers=[s1, s2], world_size=1) + + # According to analysis, this should lead to a RecursionError. + # The user reported an IndexError. This test will expose the actual error. + with self.assertRaises(Exception): + next(endless_iter) + + def test_multiple_epochs(self): + """ + Tests that EndlessIterator can iterate for more than one epoch over + an InterleavedIterator, verifying that the iterators are reset correctly. + """ + d1 = MockDictDataset(size=10, offset=0) + d2 = MockDictDataset(size=10, offset=100) + s1 = ResumableSampler(SequentialSampler(d1)) + s2 = ResumableSampler(SequentialSampler(d2)) + # batch_size=2, so 5 batches from each loader, 10 total per epoch + l1 = DataLoader(d1, batch_size=2, sampler=s1) + l2 = DataLoader(d2, batch_size=2, sampler=s2) + inter_iter = InterleavedIterator([l1, l2]) + endless_iter = EndlessIterator(inter_iter, samplers=[s1, s2], world_size=1) + + total_batches_per_epoch = len(l1) + len(l2) # 5 + 5 = 10 + num_batches_to_iterate = int(total_batches_per_epoch * 1.5) # 15 batches + + # Iterate for 1.5 epochs + results = [] + for _ in range(num_batches_to_iterate): + batch = next(endless_iter) + results.append(batch["X"].clone()) + + self.assertEqual(len(results), num_batches_to_iterate) + + # Check that the data from the second epoch matches the data from the first + # The first 5 batches of the second epoch should be the same as the first 5 batches of the first epoch + results_first_epoch_part = results[0:5] + results_second_epoch_part = results[total_batches_per_epoch : total_batches_per_epoch + 5] + + self.assertEqual(len(results_first_epoch_part), len(results_second_epoch_part)) + for i in range(len(results_first_epoch_part)): + self.assertTrue(torch.equal(results_first_epoch_part[i], results_second_epoch_part[i])) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/test_interleaved_iterator.py b/tests/test_interleaved_iterator.py new file mode 100644 index 000000000..8288e0708 --- /dev/null +++ b/tests/test_interleaved_iterator.py @@ -0,0 +1,103 @@ +import unittest +import torch +from torch.utils.data import TensorDataset, DataLoader, SequentialSampler + +from mlpf.model.PFDataset import InterleavedIterator, ResumableSampler + + +class TestInterleavedIterator(unittest.TestCase): + def test_length(self): + """Tests that the length of the InterleavedIterator is correct.""" + d1 = TensorDataset(torch.arange(10)) + d2 = TensorDataset(torch.arange(5)) + loader1 = DataLoader(d1, batch_size=1) + loader2 = DataLoader(d2, batch_size=1) + + inter_iter = InterleavedIterator([loader1, loader2]) + self.assertEqual(len(inter_iter), 15) + + def test_iteration_order(self): + """Tests that the iterator yields batches in the correct interleaved order.""" + d1 = TensorDataset(torch.arange(0, 10, 2)) # 0, 2, 4, 6, 8 + d2 = TensorDataset(torch.arange(1, 10, 2)) # 1, 3, 5, 7, 9 + loader1 = DataLoader(d1, batch_size=1) + loader2 = DataLoader(d2, batch_size=1) + + inter_iter = InterleavedIterator([loader1, loader2]) + + results = [item[0].item() for item in inter_iter] + expected = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + + self.assertEqual(results, expected) + + def _run_save_restore_test(self, num_workers): + """Helper to run the save/restore test with a given number of workers.""" + d1 = TensorDataset(torch.arange(0, 20, 2)) # 10 elements + d2 = TensorDataset(torch.arange(1, 20, 2)) # 10 elements + + # --- Ground truth run --- + s1_gt = ResumableSampler(SequentialSampler(d1)) + s2_gt = ResumableSampler(SequentialSampler(d2)) + l1_gt = DataLoader(d1, batch_size=1, sampler=s1_gt, num_workers=num_workers) + l2_gt = DataLoader(d2, batch_size=1, sampler=s2_gt, num_workers=num_workers) + inter_iter_gt = InterleavedIterator([l1_gt, l2_gt]) + gt_data = [item[0].item() for item in inter_iter_gt] + + # --- Interrupted run --- + + # Part 1: Iterate part-way and save state + s1_1 = ResumableSampler(SequentialSampler(d1)) + s2_1 = ResumableSampler(SequentialSampler(d2)) + l1_1 = DataLoader(d1, batch_size=1, sampler=s1_1, num_workers=num_workers) + l2_1 = DataLoader(d2, batch_size=1, sampler=s2_1, num_workers=num_workers) + inter_iter1 = InterleavedIterator([l1_1, l2_1]) + run1_data = [] + stop_step = 7 + iterator1 = iter(inter_iter1) + for _ in range(stop_step): + item = next(iterator1) + run1_data.append(item[0].item()) + + state = inter_iter1.state_dict() + self.assertEqual(state["cur_index"], stop_step) + + # Part 2: Create a new iterator, load state, and continue + s1_2 = ResumableSampler(SequentialSampler(d1)) + s2_2 = ResumableSampler(SequentialSampler(d2)) + l1_2 = DataLoader(d1, batch_size=1, sampler=s1_2, num_workers=num_workers) + l2_2 = DataLoader(d2, batch_size=1, sampler=s2_2, num_workers=num_workers) + inter_iter2 = InterleavedIterator([l1_2, l2_2]) + inter_iter2.load_state_dict(state) + + run2_data = [item[0].item() for item in inter_iter2] + + # --- Verification --- + combined_data = run1_data + run2_data + self.assertEqual(combined_data, gt_data) + + def test_save_restore_single_worker(self): + self._run_save_restore_test(num_workers=0) + + def test_save_restore_multi_worker(self): + self._run_save_restore_test(num_workers=2) + + def test_reusability(self): + """Tests that the InterleavedIterator can be iterated over multiple times.""" + d1 = TensorDataset(torch.arange(10)) + d2 = TensorDataset(torch.arange(5)) + + s1 = ResumableSampler(SequentialSampler(d1)) + s2 = ResumableSampler(SequentialSampler(d2)) + + loader1 = DataLoader(d1, batch_size=1, sampler=s1) + loader2 = DataLoader(d2, batch_size=1, sampler=s2) + + inter_iter = InterleavedIterator([loader1, loader2]) + + # First iteration + results1 = [item[0].item() for item in inter_iter] + self.assertEqual(len(results1), 15) + + # Second iteration should yield the same results + results2 = [item[0].item() for item in inter_iter] + self.assertEqual(results1, results2) diff --git a/tests/test_lr_schedule.py b/tests/test_lr_schedule.py new file mode 100644 index 000000000..0a254a00a --- /dev/null +++ b/tests/test_lr_schedule.py @@ -0,0 +1,71 @@ +import torch +from torch.optim import SGD +from mlpf.model.utils import get_lr_schedule, save_checkpoint, load_lr_schedule +import os + + +def test_lr_schedule_restoration(): + # 1. Dummy model and optimizer + model = torch.nn.Linear(10, 2) + optimizer = SGD(model.parameters(), lr=0.1) + + # 2. Original scheduler + total_steps = 100 + config = {"lr_schedule": "cosinedecay", "lr": 0.1} + original_scheduler = get_lr_schedule(config, optimizer, total_steps) + + # 3. Simulate training (Part 1) + original_lrs = [] + for _ in range(50): + original_lrs.append(original_scheduler.get_last_lr()[0]) + original_scheduler.step() + + # 4. Save checkpoint + extra_state = {"lr_schedule_state_dict": original_scheduler.state_dict()} + checkpoint_path = "test_checkpoint.pth" + save_checkpoint(checkpoint_path, model, optimizer, extra_state) + + # Load checkpoint + checkpoint = torch.load(checkpoint_path) + + # 5. New scheduler (Simulating Bug) + # The scheduler is initialized with the *original* total_steps, but the last_epoch is set to the checkpoint step + incorrect_scheduler = get_lr_schedule(config, optimizer, total_steps, last_batch=50) + + # 6. Load checkpoint (this step is actually redundant if we initialize with last_batch, but keeping it for analogy) + # The load_lr_schedule function also sets last_epoch, so this is effectively what happens. + load_lr_schedule(incorrect_scheduler, checkpoint, 50) + + # 7. Simulate training (Part 2) + incorrect_lrs = [] + for _ in range(50): + incorrect_lrs.append(incorrect_scheduler.get_last_lr()[0]) + incorrect_scheduler.step() + + # Continue original scheduler to get expected LRs + for _ in range(50): + original_lrs.append(original_scheduler.get_last_lr()[0]) + original_scheduler.step() + + print("original_lrs", original_lrs[50:]) + + # 8. Assert failure + print("incorrect_lrs", incorrect_lrs) + assert original_lrs[50:] != incorrect_lrs + + # 9. New scheduler (Correct) + correct_scheduler = get_lr_schedule(config, optimizer, total_steps) + + # 10. Load checkpoint + load_lr_schedule(correct_scheduler, checkpoint, 50) + + # 11. Simulate training (Correct) + correct_lrs = [] + for _ in range(50): + correct_lrs.append(correct_scheduler.get_last_lr()[0]) + correct_scheduler.step() + + print("correct_lrs", correct_lrs) + assert original_lrs[50:] == correct_lrs + + os.remove(checkpoint_path) diff --git a/tests/test_resumable_sampler.py b/tests/test_resumable_sampler.py new file mode 100644 index 000000000..c5195258a --- /dev/null +++ b/tests/test_resumable_sampler.py @@ -0,0 +1,101 @@ +import unittest +import torch +from torch.utils.data import TensorDataset, SequentialSampler, DistributedSampler, Sampler + +from mlpf.model.PFDataset import ResumableSampler + + +class TestResumableSampler(unittest.TestCase): + def test_sampler_state_and_len(self): + """Tests that the sampler can be advanced and its length is correct.""" + d = TensorDataset(torch.arange(10)) + base_sampler = SequentialSampler(d) + resumable_sampler = ResumableSampler(base_sampler) + + self.assertEqual(len(resumable_sampler), 10) + + # Check initial iteration + self.assertEqual(list(resumable_sampler), list(range(10))) + + # Advance the sampler + resumable_sampler.load_state_dict({"start_index": 5}) + self.assertEqual(len(resumable_sampler), 10) # Should report full length + self.assertEqual(list(resumable_sampler), list(range(5, 10))) + + def test_distributed_sampler_compatibility(self): + """Tests that set_epoch is correctly passed to a wrapped DistributedSampler.""" + + class MockDistributedSampler(DistributedSampler): + def __init__(self, dataset): + # super() requires distributed process group to be initialized + # We are just mocking the set_epoch method, so we can skip the parent init + self.dataset = dataset + self.epoch = 0 + + def set_epoch(self, epoch): + self.epoch = epoch + + def __iter__(self): + return iter(range(len(self.dataset))) + + def __len__(self): + return len(self.dataset) + + d = TensorDataset(torch.arange(10)) + dist_sampler = MockDistributedSampler(d) + resumable_sampler = ResumableSampler(dist_sampler) + + resumable_sampler.set_epoch(5) + self.assertEqual(resumable_sampler.sampler.epoch, 5) + + def test_shuffling_with_set_epoch(self): + """ + Tests that set_epoch is correctly used to shuffle data across epochs, + even when the sampler is reset. + """ + + class MockShufflingSampler(Sampler): + def __init__(self, data_source): + self.data_source = data_source + self.epoch = 0 + + def __iter__(self): + g = torch.Generator() + g.manual_seed(self.epoch) + indices = torch.randperm(len(self.data_source), generator=g).tolist() + return iter(indices) + + def __len__(self): + return len(self.data_source) + + def set_epoch(self, epoch): + self.epoch = epoch + + dataset = TensorDataset(torch.arange(100)) + base_sampler = MockShufflingSampler(dataset) + resumable_sampler = ResumableSampler(base_sampler) + + # Epoch 1 + resumable_sampler.set_epoch(0) + epoch1_indices = list(resumable_sampler) + + # Simulate advancing and then starting a new epoch + resumable_sampler.load_state_dict({"start_index": 50}) # mid-epoch + resumable_sampler.set_epoch(1) # new epoch + resumable_sampler.load_state_dict({"start_index": 0}) # iterator reset + + # Epoch 2 + epoch2_indices = list(resumable_sampler) + + # Check that the order is different + self.assertNotEqual(epoch1_indices, epoch2_indices) + + # Check that both epochs contain all samples + self.assertEqual(sorted(epoch1_indices), list(range(100))) + self.assertEqual(sorted(epoch2_indices), list(range(100))) + + # Check that epoch 1 is reproducible by resetting the epoch + resumable_sampler.set_epoch(0) + resumable_sampler.load_state_dict({"start_index": 0}) + epoch1_redux_indices = list(resumable_sampler) + self.assertEqual(epoch1_indices, epoch1_redux_indices)