diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c4954663..26654b95 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,7 +13,6 @@ defaults: env: ebeam_en: 10 pbeam_en: 100 - cross_ang: -25 root: root -b -q root_no_delphes: root -b -q macro/ci/define_exclude_delphes.C @@ -119,7 +118,7 @@ jobs: echo "=====" ls -lh datarec echo "[CI] make config file" - s3tools/make-fastsim-local-config.sh ${{env.ebeam_en}}x${{env.pbeam_en}} ${{matrix.minq2}} datarec delphes.config + s3tools/make-fastsim-local-config.sh ${{env.ebeam_en}}x${{env.pbeam_en}} ${{matrix.minq2}} 0 datarec delphes.config echo "=====" cat delphes.config - uses: actions/upload-artifact@v3 @@ -129,6 +128,7 @@ jobs: path: | datarec/*.root delphes.config + delphes.config.list # DOWNLOAD FULLSIM --------------------------------------------------------------------------- @@ -140,7 +140,7 @@ jobs: matrix: include: - { detector: athena, num_files: 20 } - - { detector: ecce, num_files: 20 } + - { detector: ecce, num_files: 40 } steps: - uses: actions/checkout@v3 - uses: cvmfs-contrib/github-action-cvmfs@v3 @@ -154,7 +154,7 @@ jobs: run: | echo "[CI] download files from S3" s3tools/add-host.sh - s3tools/make-${{matrix.detector}}-config.sh ${{env.ebeam_en}}x${{env.pbeam_en}} d ${{matrix.num_files}} s3files.config + s3tools/make-${{matrix.detector}}-config.sh ${{env.ebeam_en}}x${{env.pbeam_en}} ${{matrix.detector}} d ${{matrix.num_files}} s3files.config echo "[CI] cat config file" cat s3files.config - uses: actions/upload-artifact@v3 @@ -217,12 +217,12 @@ jobs: echo "[CI] flatten tree of Delphes files" find -name "*.root" -print | tee tmp.list cat tmp.list | while read f; do mv -v $f datarec/; done - cat x_fastsim_delphes*/delphes.config > delphes.config - sort -nr -o delphes.config{,} + echo "[CI] generate combined config file" + s3tools/generate-config-file.rb delphes.config ${{env.ebeam_en}}x${{env.pbeam_en}} x_fastsim_delphes*/delphes.config.list echo "[CI] cat delphes.config" cat delphes.config echo "[CI] ANALYSIS MACRO" - ${{env.root}} 'macro/ci/analysis_${{matrix.aname}}.C("delphes.config",${{env.ebeam_en}},${{env.pbeam_en}},${{env.cross_ang}},"fastsim.${{matrix.aname}}.${{matrix.recon}}","${{matrix.recon}}")' + ${{env.root}} 'macro/ci/analysis_${{matrix.aname}}.C("delphes.config","fastsim.${{matrix.aname}}.${{matrix.recon}}","${{matrix.recon}}")' - uses: actions/upload-artifact@v3 with: name: root_analysis_fastsim_${{matrix.aname}}_${{matrix.recon}} @@ -272,7 +272,7 @@ jobs: echo "[CI] cat s3files.config" cat s3files.config echo "[CI] ANALYSIS MACRO" - ${{env.root_no_delphes}} 'macro/ci/analysis_${{matrix.aname}}.C("s3files.config",${{env.ebeam_en}},${{env.pbeam_en}},${{env.cross_ang}},"${{matrix.detector}}.${{matrix.aname}}.${{matrix.recon}}","${{matrix.recon}}")' + ${{env.root_no_delphes}} 'macro/ci/analysis_${{matrix.aname}}.C("s3files.config","${{matrix.detector}}.${{matrix.aname}}.${{matrix.recon}}","${{matrix.recon}}")' - uses: actions/upload-artifact@v3 with: name: root_analysis_${{matrix.detector}}_${{matrix.aname}}_${{matrix.recon}} diff --git a/README.md b/README.md index 48757c60..d442ac56 100644 --- a/README.md +++ b/README.md @@ -189,6 +189,10 @@ and follow the [README](tutorial/README.md). - set any other settings (e.g., a maximum number of events to process, useful for quick tests) - execute the analysis + - the input is a config file, which contains a list of files to analyze + together with settings such as beam energy and Q2 ranges; see + [doc/example.config](doc/example.config) for an example config file and + more details - the output will be a `root` file, filled with `TObjArray`s of histograms - each `TObjArray` can be for a different subset of events (bin), e.g., diff --git a/config.mk b/config.mk index ccc62ef4..b90f0adf 100644 --- a/config.mk +++ b/config.mk @@ -16,6 +16,9 @@ DEPS = -I$(shell root-config --incdir) LIBS = $(shell root-config --glibs) #LIBS += -lMinuit -lRooFitCore -lRooFit -lRooStats -lProof -lMathMore +# Miscellaneous +LIBS += -lfmt + # DELPHES ifdef EXCLUDE_DELPHES FLAGS += -DEXCLUDE_DELPHES diff --git a/datarec/xsec/xsec.dat b/datarec/xsec/xsec.dat index c2805233..d1d64305 100644 --- a/datarec/xsec/xsec.dat +++ b/datarec/xsec/xsec.dat @@ -32,3 +32,4 @@ pythia6:ep-10x100-q2-high 1.159e+03 0.0114 # 100 < Q2 pythia6:ep-18x275 8.830e+05 0.0011 # general Q2 pythia6:ep-18x275-q2-low 8.796e+05 0.0006 # 1 < Q2 < 100 pythia6:ep-18x275-q2-high 3.092e+03 0.0475 # 100 < Q2 +pythia6:ep-18x275-Lambda 8.830e+05 0.0011 # FIXME: assuming general Q2 diff --git a/doc/example.config b/doc/example.config new file mode 100644 index 00000000..1b39773c --- /dev/null +++ b/doc/example.config @@ -0,0 +1,67 @@ +############################################################ +# EXAMPLE CONFIGURATION FILE +############################################################ + +#----------------------------------------------------------- +# This is an example config file +# +# This file can be used as a template, but it is easier to +# auto-generate config files using scripts in `s3tools/`; see +# `s3tools/README.md` for more details +# +# Syntax and Parsing +# - if the first character is ':', it is a setting: the name of +# the parameter together with a value, separated by a space +# - settings are generally optional; if you don't specify +# a setting, it will take a default value, likely set in +# `src/Analysis.cxx` +# - any text after '#' is ignored; use this for comments +# - if none of the above, it is an input file +# - input files can be grouped together by Q2 range +# - each Q2 range includes a cross section, used for weights +# when combining data from multiple Q2 ranges +# - files can be either local, or URLs on S3 +#----------------------------------------------------------- + + +# Global Settings: these settings apply to all of the files in this config file +# =============== +:eleBeamEn 10 # beam energies, in GeV +:ionBeamEn 100 +:crossingAngle -25 # crossing angle, in mrad +:totalCrossSection 555660.0 # total cross section, needed for Q2 weights; this may be the same + # cross section as your least-strict Q2 range (e.g., Q2>1) + + +# Group Settings: these settings are specific for each Q2 range +# ============== +# NOTE: they must be sorted by increasing strictness +# of Q2 cuts, or at least by decreasing cross section + +# Q2 range 1 +:q2min 1.0 +#:q2max 100.0 # specify a Q2 maximum, if you need one +:crossSection 555660.0 # cross section +datarec/10x100/minQ2=1/file1.root # list of local files +datarec/10x100/minQ2=1/file2.root +datarec/10x100/minQ2=1/file3.root +datarec/10x100/minQ2=1/file4.root +datarec/10x100/minQ2=1/file5.root + +# to start a new group, specify a new Q2 range and cross section +# Q2 range 2 +:q2min 10.0 +:crossSection 40026.0 +datarec/10x100/minQ2=10/file1.root +datarec/10x100/minQ2=10/file2.root +#datarec/10x100/minQ2=10/file3.root # comment out a bad file +datarec/10x100/minQ2=10/file4.root +datarec/10x100/minQ2=10/file5.root + +# to stream from S3, use s3https URLS +# Q2 range 3 +:q2min 100.0 +:crossSection 1343.0 +s3https://dtn01.sdcc.bnl.gov:9000/eictest/EPIC/____/____/10x100/minQ2=100/file1.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/EPIC/____/____/10x100/minQ2=100/file2.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/EPIC/____/____/10x100/minQ2=100/file3.root diff --git a/macro/analysis_PvsEta.C b/macro/analysis_PvsEta.C index 58abb54a..7eb4c5e9 100644 --- a/macro/analysis_PvsEta.C +++ b/macro/analysis_PvsEta.C @@ -5,19 +5,13 @@ R__LOAD_LIBRARY(Sidis-eic) * - observe how the resulting histograms differ in each (x,Q2) bin */ void analysis_PvsEta( - TString infiles="datarec/in.config", /* delphes tree(s) */ - Double_t eleBeamEn=10, /* electron beam energy [GeV] */ - Double_t ionBeamEn=100, /* ion beam energy [GeV] */ - Double_t crossingAngle=-25, /* crossing angle [mrad] */ + TString configFile="datarec/in.config", /* delphes tree(s) */ TString outfilePrefix="coverage_pVsEtabins" /* output filename prefix*/ ) { // setup analysis ======================================== AnalysisDelphes *A = new AnalysisDelphes( - infiles, - eleBeamEn, - ionBeamEn, - crossingAngle, + configFile, outfilePrefix ); diff --git a/macro/analysis_asymmetry.C b/macro/analysis_asymmetry.C index f8b2657c..47bbd5f6 100644 --- a/macro/analysis_asymmetry.C +++ b/macro/analysis_asymmetry.C @@ -41,19 +41,13 @@ struct WeightsTest : public WeightsSivers { }; void analysis_asymmetry( - TString infiles="datarec/in.config", /* delphes tree(s) */ - Double_t eleBeamEn=5, /* electron beam energy [GeV] */ - Double_t ionBeamEn=41, /* ion beam energy [GeV] */ - Double_t crossingAngle=-25, /* crossing angle [mrad] */ + TString configFile="datarec/in.config", /* delphes tree(s) */ TString outfilePrefix="asymmetry" /* output filename prefix*/ ) { // setup analysis ======================================== AnalysisDelphes *A = new AnalysisDelphes( - infiles, - eleBeamEn, - ionBeamEn, - crossingAngle, + configFile, outfilePrefix ); Weights* weights = new WeightsSum({ diff --git a/macro/analysis_coverage.C b/macro/analysis_coverage.C index 92f8e085..ae661ef7 100644 --- a/macro/analysis_coverage.C +++ b/macro/analysis_coverage.C @@ -5,19 +5,13 @@ R__LOAD_LIBRARY(Sidis-eic) * - observe how the resulting histograms differ in each (x,Q2) bin */ void analysis_coverage( - TString infiles="datarec/in.config", /* delphes tree(s) */ - Double_t eleBeamEn=5, /* electron beam energy [GeV] */ - Double_t ionBeamEn=41, /* ion beam energy [GeV] */ - Double_t crossingAngle=-25, /* crossing angle [mrad] */ + TString configFile="datarec/in.config", /* delphes tree(s) */ TString outfilePrefix="coverage" /* output filename prefix*/ ) { // setup analysis ======================================== AnalysisDelphes *A = new AnalysisDelphes( - infiles, - eleBeamEn, - ionBeamEn, - crossingAngle, + configFile, outfilePrefix ); diff --git a/macro/analysis_phi_crosscheck.C b/macro/analysis_phi_crosscheck.C index cb6c872a..b39a8ae9 100644 --- a/macro/analysis_phi_crosscheck.C +++ b/macro/analysis_phi_crosscheck.C @@ -1,19 +1,13 @@ R__LOAD_LIBRARY(Sidis-eic) void analysis_phi_crosscheck( - TString infiles="datarec/tutorial.config", /* list of input files */ - Double_t eleBeamEn=5, /* electron beam energy [GeV] */ - Double_t ionBeamEn=41, /* ion beam energy [GeV] */ - Double_t crossingAngle=-25, /* crossing angle [mrad] */ + TString configFile="datarec/tutorial.config", /* list of input files */ TString outfilePrefix="phi.crosscheck" /* output filename prefix*/ ) { // setup analysis ======================================== AnalysisDelphes *A = new AnalysisDelphes( - infiles, - eleBeamEn, - ionBeamEn, - crossingAngle, + configFile, outfilePrefix ); diff --git a/macro/analysis_purity.C b/macro/analysis_purity.C index 8bf6d583..3c26c163 100644 --- a/macro/analysis_purity.C +++ b/macro/analysis_purity.C @@ -2,22 +2,15 @@ R__LOAD_LIBRARY(Sidis-eic) // ratios of histograms with y-cut enabled to those with y-cut disabled void analysis_purity( - TString infiles="datarec/in.config", /* delphes tree(s) */ - Double_t eleBeamEn=5, /* electron beam energy [GeV] */ - Double_t ionBeamEn=41, /* ion beam energy [GeV] */ - Double_t crossingAngle=-25, /* crossing angle [mrad] */ + TString configFile="datarec/in.config", /* delphes tree(s) */ TString methodname="ele", /*reconstruction method name*/ TString outfilePrefix="resolutions" /* output filename prefix*/ - ) { //outfilePrefix+="_DA"; // setup analysis ======================================== AnalysisDelphes *A = new AnalysisDelphes( - infiles, - eleBeamEn, - ionBeamEn, - crossingAngle, + configFile, outfilePrefix+"_"+methodname ); diff --git a/macro/ci/analysis_p_eta.C b/macro/ci/analysis_p_eta.C index 8feb3ea7..4cf5adb0 100644 --- a/macro/ci/analysis_p_eta.C +++ b/macro/ci/analysis_p_eta.C @@ -2,20 +2,17 @@ R__LOAD_LIBRARY(Sidis-eic) // analysis in bins of (p,eta) void analysis_p_eta( - TString infiles="datarec/canyonlands-v1.2/5x41/files.config", // default, for manual local testing - Double_t eleBeamEn=5, - Double_t ionBeamEn=41, - Double_t crossingAngle=-25, - TString outfilePrefix="coverage.fullsim", + TString configFile, + TString outfilePrefix, TString reconMethod="Ele" ) { // setup analysis ======================================== Analysis *A; - if (outfilePrefix.Contains("athena")) A = new AnalysisAthena( infiles, eleBeamEn, ionBeamEn, crossingAngle, outfilePrefix ); - else if(outfilePrefix.Contains("ecce")) A = new AnalysisEcce( infiles, eleBeamEn, ionBeamEn, crossingAngle, outfilePrefix ); + if (outfilePrefix.Contains("athena")) A = new AnalysisAthena( configFile, outfilePrefix ); + else if(outfilePrefix.Contains("ecce")) A = new AnalysisEcce( configFile, outfilePrefix ); #ifndef EXCLUDE_DELPHES - else A = new AnalysisDelphes( infiles, eleBeamEn, ionBeamEn, crossingAngle, outfilePrefix ); + else A = new AnalysisDelphes( configFile, outfilePrefix ); #endif A->SetReconMethod(reconMethod); // set reconstruction method diff --git a/macro/ci/analysis_x_q2.C b/macro/ci/analysis_x_q2.C index 4eb01516..f52b1f49 100644 --- a/macro/ci/analysis_x_q2.C +++ b/macro/ci/analysis_x_q2.C @@ -2,24 +2,18 @@ R__LOAD_LIBRARY(Sidis-eic) // analysis in bins of (x,Q2) void analysis_x_q2( - TString infiles="testconfig/delphes.config", // default, for manual local testing of fastsim - // TString infiles="testconfig/s3files.config", // default, for manual local testing of fullsim - Double_t eleBeamEn=10, - Double_t ionBeamEn=100, - Double_t crossingAngle=-25, - TString outfilePrefix="resolution.fastsim", - // TString outfilePrefix="resolution.fullsim", - // TString outfilePrefix="coverage.fastsim", - // TString outfilePrefix="coverage.fullsim", + TString configFile, + TString outfilePrefix, TString reconMethod="Ele" -) { + ) +{ // setup analysis ======================================== Analysis *A; - if (outfilePrefix.Contains("athena")) A = new AnalysisAthena( infiles, eleBeamEn, ionBeamEn, crossingAngle, outfilePrefix ); - else if(outfilePrefix.Contains("ecce")) A = new AnalysisEcce( infiles, eleBeamEn, ionBeamEn, crossingAngle, outfilePrefix ); + if (outfilePrefix.Contains("athena")) A = new AnalysisAthena( configFile, outfilePrefix ); + else if(outfilePrefix.Contains("ecce")) A = new AnalysisEcce( configFile, outfilePrefix ); #ifndef EXCLUDE_DELPHES - else A = new AnalysisDelphes( infiles, eleBeamEn, ionBeamEn, crossingAngle, outfilePrefix ); + else A = new AnalysisDelphes( configFile, outfilePrefix ); #endif A->SetReconMethod(reconMethod); // set reconstruction method diff --git a/macro/ci/analysis_yRatio.C b/macro/ci/analysis_yRatio.C index 96f90820..974b0f53 100644 --- a/macro/ci/analysis_yRatio.C +++ b/macro/ci/analysis_yRatio.C @@ -2,20 +2,17 @@ R__LOAD_LIBRARY(Sidis-eic) // ratios of histograms with y-cut enabled to those with y-cut disabled void analysis_yRatio( - TString infiles, - Double_t eleBeamEn, - Double_t ionBeamEn, - Double_t crossingAngle, + TString configFile, TString outfilePrefix, TString reconMethod="Ele" ) { // setup analysis ======================================== Analysis *A; - if (outfilePrefix.Contains("athena")) A = new AnalysisAthena( infiles, eleBeamEn, ionBeamEn, crossingAngle, outfilePrefix ); - else if(outfilePrefix.Contains("ecce")) A = new AnalysisEcce( infiles, eleBeamEn, ionBeamEn, crossingAngle, outfilePrefix ); + if (outfilePrefix.Contains("athena")) A = new AnalysisAthena( configFile, outfilePrefix ); + else if(outfilePrefix.Contains("ecce")) A = new AnalysisEcce( configFile, outfilePrefix ); #ifndef EXCLUDE_DELPHES - else A = new AnalysisDelphes( infiles, eleBeamEn, ionBeamEn, crossingAngle, outfilePrefix ); + else A = new AnalysisDelphes( configFile, outfilePrefix ); #endif A->SetReconMethod(reconMethod); // set reconstruction method diff --git a/macro/ci/delphes.config b/macro/ci/delphes.config deleted file mode 100644 index c86d662f..00000000 --- a/macro/ci/delphes.config +++ /dev/null @@ -1 +0,0 @@ -1 5.5566e+05 /data/example_10x100.root 0 diff --git a/macro/ci/localtest.sh b/macro/ci/localtest.sh deleted file mode 100755 index 4405357e..00000000 --- a/macro/ci/localtest.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash -# sandbox for local tests and development; not executed by CI - -### reset -# rm -rv out/*; touch out/.keep - -### beam energy -# e=10; p=100 -e=18; p=275 - -### high stats comparisons -fastconfig="datarec/arc/fastS3/${e}x${p}/delphes.config" -fullconfig="datarec/deathvalley-v1.0/${e}x${p}/files.config" - -### loop over recon methods -for recon in ele jb da; do -# for recon in ele; do - root -b -q 'macro/ci/analysis_x_q2.C("'$fastconfig'",'$e','$p',-25,"xq.'$recon'.fastsim","'$recon'")' & - root -b -q 'macro/ci/analysis_x_q2.C("'$fullconfig'",'$e','$p',-25,"xq.'$recon'.fullsim","'$recon'")' & - wait - root -b -q 'macro/ci/comparator.C("out/xq.'$recon'.fastsim.root","out/xq.'$recon'.fullsim.root","out/resolution.fastfull.'$recon'.root")' - root -b -q 'macro/ci/comparator.C("out/xq.'$recon'.fastsim.root","out/xq.'$recon'.fullsim.root","out/coverage.fastfull.'$recon'.root")' -done diff --git a/macro/depolarization/analysis_depolarization.C b/macro/depolarization/analysis_depolarization.C index 5fdf76d2..44f7e6da 100644 --- a/macro/depolarization/analysis_depolarization.C +++ b/macro/depolarization/analysis_depolarization.C @@ -6,19 +6,14 @@ void analysis_depolarization( /**/ Double_t eleBeamEn=18, Double_t ionBeamEn=275, - /**/ - Double_t crossingAngle=-25 ) { - TString infiles = Form("datarec/delphes.%dx%d.config",(int)eleBeamEn,(int)ionBeamEn); + TString configFile = Form("datarec/delphes.%dx%d.config",(int)eleBeamEn,(int)ionBeamEn); TString outfilePrefix = Form("depol.%dx%d",(int)eleBeamEn,(int)ionBeamEn); AnalysisDelphes *A = new AnalysisDelphes( - infiles, - eleBeamEn, - ionBeamEn, - crossingAngle, + configFile, outfilePrefix ); diff --git a/macro/old/analysis_xsecPT.C b/macro/old/analysis_xsecPT.C index 510debde..35ac983d 100644 --- a/macro/old/analysis_xsecPT.C +++ b/macro/old/analysis_xsecPT.C @@ -3,19 +3,13 @@ R__LOAD_LIBRARY(Sidis-eic) // cross section in pT bins void analysis_xsecPT( - TString infiles="datarec/arc/crossCheck*.root", /* delphes tree(s) */ - Double_t eleBeamEn=5, /* electron beam energy [GeV] */ - Double_t ionBeamEn=41, /* ion beam energy [GeV] */ - Double_t crossingAngle=0, /* crossing angle [mrad] */ + TString configFile="datarec/arc/crossCheck*.root", /* delphes tree(s) */ TString outfilePrefix="xsecPT" /* output filename prefix*/ ) { // setup analysis ======================================== AnalysisDelphes *A = new AnalysisDelphes( - infiles, - eleBeamEn, - ionBeamEn, - crossingAngle, + configFile, outfilePrefix ); diff --git a/macro/old/analysis_xsecQ.C b/macro/old/analysis_xsecQ.C index 4c05f4c4..6ee75922 100644 --- a/macro/old/analysis_xsecQ.C +++ b/macro/old/analysis_xsecQ.C @@ -3,19 +3,13 @@ R__LOAD_LIBRARY(Sidis-eic) // cross section in Q2 bins void analysis_xsecQ( - TString infiles="datarec/arc/crossCheck*.root", /* delphes tree(s) */ - Double_t eleBeamEn=5, /* electron beam energy [GeV] */ - Double_t ionBeamEn=41, /* ion beam energy [GeV] */ - Double_t crossingAngle=0, /* crossing angle [mrad] */ + TString configFile="datarec/arc/crossCheck*.root", /* delphes tree(s) */ TString outfilePrefix="xsecQ" /* output filename prefix*/ ) { // setup analysis ======================================== AnalysisDelphes *A = new AnalysisDelphes( - infiles, - eleBeamEn, - ionBeamEn, - crossingAngle, + configFile, outfilePrefix ); diff --git a/macro/q2_distribution.C b/macro/q2_distribution.C new file mode 100644 index 00000000..d27f598b --- /dev/null +++ b/macro/q2_distribution.C @@ -0,0 +1,58 @@ +R__LOAD_LIBRARY(Sidis-eic) + +/* draw Q2 distribution, useful to check Q2 weights + */ +void q2_distribution( + TString configFile="datarec/delphes/5x41/delphes.config", TString outfilePrefix="q2dist.delphes.5x41" + // TString configFile="datarec/delphes/10x100/delphes.config", TString outfilePrefix="q2dist.delphes.10x100" + // TString configFile="datarec/delphes/18x275/delphes.config", TString outfilePrefix="q2dist.delphes.18x275" + // TString configFile="datarec/ecce/22.1/5x41/files.config", TString outfilePrefix="q2dist.ecce.5x41" + // TString configFile="datarec/ecce/22.1/10x100/files.config", TString outfilePrefix="q2dist.ecce.10x100" + // TString configFile="datarec/ecce/22.1/18x275/files.config", TString outfilePrefix="q2dist.ecce.18x275" +) { + + // setup analysis + Analysis *A; + if (configFile.Contains("athena")) + A = new AnalysisAthena(configFile, outfilePrefix); + else if(configFile.Contains("ecce")) + A = new AnalysisEcce(configFile, outfilePrefix); + else + A = new AnalysisDelphes(configFile, outfilePrefix); + + // settings + A->SetReconMethod("Ele"); + // A->maxEvents = 10000; // limiter + + // cuts + A->AddBinScheme("w"); A->BinScheme("w")->BuildBin("Min",3.0); // W > 3 GeV + A->AddBinScheme("y"); A->BinScheme("y")->BuildBin("Range",0.01,0.95); // 0.01 < y < 0.95 + A->AddBinScheme("z"); A->BinScheme("z")->BuildBin("Range",0.2,0.9); // 0.2 < z < 0.9 + A->AddBinScheme("xF"); A->BinScheme("xF")->BuildBin("Min",0.0); // xF > 0 + A->AddBinScheme("ptLab"); A->BinScheme("ptLab")->BuildBin("Min",0.1); // pT_lab > 0.1 GeV (tracking limit) + + // final states + A->AddFinalState("pipTrack"); + + // analyze + A->Execute(); + + // draw Q2 distributions, in both linear and log scale + auto P = new PostProcessor("out/"+outfilePrefix+".root"); + auto Draw = [&P] (Histos *H) { + auto hist = H->Hist("Q2"); + auto canv = new TCanvas("q2canv","q2canv",1600,800); + canv->Divide(2,1); + for(int pad=1; pad<=2; pad++) { + canv->cd(pad); + canv->GetPad(pad)->SetGrid(1,1); + canv->GetPad(pad)->SetLogx(); + if(pad==2) canv->GetPad(pad)->SetLogy(); + hist->Draw(); + } + canv->SaveAs(P->GetPngDir()+"/q2dist.png"); + }; + P->Op()->Payload(Draw); + P->Execute(); + P->Finish(); +} diff --git a/s3tools/README.md b/s3tools/README.md index 71cc7ac6..a26e92e9 100644 --- a/s3tools/README.md +++ b/s3tools/README.md @@ -13,7 +13,8 @@ One top-level script automates all the work: - running with no arguments will print the usage guide - output: - config file, with file names, Q2 minima, and cross sections; used as - input to the analysis macros + input to the analysis macros; see [doc/example.config](../doc/example.config) + for a sample config file - the downloaded full simulation files, if you chose to download from S3 - this script contains some settings such as directory paths to data on S3, for the convenience of SIDIS full simulation analysis @@ -39,7 +40,7 @@ Two options: - similar to full simulations, you need to have the S3 access and secret environment variables set in order to download `hepmc` files - alternatively, if you already have a directory of Delphes output ROOT files, - use use `make-fastsim-local-config.sh` to create a config file + use `make-fastsim-local-config.sh` to create a config file ## Accessing S3 Files - first, download the [MinIO client](https://docs.min.io/docs/minio-client-complete-guide) @@ -67,23 +68,9 @@ Next we need to make a "config file", which consists of the file name, and additional columns such as cross section and minimum Q2. Follow the next sections, whether you plan to stream from S3 or download. -### Config File Format -The config files require the following columns, in this order: -- file name (relative to the top-level directory, unless you use an absolute - path) -- the number of events for the weighting and cross section - - set to `0` for all - - this is not related to `Analysis::maxEvents`, which limits how - many events to process -- cross section (can be obtained from Pythia output logs, for example) -- minimum Q2 - -**Patch**: the above format is the original format, however, the current minimum Q2 -weighting implementation requires a new format. In case we revert to using the -above old format, we temporarily use the script `reformat-config.sh` to -transform the above old format into the new format. See comments in -`reformat-config.sh` for details. Execute: - - `s3tools/reformat-config.sh files.config files.new.config` +The config file includes settings such as beam energy, cross sections, and +Q2 ranges. See [doc/example.config](../doc/example.config) for an example +config file, and documentation. ### Cross Sections - cross sections are stored in `datarec/xsec/xsec.dat`; use `read-xsec-table.sh` @@ -103,14 +90,7 @@ transform the above old format into the new format. See comments in To stream, we need to make a list of URLs. - run `generate-s3-list.sh` to generate a list of files - running it with no arguments will print the usage and required arguments - - the file list should appear in `stdout`; pipe the output somewhere, for example: - - directly to a text file: - `generate-s3-list.sh S3/.../... > files.txt` - - add columns for `numEvents` (0, for all events), cross section (3e-4), and - Q2min (1), to build a "config" file for an analysis: - `generate-s3-list.sh S3/.../... 0 3e-4 1 > files.config` - - use `grep` to remove files that have `"OLD"` in their filename: - `generate-s3-list.sh S3/.../... 0 3e-4 1 | grep -v OLD > files.config` + - the file list should appear in `stdout`; pipe the output somewhere, for example, a text file ### Download from S3 Instead of URLs, we make a list of local files, together with the columns needed to diff --git a/s3tools/generate-config-file.rb b/s3tools/generate-config-file.rb new file mode 100755 index 00000000..a0799a8b --- /dev/null +++ b/s3tools/generate-config-file.rb @@ -0,0 +1,107 @@ +#!/usr/bin/env ruby +# generate a config file, from a set of `list` files +# this script is generally called by `s3tools/make-*-config.sh` scripts + +require 'pp' + +# constants +CrossingAngle = -25 # default beam crossing angle [mrad] + +# usage guide +if ARGV.length < 3 + puts "ERROR: not enough arguments" if ARGV.length > 0 + puts """ + USAGE: #{$0} [config_file] [energy] [list_files...] + + [config_file]: name of output config file + [energy]: beam energy, such as 5x41 or 10x100 + [list_files...]: list of \"list files\", generated by one of the + `s3tools/generate-*-list.sh` scripts + """ + exit 2 +end + +# parse arguments +globalSettings = Hash.new +configFile = ARGV[0] +globalSettings[:eleBeamEn], globalSettings[:ionBeamEn] = ARGV[1].split('x').map{ |e| e.gsub /-.*/, '' } +listFiles = ARGV[2..] +globalSettings[:crossingAngle] = CrossingAngle +puts "="*50, "generating config file".upcase, "="*50 +puts "configFile: #{configFile}" +pp "globalSettings:", globalSettings +pp "listFiles:", listFiles + +# parse list files, forming groups keyed by `[Q2min,Q2max]` +groupSettings = Hash.new +listFiles.map{ |f| File.open(f,'r').readlines }.each do |listFileLines| + # parse the list files + listFileLines.each do |line| + # tokenize; these must be consistent with `generate-*.list.sh` columns + rootFile, crossSection, q2min, q2max = line.split.map do |token| + token.match?(/\.root$/) ? token : token.to_f # assume `token` is a number, if not a ROOT file + end + # create a unique key for this Q2 range + q2key = "#{q2min},#{q2max}" + # fill `groupSettings[q2key]` + unless groupSettings.has_key? q2key + groupSettings[q2key] = Hash.new + groupSettings[q2key][:files] = Array.new + groupSettings[q2key][:q2min], groupSettings[q2key][:q2max] = q2key.split(',').map &:to_f + groupSettings[q2key][:crossSection] = crossSection.to_f + end + groupSettings[q2key][:files] << rootFile + puts "ERROR: conflicting cross section" if crossSection!=groupSettings[q2key][:crossSection] + end +end +# puts "\ngroupSettings:" +# pp groupSettings + +# sort groups by decreasing cross section +groupSettingsSorted = groupSettings.sort_by{ |s| s.last[:crossSection] }.reverse.to_h +puts "\ngroupSettings, sorted by cross section:" +pp groupSettingsSorted + +# assume the largest cross section is the total cross section (may not always be true!) +globalSettings[:totalCrossSection] = groupSettings.values.map{ |s| s[:crossSection] }.max + +# start config file +configOut = File.open configFile, 'w' +writeSetting = Proc.new{ |k,v| configOut.puts ":#{k} #{v}" } +configOut.puts "\#"*60 +configOut.puts "\# configuration file, auto-generated from:".upcase +listFiles.each{ |f| configOut.puts "\# #{f}" } +configOut.puts "\#"*60 + +# write global settings +configOut.puts """ +\# Global Settings +\# =============== +""" +globalSettings.each{ |k,v| writeSetting.call k, v } + +# write group settings +configOut.puts """ +\# Group Settings | NOTE: they must be sorted by increasing strictness +\# ============== | of Q2 cuts, or at least by decreasing cross section +""" +groupSettingsSorted.values.each_with_index do |settingsHash,i| + configOut.puts "\n\# Q2 range #{i+1}" + settingsHash.each do |key,value| + unless key == :files + next if key==:q2max and value==0.0 # skip case with no q2max + writeSetting.call key, value + end + end + settingsHash[:files].each{ |f| configOut.puts f } +end + +# cleanup +configOut.close +puts """ +#{"="*50} +CONFIG FILE: #{configFile} +#{"="*50} +""" +system "cat #{configFile}" +puts "="*50, "PRODUCED CONFIG FILE #{configFile}\n\n" diff --git a/s3tools/make-athena-config.sh b/s3tools/make-athena-config.sh index 6a03d3db..f0e39787 100755 --- a/s3tools/make-athena-config.sh +++ b/s3tools/make-athena-config.sh @@ -12,9 +12,9 @@ releaseDir="S3/eictest/ATHENA/RECO/$release/DIS/NC" ####################################################### # usage: -if [ $# -lt 2 ]; then +if [ $# -lt 3 ]; then echo """ - USAGE: $0 [energy] [mode(d/s/c)] [limit(optional)] [outputFile(optional)] + USAGE: $0 [energy] [local_dir] [mode] [limit(optional)] [config_file(optional)] - [energy]: 5x41 | - see below for available datasets 5x100 | - data from different Q2minima are combined, @@ -22,6 +22,8 @@ if [ $# -lt 2 ]; then 10x275 18x275 + - [local_dir]: output directory name: datarec/[local_dir] + - [mode]: s - make config file for streaming from S3 d - download from S3, then make the local config file c - just make the local config file, for local files @@ -29,13 +31,9 @@ if [ $# -lt 2 ]; then - [limit] integer>0 : only stream/download this many files per Q2 min 0 : stream/download all files default=5 - - - [outputFile]: output file name (optional) - - default name is based on release version - - relative paths will be relative to main dir - - Examples: $0 5x41 d # download - $0 18x275 s # stream + + - [config_file] name of the config file; if not specified, the + config file will be in datarec/[local_dir] See script for local and remote file path settings; they are configured for a specific set of data, but you may want to change @@ -49,19 +47,21 @@ if [ $# -lt 2 ]; then exit 2 fi energy=$1 -mode=$2 +locDir=$2 +mode=$3 limit=5 -outFile="" -if [ $# -ge 3 ]; then limit=$3; fi -if [ $# -ge 4 ]; then outFile=$4; fi +configFile="" +if [ $# -ge 4 ]; then limit=$4; fi +if [ $# -ge 5 ]; then configFile=$5; fi # cd to the main directory pushd $(dirname $(realpath $0))/.. # settings ############################################################# sourceDir="$releaseDir/$energy" -targetDir="datarec/athena/$release/$energy" -Q2minima=( 1000 100 10 1 ) # should be decreasing order +targetDir="datarec/$locDir/$release/$energy" +Q2minima=( 1000 100 10 1 ) +Q2max=0 # no maximum ######################################################################## # download files from S3 @@ -80,29 +80,24 @@ fi # build a config file status "build config file..." mkdir -p $targetDir -if [ -z "$outFile" ]; then configFile=$targetDir/files.config -else configFile=$outFile; fi -> $configFile +if [ -z "$configFile" ]; then configFile=$targetDir/files.config; fi +> $configFile.list for Q2min in ${Q2minima[@]}; do crossSection=$(s3tools/read-xsec-table.sh "pythia8:$energy/minQ2=$Q2min") if [ "$mode" == "d" -o "$mode" == "c" ]; then - s3tools/generate-local-list.sh "$targetDir/minQ2=$Q2min" 0 $crossSection $Q2min | tee -a $configFile + s3tools/generate-local-list.sh "$targetDir/minQ2=$Q2min" $crossSection $Q2min $Q2max | tee -a $configFile.list elif [ "$mode" == "s" ]; then if [ $limit -gt 0 ]; then - s3tools/generate-s3-list.sh "$sourceDir/minQ2=$Q2min" 0 $crossSection $Q2min | head -n$limit | tee -a $configFile + s3tools/generate-s3-list.sh "$sourceDir/minQ2=$Q2min" $crossSection $Q2min $Q2max | head -n$limit | tee -a $configFile.list else - s3tools/generate-s3-list.sh "$sourceDir/minQ2=$Q2min" 0 $crossSection $Q2min | tee -a $configFile + s3tools/generate-s3-list.sh "$sourceDir/minQ2=$Q2min" $crossSection $Q2min $Q2max | tee -a $configFile.list fi else echo "ERROR: unknown mode" exit 1 fi done - -# PATCH: convert config file to one-line-per-Q2min format -status "reformatting config file to one-line-per-Q2min format..." -mv -v $configFile{,.bak} -s3tools/reformat-config.sh $configFile{.bak,} +s3tools/generate-config-file.rb $configFile $energy $configFile.list # output some info #status "files in target directory:" @@ -110,10 +105,8 @@ s3tools/reformat-config.sh $configFile{.bak,} popd status "done building config file at:" echo " $configFile" -status "run root macros with parameters:" -echo " '(\"$configFile\",$(echo $energy|sed 's/x/,/'))'" echo "" -if [ -n "$(grep UNKNOWN $configFile)" ]; then +if [ -n "$(grep UNKNOWN $configFile.list)" ]; then >&2 echo "ERROR: missing some cross sections" exit 1 fi diff --git a/s3tools/make-ecce-config.sh b/s3tools/make-ecce-config.sh index b9bda9f4..4553dad1 100755 --- a/s3tools/make-ecce-config.sh +++ b/s3tools/make-ecce-config.sh @@ -30,10 +30,10 @@ esac eventEvalFileRegex='.*g4event_eval.root' # usage: -if [ $# -lt 2 ]; then +if [ $# -lt 3 ]; then echo "Querying S3 for available data directories..." echo """ - USAGE: $0 [energy] [mode(d/s/c)] [limit(optional)] [outputFile(optional)] + USAGE: $0 [energy] [local_dir] [mode] [limit(optional)] [config_file(optional)] - [energy]: beam energies; data from differing Q2 ranges are combined automatically, weighted by cross sections @@ -43,6 +43,8 @@ if [ $# -lt 2 ]; then $(mc ls $releaseDir | sed 's;.* ep-; ;' | sed 's;/$;;' | sed 's;-.*;;g' | uniq ) ======================== + - [local_dir]: output directory name: datarec/[local_dir] + - [mode]: s - make config file for streaming from S3 d - download from S3, then make the local config file c - just make the local config file, for local files @@ -50,13 +52,9 @@ $(mc ls $releaseDir | sed 's;.* ep-; ;' | sed 's;/$;;' | sed 's;- - [limit] integer>0 : only stream/download this many files per Q2 min 0 : stream/download all files default=5 - - - [outputFile]: output file name (optional) - - default name is based on release version - - relative paths will be relative to main dir - - Examples: $0 5x41 d # download - $0 18x275 s # stream + + - [config_file] name of the config file; if not specified, the + config file will be in datarec/[local_dir] See script for local and remote file path settings; they are configured for a specific set of data, but you may want to change @@ -66,23 +64,28 @@ $(mc ls $releaseDir | sed 's;.* ep-; ;' | sed 's;/$;;' | sed 's;- release: $release releaseDir: $releaseDir eventEvalDir: $eventEvalDir + + NOTE: Lambda directories are ignored, but if you want one, append + '-Lambda' to [energy]; for example: + $0 18x275-Lambda ecce.lambdas s 3 """ exit 2 fi energy=$1 -mode=$2 +locDir=$2 +mode=$3 limit=5 -outFile="" -if [ $# -ge 3 ]; then limit=$3; fi -if [ $# -ge 4 ]; then outFile=$4; fi +configFile="" +if [ $# -ge 4 ]; then limit=$4; fi +if [ $# -ge 5 ]; then configFile=$5; fi ### get list of subdirectories associated to this beam energy; each subdirectory has a different Q2 range echo "Querying S3 for available data directories..." -subdirListUnsorted=$(mc ls $releaseDir | grep $energy | awk '{print $NF}' | sed 's;/$;;') -### sort in order of decreasing Q2 minimum -function searchSubdirList { echo $subdirListUnsorted | sed 's; ;\n;g' | grep $*; } -subdirList="`searchSubdirList high` `searchSubdirList low` `searchSubdirList -v q2`" # take all 3 directories -# subdirList="`searchSubdirList high` `searchSubdirList -v q2`" # skip the 'q2-low` directory +if [[ "$energy" =~ "-" ]]; then + subdirList=$(mc ls $releaseDir | grep $energy | awk '{print $NF}' | sed 's;/$;;') +else + subdirList=$(mc ls $releaseDir | grep $energy | awk '{print $NF}' | sed 's;/$;;' | grep -v Lambda) +fi printf "\nSubdirectories:\n" for subdir in $subdirList; do echo " $subdir"; done @@ -101,13 +104,18 @@ function getQ2min { else echo 1 # general Q2 fi } +function getQ2max { + if [[ "$1" =~ "q2-low" ]]; then echo 100; + else echo 0 # no maximum + fi +} # set destination directory -targetDir="datarec/ecce/$release/$energy" +targetDir="datarec/$locDir/$release/$energy" # print settings printf "\nsource directories:\n" -for subdir in $subdirList; do echo " $(getSourceDir $subdir) Q2min = $(getQ2min $subdir)"; done +for subdir in $subdirList; do echo " $(getSourceDir $subdir) Q2min = $(getQ2min $subdir) Q2max = $(getQ2max $subdir)"; done echo "targetDir = $targetDir" # download files from S3 @@ -127,31 +135,27 @@ fi # build a config file status "build config file..." mkdir -p $targetDir -if [ -z "$outFile" ]; then configFile=$targetDir/files.config -else configFile=$outFile; fi -> $configFile +if [ -z "$configFile" ]; then configFile=$targetDir/files.config; fi +> $configFile.list for subdir in $subdirList; do crossSection=$(s3tools/read-xsec-table.sh "pythia6:$subdir") sourceDir=$(getSourceDir $subdir) Q2min=$(getQ2min $subdir) + Q2max=$(getQ2max $subdir) if [ "$mode" == "d" -o "$mode" == "c" ]; then - s3tools/generate-local-list.sh "$targetDir/$subdir" 0 $crossSection $Q2min | tee -a $configFile + s3tools/generate-local-list.sh "$targetDir/$subdir" $crossSection $Q2min $Q2max | tee -a $configFile.list elif [ "$mode" == "s" ]; then if [ $limit -gt 0 ]; then - s3tools/generate-s3-list.sh "$sourceDir" 0 $crossSection $Q2min | grep -E $eventEvalFileRegex | head -n$limit | tee -a $configFile + s3tools/generate-s3-list.sh "$sourceDir" $crossSection $Q2min $Q2max | grep -E $eventEvalFileRegex | head -n$limit | tee -a $configFile.list else - s3tools/generate-s3-list.sh "$sourceDir" 0 $crossSection $Q2min | grep -E $eventEvalFileRegex | tee -a $configFile + s3tools/generate-s3-list.sh "$sourceDir" $crossSection $Q2min $Q2max | grep -E $eventEvalFileRegex | tee -a $configFile.list fi else echo "ERROR: unknown mode" exit 1 fi done - -# PATCH: convert config file to one-line-per-Q2min format -status "reformatting config file to one-line-per-Q2min format..." -mv -v $configFile{,.bak} -s3tools/reformat-config.sh $configFile{.bak,} +s3tools/generate-config-file.rb $configFile $energy $configFile.list # output some info #status "files in target directory:" @@ -159,10 +163,8 @@ s3tools/reformat-config.sh $configFile{.bak,} popd status "done building config file at:" echo " $configFile" -status "run root macros with parameters:" -echo " '(\"$configFile\",$(echo $energy|sed 's/x/,/'))'" echo "" -if [ -n "$(grep UNKNOWN $configFile)" ]; then +if [ -n "$(grep UNKNOWN $configFile.list)" ]; then >&2 echo "ERROR: missing some cross sections" exit 1 fi diff --git a/s3tools/make-fastsim-S3-config.sh b/s3tools/make-fastsim-S3-config.sh index 7034432b..533565d5 100755 --- a/s3tools/make-fastsim-S3-config.sh +++ b/s3tools/make-fastsim-S3-config.sh @@ -10,7 +10,7 @@ # usage: if [ $# -lt 3 ]; then echo """ - USAGE: $0 [energy] [local_dir] [mode] [limit(optional)] + USAGE: $0 [energy] [local_dir] [mode] [limit(optional)] [config_file(optional)] provides automation for downloading hepmc files from S3, running Delphes on them (one thread per Q2min), and finally the generation @@ -35,6 +35,9 @@ if [ $# -lt 3 ]; then - default=5 - limit only applies to downloading + - [config_file] name of the config file; if not specified, the + config file will be in datarec/[local_dir] + """ exit 2 fi @@ -42,13 +45,16 @@ energy=$1 locDir=$2 mode=$3 limit=5 +configFile="" if [ $# -ge 4 ]; then limit=$4; fi +if [ $# -ge 5 ]; then configFile=$5; fi # settings -Q2minima=( 1000 100 10 1 ) # should be decreasing order +Q2minima=( 1000 100 10 1 ) +Q2max=0 # no max genDir=datagen/$locDir/$energy recDir=datarec/$locDir/$energy -configFile=$recDir/delphes.config +if [ -z "$configFile" ]; then configFile=$recDir/delphes.config; fi # download hepmc files from S3 function status { echo ""; echo "[+] $1"; } @@ -92,28 +98,19 @@ fi # generate config file if [ "$mode" == "c" -o "$mode" == "a" ]; then + listFiles="" for Q2min in ${Q2minima[@]}; do - status "make config file for $recDir/minQ2=$Q2min" - s3tools/make-fastsim-local-config.sh $energy $Q2min $recDir/minQ2=$Q2min{,/delphes.config} - done - status "concatenate config files to target config file: $configFile" - > $configFile - for Q2min in ${Q2minima[@]}; do - cat $recDir/minQ2=$Q2min/delphes.config >> $configFile + configDir=$recDir/minQ2=$Q2min + configFilePart=$configDir/delphes.config + listFiles="$listFiles $configFilePart.list" + status "make config file for $configDir" + s3tools/make-fastsim-local-config.sh $energy $Q2min $Q2max $configDir $configFilePart done + s3tools/generate-config-file.rb $configFile $energy $listFiles fi # output some info -status "done building config file at:" -echo " $configFile" -status "run root macros with parameters:" -echo " '(\"$configFile\",$(echo $energy|sed 's/x/,/'))'" -echo "" -if [ -n "$(grep UNKNOWN $configFile)" ]; then - >&2 echo "ERROR: missing some cross sections... removing these lines from config file:" - grep UNKNOWN $configFile - mv $configFile{,.tmp} - grep -v UNKNOWN $configFile.tmp > $configFile - rm $configFile.tmp - exit 1 +if [ "$mode" == "c" -o "$mode" == "a" ]; then + status "done building config file at:" + echo " $configFile" fi diff --git a/s3tools/make-fastsim-local-config.sh b/s3tools/make-fastsim-local-config.sh index fbe49844..237123b6 100755 --- a/s3tools/make-fastsim-local-config.sh +++ b/s3tools/make-fastsim-local-config.sh @@ -6,12 +6,13 @@ ################### # usage: -if [ $# -lt 4 ]; then +if [ $# -lt 5 ]; then echo """ - USAGE: $0 [energy] [Q2min] [source_directory] [output_file_name] + USAGE: $0 [energy] [Q2min] [Q2max] [source_directory] [output_file_name] - [energy]: 5x41 5x100 10x100 10x275 18x275 - [Q2min]: 1 10 100 1000 + - [Q2max]: 0 100 ... - [source_directory]: location of fastsim files - [output_file_name]: output config file name @@ -20,8 +21,9 @@ if [ $# -lt 4 ]; then fi energy=$1 Q2min=$2 -sourceDir=$3 -configFile=$4 +Q2max=$3 +sourceDir=$4 +configFile=$5 # cd to the main directory pushd $(dirname $(realpath $0))/.. @@ -29,23 +31,17 @@ pushd $(dirname $(realpath $0))/.. # build a config file function status { echo ""; echo "[+] $1"; } status "build config file..." -> $configFile +> $configFile.list crossSection=$(s3tools/read-xsec-table.sh "pythia8:$energy/minQ2=$Q2min") -s3tools/generate-local-list.sh "$sourceDir" 0 $crossSection $Q2min | tee -a $configFile - -# PATCH: convert config file to one-line-per-Q2min format -status "reformatting config file to one-line-per-Q2min format..." -mv -v $configFile{,.bak} -s3tools/reformat-config.sh $configFile{.bak,} +s3tools/generate-local-list.sh "$sourceDir" $crossSection $Q2min $Q2max | tee -a $configFile.list +s3tools/generate-config-file.rb $configFile $energy $configFile.list # output some info popd status "done building config file at:" echo " $configFile" -status "run root macros with parameters:" -echo " '(\"$configFile\",$(echo $energy|sed 's/x/,/'))'" echo "" -if [ -n "$(grep UNKNOWN $configFile)" ]; then +if [ -n "$(grep UNKNOWN $configFile.list)" ]; then >&2 echo "ERROR: missing some cross sections" exit 1 fi diff --git a/s3tools/reformat-config.sh b/s3tools/reformat-config.sh deleted file mode 100755 index 765ad820..00000000 --- a/s3tools/reformat-config.sh +++ /dev/null @@ -1,58 +0,0 @@ -#!/bin/bash - -############# -# reformat a config file into the current required format, which is one line per Q2 minimum -# -# Expected input format: -# - one line per file -# - columns: [filename] [entries] [cross-section] [Q2min] -# -# Expected output format: -# - one line per Q2min, sorted by Q2min -# - columns: [Q2min] [cross-section] [filename_1] [entries_1] [filename_2] [entries_2] ... [filename_N] [entries_N] -# - for the case where there are multiple files for a certain Q2min, only the cross section of the first one will be -# used in the reformatted versio -# -# This is a temporary patch script, and may eventually be removed -# -############# - -if [ $# -ne 2 ]; then - echo "USAGE: $0 [input-file] [output-file]" - exit 2 -fi -inFile=$1 -outFile=$2 -> $outFile -echo "reformatting $inFile -> $outFile" - -# rearrange columns: [filename] [entries] [cross-section] [Q2min] -> [Q2min] [cross-section] [filename] [entries] -> $inFile.tmp -while read filename entries xsec Q2min; do - echo $Q2min $xsec $filename $entries >> $inFile.tmp -done < $inFile - -# sort by Q2min in decreasing order -sort -nr -o $inFile.tmp{,} - -# merge lines for each value of Q2min -Q2minTmp="-1" -while read Q2min xsec filename entries; do - if [ "$Q2min" -eq "$Q2minTmp" ]; then - #echo " append $filename $entries" - lineOut="$lineOut $filename $entries" - else - if [ "$Q2minTmp" -ne "-1" ]; then - echo " -> output line for Q2min=$Q2minTmp" - echo $lineOut >> $outFile - fi - Q2minTmp="$Q2min" - #echo " append $filename $entries" - lineOut="$Q2min $xsec $filename $entries" - fi -done < $inFile.tmp -echo " -> output line for Q2min=$Q2minTmp" -echo $lineOut >> $outFile - -# cleanup -rm $inFile.tmp diff --git a/src/Analysis.cxx b/src/Analysis.cxx index a8f7f80a..948be0b8 100644 --- a/src/Analysis.cxx +++ b/src/Analysis.cxx @@ -2,30 +2,23 @@ ClassImp(Analysis) -using std::map; -using std::vector; -using std::string; -using std::stringstream; using std::cout; using std::cerr; using std::endl; -using std::ifstream; // constructor Analysis::Analysis( - TString infileName_, - Double_t eleBeamEn_, - Double_t ionBeamEn_, - Double_t crossingAngle_, + TString configFileName_, TString outfilePrefix_ ) - : infileName(infileName_) - , eleBeamEn(eleBeamEn_) - , ionBeamEn(ionBeamEn_) - , crossingAngle(crossingAngle_) + : configFileName(configFileName_) , outfilePrefix(outfilePrefix_) , reconMethod("") , finalStateID("") + , eleBeamEn(10.0) + , ionBeamEn(100.0) + , crossingAngle(-25.0) + , totalCrossSection(1e6) { // available variables for binning // - availableBinSchemes is a map from variable name to variable title @@ -106,115 +99,187 @@ Analysis::Analysis( // input files //------------------------------------ -// add a single file -bool Analysis::AddFile(std::vector fileNames, std::vector entries, Double_t xs, Double_t Q2min) { - cout << "AddFile: " << Q2min << ", " << xs << ", "; - for (string fileName : fileNames) { - cout << fileName << ", "; - } - cout << endl; - // insert in order of Q2min - std::size_t insertIdx = 0; - for (std::size_t idx = 0; idx < infiles.size(); ++idx) { - if (Q2min == Q2mins[idx]) { - cerr << "Q2min " << Q2min << "appears twice in config file" << endl; - return false; - } else if (Q2min < Q2mins[idx]) { - break; - } else { - insertIdx += 1; - } - } - infiles.insert(infiles.begin() + insertIdx, fileNames); - Q2xsecs.insert(Q2xsecs.begin() + insertIdx, xs); - Q2xsecsTot.insert(Q2xsecsTot.begin() + insertIdx, xs); - Q2mins.insert(Q2mins.begin() + insertIdx, Q2min); - inEntries.insert(inEntries.begin() + insertIdx, entries); +// add a group of files +void Analysis::AddFileGroup( + std::vector fileNames, + std::vector entries, + Double_t xs, + Double_t Q2min, + Double_t Q2max + ) +{ + // print + fmt::print("-> AddFileGroup: crossSection={}, Q2range = {} to {}\n", + xs, + Q2min, + Q2max>Q2min ? std::to_string(Q2max) : "inf" + ); + for (auto fileName : fileNames) fmt::print(" - {}\n", fileName); + + // fill vectors + infiles.push_back(fileNames); + Q2xsecs.push_back(xs); + Q2mins.push_back(Q2min); + Q2maxs.push_back(Q2max); + inEntries.push_back(entries); + + // get total entries Long64_t totalEntry = 0; - for (Long64_t entry : entries) { - totalEntry += entry; - } - Q2entries.insert(Q2entries.begin() + insertIdx, totalEntry); - // adjust cross-sections to account for overlapping regions - for (std::size_t idx = infiles.size() - 1; idx > insertIdx; --idx) { - Q2xsecs[insertIdx] -= Q2xsecs[idx]; - } - if (insertIdx > 0) { - Q2xsecs[insertIdx - 1] -= Q2xsecs[insertIdx]; - } - for (std::size_t idx = 0; idx < Q2xsecs.size(); ++idx) { - if (Q2xsecs[idx] < 0.) { - cerr << "Cross-sections must strictly decrease with stricter Q2min cuts" << endl; - return false; + for (Long64_t entry : entries) totalEntry += entry; + Q2entries.push_back(totalEntry); + + // check if the cross section for each group decreases; this is preferred + // to make sure that `GetEventQ2Idx` behaves correctly + for (std::size_t idx = 0; idx+1 < Q2xsecs.size(); ++idx) { + if (Q2xsecs[idx] < Q2xsecs[idx+1] ) { + cerr << "WARNING: Cross-sections should strictly decrease with stricter Q2min cuts; re-arrange your config file" << endl; + PrintStdVector(Q2xsecs," cross sections"); } } + + // lookup table, for tree number -> vector indices inLookup.clear(); std::size_t total = 0; for (std::size_t idx = 0; idx < infiles.size(); ++idx) { total += infiles[idx].size(); inLookup.resize(total, idx); } - return true; } // prepare for the analysis //------------------------------------ void Analysis::Prepare() { - ifstream fin(infileName); - string line; - while (std::getline(fin, line)) { - stringstream ss(line); - std::vector fileNames; + + // parse config file -------------------- + std::ifstream fin(configFileName); + std::string line; + bool debugParser = false; + fmt::print("[+++] PARSING CONFIG FILE {}\n",configFileName); + + // vars + Double_t xsec = totalCrossSection; + Double_t Q2min = 1.0; + Double_t Q2max = 0.0; + std::vector fileNames; + bool readingListOfFiles = false; + + /* lambda to add a list of files to this analysis; wraps `Analysis::AddFileGroup`, + * and checks the files beforehand + */ + auto AddFiles = [this, &fileNames, &xsec, &Q2min, &Q2max] () { + // get the number of entries, and check the file std::vector entries; - Double_t xs, Q2min; - ss >> Q2min >> xs; - if (!ss) { - continue; - } - while (true) { - std::string fileName; - Long64_t entry; - ss >> fileName >> entry; - if (ss) { - fileNames.push_back(fileName); - entries.push_back(entry); - } else { - break; + for(auto fileName : fileNames) { + auto file = TFile::Open(fileName.c_str()); + if (file->IsZombie()) { + fmt::print(stderr,"ERROR: Couldn't open input file '{}'\n",fileName); + return; } - } - for (std::size_t idx = 0; idx < fileNames.size(); ++idx) { - if (entries[idx] <= 0) { - TFile* file = TFile::Open(fileNames[idx].c_str()); - if (file->IsZombie()) { - cerr << "ERROR: Couldn't open input file '" << fileNames[idx] << "'" << endl; - return; - } - TTree* tree = file->Get("Delphes"); - if (tree == nullptr) tree = file->Get("events"); - if (tree == nullptr) tree = file->Get("event_tree"); - if (tree == nullptr) { - cerr << "ERROR: Couldn't find Delphes or events tree in file '" << fileNames[idx] << "'" << endl; - entries[idx] = 0; - } - else entries[idx] = tree->GetEntries(); - file->Close(); + TTree *tree = file->Get("Delphes"); // fastsim + if (tree == nullptr) tree = file->Get("events"); // ATHENA, EPIC + if (tree == nullptr) tree = file->Get("event_tree"); // ECCE + if (tree == nullptr) { + fmt::print(stderr,"ERROR: Couldn't find tree in file '{}'\n",fileName); + entries.push_back(0); } + else entries.push_back(tree->GetEntries()); + file->Close(); } - if (!AddFile(fileNames, entries, xs, Q2min)) { - cerr << "ERROR: Couldn't add files "; - for (std::string fileName : fileNames) { - cerr << fileName << " "; + // add the file group + AddFileGroup(fileNames, entries, xsec, Q2min, Q2max); + }; + + // loop over lines + while (std::getline(fin, line)) { + + // chomp comments + auto lineChomped = line.substr(0,line.find("#")); + if(debugParser) fmt::print("\nlineChomped = \"{}\"\n",lineChomped); + + // each line will be parsed as one of the following: + enum parseAs_enum { kNone, kSetting, kRootFile }; + int parseAs = kNone; + + // tokenize the line + std::string token, bufferKey, bufferVal; + std::stringstream lineStream(lineChomped); + while (std::getline(lineStream, token, ' ')) { + // classify `parseAs` and fill buffers + if (token.rfind(":",0)==0) { // parse as setting name + parseAs = kSetting; + bufferKey = token; + } + else if (parseAs==kSetting) { // parse as setting value + if (token!="" && bufferVal=="") bufferVal = token; + } + else { // parse as root file name + parseAs = kRootFile; + bufferKey = token; + } + // if(debugParser) fmt::print(" token = \"{}\"\n",token); + } // tokenize + + // parse buffers + if (parseAs==kSetting) { + // if we were reading a list of files, we're done with this list; add the files and reset + if(readingListOfFiles) { + if(debugParser) fmt::print("-> new setting, add current list of `fileNames`, then reset\n"); + AddFiles(); + readingListOfFiles = false; + xsec = totalCrossSection; + Q2min = 1.0; + Q2max = 0.0; + fileNames.clear(); } - cerr << endl; - return; + // parse setting value(s) + if (bufferKey==":eleBeamEn") eleBeamEn = std::stod(bufferVal); + else if (bufferKey==":ionBeamEn") ionBeamEn = std::stod(bufferVal); + else if (bufferKey==":crossingAngle") crossingAngle = std::stod(bufferVal); + else if (bufferKey==":totalCrossSection") totalCrossSection = std::stod(bufferVal); + else if (bufferKey==":q2min") Q2min = std::stod(bufferVal); + else if (bufferKey==":q2max") Q2max = std::stod(bufferVal); + else if (bufferKey==":crossSection") xsec = std::stod(bufferVal); + else + fmt::print(stderr,"WARNING: unkown setting \"{}\"\n",bufferKey); + if(debugParser) fmt::print(" setting: \"{}\" = \"{}\"\n",bufferKey,bufferVal); } - } + else if (parseAs==kRootFile) { + readingListOfFiles = true; + fileNames.push_back(bufferKey); + if(debugParser) fmt::print(" rootFile: \"{}\"\n",bufferKey); + } + + } // loop over lines + + // add last list of files + if(debugParser) fmt::print("-> EOF; add last list of `fileNames`\n"); + AddFiles(); + fmt::print("[+++] PARSING COMPLETE\n\n"); + if (infiles.empty()) { cerr << "ERROR: no input files have been specified" << endl; return; } + // print configuration ---------------------------------- + fmt::print("{:=<50}\n","CONFIGURATION: "); + fmt::print("{:>30} = {} GeV\n", "eleBeamEn", eleBeamEn); + fmt::print("{:>30} = {} GeV\n", "ionBeamEn", ionBeamEn); + fmt::print("{:>30} = {} mrad\n", "crossingAngle", crossingAngle); + fmt::print("{:>30} = {}\n", "totalCrossSection", totalCrossSection); + fmt::print("{:>30} = {}\n", "reconMethod", reconMethod); + fmt::print("{:-<50}\n",""); + PrintStdVector(Q2mins,"Q2mins"); + PrintStdVector(Q2maxs,"Q2maxs"); + PrintStdVector(Q2xsecs,"Q2xsecs"); + PrintStdVector(Q2entries,"Q2entries"); + // PrintStdVector2D(inEntries,"inEntries"); + // PrintStdVector(inLookup,"inLookup"); + fmt::print("{:-<50}\n",""); + PrintStdMap(availableBinSchemes,"availableBinSchemes"); + fmt::print("{:=<50}\n",""); + // set output file name outfileName = "out/"+outfilePrefix+".root"; @@ -298,7 +363,7 @@ void Analysis::Prepare() { NBINS,1,3000, true,true ); - HS->DefineHist1D("Q","Q","GeV",NBINS,1.0,55.0,true,true); + HS->DefineHist1D("Q2","Q2","GeV",NBINS,1.0,3000,true,true); HS->DefineHist1D("x","x","",NBINS,1e-3,1.0,true,true); HS->DefineHist1D("y","y","",NBINS,1e-3,1,true); HS->DefineHist1D("W","W","GeV",NBINS,0,50); @@ -341,7 +406,7 @@ void Analysis::Prepare() { HS->DefineHist2D("depolWAvsQ2", "Q^{2}", "W/A", "GeV^{2}", "", NBINS, 1, 3000, NBINS, 0, 2.5, true, false); // -- single-hadron cross sections //HS->DefineHist1D("Q_xsec","Q","GeV",10,0.5,10.5,false,true); // linear - HS->DefineHist1D("Q_xsec","Q","GeV",10,1.0,10.0,true,true); // log + HS->DefineHist1D("Q_xsec","Q","GeV",NBINS,1.0,3000,true,true); // log HS->Hist("Q_xsec")->SetMinimum(1e-10); // -- resolutions HS->DefineHist1D("x_Res","x-x_{true}","", NBINS, -0.5, 0.5); @@ -419,26 +484,28 @@ void Analysis::CalculateEventQ2Weights() { for (Long64_t entry : Q2entries) { entriesTot += entry; } - xsecTot = Q2xsecsTot.front(); cout << "Q2 weighting info:" << endl; for (Int_t idx = 0; idx < Q2xsecs.size(); ++idx) { - Double_t xsecFactor = Q2xsecs[idx] / xsecTot; - Double_t entries = 0.; - for (Int_t idxC = 0; idxC <= idx; ++idxC) { - // estimate how many events from this file lie in the given Q2 range - entries += Q2entries[idxC] * (Q2xsecs[idx] / Q2xsecsTot[idxC]); - } - Double_t numFactor = entries / entriesTot; - Q2weights[idx] = xsecFactor / numFactor; - cout << "\tQ2 > " << Q2mins[idx] << ":" << endl; - cout << "\t\t"; - for (Int_t idxF = 0; idxF < infiles[idx].size(); ++idxF) { - cout << infiles[idx][idxF] << "; "; + // calculate total luminosity, and the luminosity that contains this Q2 range + Double_t lumiTotal = Double_t(entriesTot) / totalCrossSection; + Double_t lumiThis = Double_t(Q2entries[idx]) / Q2xsecs[idx]; + //// alternative `lumiThis`: try to correct for overlapping Q2 ranges + lumiThis = 0.; // reset + for (Int_t j = 0; j < Q2xsecs.size(); ++j) { + // check if Q2 range `j` contains the Q2 range `idx`; if so, include its luminosity + if (InQ2Range(Q2mins[idx], Q2mins[j], Q2maxs[j]) && + InQ2Range(Q2maxs[idx], Q2mins[j], Q2maxs[j], true)) + { + lumiThis += Double_t(Q2entries[j]) / Q2xsecs[j]; + } } - cout << endl; + // calculate the weight for this Q2 range + Q2weights[idx] = lumiTotal / lumiThis; + cout << "\tQ2 > " << Q2mins[idx]; + if(Q2maxs[idx]>0) cout << " && Q2 < " << Q2maxs[idx]; + cout << ":" << endl; cout << "\t\tcount = " << Q2entries[idx] << endl; cout << "\t\txsec = " << Q2xsecs[idx] << endl; - cout << "\t\txsec_tot = " << Q2xsecsTot[idx] << endl; cout << "\t\tweight = " << Q2weights[idx] << endl; } } @@ -452,19 +519,19 @@ Double_t Analysis::GetEventQ2Weight(Double_t Q2, Int_t guess) { } } +// get the `idx` for this value of `Q2`; tries to find the most restrictive Q2 range +// that contains the given `Q2` value, in order to assign the correct weight Int_t Analysis::GetEventQ2Idx(Double_t Q2, Int_t guess) { - Int_t idx = guess; - if (Q2 < Q2mins[idx]) { - do { - idx -= 1; - } while (idx >= 0 && Q2 < Q2mins[idx]); - return idx; - } else { - while (idx + 1 < Q2mins.size() && Q2 >= Q2mins[idx + 1]) { - idx += 1; - } - return idx; + // return guess; // just use the Q2 range, according to which ROOT file the event came from + Int_t idx = -1; + for (int k=0; kClearOps(); // calculate integrated luminosity - Double_t lumi = wTrackTotal/xsecTot; // [nb^-1] + Double_t lumi = wTrackTotal/totalCrossSection; // [nb^-1] cout << "Integrated Luminosity: " << lumi << "/nb" << endl; cout << sep << endl; @@ -507,7 +574,7 @@ void Analysis::Finish() { HD->Payload([this](Histos *H){ H->Write(); }); HD->ExecuteAndClearOps(); std::vector vec_wTrackTotal { wTrackTotal }; std::vector vec_wJetTotal { wJetTotal }; - outFile->WriteObject(&Q2xsecsTot, "XsTotal"); + outFile->WriteObject(&Q2xsecs, "XsTotal"); outFile->WriteObject(&vec_wTrackTotal, "WeightTotal"); outFile->WriteObject(&vec_wJetTotal, "WeightJetTotal"); @@ -585,7 +652,7 @@ void Analysis::FillHistosTracks() { H->Hist4("full_xsec")->Fill(kin->x,kin->Q2,kin->pT,kin->z,wTrack); // DIS kinematics dynamic_cast(H->Hist("Q2vsX"))->Fill(kin->x,kin->Q2,wTrack); - H->Hist("Q")->Fill(TMath::Sqrt(kin->Q2),wTrack); + H->Hist("Q2")->Fill(kin->Q2,wTrack); H->Hist("x")->Fill(kin->x,wTrack); H->Hist("W")->Fill(kin->W,wTrack); H->Hist("y")->Fill(kin->y,wTrack); diff --git a/src/Analysis.h b/src/Analysis.h index 1cdb247b..d9e7cc83 100644 --- a/src/Analysis.h +++ b/src/Analysis.h @@ -12,6 +12,7 @@ #include #include #include +#include // root #include "TChain.h" @@ -34,10 +35,7 @@ class Analysis : public TNamed { public: Analysis( - TString infileName_="", - Double_t eleBeamEn_=5, - Double_t ionBeamEn_=41, - Double_t crossingAngle_=0, + TString configFileName_="", TString outfilePrefix_="" ); ~Analysis(); @@ -63,10 +61,15 @@ class Analysis : public TNamed // set kinematics reconstruction method; see constructor for available methods void SetReconMethod(TString reconMethod_) { reconMethod=reconMethod_; }; - // add files to the TChain; this is called by `Prepare()`, but you can use these public - // methods to add more files if you want - // add single file `fileName` with given Q2 range and xs. - bool AddFile(std::vector fileNames, std::vector entries, Double_t xs, Double_t Q2min); + // add a group of files to the analysis, where all of these files have a + // common cross section `xs`, and Q2 range `Q2min` to `Q2max` + void AddFileGroup( + std::vector fileNames, + std::vector entries, + Double_t xs, + Double_t Q2min, + Double_t Q2max + ); // access HistosDAG HistosDAG *GetHistosDAG() { return HD; }; @@ -107,7 +110,6 @@ class Analysis : public TNamed Weights const* weight; Weights const* weightJet; Double_t wTrackTotal, wJetTotal; - Double_t xsecTot; Long64_t entriesTot; const TString sep = "--------------------------------------------"; @@ -117,15 +119,16 @@ class Analysis : public TNamed // A lookup index for guessing which Q2 range an event belongs to. std::vector inLookup; std::vector Q2xsecs; - std::vector Q2xsecsTot; std::vector Q2mins; + std::vector Q2maxs; std::vector Q2entries; std::vector Q2weights; - TString infileName,outfileName,outfilePrefix; + TString configFileName,outfileName,outfilePrefix; TFile *outFile; - Double_t eleBeamEn = 5; // GeV - Double_t ionBeamEn = 41; // GeV - Double_t crossingAngle = 0; // mrad + Double_t eleBeamEn; // GeV + Double_t ionBeamEn; // GeV + Double_t crossingAngle; // mrad + Double_t totalCrossSection; TString reconMethod; // event loop objects @@ -143,10 +146,39 @@ class Analysis : public TNamed std::map availableBinSchemes; std::map binSchemes; std::map reconMethodToTitle; - std::map finalStateToTitle; - std::map PIDtoFinalState; + std::map finalStateToTitle; + std::map PIDtoFinalState; std::set activeFinalStates; + // check if Q2 `val` is between `min` and `max`; if `max==0`, only `val>=min` is checked + template bool InQ2Range(T val, T min, T max, bool ignoreZero=false) { + if (ignoreZero && !(val>0)) return true; + if (max>0.0) return val>=min && val<=max; + else return val>=min; + } + + // container printing + // mostly for debugging; if we need more than this, switch to using a common pretty printer library + template void PrintStdVector(std::vector vec, std::string name="") { + if(name!="") fmt::print("{}: ",name); + fmt::print("[ "); + for(const auto elem : vec) fmt::print("{}, ",elem); + fmt::print("]\n"); + } + template void PrintStdVector2D(std::vector> vec, std::string name="") { + if(name!="") fmt::print("{} = ",name); + fmt::print("[\n"); + for(const auto elem : vec) PrintStdVector(elem," "); + fmt::print("]\n"); + } + template void PrintStdMap(std::map hash, std::string name="") { + if(name!="") fmt::print("{} = ",name); + fmt::print("{{\n"); + for(const auto [key,val] : hash) fmt::print(" {} => {},\n",key,val); + fmt::print("}}\n"); + } + + ClassDef(Analysis,1); }; diff --git a/src/AnalysisAthena.cxx b/src/AnalysisAthena.cxx index 99eb45b2..d179d59d 100644 --- a/src/AnalysisAthena.cxx +++ b/src/AnalysisAthena.cxx @@ -6,24 +6,13 @@ using std::cout; using std::cerr; using std::endl; -AnalysisAthena::AnalysisAthena( - TString infileName_, - Double_t eleBeamEn_, - Double_t ionBeamEn_, - Double_t crossingAngle_, - TString outfilePrefix_ - ) : Analysis( - infileName_, - eleBeamEn_, - ionBeamEn_, - crossingAngle_, - outfilePrefix_ - ) { - }; +// constructor +AnalysisAthena::AnalysisAthena(TString configFileName_, TString outfilePrefix_) : + Analysis(configFileName_, outfilePrefix_) +{ }; // destructor -AnalysisAthena::~AnalysisAthena() { -}; +AnalysisAthena::~AnalysisAthena() { }; //============================================= @@ -38,7 +27,7 @@ void AnalysisAthena::Execute() TChain *chain = new TChain("events"); for(Int_t idx=0; idxAdd(infiles[idx][idxF].c_str(), inEntries[idx][idxF]); } } diff --git a/src/AnalysisAthena.h b/src/AnalysisAthena.h index 2ae136b9..8a860767 100644 --- a/src/AnalysisAthena.h +++ b/src/AnalysisAthena.h @@ -35,13 +35,7 @@ class Particles class AnalysisAthena : public Analysis { public: - AnalysisAthena( - TString infileName_="", - Double_t eleBeamEn_=5, - Double_t ionBeamEn_=41, - Double_t crossingAngle_=0, - TString outfilePrefix_="" - ); + AnalysisAthena(TString configFileName_="", TString outfilePrefix_=""); ~AnalysisAthena(); void Execute() override; diff --git a/src/AnalysisDelphes.cxx b/src/AnalysisDelphes.cxx index 74a51172..f2986c3b 100644 --- a/src/AnalysisDelphes.cxx +++ b/src/AnalysisDelphes.cxx @@ -9,23 +9,16 @@ using std::cerr; using std::endl; // constructor -AnalysisDelphes::AnalysisDelphes( - TString infileName_, - Double_t eleBeamEn_, - Double_t ionBeamEn_, - Double_t crossingAngle_, - TString outfilePrefix_ -) : Analysis( - infileName_, - eleBeamEn_, - ionBeamEn_, - crossingAngle_, - outfilePrefix_ -) { +AnalysisDelphes::AnalysisDelphes(TString configFileName_, TString outfilePrefix_) : + Analysis(configFileName_, outfilePrefix_) +{ // delphes-specific settings defaults /* ... none defined yet ... */ }; +// destructor +AnalysisDelphes::~AnalysisDelphes() { }; + //============================================= // perform the analysis @@ -39,7 +32,7 @@ void AnalysisDelphes::Execute() { TChain *chain = new TChain("Delphes"); for(Int_t idx=0; idxAdd(infiles[idx][idxF].c_str(), inEntries[idx][idxF]); } } @@ -278,9 +271,3 @@ void AnalysisDelphes::Execute() { Finish(); //cout << "DEBUG PID in HFS: nSmeared=" << kin->countPIDsmeared << " nNotSmeared=" << kin->countPIDtrue << endl; }; - - -// destructor -AnalysisDelphes::~AnalysisDelphes() { -}; - diff --git a/src/AnalysisDelphes.h b/src/AnalysisDelphes.h index ccbd3a9e..efa842f0 100644 --- a/src/AnalysisDelphes.h +++ b/src/AnalysisDelphes.h @@ -15,13 +15,7 @@ class AnalysisDelphes : public Analysis { public: - AnalysisDelphes( - TString infileName_="", - Double_t eleBeamEn_=5, - Double_t ionBeamEn_=41, - Double_t crossingAngle_=0, - TString outfilePrefix_="" - ); + AnalysisDelphes(TString configFileName_="", TString outfilePrefix_=""); ~AnalysisDelphes(); // perform the analysis diff --git a/src/AnalysisEcce.cxx b/src/AnalysisEcce.cxx index 000f27cc..bbd65331 100644 --- a/src/AnalysisEcce.cxx +++ b/src/AnalysisEcce.cxx @@ -6,26 +6,14 @@ using std::cout; using std::cerr; using std::endl; -AnalysisEcce::AnalysisEcce( - TString infileName_, - Double_t eleBeamEn_, - Double_t ionBeamEn_, - Double_t crossingAngle_, - TString outfilePrefix_ - ) : Analysis( - infileName_, - eleBeamEn_, - ionBeamEn_, - crossingAngle_, - outfilePrefix_ - ), - trackSource(0) // default track source is "all tracks" -{ -}; +// constructor +AnalysisEcce::AnalysisEcce(TString configFileName_, TString outfilePrefix_) : + Analysis(configFileName_, outfilePrefix_), + trackSource(0) // default track source is "all tracks" +{ }; // destructor -AnalysisEcce::~AnalysisEcce() { -}; +AnalysisEcce::~AnalysisEcce() { }; //============================================= @@ -40,7 +28,7 @@ void AnalysisEcce::Execute() TChain *chain = new TChain("event_tree"); for(Int_t idx=0; idxAdd(infiles[idx][idxF].c_str(), inEntries[idx][idxF]); } } diff --git a/src/AnalysisEcce.h b/src/AnalysisEcce.h index d4c1ba14..fc682f65 100644 --- a/src/AnalysisEcce.h +++ b/src/AnalysisEcce.h @@ -35,13 +35,7 @@ class ParticlesEE class AnalysisEcce : public Analysis { public: - AnalysisEcce( - TString infileName_="", - Double_t eleBeamEn_=5, - Double_t ionBeamEn_=41, - Double_t crossingAngle_=0, - TString outfilePrefix_="" - ); + AnalysisEcce(TString configFileName_="", TString outfilePrefix_=""); ~AnalysisEcce(); void Execute() override; diff --git a/tutorial/README.md b/tutorial/README.md index 915b9b8f..9d36147c 100644 --- a/tutorial/README.md +++ b/tutorial/README.md @@ -16,6 +16,9 @@ To run tutorials, you need to generate or obtain ROOT files, from fast or full s - this requires access to S3, the common storage area - environment variables `$S3_ACCESS_KEY` and `$S3_SECRET_KEY` must contain the login and password; follow [s3tools documentation](../s3tools/README.md) for guidance +- a set of files, together with settings such as beam energy and Q2 ranges, are + specified by config files; see [doc/example.config](../doc/example.config) for an example + config file and more details ### Fast Simulation - to download sample HEPMC files from S3, and run them through Delphes, run: @@ -37,7 +40,14 @@ To run tutorials, you need to generate or obtain ROOT files, from fast or full s ### Full Simulation -- full simulation files are streamed from S3 using `tutorial/s3files.*.config` +- full simulation files can be streamed from S3 using `tutorial/s3files.*.config` config files +- use `s3tools/` scripts to make new config files, download files from S3, and more; for example: +```bash +s3tools/make-athena-config.sh 10x100 tutorial.athena s 8 # stream ATHENA files +s3tools/make-ecce-config.sh 10x100 tutorial.ecce d 12 # download ECCE files +``` +- run `s3tools/` scripts with no arguments to print usage guide +- downloading from S3 is preferred, if disk space is available ## Introductory Notes diff --git a/tutorial/analysis_coverage.C b/tutorial/analysis_coverage.C index c476ea22..958da8d8 100644 --- a/tutorial/analysis_coverage.C +++ b/tutorial/analysis_coverage.C @@ -3,21 +3,12 @@ R__LOAD_LIBRARY(Sidis-eic) /* run in a grid of (x,Q2,eta,p) 4D bins */ void analysis_coverage( - TString infiles="tutorial/delphes.config", /* list of input files */ - Double_t eleBeamEn=10, /* electron beam energy [GeV] */ - Double_t ionBeamEn=100, /* ion beam energy [GeV] */ - Double_t crossingAngle=-25, /* crossing angle [mrad] */ - TString outfilePrefix="coverage" /* output filename prefix*/ + TString configFile="tutorial/delphes.config", // input config file + TString outfilePrefix="coverage" // output filename prefix ) { // setup analysis ======================================== - AnalysisDelphes *A = new AnalysisDelphes( - infiles, - eleBeamEn, - ionBeamEn, - crossingAngle, - outfilePrefix - ); + AnalysisDelphes *A = new AnalysisDelphes(configFile, outfilePrefix); //A->maxEvents = 30000; // use this to limit the number of events A->SetReconMethod("Ele"); // set reconstruction method diff --git a/tutorial/analysis_dd4hep.C b/tutorial/analysis_dd4hep.C index 447da93d..d64f4b27 100644 --- a/tutorial/analysis_dd4hep.C +++ b/tutorial/analysis_dd4hep.C @@ -11,28 +11,16 @@ R__LOAD_LIBRARY(Sidis-eic) * - for S3, you must know the username and password, and have them in your environment: * - `export S3_ACCESS_KEY=` * - `export S3_SECRET_KEY=` - * - a sample list of files is in `s3files.athena.config`, but if these files are moved on S3, - * then this list becomes out of date; in that case, use this list as a template - * (and if you want to replace it for the sake of keeping a working tutorial - * example, send a pull request with the new list) + * - a sample config file is `s3files.athena.config`, with a list of S3 URLs */ void analysis_dd4hep( - TString infiles="tutorial/s3files.athena.config", /* list of input files (S3 URLs, plus other columns) */ - Double_t eleBeamEn=10, /* electron beam energy [GeV] */ - Double_t ionBeamEn=100, /* ion beam energy [GeV] */ - Double_t crossingAngle=-25, /* crossing angle [mrad] */ - TString outfilePrefix="tutorial.dd4hep" /* output filename prefix*/) -{ + TString configFile="tutorial/s3files.athena.config", // input config file + TString outfilePrefix="tutorial.dd4hep" // output filename prefix +) { // setup analysis ======================================== // - define `AnalysisAthena` instead of `AnalysisDelphes` - AnalysisAthena *A = new AnalysisAthena( - infiles, - eleBeamEn, - ionBeamEn, - crossingAngle, - outfilePrefix - ); + AnalysisAthena *A = new AnalysisAthena(configFile, outfilePrefix); A->maxEvents = 300000; // use this to limit the number of events A->writeSimpleTree = true; diff --git a/tutorial/analysis_eventEvaluator.C b/tutorial/analysis_eventEvaluator.C index 8afbb0df..b9def37f 100644 --- a/tutorial/analysis_eventEvaluator.C +++ b/tutorial/analysis_eventEvaluator.C @@ -11,28 +11,16 @@ R__LOAD_LIBRARY(Sidis-eic) * - for S3, you must know the username and password, and have them in your environment: * - `export S3_ACCESS_KEY=` * - `export S3_SECRET_KEY=` - * - a sample list of files is in `s3files.ecce.config`, but if these files are moved on S3, - * then this list becomes out of date; in that case, use this list as a template - * (and if you want to replace it for the sake of keeping a working tutorial - * example, send a pull request with the new list) + * - a sample config file is `s3files.ecce.config`, with a list of S3 URLs */ void analysis_eventEvaluator( - TString infiles="tutorial/s3files.ecce.config", /* list of input files (S3 URLs, plus other columns) */ - Double_t eleBeamEn=18, /* electron beam energy [GeV] */ - Double_t ionBeamEn=275, /* ion beam energy [GeV] */ - Double_t crossingAngle=-25, /* crossing angle [mrad] */ - TString outfilePrefix="tutorial.eventEvaluator" /* output filename prefix*/) -{ + TString configFile="tutorial/s3files.ecce.config", // input config file + TString outfilePrefix="tutorial.eventEvaluator" // output filename prefix +) { // setup analysis ======================================== // - define `AnalysisEcce` instead of `AnalysisDelphes` - AnalysisEcce *A = new AnalysisEcce( - infiles, - eleBeamEn, - ionBeamEn, - crossingAngle, - outfilePrefix - ); + AnalysisEcce *A = new AnalysisEcce(configFile, outfilePrefix); A->maxEvents = 300000; // use this to limit the number of events A->writeSimpleTree = true; diff --git a/tutorial/analysis_qbins.C b/tutorial/analysis_qbins.C index dec6e312..2fdfc8df 100644 --- a/tutorial/analysis_qbins.C +++ b/tutorial/analysis_qbins.C @@ -2,21 +2,12 @@ R__LOAD_LIBRARY(Sidis-eic) // run in Q2 bins, for two pT ranges void analysis_qbins( - TString infiles="tutorial/delphes.config", /* list of input files */ - Double_t eleBeamEn=10, /* electron beam energy [GeV] */ - Double_t ionBeamEn=100, /* ion beam energy [GeV] */ - Double_t crossingAngle=-25, /* crossing angle [mrad] */ - TString outfilePrefix="tutorial.qbins" /* output filename prefix*/ + TString configFile="tutorial/delphes.config", // input config file + TString outfilePrefix="tutorial.qbins" // output filename prefix ) { // setup analysis ======================================== - AnalysisDelphes *A = new AnalysisDelphes( - infiles, - eleBeamEn, - ionBeamEn, - crossingAngle, - outfilePrefix - ); + AnalysisDelphes *A = new AnalysisDelphes(configFile, outfilePrefix); //A->maxEvents = 30000; // use this to limit the number of events A->SetReconMethod("Ele"); // set reconstruction method diff --git a/tutorial/analysis_template.C b/tutorial/analysis_template.C index 69aeec25..8cb505f8 100644 --- a/tutorial/analysis_template.C +++ b/tutorial/analysis_template.C @@ -5,26 +5,18 @@ R__LOAD_LIBRARY(Sidis-eic) * - useful if you want to use your own analysis code */ void analysis_template( - TString infiles="tutorial/delphes.config", /* list of input files */ - Double_t eleBeamEn=10, /* electron beam energy [GeV] */ - Double_t ionBeamEn=100, /* ion beam energy [GeV] */ - Double_t crossingAngle=-25, /* crossing angle [mrad] */ - TString outfilePrefix="tutorial.template" /* output filename prefix*/ + TString configFile="tutorial/delphes.config", // input config file + TString outfilePrefix="tutorial.template" // output filename prefix ) { // setup analysis ======================================== - AnalysisDelphes *A = new AnalysisDelphes( - infiles, - eleBeamEn, - ionBeamEn, - crossingAngle, - outfilePrefix - ); + AnalysisDelphes *A = new AnalysisDelphes(configFile, outfilePrefix); + // use a different `Analysis`-derived class to handle different data streams: + // AnalysisEpic *A = new AnalysisEpic(configFile, outfilePrefix); // EPIC Single Software Stack + // AnalysisEcce *A = new AnalysisEcce(configFile, outfilePrefix); // ECCE Fun4all + EventEvaluator + // AnalysisAthena *A = new AnalysisAthena(configFile, outfilePrefix); // ATHENA DD4hep + Juggler + //A->maxEvents = 10000; // use this to limit the number of events - /* this `maxEvents` limit should only be applied for quick tests; - * you should not set it if you are using the number of events - * column in `infiles` (the input files table) - */ A->writeSimpleTree = true; // write SimpleTree (for one bin) // set reconstruction method ============================= diff --git a/tutorial/analysis_testDAG.C b/tutorial/analysis_testDAG.C index 9fdcb1aa..21414f9a 100644 --- a/tutorial/analysis_testDAG.C +++ b/tutorial/analysis_testDAG.C @@ -2,21 +2,12 @@ R__LOAD_LIBRARY(Sidis-eic) // test DAG implementation void analysis_testDAG( - TString infiles="tutorial/delphes.config", /* list of input files */ - Double_t eleBeamEn=10, /* electron beam energy [GeV] */ - Double_t ionBeamEn=100, /* ion beam energy [GeV] */ - Double_t crossingAngle=-25, /* crossing angle [mrad] */ - TString outfilePrefix="testDAG" /* output filename prefix*/ + TString configFile="tutorial/delphes.config", // input config file + TString outfilePrefix="testDAG" // output filename prefix ) { // setup analysis ======================================== - AnalysisDelphes *A = new AnalysisDelphes( - infiles, - eleBeamEn, - ionBeamEn, - crossingAngle, - outfilePrefix - ); + AnalysisDelphes *A = new AnalysisDelphes(configFile, outfilePrefix); //A->maxEvents = 100; diff --git a/tutorial/analysis_xqbins.C b/tutorial/analysis_xqbins.C index d9a61734..718e0ed6 100644 --- a/tutorial/analysis_xqbins.C +++ b/tutorial/analysis_xqbins.C @@ -5,21 +5,12 @@ R__LOAD_LIBRARY(Sidis-eic) * - observe how the resulting histograms differ in each (x,Q2) bin */ void analysis_xqbins( - TString infiles="tutorial/delphes.config", /* list of input files */ - Double_t eleBeamEn=10, /* electron beam energy [GeV] */ - Double_t ionBeamEn=100, /* ion beam energy [GeV] */ - Double_t crossingAngle=-25, /* crossing angle [mrad] */ - TString outfilePrefix="tutorial.xqbins" /* output filename prefix*/ + TString configFile="tutorial/delphes.config", // input config file + TString outfilePrefix="tutorial.xqbins" // output filename prefix ) { // setup analysis ======================================== - AnalysisDelphes *A = new AnalysisDelphes( - infiles, - eleBeamEn, - ionBeamEn, - crossingAngle, - outfilePrefix - ); + AnalysisDelphes *A = new AnalysisDelphes(configFile, outfilePrefix); //A->maxEvents = 30000; // use this to limit the number of events A->SetReconMethod("Ele"); // set reconstruction method diff --git a/tutorial/analysis_yRatio.C b/tutorial/analysis_yRatio.C index 44bf7963..d7961164 100644 --- a/tutorial/analysis_yRatio.C +++ b/tutorial/analysis_yRatio.C @@ -2,21 +2,12 @@ R__LOAD_LIBRARY(Sidis-eic) // ratios of histograms with y-cut enabled to those with y-cut disabled void analysis_yRatio( - TString infiles="tutorial/delphes.config", /* list of input files */ - Double_t eleBeamEn=10, /* electron beam energy [GeV] */ - Double_t ionBeamEn=100, /* ion beam energy [GeV] */ - Double_t crossingAngle=-25, /* crossing angle [mrad] */ - TString outfilePrefix="yRatio" /* output filename prefix*/ + TString configFile="tutorial/delphes.config", // input config file + TString outfilePrefix="yRatio" // output filename prefix ) { // setup analysis ======================================== - AnalysisDelphes *A = new AnalysisDelphes( - infiles, - eleBeamEn, - ionBeamEn, - crossingAngle, - outfilePrefix - ); + AnalysisDelphes *A = new AnalysisDelphes(configFile, outfilePrefix); //A->maxEvents = 30000; // use this to limit the number of events A->writeSimpleTree = true; // write SimpleTree (for one bin) diff --git a/tutorial/s3files.athena.config b/tutorial/s3files.athena.config index f76cdfd7..417cfa7b 100644 --- a/tutorial/s3files.athena.config +++ b/tutorial/s3files.athena.config @@ -1,4 +1,61 @@ -1000 6.8238 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/canyonlands-v2.0/DIS/NC/10x100/minQ2=1000/pythia8NCDIS_10x100_minQ2=1000_beamEffects_xAngle=-0.025_hiDiv_vtxfix_2.0013.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/canyonlands-v2.0/DIS/NC/10x100/minQ2=1000/pythia8NCDIS_10x100_minQ2=1000_beamEffects_xAngle=-0.025_hiDiv_vtxfix_2.0011.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/canyonlands-v2.0/DIS/NC/10x100/minQ2=1000/pythia8NCDIS_10x100_minQ2=1000_beamEffects_xAngle=-0.025_hiDiv_vtxfix_2.0010.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/canyonlands-v2.0/DIS/NC/10x100/minQ2=1000/pythia8NCDIS_10x100_minQ2=1000_beamEffects_xAngle=-0.025_hiDiv_vtxfix_2.0008.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/canyonlands-v2.0/DIS/NC/10x100/minQ2=1000/pythia8NCDIS_10x100_minQ2=1000_beamEffects_xAngle=-0.025_hiDiv_vtxfix_2.0007.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/canyonlands-v2.0/DIS/NC/10x100/minQ2=1000/pythia8NCDIS_10x100_minQ2=1000_beamEffects_xAngle=-0.025_hiDiv_vtxfix_2.0005.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/canyonlands-v2.0/DIS/NC/10x100/minQ2=1000/pythia8NCDIS_10x100_minQ2=1000_beamEffects_xAngle=-0.025_hiDiv_vtxfix_2.0003.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/canyonlands-v2.0/DIS/NC/10x100/minQ2=1000/pythia8NCDIS_10x100_minQ2=1000_beamEffects_xAngle=-0.025_hiDiv_vtxfix_2.0001.root 0 -100 1343 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/canyonlands-v2.0/DIS/NC/10x100/minQ2=100/pythia8NCDIS_10x100_minQ2=100_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1.0042.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/canyonlands-v2.0/DIS/NC/10x100/minQ2=100/pythia8NCDIS_10x100_minQ2=100_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1.0040.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/canyonlands-v2.0/DIS/NC/10x100/minQ2=100/pythia8NCDIS_10x100_minQ2=100_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1.0039.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/canyonlands-v2.0/DIS/NC/10x100/minQ2=100/pythia8NCDIS_10x100_minQ2=100_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1.0038.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/canyonlands-v2.0/DIS/NC/10x100/minQ2=100/pythia8NCDIS_10x100_minQ2=100_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1.0037.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/canyonlands-v2.0/DIS/NC/10x100/minQ2=100/pythia8NCDIS_10x100_minQ2=100_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1.0035.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/canyonlands-v2.0/DIS/NC/10x100/minQ2=100/pythia8NCDIS_10x100_minQ2=100_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1.0033.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/canyonlands-v2.0/DIS/NC/10x100/minQ2=100/pythia8NCDIS_10x100_minQ2=100_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1.0032.root 0 -10 40026 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/canyonlands-v2.0/DIS/NC/10x100/minQ2=10/pythia8NCDIS_10x100_minQ2=10_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1.0013.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/canyonlands-v2.0/DIS/NC/10x100/minQ2=10/pythia8NCDIS_10x100_minQ2=10_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1.0012.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/canyonlands-v2.0/DIS/NC/10x100/minQ2=10/pythia8NCDIS_10x100_minQ2=10_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1.0011.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/canyonlands-v2.0/DIS/NC/10x100/minQ2=10/pythia8NCDIS_10x100_minQ2=10_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1.0008.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/canyonlands-v2.0/DIS/NC/10x100/minQ2=10/pythia8NCDIS_10x100_minQ2=10_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1.0007.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/canyonlands-v2.0/DIS/NC/10x100/minQ2=10/pythia8NCDIS_10x100_minQ2=10_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1.0006.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/canyonlands-v2.0/DIS/NC/10x100/minQ2=10/pythia8NCDIS_10x100_minQ2=10_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1.0003.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/canyonlands-v2.0/DIS/NC/10x100/minQ2=10/pythia8NCDIS_10x100_minQ2=10_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1.0002.root 0 -1 5.5566e+05 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/canyonlands-v2.0/DIS/NC/10x100/minQ2=1/pythia8NCDIS_10x100_minQ2=1_beamEffects_xAngle=-0.025_hiDiv_vtxfix_3.0030.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/canyonlands-v2.0/DIS/NC/10x100/minQ2=1/pythia8NCDIS_10x100_minQ2=1_beamEffects_xAngle=-0.025_hiDiv_vtxfix_3.0029.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/canyonlands-v2.0/DIS/NC/10x100/minQ2=1/pythia8NCDIS_10x100_minQ2=1_beamEffects_xAngle=-0.025_hiDiv_vtxfix_2.0104.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/canyonlands-v2.0/DIS/NC/10x100/minQ2=1/pythia8NCDIS_10x100_minQ2=1_beamEffects_xAngle=-0.025_hiDiv_vtxfix_2.0074.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/canyonlands-v2.0/DIS/NC/10x100/minQ2=1/pythia8NCDIS_10x100_minQ2=1_beamEffects_xAngle=-0.025_hiDiv_vtxfix_2.0072.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/canyonlands-v2.0/DIS/NC/10x100/minQ2=1/pythia8NCDIS_10x100_minQ2=1_beamEffects_xAngle=-0.025_hiDiv_vtxfix_2.0070.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/canyonlands-v2.0/DIS/NC/10x100/minQ2=1/pythia8NCDIS_10x100_minQ2=1_beamEffects_xAngle=-0.025_hiDiv_vtxfix_2.0065.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/canyonlands-v2.0/DIS/NC/10x100/minQ2=1/pythia8NCDIS_10x100_minQ2=1_beamEffects_xAngle=-0.025_hiDiv_vtxfix_2.0057.root 0 +############################################################ +# EXAMPLE CONFIGURATION FILE, for AnalysisAthena +############################################################ + +# Global Settings +# =============== +:eleBeamEn 10 +:ionBeamEn 100 +:crossingAngle -25 +:totalCrossSection 555660.0 + +# Group Settings | NOTE: they must be sorted by increasing strictness +# ============== | of Q2 cuts, or at least by decreasing cross section + +# Q2 range 1 +:q2min 1.0 +:crossSection 555660.0 +s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/deathvalley-v1.0/DIS/NC/10x100/minQ2=1/pythia8NCDIS_10x100_minQ2=1_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1_000.0001.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/deathvalley-v1.0/DIS/NC/10x100/minQ2=1/pythia8NCDIS_10x100_minQ2=1_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1_000.0002.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/deathvalley-v1.0/DIS/NC/10x100/minQ2=1/pythia8NCDIS_10x100_minQ2=1_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1_000.0003.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/deathvalley-v1.0/DIS/NC/10x100/minQ2=1/pythia8NCDIS_10x100_minQ2=1_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1_000.0004.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/deathvalley-v1.0/DIS/NC/10x100/minQ2=1/pythia8NCDIS_10x100_minQ2=1_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1_001.0001.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/deathvalley-v1.0/DIS/NC/10x100/minQ2=1/pythia8NCDIS_10x100_minQ2=1_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1_001.0002.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/deathvalley-v1.0/DIS/NC/10x100/minQ2=1/pythia8NCDIS_10x100_minQ2=1_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1_001.0003.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/deathvalley-v1.0/DIS/NC/10x100/minQ2=1/pythia8NCDIS_10x100_minQ2=1_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1_001.0004.root + +# Q2 range 2 +:q2min 10.0 +:crossSection 40026.0 +s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/deathvalley-v1.0/DIS/NC/10x100/minQ2=10/pythia8NCDIS_10x100_minQ2=10_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1_000.0001.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/deathvalley-v1.0/DIS/NC/10x100/minQ2=10/pythia8NCDIS_10x100_minQ2=10_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1_000.0002.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/deathvalley-v1.0/DIS/NC/10x100/minQ2=10/pythia8NCDIS_10x100_minQ2=10_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1_000.0003.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/deathvalley-v1.0/DIS/NC/10x100/minQ2=10/pythia8NCDIS_10x100_minQ2=10_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1_000.0004.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/deathvalley-v1.0/DIS/NC/10x100/minQ2=10/pythia8NCDIS_10x100_minQ2=10_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1_000.0005.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/deathvalley-v1.0/DIS/NC/10x100/minQ2=10/pythia8NCDIS_10x100_minQ2=10_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1_001.0001.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/deathvalley-v1.0/DIS/NC/10x100/minQ2=10/pythia8NCDIS_10x100_minQ2=10_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1_001.0002.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/deathvalley-v1.0/DIS/NC/10x100/minQ2=10/pythia8NCDIS_10x100_minQ2=10_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1_001.0003.root + +# Q2 range 3 +:q2min 100.0 +:crossSection 1343.0 +s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/deathvalley-v1.0/DIS/NC/10x100/minQ2=100/pythia8NCDIS_10x100_minQ2=100_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1_000.0001.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/deathvalley-v1.0/DIS/NC/10x100/minQ2=100/pythia8NCDIS_10x100_minQ2=100_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1_000.0002.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/deathvalley-v1.0/DIS/NC/10x100/minQ2=100/pythia8NCDIS_10x100_minQ2=100_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1_000.0003.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/deathvalley-v1.0/DIS/NC/10x100/minQ2=100/pythia8NCDIS_10x100_minQ2=100_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1_000.0004.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/deathvalley-v1.0/DIS/NC/10x100/minQ2=100/pythia8NCDIS_10x100_minQ2=100_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1_000.0005.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/deathvalley-v1.0/DIS/NC/10x100/minQ2=100/pythia8NCDIS_10x100_minQ2=100_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1_000.0006.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/deathvalley-v1.0/DIS/NC/10x100/minQ2=100/pythia8NCDIS_10x100_minQ2=100_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1_000.0007.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/deathvalley-v1.0/DIS/NC/10x100/minQ2=100/pythia8NCDIS_10x100_minQ2=100_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1_001.0001.root + +# Q2 range 4 +:q2min 1000.0 +:crossSection 6.8238 +s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/deathvalley-v1.0/DIS/NC/10x100/minQ2=1000/pythia8NCDIS_10x100_minQ2=1000_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1_000.0001.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/deathvalley-v1.0/DIS/NC/10x100/minQ2=1000/pythia8NCDIS_10x100_minQ2=1000_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1_000.0002.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/deathvalley-v1.0/DIS/NC/10x100/minQ2=1000/pythia8NCDIS_10x100_minQ2=1000_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1_000.0003.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/deathvalley-v1.0/DIS/NC/10x100/minQ2=1000/pythia8NCDIS_10x100_minQ2=1000_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1_000.0004.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/deathvalley-v1.0/DIS/NC/10x100/minQ2=1000/pythia8NCDIS_10x100_minQ2=1000_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1_000.0005.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/deathvalley-v1.0/DIS/NC/10x100/minQ2=1000/pythia8NCDIS_10x100_minQ2=1000_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1_000.0006.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/deathvalley-v1.0/DIS/NC/10x100/minQ2=1000/pythia8NCDIS_10x100_minQ2=1000_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1_000.0007.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/ATHENA/RECO/deathvalley-v1.0/DIS/NC/10x100/minQ2=1000/pythia8NCDIS_10x100_minQ2=1000_beamEffects_xAngle=-0.025_hiDiv_vtxfix_1_000.0008.root diff --git a/tutorial/s3files.ecce.config b/tutorial/s3files.ecce.config index 6c44e76e..c3190b8a 100644 --- a/tutorial/s3files.ecce.config +++ b/tutorial/s3files.ecce.config @@ -1 +1,62 @@ -1 7.4167e+05 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ECCE/MC/prop.5/prop.5.1/AI/pythia6/ep-18x275-q2-low/eval_00000/DST_AI_pythia6_ep-18x275-q2-low_000_0064000_02000_g4event_eval.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ECCE/MC/prop.5/prop.5.1/AI/pythia6/ep-18x275-q2-low/eval_00000/DST_AI_pythia6_ep-18x275-q2-low_000_0062000_02000_g4event_eval.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ECCE/MC/prop.5/prop.5.1/AI/pythia6/ep-18x275-q2-low/eval_00000/DST_AI_pythia6_ep-18x275-q2-low_000_0060000_02000_g4event_eval.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ECCE/MC/prop.5/prop.5.1/AI/pythia6/ep-18x275-q2-low/eval_00000/DST_AI_pythia6_ep-18x275-q2-low_000_0058000_02000_g4event_eval.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ECCE/MC/prop.5/prop.5.1/AI/pythia6/ep-18x275-q2-low/eval_00000/DST_AI_pythia6_ep-18x275-q2-low_000_0056000_02000_g4event_eval.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ECCE/MC/prop.5/prop.5.1/AI/pythia6/ep-18x275-q2-low/eval_00000/DST_AI_pythia6_ep-18x275-q2-low_000_0054000_02000_g4event_eval.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ECCE/MC/prop.5/prop.5.1/AI/pythia6/ep-18x275-q2-low/eval_00000/DST_AI_pythia6_ep-18x275-q2-low_000_0052000_02000_g4event_eval.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ECCE/MC/prop.5/prop.5.1/AI/pythia6/ep-18x275-q2-low/eval_00000/DST_AI_pythia6_ep-18x275-q2-low_000_0050000_02000_g4event_eval.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ECCE/MC/prop.5/prop.5.1/AI/pythia6/ep-18x275-q2-low/eval_00000/DST_AI_pythia6_ep-18x275-q2-low_000_0048000_02000_g4event_eval.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ECCE/MC/prop.5/prop.5.1/AI/pythia6/ep-18x275-q2-low/eval_00000/DST_AI_pythia6_ep-18x275-q2-low_000_0046000_02000_g4event_eval.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ECCE/MC/prop.5/prop.5.1/AI/pythia6/ep-18x275-q2-low/eval_00000/DST_AI_pythia6_ep-18x275-q2-low_000_0044000_02000_g4event_eval.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ECCE/MC/prop.5/prop.5.1/AI/pythia6/ep-18x275-q2-low/eval_00000/DST_AI_pythia6_ep-18x275-q2-low_000_0042000_02000_g4event_eval.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ECCE/MC/prop.5/prop.5.1/AI/pythia6/ep-18x275-q2-low/eval_00000/DST_AI_pythia6_ep-18x275-q2-low_000_0038000_02000_g4event_eval.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ECCE/MC/prop.5/prop.5.1/AI/pythia6/ep-18x275-q2-low/eval_00000/DST_AI_pythia6_ep-18x275-q2-low_000_0036000_02000_g4event_eval.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ECCE/MC/prop.5/prop.5.1/AI/pythia6/ep-18x275-q2-low/eval_00000/DST_AI_pythia6_ep-18x275-q2-low_000_0034000_02000_g4event_eval.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ECCE/MC/prop.5/prop.5.1/AI/pythia6/ep-18x275-q2-low/eval_00000/DST_AI_pythia6_ep-18x275-q2-low_000_0032000_02000_g4event_eval.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ECCE/MC/prop.5/prop.5.1/AI/pythia6/ep-18x275-q2-low/eval_00000/DST_AI_pythia6_ep-18x275-q2-low_000_0030000_02000_g4event_eval.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ECCE/MC/prop.5/prop.5.1/AI/pythia6/ep-18x275-q2-low/eval_00000/DST_AI_pythia6_ep-18x275-q2-low_000_0028000_02000_g4event_eval.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ECCE/MC/prop.5/prop.5.1/AI/pythia6/ep-18x275-q2-low/eval_00000/DST_AI_pythia6_ep-18x275-q2-low_000_0026000_02000_g4event_eval.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ECCE/MC/prop.5/prop.5.1/AI/pythia6/ep-18x275-q2-low/eval_00000/DST_AI_pythia6_ep-18x275-q2-low_000_0024000_02000_g4event_eval.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ECCE/MC/prop.5/prop.5.1/AI/pythia6/ep-18x275-q2-low/eval_00000/DST_AI_pythia6_ep-18x275-q2-low_000_0022000_02000_g4event_eval.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ECCE/MC/prop.5/prop.5.1/AI/pythia6/ep-18x275-q2-low/eval_00000/DST_AI_pythia6_ep-18x275-q2-low_000_0020000_02000_g4event_eval.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ECCE/MC/prop.5/prop.5.1/AI/pythia6/ep-18x275-q2-low/eval_00000/DST_AI_pythia6_ep-18x275-q2-low_000_0018000_02000_g4event_eval.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ECCE/MC/prop.5/prop.5.1/AI/pythia6/ep-18x275-q2-low/eval_00000/DST_AI_pythia6_ep-18x275-q2-low_000_0016000_02000_g4event_eval.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ECCE/MC/prop.5/prop.5.1/AI/pythia6/ep-18x275-q2-low/eval_00000/DST_AI_pythia6_ep-18x275-q2-low_000_0014000_02000_g4event_eval.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ECCE/MC/prop.5/prop.5.1/AI/pythia6/ep-18x275-q2-low/eval_00000/DST_AI_pythia6_ep-18x275-q2-low_000_0012000_02000_g4event_eval.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ECCE/MC/prop.5/prop.5.1/AI/pythia6/ep-18x275-q2-low/eval_00000/DST_AI_pythia6_ep-18x275-q2-low_000_0010000_02000_g4event_eval.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ECCE/MC/prop.5/prop.5.1/AI/pythia6/ep-18x275-q2-low/eval_00000/DST_AI_pythia6_ep-18x275-q2-low_000_0008000_02000_g4event_eval.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ECCE/MC/prop.5/prop.5.1/AI/pythia6/ep-18x275-q2-low/eval_00000/DST_AI_pythia6_ep-18x275-q2-low_000_0006000_02000_g4event_eval.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ECCE/MC/prop.5/prop.5.1/AI/pythia6/ep-18x275-q2-low/eval_00000/DST_AI_pythia6_ep-18x275-q2-low_000_0004000_02000_g4event_eval.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ECCE/MC/prop.5/prop.5.1/AI/pythia6/ep-18x275-q2-low/eval_00000/DST_AI_pythia6_ep-18x275-q2-low_000_0002000_02000_g4event_eval.root 0 s3https://dtn01.sdcc.bnl.gov:9000/eictest/ECCE/MC/prop.5/prop.5.1/AI/pythia6/ep-18x275-q2-low/eval_00000/DST_AI_pythia6_ep-18x275-q2-low_000_0000000_02000_g4event_eval.root 0 +############################################################ +# EXAMPLE CONFIGURATION FILE, for AnalysisEcce +############################################################ + +# Global Settings +# =============== +:eleBeamEn 10 +:ionBeamEn 100 +:crossingAngle -25 +:totalCrossSection 579700.0 + +# Group Settings | NOTE: they must be sorted by increasing strictness +# ============== | of Q2 cuts, or at least by decreasing cross section + +# Q2 range 1 +:q2min 1.0 +:crossSection 579700.0 +s3https://dtn01.sdcc.bnl.gov:9000/eictest/EPIC/Campaigns/22.1/SIDIS/pythia6/ep-10x100/DST_SIDIS_pythia6_ep-10x100_000_0000000_02000_g4event_eval.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/EPIC/Campaigns/22.1/SIDIS/pythia6/ep-10x100/DST_SIDIS_pythia6_ep-10x100_000_0002000_02000_g4event_eval.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/EPIC/Campaigns/22.1/SIDIS/pythia6/ep-10x100/DST_SIDIS_pythia6_ep-10x100_000_0004000_02000_g4event_eval.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/EPIC/Campaigns/22.1/SIDIS/pythia6/ep-10x100/DST_SIDIS_pythia6_ep-10x100_000_0006000_02000_g4event_eval.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/EPIC/Campaigns/22.1/SIDIS/pythia6/ep-10x100/DST_SIDIS_pythia6_ep-10x100_000_0008000_02000_g4event_eval.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/EPIC/Campaigns/22.1/SIDIS/pythia6/ep-10x100/DST_SIDIS_pythia6_ep-10x100_000_0010000_02000_g4event_eval.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/EPIC/Campaigns/22.1/SIDIS/pythia6/ep-10x100/DST_SIDIS_pythia6_ep-10x100_000_0012000_02000_g4event_eval.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/EPIC/Campaigns/22.1/SIDIS/pythia6/ep-10x100/DST_SIDIS_pythia6_ep-10x100_000_0014000_02000_g4event_eval.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/EPIC/Campaigns/22.1/SIDIS/pythia6/ep-10x100/DST_SIDIS_pythia6_ep-10x100_000_0016000_02000_g4event_eval.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/EPIC/Campaigns/22.1/SIDIS/pythia6/ep-10x100/DST_SIDIS_pythia6_ep-10x100_000_0018000_02000_g4event_eval.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/EPIC/Campaigns/22.1/SIDIS/pythia6/ep-10x100/DST_SIDIS_pythia6_ep-10x100_000_0020000_02000_g4event_eval.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/EPIC/Campaigns/22.1/SIDIS/pythia6/ep-10x100/DST_SIDIS_pythia6_ep-10x100_000_0022000_02000_g4event_eval.root + +# Q2 range 2 +:q2min 1.0 +:q2max 100.0 +:crossSection 578400.0 +s3https://dtn01.sdcc.bnl.gov:9000/eictest/EPIC/Campaigns/22.1/SIDIS/pythia6/ep-10x100-q2-low/DST_SIDIS_pythia6_ep-10x100-q2-low_000_0000000_02000_g4event_eval.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/EPIC/Campaigns/22.1/SIDIS/pythia6/ep-10x100-q2-low/DST_SIDIS_pythia6_ep-10x100-q2-low_000_0002000_02000_g4event_eval.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/EPIC/Campaigns/22.1/SIDIS/pythia6/ep-10x100-q2-low/DST_SIDIS_pythia6_ep-10x100-q2-low_000_0004000_02000_g4event_eval.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/EPIC/Campaigns/22.1/SIDIS/pythia6/ep-10x100-q2-low/DST_SIDIS_pythia6_ep-10x100-q2-low_000_0006000_02000_g4event_eval.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/EPIC/Campaigns/22.1/SIDIS/pythia6/ep-10x100-q2-low/DST_SIDIS_pythia6_ep-10x100-q2-low_000_0008000_02000_g4event_eval.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/EPIC/Campaigns/22.1/SIDIS/pythia6/ep-10x100-q2-low/DST_SIDIS_pythia6_ep-10x100-q2-low_000_0010000_02000_g4event_eval.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/EPIC/Campaigns/22.1/SIDIS/pythia6/ep-10x100-q2-low/DST_SIDIS_pythia6_ep-10x100-q2-low_000_0012000_02000_g4event_eval.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/EPIC/Campaigns/22.1/SIDIS/pythia6/ep-10x100-q2-low/DST_SIDIS_pythia6_ep-10x100-q2-low_000_0014000_02000_g4event_eval.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/EPIC/Campaigns/22.1/SIDIS/pythia6/ep-10x100-q2-low/DST_SIDIS_pythia6_ep-10x100-q2-low_000_0016000_02000_g4event_eval.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/EPIC/Campaigns/22.1/SIDIS/pythia6/ep-10x100-q2-low/DST_SIDIS_pythia6_ep-10x100-q2-low_000_0018000_02000_g4event_eval.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/EPIC/Campaigns/22.1/SIDIS/pythia6/ep-10x100-q2-low/DST_SIDIS_pythia6_ep-10x100-q2-low_000_0020000_02000_g4event_eval.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/EPIC/Campaigns/22.1/SIDIS/pythia6/ep-10x100-q2-low/DST_SIDIS_pythia6_ep-10x100-q2-low_000_0022000_02000_g4event_eval.root + +# Q2 range 3 +:q2min 100.0 +:crossSection 1159.0 +s3https://dtn01.sdcc.bnl.gov:9000/eictest/EPIC/Campaigns/22.1/SIDIS/pythia6/ep-10x100-q2-high/DST_SIDIS_pythia6_ep-10x100-q2-high_000_0000000_02000_g4event_eval.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/EPIC/Campaigns/22.1/SIDIS/pythia6/ep-10x100-q2-high/DST_SIDIS_pythia6_ep-10x100-q2-high_000_0002000_02000_g4event_eval.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/EPIC/Campaigns/22.1/SIDIS/pythia6/ep-10x100-q2-high/DST_SIDIS_pythia6_ep-10x100-q2-high_000_0004000_02000_g4event_eval.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/EPIC/Campaigns/22.1/SIDIS/pythia6/ep-10x100-q2-high/DST_SIDIS_pythia6_ep-10x100-q2-high_000_0006000_02000_g4event_eval.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/EPIC/Campaigns/22.1/SIDIS/pythia6/ep-10x100-q2-high/DST_SIDIS_pythia6_ep-10x100-q2-high_000_0008000_02000_g4event_eval.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/EPIC/Campaigns/22.1/SIDIS/pythia6/ep-10x100-q2-high/DST_SIDIS_pythia6_ep-10x100-q2-high_000_0010000_02000_g4event_eval.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/EPIC/Campaigns/22.1/SIDIS/pythia6/ep-10x100-q2-high/DST_SIDIS_pythia6_ep-10x100-q2-high_000_0012000_02000_g4event_eval.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/EPIC/Campaigns/22.1/SIDIS/pythia6/ep-10x100-q2-high/DST_SIDIS_pythia6_ep-10x100-q2-high_000_0014000_02000_g4event_eval.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/EPIC/Campaigns/22.1/SIDIS/pythia6/ep-10x100-q2-high/DST_SIDIS_pythia6_ep-10x100-q2-high_000_0016000_02000_g4event_eval.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/EPIC/Campaigns/22.1/SIDIS/pythia6/ep-10x100-q2-high/DST_SIDIS_pythia6_ep-10x100-q2-high_000_0018000_02000_g4event_eval.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/EPIC/Campaigns/22.1/SIDIS/pythia6/ep-10x100-q2-high/DST_SIDIS_pythia6_ep-10x100-q2-high_000_0020000_02000_g4event_eval.root +s3https://dtn01.sdcc.bnl.gov:9000/eictest/EPIC/Campaigns/22.1/SIDIS/pythia6/ep-10x100-q2-high/DST_SIDIS_pythia6_ep-10x100-q2-high_000_0022000_02000_g4event_eval.root