diff --git a/.github/workflows/linux-eic-shell.yml b/.github/workflows/linux-eic-shell.yml index 05879c7..767f3ba 100644 --- a/.github/workflows/linux-eic-shell.yml +++ b/.github/workflows/linux-eic-shell.yml @@ -27,7 +27,7 @@ jobs: - uses: cvmfs-contrib/github-action-cvmfs@v3 - uses: eic/run-cvmfs-osg-eic-shell@main with: - platform-release: "jug_xl:nightly" + platform-release: "eic_xl:nightly" run: | CC=${{matrix.cc}} CXX=${{matrix.cxx}} cmake -S . -B build -DDELPHES=ON -DEVALUATION=OFF -DCMAKE_INSTALL_PREFIX=install cmake --build build diff --git a/.gitignore b/.gitignore index 8f37f14..04088e1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ .*.sw* build athena -*.root sim/macro/tmp*.mac diff --git a/CMakeLists.txt b/CMakeLists.txt index 6d5d420..92e4d3b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.0.0 FATAL_ERROR) project(IRT - VERSION 1.0.5 + VERSION 2.1.0 LANGUAGES CXX ) @@ -18,7 +18,7 @@ option(IRT_ROOT_IO "Generate dictionary for ROOT I/O of libIRT objects" ON) list(APPEND CMAKE_PREFIX_PATH $ENV{ROOTSYS}) set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) -find_package(ROOT 6 REQUIRED COMPONENTS Core RIO Hist Tree) +find_package(ROOT 6 REQUIRED COMPONENTS Core EG Hist MathCore RIO Tree) include(${ROOT_USE_FILE}) #---------------------------------------------------------------------------- @@ -41,6 +41,8 @@ else() endif() endif() +set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-vla-cxx-extension") + #---------------------------------------------------------------------------- # IRT library @@ -48,16 +50,39 @@ endif() include_directories( ${PROJECT_SOURCE_DIR}/include ${ROOT_INCLUDE_DIRS} + + # For now assume that newly installed edm4eic::(CherenkovPID, ...) event structures are available + # in the same place where IRT is supposed to be installed; + ${CMAKE_INSTALL_PREFIX}/include + + # Help ePIC installation find json.hpp if needed; + #/opt/local/include ) file(GLOB HEADERS ${PROJECT_SOURCE_DIR}/include/*.h) list(FILTER HEADERS EXCLUDE REGEX "LinkDef\\.h$") +#if(DEFINED EICRECON) +# set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DEICRECON") +#endif() + # sources set(IRT_SRC + ${PROJECT_SOURCE_DIR}/source/ParametricSurface.cc ${PROJECT_SOURCE_DIR}/source/SphericalSurface.cc + ${PROJECT_SOURCE_DIR}/source/ToricSurface.cc + ${PROJECT_SOURCE_DIR}/source/CylindricalSurface.cc + ${PROJECT_SOURCE_DIR}/source/ConicalSurface.cc ${PROJECT_SOURCE_DIR}/source/FlatSurface.cc ${PROJECT_SOURCE_DIR}/source/IRT.cc ${PROJECT_SOURCE_DIR}/source/ChargedParticle.cc + ${PROJECT_SOURCE_DIR}/source/CherenkovRadiator.cc + + ${PROJECT_SOURCE_DIR}/source/DigitizedHit.cc + ${PROJECT_SOURCE_DIR}/source/GeantImport.cc + #${PROJECT_SOURCE_DIR}/source/Configuration.cc + ${PROJECT_SOURCE_DIR}/source/Calibration.cc + ${PROJECT_SOURCE_DIR}/source/Digitization.cc + ${PROJECT_SOURCE_DIR}/source/ReconstructionFactory.cc ) if(IRT_ROOT_IO) set(IRT_DICT G__${CMAKE_PROJECT_NAME}) @@ -87,7 +112,7 @@ if(IRT_ROOT_IO) endif() # linking -target_link_libraries(${CMAKE_PROJECT_NAME} ROOT::Core ROOT::Physics) +target_link_libraries(${CMAKE_PROJECT_NAME} ROOT::Core ROOT::EG ROOT::Hist ROOT::RIO ROOT::MathCore ROOT::Tree) #---------------------------------------------------------------------------- # optional targets diff --git a/delphes/database/dp_p_parameters_22.11.2.txt b/delphes/database/dp_p_parameters_22.11.2.txt new file mode 100644 index 0000000..0f10e2d --- /dev/null +++ b/delphes/database/dp_p_parameters_22.11.2.txt @@ -0,0 +1,11 @@ +Fit Function: TMath::Sqrt(A*A*p*p + B*B) +eta_low eta_up A(%/GeV/c) A_error(%/GeV/c) B(%) B_error(%) +-3.750000 -3.500000 0.877826 0.309161 5.340663 3.111992 +-3.500000 -3.250000 0.378699 0.031187 5.788582 0.254332 +-3.250000 -3.000000 0.160939 0.006459 3.919744 0.042138 +-3.000000 -2.750000 0.109806 0.003064 3.069245 0.016178 +-2.750000 -2.500000 0.079910 0.001914 2.306708 0.009870 +-2.500000 -2.250000 0.044451 0.001313 1.727002 0.005510 +-2.250000 -2.000000 0.031395 0.000849 1.335242 0.003319 +-2.000000 -1.750000 0.023104 0.000512 0.997181 0.001978 +-1.750000 -1.500000 0.020739 0.000367 0.918249 0.001263 diff --git a/delphes/database/dph_parameters_22.11.2.txt b/delphes/database/dph_parameters_22.11.2.txt new file mode 100644 index 0000000..353339f --- /dev/null +++ b/delphes/database/dph_parameters_22.11.2.txt @@ -0,0 +1,11 @@ +Fit Function: TMath::Sqrt(A*A/p/p + B*B) +eta_low eta_up A(mrad*GeV/c) A_error(mrad*GeV/c) B(mrad) B_error(mrad) +-3.750000 -3.500000 8.767745 2.975858 2.840607 0.185980 +-3.500000 -3.250000 26.223149 4.695639 2.166096 1.177175 +-3.250000 -3.000000 24.668888 2.148689 1.097056 0.695744 +-3.000000 -2.750000 13.564047 0.683447 1.383093 0.303657 +-2.750000 -2.500000 10.659769 0.283753 0.761713 0.130763 +-2.500000 -2.250000 7.193395 0.211557 0.554353 0.146864 +-2.250000 -2.000000 5.804141 0.103400 0.377310 0.071403 +-2.000000 -1.750000 4.601817 0.040954 0.360673 0.027744 +-1.750000 -1.500000 2.918327 0.013354 0.226098 0.008278 diff --git a/delphes/database/dth_parameters_22.11.2.txt b/delphes/database/dth_parameters_22.11.2.txt new file mode 100644 index 0000000..83588e8 --- /dev/null +++ b/delphes/database/dth_parameters_22.11.2.txt @@ -0,0 +1,11 @@ +Fit Function: TMath::Sqrt(A*A/p/p + B*B) +eta_low eta_up A(mrad*GeV/c) A_error(mrad*GeV/c) B(mrad) B_error(mrad) +-3.750000 -3.500000 0.460936 0.020625 0.031520 0.010290 +-3.500000 -3.250000 0.397658 0.007943 0.059921 0.004048 +-3.250000 -3.000000 0.308481 0.004553 0.091966 0.002631 +-3.000000 -2.750000 0.360891 0.004550 0.140578 0.002855 +-2.750000 -2.500000 0.671160 0.010679 0.156604 0.002246 +-2.500000 -2.250000 1.118727 0.008803 0.095410 0.002425 +-2.250000 -2.000000 1.325261 0.007638 0.066403 0.002405 +-2.000000 -1.750000 1.558780 0.007507 0.067387 0.002469 +-1.750000 -1.500000 0.947363 0.007429 0.070301 0.004823 diff --git a/delphes/database/par_ph.modified.txt b/delphes/database/par_ph.modified.txt new file mode 100644 index 0000000..72d755c --- /dev/null +++ b/delphes/database/par_ph.modified.txt @@ -0,0 +1,11 @@ +Fit Function: TMath::Sqrt(A*A/p/p + B*B) +eta theta(deg) phi(deg) A(mrad*GeV/c) A_error(mrad*GeV/c) B(mrad) B_error(mrad) +-1.90 -1.50 8.94625 0.01041 0.11778 0.00430 +-2.10 -1.90 10.66608 0.01247 0.16708 0.00445 +-2.30 -2.10 10.45560 0.01217 0.15283 0.00470 +-2.50 -2.30 12.95601 0.01529 0.19061 0.00577 +-2.70 -2.50 16.25261 0.01902 0.31083 0.00559 +-2.90 -2.70 20.10263 0.02393 0.43041 0.00649 +-3.10 -2.90 25.21533 0.03046 0.74886 0.00629 +-3.30 -3.10 30.57967 0.03829 1.23431 0.00642 +-3.50 -3.30 37.86733 0.04794 1.91826 0.00721 diff --git a/delphes/database/par_ph.txt b/delphes/database/par_ph.txt new file mode 100644 index 0000000..5d2375e --- /dev/null +++ b/delphes/database/par_ph.txt @@ -0,0 +1,11 @@ +Fit Function: TMath::Sqrt(A*A/p/p + B*B) +eta theta(deg) phi(deg) A(mrad*GeV/c) A_error(mrad*GeV/c) B(mrad) B_error(mrad) +-1.80 161.20 75.00 8.94625 0.01041 0.11778 0.00430 +-2.00 164.60 75.00 10.66608 0.01247 0.16708 0.00445 +-2.20 167.40 75.00 10.45560 0.01217 0.15283 0.00470 +-2.40 169.60 75.00 12.95601 0.01529 0.19061 0.00577 +-2.60 171.50 75.00 16.25261 0.01902 0.31083 0.00559 +-2.79 173.00 75.00 20.10263 0.02393 0.43041 0.00649 +-3.00 174.30 75.00 25.21533 0.03046 0.74886 0.00629 +-3.19 175.30 75.00 30.57967 0.03829 1.23431 0.00642 +-3.41 176.20 75.00 37.86733 0.04794 1.91826 0.00721 diff --git a/delphes/database/par_th.modified.txt b/delphes/database/par_th.modified.txt new file mode 100644 index 0000000..b868df2 --- /dev/null +++ b/delphes/database/par_th.modified.txt @@ -0,0 +1,11 @@ +Fit Function: TMath::Sqrt(A*A/p/p + B*B) +eta theta(deg) phi(deg) A(mrad*GeV/c) A_error(mrad*GeV/c) B(mrad) B_error(mrad) +-1.90 -1.50 1.55478 0.00199 0.07303 0.00033 +-2.10 -1.90 1.87628 0.00266 0.06926 0.00043 +-2.30 -2.10 1.46848 0.00197 0.04872 0.00032 +-2.50 -2.30 1.32076 0.00194 0.07509 0.00024 +-2.70 -2.50 1.32949 0.00244 0.08976 0.00027 +-2.90 -2.70 0.74853 0.00198 0.12466 0.00019 +-3.10 -2.90 0.19174 0.00078 0.12507 0.00013 +-3.30 -3.10 0.13527 0.00061 0.08524 0.00010 +-3.50 -3.30 0.30369 0.00056 0.04715 0.00008 diff --git a/delphes/database/par_th.txt b/delphes/database/par_th.txt new file mode 100644 index 0000000..62f5391 --- /dev/null +++ b/delphes/database/par_th.txt @@ -0,0 +1,11 @@ +Fit Function: TMath::Sqrt(A*A/p/p + B*B) +eta theta(deg) phi(deg) A(mrad*GeV/c) A_error(mrad*GeV/c) B(mrad) B_error(mrad) +-1.80 161.20 75.00 1.55478 0.00199 0.07303 0.00033 +-2.00 164.60 75.00 1.87628 0.00266 0.06926 0.00043 +-2.20 167.40 75.00 1.46848 0.00197 0.04872 0.00032 +-2.40 169.60 75.00 1.32076 0.00194 0.07509 0.00024 +-2.60 171.50 75.00 1.32949 0.00244 0.08976 0.00027 +-2.79 173.00 75.00 0.74853 0.00198 0.12466 0.00019 +-3.00 174.30 75.00 0.19174 0.00078 0.12507 0.00013 +-3.19 175.30 75.00 0.13527 0.00061 0.08524 0.00010 +-3.41 176.20 75.00 0.30369 0.00056 0.04715 0.00008 diff --git a/delphes/database/pfRICH_e_pi_pid.v00a.root b/delphes/database/pfRICH_e_pi_pid.v00a.root new file mode 100644 index 0000000..639fe56 Binary files /dev/null and b/delphes/database/pfRICH_e_pi_pid.v00a.root differ diff --git a/delphes/database/pfRICH_e_pi_pid.v00a.tcl b/delphes/database/pfRICH_e_pi_pid.v00a.tcl new file mode 100644 index 0000000..504c220 --- /dev/null +++ b/delphes/database/pfRICH_e_pi_pid.v00a.tcl @@ -0,0 +1,310 @@ +module IdentificationMap pfRICH { + set InputArray TrackMerger/tracks + set OutputArray tracks + + add EfficiencyFormula {11} {11} { + (eta< -3.50 || eta>= -1.50 || pt * cosh(eta) < 0.05 || pt * cosh(eta) >= 5.50) * ( 0.00 ) + + ( -3.50 <= eta && eta < -2.80) * ( 0.05 <= pt * cosh(eta) && pt * cosh(eta) < 0.10) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.10 <= pt * cosh(eta) && pt * cosh(eta) < 0.15) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.15 <= pt * cosh(eta) && pt * cosh(eta) < 0.20) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.25) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.25 <= pt * cosh(eta) && pt * cosh(eta) < 0.30) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.30 <= pt * cosh(eta) && pt * cosh(eta) < 0.35) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.35 <= pt * cosh(eta) && pt * cosh(eta) < 0.40) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (0.999994) + + ( -3.50 <= eta && eta < -2.80) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.995244) + + ( -3.50 <= eta && eta < -2.80) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.956733) + + ( -3.50 <= eta && eta < -2.80) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.880732) + + ( -3.50 <= eta && eta < -2.80) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.805326) + + ( -3.50 <= eta && eta < -2.80) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.748109) + + ( -3.50 <= eta && eta < -2.80) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.702808) + + ( -3.50 <= eta && eta < -2.80) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.666449) + + ( -3.50 <= eta && eta < -2.80) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.639269) + + ( -2.80 <= eta && eta < -1.90) * ( 0.05 <= pt * cosh(eta) && pt * cosh(eta) < 0.10) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.10 <= pt * cosh(eta) && pt * cosh(eta) < 0.15) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.15 <= pt * cosh(eta) && pt * cosh(eta) < 0.20) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.25) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.25 <= pt * cosh(eta) && pt * cosh(eta) < 0.30) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.30 <= pt * cosh(eta) && pt * cosh(eta) < 0.35) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.35 <= pt * cosh(eta) && pt * cosh(eta) < 0.40) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (0.999999) + + ( -2.80 <= eta && eta < -1.90) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.997324) + + ( -2.80 <= eta && eta < -1.90) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.962280) + + ( -2.80 <= eta && eta < -1.90) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.892478) + + ( -2.80 <= eta && eta < -1.90) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.815694) + + ( -2.80 <= eta && eta < -1.90) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.758031) + + ( -2.80 <= eta && eta < -1.90) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.709886) + + ( -2.80 <= eta && eta < -1.90) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.670105) + + ( -2.80 <= eta && eta < -1.90) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.642139) + + ( -1.90 <= eta && eta < -1.50) * ( 0.05 <= pt * cosh(eta) && pt * cosh(eta) < 0.10) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.10 <= pt * cosh(eta) && pt * cosh(eta) < 0.15) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.15 <= pt * cosh(eta) && pt * cosh(eta) < 0.20) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.25) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.25 <= pt * cosh(eta) && pt * cosh(eta) < 0.30) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.30 <= pt * cosh(eta) && pt * cosh(eta) < 0.35) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.35 <= pt * cosh(eta) && pt * cosh(eta) < 0.40) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.998315) + + ( -1.90 <= eta && eta < -1.50) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.972088) + + ( -1.90 <= eta && eta < -1.50) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.903469) + + ( -1.90 <= eta && eta < -1.50) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.824676) + + ( -1.90 <= eta && eta < -1.50) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.765578) + + ( -1.90 <= eta && eta < -1.50) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.712375) + + ( -1.90 <= eta && eta < -1.50) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.674821) + + ( -1.90 <= eta && eta < -1.50) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.646890) + } + + add EfficiencyFormula {11} {211} { + (eta< -3.50 || eta>= -1.50 || pt * cosh(eta) < 0.05 || pt * cosh(eta) >= 5.50) * ( 0.00 ) + + ( -3.50 <= eta && eta < -2.80) * ( 0.05 <= pt * cosh(eta) && pt * cosh(eta) < 0.10) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.10 <= pt * cosh(eta) && pt * cosh(eta) < 0.15) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.15 <= pt * cosh(eta) && pt * cosh(eta) < 0.20) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.25) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.25 <= pt * cosh(eta) && pt * cosh(eta) < 0.30) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.30 <= pt * cosh(eta) && pt * cosh(eta) < 0.35) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.35 <= pt * cosh(eta) && pt * cosh(eta) < 0.40) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (0.000006) + + ( -3.50 <= eta && eta < -2.80) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.004756) + + ( -3.50 <= eta && eta < -2.80) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.043267) + + ( -3.50 <= eta && eta < -2.80) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.119268) + + ( -3.50 <= eta && eta < -2.80) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.194674) + + ( -3.50 <= eta && eta < -2.80) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.251891) + + ( -3.50 <= eta && eta < -2.80) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.297192) + + ( -3.50 <= eta && eta < -2.80) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.333551) + + ( -3.50 <= eta && eta < -2.80) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.360731) + + ( -2.80 <= eta && eta < -1.90) * ( 0.05 <= pt * cosh(eta) && pt * cosh(eta) < 0.10) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.10 <= pt * cosh(eta) && pt * cosh(eta) < 0.15) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.15 <= pt * cosh(eta) && pt * cosh(eta) < 0.20) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.25) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.25 <= pt * cosh(eta) && pt * cosh(eta) < 0.30) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.30 <= pt * cosh(eta) && pt * cosh(eta) < 0.35) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.35 <= pt * cosh(eta) && pt * cosh(eta) < 0.40) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (0.000001) + + ( -2.80 <= eta && eta < -1.90) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.002676) + + ( -2.80 <= eta && eta < -1.90) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.037720) + + ( -2.80 <= eta && eta < -1.90) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.107522) + + ( -2.80 <= eta && eta < -1.90) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.184306) + + ( -2.80 <= eta && eta < -1.90) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.241969) + + ( -2.80 <= eta && eta < -1.90) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.290114) + + ( -2.80 <= eta && eta < -1.90) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.329895) + + ( -2.80 <= eta && eta < -1.90) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.357861) + + ( -1.90 <= eta && eta < -1.50) * ( 0.05 <= pt * cosh(eta) && pt * cosh(eta) < 0.10) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.10 <= pt * cosh(eta) && pt * cosh(eta) < 0.15) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.15 <= pt * cosh(eta) && pt * cosh(eta) < 0.20) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.25) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.25 <= pt * cosh(eta) && pt * cosh(eta) < 0.30) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.30 <= pt * cosh(eta) && pt * cosh(eta) < 0.35) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.35 <= pt * cosh(eta) && pt * cosh(eta) < 0.40) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.001685) + + ( -1.90 <= eta && eta < -1.50) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.027912) + + ( -1.90 <= eta && eta < -1.50) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.096531) + + ( -1.90 <= eta && eta < -1.50) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.175324) + + ( -1.90 <= eta && eta < -1.50) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.234422) + + ( -1.90 <= eta && eta < -1.50) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.287625) + + ( -1.90 <= eta && eta < -1.50) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.325179) + + ( -1.90 <= eta && eta < -1.50) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.353110) + } + + add EfficiencyFormula {211} {11} { + (eta< -3.50 || eta>= -1.50 || pt * cosh(eta) < 0.05 || pt * cosh(eta) >= 5.50) * ( 0.00 ) + + ( -3.50 <= eta && eta < -2.80) * ( 0.05 <= pt * cosh(eta) && pt * cosh(eta) < 0.10) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.10 <= pt * cosh(eta) && pt * cosh(eta) < 0.15) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.15 <= pt * cosh(eta) && pt * cosh(eta) < 0.20) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.25) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.25 <= pt * cosh(eta) && pt * cosh(eta) < 0.30) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.30 <= pt * cosh(eta) && pt * cosh(eta) < 0.35) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.35 <= pt * cosh(eta) && pt * cosh(eta) < 0.40) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (0.000003) + + ( -3.50 <= eta && eta < -2.80) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.003967) + + ( -3.50 <= eta && eta < -2.80) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.043267) + + ( -3.50 <= eta && eta < -2.80) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.114567) + + ( -3.50 <= eta && eta < -2.80) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.187086) + + ( -3.50 <= eta && eta < -2.80) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.250711) + + ( -3.50 <= eta && eta < -2.80) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.291806) + + ( -3.50 <= eta && eta < -2.80) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.336240) + + ( -3.50 <= eta && eta < -2.80) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.362297) + + ( -2.80 <= eta && eta < -1.90) * ( 0.05 <= pt * cosh(eta) && pt * cosh(eta) < 0.10) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.10 <= pt * cosh(eta) && pt * cosh(eta) < 0.15) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.15 <= pt * cosh(eta) && pt * cosh(eta) < 0.20) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.25) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.25 <= pt * cosh(eta) && pt * cosh(eta) < 0.30) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.30 <= pt * cosh(eta) && pt * cosh(eta) < 0.35) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.35 <= pt * cosh(eta) && pt * cosh(eta) < 0.40) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.002201) + + ( -2.80 <= eta && eta < -1.90) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.035557) + + ( -2.80 <= eta && eta < -1.90) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.105050) + + ( -2.80 <= eta && eta < -1.90) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.176144) + + ( -2.80 <= eta && eta < -1.90) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.241969) + + ( -2.80 <= eta && eta < -1.90) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.291244) + + ( -2.80 <= eta && eta < -1.90) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.330848) + + ( -2.80 <= eta && eta < -1.90) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.359503) + + ( -1.90 <= eta && eta < -1.50) * ( 0.05 <= pt * cosh(eta) && pt * cosh(eta) < 0.10) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.10 <= pt * cosh(eta) && pt * cosh(eta) < 0.15) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.15 <= pt * cosh(eta) && pt * cosh(eta) < 0.20) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.25) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.25 <= pt * cosh(eta) && pt * cosh(eta) < 0.30) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.30 <= pt * cosh(eta) && pt * cosh(eta) < 0.35) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.35 <= pt * cosh(eta) && pt * cosh(eta) < 0.40) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.001393) + + ( -1.90 <= eta && eta < -1.50) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.029973) + + ( -1.90 <= eta && eta < -1.50) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.100385) + + ( -1.90 <= eta && eta < -1.50) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.172467) + + ( -1.90 <= eta && eta < -1.50) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.235783) + + ( -1.90 <= eta && eta < -1.50) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.285248) + + ( -1.90 <= eta && eta < -1.50) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.323115) + + ( -1.90 <= eta && eta < -1.50) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.351303) + } + + add EfficiencyFormula {211} {211} { + (eta< -3.50 || eta>= -1.50 || pt * cosh(eta) < 0.05 || pt * cosh(eta) >= 5.50) * ( 0.00 ) + + ( -3.50 <= eta && eta < -2.80) * ( 0.05 <= pt * cosh(eta) && pt * cosh(eta) < 0.10) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.10 <= pt * cosh(eta) && pt * cosh(eta) < 0.15) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.15 <= pt * cosh(eta) && pt * cosh(eta) < 0.20) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.25) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.25 <= pt * cosh(eta) && pt * cosh(eta) < 0.30) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.30 <= pt * cosh(eta) && pt * cosh(eta) < 0.35) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.35 <= pt * cosh(eta) && pt * cosh(eta) < 0.40) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (0.999997) + + ( -3.50 <= eta && eta < -2.80) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.996033) + + ( -3.50 <= eta && eta < -2.80) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.956733) + + ( -3.50 <= eta && eta < -2.80) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.885433) + + ( -3.50 <= eta && eta < -2.80) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.812914) + + ( -3.50 <= eta && eta < -2.80) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.749289) + + ( -3.50 <= eta && eta < -2.80) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.708194) + + ( -3.50 <= eta && eta < -2.80) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.663760) + + ( -3.50 <= eta && eta < -2.80) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.637703) + + ( -2.80 <= eta && eta < -1.90) * ( 0.05 <= pt * cosh(eta) && pt * cosh(eta) < 0.10) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.10 <= pt * cosh(eta) && pt * cosh(eta) < 0.15) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.15 <= pt * cosh(eta) && pt * cosh(eta) < 0.20) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.25) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.25 <= pt * cosh(eta) && pt * cosh(eta) < 0.30) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.30 <= pt * cosh(eta) && pt * cosh(eta) < 0.35) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.35 <= pt * cosh(eta) && pt * cosh(eta) < 0.40) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.997799) + + ( -2.80 <= eta && eta < -1.90) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.964443) + + ( -2.80 <= eta && eta < -1.90) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.894950) + + ( -2.80 <= eta && eta < -1.90) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.823856) + + ( -2.80 <= eta && eta < -1.90) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.758031) + + ( -2.80 <= eta && eta < -1.90) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.708756) + + ( -2.80 <= eta && eta < -1.90) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.669152) + + ( -2.80 <= eta && eta < -1.90) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.640497) + + ( -1.90 <= eta && eta < -1.50) * ( 0.05 <= pt * cosh(eta) && pt * cosh(eta) < 0.10) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.10 <= pt * cosh(eta) && pt * cosh(eta) < 0.15) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.15 <= pt * cosh(eta) && pt * cosh(eta) < 0.20) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.25) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.25 <= pt * cosh(eta) && pt * cosh(eta) < 0.30) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.30 <= pt * cosh(eta) && pt * cosh(eta) < 0.35) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.35 <= pt * cosh(eta) && pt * cosh(eta) < 0.40) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.998607) + + ( -1.90 <= eta && eta < -1.50) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.970027) + + ( -1.90 <= eta && eta < -1.50) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.899615) + + ( -1.90 <= eta && eta < -1.50) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.827533) + + ( -1.90 <= eta && eta < -1.50) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.764217) + + ( -1.90 <= eta && eta < -1.50) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.714752) + + ( -1.90 <= eta && eta < -1.50) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.676885) + + ( -1.90 <= eta && eta < -1.50) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.648697) + } + + add EfficiencyFormula {0} {0} { 0.00 } +} diff --git a/delphes/database/pfRICH_e_pi_pid.v00b.root b/delphes/database/pfRICH_e_pi_pid.v00b.root new file mode 100644 index 0000000..3bd3d50 Binary files /dev/null and b/delphes/database/pfRICH_e_pi_pid.v00b.root differ diff --git a/delphes/database/pfRICH_e_pi_pid.v00b.tcl b/delphes/database/pfRICH_e_pi_pid.v00b.tcl new file mode 100644 index 0000000..d261ee1 --- /dev/null +++ b/delphes/database/pfRICH_e_pi_pid.v00b.tcl @@ -0,0 +1,310 @@ +module IdentificationMap pfRICH { + set InputArray TrackMerger/tracks + set OutputArray tracks + + add EfficiencyFormula {11} {11} { + (eta< -3.50 || eta>= -1.50 || pt * cosh(eta) < 0.05 || pt * cosh(eta) >= 5.50) * ( 0.00 ) + + ( -3.50 <= eta && eta < -2.80) * ( 0.05 <= pt * cosh(eta) && pt * cosh(eta) < 0.10) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.10 <= pt * cosh(eta) && pt * cosh(eta) < 0.15) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.15 <= pt * cosh(eta) && pt * cosh(eta) < 0.20) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.25) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.25 <= pt * cosh(eta) && pt * cosh(eta) < 0.30) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.30 <= pt * cosh(eta) && pt * cosh(eta) < 0.35) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.35 <= pt * cosh(eta) && pt * cosh(eta) < 0.40) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (0.999307) + + ( -3.50 <= eta && eta < -2.80) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.999417) + + ( -3.50 <= eta && eta < -2.80) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.977377) + + ( -3.50 <= eta && eta < -2.80) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.905071) + + ( -3.50 <= eta && eta < -2.80) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.824029) + + ( -3.50 <= eta && eta < -2.80) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.761750) + + ( -3.50 <= eta && eta < -2.80) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.712463) + + ( -3.50 <= eta && eta < -2.80) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.673177) + + ( -3.50 <= eta && eta < -2.80) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.644137) + + ( -2.80 <= eta && eta < -1.90) * ( 0.05 <= pt * cosh(eta) && pt * cosh(eta) < 0.10) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.10 <= pt * cosh(eta) && pt * cosh(eta) < 0.15) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.15 <= pt * cosh(eta) && pt * cosh(eta) < 0.20) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.25) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.25 <= pt * cosh(eta) && pt * cosh(eta) < 0.30) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.30 <= pt * cosh(eta) && pt * cosh(eta) < 0.35) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.35 <= pt * cosh(eta) && pt * cosh(eta) < 0.40) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (0.998847) + + ( -2.80 <= eta && eta < -1.90) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.999532) + + ( -2.80 <= eta && eta < -1.90) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.976676) + + ( -2.80 <= eta && eta < -1.90) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.910607) + + ( -2.80 <= eta && eta < -1.90) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.830012) + + ( -2.80 <= eta && eta < -1.90) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.768807) + + ( -2.80 <= eta && eta < -1.90) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.717503) + + ( -2.80 <= eta && eta < -1.90) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.675275) + + ( -2.80 <= eta && eta < -1.90) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.645911) + + ( -1.90 <= eta && eta < -1.50) * ( 0.05 <= pt * cosh(eta) && pt * cosh(eta) < 0.10) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.10 <= pt * cosh(eta) && pt * cosh(eta) < 0.15) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.15 <= pt * cosh(eta) && pt * cosh(eta) < 0.20) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.25) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.25 <= pt * cosh(eta) && pt * cosh(eta) < 0.30) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.30 <= pt * cosh(eta) && pt * cosh(eta) < 0.35) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.35 <= pt * cosh(eta) && pt * cosh(eta) < 0.40) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (0.999281) + + ( -1.90 <= eta && eta < -1.50) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.999533) + + ( -1.90 <= eta && eta < -1.50) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.981260) + + ( -1.90 <= eta && eta < -1.50) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.916096) + + ( -1.90 <= eta && eta < -1.50) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.834773) + + ( -1.90 <= eta && eta < -1.50) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.773196) + + ( -1.90 <= eta && eta < -1.50) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.717491) + + ( -1.90 <= eta && eta < -1.50) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.678464) + + ( -1.90 <= eta && eta < -1.50) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.649592) + } + + add EfficiencyFormula {11} {211} { + (eta< -3.50 || eta>= -1.50 || pt * cosh(eta) < 0.05 || pt * cosh(eta) >= 5.50) * ( 0.00 ) + + ( -3.50 <= eta && eta < -2.80) * ( 0.05 <= pt * cosh(eta) && pt * cosh(eta) < 0.10) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.10 <= pt * cosh(eta) && pt * cosh(eta) < 0.15) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.15 <= pt * cosh(eta) && pt * cosh(eta) < 0.20) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.25) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.25 <= pt * cosh(eta) && pt * cosh(eta) < 0.30) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.30 <= pt * cosh(eta) && pt * cosh(eta) < 0.35) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.35 <= pt * cosh(eta) && pt * cosh(eta) < 0.40) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (0.000693) + + ( -3.50 <= eta && eta < -2.80) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.000583) + + ( -3.50 <= eta && eta < -2.80) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.022623) + + ( -3.50 <= eta && eta < -2.80) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.094929) + + ( -3.50 <= eta && eta < -2.80) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.175971) + + ( -3.50 <= eta && eta < -2.80) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.238250) + + ( -3.50 <= eta && eta < -2.80) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.287537) + + ( -3.50 <= eta && eta < -2.80) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.326823) + + ( -3.50 <= eta && eta < -2.80) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.355863) + + ( -2.80 <= eta && eta < -1.90) * ( 0.05 <= pt * cosh(eta) && pt * cosh(eta) < 0.10) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.10 <= pt * cosh(eta) && pt * cosh(eta) < 0.15) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.15 <= pt * cosh(eta) && pt * cosh(eta) < 0.20) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.25) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.25 <= pt * cosh(eta) && pt * cosh(eta) < 0.30) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.30 <= pt * cosh(eta) && pt * cosh(eta) < 0.35) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.35 <= pt * cosh(eta) && pt * cosh(eta) < 0.40) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (0.001153) + + ( -2.80 <= eta && eta < -1.90) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.000468) + + ( -2.80 <= eta && eta < -1.90) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.023324) + + ( -2.80 <= eta && eta < -1.90) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.089393) + + ( -2.80 <= eta && eta < -1.90) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.169988) + + ( -2.80 <= eta && eta < -1.90) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.231193) + + ( -2.80 <= eta && eta < -1.90) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.282497) + + ( -2.80 <= eta && eta < -1.90) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.324725) + + ( -2.80 <= eta && eta < -1.90) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.354089) + + ( -1.90 <= eta && eta < -1.50) * ( 0.05 <= pt * cosh(eta) && pt * cosh(eta) < 0.10) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.10 <= pt * cosh(eta) && pt * cosh(eta) < 0.15) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.15 <= pt * cosh(eta) && pt * cosh(eta) < 0.20) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.25) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.25 <= pt * cosh(eta) && pt * cosh(eta) < 0.30) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.30 <= pt * cosh(eta) && pt * cosh(eta) < 0.35) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.35 <= pt * cosh(eta) && pt * cosh(eta) < 0.40) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (0.000719) + + ( -1.90 <= eta && eta < -1.50) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.000467) + + ( -1.90 <= eta && eta < -1.50) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.018740) + + ( -1.90 <= eta && eta < -1.50) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.083904) + + ( -1.90 <= eta && eta < -1.50) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.165227) + + ( -1.90 <= eta && eta < -1.50) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.226804) + + ( -1.90 <= eta && eta < -1.50) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.282509) + + ( -1.90 <= eta && eta < -1.50) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.321536) + + ( -1.90 <= eta && eta < -1.50) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.350408) + } + + add EfficiencyFormula {211} {11} { + (eta< -3.50 || eta>= -1.50 || pt * cosh(eta) < 0.05 || pt * cosh(eta) >= 5.50) * ( 0.00 ) + + ( -3.50 <= eta && eta < -2.80) * ( 0.05 <= pt * cosh(eta) && pt * cosh(eta) < 0.10) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.10 <= pt * cosh(eta) && pt * cosh(eta) < 0.15) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.15 <= pt * cosh(eta) && pt * cosh(eta) < 0.20) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.25) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.25 <= pt * cosh(eta) && pt * cosh(eta) < 0.30) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.30 <= pt * cosh(eta) && pt * cosh(eta) < 0.35) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.35 <= pt * cosh(eta) && pt * cosh(eta) < 0.40) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.000374) + + ( -3.50 <= eta && eta < -2.80) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.022623) + + ( -3.50 <= eta && eta < -2.80) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.089443) + + ( -3.50 <= eta && eta < -2.80) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.166922) + + ( -3.50 <= eta && eta < -2.80) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.236866) + + ( -3.50 <= eta && eta < -2.80) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.281323) + + ( -3.50 <= eta && eta < -2.80) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.329845) + + ( -3.50 <= eta && eta < -2.80) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.357597) + + ( -2.80 <= eta && eta < -1.90) * ( 0.05 <= pt * cosh(eta) && pt * cosh(eta) < 0.10) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.10 <= pt * cosh(eta) && pt * cosh(eta) < 0.15) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.15 <= pt * cosh(eta) && pt * cosh(eta) < 0.20) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.25) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.25 <= pt * cosh(eta) && pt * cosh(eta) < 0.30) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.30 <= pt * cosh(eta) && pt * cosh(eta) < 0.35) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.35 <= pt * cosh(eta) && pt * cosh(eta) < 0.40) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.000318) + + ( -2.80 <= eta && eta < -1.90) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.021305) + + ( -2.80 <= eta && eta < -1.90) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.086640) + + ( -2.80 <= eta && eta < -1.90) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.160689) + + ( -2.80 <= eta && eta < -1.90) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.231193) + + ( -2.80 <= eta && eta < -1.90) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.283753) + + ( -2.80 <= eta && eta < -1.90) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.325768) + + ( -2.80 <= eta && eta < -1.90) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.355864) + + ( -1.90 <= eta && eta < -1.50) * ( 0.05 <= pt * cosh(eta) && pt * cosh(eta) < 0.10) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.10 <= pt * cosh(eta) && pt * cosh(eta) < 0.15) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.15 <= pt * cosh(eta) && pt * cosh(eta) < 0.20) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.25) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.25 <= pt * cosh(eta) && pt * cosh(eta) < 0.30) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.30 <= pt * cosh(eta) && pt * cosh(eta) < 0.35) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.35 <= pt * cosh(eta) && pt * cosh(eta) < 0.40) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.000344) + + ( -1.90 <= eta && eta < -1.50) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.020651) + + ( -1.90 <= eta && eta < -1.50) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.088040) + + ( -1.90 <= eta && eta < -1.50) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.162106) + + ( -1.90 <= eta && eta < -1.50) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.228283) + + ( -1.90 <= eta && eta < -1.50) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.279955) + + ( -1.90 <= eta && eta < -1.50) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.319340) + + ( -1.90 <= eta && eta < -1.50) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.348499) + } + + add EfficiencyFormula {211} {211} { + (eta< -3.50 || eta>= -1.50 || pt * cosh(eta) < 0.05 || pt * cosh(eta) >= 5.50) * ( 0.00 ) + + ( -3.50 <= eta && eta < -2.80) * ( 0.05 <= pt * cosh(eta) && pt * cosh(eta) < 0.10) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.10 <= pt * cosh(eta) && pt * cosh(eta) < 0.15) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.15 <= pt * cosh(eta) && pt * cosh(eta) < 0.20) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.25) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.25 <= pt * cosh(eta) && pt * cosh(eta) < 0.30) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.30 <= pt * cosh(eta) && pt * cosh(eta) < 0.35) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.35 <= pt * cosh(eta) && pt * cosh(eta) < 0.40) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.999626) + + ( -3.50 <= eta && eta < -2.80) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.977377) + + ( -3.50 <= eta && eta < -2.80) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.910557) + + ( -3.50 <= eta && eta < -2.80) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.833078) + + ( -3.50 <= eta && eta < -2.80) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.763134) + + ( -3.50 <= eta && eta < -2.80) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.718677) + + ( -3.50 <= eta && eta < -2.80) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.670155) + + ( -3.50 <= eta && eta < -2.80) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.642403) + + ( -2.80 <= eta && eta < -1.90) * ( 0.05 <= pt * cosh(eta) && pt * cosh(eta) < 0.10) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.10 <= pt * cosh(eta) && pt * cosh(eta) < 0.15) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.15 <= pt * cosh(eta) && pt * cosh(eta) < 0.20) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.25) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.25 <= pt * cosh(eta) && pt * cosh(eta) < 0.30) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.30 <= pt * cosh(eta) && pt * cosh(eta) < 0.35) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.35 <= pt * cosh(eta) && pt * cosh(eta) < 0.40) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.999682) + + ( -2.80 <= eta && eta < -1.90) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.978695) + + ( -2.80 <= eta && eta < -1.90) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.913360) + + ( -2.80 <= eta && eta < -1.90) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.839311) + + ( -2.80 <= eta && eta < -1.90) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.768807) + + ( -2.80 <= eta && eta < -1.90) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.716247) + + ( -2.80 <= eta && eta < -1.90) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.674232) + + ( -2.80 <= eta && eta < -1.90) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.644136) + + ( -1.90 <= eta && eta < -1.50) * ( 0.05 <= pt * cosh(eta) && pt * cosh(eta) < 0.10) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.10 <= pt * cosh(eta) && pt * cosh(eta) < 0.15) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.15 <= pt * cosh(eta) && pt * cosh(eta) < 0.20) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.25) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.25 <= pt * cosh(eta) && pt * cosh(eta) < 0.30) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.30 <= pt * cosh(eta) && pt * cosh(eta) < 0.35) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.35 <= pt * cosh(eta) && pt * cosh(eta) < 0.40) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.999656) + + ( -1.90 <= eta && eta < -1.50) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.979349) + + ( -1.90 <= eta && eta < -1.50) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.911960) + + ( -1.90 <= eta && eta < -1.50) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.837894) + + ( -1.90 <= eta && eta < -1.50) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.771717) + + ( -1.90 <= eta && eta < -1.50) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.720045) + + ( -1.90 <= eta && eta < -1.50) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.680660) + + ( -1.90 <= eta && eta < -1.50) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.651501) + } + + add EfficiencyFormula {0} {0} { 0.00 } +} diff --git a/delphes/database/pfRICH_e_pi_pid.v01a.root b/delphes/database/pfRICH_e_pi_pid.v01a.root new file mode 100644 index 0000000..9738b69 Binary files /dev/null and b/delphes/database/pfRICH_e_pi_pid.v01a.root differ diff --git a/delphes/database/pfRICH_e_pi_pid.v01a.tcl b/delphes/database/pfRICH_e_pi_pid.v01a.tcl new file mode 100644 index 0000000..5e198b6 --- /dev/null +++ b/delphes/database/pfRICH_e_pi_pid.v01a.tcl @@ -0,0 +1,226 @@ +module IdentificationMap pfRICH { + set InputArray TrackMerger/tracks + set OutputArray tracks + + add EfficiencyFormula {11} {11} { + (eta< -3.50 || eta>= -1.50 || pt * cosh(eta) < 0.40 || pt * cosh(eta) >= 5.50) * ( 0.00 ) + + ( -3.50 <= eta && eta < -2.80) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (0.999955) + + ( -3.50 <= eta && eta < -2.80) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.991449) + + ( -3.50 <= eta && eta < -2.80) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.946267) + + ( -3.50 <= eta && eta < -2.80) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.869975) + + ( -3.50 <= eta && eta < -2.80) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.797208) + + ( -3.50 <= eta && eta < -2.80) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.742194) + + ( -3.50 <= eta && eta < -2.80) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.698612) + + ( -3.50 <= eta && eta < -2.80) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.663522) + + ( -3.50 <= eta && eta < -2.80) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.637159) + + ( -2.80 <= eta && eta < -1.90) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (0.999911) + + ( -2.80 <= eta && eta < -1.90) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.990092) + + ( -2.80 <= eta && eta < -1.90) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.941162) + + ( -2.80 <= eta && eta < -1.90) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.870021) + + ( -2.80 <= eta && eta < -1.90) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.798658) + + ( -2.80 <= eta && eta < -1.90) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.745484) + + ( -2.80 <= eta && eta < -1.90) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.701168) + + ( -2.80 <= eta && eta < -1.90) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.664303) + + ( -2.80 <= eta && eta < -1.90) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.638027) + + ( -1.90 <= eta && eta < -1.50) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (0.999993) + + ( -1.90 <= eta && eta < -1.50) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (0.999027) + + ( -1.90 <= eta && eta < -1.50) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.976656) + + ( -1.90 <= eta && eta < -1.50) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.921009) + + ( -1.90 <= eta && eta < -1.50) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.849730) + + ( -1.90 <= eta && eta < -1.50) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.783416) + + ( -1.90 <= eta && eta < -1.50) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.734606) + + ( -1.90 <= eta && eta < -1.50) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.691330) + + ( -1.90 <= eta && eta < -1.50) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.659819) + + ( -1.90 <= eta && eta < -1.50) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.635836) + } + + add EfficiencyFormula {11} {211} { + (eta< -3.50 || eta>= -1.50 || pt * cosh(eta) < 0.40 || pt * cosh(eta) >= 5.50) * ( 0.00 ) + + ( -3.50 <= eta && eta < -2.80) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (0.000045) + + ( -3.50 <= eta && eta < -2.80) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.008551) + + ( -3.50 <= eta && eta < -2.80) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.053733) + + ( -3.50 <= eta && eta < -2.80) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.130025) + + ( -3.50 <= eta && eta < -2.80) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.202792) + + ( -3.50 <= eta && eta < -2.80) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.257806) + + ( -3.50 <= eta && eta < -2.80) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.301388) + + ( -3.50 <= eta && eta < -2.80) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.336478) + + ( -3.50 <= eta && eta < -2.80) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.362841) + + ( -2.80 <= eta && eta < -1.90) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (0.000089) + + ( -2.80 <= eta && eta < -1.90) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.009908) + + ( -2.80 <= eta && eta < -1.90) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.058838) + + ( -2.80 <= eta && eta < -1.90) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.129979) + + ( -2.80 <= eta && eta < -1.90) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.201342) + + ( -2.80 <= eta && eta < -1.90) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.254516) + + ( -2.80 <= eta && eta < -1.90) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.298832) + + ( -2.80 <= eta && eta < -1.90) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.335697) + + ( -2.80 <= eta && eta < -1.90) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.361973) + + ( -1.90 <= eta && eta < -1.50) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (0.000007) + + ( -1.90 <= eta && eta < -1.50) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (0.000973) + + ( -1.90 <= eta && eta < -1.50) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.023344) + + ( -1.90 <= eta && eta < -1.50) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.078991) + + ( -1.90 <= eta && eta < -1.50) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.150270) + + ( -1.90 <= eta && eta < -1.50) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.216584) + + ( -1.90 <= eta && eta < -1.50) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.265394) + + ( -1.90 <= eta && eta < -1.50) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.308670) + + ( -1.90 <= eta && eta < -1.50) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.340181) + + ( -1.90 <= eta && eta < -1.50) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.364164) + } + + add EfficiencyFormula {211} {11} { + (eta< -3.50 || eta>= -1.50 || pt * cosh(eta) < 0.40 || pt * cosh(eta) >= 5.50) * ( 0.00 ) + + ( -3.50 <= eta && eta < -2.80) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (0.000032) + + ( -3.50 <= eta && eta < -2.80) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.007502) + + ( -3.50 <= eta && eta < -2.80) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.053733) + + ( -3.50 <= eta && eta < -2.80) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.125669) + + ( -3.50 <= eta && eta < -2.80) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.195789) + + ( -3.50 <= eta && eta < -2.80) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.256708) + + ( -3.50 <= eta && eta < -2.80) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.296337) + + ( -3.50 <= eta && eta < -2.80) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.339030) + + ( -3.50 <= eta && eta < -2.80) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.364338) + + ( -2.80 <= eta && eta < -1.90) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (0.000067) + + ( -2.80 <= eta && eta < -1.90) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.008987) + + ( -2.80 <= eta && eta < -1.90) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.056723) + + ( -2.80 <= eta && eta < -1.90) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.127859) + + ( -2.80 <= eta && eta < -1.90) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.194421) + + ( -2.80 <= eta && eta < -1.90) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.254516) + + ( -2.80 <= eta && eta < -1.90) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.299828) + + ( -2.80 <= eta && eta < -1.90) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.336557) + + ( -2.80 <= eta && eta < -1.90) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.363478) + + ( -1.90 <= eta && eta < -1.50) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (0.000004) + + ( -1.90 <= eta && eta < -1.50) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (0.000815) + + ( -1.90 <= eta && eta < -1.50) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.022371) + + ( -1.90 <= eta && eta < -1.50) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.080878) + + ( -1.90 <= eta && eta < -1.50) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.152919) + + ( -1.90 <= eta && eta < -1.50) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.214665) + + ( -1.90 <= eta && eta < -1.50) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.266337) + + ( -1.90 <= eta && eta < -1.50) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.306935) + + ( -1.90 <= eta && eta < -1.50) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.338609) + + ( -1.90 <= eta && eta < -1.50) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.362739) + } + + add EfficiencyFormula {211} {211} { + (eta< -3.50 || eta>= -1.50 || pt * cosh(eta) < 0.40 || pt * cosh(eta) >= 5.50) * ( 0.00 ) + + ( -3.50 <= eta && eta < -2.80) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (0.999968) + + ( -3.50 <= eta && eta < -2.80) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.992498) + + ( -3.50 <= eta && eta < -2.80) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.946267) + + ( -3.50 <= eta && eta < -2.80) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.874331) + + ( -3.50 <= eta && eta < -2.80) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.804211) + + ( -3.50 <= eta && eta < -2.80) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.743292) + + ( -3.50 <= eta && eta < -2.80) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.703663) + + ( -3.50 <= eta && eta < -2.80) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.660970) + + ( -3.50 <= eta && eta < -2.80) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.635662) + + ( -2.80 <= eta && eta < -1.90) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (0.999933) + + ( -2.80 <= eta && eta < -1.90) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.991013) + + ( -2.80 <= eta && eta < -1.90) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.943277) + + ( -2.80 <= eta && eta < -1.90) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.872141) + + ( -2.80 <= eta && eta < -1.90) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.805579) + + ( -2.80 <= eta && eta < -1.90) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.745484) + + ( -2.80 <= eta && eta < -1.90) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.700172) + + ( -2.80 <= eta && eta < -1.90) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.663443) + + ( -2.80 <= eta && eta < -1.90) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.636522) + + ( -1.90 <= eta && eta < -1.50) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (0.999996) + + ( -1.90 <= eta && eta < -1.50) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (0.999185) + + ( -1.90 <= eta && eta < -1.50) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.977629) + + ( -1.90 <= eta && eta < -1.50) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.919122) + + ( -1.90 <= eta && eta < -1.50) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.847081) + + ( -1.90 <= eta && eta < -1.50) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.785335) + + ( -1.90 <= eta && eta < -1.50) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.733663) + + ( -1.90 <= eta && eta < -1.50) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.693065) + + ( -1.90 <= eta && eta < -1.50) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.661391) + + ( -1.90 <= eta && eta < -1.50) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.637261) + } + + add EfficiencyFormula {0} {0} { 0.00 } +} diff --git a/delphes/database/pfRICH_e_pi_pid.v01b.root b/delphes/database/pfRICH_e_pi_pid.v01b.root new file mode 100644 index 0000000..24407b5 Binary files /dev/null and b/delphes/database/pfRICH_e_pi_pid.v01b.root differ diff --git a/delphes/database/pfRICH_e_pi_pid.v01b.tcl b/delphes/database/pfRICH_e_pi_pid.v01b.tcl new file mode 100644 index 0000000..0bb0f19 --- /dev/null +++ b/delphes/database/pfRICH_e_pi_pid.v01b.tcl @@ -0,0 +1,226 @@ +module IdentificationMap pfRICH { + set InputArray TrackMerger/tracks + set OutputArray tracks + + add EfficiencyFormula {11} {11} { + (eta< -3.50 || eta>= -1.50 || pt * cosh(eta) < 0.40 || pt * cosh(eta) >= 5.50) * ( 0.00 ) + + ( -3.50 <= eta && eta < -2.80) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (0.999307) + + ( -3.50 <= eta && eta < -2.80) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.999417) + + ( -3.50 <= eta && eta < -2.80) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.977377) + + ( -3.50 <= eta && eta < -2.80) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.905071) + + ( -3.50 <= eta && eta < -2.80) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.824029) + + ( -3.50 <= eta && eta < -2.80) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.761750) + + ( -3.50 <= eta && eta < -2.80) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.712463) + + ( -3.50 <= eta && eta < -2.80) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.673177) + + ( -3.50 <= eta && eta < -2.80) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.644137) + + ( -2.80 <= eta && eta < -1.90) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (0.998847) + + ( -2.80 <= eta && eta < -1.90) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.999532) + + ( -2.80 <= eta && eta < -1.90) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.976676) + + ( -2.80 <= eta && eta < -1.90) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.910607) + + ( -2.80 <= eta && eta < -1.90) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.830012) + + ( -2.80 <= eta && eta < -1.90) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.768807) + + ( -2.80 <= eta && eta < -1.90) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.717503) + + ( -2.80 <= eta && eta < -1.90) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.675275) + + ( -2.80 <= eta && eta < -1.90) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.645911) + + ( -1.90 <= eta && eta < -1.50) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (0.999281) + + ( -1.90 <= eta && eta < -1.50) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.999533) + + ( -1.90 <= eta && eta < -1.50) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.981260) + + ( -1.90 <= eta && eta < -1.50) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.916096) + + ( -1.90 <= eta && eta < -1.50) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.834773) + + ( -1.90 <= eta && eta < -1.50) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.773196) + + ( -1.90 <= eta && eta < -1.50) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.717491) + + ( -1.90 <= eta && eta < -1.50) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.678464) + + ( -1.90 <= eta && eta < -1.50) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.649592) + } + + add EfficiencyFormula {11} {211} { + (eta< -3.50 || eta>= -1.50 || pt * cosh(eta) < 0.40 || pt * cosh(eta) >= 5.50) * ( 0.00 ) + + ( -3.50 <= eta && eta < -2.80) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (0.000693) + + ( -3.50 <= eta && eta < -2.80) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.000583) + + ( -3.50 <= eta && eta < -2.80) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.022623) + + ( -3.50 <= eta && eta < -2.80) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.094929) + + ( -3.50 <= eta && eta < -2.80) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.175971) + + ( -3.50 <= eta && eta < -2.80) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.238250) + + ( -3.50 <= eta && eta < -2.80) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.287537) + + ( -3.50 <= eta && eta < -2.80) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.326823) + + ( -3.50 <= eta && eta < -2.80) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.355863) + + ( -2.80 <= eta && eta < -1.90) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (0.001153) + + ( -2.80 <= eta && eta < -1.90) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.000468) + + ( -2.80 <= eta && eta < -1.90) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.023324) + + ( -2.80 <= eta && eta < -1.90) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.089393) + + ( -2.80 <= eta && eta < -1.90) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.169988) + + ( -2.80 <= eta && eta < -1.90) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.231193) + + ( -2.80 <= eta && eta < -1.90) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.282497) + + ( -2.80 <= eta && eta < -1.90) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.324725) + + ( -2.80 <= eta && eta < -1.90) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.354089) + + ( -1.90 <= eta && eta < -1.50) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (0.000719) + + ( -1.90 <= eta && eta < -1.50) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.000467) + + ( -1.90 <= eta && eta < -1.50) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.018740) + + ( -1.90 <= eta && eta < -1.50) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.083904) + + ( -1.90 <= eta && eta < -1.50) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.165227) + + ( -1.90 <= eta && eta < -1.50) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.226804) + + ( -1.90 <= eta && eta < -1.50) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.282509) + + ( -1.90 <= eta && eta < -1.50) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.321536) + + ( -1.90 <= eta && eta < -1.50) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.350408) + } + + add EfficiencyFormula {211} {11} { + (eta< -3.50 || eta>= -1.50 || pt * cosh(eta) < 0.40 || pt * cosh(eta) >= 5.50) * ( 0.00 ) + + ( -3.50 <= eta && eta < -2.80) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (0.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.000374) + + ( -3.50 <= eta && eta < -2.80) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.022623) + + ( -3.50 <= eta && eta < -2.80) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.089443) + + ( -3.50 <= eta && eta < -2.80) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.166922) + + ( -3.50 <= eta && eta < -2.80) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.236866) + + ( -3.50 <= eta && eta < -2.80) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.281323) + + ( -3.50 <= eta && eta < -2.80) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.329845) + + ( -3.50 <= eta && eta < -2.80) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.357597) + + ( -2.80 <= eta && eta < -1.90) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (0.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.000318) + + ( -2.80 <= eta && eta < -1.90) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.021305) + + ( -2.80 <= eta && eta < -1.90) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.086640) + + ( -2.80 <= eta && eta < -1.90) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.160689) + + ( -2.80 <= eta && eta < -1.90) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.231193) + + ( -2.80 <= eta && eta < -1.90) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.283753) + + ( -2.80 <= eta && eta < -1.90) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.325768) + + ( -2.80 <= eta && eta < -1.90) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.355864) + + ( -1.90 <= eta && eta < -1.50) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (0.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.000344) + + ( -1.90 <= eta && eta < -1.50) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.020651) + + ( -1.90 <= eta && eta < -1.50) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.088040) + + ( -1.90 <= eta && eta < -1.50) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.162106) + + ( -1.90 <= eta && eta < -1.50) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.228283) + + ( -1.90 <= eta && eta < -1.50) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.279955) + + ( -1.90 <= eta && eta < -1.50) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.319340) + + ( -1.90 <= eta && eta < -1.50) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.348499) + } + + add EfficiencyFormula {211} {211} { + (eta< -3.50 || eta>= -1.50 || pt * cosh(eta) < 0.40 || pt * cosh(eta) >= 5.50) * ( 0.00 ) + + ( -3.50 <= eta && eta < -2.80) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (1.000000) + + ( -3.50 <= eta && eta < -2.80) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.999626) + + ( -3.50 <= eta && eta < -2.80) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.977377) + + ( -3.50 <= eta && eta < -2.80) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.910557) + + ( -3.50 <= eta && eta < -2.80) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.833078) + + ( -3.50 <= eta && eta < -2.80) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.763134) + + ( -3.50 <= eta && eta < -2.80) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.718677) + + ( -3.50 <= eta && eta < -2.80) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.670155) + + ( -3.50 <= eta && eta < -2.80) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.642403) + + ( -2.80 <= eta && eta < -1.90) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (1.000000) + + ( -2.80 <= eta && eta < -1.90) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.999682) + + ( -2.80 <= eta && eta < -1.90) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.978695) + + ( -2.80 <= eta && eta < -1.90) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.913360) + + ( -2.80 <= eta && eta < -1.90) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.839311) + + ( -2.80 <= eta && eta < -1.90) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.768807) + + ( -2.80 <= eta && eta < -1.90) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.716247) + + ( -2.80 <= eta && eta < -1.90) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.674232) + + ( -2.80 <= eta && eta < -1.90) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.644136) + + ( -1.90 <= eta && eta < -1.50) * ( 0.40 <= pt * cosh(eta) && pt * cosh(eta) < 0.45) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.45 <= pt * cosh(eta) && pt * cosh(eta) < 0.50) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.50 <= pt * cosh(eta) && pt * cosh(eta) < 0.55) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.55 <= pt * cosh(eta) && pt * cosh(eta) < 0.60) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.60 <= pt * cosh(eta) && pt * cosh(eta) < 0.70) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.70 <= pt * cosh(eta) && pt * cosh(eta) < 0.80) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.80 <= pt * cosh(eta) && pt * cosh(eta) < 0.90) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 1.00) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 1.00 <= pt * cosh(eta) && pt * cosh(eta) < 1.50) * (1.000000) + + ( -1.90 <= eta && eta < -1.50) * ( 1.50 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.999656) + + ( -1.90 <= eta && eta < -1.50) * ( 2.00 <= pt * cosh(eta) && pt * cosh(eta) < 2.50) * (0.979349) + + ( -1.90 <= eta && eta < -1.50) * ( 2.50 <= pt * cosh(eta) && pt * cosh(eta) < 3.00) * (0.911960) + + ( -1.90 <= eta && eta < -1.50) * ( 3.00 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.837894) + + ( -1.90 <= eta && eta < -1.50) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.00) * (0.771717) + + ( -1.90 <= eta && eta < -1.50) * ( 4.00 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.720045) + + ( -1.90 <= eta && eta < -1.50) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.00) * (0.680660) + + ( -1.90 <= eta && eta < -1.50) * ( 5.00 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.651501) + } + + add EfficiencyFormula {0} {0} { 0.00 } +} diff --git a/delphes/database/track-resolution.txt b/delphes/database/track-resolution.txt new file mode 100644 index 0000000..204f00a --- /dev/null +++ b/delphes/database/track-resolution.txt @@ -0,0 +1,149 @@ + +Processing dconfig-jaydeep.C... +

= 5.025 [GeV/c], = -3.00 -> dtheta: 0.1579, dphi: 0.3033 +@T@ 0 -> estimated threshold 0.050 [MeV/c] +@T@ 1 -> estimated threshold 0.450 [MeV/c] +

= 0.075 [GeV/c], = -3.15 -> dtheta: 4.1141, dphi: 28.2417 +

= 0.075 [GeV/c], = -3.15 -> dtheta: 4.1141, dphi: 28.2417 +

= 0.125 [GeV/c], = -3.15 -> dtheta: 2.4696, dphi: 16.9452 +

= 0.125 [GeV/c], = -3.15 -> dtheta: 2.4696, dphi: 16.9452 +

= 0.175 [GeV/c], = -3.15 -> dtheta: 1.7651, dphi: 12.1039 +

= 0.175 [GeV/c], = -3.15 -> dtheta: 1.7651, dphi: 12.1039 +

= 0.225 [GeV/c], = -3.15 -> dtheta: 1.3741, dphi: 9.4143 +

= 0.225 [GeV/c], = -3.15 -> dtheta: 1.3741, dphi: 9.4143 +

= 0.275 [GeV/c], = -3.15 -> dtheta: 1.1255, dphi: 7.7028 +

= 0.275 [GeV/c], = -3.15 -> dtheta: 1.1255, dphi: 7.7028 +

= 0.325 [GeV/c], = -3.15 -> dtheta: 0.9536, dphi: 6.5180 +

= 0.325 [GeV/c], = -3.15 -> dtheta: 0.9536, dphi: 6.5180 +

= 0.375 [GeV/c], = -3.15 -> dtheta: 0.8277, dphi: 5.6491 +

= 0.375 [GeV/c], = -3.15 -> dtheta: 0.8277, dphi: 5.6491 +

= 0.425 [GeV/c], = -3.15 -> dtheta: 0.7316, dphi: 4.9847 +

= 0.425 [GeV/c], = -3.15 -> dtheta: 0.7316, dphi: 4.9847 +

= 0.475 [GeV/c], = -3.15 -> dtheta: 0.6559, dphi: 4.4602 +

= 0.475 [GeV/c], = -3.15 -> dtheta: 0.6559, dphi: 4.4602 +

= 0.525 [GeV/c], = -3.15 -> dtheta: 0.5947, dphi: 4.0356 +

= 0.525 [GeV/c], = -3.15 -> dtheta: 0.5947, dphi: 4.0356 +

= 0.575 [GeV/c], = -3.15 -> dtheta: 0.5443, dphi: 3.6849 +

= 0.575 [GeV/c], = -3.15 -> dtheta: 0.5443, dphi: 3.6849 +

= 0.650 [GeV/c], = -3.15 -> dtheta: 0.4834, dphi: 3.2600 +

= 0.650 [GeV/c], = -3.15 -> dtheta: 0.4834, dphi: 3.2600 +

= 0.750 [GeV/c], = -3.15 -> dtheta: 0.4215, dphi: 2.8257 +

= 0.750 [GeV/c], = -3.15 -> dtheta: 0.4215, dphi: 2.8257 +

= 0.850 [GeV/c], = -3.15 -> dtheta: 0.3744, dphi: 2.4937 +

= 0.850 [GeV/c], = -3.15 -> dtheta: 0.3744, dphi: 2.4937 +

= 0.950 [GeV/c], = -3.15 -> dtheta: 0.3375, dphi: 2.2316 +

= 0.950 [GeV/c], = -3.15 -> dtheta: 0.3375, dphi: 2.2316 +

= 1.250 [GeV/c], = -3.15 -> dtheta: 0.2634, dphi: 1.6971 +

= 1.250 [GeV/c], = -3.15 -> dtheta: 0.2634, dphi: 1.6971 +

= 1.750 [GeV/c], = -3.15 -> dtheta: 0.1988, dphi: 1.2140 +

= 1.750 [GeV/c], = -3.15 -> dtheta: 0.1988, dphi: 1.2140 +

= 2.250 [GeV/c], = -3.15 -> dtheta: 0.1651, dphi: 0.9461 +

= 2.250 [GeV/c], = -3.15 -> dtheta: 0.1651, dphi: 0.9461 +

= 2.750 [GeV/c], = -3.15 -> dtheta: 0.1451, dphi: 0.7760 +

= 2.750 [GeV/c], = -3.15 -> dtheta: 0.1451, dphi: 0.7760 +

= 3.250 [GeV/c], = -3.15 -> dtheta: 0.1322, dphi: 0.6585 +

= 3.250 [GeV/c], = -3.15 -> dtheta: 0.1322, dphi: 0.6585 +

= 3.750 [GeV/c], = -3.15 -> dtheta: 0.1234, dphi: 0.5726 +

= 3.750 [GeV/c], = -3.15 -> dtheta: 0.1234, dphi: 0.5726 +

= 4.250 [GeV/c], = -3.15 -> dtheta: 0.1172, dphi: 0.5072 +

= 4.250 [GeV/c], = -3.15 -> dtheta: 0.1172, dphi: 0.5072 +

= 4.750 [GeV/c], = -3.15 -> dtheta: 0.1126, dphi: 0.4558 +

= 4.750 [GeV/c], = -3.15 -> dtheta: 0.1126, dphi: 0.4558 +

= 5.250 [GeV/c], = -3.15 -> dtheta: 0.1091, dphi: 0.4143 +

= 5.250 [GeV/c], = -3.15 -> dtheta: 0.1091, dphi: 0.4143 +

= 0.075 [GeV/c], = -2.35 -> dtheta: 14.9167, dphi: 18.4623 +

= 0.075 [GeV/c], = -2.35 -> dtheta: 14.9167, dphi: 18.4623 +

= 0.125 [GeV/c], = -2.35 -> dtheta: 8.9503, dphi: 11.0777 +

= 0.125 [GeV/c], = -2.35 -> dtheta: 8.9503, dphi: 11.0777 +

= 0.175 [GeV/c], = -2.35 -> dtheta: 6.3934, dphi: 7.9130 +

= 0.175 [GeV/c], = -2.35 -> dtheta: 6.3934, dphi: 7.9130 +

= 0.225 [GeV/c], = -2.35 -> dtheta: 4.9730, dphi: 6.1549 +

= 0.225 [GeV/c], = -2.35 -> dtheta: 4.9730, dphi: 6.1549 +

= 0.275 [GeV/c], = -2.35 -> dtheta: 4.0692, dphi: 5.0362 +

= 0.275 [GeV/c], = -2.35 -> dtheta: 4.0692, dphi: 5.0362 +

= 0.325 [GeV/c], = -2.35 -> dtheta: 3.4436, dphi: 4.2618 +

= 0.325 [GeV/c], = -2.35 -> dtheta: 3.4436, dphi: 4.2618 +

= 0.375 [GeV/c], = -2.35 -> dtheta: 2.9848, dphi: 3.6939 +

= 0.375 [GeV/c], = -2.35 -> dtheta: 2.9848, dphi: 3.6939 +

= 0.425 [GeV/c], = -2.35 -> dtheta: 2.6340, dphi: 3.2597 +

= 0.425 [GeV/c], = -2.35 -> dtheta: 2.6340, dphi: 3.2597 +

= 0.475 [GeV/c], = -2.35 -> dtheta: 2.3571, dphi: 2.9170 +

= 0.475 [GeV/c], = -2.35 -> dtheta: 2.3571, dphi: 2.9170 +

= 0.525 [GeV/c], = -2.35 -> dtheta: 2.1330, dphi: 2.6396 +

= 0.525 [GeV/c], = -2.35 -> dtheta: 2.1330, dphi: 2.6396 +

= 0.575 [GeV/c], = -2.35 -> dtheta: 1.9480, dphi: 2.4104 +

= 0.575 [GeV/c], = -2.35 -> dtheta: 1.9480, dphi: 2.4104 +

= 0.650 [GeV/c], = -2.35 -> dtheta: 1.7238, dphi: 2.1329 +

= 0.650 [GeV/c], = -2.35 -> dtheta: 1.7238, dphi: 2.1329 +

= 0.750 [GeV/c], = -2.35 -> dtheta: 1.4947, dphi: 1.8493 +

= 0.750 [GeV/c], = -2.35 -> dtheta: 1.4947, dphi: 1.8493 +

= 0.850 [GeV/c], = -2.35 -> dtheta: 1.3196, dphi: 1.6325 +

= 0.850 [GeV/c], = -2.35 -> dtheta: 1.3196, dphi: 1.6325 +

= 0.950 [GeV/c], = -2.35 -> dtheta: 1.1815, dphi: 1.4614 +

= 0.950 [GeV/c], = -2.35 -> dtheta: 1.1815, dphi: 1.4614 +

= 1.250 [GeV/c], = -2.35 -> dtheta: 0.9001, dphi: 1.1128 +

= 1.250 [GeV/c], = -2.35 -> dtheta: 0.9001, dphi: 1.1128 +

= 1.750 [GeV/c], = -2.35 -> dtheta: 0.6464, dphi: 0.7984 +

= 1.750 [GeV/c], = -2.35 -> dtheta: 0.6464, dphi: 0.7984 +

= 2.250 [GeV/c], = -2.35 -> dtheta: 0.5063, dphi: 0.6246 +

= 2.250 [GeV/c], = -2.35 -> dtheta: 0.5063, dphi: 0.6246 +

= 2.750 [GeV/c], = -2.35 -> dtheta: 0.4178, dphi: 0.5147 +

= 2.750 [GeV/c], = -2.35 -> dtheta: 0.4178, dphi: 0.5147 +

= 3.250 [GeV/c], = -2.35 -> dtheta: 0.3572, dphi: 0.4392 +

= 3.250 [GeV/c], = -2.35 -> dtheta: 0.3572, dphi: 0.4392 +

= 3.750 [GeV/c], = -2.35 -> dtheta: 0.3132, dphi: 0.3843 +

= 3.750 [GeV/c], = -2.35 -> dtheta: 0.3132, dphi: 0.3843 +

= 4.250 [GeV/c], = -2.35 -> dtheta: 0.2800, dphi: 0.3428 +

= 4.250 [GeV/c], = -2.35 -> dtheta: 0.2800, dphi: 0.3428 +

= 4.750 [GeV/c], = -2.35 -> dtheta: 0.2541, dphi: 0.3104 +

= 4.750 [GeV/c], = -2.35 -> dtheta: 0.2541, dphi: 0.3104 +

= 5.250 [GeV/c], = -2.35 -> dtheta: 0.2335, dphi: 0.2845 +

= 5.250 [GeV/c], = -2.35 -> dtheta: 0.2335, dphi: 0.2845 +

= 0.075 [GeV/c], = -1.70 -> dtheta: 12.6317, dphi: 14.7079 +

= 0.075 [GeV/c], = -1.70 -> dtheta: 12.6317, dphi: 14.7079 +

= 0.125 [GeV/c], = -1.70 -> dtheta: 7.5792, dphi: 8.8250 +

= 0.125 [GeV/c], = -1.70 -> dtheta: 7.5792, dphi: 8.8250 +

= 0.175 [GeV/c], = -1.70 -> dtheta: 5.4140, dphi: 6.3039 +

= 0.175 [GeV/c], = -1.70 -> dtheta: 5.4140, dphi: 6.3039 +

= 0.225 [GeV/c], = -1.70 -> dtheta: 4.2111, dphi: 4.9033 +

= 0.225 [GeV/c], = -1.70 -> dtheta: 4.2111, dphi: 4.9033 +

= 0.275 [GeV/c], = -1.70 -> dtheta: 3.4457, dphi: 4.0121 +

= 0.275 [GeV/c], = -1.70 -> dtheta: 3.4457, dphi: 4.0121 +

= 0.325 [GeV/c], = -1.70 -> dtheta: 2.9158, dphi: 3.3951 +

= 0.325 [GeV/c], = -1.70 -> dtheta: 2.9158, dphi: 3.3951 +

= 0.375 [GeV/c], = -1.70 -> dtheta: 2.5273, dphi: 2.9428 +

= 0.375 [GeV/c], = -1.70 -> dtheta: 2.5273, dphi: 2.9428 +

= 0.425 [GeV/c], = -1.70 -> dtheta: 2.2302, dphi: 2.5969 +

= 0.425 [GeV/c], = -1.70 -> dtheta: 2.2302, dphi: 2.5969 +

= 0.475 [GeV/c], = -1.70 -> dtheta: 1.9957, dphi: 2.3238 +

= 0.475 [GeV/c], = -1.70 -> dtheta: 1.9957, dphi: 2.3238 +

= 0.525 [GeV/c], = -1.70 -> dtheta: 1.8059, dphi: 2.1028 +

= 0.525 [GeV/c], = -1.70 -> dtheta: 1.8059, dphi: 2.1028 +

= 0.575 [GeV/c], = -1.70 -> dtheta: 1.6491, dphi: 1.9203 +

= 0.575 [GeV/c], = -1.70 -> dtheta: 1.6491, dphi: 1.9203 +

= 0.650 [GeV/c], = -1.70 -> dtheta: 1.4592, dphi: 1.6992 +

= 0.650 [GeV/c], = -1.70 -> dtheta: 1.4592, dphi: 1.6992 +

= 0.750 [GeV/c], = -1.70 -> dtheta: 1.2651, dphi: 1.4732 +

= 0.750 [GeV/c], = -1.70 -> dtheta: 1.2651, dphi: 1.4732 +

= 0.850 [GeV/c], = -1.70 -> dtheta: 1.1168, dphi: 1.3005 +

= 0.850 [GeV/c], = -1.70 -> dtheta: 1.1168, dphi: 1.3005 +

= 0.950 [GeV/c], = -1.70 -> dtheta: 0.9997, dphi: 1.1643 +

= 0.950 [GeV/c], = -1.70 -> dtheta: 0.9997, dphi: 1.1643 +

= 1.250 [GeV/c], = -1.70 -> dtheta: 0.7611, dphi: 0.8866 +

= 1.250 [GeV/c], = -1.70 -> dtheta: 0.7611, dphi: 0.8866 +

= 1.750 [GeV/c], = -1.70 -> dtheta: 0.5459, dphi: 0.6361 +

= 1.750 [GeV/c], = -1.70 -> dtheta: 0.5459, dphi: 0.6361 +

= 2.250 [GeV/c], = -1.70 -> dtheta: 0.4269, dphi: 0.4976 +

= 2.250 [GeV/c], = -1.70 -> dtheta: 0.4269, dphi: 0.4976 +

= 2.750 [GeV/c], = -1.70 -> dtheta: 0.3516, dphi: 0.4101 +

= 2.750 [GeV/c], = -1.70 -> dtheta: 0.3516, dphi: 0.4101 +

= 3.250 [GeV/c], = -1.70 -> dtheta: 0.2999, dphi: 0.3500 +

= 3.250 [GeV/c], = -1.70 -> dtheta: 0.2999, dphi: 0.3500 +

= 3.750 [GeV/c], = -1.70 -> dtheta: 0.2622, dphi: 0.3063 +

= 3.750 [GeV/c], = -1.70 -> dtheta: 0.2622, dphi: 0.3063 +

= 4.250 [GeV/c], = -1.70 -> dtheta: 0.2337, dphi: 0.2733 +

= 4.250 [GeV/c], = -1.70 -> dtheta: 0.2337, dphi: 0.2733 +

= 4.750 [GeV/c], = -1.70 -> dtheta: 0.2115, dphi: 0.2475 +

= 4.750 [GeV/c], = -1.70 -> dtheta: 0.2115, dphi: 0.2475 +

= 5.250 [GeV/c], = -1.70 -> dtheta: 0.1937, dphi: 0.2268 +

= 5.250 [GeV/c], = -1.70 -> dtheta: 0.1937, dphi: 0.2268 diff --git a/delphes/include/DelphesConfig.h b/delphes/include/DelphesConfig.h index 7faa05c..c66fbfb 100644 --- a/delphes/include/DelphesConfig.h +++ b/delphes/include/DelphesConfig.h @@ -6,6 +6,7 @@ class TDatabasePDG; #include +#include #ifndef _DELPHES_CONFIG_ #define _DELPHES_CONFIG_ @@ -13,7 +14,7 @@ class TDatabasePDG; class MassHypothesis: public TObject { public: MassHypothesis(TParticlePDG *pdg = 0, double max_contamination_left = 0.0, - double max_contamination_right = 0.0): m_PDG(pdg), + double max_contamination_right = 0.0): m_Diff(0.0), m_ChiSquare(0.0), m_PDG(pdg), m_MaxContaminationLeft(max_contamination_left), m_MaxContaminationRight(max_contamination_right), m_Threshold(0.0) {}; ~ MassHypothesis() {}; @@ -24,6 +25,11 @@ class MassHypothesis: public TObject { void SetThreshold(double value) { m_Threshold = value; }; double GetThreshold( void ) const { return m_Threshold; }; + double GetMeasurementOffset( void ) const { return m_Diff; }; + + double m_Diff; //! + double m_ChiSquare; //! + private: TParticlePDG *m_PDG; @@ -208,6 +214,12 @@ class DelphesConfig: public TObject { return 0; }; + MomentumRange *GetEtaMomentumRange(double eta, double p) const { + auto erange = GetEtaRange(eta); + if (!erange) return 0; + + return erange->GetMomentumRange(p); + }; int GetSmearingMatrix(const TVector3 p, double hmtx[]) const { return GetSmearingMatrix(p.Eta(), p.Mag(), hmtx); @@ -224,6 +236,15 @@ class DelphesConfig: public TObject { // Assume all masses are different and provided in ascending order; std::vector m_MassHypotheses; + // FIXME: need a std::set, eventually?; + unsigned GetHypoIndex(MassHypothesis *hypo) { + for(unsigned ih=0; ih + #ifndef _DELPHES_CONFIG_RICH_ #define _DELPHES_CONFIG_RICH_ @@ -7,20 +9,31 @@ class DelphesConfigRICH: public DelphesConfig { public: DelphesConfigRICH( void ): DelphesConfig() {}; - DelphesConfigRICH(const char *dname): DelphesConfig(dname), m_Rindex(0.0), - m_AdditionalSmearing(0.0) {}; + DelphesConfigRICH(const char *dname): DelphesConfig(dname), m_Rindex(0.0)//, + /*m_AdditionalSmearing(0.0)*/ {}; ~DelphesConfigRICH() {}; void SetRefractiveIndex (double rindex) { m_Rindex = rindex; } - void SetAdditionalSmearing(double value) { m_AdditionalSmearing = value; } + //void SetAdditionalSmearing(double value) { m_AdditionalSmearing = value; } //bool ApplyThresholdModeLogic() { return true; }; int Calculate(); + double GenerateMeasurement(int pdg, const TVector3 &momentum); + MassHypothesis *FindBestHypothesis(const TVector3 &momentum, double theta); + + void ImportTrackingSmearing(const char *ftheta, const char *fphi); + private: - double m_Rindex, m_AdditionalSmearing; + double m_Rindex;//, m_AdditionalSmearing; + + std::map, std::pair> m_ThetaSmearing, m_PhiSmearing; + double GetTrackingSmearing(double momentum, double eta); + double GetTrackingSmearing(const TVector3 &momentum) { + return GetTrackingSmearing(momentum.Mag(), momentum.Eta()); + }; - ClassDef(DelphesConfigRICH, 1) + ClassDef(DelphesConfigRICH, 3) }; #endif diff --git a/delphes/include/DelphesConfigTOF.h b/delphes/include/DelphesConfigTOF.h index fdc4d08..431e550 100644 --- a/delphes/include/DelphesConfigTOF.h +++ b/delphes/include/DelphesConfigTOF.h @@ -6,11 +6,19 @@ class DelphesConfigTOF: public DelphesConfig { public: + // FIXME: do it better later; + DelphesConfigTOF( void ): DelphesConfig(), + m_T0Resolution(0.0), m_DetectorResolution(0.0), m_InstallationRadius(0.0), + m_EtaMin(0.0), m_EtaMax(0.0), m_MomentumMin(0.0), m_MomentumMax(0.0), + m_EtaBinCount(0), m_MomentumBinCount(0), m_MagneticField(0.0), + m_MomentumResolutionA(0.0), m_MomentumResolutionB(0.0), m_PathLengthResolution(0.0), + m_InstallationDistance(0.0) {}; DelphesConfigTOF(const char *dname): DelphesConfig(dname), m_T0Resolution(0.0), m_DetectorResolution(0.0), m_InstallationRadius(0.0), m_EtaMin(0.0), m_EtaMax(0.0), m_MomentumMin(0.0), m_MomentumMax(0.0), m_EtaBinCount(0), m_MomentumBinCount(0), m_MagneticField(0.0), - m_MomentumResolutionA(0.0), m_MomentumResolutionB(0.0), m_PathLengthResolution(0.0) {}; + m_MomentumResolutionA(0.0), m_MomentumResolutionB(0.0), m_PathLengthResolution(0.0), + m_InstallationDistance(0.0) {}; ~DelphesConfigTOF() {}; void SetT0Resolution (double value) { m_T0Resolution = value; } @@ -21,7 +29,16 @@ class DelphesConfigTOF: public DelphesConfig { m_MomentumResolutionA = a; m_MomentumResolutionB = b; }; void SetDetectorResolution (double value) { m_DetectorResolution = value; } - void SetInstallationRadius (double value) { m_InstallationRadius = value; } + + void SetInstallationRadius (double value) { + m_InstallationRadius = value; + m_InstallationDistance = 0.0; + }; + void SetInstallationDistance(double value) { + m_InstallationDistance = value; + m_InstallationRadius = 0.0; + }; + void SetMagneticField (double value) { m_MagneticField = value; } // Well, would be more natural to give Z-range along the beam line; void SetEtaRange(double min, double max, unsigned ebins) { @@ -54,7 +71,9 @@ class DelphesConfigTOF: public DelphesConfig { double tof(double m, double p, double l); - ClassDef(DelphesConfigTOF, 1) + double m_InstallationDistance; + + ClassDef(DelphesConfigTOF, 2) }; #endif diff --git a/delphes/scripts/ETOF.e-pi.t000ps-pf10ps.root b/delphes/scripts/ETOF.e-pi.t000ps-pf10ps.root new file mode 100644 index 0000000..860b8c7 Binary files /dev/null and b/delphes/scripts/ETOF.e-pi.t000ps-pf10ps.root differ diff --git a/delphes/scripts/ETOF.e-pi.t000ps-pf10ps.tcl b/delphes/scripts/ETOF.e-pi.t000ps-pf10ps.tcl new file mode 100644 index 0000000..4e57400 --- /dev/null +++ b/delphes/scripts/ETOF.e-pi.t000ps-pf10ps.tcl @@ -0,0 +1,122 @@ +module IdentificationMap ETOF { + set InputArray TrackMerger/tracks + set OutputArray tracks + + add EfficiencyFormula {-11} {-11} { + (eta< -3.50 || eta>= -1.60 || pt * cosh(eta) < 0.20 || pt * cosh(eta) >= 2.00) * ( 0.00 ) + + ( -3.50 <= eta && eta < -3.12) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (1.000000) + + ( -3.50 <= eta && eta < -3.12) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.999997) + + ( -3.50 <= eta && eta < -3.12) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.979514) + + ( -3.50 <= eta && eta < -3.12) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.877418) + + ( -3.50 <= eta && eta < -3.12) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.772918) + + ( -3.12 <= eta && eta < -2.74) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (1.000000) + + ( -3.12 <= eta && eta < -2.74) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.999997) + + ( -3.12 <= eta && eta < -2.74) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.979820) + + ( -3.12 <= eta && eta < -2.74) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.878134) + + ( -3.12 <= eta && eta < -2.74) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.773603) + + ( -2.74 <= eta && eta < -2.36) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (1.000000) + + ( -2.74 <= eta && eta < -2.36) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.999997) + + ( -2.74 <= eta && eta < -2.36) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.980462) + + ( -2.74 <= eta && eta < -2.36) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.879662) + + ( -2.74 <= eta && eta < -2.36) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.775072) + + ( -2.36 <= eta && eta < -1.98) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (1.000000) + + ( -2.36 <= eta && eta < -1.98) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.999998) + + ( -2.36 <= eta && eta < -1.98) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.981791) + + ( -2.36 <= eta && eta < -1.98) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.882918) + + ( -2.36 <= eta && eta < -1.98) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.778227) + + ( -1.98 <= eta && eta < -1.60) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (1.000000) + + ( -1.98 <= eta && eta < -1.60) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.999999) + + ( -1.98 <= eta && eta < -1.60) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.984430) + + ( -1.98 <= eta && eta < -1.60) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.889817) + + ( -1.98 <= eta && eta < -1.60) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.785034) + } + + add EfficiencyFormula {-11} {211} { + (eta< -3.50 || eta>= -1.60 || pt * cosh(eta) < 0.20 || pt * cosh(eta) >= 2.00) * ( 0.00 ) + + ( -3.50 <= eta && eta < -3.12) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (0.000000) + + ( -3.50 <= eta && eta < -3.12) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.000003) + + ( -3.50 <= eta && eta < -3.12) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.020486) + + ( -3.50 <= eta && eta < -3.12) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.122582) + + ( -3.50 <= eta && eta < -3.12) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.227082) + + ( -3.12 <= eta && eta < -2.74) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (0.000000) + + ( -3.12 <= eta && eta < -2.74) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.000003) + + ( -3.12 <= eta && eta < -2.74) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.020180) + + ( -3.12 <= eta && eta < -2.74) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.121866) + + ( -3.12 <= eta && eta < -2.74) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.226397) + + ( -2.74 <= eta && eta < -2.36) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (0.000000) + + ( -2.74 <= eta && eta < -2.36) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.000003) + + ( -2.74 <= eta && eta < -2.36) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.019538) + + ( -2.74 <= eta && eta < -2.36) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.120338) + + ( -2.74 <= eta && eta < -2.36) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.224928) + + ( -2.36 <= eta && eta < -1.98) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (0.000000) + + ( -2.36 <= eta && eta < -1.98) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.000002) + + ( -2.36 <= eta && eta < -1.98) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.018209) + + ( -2.36 <= eta && eta < -1.98) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.117082) + + ( -2.36 <= eta && eta < -1.98) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.221773) + + ( -1.98 <= eta && eta < -1.60) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (0.000000) + + ( -1.98 <= eta && eta < -1.60) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.000001) + + ( -1.98 <= eta && eta < -1.60) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.015570) + + ( -1.98 <= eta && eta < -1.60) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.110183) + + ( -1.98 <= eta && eta < -1.60) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.214966) + } + + add EfficiencyFormula {211} {-11} { + (eta< -3.50 || eta>= -1.60 || pt * cosh(eta) < 0.20 || pt * cosh(eta) >= 2.00) * ( 0.00 ) + + ( -3.50 <= eta && eta < -3.12) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (0.000000) + + ( -3.50 <= eta && eta < -3.12) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.000003) + + ( -3.50 <= eta && eta < -3.12) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.020486) + + ( -3.50 <= eta && eta < -3.12) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.122582) + + ( -3.50 <= eta && eta < -3.12) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.227082) + + ( -3.12 <= eta && eta < -2.74) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (0.000000) + + ( -3.12 <= eta && eta < -2.74) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.000003) + + ( -3.12 <= eta && eta < -2.74) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.020180) + + ( -3.12 <= eta && eta < -2.74) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.121866) + + ( -3.12 <= eta && eta < -2.74) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.226397) + + ( -2.74 <= eta && eta < -2.36) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (0.000000) + + ( -2.74 <= eta && eta < -2.36) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.000003) + + ( -2.74 <= eta && eta < -2.36) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.019538) + + ( -2.74 <= eta && eta < -2.36) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.120338) + + ( -2.74 <= eta && eta < -2.36) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.224928) + + ( -2.36 <= eta && eta < -1.98) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (0.000000) + + ( -2.36 <= eta && eta < -1.98) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.000002) + + ( -2.36 <= eta && eta < -1.98) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.018209) + + ( -2.36 <= eta && eta < -1.98) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.117082) + + ( -2.36 <= eta && eta < -1.98) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.221773) + + ( -1.98 <= eta && eta < -1.60) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (0.000000) + + ( -1.98 <= eta && eta < -1.60) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.000001) + + ( -1.98 <= eta && eta < -1.60) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.015570) + + ( -1.98 <= eta && eta < -1.60) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.110183) + + ( -1.98 <= eta && eta < -1.60) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.214966) + } + + add EfficiencyFormula {211} {211} { + (eta< -3.50 || eta>= -1.60 || pt * cosh(eta) < 0.20 || pt * cosh(eta) >= 2.00) * ( 0.00 ) + + ( -3.50 <= eta && eta < -3.12) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (1.000000) + + ( -3.50 <= eta && eta < -3.12) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.999997) + + ( -3.50 <= eta && eta < -3.12) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.979514) + + ( -3.50 <= eta && eta < -3.12) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.877418) + + ( -3.50 <= eta && eta < -3.12) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.772918) + + ( -3.12 <= eta && eta < -2.74) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (1.000000) + + ( -3.12 <= eta && eta < -2.74) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.999997) + + ( -3.12 <= eta && eta < -2.74) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.979820) + + ( -3.12 <= eta && eta < -2.74) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.878134) + + ( -3.12 <= eta && eta < -2.74) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.773603) + + ( -2.74 <= eta && eta < -2.36) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (1.000000) + + ( -2.74 <= eta && eta < -2.36) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.999997) + + ( -2.74 <= eta && eta < -2.36) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.980462) + + ( -2.74 <= eta && eta < -2.36) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.879662) + + ( -2.74 <= eta && eta < -2.36) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.775072) + + ( -2.36 <= eta && eta < -1.98) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (1.000000) + + ( -2.36 <= eta && eta < -1.98) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.999998) + + ( -2.36 <= eta && eta < -1.98) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.981791) + + ( -2.36 <= eta && eta < -1.98) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.882918) + + ( -2.36 <= eta && eta < -1.98) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.778227) + + ( -1.98 <= eta && eta < -1.60) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (1.000000) + + ( -1.98 <= eta && eta < -1.60) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.999999) + + ( -1.98 <= eta && eta < -1.60) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.984430) + + ( -1.98 <= eta && eta < -1.60) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.889817) + + ( -1.98 <= eta && eta < -1.60) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.785034) + } + + add EfficiencyFormula {0} {0} { 0.00 } +} diff --git a/delphes/scripts/ETOF.e-pi.t025ps-pf10ps.root b/delphes/scripts/ETOF.e-pi.t025ps-pf10ps.root new file mode 100644 index 0000000..88d5bf7 Binary files /dev/null and b/delphes/scripts/ETOF.e-pi.t025ps-pf10ps.root differ diff --git a/delphes/scripts/ETOF.e-pi.t025ps-pf10ps.tcl b/delphes/scripts/ETOF.e-pi.t025ps-pf10ps.tcl new file mode 100644 index 0000000..e903cab --- /dev/null +++ b/delphes/scripts/ETOF.e-pi.t025ps-pf10ps.tcl @@ -0,0 +1,122 @@ +module IdentificationMap ETOF { + set InputArray TrackMerger/tracks + set OutputArray tracks + + add EfficiencyFormula {-11} {-11} { + (eta< -3.50 || eta>= -1.60 || pt * cosh(eta) < 0.20 || pt * cosh(eta) >= 2.00) * ( 0.00 ) + + ( -3.50 <= eta && eta < -3.12) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (1.000000) + + ( -3.50 <= eta && eta < -3.12) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.959622) + + ( -3.50 <= eta && eta < -3.12) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.786432) + + ( -3.50 <= eta && eta < -3.12) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.674203) + + ( -3.50 <= eta && eta < -3.12) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.614404) + + ( -3.12 <= eta && eta < -2.74) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (1.000000) + + ( -3.12 <= eta && eta < -2.74) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.960081) + + ( -3.12 <= eta && eta < -2.74) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.787134) + + ( -3.12 <= eta && eta < -2.74) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.674697) + + ( -3.12 <= eta && eta < -2.74) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.614742) + + ( -2.74 <= eta && eta < -2.36) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (1.000000) + + ( -2.74 <= eta && eta < -2.36) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.961053) + + ( -2.74 <= eta && eta < -2.36) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.788638) + + ( -2.74 <= eta && eta < -2.36) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.675759) + + ( -2.74 <= eta && eta < -2.36) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.615468) + + ( -2.36 <= eta && eta < -1.98) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (1.000000) + + ( -2.36 <= eta && eta < -1.98) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.963086) + + ( -2.36 <= eta && eta < -1.98) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.791865) + + ( -2.36 <= eta && eta < -1.98) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.678046) + + ( -2.36 <= eta && eta < -1.98) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.617036) + + ( -1.98 <= eta && eta < -1.60) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (1.000000) + + ( -1.98 <= eta && eta < -1.60) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.967230) + + ( -1.98 <= eta && eta < -1.60) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.798818) + + ( -1.98 <= eta && eta < -1.60) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.683025) + + ( -1.98 <= eta && eta < -1.60) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.620455) + } + + add EfficiencyFormula {-11} {211} { + (eta< -3.50 || eta>= -1.60 || pt * cosh(eta) < 0.20 || pt * cosh(eta) >= 2.00) * ( 0.00 ) + + ( -3.50 <= eta && eta < -3.12) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (0.000000) + + ( -3.50 <= eta && eta < -3.12) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.040378) + + ( -3.50 <= eta && eta < -3.12) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.213568) + + ( -3.50 <= eta && eta < -3.12) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.325797) + + ( -3.50 <= eta && eta < -3.12) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.385596) + + ( -3.12 <= eta && eta < -2.74) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (0.000000) + + ( -3.12 <= eta && eta < -2.74) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.039919) + + ( -3.12 <= eta && eta < -2.74) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.212866) + + ( -3.12 <= eta && eta < -2.74) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.325303) + + ( -3.12 <= eta && eta < -2.74) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.385258) + + ( -2.74 <= eta && eta < -2.36) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (0.000000) + + ( -2.74 <= eta && eta < -2.36) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.038947) + + ( -2.74 <= eta && eta < -2.36) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.211362) + + ( -2.74 <= eta && eta < -2.36) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.324241) + + ( -2.74 <= eta && eta < -2.36) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.384532) + + ( -2.36 <= eta && eta < -1.98) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (0.000000) + + ( -2.36 <= eta && eta < -1.98) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.036914) + + ( -2.36 <= eta && eta < -1.98) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.208135) + + ( -2.36 <= eta && eta < -1.98) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.321954) + + ( -2.36 <= eta && eta < -1.98) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.382964) + + ( -1.98 <= eta && eta < -1.60) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (0.000000) + + ( -1.98 <= eta && eta < -1.60) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.032770) + + ( -1.98 <= eta && eta < -1.60) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.201182) + + ( -1.98 <= eta && eta < -1.60) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.316975) + + ( -1.98 <= eta && eta < -1.60) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.379545) + } + + add EfficiencyFormula {211} {-11} { + (eta< -3.50 || eta>= -1.60 || pt * cosh(eta) < 0.20 || pt * cosh(eta) >= 2.00) * ( 0.00 ) + + ( -3.50 <= eta && eta < -3.12) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (0.000000) + + ( -3.50 <= eta && eta < -3.12) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.040378) + + ( -3.50 <= eta && eta < -3.12) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.213568) + + ( -3.50 <= eta && eta < -3.12) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.325797) + + ( -3.50 <= eta && eta < -3.12) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.385596) + + ( -3.12 <= eta && eta < -2.74) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (0.000000) + + ( -3.12 <= eta && eta < -2.74) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.039919) + + ( -3.12 <= eta && eta < -2.74) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.212866) + + ( -3.12 <= eta && eta < -2.74) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.325303) + + ( -3.12 <= eta && eta < -2.74) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.385258) + + ( -2.74 <= eta && eta < -2.36) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (0.000000) + + ( -2.74 <= eta && eta < -2.36) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.038947) + + ( -2.74 <= eta && eta < -2.36) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.211362) + + ( -2.74 <= eta && eta < -2.36) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.324241) + + ( -2.74 <= eta && eta < -2.36) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.384532) + + ( -2.36 <= eta && eta < -1.98) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (0.000000) + + ( -2.36 <= eta && eta < -1.98) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.036914) + + ( -2.36 <= eta && eta < -1.98) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.208135) + + ( -2.36 <= eta && eta < -1.98) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.321954) + + ( -2.36 <= eta && eta < -1.98) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.382964) + + ( -1.98 <= eta && eta < -1.60) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (0.000000) + + ( -1.98 <= eta && eta < -1.60) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.032770) + + ( -1.98 <= eta && eta < -1.60) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.201182) + + ( -1.98 <= eta && eta < -1.60) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.316975) + + ( -1.98 <= eta && eta < -1.60) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.379545) + } + + add EfficiencyFormula {211} {211} { + (eta< -3.50 || eta>= -1.60 || pt * cosh(eta) < 0.20 || pt * cosh(eta) >= 2.00) * ( 0.00 ) + + ( -3.50 <= eta && eta < -3.12) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (1.000000) + + ( -3.50 <= eta && eta < -3.12) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.959622) + + ( -3.50 <= eta && eta < -3.12) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.786432) + + ( -3.50 <= eta && eta < -3.12) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.674203) + + ( -3.50 <= eta && eta < -3.12) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.614404) + + ( -3.12 <= eta && eta < -2.74) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (1.000000) + + ( -3.12 <= eta && eta < -2.74) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.960081) + + ( -3.12 <= eta && eta < -2.74) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.787134) + + ( -3.12 <= eta && eta < -2.74) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.674697) + + ( -3.12 <= eta && eta < -2.74) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.614742) + + ( -2.74 <= eta && eta < -2.36) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (1.000000) + + ( -2.74 <= eta && eta < -2.36) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.961053) + + ( -2.74 <= eta && eta < -2.36) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.788638) + + ( -2.74 <= eta && eta < -2.36) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.675759) + + ( -2.74 <= eta && eta < -2.36) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.615468) + + ( -2.36 <= eta && eta < -1.98) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (1.000000) + + ( -2.36 <= eta && eta < -1.98) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.963086) + + ( -2.36 <= eta && eta < -1.98) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.791865) + + ( -2.36 <= eta && eta < -1.98) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.678046) + + ( -2.36 <= eta && eta < -1.98) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.617036) + + ( -1.98 <= eta && eta < -1.60) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (1.000000) + + ( -1.98 <= eta && eta < -1.60) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.967230) + + ( -1.98 <= eta && eta < -1.60) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.798818) + + ( -1.98 <= eta && eta < -1.60) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.683025) + + ( -1.98 <= eta && eta < -1.60) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.620455) + } + + add EfficiencyFormula {0} {0} { 0.00 } +} diff --git a/delphes/scripts/ETOF.e-pi.t025ps-pf20ps.root b/delphes/scripts/ETOF.e-pi.t025ps-pf20ps.root new file mode 100644 index 0000000..c9d7bed Binary files /dev/null and b/delphes/scripts/ETOF.e-pi.t025ps-pf20ps.root differ diff --git a/delphes/scripts/ETOF.e-pi.t025ps-pf20ps.tcl b/delphes/scripts/ETOF.e-pi.t025ps-pf20ps.tcl new file mode 100644 index 0000000..b9b5c93 --- /dev/null +++ b/delphes/scripts/ETOF.e-pi.t025ps-pf20ps.tcl @@ -0,0 +1,122 @@ +module IdentificationMap ETOF { + set InputArray TrackMerger/tracks + set OutputArray tracks + + add EfficiencyFormula {-11} {-11} { + (eta< -3.50 || eta>= -1.60 || pt * cosh(eta) < 0.20 || pt * cosh(eta) >= 2.00) * ( 0.00 ) + + ( -3.50 <= eta && eta < -3.12) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (1.000000) + + ( -3.50 <= eta && eta < -3.12) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.929483) + + ( -3.50 <= eta && eta < -3.12) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.748360) + + ( -3.50 <= eta && eta < -3.12) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.648252) + + ( -3.50 <= eta && eta < -3.12) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.596820) + + ( -3.12 <= eta && eta < -2.74) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (1.000000) + + ( -3.12 <= eta && eta < -2.74) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.930085) + + ( -3.12 <= eta && eta < -2.74) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.749009) + + ( -3.12 <= eta && eta < -2.74) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.648681) + + ( -3.12 <= eta && eta < -2.74) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.597109) + + ( -2.74 <= eta && eta < -2.36) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (1.000000) + + ( -2.74 <= eta && eta < -2.36) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.931366) + + ( -2.74 <= eta && eta < -2.36) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.750399) + + ( -2.74 <= eta && eta < -2.36) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.649603) + + ( -2.74 <= eta && eta < -2.36) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.597729) + + ( -2.36 <= eta && eta < -1.98) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (1.000000) + + ( -2.36 <= eta && eta < -1.98) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.934071) + + ( -2.36 <= eta && eta < -1.98) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.753388) + + ( -2.36 <= eta && eta < -1.98) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.651591) + + ( -2.36 <= eta && eta < -1.98) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.599066) + + ( -1.98 <= eta && eta < -1.60) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (1.000000) + + ( -1.98 <= eta && eta < -1.60) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.939696) + + ( -1.98 <= eta && eta < -1.60) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.759856) + + ( -1.98 <= eta && eta < -1.60) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.655923) + + ( -1.98 <= eta && eta < -1.60) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.601987) + } + + add EfficiencyFormula {-11} {211} { + (eta< -3.50 || eta>= -1.60 || pt * cosh(eta) < 0.20 || pt * cosh(eta) >= 2.00) * ( 0.00 ) + + ( -3.50 <= eta && eta < -3.12) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (0.000000) + + ( -3.50 <= eta && eta < -3.12) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.070517) + + ( -3.50 <= eta && eta < -3.12) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.251640) + + ( -3.50 <= eta && eta < -3.12) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.351748) + + ( -3.50 <= eta && eta < -3.12) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.403180) + + ( -3.12 <= eta && eta < -2.74) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (0.000000) + + ( -3.12 <= eta && eta < -2.74) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.069915) + + ( -3.12 <= eta && eta < -2.74) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.250991) + + ( -3.12 <= eta && eta < -2.74) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.351319) + + ( -3.12 <= eta && eta < -2.74) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.402891) + + ( -2.74 <= eta && eta < -2.36) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (0.000000) + + ( -2.74 <= eta && eta < -2.36) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.068634) + + ( -2.74 <= eta && eta < -2.36) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.249601) + + ( -2.74 <= eta && eta < -2.36) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.350397) + + ( -2.74 <= eta && eta < -2.36) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.402271) + + ( -2.36 <= eta && eta < -1.98) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (0.000000) + + ( -2.36 <= eta && eta < -1.98) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.065929) + + ( -2.36 <= eta && eta < -1.98) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.246612) + + ( -2.36 <= eta && eta < -1.98) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.348409) + + ( -2.36 <= eta && eta < -1.98) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.400934) + + ( -1.98 <= eta && eta < -1.60) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (0.000000) + + ( -1.98 <= eta && eta < -1.60) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.060304) + + ( -1.98 <= eta && eta < -1.60) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.240144) + + ( -1.98 <= eta && eta < -1.60) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.344077) + + ( -1.98 <= eta && eta < -1.60) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.398013) + } + + add EfficiencyFormula {211} {-11} { + (eta< -3.50 || eta>= -1.60 || pt * cosh(eta) < 0.20 || pt * cosh(eta) >= 2.00) * ( 0.00 ) + + ( -3.50 <= eta && eta < -3.12) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (0.000000) + + ( -3.50 <= eta && eta < -3.12) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.070517) + + ( -3.50 <= eta && eta < -3.12) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.251640) + + ( -3.50 <= eta && eta < -3.12) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.351748) + + ( -3.50 <= eta && eta < -3.12) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.403180) + + ( -3.12 <= eta && eta < -2.74) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (0.000000) + + ( -3.12 <= eta && eta < -2.74) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.069915) + + ( -3.12 <= eta && eta < -2.74) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.250991) + + ( -3.12 <= eta && eta < -2.74) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.351319) + + ( -3.12 <= eta && eta < -2.74) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.402891) + + ( -2.74 <= eta && eta < -2.36) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (0.000000) + + ( -2.74 <= eta && eta < -2.36) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.068634) + + ( -2.74 <= eta && eta < -2.36) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.249601) + + ( -2.74 <= eta && eta < -2.36) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.350397) + + ( -2.74 <= eta && eta < -2.36) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.402271) + + ( -2.36 <= eta && eta < -1.98) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (0.000000) + + ( -2.36 <= eta && eta < -1.98) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.065929) + + ( -2.36 <= eta && eta < -1.98) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.246612) + + ( -2.36 <= eta && eta < -1.98) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.348409) + + ( -2.36 <= eta && eta < -1.98) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.400934) + + ( -1.98 <= eta && eta < -1.60) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (0.000000) + + ( -1.98 <= eta && eta < -1.60) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.060304) + + ( -1.98 <= eta && eta < -1.60) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.240144) + + ( -1.98 <= eta && eta < -1.60) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.344077) + + ( -1.98 <= eta && eta < -1.60) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.398013) + } + + add EfficiencyFormula {211} {211} { + (eta< -3.50 || eta>= -1.60 || pt * cosh(eta) < 0.20 || pt * cosh(eta) >= 2.00) * ( 0.00 ) + + ( -3.50 <= eta && eta < -3.12) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (1.000000) + + ( -3.50 <= eta && eta < -3.12) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.929483) + + ( -3.50 <= eta && eta < -3.12) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.748360) + + ( -3.50 <= eta && eta < -3.12) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.648252) + + ( -3.50 <= eta && eta < -3.12) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.596820) + + ( -3.12 <= eta && eta < -2.74) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (1.000000) + + ( -3.12 <= eta && eta < -2.74) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.930085) + + ( -3.12 <= eta && eta < -2.74) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.749009) + + ( -3.12 <= eta && eta < -2.74) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.648681) + + ( -3.12 <= eta && eta < -2.74) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.597109) + + ( -2.74 <= eta && eta < -2.36) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (1.000000) + + ( -2.74 <= eta && eta < -2.36) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.931366) + + ( -2.74 <= eta && eta < -2.36) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.750399) + + ( -2.74 <= eta && eta < -2.36) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.649603) + + ( -2.74 <= eta && eta < -2.36) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.597729) + + ( -2.36 <= eta && eta < -1.98) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (1.000000) + + ( -2.36 <= eta && eta < -1.98) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.934071) + + ( -2.36 <= eta && eta < -1.98) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.753388) + + ( -2.36 <= eta && eta < -1.98) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.651591) + + ( -2.36 <= eta && eta < -1.98) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.599066) + + ( -1.98 <= eta && eta < -1.60) * ( 0.20 <= pt * cosh(eta) && pt * cosh(eta) < 0.56) * (1.000000) + + ( -1.98 <= eta && eta < -1.60) * ( 0.56 <= pt * cosh(eta) && pt * cosh(eta) < 0.92) * (0.939696) + + ( -1.98 <= eta && eta < -1.60) * ( 0.92 <= pt * cosh(eta) && pt * cosh(eta) < 1.28) * (0.759856) + + ( -1.98 <= eta && eta < -1.60) * ( 1.28 <= pt * cosh(eta) && pt * cosh(eta) < 1.64) * (0.655923) + + ( -1.98 <= eta && eta < -1.60) * ( 1.64 <= pt * cosh(eta) && pt * cosh(eta) < 2.00) * (0.601987) + } + + add EfficiencyFormula {0} {0} { 0.00 } +} diff --git a/delphes/scripts/ctr_map_p1_0.95.root b/delphes/scripts/ctr_map_p1_0.95.root new file mode 100644 index 0000000..eb77cee Binary files /dev/null and b/delphes/scripts/ctr_map_p1_0.95.root differ diff --git a/delphes/scripts/dconfig-jaydeep.C b/delphes/scripts/dconfig-jaydeep.C new file mode 100644 index 0000000..e7ef516 --- /dev/null +++ b/delphes/scripts/dconfig-jaydeep.C @@ -0,0 +1,132 @@ + +// +// root -l dconfig-jaydeep.C +// + +void dconfig_jaydeep( void ) +{ + auto delphes = new DelphesConfigRICH("pfRICH"); + + // Define particle mass hypotheses in ascending mass order; yes, there is no + // reason to overcomplicate things; + delphes->AddMassHypothesis("e-"); + delphes->AddMassHypothesis("pi+"); + + // Define radiator refractive index; + delphes->SetRefractiveIndex(1.04549); + // Tracker angular resolution as provided by Matt; FIXME: momentum resolution ignored; + //delphes->ImportTrackingSmearing("../database/dth_parameters_22.11.2.txt", + // "../database/dph_parameters_22.11.2.txt"); + //delphes->ImportTrackingSmearing("../database/par_th.modified.txt", + // "../database/par_ph.modified.txt"); + + // Define eta ranges in ascending order; + { + auto eta = delphes->AddEtaRange(-3.5, -2.8); + + // Arguments [0..1]: momentum ranges for this eta in [GeV] in ascending order without gaps, + // Arguments [2..N]: sigma values in [mrad] matching the mass hypotheses above, in the same + // ascending order used to call delphes->AddMassHypothesis(); +#if 0 + eta->AddMomentumRange( 0.05, 0.10, 0.00, 0.00); + eta->AddMomentumRange( 0.10, 0.15, 0.00, 0.00); + eta->AddMomentumRange( 0.15, 0.20, 2.48, 0.00); + eta->AddMomentumRange( 0.20, 0.25, 2.00, 0.00); + eta->AddMomentumRange( 0.25, 0.30, 1.89, 0.00); + eta->AddMomentumRange( 0.30, 0.35, 1.78, 0.00); + eta->AddMomentumRange( 0.35, 0.40, 1.73, 0.00); +#endif + eta->AddMomentumRange( 0.40, 0.45, 1.69, 0.00); + eta->AddMomentumRange( 0.45, 0.50, 1.68, 10.56); + eta->AddMomentumRange( 0.50, 0.55, 1.64, 4.59); + eta->AddMomentumRange( 0.55, 0.60, 1.63, 3.18); + eta->AddMomentumRange( 0.60, 0.70, 1.60, 2.41); + eta->AddMomentumRange( 0.70, 0.80, 1.60, 2.05); + eta->AddMomentumRange( 0.80, 0.90, 1.65, 1.86); + eta->AddMomentumRange( 0.90, 1.00, 1.58, 1.80); + eta->AddMomentumRange( 1.00, 1.50, 1.59, 1.68); + eta->AddMomentumRange( 1.50, 2.00, 1.57, 1.63); + eta->AddMomentumRange( 2.00, 2.50, 1.59, 1.59); + eta->AddMomentumRange( 2.50, 3.00, 1.58, 1.62); + eta->AddMomentumRange( 3.00, 3.50, 1.57, 1.63); + eta->AddMomentumRange( 3.50, 4.00, 1.59, 1.60); + eta->AddMomentumRange( 4.00, 4.50, 1.53, 1.58); + eta->AddMomentumRange( 4.50, 5.00, 1.61, 1.58); + eta->AddMomentumRange( 5.00, 5.50, 1.59, 1.57); + } + { + auto eta = delphes->AddEtaRange(-2.8, -1.9); + + // Well, average bin momentum is used to calculate Cherenkov theta, so the bins + // should not be too wide in the areas where dtheta/dp is high for at least one + // of the hypotheses; +#if 0 + eta->AddMomentumRange( 0.05, 0.10, 3.67, 0.00); + eta->AddMomentumRange( 0.10, 0.15, 3.62, 0.00); + eta->AddMomentumRange( 0.15, 0.20, 2.24, 0.00); + eta->AddMomentumRange( 0.20, 0.25, 1.82, 0.00); + eta->AddMomentumRange( 0.25, 0.30, 1.76, 0.00); + eta->AddMomentumRange( 0.30, 0.35, 1.69, 0.00); + eta->AddMomentumRange( 0.35, 0.40, 1.66, 0.00); +#endif + eta->AddMomentumRange( 0.40, 0.45, 1.69, 0.00); + eta->AddMomentumRange( 0.45, 0.50, 1.66, 10.76); + eta->AddMomentumRange( 0.50, 0.55, 1.64, 4.62); + eta->AddMomentumRange( 0.55, 0.60, 1.61, 3.07); + eta->AddMomentumRange( 0.60, 0.70, 1.60, 2.40); + eta->AddMomentumRange( 0.70, 0.80, 1.57, 2.05); + eta->AddMomentumRange( 0.80, 0.90, 1.60, 1.93); + eta->AddMomentumRange( 0.90, 1.00, 1.59, 1.78); + eta->AddMomentumRange( 1.00, 1.50, 1.59, 1.68); + eta->AddMomentumRange( 1.50, 2.00, 1.55, 1.60); + eta->AddMomentumRange( 2.00, 2.50, 1.57, 1.60); + eta->AddMomentumRange( 2.50, 3.00, 1.56, 1.58); + eta->AddMomentumRange( 3.00, 3.50, 1.53, 1.59); + eta->AddMomentumRange( 3.50, 4.00, 1.55, 1.55); + eta->AddMomentumRange( 4.00, 4.50, 1.55, 1.54); + eta->AddMomentumRange( 4.50, 5.00, 1.57, 1.56); + eta->AddMomentumRange( 5.00, 5.50, 1.57, 1.55); + + } + + { + auto eta = delphes->AddEtaRange(-1.9, -1.5); + +#if 0 + eta->AddMomentumRange( 0.05, 0.10, 3.78, 0.00); + eta->AddMomentumRange( 0.10, 0.15, 3.52, 0.00); + eta->AddMomentumRange( 0.15, 0.20, 2.31, 0.00); + eta->AddMomentumRange( 0.20, 0.25, 2.04, 0.00); + eta->AddMomentumRange( 0.25, 0.30, 1.87, 0.00); + eta->AddMomentumRange( 0.30, 0.35, 1.79, 0.00); + eta->AddMomentumRange( 0.35, 0.40, 1.76, 0.00); +#endif + eta->AddMomentumRange( 0.40, 0.45, 1.71, 0.00); + eta->AddMomentumRange( 0.45, 0.50, 1.71, 10.67); + eta->AddMomentumRange( 0.50, 0.55, 1.71, 4.99); + eta->AddMomentumRange( 0.55, 0.60, 1.62, 3.38); + eta->AddMomentumRange( 0.60, 0.70, 1.59, 2.52); + eta->AddMomentumRange( 0.70, 0.80, 1.58, 2.11); + eta->AddMomentumRange( 0.80, 0.90, 1.56, 1.88); + eta->AddMomentumRange( 0.90, 1.00, 1.55, 1.78); + eta->AddMomentumRange( 1.00, 1.50, 1.53, 1.65); + eta->AddMomentumRange( 1.50, 2.00, 1.56, 1.60); + eta->AddMomentumRange( 2.00, 2.50, 1.56, 1.53); + eta->AddMomentumRange( 2.50, 3.00, 1.57, 1.54); + eta->AddMomentumRange( 3.00, 3.50, 1.54, 1.56); + eta->AddMomentumRange( 3.50, 4.00, 1.53, 1.52); + eta->AddMomentumRange( 4.00, 4.50, 1.52, 1.54); + eta->AddMomentumRange( 4.50, 5.00, 1.51, 1.53); + eta->AddMomentumRange( 5.00, 5.50, 1.49, 1.51); } + + // This call also makes a guess on the kaon and proton thresholds; + delphes->AddZeroSigmaEntries(); + //delphes->Print(); + delphes->WriteTcl(); + { + auto fout = new TFile("pfRICH.root", "RECREATE"); + delphes->Write(); + fout->Close(); + } + exit(0); +} // dconfig() diff --git a/delphes/scripts/delphes-btof.C b/delphes/scripts/delphes-btof.C index b4b7fe2..8564d8a 100644 --- a/delphes/scripts/delphes-btof.C +++ b/delphes/scripts/delphes-btof.C @@ -53,5 +53,10 @@ void delphes_btof( void ) // This is again some generic stuff; //btof->Print(); btof->WriteTcl(); + { + auto fout = new TFile("BTOF.root", "RECREATE"); + btof->Write(); + fout->Close(); + } exit(0); } // delphes_btof() diff --git a/delphes/scripts/delphes-dirc.C b/delphes/scripts/delphes-dirc.C index 2b9103a..0cce32c 100644 --- a/delphes/scripts/delphes-dirc.C +++ b/delphes/scripts/delphes-dirc.C @@ -26,12 +26,11 @@ void delphes_dirc( void ) #endif // "d(theta) ~ a/p + b" parameterization as taken from Wenqing's 11/23/21 slides, - // roughly averaged over eta; + // roughly averaged over eta; 12/05/2022: still use the same, for the time being; dirc->SetTrackerAngularResolution(0.9, 0.1); // eta and momentum range and binning; - dirc->SetEtaRange (-1.64, 1.25, 10); - //dirc->SetEtaRange ( 1.0, 1.01, 1); + dirc->SetEtaRange (-1.55, 1.79, 10); // Do not mind to use Pt rather than 1/Pt bins; [GeV/c]; #ifdef _E_PI_SEPARATION_MODE_ dirc->SetMomentumRange( 0.44, 3.00, 10); @@ -41,13 +40,18 @@ void delphes_dirc( void ) #endif // Installation radius in [mm]; constant magnetic field in [T]; - dirc->SetInstallationRadius (1060.0); - dirc->SetMagneticField ( 3.000); + dirc->SetInstallationRadius (729.6); + dirc->SetMagneticField ( 1.700); dirc->SetParameterizationMap("./ctr_map_p1_0.95.root"); dirc->DoSigmaCalculations(); // This is again some generic stuff; dirc->WriteTcl(false); + { + auto fout = new TFile("barrelDIRC.root", "RECREATE"); + dirc->Write(); + fout->Close(); + } exit(0); } // delphes_dirc() diff --git a/delphes/scripts/delphes-etof.C b/delphes/scripts/delphes-etof.C new file mode 100644 index 0000000..22ea6eb --- /dev/null +++ b/delphes/scripts/delphes-etof.C @@ -0,0 +1,67 @@ + +// +// Units are [mm], [GeV], [T], [ps]; +// +// root -l delphes_etof.C +// + +//#define _E_PI_SEPARATION_MODE_ + +void delphes_etof( void ) +{ + //printf("%f\n", (1.0 - erf(1.5/(sqrt(2.)*1.0)))/2); + + auto etof = new DelphesConfigTOF("ETOF"); + //etof->UsePtMode(); + + // Define particle mass hypotheses in ascending mass order; yes, there is no + // reason to overcomplicate things; + //#ifdef _E_PI_SEPARATION_MODE_ + etof->AddMassHypothesis(-11); + //#endif + etof->AddMassHypothesis("pi+"); + //#ifndef _E_PI_SEPARATION_MODE_ + //etof->AddMassHypothesis("K+"); + //etof->AddMassHypothesis("proton"); + //#endif + + // Define t0 and detector time resolution is [ps]; + //etof->SetT0Resolution (20.00); + etof->SetT0Resolution (25.00); + //etof->SetDetectorResolution (30.00); + etof->SetDetectorResolution (20.00); + // dp/p ~ 0.02% * p + 0.5%; take the proposal draft TEMPLATE data; assume holds for Pt; + //etof->SetMomentumResolution (0.020, 0.500); + // FIXME: assume ideal tracker for now; + etof->SetMomentumResolution (0.000, 0.000); + // Units are [mm] throughout the code; + etof->SetPathLengthResolution(1.000); + + // Installation radius in [mm]; constant magnetic field in [T]; + //etof->SetInstallationRadius (500.0); + //etof->SetMagneticField (3.000); + etof->SetInstallationDistance(1607.0); + + // eta and momentum range and binning; + etof->SetEtaRange (-3.50, -1.60, 5); + // Do not mind to use Pt rather than 1/Pt bins; [GeV/c]; + //#ifdef _E_PI_SEPARATION_MODE_ + etof->SetMomentumRange( 0.20, 2.00, 5); + //#else + //etof->SetMomentumRange( 0.22, 2.20, 10); + //#endif + + // This input is sufficient to allocate the internal tables and calculate + // time of flight for various mass hypotheses; + etof->DoSigmaCalculations(); + + // This is again some generic stuff; + //etof->Print(); + etof->WriteTcl(); + { + auto fout = new TFile("ETOF.root", "RECREATE"); + etof->Write(); + fout->Close(); + } + exit(0); +} // delphes_etof() diff --git a/delphes/scripts/e_pi_pid.root b/delphes/scripts/e_pi_pid.root new file mode 100644 index 0000000..efba5fb Binary files /dev/null and b/delphes/scripts/e_pi_pid.root differ diff --git a/delphes/scripts/evaluator.C b/delphes/scripts/evaluator.C new file mode 100644 index 0000000..aae0e53 --- /dev/null +++ b/delphes/scripts/evaluator.C @@ -0,0 +1,69 @@ + +// +// ! Make sure libDELPHES.so is in LD_LIBRARY_PATH +// +// cd delphes/scripts +// +// root -l 'evaluator.C("")' +// +// root -l 'evaluator.C("e_pi_pid.root")' +// + +void evaluator(const char *fname) +{ + auto ff = new TFile(fname); + auto dconfig = dynamic_cast(ff->Get("DelphesConfigRICH")); + ff->Close(); + + { + // Use the same momentum, not to overcomplicate logic; + TVector3 p(0.0, 0.4, -3.0); + printf("%f\n", p.Eta()); + + // Electron hypothesis; + auto electron = dconfig->GetMassHypothesis(11), pion = dconfig->GetMassHypothesis(211); + + // In gaussian sigma units "to the left" (towards the pion peak location); + double cutoff = -1.0; + unsigned inefficiency = 0, misidentification = 0, contamination = 0; + + // Generate few random electron & pion events, in a 50:50 proportion; + for(unsigned iq=0; iq<50; iq++) { + auto truth = iq%2 ? electron : pion; + + // Using built-in configuration (average Cherenkov angle for this + // particle hypothesis defined by momentum and encoded medium refractive index, + // as well as expected Cherenkov angle smearing for this combination of {pdg,p,eta}) + // simulate a "measured" Cherenkov angle for this event using rndm.Gaus() call; + double theta = dconfig->GenerateMeasurement(truth->PdgCode(), p); + + // Check which particle hypothesis wins (gives smaller chi^2 for this 'theta'); + auto best = dconfig->FindBestHypothesis(p, theta); + + char signature = ' '; + // Evaluate the outcome; + if (truth == electron) { + // Electron identified as pion; so be it; + if (best != electron) { + misidentification++; + signature = 'm'; + } //if + + // Electron measured "too close to pion" and rejected; sigh!; + if (best == electron && electron->GetMeasurementOffset() < cutoff) { + inefficiency++; + signature = 'i'; + } //if + } else { + // Pion identified as electron, and accepted as such; bad!; + if (best == electron && electron->GetMeasurementOffset() > cutoff) { + contamination++; + signature = 'c'; + } //if + } //if + + printf("%3d %3d -> %7.2f [mrad] (%3d %c, %7.2f [sigma])\n", iq, truth->PdgCode(), theta, + best->PdgCode(), signature, electron->GetMeasurementOffset()); + } //for iq + } +} // evaluator() diff --git a/delphes/scripts/pfRICH.root b/delphes/scripts/pfRICH.root deleted file mode 100644 index 322bd6a..0000000 Binary files a/delphes/scripts/pfRICH.root and /dev/null differ diff --git a/delphes/scripts/pfRICH.tcl b/delphes/scripts/pfRICH.tcl deleted file mode 100644 index ebcfb30..0000000 --- a/delphes/scripts/pfRICH.tcl +++ /dev/null @@ -1,370 +0,0 @@ -module IdentificationMap pfRICH { - set InputArray TrackMerger/tracks - set OutputArray tracks - - add EfficiencyFormula {211} {211} { - (eta< -3.80 || eta>= -1.50 || pt * cosh(eta) < 0.90 || pt * cosh(eta) >= 15.50) * ( 0.00 ) + - ( -3.80 <= eta && eta < -2.80) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 2.90) * (1.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 2.90 <= pt * cosh(eta) && pt * cosh(eta) < 3.10) * (1.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 3.10 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.972944) + - ( -3.80 <= eta && eta < -2.80) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (1.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (1.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 5.50 <= pt * cosh(eta) && pt * cosh(eta) < 6.10) * (1.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 6.10 <= pt * cosh(eta) && pt * cosh(eta) < 6.50) * (0.999999) + - ( -3.80 <= eta && eta < -2.80) * ( 6.50 <= pt * cosh(eta) && pt * cosh(eta) < 7.50) * (0.999422) + - ( -3.80 <= eta && eta < -2.80) * ( 7.50 <= pt * cosh(eta) && pt * cosh(eta) < 8.50) * (0.992784) + - ( -3.80 <= eta && eta < -2.80) * ( 8.50 <= pt * cosh(eta) && pt * cosh(eta) < 9.50) * (0.984919) + - ( -3.80 <= eta && eta < -2.80) * ( 9.50 <= pt * cosh(eta) && pt * cosh(eta) < 10.50) * (0.958603) + - ( -3.80 <= eta && eta < -2.80) * ( 10.50 <= pt * cosh(eta) && pt * cosh(eta) < 11.50) * (0.919817) + - ( -3.80 <= eta && eta < -2.80) * ( 11.50 <= pt * cosh(eta) && pt * cosh(eta) < 12.50) * (0.875145) + - ( -3.80 <= eta && eta < -2.80) * ( 12.50 <= pt * cosh(eta) && pt * cosh(eta) < 13.50) * (0.848991) + - ( -3.80 <= eta && eta < -2.80) * ( 13.50 <= pt * cosh(eta) && pt * cosh(eta) < 14.50) * (0.822742) + - ( -3.80 <= eta && eta < -2.80) * ( 14.50 <= pt * cosh(eta) && pt * cosh(eta) < 15.50) * (0.780192) + - ( -2.80 <= eta && eta < -1.90) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 2.90) * (1.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 2.90 <= pt * cosh(eta) && pt * cosh(eta) < 3.10) * (1.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 3.10 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.995856) + - ( -2.80 <= eta && eta < -1.90) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (1.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (1.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 5.50 <= pt * cosh(eta) && pt * cosh(eta) < 6.10) * (1.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 6.10 <= pt * cosh(eta) && pt * cosh(eta) < 6.50) * (0.999999) + - ( -2.80 <= eta && eta < -1.90) * ( 6.50 <= pt * cosh(eta) && pt * cosh(eta) < 7.50) * (0.999407) + - ( -2.80 <= eta && eta < -1.90) * ( 7.50 <= pt * cosh(eta) && pt * cosh(eta) < 8.50) * (0.995783) + - ( -2.80 <= eta && eta < -1.90) * ( 8.50 <= pt * cosh(eta) && pt * cosh(eta) < 9.50) * (0.989594) + - ( -2.80 <= eta && eta < -1.90) * ( 9.50 <= pt * cosh(eta) && pt * cosh(eta) < 10.50) * (0.968762) + - ( -2.80 <= eta && eta < -1.90) * ( 10.50 <= pt * cosh(eta) && pt * cosh(eta) < 11.50) * (0.935193) + - ( -2.80 <= eta && eta < -1.90) * ( 11.50 <= pt * cosh(eta) && pt * cosh(eta) < 12.50) * (0.892044) + - ( -2.80 <= eta && eta < -1.90) * ( 12.50 <= pt * cosh(eta) && pt * cosh(eta) < 13.50) * (0.867138) + - ( -2.80 <= eta && eta < -1.90) * ( 13.50 <= pt * cosh(eta) && pt * cosh(eta) < 14.50) * (0.828418) + - ( -2.80 <= eta && eta < -1.90) * ( 14.50 <= pt * cosh(eta) && pt * cosh(eta) < 15.50) * (0.799323) + - ( -1.90 <= eta && eta < -1.50) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 2.90) * (1.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 2.90 <= pt * cosh(eta) && pt * cosh(eta) < 3.10) * (1.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 3.10 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.970552) + - ( -1.90 <= eta && eta < -1.50) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (1.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (1.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 5.50 <= pt * cosh(eta) && pt * cosh(eta) < 6.10) * (1.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 6.10 <= pt * cosh(eta) && pt * cosh(eta) < 6.50) * (0.999999) + - ( -1.90 <= eta && eta < -1.50) * ( 6.50 <= pt * cosh(eta) && pt * cosh(eta) < 7.50) * (0.999955) + - ( -1.90 <= eta && eta < -1.50) * ( 7.50 <= pt * cosh(eta) && pt * cosh(eta) < 8.50) * (0.997901) + - ( -1.90 <= eta && eta < -1.50) * ( 8.50 <= pt * cosh(eta) && pt * cosh(eta) < 9.50) * (0.989495) + - ( -1.90 <= eta && eta < -1.50) * ( 9.50 <= pt * cosh(eta) && pt * cosh(eta) < 10.50) * (0.967230) + - ( -1.90 <= eta && eta < -1.50) * ( 10.50 <= pt * cosh(eta) && pt * cosh(eta) < 11.50) * (0.934204) + - ( -1.90 <= eta && eta < -1.50) * ( 11.50 <= pt * cosh(eta) && pt * cosh(eta) < 12.50) * (0.900894) + - ( -1.90 <= eta && eta < -1.50) * ( 12.50 <= pt * cosh(eta) && pt * cosh(eta) < 13.50) * (0.864474) + - ( -1.90 <= eta && eta < -1.50) * ( 13.50 <= pt * cosh(eta) && pt * cosh(eta) < 14.50) * (0.822755) + - ( -1.90 <= eta && eta < -1.50) * ( 14.50 <= pt * cosh(eta) && pt * cosh(eta) < 15.50) * (0.792580) - } - - add EfficiencyFormula {211} {321} { - (eta< -3.80 || eta>= -1.50 || pt * cosh(eta) < 0.90 || pt * cosh(eta) >= 15.50) * ( 0.00 ) + - ( -3.80 <= eta && eta < -2.80) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 2.90) * (0.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 2.90 <= pt * cosh(eta) && pt * cosh(eta) < 3.10) * (0.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 3.10 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.027056) + - ( -3.80 <= eta && eta < -2.80) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 5.50 <= pt * cosh(eta) && pt * cosh(eta) < 6.10) * (0.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 6.10 <= pt * cosh(eta) && pt * cosh(eta) < 6.50) * (0.000001) + - ( -3.80 <= eta && eta < -2.80) * ( 6.50 <= pt * cosh(eta) && pt * cosh(eta) < 7.50) * (0.000578) + - ( -3.80 <= eta && eta < -2.80) * ( 7.50 <= pt * cosh(eta) && pt * cosh(eta) < 8.50) * (0.007216) + - ( -3.80 <= eta && eta < -2.80) * ( 8.50 <= pt * cosh(eta) && pt * cosh(eta) < 9.50) * (0.015081) + - ( -3.80 <= eta && eta < -2.80) * ( 9.50 <= pt * cosh(eta) && pt * cosh(eta) < 10.50) * (0.041397) + - ( -3.80 <= eta && eta < -2.80) * ( 10.50 <= pt * cosh(eta) && pt * cosh(eta) < 11.50) * (0.080183) + - ( -3.80 <= eta && eta < -2.80) * ( 11.50 <= pt * cosh(eta) && pt * cosh(eta) < 12.50) * (0.124855) + - ( -3.80 <= eta && eta < -2.80) * ( 12.50 <= pt * cosh(eta) && pt * cosh(eta) < 13.50) * (0.151009) + - ( -3.80 <= eta && eta < -2.80) * ( 13.50 <= pt * cosh(eta) && pt * cosh(eta) < 14.50) * (0.177258) + - ( -3.80 <= eta && eta < -2.80) * ( 14.50 <= pt * cosh(eta) && pt * cosh(eta) < 15.50) * (0.219808) + - ( -2.80 <= eta && eta < -1.90) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 2.90) * (0.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 2.90 <= pt * cosh(eta) && pt * cosh(eta) < 3.10) * (0.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 3.10 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.004144) + - ( -2.80 <= eta && eta < -1.90) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 5.50 <= pt * cosh(eta) && pt * cosh(eta) < 6.10) * (0.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 6.10 <= pt * cosh(eta) && pt * cosh(eta) < 6.50) * (0.000001) + - ( -2.80 <= eta && eta < -1.90) * ( 6.50 <= pt * cosh(eta) && pt * cosh(eta) < 7.50) * (0.000593) + - ( -2.80 <= eta && eta < -1.90) * ( 7.50 <= pt * cosh(eta) && pt * cosh(eta) < 8.50) * (0.004217) + - ( -2.80 <= eta && eta < -1.90) * ( 8.50 <= pt * cosh(eta) && pt * cosh(eta) < 9.50) * (0.010406) + - ( -2.80 <= eta && eta < -1.90) * ( 9.50 <= pt * cosh(eta) && pt * cosh(eta) < 10.50) * (0.031238) + - ( -2.80 <= eta && eta < -1.90) * ( 10.50 <= pt * cosh(eta) && pt * cosh(eta) < 11.50) * (0.064807) + - ( -2.80 <= eta && eta < -1.90) * ( 11.50 <= pt * cosh(eta) && pt * cosh(eta) < 12.50) * (0.107956) + - ( -2.80 <= eta && eta < -1.90) * ( 12.50 <= pt * cosh(eta) && pt * cosh(eta) < 13.50) * (0.132862) + - ( -2.80 <= eta && eta < -1.90) * ( 13.50 <= pt * cosh(eta) && pt * cosh(eta) < 14.50) * (0.171582) + - ( -2.80 <= eta && eta < -1.90) * ( 14.50 <= pt * cosh(eta) && pt * cosh(eta) < 15.50) * (0.200677) + - ( -1.90 <= eta && eta < -1.50) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 2.90) * (0.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 2.90 <= pt * cosh(eta) && pt * cosh(eta) < 3.10) * (0.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 3.10 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.029448) + - ( -1.90 <= eta && eta < -1.50) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 5.50 <= pt * cosh(eta) && pt * cosh(eta) < 6.10) * (0.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 6.10 <= pt * cosh(eta) && pt * cosh(eta) < 6.50) * (0.000001) + - ( -1.90 <= eta && eta < -1.50) * ( 6.50 <= pt * cosh(eta) && pt * cosh(eta) < 7.50) * (0.000045) + - ( -1.90 <= eta && eta < -1.50) * ( 7.50 <= pt * cosh(eta) && pt * cosh(eta) < 8.50) * (0.002099) + - ( -1.90 <= eta && eta < -1.50) * ( 8.50 <= pt * cosh(eta) && pt * cosh(eta) < 9.50) * (0.010505) + - ( -1.90 <= eta && eta < -1.50) * ( 9.50 <= pt * cosh(eta) && pt * cosh(eta) < 10.50) * (0.032770) + - ( -1.90 <= eta && eta < -1.50) * ( 10.50 <= pt * cosh(eta) && pt * cosh(eta) < 11.50) * (0.065796) + - ( -1.90 <= eta && eta < -1.50) * ( 11.50 <= pt * cosh(eta) && pt * cosh(eta) < 12.50) * (0.099106) + - ( -1.90 <= eta && eta < -1.50) * ( 12.50 <= pt * cosh(eta) && pt * cosh(eta) < 13.50) * (0.135526) + - ( -1.90 <= eta && eta < -1.50) * ( 13.50 <= pt * cosh(eta) && pt * cosh(eta) < 14.50) * (0.177245) + - ( -1.90 <= eta && eta < -1.50) * ( 14.50 <= pt * cosh(eta) && pt * cosh(eta) < 15.50) * (0.207420) - } - - add EfficiencyFormula {321} {211} { - (eta< -3.80 || eta>= -1.50 || pt * cosh(eta) < 0.90 || pt * cosh(eta) >= 15.50) * ( 0.00 ) + - ( -3.80 <= eta && eta < -2.80) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 2.90) * (0.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 2.90 <= pt * cosh(eta) && pt * cosh(eta) < 3.10) * (0.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 3.10 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 5.50 <= pt * cosh(eta) && pt * cosh(eta) < 6.10) * (0.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 6.10 <= pt * cosh(eta) && pt * cosh(eta) < 6.50) * (0.000046) + - ( -3.80 <= eta && eta < -2.80) * ( 6.50 <= pt * cosh(eta) && pt * cosh(eta) < 7.50) * (0.000043) + - ( -3.80 <= eta && eta < -2.80) * ( 7.50 <= pt * cosh(eta) && pt * cosh(eta) < 8.50) * (0.007470) + - ( -3.80 <= eta && eta < -2.80) * ( 8.50 <= pt * cosh(eta) && pt * cosh(eta) < 9.50) * (0.024189) + - ( -3.80 <= eta && eta < -2.80) * ( 9.50 <= pt * cosh(eta) && pt * cosh(eta) < 10.50) * (0.034587) + - ( -3.80 <= eta && eta < -2.80) * ( 10.50 <= pt * cosh(eta) && pt * cosh(eta) < 11.50) * (0.094240) + - ( -3.80 <= eta && eta < -2.80) * ( 11.50 <= pt * cosh(eta) && pt * cosh(eta) < 12.50) * (0.081035) + - ( -3.80 <= eta && eta < -2.80) * ( 12.50 <= pt * cosh(eta) && pt * cosh(eta) < 13.50) * (0.149615) + - ( -3.80 <= eta && eta < -2.80) * ( 13.50 <= pt * cosh(eta) && pt * cosh(eta) < 14.50) * (0.174369) + - ( -3.80 <= eta && eta < -2.80) * ( 14.50 <= pt * cosh(eta) && pt * cosh(eta) < 15.50) * (0.211734) + - ( -2.80 <= eta && eta < -1.90) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 2.90) * (0.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 2.90 <= pt * cosh(eta) && pt * cosh(eta) < 3.10) * (0.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 3.10 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 5.50 <= pt * cosh(eta) && pt * cosh(eta) < 6.10) * (0.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 6.10 <= pt * cosh(eta) && pt * cosh(eta) < 6.50) * (0.000046) + - ( -2.80 <= eta && eta < -1.90) * ( 6.50 <= pt * cosh(eta) && pt * cosh(eta) < 7.50) * (0.000098) + - ( -2.80 <= eta && eta < -1.90) * ( 7.50 <= pt * cosh(eta) && pt * cosh(eta) < 8.50) * (0.005179) + - ( -2.80 <= eta && eta < -1.90) * ( 8.50 <= pt * cosh(eta) && pt * cosh(eta) < 9.50) * (0.018689) + - ( -2.80 <= eta && eta < -1.90) * ( 9.50 <= pt * cosh(eta) && pt * cosh(eta) < 10.50) * (0.034477) + - ( -2.80 <= eta && eta < -1.90) * ( 10.50 <= pt * cosh(eta) && pt * cosh(eta) < 11.50) * (0.056836) + - ( -2.80 <= eta && eta < -1.90) * ( 11.50 <= pt * cosh(eta) && pt * cosh(eta) < 12.50) * (0.088863) + - ( -2.80 <= eta && eta < -1.90) * ( 12.50 <= pt * cosh(eta) && pt * cosh(eta) < 13.50) * (0.117858) + - ( -2.80 <= eta && eta < -1.90) * ( 13.50 <= pt * cosh(eta) && pt * cosh(eta) < 14.50) * (0.180251) + - ( -2.80 <= eta && eta < -1.90) * ( 14.50 <= pt * cosh(eta) && pt * cosh(eta) < 15.50) * (0.214743) + - ( -1.90 <= eta && eta < -1.50) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 2.90) * (0.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 2.90 <= pt * cosh(eta) && pt * cosh(eta) < 3.10) * (0.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 3.10 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 5.50 <= pt * cosh(eta) && pt * cosh(eta) < 6.10) * (0.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 6.10 <= pt * cosh(eta) && pt * cosh(eta) < 6.50) * (0.000046) + - ( -1.90 <= eta && eta < -1.50) * ( 6.50 <= pt * cosh(eta) && pt * cosh(eta) < 7.50) * (0.000086) + - ( -1.90 <= eta && eta < -1.50) * ( 7.50 <= pt * cosh(eta) && pt * cosh(eta) < 8.50) * (0.003942) + - ( -1.90 <= eta && eta < -1.50) * ( 8.50 <= pt * cosh(eta) && pt * cosh(eta) < 9.50) * (0.007979) + - ( -1.90 <= eta && eta < -1.50) * ( 9.50 <= pt * cosh(eta) && pt * cosh(eta) < 10.50) * (0.020159) + - ( -1.90 <= eta && eta < -1.50) * ( 10.50 <= pt * cosh(eta) && pt * cosh(eta) < 11.50) * (0.063498) + - ( -1.90 <= eta && eta < -1.50) * ( 11.50 <= pt * cosh(eta) && pt * cosh(eta) < 12.50) * (0.092283) + - ( -1.90 <= eta && eta < -1.50) * ( 12.50 <= pt * cosh(eta) && pt * cosh(eta) < 13.50) * (0.145602) + - ( -1.90 <= eta && eta < -1.50) * ( 13.50 <= pt * cosh(eta) && pt * cosh(eta) < 14.50) * (0.175805) + - ( -1.90 <= eta && eta < -1.50) * ( 14.50 <= pt * cosh(eta) && pt * cosh(eta) < 15.50) * (0.208822) - } - - add EfficiencyFormula {321} {321} { - (eta< -3.80 || eta>= -1.50 || pt * cosh(eta) < 0.90 || pt * cosh(eta) >= 15.50) * ( 0.00 ) + - ( -3.80 <= eta && eta < -2.80) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 2.90) * (0.500000) + - ( -3.80 <= eta && eta < -2.80) * ( 2.90 <= pt * cosh(eta) && pt * cosh(eta) < 3.10) * (1.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 3.10 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (1.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (1.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (1.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 5.50 <= pt * cosh(eta) && pt * cosh(eta) < 6.10) * (0.999934) + - ( -3.80 <= eta && eta < -2.80) * ( 6.10 <= pt * cosh(eta) && pt * cosh(eta) < 6.50) * (0.999479) + - ( -3.80 <= eta && eta < -2.80) * ( 6.50 <= pt * cosh(eta) && pt * cosh(eta) < 7.50) * (0.944324) + - ( -3.80 <= eta && eta < -2.80) * ( 7.50 <= pt * cosh(eta) && pt * cosh(eta) < 8.50) * (0.975555) + - ( -3.80 <= eta && eta < -2.80) * ( 8.50 <= pt * cosh(eta) && pt * cosh(eta) < 9.50) * (0.967251) + - ( -3.80 <= eta && eta < -2.80) * ( 9.50 <= pt * cosh(eta) && pt * cosh(eta) < 10.50) * (0.965411) + - ( -3.80 <= eta && eta < -2.80) * ( 10.50 <= pt * cosh(eta) && pt * cosh(eta) < 11.50) * (0.905604) + - ( -3.80 <= eta && eta < -2.80) * ( 11.50 <= pt * cosh(eta) && pt * cosh(eta) < 12.50) * (0.918842) + - ( -3.80 <= eta && eta < -2.80) * ( 12.50 <= pt * cosh(eta) && pt * cosh(eta) < 13.50) * (0.848052) + - ( -3.80 <= eta && eta < -2.80) * ( 13.50 <= pt * cosh(eta) && pt * cosh(eta) < 14.50) * (0.812466) + - ( -3.80 <= eta && eta < -2.80) * ( 14.50 <= pt * cosh(eta) && pt * cosh(eta) < 15.50) * (0.768801) + - ( -2.80 <= eta && eta < -1.90) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 2.90) * (0.500000) + - ( -2.80 <= eta && eta < -1.90) * ( 2.90 <= pt * cosh(eta) && pt * cosh(eta) < 3.10) * (1.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 3.10 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (1.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (1.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (1.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 5.50 <= pt * cosh(eta) && pt * cosh(eta) < 6.10) * (0.999903) + - ( -2.80 <= eta && eta < -1.90) * ( 6.10 <= pt * cosh(eta) && pt * cosh(eta) < 6.50) * (0.999948) + - ( -2.80 <= eta && eta < -1.90) * ( 6.50 <= pt * cosh(eta) && pt * cosh(eta) < 7.50) * (0.976324) + - ( -2.80 <= eta && eta < -1.90) * ( 7.50 <= pt * cosh(eta) && pt * cosh(eta) < 8.50) * (0.984454) + - ( -2.80 <= eta && eta < -1.90) * ( 8.50 <= pt * cosh(eta) && pt * cosh(eta) < 9.50) * (0.980779) + - ( -2.80 <= eta && eta < -1.90) * ( 9.50 <= pt * cosh(eta) && pt * cosh(eta) < 10.50) * (0.965511) + - ( -2.80 <= eta && eta < -1.90) * ( 10.50 <= pt * cosh(eta) && pt * cosh(eta) < 11.50) * (0.943060) + - ( -2.80 <= eta && eta < -1.90) * ( 11.50 <= pt * cosh(eta) && pt * cosh(eta) < 12.50) * (0.910624) + - ( -2.80 <= eta && eta < -1.90) * ( 12.50 <= pt * cosh(eta) && pt * cosh(eta) < 13.50) * (0.879356) + - ( -2.80 <= eta && eta < -1.90) * ( 13.50 <= pt * cosh(eta) && pt * cosh(eta) < 14.50) * (0.812961) + - ( -2.80 <= eta && eta < -1.90) * ( 14.50 <= pt * cosh(eta) && pt * cosh(eta) < 15.50) * (0.774542) + - ( -1.90 <= eta && eta < -1.50) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 2.90) * (0.500000) + - ( -1.90 <= eta && eta < -1.50) * ( 2.90 <= pt * cosh(eta) && pt * cosh(eta) < 3.10) * (1.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 3.10 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (1.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (1.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (1.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 5.50 <= pt * cosh(eta) && pt * cosh(eta) < 6.10) * (0.991148) + - ( -1.90 <= eta && eta < -1.50) * ( 6.10 <= pt * cosh(eta) && pt * cosh(eta) < 6.50) * (0.999948) + - ( -1.90 <= eta && eta < -1.50) * ( 6.50 <= pt * cosh(eta) && pt * cosh(eta) < 7.50) * (0.972872) + - ( -1.90 <= eta && eta < -1.50) * ( 7.50 <= pt * cosh(eta) && pt * cosh(eta) < 8.50) * (0.993617) + - ( -1.90 <= eta && eta < -1.50) * ( 8.50 <= pt * cosh(eta) && pt * cosh(eta) < 9.50) * (0.991955) + - ( -1.90 <= eta && eta < -1.50) * ( 9.50 <= pt * cosh(eta) && pt * cosh(eta) < 10.50) * (0.979841) + - ( -1.90 <= eta && eta < -1.50) * ( 10.50 <= pt * cosh(eta) && pt * cosh(eta) < 11.50) * (0.936424) + - ( -1.90 <= eta && eta < -1.50) * ( 11.50 <= pt * cosh(eta) && pt * cosh(eta) < 12.50) * (0.906731) + - ( -1.90 <= eta && eta < -1.50) * ( 12.50 <= pt * cosh(eta) && pt * cosh(eta) < 13.50) * (0.851930) + - ( -1.90 <= eta && eta < -1.50) * ( 13.50 <= pt * cosh(eta) && pt * cosh(eta) < 14.50) * (0.817517) + - ( -1.90 <= eta && eta < -1.50) * ( 14.50 <= pt * cosh(eta) && pt * cosh(eta) < 15.50) * (0.780553) - } - - add EfficiencyFormula {321} {2212} { - (eta< -3.80 || eta>= -1.50 || pt * cosh(eta) < 0.90 || pt * cosh(eta) >= 15.50) * ( 0.00 ) + - ( -3.80 <= eta && eta < -2.80) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 2.90) * (0.500000) + - ( -3.80 <= eta && eta < -2.80) * ( 2.90 <= pt * cosh(eta) && pt * cosh(eta) < 3.10) * (0.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 3.10 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 5.50 <= pt * cosh(eta) && pt * cosh(eta) < 6.10) * (0.000066) + - ( -3.80 <= eta && eta < -2.80) * ( 6.10 <= pt * cosh(eta) && pt * cosh(eta) < 6.50) * (0.000475) + - ( -3.80 <= eta && eta < -2.80) * ( 6.50 <= pt * cosh(eta) && pt * cosh(eta) < 7.50) * (0.055633) + - ( -3.80 <= eta && eta < -2.80) * ( 7.50 <= pt * cosh(eta) && pt * cosh(eta) < 8.50) * (0.016974) + - ( -3.80 <= eta && eta < -2.80) * ( 8.50 <= pt * cosh(eta) && pt * cosh(eta) < 9.50) * (0.008560) + - ( -3.80 <= eta && eta < -2.80) * ( 9.50 <= pt * cosh(eta) && pt * cosh(eta) < 10.50) * (0.000002) + - ( -3.80 <= eta && eta < -2.80) * ( 10.50 <= pt * cosh(eta) && pt * cosh(eta) < 11.50) * (0.000157) + - ( -3.80 <= eta && eta < -2.80) * ( 11.50 <= pt * cosh(eta) && pt * cosh(eta) < 12.50) * (0.000123) + - ( -3.80 <= eta && eta < -2.80) * ( 12.50 <= pt * cosh(eta) && pt * cosh(eta) < 13.50) * (0.002332) + - ( -3.80 <= eta && eta < -2.80) * ( 13.50 <= pt * cosh(eta) && pt * cosh(eta) < 14.50) * (0.013165) + - ( -3.80 <= eta && eta < -2.80) * ( 14.50 <= pt * cosh(eta) && pt * cosh(eta) < 15.50) * (0.019465) + - ( -2.80 <= eta && eta < -1.90) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 2.90) * (0.500000) + - ( -2.80 <= eta && eta < -1.90) * ( 2.90 <= pt * cosh(eta) && pt * cosh(eta) < 3.10) * (0.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 3.10 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 5.50 <= pt * cosh(eta) && pt * cosh(eta) < 6.10) * (0.000097) + - ( -2.80 <= eta && eta < -1.90) * ( 6.10 <= pt * cosh(eta) && pt * cosh(eta) < 6.50) * (0.000006) + - ( -2.80 <= eta && eta < -1.90) * ( 6.50 <= pt * cosh(eta) && pt * cosh(eta) < 7.50) * (0.023578) + - ( -2.80 <= eta && eta < -1.90) * ( 7.50 <= pt * cosh(eta) && pt * cosh(eta) < 8.50) * (0.010367) + - ( -2.80 <= eta && eta < -1.90) * ( 8.50 <= pt * cosh(eta) && pt * cosh(eta) < 9.50) * (0.000532) + - ( -2.80 <= eta && eta < -1.90) * ( 9.50 <= pt * cosh(eta) && pt * cosh(eta) < 10.50) * (0.000012) + - ( -2.80 <= eta && eta < -1.90) * ( 10.50 <= pt * cosh(eta) && pt * cosh(eta) < 11.50) * (0.000104) + - ( -2.80 <= eta && eta < -1.90) * ( 11.50 <= pt * cosh(eta) && pt * cosh(eta) < 12.50) * (0.000513) + - ( -2.80 <= eta && eta < -1.90) * ( 12.50 <= pt * cosh(eta) && pt * cosh(eta) < 13.50) * (0.002787) + - ( -2.80 <= eta && eta < -1.90) * ( 13.50 <= pt * cosh(eta) && pt * cosh(eta) < 14.50) * (0.006788) + - ( -2.80 <= eta && eta < -1.90) * ( 14.50 <= pt * cosh(eta) && pt * cosh(eta) < 15.50) * (0.010714) + - ( -1.90 <= eta && eta < -1.50) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 2.90) * (0.500000) + - ( -1.90 <= eta && eta < -1.50) * ( 2.90 <= pt * cosh(eta) && pt * cosh(eta) < 3.10) * (0.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 3.10 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 5.50 <= pt * cosh(eta) && pt * cosh(eta) < 6.10) * (0.008852) + - ( -1.90 <= eta && eta < -1.50) * ( 6.10 <= pt * cosh(eta) && pt * cosh(eta) < 6.50) * (0.000006) + - ( -1.90 <= eta && eta < -1.50) * ( 6.50 <= pt * cosh(eta) && pt * cosh(eta) < 7.50) * (0.027042) + - ( -1.90 <= eta && eta < -1.50) * ( 7.50 <= pt * cosh(eta) && pt * cosh(eta) < 8.50) * (0.002442) + - ( -1.90 <= eta && eta < -1.50) * ( 8.50 <= pt * cosh(eta) && pt * cosh(eta) < 9.50) * (0.000065) + - ( -1.90 <= eta && eta < -1.50) * ( 9.50 <= pt * cosh(eta) && pt * cosh(eta) < 10.50) * (0.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 10.50 <= pt * cosh(eta) && pt * cosh(eta) < 11.50) * (0.000079) + - ( -1.90 <= eta && eta < -1.50) * ( 11.50 <= pt * cosh(eta) && pt * cosh(eta) < 12.50) * (0.000985) + - ( -1.90 <= eta && eta < -1.50) * ( 12.50 <= pt * cosh(eta) && pt * cosh(eta) < 13.50) * (0.002468) + - ( -1.90 <= eta && eta < -1.50) * ( 13.50 <= pt * cosh(eta) && pt * cosh(eta) < 14.50) * (0.006679) + - ( -1.90 <= eta && eta < -1.50) * ( 14.50 <= pt * cosh(eta) && pt * cosh(eta) < 15.50) * (0.010625) - } - - add EfficiencyFormula {2212} {321} { - (eta< -3.80 || eta>= -1.50 || pt * cosh(eta) < 0.90 || pt * cosh(eta) >= 15.50) * ( 0.00 ) + - ( -3.80 <= eta && eta < -2.80) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 2.90) * (0.500000) + - ( -3.80 <= eta && eta < -2.80) * ( 2.90 <= pt * cosh(eta) && pt * cosh(eta) < 3.10) * (0.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 3.10 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 5.50 <= pt * cosh(eta) && pt * cosh(eta) < 6.10) * (0.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 6.10 <= pt * cosh(eta) && pt * cosh(eta) < 6.50) * (0.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 6.50 <= pt * cosh(eta) && pt * cosh(eta) < 7.50) * (0.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 7.50 <= pt * cosh(eta) && pt * cosh(eta) < 8.50) * (0.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 8.50 <= pt * cosh(eta) && pt * cosh(eta) < 9.50) * (0.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 9.50 <= pt * cosh(eta) && pt * cosh(eta) < 10.50) * (0.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 10.50 <= pt * cosh(eta) && pt * cosh(eta) < 11.50) * (0.000016) + - ( -3.80 <= eta && eta < -2.80) * ( 11.50 <= pt * cosh(eta) && pt * cosh(eta) < 12.50) * (0.000268) + - ( -3.80 <= eta && eta < -2.80) * ( 12.50 <= pt * cosh(eta) && pt * cosh(eta) < 13.50) * (0.001242) + - ( -3.80 <= eta && eta < -2.80) * ( 13.50 <= pt * cosh(eta) && pt * cosh(eta) < 14.50) * (0.003875) + - ( -3.80 <= eta && eta < -2.80) * ( 14.50 <= pt * cosh(eta) && pt * cosh(eta) < 15.50) * (0.012422) + - ( -2.80 <= eta && eta < -1.90) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 2.90) * (0.500000) + - ( -2.80 <= eta && eta < -1.90) * ( 2.90 <= pt * cosh(eta) && pt * cosh(eta) < 3.10) * (0.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 3.10 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 5.50 <= pt * cosh(eta) && pt * cosh(eta) < 6.10) * (0.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 6.10 <= pt * cosh(eta) && pt * cosh(eta) < 6.50) * (0.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 6.50 <= pt * cosh(eta) && pt * cosh(eta) < 7.50) * (0.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 7.50 <= pt * cosh(eta) && pt * cosh(eta) < 8.50) * (0.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 8.50 <= pt * cosh(eta) && pt * cosh(eta) < 9.50) * (0.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 9.50 <= pt * cosh(eta) && pt * cosh(eta) < 10.50) * (0.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 10.50 <= pt * cosh(eta) && pt * cosh(eta) < 11.50) * (0.000004) + - ( -2.80 <= eta && eta < -1.90) * ( 11.50 <= pt * cosh(eta) && pt * cosh(eta) < 12.50) * (0.000130) + - ( -2.80 <= eta && eta < -1.90) * ( 12.50 <= pt * cosh(eta) && pt * cosh(eta) < 13.50) * (0.000604) + - ( -2.80 <= eta && eta < -1.90) * ( 13.50 <= pt * cosh(eta) && pt * cosh(eta) < 14.50) * (0.002926) + - ( -2.80 <= eta && eta < -1.90) * ( 14.50 <= pt * cosh(eta) && pt * cosh(eta) < 15.50) * (0.007275) + - ( -1.90 <= eta && eta < -1.50) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 2.90) * (0.500000) + - ( -1.90 <= eta && eta < -1.50) * ( 2.90 <= pt * cosh(eta) && pt * cosh(eta) < 3.10) * (0.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 3.10 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (0.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (0.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (0.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 5.50 <= pt * cosh(eta) && pt * cosh(eta) < 6.10) * (0.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 6.10 <= pt * cosh(eta) && pt * cosh(eta) < 6.50) * (0.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 6.50 <= pt * cosh(eta) && pt * cosh(eta) < 7.50) * (0.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 7.50 <= pt * cosh(eta) && pt * cosh(eta) < 8.50) * (0.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 8.50 <= pt * cosh(eta) && pt * cosh(eta) < 9.50) * (0.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 9.50 <= pt * cosh(eta) && pt * cosh(eta) < 10.50) * (0.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 10.50 <= pt * cosh(eta) && pt * cosh(eta) < 11.50) * (0.000005) + - ( -1.90 <= eta && eta < -1.50) * ( 11.50 <= pt * cosh(eta) && pt * cosh(eta) < 12.50) * (0.000092) + - ( -1.90 <= eta && eta < -1.50) * ( 12.50 <= pt * cosh(eta) && pt * cosh(eta) < 13.50) * (0.000668) + - ( -1.90 <= eta && eta < -1.50) * ( 13.50 <= pt * cosh(eta) && pt * cosh(eta) < 14.50) * (0.003503) + - ( -1.90 <= eta && eta < -1.50) * ( 14.50 <= pt * cosh(eta) && pt * cosh(eta) < 15.50) * (0.008820) - } - - add EfficiencyFormula {2212} {2212} { - (eta< -3.80 || eta>= -1.50 || pt * cosh(eta) < 0.90 || pt * cosh(eta) >= 15.50) * ( 0.00 ) + - ( -3.80 <= eta && eta < -2.80) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 2.90) * (0.500000) + - ( -3.80 <= eta && eta < -2.80) * ( 2.90 <= pt * cosh(eta) && pt * cosh(eta) < 3.10) * (1.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 3.10 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (1.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (1.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (1.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 5.50 <= pt * cosh(eta) && pt * cosh(eta) < 6.10) * (1.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 6.10 <= pt * cosh(eta) && pt * cosh(eta) < 6.50) * (1.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 6.50 <= pt * cosh(eta) && pt * cosh(eta) < 7.50) * (1.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 7.50 <= pt * cosh(eta) && pt * cosh(eta) < 8.50) * (1.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 8.50 <= pt * cosh(eta) && pt * cosh(eta) < 9.50) * (1.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 9.50 <= pt * cosh(eta) && pt * cosh(eta) < 10.50) * (1.000000) + - ( -3.80 <= eta && eta < -2.80) * ( 10.50 <= pt * cosh(eta) && pt * cosh(eta) < 11.50) * (0.999984) + - ( -3.80 <= eta && eta < -2.80) * ( 11.50 <= pt * cosh(eta) && pt * cosh(eta) < 12.50) * (0.999732) + - ( -3.80 <= eta && eta < -2.80) * ( 12.50 <= pt * cosh(eta) && pt * cosh(eta) < 13.50) * (0.998758) + - ( -3.80 <= eta && eta < -2.80) * ( 13.50 <= pt * cosh(eta) && pt * cosh(eta) < 14.50) * (0.996125) + - ( -3.80 <= eta && eta < -2.80) * ( 14.50 <= pt * cosh(eta) && pt * cosh(eta) < 15.50) * (0.987578) + - ( -2.80 <= eta && eta < -1.90) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 2.90) * (0.500000) + - ( -2.80 <= eta && eta < -1.90) * ( 2.90 <= pt * cosh(eta) && pt * cosh(eta) < 3.10) * (1.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 3.10 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (1.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (1.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (1.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 5.50 <= pt * cosh(eta) && pt * cosh(eta) < 6.10) * (1.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 6.10 <= pt * cosh(eta) && pt * cosh(eta) < 6.50) * (1.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 6.50 <= pt * cosh(eta) && pt * cosh(eta) < 7.50) * (1.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 7.50 <= pt * cosh(eta) && pt * cosh(eta) < 8.50) * (1.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 8.50 <= pt * cosh(eta) && pt * cosh(eta) < 9.50) * (1.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 9.50 <= pt * cosh(eta) && pt * cosh(eta) < 10.50) * (1.000000) + - ( -2.80 <= eta && eta < -1.90) * ( 10.50 <= pt * cosh(eta) && pt * cosh(eta) < 11.50) * (0.999996) + - ( -2.80 <= eta && eta < -1.90) * ( 11.50 <= pt * cosh(eta) && pt * cosh(eta) < 12.50) * (0.999870) + - ( -2.80 <= eta && eta < -1.90) * ( 12.50 <= pt * cosh(eta) && pt * cosh(eta) < 13.50) * (0.999396) + - ( -2.80 <= eta && eta < -1.90) * ( 13.50 <= pt * cosh(eta) && pt * cosh(eta) < 14.50) * (0.997074) + - ( -2.80 <= eta && eta < -1.90) * ( 14.50 <= pt * cosh(eta) && pt * cosh(eta) < 15.50) * (0.992725) + - ( -1.90 <= eta && eta < -1.50) * ( 0.90 <= pt * cosh(eta) && pt * cosh(eta) < 2.90) * (0.500000) + - ( -1.90 <= eta && eta < -1.50) * ( 2.90 <= pt * cosh(eta) && pt * cosh(eta) < 3.10) * (1.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 3.10 <= pt * cosh(eta) && pt * cosh(eta) < 3.50) * (1.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 3.50 <= pt * cosh(eta) && pt * cosh(eta) < 4.50) * (1.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 4.50 <= pt * cosh(eta) && pt * cosh(eta) < 5.50) * (1.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 5.50 <= pt * cosh(eta) && pt * cosh(eta) < 6.10) * (1.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 6.10 <= pt * cosh(eta) && pt * cosh(eta) < 6.50) * (1.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 6.50 <= pt * cosh(eta) && pt * cosh(eta) < 7.50) * (1.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 7.50 <= pt * cosh(eta) && pt * cosh(eta) < 8.50) * (1.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 8.50 <= pt * cosh(eta) && pt * cosh(eta) < 9.50) * (1.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 9.50 <= pt * cosh(eta) && pt * cosh(eta) < 10.50) * (1.000000) + - ( -1.90 <= eta && eta < -1.50) * ( 10.50 <= pt * cosh(eta) && pt * cosh(eta) < 11.50) * (0.999995) + - ( -1.90 <= eta && eta < -1.50) * ( 11.50 <= pt * cosh(eta) && pt * cosh(eta) < 12.50) * (0.999908) + - ( -1.90 <= eta && eta < -1.50) * ( 12.50 <= pt * cosh(eta) && pt * cosh(eta) < 13.50) * (0.999332) + - ( -1.90 <= eta && eta < -1.50) * ( 13.50 <= pt * cosh(eta) && pt * cosh(eta) < 14.50) * (0.996497) + - ( -1.90 <= eta && eta < -1.50) * ( 14.50 <= pt * cosh(eta) && pt * cosh(eta) < 15.50) * (0.991180) - } - - add EfficiencyFormula {0} {0} { 0.00 } -} diff --git a/delphes/source/DelphesConfig.cc b/delphes/source/DelphesConfig.cc index a921a21..1fba304 100644 --- a/delphes/source/DelphesConfig.cc +++ b/delphes/source/DelphesConfig.cc @@ -154,7 +154,7 @@ void DelphesConfig::DetermineThresholds( void ) hypo->SetThreshold(min); } //for erange..mrange - printf("@T@ %d -> %7.2f\n", ih, hypo->GetThreshold()); + printf("@T@ %d -> estimated threshold %7.3f [MeV/c]\n", ih, hypo->GetThreshold()); } //for iq } // DelphesConfig::DetermineThresholds() diff --git a/delphes/source/DelphesConfigDIRC.cc b/delphes/source/DelphesConfigDIRC.cc index f8a53fd..876d13a 100644 --- a/delphes/source/DelphesConfigDIRC.cc +++ b/delphes/source/DelphesConfigDIRC.cc @@ -24,6 +24,11 @@ int DelphesConfigDIRC::DoSigmaCalculations( void ) double eta = m_EtaMin + etaStep*ie; double theta = 2*std::atan(exp(-eta)); + // See e-mail from Greg (Roman) on 11/11/2022; + double reference_theta = theta*180/M_PI; + if (reference_theta < 25.0 ) reference_theta = 25.0; + if (reference_theta > 153.0 ) reference_theta = 153.0; + // Assign eta range; avoid machine accuracy issues when checking continuity; auto erange = AddEtaRange(ie ? m_EtaRanges.back()->GetMax() : eta, eta + etaStep); @@ -48,7 +53,7 @@ int DelphesConfigDIRC::DoSigmaCalculations( void ) for(unsigned ih=0; ihGetInfo(abs(hypo->PdgCode()), p, theta*180/M_PI, str); + auto info = dpf->GetInfo(abs(hypo->PdgCode()), p, reference_theta, str); // Just use central values and overall sigma from DrcPidFast code; bool ret = StoreSigmaEntry(mrange, hypo->PdgCode(), info.true_cangle, info.cctr); diff --git a/delphes/source/DelphesConfigRICH.cc b/delphes/source/DelphesConfigRICH.cc index 910d8ad..ca38ab1 100644 --- a/delphes/source/DelphesConfigRICH.cc +++ b/delphes/source/DelphesConfigRICH.cc @@ -4,6 +4,66 @@ // ------------------------------------------------------------------------------------- +void DelphesConfigRICH::ImportTrackingSmearing(const char *ftheta, const char *fphi) +{ + std::map, std::pair> *sarr[2] = + {&m_ThetaSmearing, &m_PhiSmearing}; + const char *farr[2] = {ftheta, fphi}; + //std::map, std::pair> m_ThetaSmearing, m_PhiSmearing; + + for(unsigned iq=0; iq<2; iq++) { + auto fin = fopen(farr[iq], "r"); + + float emin, emax, a, ea, b, eb; + unsigned lcounter = 0; + char buffer[1024]; + while (fgets(buffer, 1024-1, fin)) { + if (lcounter++ <= 1) continue; + //printf("%s", buffer); + + sscanf(buffer, "%f %f %f %f %f %f", &emin, &emax, &a, &ea, &b, &eb); + //printf("%f %f %f %f %f %f\n", emin, emax, a, ea, b, eb); + + (*sarr[iq])[std::make_pair(emin, emax)] = std::make_pair(a, b); + } //while + } //fr iq + + TVector3 p(0.0, 0.5, -5.0); + GetTrackingSmearing(p); +} // DelphesConfigRICH::ImportTrackingSmearing() + +// ------------------------------------------------------------------------------------- + +double DelphesConfigRICH::GetTrackingSmearing(double momentum, double eta) +{ + double dtheta = 0.0, dphi = 0.0, theta = 2*atan(exp(-eta)); + + // FIXME: very inefficient; + for(auto &entry: m_ThetaSmearing) + if (entry.first.first <= eta && eta <= entry.first.second) { + double A = entry.second.first, B = entry.second.second; + dtheta = sqrt(pow(A/momentum, 2) + B*B); + //printf("%f\n", dtheta); + + break; + } //for entry .. if + for(auto &entry: m_PhiSmearing) + if (entry.first.first <= eta && eta <= entry.first.second) { + double A = entry.second.first, B = entry.second.second; + dphi = sqrt(pow(A/momentum, 2) + B*B) * fabs(tan(theta));//momentum.Theta())); + //printf("%f\n", fabs(dphi * tan(momentum.Theta()))); + + break; + } //for entry .. if + + printf("

= %8.3f [GeV/c], = %6.2f -> dtheta: %7.4f, dphi: %7.4f\n", + momentum, eta, dtheta, dphi); + // Yes, make it simple for now; + return sqrt(dtheta*dtheta + dphi*dphi); +} // DelphesConfigRICH::GetTrackingSmearing() + +// ------------------------------------------------------------------------------------- + static double below_kaon_threshold[3][3] = { {1.0, 0.0, 0.0}, {0.0, 0.5, 0.5}, @@ -18,6 +78,8 @@ int DelphesConfigRICH::Calculate( void ) mass[ih] = m_MassHypotheses[ih]->Mass(); for(auto erange: m_EtaRanges) { + double eta = (erange->GetMin() + erange->GetMax())/2; + for(auto mrange: erange->m_MomentumRanges) { mrange->m_MatrixDim = dim*dim; // Matrix will be band-diagonal of course; @@ -39,7 +101,8 @@ int DelphesConfigRICH::Calculate( void ) // Assign sigma values; for(unsigned ih=0; ihGetSigma(ih), 2) + pow(m_AdditionalSmearing, 2)); + //sigma[ih] = sqrt(pow(mrange->GetSigma(ih), 2) + pow(m_AdditionalSmearing, 2)); + sigma[ih] = sqrt(pow(mrange->GetSigma(ih), 2) + pow(GetTrackingSmearing(pp, eta), 2)); double argument = sqrt(pp*pp + m*m)/(m_Rindex*pp); // Convert to [mrad]; @@ -98,3 +161,59 @@ int DelphesConfigRICH::Calculate( void ) } // DelphesConfigRICH::Calculate() // ------------------------------------------------------------------------------------- + +double DelphesConfigRICH::GenerateMeasurement(int pdg, const TVector3 &momentum) +{ + auto hypo = GetMassHypothesis(pdg); + if (!hypo) return 0.0; + unsigned ih = GetHypoIndex(hypo); + + double m = hypo->Mass(), pp = momentum.Mag(), eta = momentum.Eta(); + + auto mrange = GetEtaMomentumRange(eta, pp); + if (!mrange) return 0; + + double argument = sqrt(pp*pp + m*m)/(m_Rindex*pp); + // Convert to [mrad]; + double thnom = 1000*(fabs(argument) <= 1.0 ? acos(argument) : 0.0); + //double sigma = sqrt(pow(mrange->GetSigma(ih), 2) + pow(m_AdditionalSmearing, 2)); + double sigma = sqrt(pow(mrange->GetSigma(ih), 2) + pow(GetTrackingSmearing(pp, eta), 2)); + + return m_rndm.Gaus(thnom, sigma); +} // DelphesConfigRICH::GenerateMeasurement() + +// ------------------------------------------------------------------------------------- + +// +// FIXME: duplicate code; +// + +MassHypothesis *DelphesConfigRICH::FindBestHypothesis(const TVector3 &momentum, double theta) +{ + MassHypothesis *ret = 0; + + for(unsigned ih=0; ihMass(), pp = momentum.Mag(), eta = momentum.Eta(); + + auto mrange = GetEtaMomentumRange(eta, pp); + if (!mrange) continue; + + double argument = sqrt(pp*pp + m*m)/(m_Rindex*pp); + // Convert to [mrad]; + double thnom = 1000*(fabs(argument) <= 1.0 ? acos(argument) : 0.0); + if (!thnom) continue; + //double sigma = sqrt(pow(mrange->GetSigma(ih), 2) + pow(m_AdditionalSmearing, 2)); + double sigma = sqrt(pow(mrange->GetSigma(ih), 2) + pow(GetTrackingSmearing(pp, eta), 2)); + + hypo->m_Diff = (theta - thnom)/sigma; + hypo->m_ChiSquare = pow(hypo->m_Diff, 2); + + if (!ret || hypo->m_ChiSquare < ret->m_ChiSquare) ret = hypo; + } //for ih + + return ret; +} // DelphesConfigRICH::FindBestHypothesis() + +// ------------------------------------------------------------------------------------- diff --git a/delphes/source/DelphesConfigTOF.cc b/delphes/source/DelphesConfigTOF.cc index 5577241..6439753 100644 --- a/delphes/source/DelphesConfigTOF.cc +++ b/delphes/source/DelphesConfigTOF.cc @@ -20,7 +20,8 @@ int DelphesConfigTOF::DoSigmaCalculations( void ) // // FIXME: sanity check on the input parameters is needed; // - assert(m_PtMode); + //+assert(m_PtMode); + assert(!m_PtMode); double etaStep = (m_EtaMax - m_EtaMin ) / m_EtaBinCount; double pStep = (m_MomentumMax - m_MomentumMin) / m_MomentumBinCount; @@ -36,16 +37,21 @@ int DelphesConfigTOF::DoSigmaCalculations( void ) // Loop though all of the requested momentum bins; for(unsigned ip=0; ipGetMomentumRange(ip ? erange->LastMomentumRange()->GetMax() : - pt - pStep/2, pt + pStep/2); + //+pt - pStep/2, pt + pStep/2); + p - pStep/2, p + pStep/2); + // mnemonic rule: 30 MeV/c in 1kGs field -> curvature radius of 1m; convert to [mm]; - double r = 1000*(0.1/m_MagneticField)*(pt/0.03); + if (m_InstallationRadius) { + double r = 1000*(0.1/m_MagneticField)*(pt/0.03); - // Particle will not reach the barrel layer; FIXME: may want to give few cm up?; - if (2*r < m_InstallationRadius) continue; + // Particle will not reach the barrel layer; FIXME: may want to give few cm up?; + if (2*r < m_InstallationRadius) continue; + } //if // Loop through all of the mass hypotheses and populate entries one by one; for(unsigned ih=0; ihMass(); { - double alfa = 2*asin(m_InstallationRadius/(2.0*r)); - double lxy = r*alfa, l = lxy/sin(theta); - double e = sqrt(p*p + m*m), beta = p/e; + double e = sqrt(p*p + m*m), beta = p/e, l = 0.0; + if (m_InstallationRadius) { + // FIXME: duplicate line; + double r = 1000*(0.1/m_MagneticField)*(pt/0.03); + double alfa = 2*asin(m_InstallationRadius/(2.0*r)); + double lxy = r*alfa; + + l = lxy/sin(theta); + } else { + // FIXME: calculate helix length correctly; suffices for now; + l = m_InstallationDistance / cos(theta); + } //if double sp = ((0.01*m_MomentumResolutionA)*p + (0.01*m_MomentumResolutionB))*p, t = tof(m, p, l); // A lousy way to calculate dt/dp differential; @@ -64,7 +79,7 @@ int DelphesConfigTOF::DoSigmaCalculations( void ) // Now calculate the uncertainties; (0.2*sp) comes from the differential calculation; double s1 = m_T0Resolution, s2 = m_DetectorResolution, s3 = m_PathLengthResolution / _SoL_; - double s4 = sp*fabs(dt)/(0.2*sp), s = sqrt(s1*s1+s2*s2+s3*s3+s4*s4); + double s4 = sp ? sp*fabs(dt)/(0.2*sp) : 0.0, s = sqrt(s1*s1+s2*s2+s3*s3+s4*s4); //printf("%3d %3d: eta= %5.2f th=%5.1f pt= %5.2f p= %5.2f, r= %7.2f, m= %6.4f alfa=%5.1f, " // "beta= %5.3f, l = %5.1f t = %7.4f s=%7.4f\n", diff --git a/include/Calibration.h b/include/Calibration.h new file mode 100644 index 0000000..89b3b13 --- /dev/null +++ b/include/Calibration.h @@ -0,0 +1,73 @@ + +#include + +class TDatabasePDG; +#include + +#ifndef _CALIBRATION_ +#define _CALIBRATION_ + +#include "GeantImport.h" + +// 5 degree binning for calibration purposes suffices?; +#define _THETA_BIN_COUNT_ (180/5) +#define _THETA_BIN_WIDTH_ (M_PI / _THETA_BIN_COUNT_) + +class Calibration : public virtual GeantImport { + public: + Calibration (); + ~Calibration() {}; + + TDatabasePDG *m_DatabasePDG; + + void PerformCalibration(unsigned stat = 0); + //?void UseAutomaticCalibration( void ) { m_AutomaticCalibrationRequired = true; }; + CherenkovEvent *GetNextEvent(bool calibration = false); + + void ImportTrackingSmearing(const char *ftheta, const char *fphi); + + //?void UseActsTracking( void ) { m_UseActsTracking = true; }; + + void SetDefaultSinglePhotonThetaResolution(double value) { + m_DefaultSinglePhotonThetaResolution = value; + }; + + void ExportModifiedOpticsFile(const char *fname); + + protected: + void CalibratePhotonEmissionPoints( void ); + virtual CherenkovEvent *GetEvent(unsigned ev, bool calibration = false) = 0; + void UpdateYields( void ); + + bool AutomaticCalibrationRequired( void ) const { return m_AutomaticCalibrationRequired; }; + + double GetDefaultSinglePhotonThetaResolution( void ) const { + return m_DefaultSinglePhotonThetaResolution; + }; + + private: + bool m_AutomaticCalibrationRequired; + + unsigned m_CurrentEvent; + + // FIXME: remove; + unsigned m_CalibrationBinStat[_THETA_BIN_COUNT_]; + + TRandom m_rndm; + + bool m_UseActsTracking; + +#if _OBSOLETE_ + std::map, std::pair> m_ThetaSmearing, m_PhiSmearing; + + std::pair GetTrackingSmearing(double momentum, double eta); + std::pair GetTrackingSmearing(const TVector3 &momentum) { + return GetTrackingSmearing(momentum.Mag(), momentum.Eta()); + }; +#endif + + double m_DefaultSinglePhotonThetaResolution; +}; + + +#endif diff --git a/include/ChargedParticle.h b/include/ChargedParticle.h index e34ea1c..6731564 100644 --- a/include/ChargedParticle.h +++ b/include/ChargedParticle.h @@ -10,10 +10,13 @@ #include "RadiatorHistory.h" #include "TransientParticle.h" #include "CherenkovPID.h" +#include "DigitizedHit.h" class ChargedParticle: public TransientParticle { public: - ChargedParticle(int pdg = 0): TransientParticle(pdg), m_StopTracing(false) {}; + ChargedParticle(int pdg = 0, bool primary = true): + TransientParticle(pdg, primary), m_StopTracing(false), + m_HadronicInteractionOccured(false), m_GoodForReconstruction(true), m_EICreconParticleID(0) {}; ~ChargedParticle() { for(auto radiator: m_RadiatorHistory) delete radiator.second; @@ -63,9 +66,20 @@ class ChargedParticle: public TransientParticle { return entry.second; }; - // Single particle case for now; - void PIDReconstruction(CherenkovPID &pid); - + void SetRecoPdgCode(int pdg) { m_RecoPdgCode = pdg; }; + int GetRecoPdgCode( void ) const { return m_RecoPdgCode; }; + unsigned GetRecoCherenkovHitCount( void ) const { return m_Hits.size(); }; + DigitizedHit *GetRecoCherenkovHit(unsigned id) const { + return (id < m_Hits.size() ? m_Hits[id] : 0); + }; + double GetRecoCherenkovPhotonTheta(unsigned id); + double GetRecoCherenkovPhotonPhi(unsigned id); + double GetRecoCherenkovAverageTheta(CherenkovRadiator *radiator = 0); + double GetMocaCherenkovAverageTheta(CherenkovRadiator *radiator = 0); + unsigned GetRecoCherenkovPhotonCount(CherenkovRadiator *radiator = 0); + + void AddHit(DigitizedHit *hit) { m_Hits.push_back(hit); }; + private: // Optical photons produced elsewhere; std::vector m_OrphanPhotons; @@ -73,10 +87,23 @@ class ChargedParticle: public TransientParticle { // Group steps by radiator of course; in the easiest case an entry and exit points; std::vector > m_RadiatorHistory; - bool m_StopTracing; //! + bool m_StopTracing; //! + + int m_RecoPdgCode; //! + std::vector m_Hits; //! + + public: + bool m_HadronicInteractionOccured; + + bool IsGoodForReconstruction( void ) { return m_GoodForReconstruction; }; + bool m_GoodForReconstruction; //! + + // Interface to ePIC tracking; + void SetEICreconParticleID(unsigned id) { m_EICreconParticleID = id;}; + unsigned m_EICreconParticleID; //! #ifndef DISABLE_ROOT_IO - ClassDef(ChargedParticle, 1); + ClassDef(ChargedParticle, 6); #endif }; diff --git a/include/ChargedParticleStep.h b/include/ChargedParticleStep.h index c3b8d66..8fc8666 100644 --- a/include/ChargedParticleStep.h +++ b/include/ChargedParticleStep.h @@ -8,21 +8,23 @@ class ChargedParticleStep: public TObject { public: ChargedParticleStep()/*: m_Length(0.0)*/ {}; - ChargedParticleStep(const TVector3 &position, const TVector3 &momentum/*, double length*/): - m_Position(position), m_Momentum(momentum)/*, m_Length(length)*/ {}; + ChargedParticleStep(const TVector3 &position, const TVector3 &momentum, double qtime = 0.0/*, double length*/): + m_Position(position), m_Momentum(momentum), m_Time(qtime)/*, m_Length(length)*/ {}; ~ChargedParticleStep() {}; inline const TVector3 &GetPosition ( void ) const { return m_Position; }; inline const TVector3 &GetMomentum ( void ) const { return m_Momentum; }; + inline double GetTime ( void ) const { return m_Time; }; inline TVector3 GetDirection( void ) const { return m_Momentum.Unit(); }; // Nodes along the particle trajectory; private: TVector3 m_Position, m_Momentum; //double m_Length; + double m_Time; #ifndef DISABLE_ROOT_IO - ClassDef(ChargedParticleStep, 1); + ClassDef(ChargedParticleStep, 2); #endif }; diff --git a/include/CherenkovDetector.h b/include/CherenkovDetector.h index 964124f..b14f03d 100644 --- a/include/CherenkovDetector.h +++ b/include/CherenkovDetector.h @@ -1,4 +1,6 @@ +#pragma once + #include #include @@ -16,18 +18,23 @@ class G4LogicalVolume; class CherenkovDetector: public TObject { public: CherenkovDetector(const char *name = 0): /*m_ContainerVolume(0),*/ m_Name(name ? name : ""), - m_ReadoutCellMask(0x0)/*, m_SectorBoundaryOffset(0.0)*/ {}; + m_ReadoutCellMask(0x0), m_SectorCount(0), m_SectorPhase(0.0) + /*, m_SectorBoundaryOffset(0.0)*/ {}; ~CherenkovDetector() {}; - void AddOpticalBoundary(unsigned sector, OpticalBoundary *boundary) { - _m_OpticalBoundaries[sector].push_back(boundary); + enum ud {Upstream, Downstream}; + + void AddOpticalBoundary(CherenkovDetector::ud where, unsigned sector, OpticalBoundary *boundary) { + m_OpticalBoundaries[where][sector].push_back(boundary); }; void AddRadiator(const char *name, CherenkovRadiator *radiator) { _m_Radiators[name] = radiator; }; - //+void AddMirrorGroup(CherenkovMirrorGroup *mgroup) { m_MirrorGroups.push_back(mgroup); }; + void SetSectorCount(unsigned count) { m_SectorCount = count; }; + void SetSectorPhase(double phase) {m_SectorPhase = phase; }; + // FIXME: "sector" is in fact *some* index rather than an azimuthal segmentation index; void AddPhotonDetector(CherenkovPhotonDetector *pd) { m_PhotonDetectors.push_back(pd); @@ -36,9 +43,10 @@ class CherenkovDetector: public TObject { uint64_t icopy, ParametricSurface *surface) { auto irt = pd->AllocateIRT(sector, icopy); - if (_m_OpticalBoundaries.find(sector) != _m_OpticalBoundaries.end()) - for(auto boundary: _m_OpticalBoundaries[sector]) - irt->AddOpticalBoundary(boundary); + for(unsigned ud=0; ud<2; ud++) + if (m_OpticalBoundaries[ud].find(sector) != m_OpticalBoundaries[ud].end()) + for(auto boundary: m_OpticalBoundaries[ud][sector]) + irt->AddOpticalBoundary(boundary); pd->AddItselfToOpticalBoundaries(irt, surface); }; @@ -47,8 +55,7 @@ class CherenkovDetector: public TObject { // FIXME: this kind of denies 'private' access; std::map &Radiators( void ) { return _m_Radiators; }; - //std::vector> _m_OpticalBoundaries; - std::map> _m_OpticalBoundaries; + std::map> m_OpticalBoundaries[2]; std::vector m_PhotonDetectors; //void SetContainerVolume(const G4LogicalVolume *lv) { m_ContainerVolume = lv; }; @@ -65,56 +72,67 @@ class CherenkovDetector: public TObject { return _m_Radiators[name]; }; + bool RadiatorRegistered(const CherenkovRadiator *radiator) { + for(auto &ptr: _m_Radiators) + if (ptr.second == radiator) + return true; + + return false; + }; + // FIXME: create a lookup table; + const char *GetRadiatorName(const CherenkovRadiator *radiator) { + for(auto &ptr: _m_Radiators) + if (ptr.second == radiator) + return ptr.first.Data(); + + return 0; + }; void SetReadoutCellMask(uint64_t mask) { m_ReadoutCellMask = mask; }; inline uint64_t GetReadoutCellMask( void ) const { return m_ReadoutCellMask; }; - // FIXME: not at all clean (uses implicit phase assumptions); unsigned GetSector(const TVector3 &pt) { - // FIXME: may require tuning for a dual-mirror setup; - unsigned nSectors = _m_OpticalBoundaries.size(); - - // Either a single "sector" or sector structure not define yet -> return 0; - if (nSectors <= 1) return 0; + // Either a single "sector" or sector structure not defined yet -> return 0; + if (m_SectorCount <= 1) return 0; - // FIXME: this offset is only defined by the way Chris positions sector #0; - double bin = 2*M_PI/nSectors, offset = -bin/2; + double bin = 2*M_PI/m_SectorCount; - return (unsigned)floor((pt.Phi() + 4*M_PI - offset)/bin) % nSectors; - //return 0; + return (unsigned)floor((pt.Phi() + 4*M_PI - m_SectorPhase)/bin) % m_SectorCount; }; // FIXME: get rid of the second argument here; CherenkovRadiator *GuessRadiator(const TVector3 &x0, const TVector3 &n0) { - // FIXME: may want to do a better check; - if (_m_OpticalBoundaries.empty()) return 0; - // Determine sector (in EIC DRICH terminology); unsigned isec = GetSector(x0); + + // FIXME: may want to do a better check; + if (m_OpticalBoundaries[CherenkovDetector::Upstream][isec].empty()) return 0; // Now loop through all radiators, and check boundaries in this sector; for(auto rptr: _m_Radiators) { const auto radiator = rptr.second; - + // Front and rear surfaces for this particular sector; auto s1 = radiator->GetFrontSide(isec); auto s2 = radiator->GetRearSide (isec); - //printf("Here-A! %f %f %f\n", x0[0], x0[1], x0[2]); TVector3 from, to; // Go backwards and ignore surface orientation mismatch; bool b1 = s1->GetCrossing(x0, -1*n0, &from, false); bool b2 = s2->GetCrossing(x0, n0, &to); - //printf("Here-B %d %d\n", b1, b2); if (!b1 || !b2) continue; if ((x0 - from).Dot(to - x0) > 0.0) return radiator; } //for radiator - + // Seemingly this 3D point does not belong to any radiator; return 0; }; + void StoreOpticalBoundary(OpticalBoundary *boundary) { + m_OpticalBoundaryStorage.push_back(boundary); + }; + // readout ID -> pixel position converter (for external usage) std::function m_ReadoutIDToPosition; //! @@ -123,13 +141,26 @@ class CherenkovDetector: public TObject { // This is needed for dd4hep cell index decoding; uint64_t m_ReadoutCellMask; - //+double m_SectorBoundaryOffset; - + // IRT has a TRef by (unfortunate) design -> need a serialized storage buffer to refer to; + std::vector m_OpticalBoundaryStorage; + + // These are needed to calculate to which detector sector (think of a dRICH) a + // particular 3D point belongs; a respective call is used in two different cases: + // (1) to define to which radiator a photon production vertex belongs + // (2) to define to which sector a particular sensor hit belongs + // + // In principle a photon can be produced in one sector, but be detected in a different + // one, but this seemingly does not cause any confusion since each radiator is treated + // "globally", so effectively case #1 is only about using a proper section of a spherical + // mirror in case of dRICH to define whether a photon vertex was inside or outside of + // the gas volume; + unsigned m_SectorCount; + double m_SectorPhase; + std::map _m_Radiators; - //+std::vector m_MirrorGroups; #ifndef DISABLE_ROOT_IO - ClassDef(CherenkovDetector, 5); + ClassDef(CherenkovDetector, 7); #endif }; diff --git a/include/CherenkovDetectorCollection.h b/include/CherenkovDetectorCollection.h index 797107f..97fc8e2 100644 --- a/include/CherenkovDetectorCollection.h +++ b/include/CherenkovDetectorCollection.h @@ -26,10 +26,13 @@ class CherenkovDetectorCollection: public BitMask { CherenkovDetector *AddNewDetector(const char *name) { auto det = new CherenkovDetector(name); - _m_Detectors[det->GetName()] = det; + m_Detectors[det->GetName()] = det; return det; }; + //void AddNewDetector(CherenkovDetector *det) { + //m_Detectors[det->GetName()] = det; + //}; CherenkovRadiator *FindOrAddRadiator(CherenkovDetector *det, const char *name, const G4LogicalVolume *volume, const G4RadiatorMaterial *material) { @@ -44,7 +47,7 @@ class CherenkovDetectorCollection: public BitMask { return radiator; }; - CherenkovRadiator *AddFlatRadiator(CherenkovDetector *det, const char *name, unsigned path, + CherenkovRadiator *AddFlatRadiator(CherenkovDetector *det, const char *name, CherenkovDetector::ud where, unsigned path, const G4LogicalVolume *volume, const G4RadiatorMaterial *material, const FlatSurface *surface, double thickness) { @@ -55,21 +58,34 @@ class CherenkovDetectorCollection: public BitMask { { auto boundary = surface->_Clone(0.0, TVector3(0,0,1)); boundary->Shift(( thickness/2)*surface->GetNormal()); - det->AddOpticalBoundary(path, new OpticalBoundary(radiator, boundary, true)); + det->AddOpticalBoundary(where, path, new OpticalBoundary(radiator, boundary, true)); radiator->m_Borders[path].first = boundary; + + // FIXME (?): in case of dRICH (and FRICH) this boundary is assigned by hand (a spherical + // mirror surface), so it should kind of work; + if (where == CherenkovDetector::Downstream && !det->GetContainerVolume()->GetRearSide(path)) + det->GetContainerVolume()->m_Borders[path].second = boundary; } { auto boundary = surface->_Clone(0.0, TVector3(0,0,1)); boundary->Shift((-thickness/2)*surface->GetNormal()); - det->AddOpticalBoundary(path, new OpticalBoundary(det->GetContainerVolume(), boundary, true)); - + det->AddOpticalBoundary(where, path, new OpticalBoundary(det->GetContainerVolume(), boundary, true)); radiator->m_Borders[path].second = boundary; - // This will most likely be a temporary assignment; - det->GetContainerVolume()->m_Borders[path].first = boundary; + + // This will most likely be a temporary assignment; only "upstream" boundaries are of interest + // here since the "downstream" ones are essentially a sensor-side description; + if (where == CherenkovDetector::Upstream) det->GetContainerVolume()->m_Borders[path].first = boundary; } return radiator; }; + void AddRadiatorLogicalVolume(CherenkovRadiator *radiator, const G4LogicalVolume *lv) { + radiator->AddLogicalVolume(lv); + m_RadiatorLookup[lv] = radiator; + }; + + //inline void AddOrphanPhoton(OpticalPhoton *photon) { m_OrphanPhotons.push_back(photon); }; + void AddPhotonDetector(CherenkovDetector *det, const G4LogicalVolume *lv, CherenkovPhotonDetector *pd) { // FIXME: a consistency check!; @@ -106,7 +122,7 @@ class CherenkovDetectorCollection: public BitMask { // This is most likely a temporary assignment; radiator->m_Borders[path].first = surface; - det->AddOpticalBoundary(path, new OpticalBoundary(FindRadiator(lv), surface, true)); + det->AddOpticalBoundary(CherenkovDetector::Upstream, path, new OpticalBoundary(FindRadiator(lv), surface, true)); //det->SetContainerVolume(lv); det->SetContainerVolume(radiator); @@ -115,7 +131,7 @@ class CherenkovDetectorCollection: public BitMask { // FIXME: do it more efficient later; CherenkovDetector *GetDetectorByRadiator(const CherenkovRadiator *radiator) { - for(auto detector: _m_Detectors) + for(auto detector: m_Detectors) for(auto ptr: detector.second->Radiators()) if (ptr.second == radiator) return detector.second; @@ -123,12 +139,12 @@ class CherenkovDetectorCollection: public BitMask { return 0; }; CherenkovDetector *GetDetector(const char *name) { - if (_m_Detectors.find(name) == _m_Detectors.end()) return 0; + if (m_Detectors.find(name) == m_Detectors.end()) return 0; - return _m_Detectors[name]; + return m_Detectors[name]; }; const std::map &GetDetectors( void ) const { - return _m_Detectors; + return m_Detectors; }; // The lookup tables are global of course since the same particle can hit radiators @@ -138,10 +154,12 @@ class CherenkovDetectorCollection: public BitMask { std::map m_MirrorLookup; //! std::map m_PhotonDetectorLookup; //! - std::map _m_Detectors; + std::map m_Detectors; + //std::vector m_OrphanPhotons; + #ifndef DISABLE_ROOT_IO - ClassDef(CherenkovDetectorCollection, 2); + ClassDef(CherenkovDetectorCollection, 3); #endif }; diff --git a/include/CherenkovEvent.h b/include/CherenkovEvent.h index b8b6b12..92b4107 100644 --- a/include/CherenkovEvent.h +++ b/include/CherenkovEvent.h @@ -6,6 +6,8 @@ #include "ChargedParticle.h" +class OpticalPhoton; + class CherenkovEvent: public TObject { public: CherenkovEvent() {}; @@ -14,18 +16,26 @@ class CherenkovEvent: public TObject { void Reset( void ) { for(auto particle: m_ChargedParticles) delete particle; - m_ChargedParticles.clear(); + + for(auto photon: m_OrphanPhotons) + delete photon; + m_OrphanPhotons.clear(); }; inline void AddChargedParticle(ChargedParticle *particle) { m_ChargedParticles.insert(particle); }; std::set &ChargedParticles( void ) { return m_ChargedParticles; }; + inline void AddOrphanPhoton(OpticalPhoton *photon) { m_OrphanPhotons.push_back(photon); }; + std::vector &OrphanPhotons( void ) { return m_OrphanPhotons; }; + private: std::set m_ChargedParticles; + std::vector m_OrphanPhotons; + #ifndef DISABLE_ROOT_IO - ClassDef(CherenkovEvent, 1); + ClassDef(CherenkovEvent, 2); #endif }; diff --git a/include/CherenkovMirror.h b/include/CherenkovMirror.h index b585626..84f5be6 100644 --- a/include/CherenkovMirror.h +++ b/include/CherenkovMirror.h @@ -3,8 +3,14 @@ #define _CHERENKOV_MIRROR_ #include "G4Object.h" +#include "FlatSurface.h" +#include "SphericalSurface.h" +#include "CylindricalSurface.h" +#include "ConicalSurface.h" #include "ParametricSurface.h" +class CherenkovWaveLengthRange; + class SurfaceCopy: public G4ObjectCopy { public: SurfaceCopy(G4VPhysicalVolume *phys = 0): G4ObjectCopy(phys), m_Surface(0) {}; @@ -22,7 +28,7 @@ class CherenkovMirror: public G4Object { CherenkovMirror(G4VSolid *solid = 0, G4Material *material = 0): G4Object(solid, material), m_MirrorSurface(0) {}; ~CherenkovMirror() {}; - void SetReflectivity( void ); + void SetReflectivity(double reflectivity, CherenkovWaveLengthRange *wlrange);// void ); G4ObjectCopy *CreateCopy(G4VPhysicalVolume *phys) { return new SurfaceCopy(phys); }; @@ -71,18 +77,27 @@ class SphericalMirror: public CherenkovMirror, public SphericalSurface { #endif }; -class CherenkovMirrorGroup: public TObject { +class CylindricalMirror: public CherenkovMirror, public CylindricalSurface { public: - CherenkovMirrorGroup() {}; - ~CherenkovMirrorGroup() {}; - - void AddMirror(CherenkovMirror *mirror) { m_Mirrors.push_back(mirror); }; - - private: - std::vector m_Mirrors; + CylindricalMirror() {}; + CylindricalMirror(G4VSolid *solid, G4Material *material, const TVector3 &x0, const TVector3 &nz, double r0, double dz): + CherenkovMirror(solid, material), CylindricalSurface(x0, nz, r0, dz) {}; + ~CylindricalMirror() {}; + +#ifndef DISABLE_ROOT_IO + ClassDef(CylindricalMirror, 1); +#endif +}; +class ConicalMirror: public CherenkovMirror, public ConicalSurface { + public: + ConicalMirror() {}; + ConicalMirror(G4VSolid *solid, G4Material *material, const TVector3 &x0, const TVector3 &nz, double r0, double r1, double dz): + CherenkovMirror(solid, material), ConicalSurface(x0, nz, r0, r1, dz) {}; + ~ConicalMirror() {}; + #ifndef DISABLE_ROOT_IO - ClassDef(CherenkovMirrorGroup, 1); + ClassDef(ConicalMirror, 1); #endif }; diff --git a/include/CherenkovPhotonDetector.h b/include/CherenkovPhotonDetector.h index 9394078..99ca78e 100644 --- a/include/CherenkovPhotonDetector.h +++ b/include/CherenkovPhotonDetector.h @@ -5,7 +5,7 @@ #define _CHERENKOV_PHOTON_DETECTOR_ #include "G4Object.h" -#include "ParametricSurface.h" +#include "FlatSurface.h" class G4DataInterpolation; @@ -14,22 +14,30 @@ class G4DataInterpolation; class CherenkovPhotonDetector: public G4Object { public: CherenkovPhotonDetector(G4VSolid *solid = 0, G4Material *material = 0): - G4Object(solid, material), m_QERangeMin(0.0), m_QERangeMax(0.0), m_QE(0), - m_GeometricEfficiency(0.0) {}; + G4Object(solid, material), m_QERangeMin(0.0), m_QERangeMax(0.0), m_QE(0), m_ScaleFactor(1.0), + m_GeometricEfficiency(0.0), m_CopyIdentifierLevel(0) {}; ~CherenkovPhotonDetector() {}; - void SetQE(double min, double max, const G4DataInterpolation *qe) { + void SetQE(double min, double max, /*const*/ G4DataInterpolation *qe, double scale = 1.0) { m_QERangeMin = min; m_QERangeMax = max; m_QE = qe; + m_ScaleFactor = scale; }; inline bool CheckQERange(double e) const { return m_QE && e >= m_QERangeMin && e <= m_QERangeMax; }; - const G4DataInterpolation *GetQE( void ) const { return m_QE; }; + /*const*/ G4DataInterpolation *GetQE( void ) const { return m_QE; }; + double GetScaleFactor( void ) const { return m_ScaleFactor; }; void SetGeometricEfficiency(double value) { m_GeometricEfficiency = value; }; double GetGeometricEfficiency( void ) const { return m_GeometricEfficiency; }; + void SetActiveAreaSize(double size) { m_ActiveAreaSize = size; }; + double GetActiveAreaSize( void ) const { return m_ActiveAreaSize; }; + + void SetCopyIdentifierLevel(unsigned lv) { m_CopyIdentifierLevel = lv; }; + unsigned GetCopyIdentifierLevel( void ) const { return m_CopyIdentifierLevel; }; + void AddItselfToOpticalBoundaries(IRT *irt, ParametricSurface *surface) /*const*/ { auto boundary = new OpticalBoundary(0, surface, true); irt->AddOpticalBoundary(boundary); @@ -37,13 +45,31 @@ class CherenkovPhotonDetector: public G4Object { m_OpticalBoundaryStorage.push_back(boundary); }; IRT *AllocateIRT(unsigned sector, uint64_t icopy) { - auto irt = new IRT(sector); _m_IRT[icopy] = irt; return irt; + auto irt = new IRT(/*sector*/); + + if (m_IRT.find(std::make_pair(sector, icopy)) == m_IRT.end()) { + std::vector ret; + ret.push_back(irt); + m_IRT[std::make_pair(sector,icopy)] = ret; + } else + m_IRT[std::make_pair(sector,icopy)].push_back(irt); + + return irt; + }; + // FIXME: should be (sector,icopy) if ever used again; + //IRT *GetIRT(uint64_t icopy) { return (m_IRT.find(icopy) == m_IRT.end() ? 0 : m_IRT[icopy][0]); }; + //std::vector *GetIRTs(uint64_t icopy) { + //return (m_IRT.find(icopy) == m_IRT.end() ? 0 : &m_IRT[icopy]); + //}; + std::vector *GetIRTs(unsigned sector, uint64_t icopy) { + return (m_IRT.find(std::make_pair(sector,icopy)) == m_IRT.end() ? 0 : + &m_IRT[std::make_pair(sector, icopy)]); }; - IRT *GetIRT(uint64_t icopy) { return (_m_IRT.find(icopy) == _m_IRT.end() ? 0 : _m_IRT[icopy]); }; private: // One optical path for each clone (identified by a logical volume copy); - std::map _m_IRT; + //std::map> m_IRT; + std::map, std::vector> m_IRT; // IRT has a TRef by (unfortunate) design -> need a serialized storage buffer to refer to; std::vector m_OpticalBoundaryStorage; @@ -51,12 +77,22 @@ class CherenkovPhotonDetector: public G4Object { // NB: the actual getQE() method can not be in this class since it will require linking // against GEANT libraries; that's fine; double m_QERangeMin, m_QERangeMax; //! - const G4DataInterpolation *m_QE; //! + /*const*/ G4DataInterpolation *m_QE; //! + // May want to renormalize the QE curve, for instance to peak at 100%, but keep the + // QE(lambda) dependency; also helps to select undetected photons, which follow the + // QE(lambda) curve (so are representative for e.g. calculation), but do not pass + // the overall (uniform) efficiency test, see CherenkovSteppingAction::UserSteppingAction(); + double m_ScaleFactor; //! double m_GeometricEfficiency; + // In case a squared flat surface; + double m_ActiveAreaSize; + + unsigned m_CopyIdentifierLevel; //! + #ifndef DISABLE_ROOT_IO - ClassDef(CherenkovPhotonDetector, 3); + ClassDef(CherenkovPhotonDetector, 7); #endif }; diff --git a/include/CherenkovRadiator.h b/include/CherenkovRadiator.h index 9580678..5deb58e 100644 --- a/include/CherenkovRadiator.h +++ b/include/CherenkovRadiator.h @@ -6,6 +6,7 @@ #include #include #include +class TH1D; #ifndef _CHERENKOV_RADIATOR_ #define _CHERENKOV_RADIATOR_ @@ -14,23 +15,78 @@ class G4LogicalVolume; class G4RadiatorMaterial; +class G4DataInterpolation; + +struct CherenkovRadiatorCalibration: public TObject { + CherenkovRadiatorCalibration(): m_Stat(0), + m_AverageZvtx(0.0), m_hcalib(0), m_Coffset(0.0), m_Csigma(0.0) {}; + ~CherenkovRadiatorCalibration() {}; + + unsigned m_Stat; + double /*m_AverageRefractiveIndex,*/ m_AverageZvtx; + // Averaged across photons produced in this particular radiator (and for parent particles + // in a given theta bin), calculated for ALL registered radiators (will be needed for + // IRT algorithm to function properly); + std::vector m_AverageRefractiveIndices; + + TH1D *m_hcalib; + double m_Coffset, m_Csigma; + +#ifndef DISABLE_ROOT_IO + ClassDef(CherenkovRadiatorCalibration, 1); +#endif +}; + +struct CherenkovRadiatorPlots { + CherenkovRadiatorPlots(const char *tag); + ~CherenkovRadiatorPlots() {}; + + void SetRefractiveIndexRange(double min, double max); + void SetPhotonVertexRange(double min, double max); + void SetCherenkovAngleRange(double min, double max); + + // Monte-Carlo plots; + TH1D *hvtx() const { return m_hvtx; }; + TH1D *hnpe() const { return m_hnpe; }; + TH1D *hwl() const { return m_hwl; }; + TH1D *hri() const { return m_hri; }; + + // Reconstruction plots; + TH1D *hnhits() const { return m_hnhits; }; + TH1D *hthph() const { return m_hthph; }; + TH1D *hccdfph() const { return m_hccdfph; }; + TH1D *hthtr() const { return m_hthtr; }; + +private: + std::string m_Tag; + TH1D *m_hvtx, *m_hnpe, *m_hwl, *m_hri, *m_hnhits, *m_hthph, *m_hccdfph, *m_hthtr; +}; + class CherenkovRadiator: public TObject { public: // NB: do not want to use physical volume here because a particle can cross more than one of them // (at the sector boundary), while there is no good reason to separate these contributions; CherenkovRadiator(const G4LogicalVolume *volume = 0, const G4RadiatorMaterial *material = 0): - m_LogicalVolume(volume), m_Material(material), - m_ReferenceRefractiveIndex(0.0), m_ReferenceAttenuationLength(0.0), - m_ID(0), m_Stat(0), m_AverageTheta(0.0), m_TrajectoryBinCount(1), m_Smearing(0.0), - m_GaussianSmearing(false) {}; + /*m_LogicalVolume(volume),*/ + m_Material(material), m_OpticalPhotonGenerationEnabled(true), + m_ReferenceRefractiveIndex(0.0), m_ReferenceAttenuationLength(0.0), + m_ID(0), m_TrajectoryBinCount(1), m_Smearing(0.0), + m_GaussianSmearing(false), m_CalibrationPhotonCount(0), m_DetectedPhotonCount(0), m_YieldStat(0), + m_YieldCff(0.0), m_DetectedToCalibrationPhotonRatio(0.0), + m_UsedInRingImaging(false), m_Plots(0) { + m_LogicalVolumes.push_back(volume); + }; ~CherenkovRadiator() {}; double n( void ) const { return m_ReferenceRefractiveIndex; }; double GetReferenceAttenuationLength( void ) const { return m_ReferenceAttenuationLength; }; void SetReferenceRefractiveIndex(double n) { m_ReferenceRefractiveIndex = n; }; + double GetReferenceRefractiveIndex(void) const { return m_ReferenceRefractiveIndex; }; void SetReferenceAttenuationLength(double l) { m_ReferenceAttenuationLength = l; }; + void AddLogicalVolume(const G4LogicalVolume *volume) { m_LogicalVolumes.push_back(volume); }; + const G4RadiatorMaterial *GetMaterial( void ) const { return m_Material; }; ParametricSurface *GetFrontSide(unsigned path) { @@ -51,12 +107,24 @@ class CherenkovRadiator: public TObject { return m_AlternativeMaterialName.Data(); }; + void DisableOpticalPhotonGeneration( void ) { m_OpticalPhotonGenerationEnabled = false; }; + bool OpticalPhotonGenerationEnabled( void ) const { return m_OpticalPhotonGenerationEnabled; }; + + CherenkovRadiator *UseInRingImaging( void ) { + m_UsedInRingImaging = true; + + return this; + }; + bool UsedInRingImaging( void ) const { return m_UsedInRingImaging; }; + protected: // Run-time variables for the GEANT pass; - const G4LogicalVolume *m_LogicalVolume; //! + //+const G4LogicalVolume *m_LogicalVolume; //! + std::vector m_LogicalVolumes; //! const G4RadiatorMaterial *m_Material; //! private: + bool m_OpticalPhotonGenerationEnabled; // Refractive index calculated for some fixed reference wave length (supposedly the average // one as seen on the detected photon wave length plot); @@ -76,28 +144,52 @@ class CherenkovRadiator: public TObject { // FIXME: memory leak; void ResetLocations( void ) { m_Locations.clear(); } + void ResetTimes( void ) { m_Times.clear(); } void AddLocation(/*unsigned sector,*/ const TVector3 &x, const TVector3 &n) { m_Locations/*[sector]*/.push_back(std::make_pair(x, n)); }; + void AddTime(double value) { m_Times.push_back(value); }; - // Transient variables for the analysis script convenience; - unsigned m_ID; //! - unsigned m_Stat; //! - double m_AverageTheta; //! - TVector3 m_AverageVertexPosition; //! - double m_AverageRefractiveIndex; //! + // Transient variables for the ReconstructionFactory convenience; + unsigned m_ID; //! + unsigned m_TrajectoryBinCount; //! - unsigned m_TrajectoryBinCount; //! // This is a hack for now; - double m_Smearing; //! - bool m_GaussianSmearing; //! - //std::map>> _m_Locations; //! - std::vector> m_Locations; //! + double m_Smearing; //! + bool m_GaussianSmearing; //! + std::vector> m_Locations; //! + std::vector m_Times; //! std::vector> m_ri_lookup_table; //! + // Overall counts of "calibration" (did not pass QE check) and "real" (passed) + // photons; since they originate from the same parent distribution, one can choose + // basically any way to calculate their effective ratio for Poisson statistics purposes; + unsigned m_CalibrationPhotonCount; //! + unsigned m_DetectedPhotonCount; //! + unsigned m_YieldStat; //! + + double m_YieldCff; + double m_DetectedToCalibrationPhotonRatio; + std::vector m_Calibrations; + + bool m_UsedInRingImaging; //! + + CherenkovRadiator *InitializePlots(const char *tag) { + m_Plots = new CherenkovRadiatorPlots(tag); + + // Simplify scripting; + return this; + }; + CherenkovRadiatorPlots *Plots( void ) const { return m_Plots; }; + void DisplayStandardPlots(const char *cname, int wtopx, unsigned wtopy, unsigned wx, unsigned wy) const; + + CherenkovRadiatorPlots *m_Plots; //! + + G4DataInterpolation *m_RefractiveIndex; //! + #ifndef DISABLE_ROOT_IO - ClassDef(CherenkovRadiator, 5); + ClassDef(CherenkovRadiator, 9); #endif }; diff --git a/include/CherenkovWaveLengthRange.h b/include/CherenkovWaveLengthRange.h new file mode 100644 index 0000000..a7fc673 --- /dev/null +++ b/include/CherenkovWaveLengthRange.h @@ -0,0 +1,27 @@ + +#ifndef _CHERENKOV_WAVELENGTH_RANGE_ +#define _CHERENKOV_WAVELENGTH_RANGE_ + +class CherenkovWaveLengthRange { +public: + CherenkovWaveLengthRange(unsigned wldim, double numin, double nustep): + m_WLDim(wldim) { + m_PhotonEnergies = new double[wldim]; + + for(unsigned iq=0; iq0; + m_Slope = (r1-r0)/dz; + }; + ~ConicalSurface() {}; + + // FIXME: no range check?; + TVector3 GetSpacePoint(double z, double phi) const { + TVector3 nn(cos(phi), sin(phi), 0.0); + double r = m_Rc + z*m_Slope; + auto local = z*m_Nz + r*nn; + // FIXME: sign check; + local.Rotate(m_Alfa, m_Nr); + return GetCenter() + local; + }; + + TVector3 GetNormal(const TVector3 &xx) const { + //assert(0); + auto dx = xx - GetCenter(), axis = dx.Cross(m_Nz).Unit(); + dx -= dx.Dot(m_Nz)*m_Nz; + dx.Rotate(-atan(m_Slope), axis); + + return (m_Concave ? -1.0 : 1.0)*dx.Unit(); + }; + + bool GetCrossing(const TVector3 &x0, const TVector3 &n0, TVector3 *crs, bool check_normal = true) const; + double GetDistance(const TVector3 &xx) const; + + void SetConvex( void ) { m_Concave = false; }; + ParametricSurface *_Clone(double angle, const TVector3 &axis) const { + auto copy = new ConicalSurface(*this); + + copy->m_Center.Rotate(angle, axis); + + copy->m_Nz.Rotate(angle, axis); + copy->m_Nr.Rotate(angle, axis); + + return copy; + }; + + // These two are the same for ConicalSurface & CylindricalSurface; + double GetU(const TVector3 &xx) const { + auto dx = xx - GetCenter(); + // FIXME: sign check; + dx.Rotate(-m_Alfa, m_Nr); + + // FIXME: check units; + return dx.Phi(); + }; + double GetV(const TVector3 &xx) const { + return (xx - GetCenter()).Dot(m_Nz); + }; + + private: + bool m_Concave; + TVector3 m_Nz, m_Nr; + double m_R0, m_R1, m_Dz, m_Alfa, m_Rc, m_Slope; + +#ifndef DISABLE_ROOT_IO + ClassDef(ConicalSurface, 1); +#endif +}; + +#endif diff --git a/include/CylindricalSurface.h b/include/CylindricalSurface.h new file mode 100644 index 0000000..e740521 --- /dev/null +++ b/include/CylindricalSurface.h @@ -0,0 +1,81 @@ + +// +// Yes, prefer to keep it separately even that it is a subset of a ConicalSurface; +// + +#include "ParametricSurface.h" + +#ifndef _IRT_CYLINDRICAL_SURFACE_ +#define _IRT_CYLINDRICAL_SURFACE_ + +class CylindricalSurface: public ParametricSurface { + public: + CylindricalSurface(): m_Concave(true), m_Radius(0.0), m_Alfa(0.0) {}; + CylindricalSurface(const TVector3 &x0, const TVector3 &nz, double r0, double dz, + double vmin = 0.0, double vmax = 2*M_PI): + ParametricSurface(x0, -dz/2, dz/2, vmin, vmax), m_Concave(true), m_Nz(nz.Unit()), m_Radius(r0) { + if (!m_Nz.x() && !m_Nz.y()) { + m_Alfa = 0.0; + m_Nr = TVector3(0,0,1); + } else { + auto axis = TVector3(0,0,1).Cross(m_Nz); + m_Alfa = axis.Mag(); + m_Nr = axis.Unit(); + } //if + }; + ~CylindricalSurface() {}; + + // FIXME: no range check?; + TVector3 GetSpacePoint(double z, double phi) const { + TVector3 nn(cos(phi), sin(phi), 0.0); + auto local = z*m_Nz + m_Radius*nn; + // FIXME: sign check; + local.Rotate(m_Alfa, m_Nr); + + return GetCenter() + local; + }; + + TVector3 GetNormal(const TVector3 &xx) const { + auto dx = xx - GetCenter(); + dx -= dx.Dot(m_Nz)*m_Nz; + + return (m_Concave ? -1.0 : 1.0)*dx.Unit(); + }; + + bool GetCrossing(const TVector3 &x0, const TVector3 &n0, TVector3 *crs, bool check_normal = true) const; + double GetDistance(const TVector3 &xx) const; + + void SetConvex( void ) { m_Concave = false; }; + ParametricSurface *_Clone(double angle, const TVector3 &axis) const { + auto copy = new CylindricalSurface(*this); + + copy->m_Center.Rotate(angle, axis); + + copy->m_Nz.Rotate(angle, axis); + copy->m_Nr.Rotate(angle, axis); + + return copy; + }; + + double GetU(const TVector3 &xx) const { + auto dx = xx - GetCenter(); + // FIXME: sign check; + dx.Rotate(-m_Alfa, m_Nr); + + return dx.Phi(); + }; + double GetV(const TVector3 &xx) const { + return (xx - GetCenter()).Dot(m_Nz); + }; + + private: + bool m_Concave; + TVector3 m_Nz, m_Nr; + double m_Radius, m_Alfa; + +#ifndef DISABLE_ROOT_IO + ClassDef(CylindricalSurface, 1); +#endif +}; + +#endif diff --git a/include/Digitization.h b/include/Digitization.h new file mode 100644 index 0000000..0ab3a0e --- /dev/null +++ b/include/Digitization.h @@ -0,0 +1,69 @@ + +#include + +#ifndef _DIGITIZATION_ +#define _DIGITIZATION_ + +#include "DigitizedHit.h" +#include "GeantImport.h" +class CherenkovPhotonDetector; + +struct BlackoutCell { +BlackoutCell(CherenkovPhotonDetector *pd, unsigned icopy, unsigned iX, unsigned iY): + m_PhotonDetector(pd), m_Copy(icopy), m_iX(iX), m_iY(iY) {}; + ~BlackoutCell() {}; + + bool operator<(const BlackoutCell& other) const { + return + (m_PhotonDetector < other.m_PhotonDetector) || + (m_PhotonDetector == other.m_PhotonDetector && m_Copy < other.m_Copy) || + (m_PhotonDetector == other.m_PhotonDetector && m_Copy == other.m_Copy && m_iX < other.m_iX) || + (m_PhotonDetector == other.m_PhotonDetector && m_Copy == other.m_Copy && m_iX == other.m_iX && m_iY < other.m_iY); + } + + CherenkovPhotonDetector *m_PhotonDetector; + unsigned m_Copy, m_iX, m_iY; +}; + +class Digitization : public virtual GeantImport { + public: + Digitization(); + ~Digitization() {}; + + unsigned GetDigitizedHitCount( void ) const { return m_Hits.size(); }; + const std::vector &GetDigitizedHits( void ) const { return m_Hits; }; + const DigitizedHit *GetDigitizedHit(unsigned id) const { + return (id < m_Hits.size() ? &m_Hits[id] : 0); + }; + + void SetBlackoutBlowupValue(unsigned value) { m_BlackoutBlowupValue = value; }; + + CherenkovRadiator *AddBlackoutRadiator(const char *rname); + void SetSensorActiveAreaPixellation(unsigned div) { m_SensorActiveAreaPixellation = div; }; + void SetSinglePhotonTimingResolution(double value) { m_SinglePhotonTimingResolution = value; }; + + protected: + std::vector &Hits( void ) { return m_Hits; }; + void ProduceDigitizedHits(bool calibration); + void ClearBlackoutCells( void ) { m_BlackoutCells.clear(); }; + void ClearDigitizedHits( void ) { m_Hits.clear(); } + double GetSinglePhotonTimingResolution( void ) const { return m_SinglePhotonTimingResolution; }; + + private: + TRandom m_rndm; + std::vector m_Hits; + + // Radiator pointer and summing up (assume 2^n) scaling factor on the sensor plane; + std::set m_BlackoutRadiators; + // FIXME: this can be done more efficiently (using cell-to-cell distance); for now just + // shut down all hits which fall into the same cell as a "background" radiator, at + // 2^n larger macro-pad; + unsigned m_BlackoutBlowupValue; + + std::set m_BlackoutCells; + + double m_SinglePhotonTimingResolution; + unsigned m_SensorActiveAreaPixellation; +}; + +#endif diff --git a/include/DigitizedHit.h b/include/DigitizedHit.h new file mode 100644 index 0000000..9ccef6d --- /dev/null +++ b/include/DigitizedHit.h @@ -0,0 +1,90 @@ + +#include +#include +#include + +#include +#include + +#ifndef _DIGITIZED_HIT_ +#define _DIGITIZED_HIT_ + +#include "CherenkovPhotonDetector.h" +#include "SinglePDF.h" +class ChargedParticle; +class IRT; + +class DigitizedHitSolution { + public: + DigitizedHitSolution(): m_Best(0), m_thp(0.0), m_tt(0.0), m_ccdf(0.0), m_rbest(0) {}; + ~DigitizedHitSolution() {}; + + // FIXME: very inefficient; + CherenkovRadiator *GetRadiator( void ) { + for(auto &ptr: m_All) + if (&ptr.second == m_Best) + return ptr.first.first; + + return 0; + }; + + void AssignVariables(IRTSolution *best, double thp, double tt, CherenkovRadiator *rptr, double ccdf) { + m_Best = best; + m_thp = thp; + m_tt = tt; + m_rbest = rptr; + m_ccdf = ccdf; + }; + + std::map, IRTSolution> m_All; + IRTSolution* m_Best; + + double m_thp, m_tt, m_ccdf; + CherenkovRadiator *m_rbest; +}; + +class DigitizedHit { + public: + DigitizedHit(): m_BackgroundCandidate(false), m_IRTs(0), m_PhotonDetector(0), + m_Copy(0), m_iX(0), m_iY(0) {}; + ~DigitizedHit() { + m_Selected.clear(); + }; + + double GetAverageDetectionTime( void ) const { + double ret = 0.0; + + for(auto t: m_DetectionTimes) + ret += t; + + return (m_DetectionTimes.size() ? ret / m_DetectionTimes.size() : 0.0); + }; + double GetDetectionTime(unsigned ih) const { + return (ih < m_DetectionTimes.size() ? m_DetectionTimes[ih] : 0.0); + }; + unsigned GetPhotonCount( void ) const { return m_DetectionTimes.size(); }; + + inline const TVector3 &GetDetectionPosition( void ) const { return m_DetectionPosition; }; + + // FIXME: private; + bool m_BackgroundCandidate; //! + std::set> m_Selected; //! + std::map m_Solutions; //! + + TVector3 m_DetectionPosition; //! + std::vector m_DirectionSeeds; //! + std::vector *m_IRTs; //! + + CherenkovPhotonDetector *m_PhotonDetector; //! + unsigned m_Copy; //! + + // Essentially should be unsigned values [0 .. dim-1]; + int m_iX, m_iY; //! + + std::vector m_DetectionTimes; //! + + // FIXME: remove once EICrecon debugging is over; + //TVector3 m_PhotonVertexPosition; //! + //TVector3 m_PhotonVertexMomentum; //! +}; +#endif diff --git a/include/FlatSurface.h b/include/FlatSurface.h new file mode 100644 index 0000000..4567426 --- /dev/null +++ b/include/FlatSurface.h @@ -0,0 +1,61 @@ + +#include "ParametricSurface.h" + +#ifndef _IRT_FLAT_SURFACE_ +#define _IRT_FLAT_SURFACE_ + +// In fact a rectangle in space; +class FlatSurface: public ParametricSurface, public LocalCoordinatesXY { + public: + FlatSurface() {}; + FlatSurface(const TVector3 &x0, const TVector3 &nx, const TVector3 &ny, double sx = 0.0, double sy = 0.0): + // FIXME: no orthogonality and / or normalization check?; + ParametricSurface(x0, -sx/2, sx/2, -sy/2, sy/2), m_Nx(nx.Unit()), m_Ny(ny.Unit()) { + m_Nz = nx.Cross(ny).Unit(); + }; + ~FlatSurface() {}; + + TVector3 GetSpacePoint(double x, double y) const { + return GetCenter() + x*m_Nx + y*m_Ny; + }; + TVector3 GetNormal(const TVector3 &xx) const { + // Make compiler happy, use 'xx' variable; + return m_Nz + 0.0*xx; + }; + TVector3 GetNormal( void ) const { + return m_Nz; + }; + // FIXME: well, this calculation assumes orthogonal X&Y vectors were provided; + inline double GetLocalX(const TVector3 &xx) const { + return (xx - GetCenter()).Dot(m_Nx); + }; + inline double GetLocalY(const TVector3 &xx) const { + return (xx - GetCenter()).Dot(m_Ny); + }; + + bool GetCrossing(const TVector3 &x0, const TVector3 &n0, TVector3 *crs, bool check_normal = true) const; + double GetDistance(const TVector3 &xx) const; + ParametricSurface *_Clone(double angle, const TVector3 &axis) const { + auto copy = new FlatSurface(*this); + + copy->m_Center.Rotate(angle, axis); + + copy->m_Nx.Rotate(angle, axis); + copy->m_Ny.Rotate(angle, axis); + copy->m_Nz.Rotate(angle, axis); + + return copy; + }; + + double GetU(const TVector3 &xx) const { return GetLocalX(xx); }; + double GetV(const TVector3 &xx) const { return GetLocalY(xx); }; + + private: + TVector3 m_Nx, m_Ny, m_Nz; + +#ifndef DISABLE_ROOT_IO + ClassDef(FlatSurface, 1); +#endif +}; + +#endif diff --git a/include/G4Object.h b/include/G4Object.h index b174e74..474ba98 100644 --- a/include/G4Object.h +++ b/include/G4Object.h @@ -41,7 +41,7 @@ class G4Object: public TObject { void DefineIntersectionCut(G4VSolid *cut, G4RotationMatrix *rotation, const G4ThreeVector &translation, bool flip); void DefineSubtractionCut (G4VSolid *cut, G4RotationMatrix *rotation, const G4ThreeVector &translation, bool flip); void DefineUnion(G4VSolid *solid); - //G4VSolid *GetSolid( void ) { return m_Solid; }; + G4VSolid *GetSolid( void ) { return m_Solid; }; void SetColor(const G4Colour &color); @@ -51,12 +51,15 @@ class G4Object: public TObject { G4LogicalVolume *GetLogicalVolume( void ) const { return m_LogicalVolume; }; virtual G4ObjectCopy *CreateCopy(G4VPhysicalVolume *phys) { return new G4ObjectCopy(phys); }; + void AddCopy(G4ObjectCopy *copy) { m_Copies.push_back(copy); }; G4ObjectCopy *GetCopy(unsigned id) const { return (id < m_Copies.size() ? m_Copies[id] : 0); }; virtual G4OpticalSurface *GetMirrorSurface( void ) const { return 0; }; + G4Material *GetMaterial( void ) const { return m_Material; }; + protected: G4VSolid *m_Solid; //! std::vector m_Copies; //! diff --git a/include/GeantImport.h b/include/GeantImport.h new file mode 100644 index 0000000..dc5458f --- /dev/null +++ b/include/GeantImport.h @@ -0,0 +1,53 @@ + +#include + +#ifndef _GEANT_IMPORT_ +#define _GEANT_IMPORT_ + +#include "CherenkovEvent.h" +class CherenkovDetectorCollection; +class CherenkovDetector; + +#define _MOMENTUM_CUTOFF_DEFAULT_ (0.010) + +class GeantImport { + public: + GeantImport(const char *dfname = 0, const char *cfname = 0, const char *dname = 0); + // FIXME: do it all better later; + GeantImport(CherenkovDetectorCollection *geometry, CherenkovDetector *cdet, CherenkovEvent *event): + m_Tree(0), + m_IrtGeometry(geometry), + m_RICH(cdet), + m_Event(event), + m_PurgeSecondaries(true), + m_MomentumCutoff(_MOMENTUM_CUTOFF_DEFAULT_) {}; + ~GeantImport() {}; + + CherenkovDetector *GetMyRICH( void ) const { return m_RICH; } + CherenkovEvent *Event( void ) const { return m_Event; }; + void GetInputTreeEntry(unsigned ev) const;// { if (m_Tree) m_Tree->GetEntry(ev); }; + unsigned GetInputTreeEntryCount( void ) const { return m_Tree ? m_Tree->GetEntries() : 0; }; + + void AccountSecondaries( void ) { m_PurgeSecondaries = false; }; + void SetMomentumCutoff(double value) { m_MomentumCutoff = value; }; + + CherenkovDetectorCollection *GetIrtGeometry( void ) const { return m_IrtGeometry; }; + +protected: + // Input TTree with GEANT simulated data; + TTree *m_Tree; + + private: + CherenkovDetectorCollection *m_IrtGeometry; + + // "pfRICH" or "dRICH" structure pointer; + CherenkovDetector *m_RICH; + + // Input (GEANT) / output(Reco) event structure; + CherenkovEvent *m_Event; + + bool m_PurgeSecondaries; + double m_MomentumCutoff; +}; + +#endif diff --git a/include/IRT.h b/include/IRT.h index 13fbe46..1bb4245 100644 --- a/include/IRT.h +++ b/include/IRT.h @@ -26,7 +26,7 @@ class IRT: public TObject { public: - IRT(unsigned sector = 0): m_Sector(sector), m_IterationLimit(_IRT_ITERATION_LIMIT_), + IRT(/*unsigned sector = 0*/): /*m_Sector(sector),*/ m_IterationLimit(_IRT_ITERATION_LIMIT_), m_Precision(_IRT_PRECISION_DEFAULT_), m_JacobianStep(_IRT_JACOBIAN_STEP_DEFAULT_) {}; ~IRT() {}; @@ -39,36 +39,34 @@ class IRT: public TObject { void SetJacobianStep(double value) { m_JacobianStep = value; }; IRTSolution Solve(const TVector3 &xfrom, const TVector3 &nfrom, const TVector3 &xto, const TVector3 &beam, - //CherenkovRadiator *derivatives = 0, const IRTSolution *seed = 0); - bool derivatives = false, const IRTSolution *seed = 0); - IRTSolution Solve(const TVector3 &xfrom, const TVector3 &nfrom, const double xy[2], const TVector3 &beam, bool derivatives = false, const IRTSolution *seed = 0); - unsigned GetSector( void ) const { return m_Sector; }; + //unsigned GetSector( void ) const { return m_Sector; }; inline OpticalBoundary *tail( void ) const { return _m_OpticalBoundaries.size() ? GetOpticalBoundary(_m_OpticalBoundaries.size()-1) : 0; }; private: - bool Transport(const TVector3 &xfrom, const TVector3 &nfrom); + bool Transport(const TVector3 &xfrom, const TVector3 &nfrom, double *length = 0); inline OpticalBoundary *GetOpticalBoundary(unsigned id) const { return (id < _m_OpticalBoundaries.size() ? dynamic_cast(_m_OpticalBoundaries[id].GetObject()) : 0); - //return (id < _m_OpticalBoundaries.size() ? _m_OpticalBoundaries[id] : 0); }; + IRTSolution Solve(const TVector3 &xfrom, const TVector3 &nfrom, const double xy[2], const TVector3 &beam, + bool derivatives = false, const IRTSolution *seed = 0); + // FIXME: this is not the right place for this variable; - unsigned m_Sector; + //unsigned m_Sector; unsigned m_IterationLimit; double m_Precision, m_JacobianStep; std::vector _m_OpticalBoundaries; - //std::vector _m_OpticalBoundaries; #ifndef DISABLE_ROOT_IO - ClassDef(IRT, 3); + ClassDef(IRT, 4); #endif }; diff --git a/include/IRTSolution.h b/include/IRTSolution.h index 1b22e04..44af9d8 100644 --- a/include/IRTSolution.h +++ b/include/IRTSolution.h @@ -8,11 +8,16 @@ class IRTSolution { friend class IRT; public: - IRTSolution(): m_Converged(false), m_Theta(0.0), m_SigmaTheta(0.0), m_Phi(0.0), + IRTSolution(): m_Converged(false), m_Theta(0.0), m_SigmaTheta(0.0), m_Phi(0.0), m_Length(0.0), m_Time(0.0), m_DtDx(0.0), m_DtDy(0.0), m_DtDz(0.0), /*m_DtDn(0.0),*/m_DtDt(0.0), m_DtDf(0.0), m_SigmaDx(0.0), m_SigmaDy(0.0), m_SigmaDz(0.0), m_SigmaDt(0.0), m_SigmaDf(0.0) {}; ~IRTSolution() {}; + void SetSeed(const TVector3 &n0) { + m_Theta = n0.Theta(); + m_Phi = n0.Phi(); + }; + bool Converged( void ) const { return m_Converged; } double GetTheta( void ) const { return m_Theta; }; double GetSigmaTheta( void ) const { return m_SigmaTheta; }; @@ -22,6 +27,11 @@ class IRTSolution { m_Converged = false; m_Theta = other.m_Theta; m_SigmaTheta = 0.0; m_Phi = other.m_Phi; return *this; }; +#else + void Set(const IRTSolution *other) { + m_Converged = false; m_Theta = other->m_Theta; m_SigmaTheta = 0.0; m_Phi = other->m_Phi; + //memcpy(this, other, sizeof(IRTSolution)); + }; #endif void SetSigmaDx(double value) { m_SigmaDx = value; }; void SetSigmaDy(double value) { m_SigmaDy = value; }; @@ -43,9 +53,9 @@ class IRTSolution { // This is a reconstructed direction in MARS 3D system; TVector3 m_Direction; - private: + //private: bool m_Converged; - double m_Theta, m_SigmaTheta, m_Phi; + double m_Theta, m_SigmaTheta, m_Phi, m_Length, m_Time; // Derivatives: XY-coordinates on the sensor, emission point, "refractive index" (?), // charged particle track theta and phi; these ones can be evaluated internally; diff --git a/include/OpticalPhoton.h b/include/OpticalPhoton.h index c8c0eb6..d87ffe2 100644 --- a/include/OpticalPhoton.h +++ b/include/OpticalPhoton.h @@ -11,23 +11,25 @@ #include "TransientParticle.h" #include "CherenkovPhotonDetector.h" class ReflectionPoint; +class ChargedParticle; #include "RefractionPoint.h" #include "SinglePDF.h" class OpticalPhoton: public TransientParticle { public: - OpticalPhoton(): TransientParticle(0), m_VertexRefractiveIndex(0.0), m_PhotonDetector(0), - m_VolumeCopy(0), m_DetectionTime(0.0), - m_Detected(false)/*, m_Phi(0.0)*/ {};//, m_Selected(false) {}; + OpticalPhoton(): TransientParticle(0), m_VertexAttenuationLength(0.0), + m_VertexRefractiveIndex(0.0), m_PhotonDetector(0), m_VolumeCopy(0), m_DetectionTime(0.0), + m_Detected(false), m_CalibrationFlag(false), m_BlackoutFlag(false) {}; ~OpticalPhoton() {}; inline bool IsCharged( void ) const { return false; }; inline void SetDetected(bool what = true) { m_Detected = what; }; + inline void SetCalibrationFlag( void ) { m_CalibrationFlag = true; }; + inline void SetBlackoutFlag( void ) { m_BlackoutFlag = true; }; inline void SetDetectionTime(double value) { m_DetectionTime = value; }; + inline void SetVertexAttenuationLength(double value) { m_VertexAttenuationLength = value; }; inline void SetVertexRefractiveIndex(double value) { m_VertexRefractiveIndex = value; }; - inline void SetVertexPosition(const TVector3 &position) { m_VertexPosition = position; }; - inline void SetVertexMomentum(const TVector3 &momentum) { m_VertexMomentum = momentum; }; inline void SetVertexParentMomentum(const TVector3 &momentum){ m_VertexParentMomentum = momentum; }; inline void SetVolumeCopy(uint64_t copy) { m_VolumeCopy = copy; }; inline void SetDetectionPosition(const TVector3 &position) { m_DetectionPosition = position; }; @@ -48,23 +50,32 @@ class OpticalPhoton: public TransientParticle { return (id < m_RefractionPoints.size() ? m_RefractionPoints[id] : 0); }; + inline double GetVertexAttenuationLength( void ) const { return m_VertexAttenuationLength; }; inline double GetVertexRefractiveIndex( void ) const { return m_VertexRefractiveIndex; }; inline double GetDetectionTime( void ) const { return m_DetectionTime; }; - inline const TVector3 &GetVertexPosition( void ) const { return m_VertexPosition; }; - inline const TVector3 &GetVertexMomentum( void ) const { return m_VertexMomentum; }; inline const TVector3 &GetVertexParentMomentum( void ) const { return m_VertexParentMomentum; }; inline const TVector3 &GetDetectionPosition( void ) const { return m_DetectionPosition; }; inline bool WasDetected( void ) const { return m_Detected; }; + inline bool IsUsefulForCalibration( void ) const { return m_CalibrationFlag; }; + inline bool IsMarkedAsBlackout( void ) const { return m_BlackoutFlag; }; inline uint64_t GetVolumeCopy( void ) const { return m_VolumeCopy; }; inline CherenkovPhotonDetector *GetPhotonDetector( void ) const { return dynamic_cast(m_PhotonDetector.GetObject()); }; + void StoreRefractiveIndex(double ri) { + m_RefractiveIndices.push_back(ri); + }; + const std::vector &StoredRefractiveIndices( void ) const { return m_RefractiveIndices; }; + private: - // Vertex and 3D at birth as given by GEANT; - TVector3 m_VertexPosition, m_VertexMomentum, m_VertexParentMomentum; + // 3D momentum vector of a parent particle at the photon production vertex location; + TVector3 m_VertexParentMomentum; + + // Attenuation length for this wave length (if radiator was known); + double m_VertexAttenuationLength; // Refractive index for this wave length (if radiator was known); double m_VertexRefractiveIndex; @@ -81,20 +92,22 @@ class OpticalPhoton: public TransientParticle { double m_DetectionTime; // 'true' if the photon was actually detected; QE-based and geometric efficiency accounted; - bool m_Detected; + bool m_Detected, m_CalibrationFlag, m_BlackoutFlag; + // For all known radiators, for a completeness; + std::vector m_RefractiveIndices; + // Transient variables for some convenience in an analysis script; public: - //inline bool WasSelected( void ) const { return m_Selected; }; - //bool m_Selected; //! - std::set> _m_Selected; //! - std::map _m_PDF; //! + std::set> _m_Selected; //! + // FIXME: this one is obsolete; + std::map _m_PDF; //! // Average estimated phi angle; no need to know it precisely (?); - std::map m_Phi; //! + std::map m_Phi; //! #ifndef DISABLE_ROOT_IO - ClassDef(OpticalPhoton, 3); + ClassDef(OpticalPhoton, 12); #endif }; diff --git a/include/ParametricSurface.h b/include/ParametricSurface.h index f1375ba..6859253 100644 --- a/include/ParametricSurface.h +++ b/include/ParametricSurface.h @@ -26,6 +26,12 @@ class ParametricSurface: public TObject { m_Umin = umin; m_Umax = umax; m_Vmin = vmin; m_Vmax = vmax; }; + virtual double GetU(const TVector3 &xx) const = 0; + virtual double GetV(const TVector3 &xx) const = 0; + virtual bool IsInside(const TVector3 &xx) const { + return IsInside(GetU(xx), GetV(xx)); + }; + virtual TVector3 GetSpacePoint(double u, double v) const = 0; // There is no check that the point actually belongs to the surface; // it is assumed that GEANT stepping was done correctly, so the point @@ -49,6 +55,8 @@ class ParametricSurface: public TObject { // Crossing with the straight line defined by {x0,n0}; virtual bool GetCrossing(const TVector3 &x0, const TVector3 &n0, TVector3 *crs, bool check_normal = true) const = 0; + bool GetQuadraticEquationCaseCrossing(const TVector3 &x0, const TVector3 &n0, TVector3 *crs, + bool check_normal, double a, double b, double c) const; // Introduce only the transformations needed for the current task; virtual ParametricSurface *_Clone(double angle, const TVector3 &axis) const = 0; @@ -68,46 +76,6 @@ class ParametricSurface: public TObject { #endif }; -class SphericalSurface: public ParametricSurface { - public: - SphericalSurface(): m_Concave(true), m_Radius(0.0) {}; - SphericalSurface(const TVector3 &x0, double r0, double umin = 0.0, double umax = M_PI, - double vmin = 0.0, double vmax = 2*M_PI): - ParametricSurface(x0, umin, umax, vmin, vmax), m_Concave(true), m_Radius(r0) {}; - ~SphericalSurface() {}; - - // FIXME: no range check?; - TVector3 GetSpacePoint(double theta, double phi) const { - TVector3 nn(sin(theta)*cos(phi), sin(theta)*sin(phi), cos(theta)); - return GetCenter() + m_Radius*nn; - }; - - TVector3 GetNormal(const TVector3 &xx) const { - return (m_Concave ? -1.0 : 1.0)*(xx - GetCenter()).Unit(); - }; - double GetRadius( void ) const { return m_Radius; }; - - bool GetCrossing(const TVector3 &x0, const TVector3 &n0, TVector3 *crs, bool check_normal = true) const; - double GetDistance(const TVector3 &xx) const; - - void SetConvex( void ) { m_Concave = false; }; - ParametricSurface *_Clone(double angle, const TVector3 &axis) const { - auto copy = new SphericalSurface(*this); - - copy->m_Center.Rotate(angle, axis); - - return copy; - }; - - private: - bool m_Concave; - double m_Radius; - -#ifndef DISABLE_ROOT_IO - ClassDef(SphericalSurface, 2); -#endif -}; - class LocalCoordinatesXY: public TObject { public: LocalCoordinatesXY() {}; @@ -121,55 +89,4 @@ class LocalCoordinatesXY: public TObject { #endif }; -// In fact a rectangle in space; -class FlatSurface: public ParametricSurface, public LocalCoordinatesXY { - public: - FlatSurface() {}; - FlatSurface(const TVector3 &x0, const TVector3 &nx, const TVector3 &ny, double sx = 0.0, double sy = 0.0): - // FIXME: no orthogonality and / or normalization check?; - ParametricSurface(x0, -sx/2, sx/2, -sy/2, sy/2), m_Nx(nx.Unit()), m_Ny(ny.Unit()) { - m_Nz = nx.Cross(ny).Unit(); - }; - ~FlatSurface() {}; - - TVector3 GetSpacePoint(double x, double y) const { - return GetCenter() + x*m_Nx + y*m_Ny; - }; - TVector3 GetNormal(const TVector3 &xx) const { - // Make compiler happy, use 'xx' variable; - return m_Nz + 0.0*xx; - }; - TVector3 GetNormal( void ) const { - return m_Nz; - }; - // FIXME: well, this calculation assumes orthogonal X&Y vectors were provided; - inline double GetLocalX(const TVector3 &xx) const { - return (xx - GetCenter()).Dot(m_Nx); - }; - inline double GetLocalY(const TVector3 &xx) const { - return (xx - GetCenter()).Dot(m_Ny); - }; - - bool GetCrossing(const TVector3 &x0, const TVector3 &n0, TVector3 *crs, bool check_normal = true) const; - double GetDistance(const TVector3 &xx) const; - ParametricSurface *_Clone(double angle, const TVector3 &axis) const { - auto copy = new FlatSurface(*this); - - copy->m_Center.Rotate(angle, axis); - - copy->m_Nx.Rotate(angle, axis); - copy->m_Ny.Rotate(angle, axis); - copy->m_Nz.Rotate(angle, axis); - - return copy; - }; - - private: - TVector3 m_Nx, m_Ny, m_Nz; - -#ifndef DISABLE_ROOT_IO - ClassDef(FlatSurface, 1); -#endif -}; - #endif diff --git a/include/RadiatorHistory.h b/include/RadiatorHistory.h index a32fcbd..830995f 100644 --- a/include/RadiatorHistory.h +++ b/include/RadiatorHistory.h @@ -12,7 +12,7 @@ class RadiatorHistory: public TObject { public: - RadiatorHistory() {}; + RadiatorHistory(): m_EstimatedPath(0.0)/*, m_AverageTime(0.0)*/ {}; ~RadiatorHistory() { for(auto photon: m_Photons) delete photon; @@ -65,12 +65,18 @@ class RadiatorHistory: public TObject { } //for iq }; + // Average location, momentum and time of emission by this particle from this radiator + // as evaluated by "calibration" photons which did not make it into the "detected" sample; + TVector3 m_EstimatedVertex, m_AverageParentMomentum; //! + double m_EstimatedPath; //! + //double m_AverageTime; //! + // Charged particle trajectory and optical photons generated in this radiator; private: std::vector m_Photons; std::vector m_Steps; - std::map m_StepBuffer; //! + std::map m_StepBuffer; //! #ifndef DISABLE_ROOT_IO ClassDef(RadiatorHistory, 1); diff --git a/include/ReconstructionFactory.h b/include/ReconstructionFactory.h new file mode 100644 index 0000000..f491152 --- /dev/null +++ b/include/ReconstructionFactory.h @@ -0,0 +1,99 @@ + +class TParticlePDG; + +#include "Calibration.h" +#include "Digitization.h" + +#ifndef _RECONSTRUCTION_FACTORY_ +#define _RECONSTRUCTION_FACTORY_ + +struct ReconstructionFactoryPlots { + ReconstructionFactoryPlots(); + ~ReconstructionFactoryPlots() {}; + + // Monte-Carlo plot(s); + TH1D *hnpe() const { return m_hnpe; }; + + // Reconstruction plots; + TH1D *hnhits() const { return m_hnhits; }; + TH1D *hccdftr() const { return m_hccdftr; }; + TH1D *hccdfev() const { return m_hccdfev; }; + TH1D *hdtph() const { return m_hdtph; }; + TH1D *hmatch() const { return m_hmatch; }; + +private: + TH1D *m_hnpe, *m_hnhits, *m_hccdftr, *m_hccdfev, *m_hdtph, *m_hmatch; +}; + +class ReconstructionFactory : public Digitization, public Calibration { + public: + ReconstructionFactory(const char *dfname = 0, const char *cfname = 0, const char *dname = 0); + ReconstructionFactory(CherenkovDetectorCollection *geometry, CherenkovDetector *cdet, CherenkovEvent *event); + virtual ~ReconstructionFactory() {}; + + void IgnoreTimingInChiSquare( void ) { m_UseTimingInChiSquare = false; }; + void IgnorePoissonTermInChiSquare( void ) { m_UsePoissonTermInChiSquare = false; }; + void SetSingleHitCCDFcut(double value) { m_SingleHitCCDFcut = value; }; + void RemoveAmbiguousHits( void ) { m_ResolveHitOwnership = false; }; + + int AddHypothesis(int pdg); + int AddHypothesis(const char *pdg); + + //void SetExperimentalMode( void ) { m_ExperimentalMode = true; }; + void IgnoreMcTruthPhotonDirectionSeed( void ) { m_UseMcTruthPhotonDirectionSeed = false; }; + + CherenkovEvent *GetEvent(unsigned ev, bool calibration = false); + + void SetQuietMode( void ) { m_VerboseMode = false; }; + + // Multi-particle case; + void ProcessHits(ChargedParticle *mcparticle, std::vector &hits, bool use_seed = false); + + CherenkovRadiator *UseInRingImaging(const char *name) { + if (!name) return 0; + + auto *radiator = GetMyRICH()->GetRadiator(name); + if (!radiator) return 0; + + radiator->UseInRingImaging(); + return radiator; + }; + + int VerifyEventStructure( void ); + + void InitializePlots( void ) { m_Plots = new ReconstructionFactoryPlots(); }; + ReconstructionFactoryPlots *Plots( void ) const { return m_Plots; }; + void DisplayStandardPlots(const char *cname, int wtopx, unsigned wtopy, unsigned wx, unsigned wy) const; + + void SetHitCountCutoff(unsigned value) { m_HitCountCutoff = value; }; + + private: + bool m_VerboseMode; + + // Whether use hit timing or not in the chi^2 logic, see below; + bool m_UseTimingInChiSquare; + // Hits with chi^2 built in a 2D space (theta mismatch and timing mismatch) or + // just 1D space (theta mismatch only) will be accepted as "good" ones if + // the respective CCDF is more than this number; + double m_SingleHitCCDFcut; + + // If true, keep at most one track owner for each hit; if false, delete + // hits, which would fit more than one track for a given combination of hypotheses; + bool m_ResolveHitOwnership; + + // Whether use Poisson in the chi^2 logic or not; + bool m_UsePoissonTermInChiSquare; + + bool /*m_ExperimentalMode,*/ m_UseMcTruthPhotonDirectionSeed; + + std::vector m_Hypotheses; + + ReconstructionFactoryPlots *m_Plots; + + unsigned m_HitCountCutoff; + + bool BeVerbose( void ) const { return m_VerboseMode; }; + void LaunchRingFinder(bool calibration); +}; + +#endif diff --git a/include/SinglePDF.h b/include/SinglePDF.h index 5d42aa7..1cada40 100644 --- a/include/SinglePDF.h +++ b/include/SinglePDF.h @@ -87,7 +87,15 @@ class VectorPDF: public TObject { } }; + void Reset( void ) { + for(auto member: m_Members) + delete member; + + m_Members.clear(); + }; + void AddMember(UniformPDF *pdf) { m_Members.push_back(pdf); }; + unsigned GetMemberCount( void ) const { return m_Members.size(); }; unsigned GetWithinRangeCount(double x, double dx = 0.0) const { unsigned ret = 0; @@ -115,6 +123,19 @@ class VectorPDF: public TObject { return (wtsum ? avg / wtsum : 0.0); }; + double GetAverage(double min, double max) const { + double avg = 0.0, wtsum = 0.0; + + for(auto member: m_Members) { + double value = member->GetAverage(); + if (value < min || value > max) continue; + + avg += member->GetWeight() * value;//member->GetAverage(); + wtsum += member->GetWeight(); + } //for member + + return (wtsum ? avg / wtsum : 0.0); + }; inline double GetRangeIntegral(double x0, double x1) const { double ret = 0.0; @@ -132,6 +153,11 @@ class VectorPDF: public TObject { return ret; }; + UniformPDF *GetMember(unsigned id) const { + return (id < m_Members.size() ? m_Members[id] : 0); + }; + const std::vector &GetMembers( void ) const { return m_Members; }; + private: std::vector m_Members; diff --git a/include/SphericalSurface.h b/include/SphericalSurface.h new file mode 100644 index 0000000..9cec9f2 --- /dev/null +++ b/include/SphericalSurface.h @@ -0,0 +1,51 @@ + +#include "ParametricSurface.h" + +#ifndef _IRT_SPHERICAL_SURFACE_ +#define _IRT_SPHERICAL_SURFACE_ + +class SphericalSurface: public ParametricSurface { + public: + SphericalSurface(): m_Concave(true), m_Radius(0.0) {}; + SphericalSurface(const TVector3 &x0, double r0, double umin = 0.0, double umax = M_PI, + double vmin = 0.0, double vmax = 2*M_PI): + ParametricSurface(x0, umin, umax, vmin, vmax), m_Concave(true), m_Radius(r0) {}; + ~SphericalSurface() {}; + + // FIXME: no range check?; + TVector3 GetSpacePoint(double theta, double phi) const { + TVector3 nn(sin(theta)*cos(phi), sin(theta)*sin(phi), cos(theta)); + return GetCenter() + m_Radius*nn; + }; + + TVector3 GetNormal(const TVector3 &xx) const { + return (m_Concave ? -1.0 : 1.0)*(xx - GetCenter()).Unit(); + }; + double GetRadius( void ) const { return m_Radius; }; + + bool GetCrossing(const TVector3 &x0, const TVector3 &n0, TVector3 *crs, bool check_normal = true) const; + double GetDistance(const TVector3 &xx) const; + + void SetConvex( void ) { m_Concave = false; }; + ParametricSurface *_Clone(double angle, const TVector3 &axis) const { + auto copy = new SphericalSurface(*this); + + copy->m_Center.Rotate(angle, axis); + + return copy; + }; + + // FIXME: for now ignore possible sphere piece rotations; + double GetU(const TVector3 &xx) const { return (xx - GetCenter()).Theta(); }; + double GetV(const TVector3 &xx) const { return (xx - GetCenter()).Phi(); }; + + private: + bool m_Concave; + double m_Radius; + +#ifndef DISABLE_ROOT_IO + ClassDef(SphericalSurface, 2); +#endif +}; + +#endif diff --git a/include/ToricSurface.h b/include/ToricSurface.h new file mode 100644 index 0000000..a5a599d --- /dev/null +++ b/include/ToricSurface.h @@ -0,0 +1,107 @@ + +#include "ParametricSurface.h" + +// +// Parameterization: R - major radius, r - donut tube radius; +// +// NB: this class is actually disfunctional (a crossing point with a straight line +// in 3D ends up with a quartic equation); +// + +#ifndef _IRT_TORIC_SURFACE_ +#define _IRT_TORIC_SURFACE_ + +class ToricSurface: public ParametricSurface { + public: + ToricSurface(): m_Concave(true), m_R(0.0), m_r(0.0), m_Alfa(0.0) {}; + ToricSurface(const TVector3 &x0, const TVector3 &nz, double R, double r, + double umin = 0.0, double umax = 2*M_PI, + double vmin = 0.0, double vmax = 2*M_PI): + ParametricSurface(x0, umin, umax, vmin, vmax), m_Concave(true), m_R(R), m_r(r) { + if (!m_Nz.x() && !m_Nz.y()) { + m_Alfa = 0.0; + m_Nr = TVector3(0,0,1); + } else { + auto axis = TVector3(0,0,1).Cross(m_Nz); + m_Alfa = axis.Mag(); + m_Nr = axis.Unit(); + } //if + + }; + ~ToricSurface() {}; + + // FIXME: no range check?; + TVector3 GetSpacePoint(double theta, double phi) const { + // Here theta is rotation angle around the tube, phi is rotation around the torus axis; + double x = (m_R + m_r*cos(theta))*cos(phi), y = (m_R + m_r*cos(theta))*sin(phi), z = m_r*sin(theta); + TVector3 local(x, y, z); + // FIXME: sign check; + local.Rotate(m_Alfa, m_Nr); + + return GetCenter() + local; + }; + + TVector3 GetNormal(const TVector3 &xx) const { + //assert(0); + auto dx = xx - GetCenter(); + // Rotate to align torus axis with (0,0,1); + dx.Rotate(-m_Alfa, m_Nr); + TVector3 pc(m_R, 0.0, 0.0); + pc.Rotate(dx.Phi(), TVector3(0,0,1)); + dx -= pc; + + // Rotate back; + dx.Rotate( m_Alfa, m_Nr); + + return (m_Concave ? -1.0 : 1.0)*dx.Unit(); + }; + //double GetRadius( void ) const { return m_Radius; }; + + bool GetCrossing(const TVector3 &x0, const TVector3 &n0, TVector3 *crs, bool check_normal = true) const; + double GetDistance(const TVector3 &xx) const; + + void SetConvex( void ) { m_Concave = false; }; + ParametricSurface *_Clone(double angle, const TVector3 &axis) const { + auto copy = new ToricSurface(*this); + + copy->m_Center.Rotate(angle, axis); + + copy->m_Nz.Rotate(angle, axis); + copy->m_Nr.Rotate(angle, axis); + + return copy; + }; + + // Theta; + double GetU(const TVector3 &xx) const { + auto dx = xx - GetCenter(); + // FIXME: sign check; + dx.Rotate(-m_Alfa, m_Nr); + dx.Rotate(-dx.Phi(), TVector3(0,0,1)); + TVector3 pc(m_R, 0.0, 0.0); + dx -= pc; + TVector2 qc(dx.X(), dx.Z()); + + // Is this phi definition the same as in GetSpacePoint()?; + return qc.Phi(); + }; + // Phi; + double GetV(const TVector3 &xx) const { + auto dx = xx - GetCenter(); + // FIXME: sign check; + dx.Rotate(-m_Alfa, m_Nr); + + return dx.Phi(); + }; + + private: + bool m_Concave; + TVector3 m_Nz, m_Nr; + double m_R, m_r, m_Alfa; + +#ifndef DISABLE_ROOT_IO + ClassDef(ToricSurface, 1); +#endif +}; + +#endif diff --git a/include/TransientParticle.h b/include/TransientParticle.h index d0d3cd0..d4f4cab 100644 --- a/include/TransientParticle.h +++ b/include/TransientParticle.h @@ -1,5 +1,6 @@ #include +#include #ifndef _TRANSIENT_PARTICLE_ #define _TRANSIENT_PARTICLE_ @@ -7,17 +8,33 @@ // Need a separate class because do not want to deal with G4VUserTrackInformation serialization; class TransientParticle: public TObject { public: - TransientParticle(int pdg): m_PDG(pdg) {}; + TransientParticle(int pdg, bool primary = true): m_PDG(pdg), m_VertexTime(0.0), + m_PrimaryParticle(primary) {}; ~TransientParticle() {}; virtual bool IsCharged( void ) const = 0; int GetPDG( void ) const { return m_PDG; }; + inline void SetVertexPosition(const TVector3 &position) { m_VertexPosition = position; }; + inline void SetVertexMomentum(const TVector3 &momentum) { m_VertexMomentum = momentum; }; + inline void SetVertexTime(double value) { m_VertexTime = value; }; + inline const TVector3 &GetVertexPosition( void ) const { return m_VertexPosition; }; + inline const TVector3 &GetVertexMomentum( void ) const { return m_VertexMomentum; }; + inline double GetVertexTime( void ) const { return m_VertexTime; }; + inline bool IsPrimary( void ) const { return m_PrimaryParticle; }; + private: int m_PDG; + // Vertex and 3D at birth as given by GEANT; + TVector3 m_VertexPosition, m_VertexMomentum; + + // Global time at birth; + double m_VertexTime; + + bool m_PrimaryParticle; #ifndef DISABLE_ROOT_IO - ClassDef(TransientParticle, 1); + ClassDef(TransientParticle, 4); #endif }; diff --git a/include/irtLinkDef.h b/include/irtLinkDef.h index 7e3ba84..f05c38c 100644 --- a/include/irtLinkDef.h +++ b/include/irtLinkDef.h @@ -21,6 +21,7 @@ #pragma link C++ class IRT+; #pragma link C++ class CherenkovRadiator+; +#pragma link C++ class CherenkovRadiatorCalibration+; #pragma link C++ class CherenkovDetector+; #pragma link C++ class CherenkovDetectorCollection+; #pragma link C++ class CherenkovEvent+; @@ -30,6 +31,9 @@ #pragma link C++ class ParametricSurface+; #pragma link C++ class SphericalSurface+; +#pragma link C++ class ToricSurface+; +#pragma link C++ class CylindricalSurface+; +#pragma link C++ class ConicalSurface+; #pragma link C++ class LocalCoordinatesXY+; #pragma link C++ class FlatSurface+; @@ -38,8 +42,10 @@ #pragma link C++ class SurfaceCopy+; #pragma link C++ class CherenkovMirror+; -#pragma link C++ class CherenkovMirrorGroup+; +//#pragma link C++ class CherenkovMirrorGroup+; #pragma link C++ class FlatMirror+; +#pragma link C++ class ConicalMirror+; +#pragma link C++ class CylindricalMirror+; #pragma link C++ class SphericalMirror+; #pragma link C++ class CherenkovPhotonDetector+; @@ -48,4 +54,6 @@ #pragma link C++ class std::pair+; #pragma link C++ class std::vector+; +#pragma link C++ class ReconstructionFactory+; + #endif diff --git a/source/Calibration.cc b/source/Calibration.cc new file mode 100644 index 0000000..2797531 --- /dev/null +++ b/source/Calibration.cc @@ -0,0 +1,380 @@ + +#include +#include +#include +#include + +#include "Calibration.h" +#include "CherenkovDetectorCollection.h" + +// FIXME: yes, fix it please; +static unsigned hdim = 100; +static double hmin = -30.0, hmax = 30.0, hbin = (hmax - hmin)/hdim, hwnd = 15.0; + +#define _SPE_THETA_RESOLUTION_DEFAULT_ (0.0040) + +// ------------------------------------------------------------------------------------- + +Calibration::Calibration(): + m_AutomaticCalibrationRequired(true),//false), + m_CurrentEvent(0), + m_UseActsTracking(true),//false), + m_DefaultSinglePhotonThetaResolution(_SPE_THETA_RESOLUTION_DEFAULT_) +{ + m_DatabasePDG = new TDatabasePDG(); + + memset(m_CalibrationBinStat, 0x00, sizeof(m_CalibrationBinStat)); +} // Calibration::Calibration() + +// ------------------------------------------------------------------------------------- + +CherenkovEvent *Calibration::GetNextEvent(bool calibration) +{ + if (m_CurrentEvent < GetInputTreeEntryCount()) + return GetEvent(m_CurrentEvent++, calibration); + else + return 0; +} // Calibration::GetNextEvent() + +// ------------------------------------------------------------------------------------- +#if _OBSOLETE_ +void Calibration::ImportTrackingSmearing(const char *ftheta, const char *fphi) +{ + std::map, std::pair> *sarr[2] = + {&m_ThetaSmearing, &m_PhiSmearing}; + const char *farr[2] = {ftheta, fphi}; + //std::map, std::pair> m_ThetaSmearing, m_PhiSmearing; + + for(unsigned iq=0; iq<2; iq++) { + auto fin = fopen(farr[iq], "r"); + + //float emin, emax, a, ea, b, eb; + float emin, emax, a, b;//ea, b, eb; + //unsigned lcounter = 0; + char buffer[1024]; + while (fgets(buffer, 1024-1, fin)) { + //-if (lcounter++ <= 1) continue; + //printf("%s", buffer); + + //sscanf(buffer, "%f %f %f %f %f %f", &emin, &emax, &a, &ea, &b, &eb); + sscanf(buffer, "%f %f %f %f", &emax, &emin, &a, &b);//ea, &b, &eb); + //printf("%f %f %f %f\n", emin, emax, a, b);//ea, b, eb); + + (*sarr[iq])[std::make_pair(emin, emax)] = std::make_pair(a, b); + } //while + } //fr iq + + //exit(0);// + //TVector3 p(0.0, 0.5, -5.0); + //GetTrackingSmearing(p); +} // Calibration::ImportTrackingSmearing() + +// ------------------------------------------------------------------------------------- + +std::pair Calibration::GetTrackingSmearing(double momentum, double eta) +{ + double dtheta = 0.0, dphi = 0.0, theta = 2*atan(exp(-eta)); + + // FIXME: very inefficient; + for(auto &entry: m_ThetaSmearing) + if (entry.first.first <= eta && eta <= entry.first.second) { + double A = entry.second.first, B = entry.second.second; + dtheta = 1E-3*sqrt(pow(A/momentum, 2) + B*B); + //printf("%f %f -> %f\n", entry.first.first, entry.first.second, dtheta); + + break; + } //for entry .. if + for(auto &entry: m_PhiSmearing) + if (entry.first.first <= eta && eta <= entry.first.second) { + double A = entry.second.first, B = entry.second.second; + dphi = 1E-3*sqrt(pow(A/momentum, 2) + B*B) * fabs(tan(theta));//momentum.Theta())); + //printf("%f\n", fabs(dphi * tan(momentum.Theta()))); + + break; + } //for entry .. if + + //printf("

= %8.3f [GeV/c], = %6.2f -> dtheta: %7.5f, dphi: %7.5f\n", + // momentum, eta, dtheta, dphi); + // Yes, make it simple for now; + //return sqrt(dtheta*dtheta + dphi*dphi); + return std::make_pair(dtheta, dphi);//*dtheta + dphi*dphi); +} // Calibration::GetTrackingSmearing() +#endif +// ------------------------------------------------------------------------------------- + +void Calibration::PerformCalibration(unsigned stat) +{ + unsigned nEvents = GetInputTreeEntryCount(); + unsigned evmax = stat ? (stat < nEvents ? stat : nEvents) : nEvents; + + // Reset the quantities for ALL radiators described in the detector geometry; + for(auto rptr: GetMyRICH()->Radiators()) { + auto radiator = rptr.second; + + radiator->SetGaussianSmearing(m_DefaultSinglePhotonThetaResolution); + + radiator->m_CalibrationPhotonCount = radiator->m_DetectedPhotonCount = 0; + + // Yes, clear the vector first, to be on a safe side; + radiator->m_Calibrations.clear(); + for(unsigned iq=0; iq<_THETA_BIN_COUNT_; iq++) { + radiator->m_Calibrations.push_back(CherenkovRadiatorCalibration()); + + // FIXME: getting the same pointer in a rather awkward way; + auto *calib = &radiator->m_Calibrations[iq]; + for(unsigned ir=0; irRadiators().size(); ir++) + calib->m_AverageRefractiveIndices.push_back(0.0); + } //for iq + } //for rptr + + memset(m_CalibrationBinStat, 0x00, sizeof(m_CalibrationBinStat)); + + // Assume that calibration only needs to be performed in eta bins, and particle + // eta at birth (at the IP) is representative enough (solenoidal field, radiators + // perpendicular to the beam axis); the rationale is: emitted + // (and detected!) Cherenkov photon spectrum shape to first order does not depend on + // either momentum or particle species, as long as we are far from the acceptance + // edge; FIXME: there the case is getting complicated, ignore for now; + { + double thmin = M_PI, thmax = 0.0; + + for(unsigned ev=0; evChargedParticles()) { + double theta = mcparticle->GetVertexMomentum().Theta(); + + if (theta < thmin) thmin = theta; + if (theta > thmax) thmax = theta; + + // FIXME: cannot be out of range, right?; + unsigned ibin = (unsigned)floor(theta / _THETA_BIN_WIDTH_); + m_CalibrationBinStat[ibin]++; + } //for mcparticle + } //for ev + } + + // First calculate average refractive index for all detected photons for every radiator; + for(unsigned ev=0; evChargedParticles()) { + for(auto rhptr: mcparticle->GetRadiatorHistory()) { + auto radiator = mcparticle->GetRadiator(rhptr); + auto history = mcparticle->GetHistory (rhptr); + + // FIXME: this is not dramatically efficient; + if (!GetMyRICH()->RadiatorRegistered(radiator)) continue; + + double theta = mcparticle->GetVertexMomentum().Theta(); + unsigned ibin = (unsigned)floor(theta / _THETA_BIN_WIDTH_); + + for(auto photon: history->Photons()) { + if (photon->IsUsefulForCalibration()) radiator->m_CalibrationPhotonCount++; + if (photon->WasDetected()) radiator->m_DetectedPhotonCount++; + + // Choose only (unused) photons, which follow the same QE(lambda) distribution as the + // detected ones, but did not make to be detected because of the efficiency cut; + if (!photon->IsUsefulForCalibration()) continue; + + auto *calib = &radiator->m_Calibrations[ibin]; + calib->m_Stat++; + //?calib->m_AverageRefractiveIndex += photon->GetVertexRefractiveIndex(); + //for(auto [name,rad]: GetMyRICH()->Radiators()) + { + auto vec = photon->StoredRefractiveIndices(); + + for(unsigned ir=0; irm_AverageRefractiveIndices[ir] += vec[ir]; + } + calib->m_AverageZvtx += photon->GetVertexPosition().Z(); + } //for photon + } //for radiator + } //for mcparticle + } //for ev + + // Well, this loop is also across ALL radiators (not just selected ones?); + for(auto rptr: GetMyRICH()->Radiators()) { + auto radiator = rptr.second; + + //printf("--> %s -> %d %d\n", rptr.first.Data(), radiator->m_CalibrationPhotonCount, radiator->m_DetectedPhotonCount); + + radiator->m_DetectedToCalibrationPhotonRatio = radiator->m_CalibrationPhotonCount ? + 1.0*radiator->m_DetectedPhotonCount/radiator->m_CalibrationPhotonCount : 0.0; + + for(auto &calib: radiator->m_Calibrations) + if (calib.m_Stat) { + for(unsigned ir=0; irRadiators()) { + auto radiator = rptr.second; + + for(auto &calib: radiator->m_Calibrations) + calib.m_hcalib = new TH1D("", "Cherenkov calibration angle (SPE)",hdim, hmin, hmax); + } //for rptr + + // Run full reconstruction chain on these events; 'true': calibration mode; + for(unsigned ev=0; evRadiators()) { + auto radiator = rptr.second; + + if (radiator->m_YieldStat) { + radiator->m_YieldCff /= radiator->m_YieldStat; + //printf("%4d %f\n", radiator->m_YieldStat, radiator->m_YieldCff); + } //if + } //for radiator + + for(auto rptr: GetMyRICH()->Radiators()) { + auto radiator = rptr.second; + + for(auto &calib: radiator->m_Calibrations) { + auto *hcalib = calib.m_hcalib; + //printf("Calibration: %4d entries\n", hcalib->GetEntries()); + if (!hcalib->GetEntries()) continue; + + int max = hcalib->GetMaximumBin(); + double mean = hmin + max*hbin; + TF1 fq("fq", "gaus(0)", mean - hwnd/2, mean + hwnd/2); + fq.SetParameters(1000, mean, 4.0); + hcalib->Fit("fq"); + double par[3]; + fq.GetParameters(par); + calib.m_Coffset = par[1] / 1000; + calib.m_Csigma = par[2] / 1000; + } //for calib + } //for radiator + + // Reset event counter; + m_CurrentEvent = 0; + } //if +} // Calibration::PerformCalibration() + +// ------------------------------------------------------------------------------------- + +void Calibration::CalibratePhotonEmissionPoints( void ) +{ + //printf("@C@ --> %ld\n", Event()->ChargedParticles().size()); + + for(auto mcparticle: Event()->ChargedParticles()) { + double theta = mcparticle->GetVertexMomentum().Theta(); + unsigned ibin = (unsigned)floor(theta / _THETA_BIN_WIDTH_); + double p = mcparticle->GetVertexMomentum().Mag(); + double m = m_DatabasePDG->GetParticle(mcparticle->GetPDG())->Mass(); + double beta = 1./sqrt(1. + pow(m/p, 2)); + + for(auto rhptr: mcparticle->GetRadiatorHistory()) { + auto history = mcparticle->GetHistory (rhptr); + auto radiator = mcparticle->GetRadiator(rhptr); + + // FIXME: this is not dramatically efficient; + if (!GetMyRICH()->RadiatorRegistered(radiator)) continue; + + double z0 = radiator->m_Calibrations[ibin].m_AverageZvtx; + + std::map dpoints, tpoints; + + if (m_UseActsTracking && history->StepCount()) { + for(unsigned iq=0; iqStepCount(); iq++) + history->m_AverageParentMomentum += history->GetStep(iq)->GetMomentum(); + + history->m_AverageParentMomentum *= 1./history->StepCount(); + } //if + + { + unsigned stat = 0; + + for(auto photon: history->Photons()) { + // Choose only (unused) photons, which follow the same QE(lambda) distribution as the + // detected ones, but did not make to be detected because of the efficiency cut; + if (!photon->IsUsefulForCalibration()) continue; + + if (!m_UseActsTracking) { + stat++; + history->m_AverageParentMomentum += photon->GetVertexParentMomentum(); + } //if + + // Ordered by distance from the most probable Z-vtx location; + dpoints[fabs(photon->GetVertexPosition().Z() - radiator->m_Calibrations[ibin].m_AverageZvtx)] = photon; + // Ordered along the trajectory; + tpoints[fabs(photon->GetVertexPosition().Z())] = photon; + } //for photon + + if (!m_UseActsTracking && stat) history->m_AverageParentMomentum *= 1./stat; + } + + if (dpoints.size() >= 2) { + auto *ph1 = (*dpoints.begin()).second, *ph2 = (*std::next(dpoints.begin())).second; + + double z1 = ph1->GetVertexPosition().Z(), z2 = ph2->GetVertexPosition().Z(); + double t1 = ph1->GetVertexTime(), t2 = ph2->GetVertexTime(); + double a = (t2 - t1) / (z2 - z1), t0 = t1 + a*(z0 - z1); + history->m_EstimatedPath = beta*300*t0; + } //if + + { + unsigned qstat = 0; + + for(auto it = tpoints.begin(); it != tpoints.end(); it++) { + auto next = std::next(it); + + if (next != tpoints.end()) { + auto &v1 = it->second->GetVertexPosition(), &v2 = next->second->GetVertexPosition(); + double z1 = v1.Z(), z2 = v2.Z(); + auto dv = (1/(z2 - z1)) * (v2 - v1); + + qstat++; + history->m_EstimatedVertex += v1 + (z0 - z1)*dv; + } //if + } //for it + + if (qstat) history->m_EstimatedVertex *= 1./qstat; + } + } //for radiator + } //for particle +} // Calibration::CalibratePhotonEmissionPoints() + +// ------------------------------------------------------------------------------------- + +void Calibration::UpdateYields( void ) +{ + for(auto mcparticle: Event()->ChargedParticles()) + for(auto rhptr: mcparticle->GetRadiatorHistory()) { + auto radiator = mcparticle->GetRadiator(rhptr); + + if (!radiator->UsedInRingImaging()) continue; + + // FIXME: should one also account for 0 stat cases?; + unsigned npe = mcparticle->GetRecoCherenkovPhotonCount (radiator); + double mctheta = mcparticle->GetMocaCherenkovAverageTheta(radiator); + + radiator->m_YieldStat++; + // No matter what the particle type it was, yield scales with npe ~ sin^2(theta); + radiator->m_YieldCff += npe ? npe / pow(sin(mctheta), 2) : 0.0; + } //for mcparticle +} // Calibration:UpdateYields() + +// ------------------------------------------------------------------------------------- + +void Calibration::ExportModifiedOpticsFile(const char *fname) +{ + auto *fout = new TFile(fname, "RECREATE"); + if (!fout) return; + + fout->cd(); + GetIrtGeometry()->Write(); + + fout->Close(); +} // Calibration::ExportModifiedOpticsFile() + +// ------------------------------------------------------------------------------------- diff --git a/source/ChargedParticle.cc b/source/ChargedParticle.cc index fa194b9..55f3e0e 100644 --- a/source/ChargedParticle.cc +++ b/source/ChargedParticle.cc @@ -7,149 +7,88 @@ // information about which photn was produced in which radiator; // +#include + #include "ChargedParticle.h" // ------------------------------------------------------------------------------------- -void ChargedParticle::PIDReconstruction(CherenkovPID &pid) +double ChargedParticle::GetRecoCherenkovPhotonTheta(unsigned id) +{ + if (id >= m_Hits.size()) + return -1.0; + else + return m_Hits[id]->m_Solutions[this].m_Best->GetTheta(); +} // ChargedParticle::GetRecoCherenkovPhotonTheta() + +// ------------------------------------------------------------------------------------- + +double ChargedParticle::GetRecoCherenkovPhotonPhi(unsigned id) +{ + if (id >= m_Hits.size()) + return -1.0; + else + return m_Hits[id]->m_Solutions[this].m_Best->GetPhi(); +} // ChargedParticle::GetRecoCherenkovPhotonPhi() + +// ------------------------------------------------------------------------------------- + +double ChargedParticle::GetRecoCherenkovAverageTheta(CherenkovRadiator *radiator) { - std::vector photons; - - // Mix all photons together; - for(auto rhistory: GetRadiatorHistory()) - for(auto photon: GetHistory(rhistory)->Photons()) - photons.push_back(photon); - - for(auto photon: photons) - photon->_m_Selected.clear();// = false; - - // Loop through all of the photons recorded in all radiators; apply IRT on a fixed grid - // of emission vertex locations and build kind of a PDF out of that to calculate weights; - // this approach may not be dramatically efficient, but it would 1) work in case of the - // magnetic field bending, 2) allow easy extention to a dRICH case where each mass - // hypothesis would evaluate each of the detected photons on the aerogel and gas grids - // independently and build a sum of their PDFs without much thinking about outlier photon - // rejection, average theta calculation and such; - for(auto photon: photons) { - if (!photon->WasDetected()) continue; - - auto pd = photon->GetPhotonDetector(); - const auto irt = pd->GetIRT(photon->GetVolumeCopy()); - if (!irt) { - printf("No photosensor with this cellID found!\n"); - continue; - } //if - - for(auto rhistory: GetRadiatorHistory()) { - auto radiator = GetRadiator(rhistory); - unsigned zdim = radiator->GetTrajectoryBinCount(); - if (radiator->m_Locations.size() != zdim+1) continue; - - TVector3 phx = photon->GetDetectionPosition(); - - // Get effective attenuation length for this radiator, as well as the - // parameterization of its rear surface in this particular sector; this is - // not really a clean procedure for dRICH aerogel, but should be good enough - // in most part of the cases; - double attenuation = radiator->GetReferenceAttenuationLength(); - auto rear = radiator->GetRearSide(irt->GetSector());//photon->GetVolumeCopy()); - - { - bool all_converged = true; - IRTSolution solutions[zdim+1]; - double weights[zdim+1]; - for(unsigned iw=0; iwm_Phi[radiator] = 0.0; - - for(unsigned iq=0; iqSolve(radiator->m_Locations[iq].first, - // FIXME: give beam line as a parameter; - radiator->m_Locations[iq].second.Unit(), phx, TVector3(0,0,1), false); - if (!solution.Converged()) { - all_converged = false; - break; - } //if - - photon->m_Phi[radiator] += solution.GetPhi(); - - if (attenuation) { - TVector3 from = radiator->m_Locations[iq].first, to; - bool ok = rear->GetCrossing(from, solution.m_Direction, &to); - if (ok) { - double length = (to - from).Mag(); - //printf("%02d -> %7.2f\n", iq, radiator->m_Locations[iq].first.z()); - //weights[iq] = 1.0; - weights[iq] = exp(-length / attenuation); - } //if - } else - weights[iq] = 1.0; - } //for iq - - if (!all_converged) continue; - - photon->m_Phi[radiator] /= (zdim+1); - - for(unsigned iq=0; iq_m_PDF[radiator].AddMember(new UniformPDF(s0.GetTheta(), s1.GetTheta(), 1.0)); - //printf("%2d -> %7.3f\n", iq, weights[iq]); - photon->_m_PDF[radiator].AddMember(new UniformPDF(s0.GetTheta(), s1.GetTheta(), - (weights[iq] + weights[iq+1])/2));//1.0)); - //printf("attenuation=%f weight=%f\n",attenuation,(weights[iq] + weights[iq+1])/2); - //photon->_m_PDF[radiator].AddMember(new UniformPDF(s0.GetTheta(), s1.GetTheta(), fabs(cos(s0.GetPhi())))); - } //for iq - } - } //for rhistory - } //for photon - - // And now that IRT is performed on a grid of possible emission vertex locations, - // populate the requested mass hypothesis array; - for(unsigned ih=0; ihGetMass(); - - // Reset photon count and weight; - hypothesis->Reset(); + unsigned stat = 0; + double sum = 0.0; + + for(auto hit: m_Hits) { + auto solution = hit->m_Solutions[this].m_Best; + if (radiator && hit->m_Solutions[this].GetRadiator() != radiator) continue; - for(auto rhistory: GetRadiatorHistory()) { - auto radiator = GetRadiator(rhistory); - unsigned zdim = radiator->GetTrajectoryBinCount(); - if (radiator->m_Locations.size() != zdim+1) continue; - - // Asume this estimate is good enough; - double pp = radiator->m_Locations[0].second.Mag(); - double arg = sqrt(pp*pp + m*m)/(radiator->m_AverageRefractiveIndex*pp); - // Threshold check; FIXME: do it better?; - if (fabs(arg) > 1.0) continue; - - { - double theta = acos(arg), dth = radiator->GetSmearing(); - bool gaussian = radiator->UseGaussianSmearing(); - // +/-3 sigma; FIXME: do it better later; - if (gaussian) dth *= 3; - - for(auto photon: photons) { - if (!photon->WasDetected()) continue; - - auto pdf = &photon->_m_PDF[radiator]; - - // FIXME: unreadable; - auto within_range = float(pdf->GetWithinRangeCount(theta, dth)); - //if (within_range) photon->m_Selected = true; - if (within_range) photon->_m_Selected.insert(std::make_pair(ih, radiator));// = true; - - hypothesis->IncrementWeight(radiator, within_range/zdim, - (dth ? (gaussian ? pdf->GetGaussianIntegral(theta,dth) : - pdf->GetRangeIntegral(theta - dth, theta + dth)) : - pdf->GetValue(theta))/zdim); - } //for photon - } - } //for rhistory - } //for ih -} // ChargedParticle::PIDReconstruction() + stat++; + sum += solution->GetTheta(); + } //for hit + + if (stat) sum /= stat; + + return sum; +} // ChargedParticle::GetRecoCherenkovAverageTheta() + +// ------------------------------------------------------------------------------------- + +double ChargedParticle::GetMocaCherenkovAverageTheta(CherenkovRadiator *radiator) +{ + unsigned stat = 0; + double sum = 0.0; + + for(auto rhptr: GetRadiatorHistory()) { + auto rptr = GetRadiator(rhptr); + + if (rptr != radiator) continue; + + for(auto photon: GetHistory(rhptr)->Photons()) { + auto n1 = photon->GetVertexParentMomentum().Unit(), n2 = photon->GetVertexMomentum().Unit(); + + stat++; + sum += acos(n1.Dot(n2)); + } //for photon + } //for rhptr + + if (stat) sum /= stat; + + return sum; +} // ChargedParticle::GetMocaCherenkovAverageTheta() + +// ------------------------------------------------------------------------------------- + +unsigned ChargedParticle::GetRecoCherenkovPhotonCount(CherenkovRadiator *radiator) +{ + unsigned stat = 0; + + for(auto hit: m_Hits) { + if (radiator && hit->m_Solutions[this].GetRadiator() != radiator) continue; + + stat++; + } //for hit + + return stat; +} // ChargedParticle::GetRecoCherenkovPhotonCount() // ------------------------------------------------------------------------------------- diff --git a/source/CherenkovRadiator.cc b/source/CherenkovRadiator.cc new file mode 100644 index 0000000..480f4b3 --- /dev/null +++ b/source/CherenkovRadiator.cc @@ -0,0 +1,87 @@ + +#include +#include +#include + +#include "CherenkovRadiator.h" + +// ------------------------------------------------------------------------------------- + +CherenkovRadiatorPlots::CherenkovRadiatorPlots(const char *tag): + m_Tag(tag), + m_hvtx(0), + m_hri(0), + m_hthtr(0) +{ + m_hnpe = new TH1D((TString("npe") + tag).Data(), "Detected MC photons per track", 60, 0.0, 60.0); + m_hwl = new TH1D((TString("wl") + tag).Data(), "Wave Length", 200, 200.0, 1000.0); + m_hwl->GetXaxis()->SetTitle("[nm]"); + + m_hnhits = new TH1D((TString("nhits") + tag).Data(), "Used digitized hits per track", 60, 0.0, 60.0); + m_hthph = new TH1D((TString("thph") + tag).Data(), "Cherenkov angle offset (photons)", 100, -20.0, 20.0); + m_hthph->GetXaxis()->SetTitle("[mrad]"); + m_hccdfph = new TH1D((TString("ccdfph") + tag).Data(), "Single photon chi^2 CCDF", 50, 0.0, 1.0); + m_hccdfph->SetMinimum(0); +} // CherenkovRadiatorPlots::CherenkovRadiatorPlots() + +// ------------------------------------------------------------------------------------- + +void CherenkovRadiatorPlots::SetRefractiveIndexRange(double min, double max) +{ + if (m_hri) { + delete m_hri; + m_hri = 0; + } //if + + m_hri = new TH1D((TString("ri") + m_Tag).Data(), "Refractive Index - 1.0", 500, min - 1.0, max - 10.); + m_hri->GetXaxis()->SetNdivisions(408); +} // CherenkovRadiatorPlots::SetRefractiveIndexRange() + +// ------------------------------------------------------------------------------------- + +void CherenkovRadiatorPlots::SetPhotonVertexRange(double min, double max) +{ + if (m_hvtx) { + delete m_hvtx; + m_hvtx = 0; + } //if + + m_hvtx = new TH1D((TString("vtx") + m_Tag).Data(), "Emission point", 100, min, max); + m_hvtx->GetXaxis()->SetTitle("[mm]"); + m_hvtx->GetXaxis()->SetNdivisions(408); +} // CherenkovRadiatorPlots::SetRefractiveIndexRange() + +// ------------------------------------------------------------------------------------- + +void CherenkovRadiatorPlots::SetCherenkovAngleRange(double min, double max) +{ + if (m_hthtr) { + delete m_hthtr; + m_hthtr = 0; + } //if + + m_hthtr = new TH1D((TString("thtr") + m_Tag).Data(), "Cherenkov angle (tracks)", 100, min, max); + m_hthtr->GetXaxis()->SetTitle("[mrad]"); +} // CherenkovRadiatorPlots::SetCherenkovAngleRange() + +// ------------------------------------------------------------------------------------- + +void CherenkovRadiator::DisplayStandardPlots(const char *cname, int wtopx, + unsigned wtopy, unsigned wx, unsigned wy) const +{ + if (!Plots()) return; + + auto cv = new TCanvas("", cname, wtopx, wtopy, wx, wy); + cv->Divide(4, 2); + + cv->cd(1); if (Plots()->hvtx()) Plots()->hvtx() ->Draw(); + cv->cd(2); Plots()->hnpe() ->Draw(); + cv->cd(3); Plots()->hwl() ->Draw(); + cv->cd(4); if (Plots()->hri()) Plots()->hri() ->Draw(); + cv->cd(5); Plots()->hthph() ->Fit("gaus"); + cv->cd(6); Plots()->hnhits() ->Draw(); + cv->cd(7); Plots()->hccdfph()->Draw(); + cv->cd(8); Plots()->hthtr() ->Fit("gaus"); +} // CherenkovRadiator::DisplayStandardPlots() + +// ------------------------------------------------------------------------------------- diff --git a/source/ConicalSurface.cc b/source/ConicalSurface.cc new file mode 100644 index 0000000..733d645 --- /dev/null +++ b/source/ConicalSurface.cc @@ -0,0 +1,32 @@ + +#include + +#include "ConicalSurface.h" + +// ------------------------------------------------------------------------------------- + +bool ConicalSurface::GetCrossing(const TVector3 &x0, const TVector3 &n0, TVector3 *crs, + bool check_normal) const +{ + TVector3 dx = x0 - GetCenter(); + TVector3 nc = m_Nz, A = dx - dx.Dot(nc)*nc, B = n0 - n0.Dot(nc)*nc; + double Aq = m_Rc + m_Slope*dx.Dot(nc), Bq = m_Slope*n0.Dot(nc); + double a = B.Mag2() - Bq*Bq, b = 2*(A.Dot(B) - Aq*Bq), c = A.Mag2() - Aq*Aq; + + return GetQuadraticEquationCaseCrossing(x0, n0, crs, check_normal, a, b, c); +} // ConicalSurface::GetCrossing() + +// ------------------------------------------------------------------------------------- + +double ConicalSurface::GetDistance(const TVector3 &xx) const +{ + assert(0); + auto dx = xx - GetCenter(); + double dz = dx.Dot(m_Nz); + dx -= dx.Dot(m_Nz)*m_Nz; + double r = dx.Mag(), rc = m_Rc + dz*m_Slope, dr = fabs(r - rc); + + return dr*cos(atan(m_Slope)); +} // ConicalSurface::GetDistance() + +// ------------------------------------------------------------------------------------- diff --git a/source/CylindricalSurface.cc b/source/CylindricalSurface.cc new file mode 100644 index 0000000..592f4d8 --- /dev/null +++ b/source/CylindricalSurface.cc @@ -0,0 +1,29 @@ + +#include + +#include "CylindricalSurface.h" + +// ------------------------------------------------------------------------------------- + +bool CylindricalSurface::GetCrossing(const TVector3 &x0, const TVector3 &n0, TVector3 *crs, + bool check_normal) const +{ + TVector3 dx = x0 - GetCenter(); + TVector3 nc = m_Nz, A = dx - dx.Dot(nc)*nc, B = n0 - n0.Dot(nc)*nc; + double a = B.Mag2(), b = 2*A.Dot(B), c = A.Mag2() - pow(m_Radius, 2); + + return GetQuadraticEquationCaseCrossing(x0, n0, crs, check_normal, a, b, c); +} // CylindricalSurface::GetCrossing() + +// ------------------------------------------------------------------------------------- + +double CylindricalSurface::GetDistance(const TVector3 &xx) const +{ + assert(0); + auto dx = xx - GetCenter(); + dx -= dx.Dot(m_Nz)*m_Nz; + + return fabs(dx.Mag() - m_Radius); +} // CylindricalSurface::GetDistance() + +// ------------------------------------------------------------------------------------- diff --git a/source/Digitization.cc b/source/Digitization.cc new file mode 100644 index 0000000..9418a58 --- /dev/null +++ b/source/Digitization.cc @@ -0,0 +1,158 @@ + +#include + +#include "CherenkovDetector.h" + +#include "GeantImport.h" +#include "Digitization.h" + +// Kind of digitization; may want to comment out (or set very fine) for debugging; +#define _SENSOR_ACTIVE_AREA_PIXELLATION_DEFAULT_ (32) + +// Timing digitization in [ns]; +#define _SINGLE_PHOTON_TIMING_RESOLUTION_DEFAULT_ (0.050) + +// ------------------------------------------------------------------------------------- + +Digitization::Digitization(): + // '0' means: shut down pad by pad, without summing up (which is kind of not ideal); + m_BlackoutBlowupValue(0), + m_SinglePhotonTimingResolution(_SINGLE_PHOTON_TIMING_RESOLUTION_DEFAULT_), + m_SensorActiveAreaPixellation(_SENSOR_ACTIVE_AREA_PIXELLATION_DEFAULT_) +{ +} // Digitization::Digitization() + +// ------------------------------------------------------------------------------------- + +CherenkovRadiator *Digitization::AddBlackoutRadiator(const char *rname) { + auto radiator = GetMyRICH()->GetRadiator(rname); + + if (radiator) m_BlackoutRadiators.insert(radiator); + + return radiator; +} // Digitization::AddBlackoutRadiator() + +// ------------------------------------------------------------------------------------- + +void Digitization::ProduceDigitizedHits(bool calibration) +{ + // First mix all photons from all particles and "digitize" them; FIXME: add stray background; + // NB: first iteration makes use of the "calibration" photons, for various purposes; the second + // one deals with the "real" (detected) ones; + for(unsigned itr=0; itr<2; itr++) { + for(auto mcparticle: Event()->ChargedParticles()) + for(auto rhptr: mcparticle->GetRadiatorHistory()) { + auto radiator = mcparticle->GetRadiator(rhptr); + + for(auto photon: mcparticle->GetHistory(rhptr)->Photons()) { + // FIXME: for now assume a single photosensor type per detector; + //+auto pd = photon->GetPhotonDetector(); + auto pd = GetMyRICH()->m_PhotonDetectors[0]; + + // In the first iteration select "calibration" photons no matter the "calibration" + // argument was "true" or "false"; avoid as a plague using "real" photons for any + // of the calibration business; + if (!itr && !photon->IsUsefulForCalibration()) continue; + // In the second one digitize either the "real" or "calibration" photons; + if ( itr && !photon->WasDetected() && !calibration) continue; + if ( itr && !photon->IsUsefulForCalibration() && calibration) continue; + + // + // This is a bit misleading: ALL "real" photons in the radiators will be used; essentially + // this is the last place where individual photons are available; FIXME: may want to keep + // participating photon pointers in the DigitizedHit class, and populate this histogram later, + // using only the hits which were attached to one of the tracks in the PID hypothesis + // combination with the minimal chi^2; + // + + { + DigitizedHit hit, *duplicate = 0; + + hit.m_PhotonDetector = pd; + hit.m_Copy = photon->GetVolumeCopy(); + + TVector3 phx = photon->GetDetectionPosition(); + unsigned isec = GetMyRICH()->GetSector(phx); + hit.m_IRTs = pd->GetIRTs(isec, photon->GetVolumeCopy()); + if (!hit.m_IRTs) { + printf("No photosensor with this cellID (%8lX) found!\n", photon->GetVolumeCopy()); + continue; + } //if + + if (m_SensorActiveAreaPixellation) { + double size = pd->GetActiveAreaSize(), half = size/2; + // All IRTs are terminated at the photosensor; '0': use the first one; extract 3D + // parameterization of this particular photosensor; + auto sensor = dynamic_cast((*hit.m_IRTs)[0]->tail()->GetSurface()); + double lx = sensor->GetLocalX(phx)/* + half*/, ly = sensor->GetLocalY(phx)/* + half*/; + // Assume 1um out is not an issue; + if (fabs(lx) > half + 1E-3 || fabs(ly) > half + 1E-3) { + printf("ERROR: hit outside of the sensor active area: %15.10f %15.10f!\n", lx, ly); + continue;//goto _next_hit; + } //if + lx += half; ly += half;//sensor->GetLocalY(phx) + half; + + // Smear the coordinate measurement (call it digitization :-); + double pitch = size / m_SensorActiveAreaPixellation, x0 = -half, y0 = -half; + hit.m_iX = (int)floor(lx/pitch); + hit.m_iY = (int)floor(ly/pitch); + // Correct for a possible out of range problem (see above); + if (hit.m_iX < 0) hit.m_iX = 0; + if (hit.m_iX >= (int)m_SensorActiveAreaPixellation) hit.m_iX = m_SensorActiveAreaPixellation - 1; + if (hit.m_iY < 0) hit.m_iY = 0; + if (hit.m_iY >= (int)m_SensorActiveAreaPixellation) hit.m_iY = m_SensorActiveAreaPixellation - 1; + double dx = pitch*(hit.m_iX + 0.5), dy = pitch*(hit.m_iY + 0.5); + + phx = sensor->GetSpacePoint(x0 + dx, y0 + dy); + + // FIXME: very inefficient; + for(auto &ptr: m_Hits) + if (ptr.m_PhotonDetector == pd && ptr.m_Copy == hit.m_Copy && + ptr.m_iX == hit.m_iX && ptr.m_iY == hit.m_iY) { + duplicate = &ptr; + break; + } //for ptr .. if + } //if + + { + unsigned div = 0x1 << m_BlackoutBlowupValue; + + switch (itr) { + case 0: + if (m_BlackoutRadiators.find(radiator) != m_BlackoutRadiators.end()) + // NB: this lookup table is global for a given event, namely it is built on the + // event-level (for all tracks at once rather than on a track-by-track basis); + m_BlackoutCells.insert(BlackoutCell(pd, hit.m_Copy, hit.m_iX/div, hit.m_iY/div)); + break; + case 1: + // FIXME: this comparison is inefficient; + if (m_BlackoutCells.find(BlackoutCell(pd, hit.m_Copy, hit.m_iX/div, hit.m_iY/div)) == m_BlackoutCells.end()) { + (duplicate ? duplicate : &hit)->m_DirectionSeeds.push_back(photon->GetVertexMomentum().Unit()); + // Convert to [ps]; + double timing = photon->GetDetectionTime() + + (m_SinglePhotonTimingResolution ? m_rndm.Gaus(0.0, m_SinglePhotonTimingResolution) : 0.0); + (duplicate ? duplicate : &hit)->m_DetectionTimes.push_back(timing); + + if (!duplicate) { + // NB: in case of digitization, for duplicate hits this setting will be identical; + hit.m_DetectionPosition = phx; + + m_Hits.push_back(hit); + } //if + } //if + else + // Would not hurt to set individual blackout flag as well for those photons which + // were "too close" on the sensor matrix to the ones produce in the window or in the + // gas radiator; what is important though is that such photons will not produce ***hits*** + // for ring imaging purposes; + photon->SetBlackoutFlag(); + break; + } //switch + } + } + } //for photon + } //for particle..rhistory + } //for itr +} // Digitization::ProduceDigitizedHits() + +// ------------------------------------------------------------------------------------- diff --git a/source/DigitizedHit.cc b/source/DigitizedHit.cc new file mode 100644 index 0000000..ef0bf99 --- /dev/null +++ b/source/DigitizedHit.cc @@ -0,0 +1,7 @@ + +#include "DigitizedHit.h" + + +// ------------------------------------------------------------------------------------- + +// ------------------------------------------------------------------------------------- diff --git a/source/FlatSurface.cc b/source/FlatSurface.cc index 348183b..a6ab38c 100644 --- a/source/FlatSurface.cc +++ b/source/FlatSurface.cc @@ -1,5 +1,5 @@ -#include "ParametricSurface.h" +#include "FlatSurface.h" // ------------------------------------------------------------------------------------- diff --git a/source/GeantImport.cc b/source/GeantImport.cc new file mode 100644 index 0000000..7ba93d0 --- /dev/null +++ b/source/GeantImport.cc @@ -0,0 +1,52 @@ + +#include + +#include "CherenkovDetectorCollection.h" +#include "CherenkovEvent.h" +#include "GeantImport.h" + +// ------------------------------------------------------------------------------------- + +GeantImport::GeantImport(const char *dfname, const char *cfname, const char *dname): + m_Tree(0), + m_IrtGeometry(0), + m_RICH(0), + m_Event(0), + m_PurgeSecondaries(true), + m_MomentumCutoff(_MOMENTUM_CUTOFF_DEFAULT_)//0.010) +{ + // FIXME: exception handling; + if (!dfname || !dname) return; + + auto fcfg = new TFile(cfname ? cfname : dfname); + if (!fcfg) return; + m_IrtGeometry = dynamic_cast(fcfg->Get("CherenkovDetectorCollection")); + auto fdata = new TFile(dfname); + m_Tree = dynamic_cast(fdata->Get("t")); + m_Tree->SetBranchAddress("e", &m_Event); + + m_RICH = m_IrtGeometry->GetDetector(dname); + + m_Event = new CherenkovEvent(); +} // GeantImport::GeantImport() + +// ------------------------------------------------------------------------------------- + +void GeantImport::GetInputTreeEntry(unsigned ev) const +{ + if (!m_Tree) return; + + m_Tree->GetEntry(ev); + + if (m_PurgeSecondaries) { + auto &particles = m_Event->ChargedParticles(); + + for(auto it = particles.begin(); it != particles.end(); ) + if (!(*it)->IsPrimary() || (*it)->GetVertexMomentum().Mag() < m_MomentumCutoff) + it = particles.erase(it); + else + it++; + } //if +} // GeantImport::GetInputTreeEntry() + +// ------------------------------------------------------------------------------------- diff --git a/source/IRT.cc b/source/IRT.cc index 3b90b2f..2ff4c46 100644 --- a/source/IRT.cc +++ b/source/IRT.cc @@ -6,10 +6,12 @@ thread_local TVector3 OpticalBoundary::m_OutgoingDirection; // ------------------------------------------------------------------------------------- -bool IRT::Transport(const TVector3 &xfrom, const TVector3 &nfrom) +bool IRT::Transport(const TVector3 &xfrom, const TVector3 &nfrom, double *length) { bool transport_in_progress = false; TVector3 x0 = xfrom, n0 = nfrom; + if (length) *length = 0.0; + // Just go through the optical boundaries, and calculate either reflection // or refraction on that particular surface; for(unsigned iq=0; iq<_m_OpticalBoundaries.size(); iq++) { @@ -31,19 +33,25 @@ bool IRT::Transport(const TVector3 &xfrom, const TVector3 &nfrom) } //if transport_in_progress = true; + if (length) { + auto *radiator = prev ? prev->GetRadiator() : 0; + + *length += (boundary->m_ImpactPoint - x0).Mag()*(radiator ? radiator->n() : 1.0); + } //if + boundary->m_IncomingDirection = (boundary->m_ImpactPoint - x0).Unit(); TVector3 ns = surface->GetNormal(boundary->m_ImpactPoint); TVector3 na = ns.Cross(boundary->m_IncomingDirection); boundary->m_OutgoingDirection = boundary->m_IncomingDirection; - // Must be the sensor dump; FIXME:: do this check better; + // Must be the sensor dump; FIXME: do this check better; if (!boundary->m_Radiator.GetObject()) return true; if (boundary->m_Refractive) { // Will not be able to determine the refractive index; if (!prev) return false; double n1 = prev->GetRadiator()->n(), n2 = boundary->GetRadiator()->n(); - + // Refraction; check that the refractive indices are different; if (n1 != n2) { double theta1 = acos(boundary->m_IncomingDirection.Dot(-1*ns)); @@ -70,10 +78,9 @@ bool IRT::Transport(const TVector3 &xfrom, const TVector3 &nfrom) IRTSolution IRT::Solve(const TVector3 &xfrom, const TVector3 &nfrom, const TVector3 &xto, const TVector3 &beam, bool derivatives, const IRTSolution *seed) -{ +{ IRTSolution solution; if (!_m_OpticalBoundaries.size()) return solution; - //return solution; // Simplify the situation for now: assume a single flat surface at the end; auto sensor = dynamic_cast(tail()->m_Surface); @@ -81,7 +88,7 @@ IRTSolution IRT::Solve(const TVector3 &xfrom, const TVector3 &nfrom, const TVect // XY in the local sensor coordinate system; double m0[2] = {sensor->GetLocalX(xto), sensor->GetLocalY(xto)}; - + return Solve(xfrom, nfrom, m0, beam, derivatives, seed); } // IRT::Solve() @@ -90,11 +97,9 @@ IRTSolution IRT::Solve(const TVector3 &xfrom, const TVector3 &nfrom, const TVect IRTSolution IRT::Solve(const TVector3 &xfrom, const TVector3 &nfrom, const double m0[2], const TVector3 &beam, bool derivatives, const IRTSolution *seed) { - //printf("Here-1!\n"); - IRTSolution solution; if (seed) solution = *seed; + IRTSolution solution; if (seed) solution.Set(seed); if (!_m_OpticalBoundaries.size()) return solution; - //printf("Here-2!\n"); // Simplify the situation for now: assume a single flat surface at the end; auto sensor = dynamic_cast(tail()->m_Surface); if (!sensor) return solution; @@ -103,28 +108,29 @@ IRTSolution IRT::Solve(const TVector3 &xfrom, const TVector3 &nfrom, const doubl // to shoot; since the refraction on aerogel/C2F6 boundary kicks propagation out of 2D, // and there can be an additional flat mirror installed, there is no good reason to // try solving the initial approximation analytically; - if (!seed) solution.m_Theta = nfrom.Theta(); solution.m_Phi = nfrom.Phi(); + if (!seed) { + solution.m_Theta = nfrom.Theta(); + solution.m_Phi = nfrom.Phi(); + } //if - //printf("Here-3!\n"); for(unsigned itr=0; ; itr++ ) { - //printf("Here-4!\n"); + double length; if (itr == m_IterationLimit) return solution; { auto nn = TVector3(sin(solution.m_Theta)*cos(solution.m_Phi), sin(solution.m_Theta)*sin(solution.m_Phi), cos(solution.m_Theta)); - if (!Transport(xfrom, nn)) return solution; + if (!Transport(xfrom, nn, &length)) return solution; } - //printf("Here-5!\n"); double mc[2] = {sensor->GetLocalX(tail()->m_ImpactPoint), sensor->GetLocalY(tail()->m_ImpactPoint)}; // Check the transported-to-measured 2D distance; if it is small enough, return; { double dist = sqrt(pow(mc[0] - m0[0], 2) + pow(mc[1] - m0[1], 2)); - //printf("%10.4f\n", dist); - + if (dist < m_Precision) { solution.m_Converged = true; + solution.m_Length = length; { double slope = acos(nfrom.Dot(beam)); @@ -136,7 +142,8 @@ IRTSolution IRT::Solve(const TVector3 &xfrom, const TVector3 &nfrom, const doubl nn.Rotate(slope, axis); solution.m_Theta = nn.Theta(); - solution.m_Phi = nn.Phi(); + // Yes, as of 2023/03/02 subtract the changed particle phi angle; + solution.m_Phi = nn.Phi() - nfrom.Phi(); //printf(" -> %7.2f [mrad], %7.2f [degree]\n", 1000*solution.m_Theta, (180/M_PI)*solution.m_Phi); } @@ -166,23 +173,6 @@ IRTSolution IRT::Solve(const TVector3 &xfrom, const TVector3 &nfrom, const doubl if (s0.Converged() && s1.Converged()) solution.m_DtDz = (s1.m_Theta - s0.m_Theta)/(2*_IRT_DERIVATIVE_XYZ_STEP_); } -#if _WRONG_ - { - // Assume that I'm mostly interested in the refractive index variation in the - // media where the photon was created; - auto radiator = derivatives; - double nref = radiator->n(), step = (nref - 1.0)*_IRT_DERIVATIVE_NNN_STEP_; - radiator->SetReferenceRefractiveIndex(nref - step); - auto s0 = Solve(xfrom, nfrom, m0, beam, 0, &solution); - radiator->SetReferenceRefractiveIndex(nref + step); - auto s1 = Solve(xfrom, nfrom, m0, beam, 0, &solution); - if (s0.Converged() && s1.Converged()) - solution.m_DtDn = (s1.m_Theta - s0.m_Theta)/(2*step); - - // Restore the original value; - radiator->SetReferenceRefractiveIndex(nref); - } -#endif // And eventually calculate a quadratic error estimate; //solution.CalculateSigmaThetaEstimate(); diff --git a/source/ParametricSurface.cc b/source/ParametricSurface.cc new file mode 100644 index 0000000..1f00aae --- /dev/null +++ b/source/ParametricSurface.cc @@ -0,0 +1,36 @@ + +#include "ParametricSurface.h" + +// ------------------------------------------------------------------------------------- + +bool ParametricSurface::GetQuadraticEquationCaseCrossing(const TVector3 &x0, const TVector3 &n0, + TVector3 *crs, bool check_normal, + double a, double b, double c) const +{ + double det = b*b - 4*a*c; + + if (!crs || det < 0.0) return false; + + { + // Assume that n0[] was defining a proper direction, and the surface was "complete", + // so that one is looking for the smallest positive root; + double tt[2] = {(-b - sqrt(det))/(2*a), (-b + sqrt(det))/(2*a)}; + for(unsigned iq=0; iq<2; iq++) { + double t = tt[iq]; + + if (t < 0.0) continue; + *crs = x0 + t*n0; + + if (check_normal && n0.Dot(GetNormal(*crs)) >= 0.0) continue; + + // FIXME: make this check working; + //if (!IsInside(*crs)) continue; + + return true; + } //for iq + + return false; + } +} // ParametricSurface::GetQuadraticEquationCaseCrossing() + +// ------------------------------------------------------------------------------------- diff --git a/source/ReconstructionFactory.cc b/source/ReconstructionFactory.cc new file mode 100644 index 0000000..497e038 --- /dev/null +++ b/source/ReconstructionFactory.cc @@ -0,0 +1,619 @@ + +// Hits with chi^2 built in a 2D space (theta mismatch and timing mismatch) will +// be accepted as "good" ones if the respective CCDF is more than this number; +#define _SINGLE_HIT_CCDF_CUT_DEFAULT_ (0.001) + +// Especially this one is problematic since it should account for the size of radial bands; +//#define _EXPECTED_BG_PHOTON_COUNT_ ( 0.5) + +#include +#include +#include +#include +#include +#include +#include + +#include "CherenkovDetectorCollection.h" +#include "CherenkovEvent.h" +#include "ReconstructionFactory.h" + +// ------------------------------------------------------------------------------------- + +ReconstructionFactory::ReconstructionFactory(const char *dfname, const char *cfname, + const char *dname): + GeantImport(dfname, cfname, dname), + m_VerboseMode(true), + m_UseTimingInChiSquare(true), + m_SingleHitCCDFcut(_SINGLE_HIT_CCDF_CUT_DEFAULT_), + m_ResolveHitOwnership(true), + m_UsePoissonTermInChiSquare(true), + //m_ExperimentalMode(false), + // Help conical mirrors a bit; + m_UseMcTruthPhotonDirectionSeed(true), + m_Plots(0), + // Require at least one associated hit per default; + m_HitCountCutoff(1) +{ +} // ReconstructionFactory::ReconstructionFactory() +// ------------------------------------------------------------------------------------- + +// FIXME: do it better later; +ReconstructionFactory::ReconstructionFactory(CherenkovDetectorCollection *geometry, + CherenkovDetector *cdet, CherenkovEvent *event): + GeantImport(geometry, cdet, event), + m_VerboseMode(true), + m_UseTimingInChiSquare(true), + m_SingleHitCCDFcut(_SINGLE_HIT_CCDF_CUT_DEFAULT_), + m_ResolveHitOwnership(true), + m_UsePoissonTermInChiSquare(true), + //m_ExperimentalMode(false), + // Help conical mirrors a bit; + m_UseMcTruthPhotonDirectionSeed(true), + m_Plots(0), + // Require at least one associated hit per default; + m_HitCountCutoff(1) +{ +} // ReconstructionFactory::ReconstructionFactory() + +// ------------------------------------------------------------------------------------- + +int ReconstructionFactory::AddHypothesis(int pdg) +{ + auto ptr = m_DatabasePDG->GetParticle(pdg); + + // Some sanity check; efficiency is of no concern here; + for(auto hypo: m_Hypotheses) + if (hypo == ptr) + return -1; + + m_Hypotheses.push_back(ptr); + + return 0; +} // ReconstructionFactory::AddHypothesis() + +// ------------------------------------------------------------------------------------- + +int ReconstructionFactory::AddHypothesis(const char *pdg) +{ + auto ptr = m_DatabasePDG->GetParticle(pdg); + + // Avoid code duplication; + return (ptr ? AddHypothesis(ptr->PdgCode()) : -1); +} // ReconstructionFactory::AddHypothesis() + +// ------------------------------------------------------------------------------------- + +void ReconstructionFactory::ProcessHits(ChargedParticle *mcparticle, std::vector &hits, bool use_seed) +{ + double theta = mcparticle->GetVertexMomentum().Theta(); + unsigned ibin = (unsigned)floor(theta / _THETA_BIN_WIDTH_); + + // Loop through all digitized hits of a given event; apply IRT on a pre-calculated + // [vertex,momentum] pair for each hit-to-radiator association; no sampling any + // longer (assume gaussian errors); + // + // FIXME: add orphan (a la DCR) photons; + for(auto &hit: hits) { + // Loop through all optical paths for this photosensor; + for(auto irt: *hit.m_IRTs) { + for(auto rhistory: mcparticle->GetRadiatorHistory()) { + auto history = mcparticle->GetHistory (rhistory); + + auto radiator = mcparticle->GetRadiator(rhistory); + if (!radiator->UsedInRingImaging()) continue; + + auto tag = std::make_pair(radiator, irt); + + { + unsigned ir = 0; + auto *calib = &radiator->m_Calibrations[ibin]; + + for(auto [name,rad] : GetMyRICH()->Radiators()) + rad->SetReferenceRefractiveIndex(calib->m_AverageRefractiveIndices[ir++]); + } + + { + IRTSolution seed; + + // Loop through all of the provided seeds until IRT converges (yes, assume + // the solution is unique); + unsigned smax = use_seed ? hit.m_DirectionSeeds.size() : 1; + for(unsigned iq=0; iqSolve(history->m_EstimatedVertex, + // FIXME: give beam line as a parameter; + history->m_AverageParentMomentum.Unit(), hit.GetDetectionPosition(), + TVector3(0,0,1), false, use_seed ? &seed : 0); + + solution.m_Time = solution.m_Length/300; + + if (solution.m_Converged) break; + } //for iq + //solution.m_Time = radiator->m_AverageTime + solution.m_Length/300; + } + } //for rhistory + } //for irt + } //for hit +} // ReconstructionFactory::ProcessHits() + +// ------------------------------------------------------------------------------------- + +void ReconstructionFactory::LaunchRingFinder(bool calibration) +{ + unsigned const hdim = m_Hypotheses.size(); + + unsigned cdim = 1, pdim = Event()->ChargedParticles().size(), icbest = 0; + // FIXME: come on!; + for(unsigned iq=0; iqChargedParticles().size(); iq++) + cdim *= hdim; + // Save intermediate chi^2 estimates; + double ccdfevsave[cdim]; memset(ccdfevsave, 0x00, sizeof(ccdfevsave)); + double ccdftrsave[cdim][pdim]; memset(ccdftrsave, 0x00, sizeof(ccdftrsave)); + unsigned npetrsave[cdim][pdim]; memset(npetrsave, 0x00, sizeof(npetrsave)); + + // Now loop through all [particle,hypothesis] combinations and evaluate their chi^2; + for(unsigned itr=0; itr<2; itr++) { + for(unsigned ic=0; ic + // as well as the width of this distribution; so skip all other combinations; + if (calibration) { + // A local running variable, to simplify hypothesis calculation; + unsigned qid = ic; + + for(auto mcparticle: Event()->ChargedParticles()) { + unsigned hypo = qid%hdim; + + if (abs(mcparticle->GetPDG()) != abs(m_Hypotheses[hypo]->PdgCode())) + goto _next_combination; + + qid /= Event()->ChargedParticles().size(); + } //for mcparticle + } //if + + // Clear the hit attachment table; + for(auto &hit: Hits()) { + hit.m_BackgroundCandidate = false; + hit.m_Selected.clear(); + } //for hit + + for(auto mcparticle: Event()->ChargedParticles()) { + unsigned hypo = id%hdim; + auto hyparticle = m_Hypotheses[hypo]; + + // Re-tune average refractive indices, depending on the incident theta angle; + // FIXME: in fact should also adjust them in ALL radiators, since it is not only the + // average emission angle (say for aerogel), but also IRT algorithm which (slightly) + // depends on this; + double theta = mcparticle->GetVertexMomentum().Theta(); + unsigned ibin = (unsigned)floor(theta / _THETA_BIN_WIDTH_); + + // FIXME: why do we need these intermediate arrays?!; + std::map momenta; + std::map paths; + for(auto rhptr: mcparticle->GetRadiatorHistory()) { + auto radiator = mcparticle->GetRadiator(rhptr); + + momenta[radiator] = mcparticle->GetHistory(rhptr)->m_AverageParentMomentum.Mag(); + paths [radiator] = mcparticle->GetHistory(rhptr)->m_EstimatedPath; + } //for rhptr + + // FIXME: memory leak; looks like nothing else needs to be cleaned up here?; + for(auto &hit: Hits()) + hit.m_Solutions[mcparticle].m_All.clear(); + + // FIXME: 'true': use 3D direction seeds (MC truth); otherwise conical mirror case + // is problematic; do it better later; + ProcessHits(mcparticle, Hits(), m_UseMcTruthPhotonDirectionSeed); + + // + // By this moment every detected hit is evaluated with respect to this particle + // trajectory as originated from every radiator via every possible optical path; + // + + // Loop through all hits; + for(auto &hit: Hits()) { + auto sptr = &hit.m_Solutions[mcparticle]; + + // Will never have means to know from which radiator a given photon originated, and + // via which optical path it arrived to the sensor; just choose "the best" [radiator,irt] + // combination, which this particular particle PID hypothesis can find; the criterion + // is "closest in theta and closest in timing" as evaluated via a chi^2 estimate with ndf=2, + // or just "closest in theta" in case of ndf=1; + sptr->m_Best = 0; + + for(auto &tag: hit.m_Solutions[mcparticle].m_All) { + auto radiator = tag.first.first; + auto &solution = tag.second; + + //if (!_IsSelected(radiator)) continue; + if (!radiator->UsedInRingImaging()) continue; + + double hsigma = (calibration || !AutomaticCalibrationRequired()) ? + //radiator->GetSmearing() : radiator->m_Calibrations[ibin].m_Csigma; + GetDefaultSinglePhotonThetaResolution() : radiator->m_Calibrations[ibin].m_Csigma; + + double pp = momenta[radiator], ll = paths[radiator]; + + for(unsigned ih=0; ihMass(); + + double beta = 1./sqrt(1. + pow(m/pp, 2)), tt = ll/(beta*300); + + // FIXME: exception; + double thp = acos(sqrt(pp*pp + m*m)/(radiator->n()*pp)); + double thdiff = solution.GetTheta() - thp - radiator->m_Calibrations[ibin].m_Coffset; + double tmdiff = (tt + solution.m_Time) - hit.GetAverageDetectionTime(); + + unsigned ndf = 1; + double chi2 = pow(thdiff, 2)/pow(hsigma, 2); + if (m_UseTimingInChiSquare && GetSinglePhotonTimingResolution()) { + ndf++; + chi2 += pow(tmdiff, 2)/pow(GetSinglePhotonTimingResolution(), 2); + } //if + double ccdf = ROOT::Math::chisquared_cdf_c(chi2, ndf); + + if (ih == hypo) { + if (!sptr->m_Best || ccdf > sptr->m_ccdf) { + sptr->AssignVariables(&solution, thp, tt, radiator, ccdf); + } //if + } else { + // The logic behind this is that all hits within +/-N*sigma window + // with respect to at least one hypothesis in at least one radiator + // for at least one optical path for every particle belong to the + // club "which needs to be explained" in terms of Poisson statistics; + if (ccdf > m_SingleHitCCDFcut) hit.m_BackgroundCandidate = true; + } //if + } //for ih + } //for tag + + { + auto *best = sptr->m_Best; + + if (best) { + unsigned ndf = 1; + double thdiff = best->GetTheta() - sptr->m_thp - sptr->m_rbest->m_Calibrations[ibin].m_Coffset; + double hsigma = (calibration || !AutomaticCalibrationRequired()) ? + //sptr->m_rbest->GetSmearing() : sptr->m_rbest->m_Calibrations[ibin].m_Csigma; + GetDefaultSinglePhotonThetaResolution() : sptr->m_rbest->m_Calibrations[ibin].m_Csigma; + double chi2 = pow(thdiff, 2)/pow(hsigma, 2); + double tmdiff = (sptr->m_tt + best->m_Time) - hit.GetAverageDetectionTime(); + if (m_UseTimingInChiSquare && GetSinglePhotonTimingResolution()) { + ndf++; + chi2 += pow(tmdiff, 2)/pow(GetSinglePhotonTimingResolution(), 2); + } //if + double ccdf = ROOT::Math::chisquared_cdf_c(chi2, ndf); + + // FIXME: should be radiator-specific; + if (ccdf > m_SingleHitCCDFcut) { + hit.m_Selected.insert(std::make_pair(mcparticle, chi2)); + + // Sure of interest is only to see a distribution for the right hypothesis; + if (mcparticle->GetPDG() == hyparticle->PdgCode()) { + if (itr && !calibration && sptr->m_rbest->Plots()) + sptr->m_rbest->Plots()->hthph()->Fill(1000*thdiff); + + if (itr && calibration) + sptr->m_rbest->m_Calibrations[ibin].m_hcalib->Fill(1000*thdiff); + + if (itr && !calibration && Plots()) Plots()->hdtph()->Fill(1000*tmdiff); + + if (itr && !calibration && sptr->m_rbest->Plots()) + sptr->m_rbest->Plots()->hccdfph()->Fill(ccdf); + } //if + } //if + } //if + } + } //for hits + + id /= Event()->ChargedParticles().size(); + } //for mcparticle + + // Clean up background candidate list; obviously if at least one particle selected this + // hit for a hypothesis considered in this iteration, the hit is useful; + for(auto &hit: Hits()) + if (hit.m_Selected.size()) + hit.m_BackgroundCandidate = false; + + // Now either resolve ambiguous assignments, based on the hit-to-track chi^2 match for this + // PID hypothesis, or eliminate these hits everywhere; FIXME: any better idea?; + for(auto &hit: Hits()) + if (hit.m_Selected.size() >= 1) { + if (m_ResolveHitOwnership) { + double chi2min = 0.0; + // FIXME: perhaps order them at the creation time?; + for(auto it = hit.m_Selected.begin(); it != hit.m_Selected.end(); it++) + if (it == hit.m_Selected.begin() || it->second < chi2min) + chi2min = it->second; + for(auto it = hit.m_Selected.begin(); it != hit.m_Selected.end(); ) + if (it->second != chi2min) + it = hit.m_Selected.erase(it); + else + it++; + } + else + hit.m_Selected.clear(); + } //for .. if + + // And eventually calculate the overall event chi^2; + { + unsigned nbg = 0; + for(auto &hit: Hits()) + if (hit.m_BackgroundCandidate) nbg++; + + unsigned ndfev = 0, idx = 0; + double chi2ev = 0; + for(auto mcparticle: Event()->ChargedParticles()) { + unsigned npe = 0; + double chi2tr = 0.0; + + for(auto &hit: Hits()) + for(auto selected: hit.m_Selected) + if (selected.first == mcparticle) { + npe++; + double chi2ph = selected.second; + chi2tr += chi2ph; + + if (itr) mcparticle->AddHit(&hit); + + // FIXME: there is only one entry selected here?; + break; + } //for..if + + unsigned ndftr = m_UseTimingInChiSquare && GetSinglePhotonTimingResolution() ? 2*npe : 1*npe; + // Poissonic term is optional; + if (!calibration && itr && m_UsePoissonTermInChiSquare) { + for(auto rhptr: mcparticle->GetRadiatorHistory()) { + auto radiator = mcparticle->GetRadiator(rhptr); + + //if (!_IsSelected(radiator)) continue; + if (!radiator->UsedInRingImaging()) continue; + + double theta = mcparticle->GetRecoCherenkovAverageTheta(radiator); + if (theta) { + double texp = radiator->m_YieldCff*radiator->m_DetectedToCalibrationPhotonRatio*pow(sin(theta), 2); + chi2tr += npe ? 2*(texp - npe + npe*log(npe/texp)) : 0.0; + ndftr++; + } + } + } //if + ccdftrsave[ic][idx] = ROOT::Math::chisquared_cdf_c(chi2tr, ndftr); + npetrsave [ic][idx] = npe; + + ndfev += ndftr; + chi2ev += chi2tr; + // This is dumb of course, but do not want to change std::set to std::vector; + idx++; + } //for mcparticle + +#ifdef _EXPECTED_BG_PHOTON_COUNT_ + if (hdim >= 2) { + ndfev++; + double bexp = _EXPECTED_BG_PHOTON_COUNT_; + chi2ev += nbg ? 2*(bexp - nbg + nbg*log(nbg/bexp)) : 0.0; + } //if +#endif + double ccdfev = ROOT::Math::chisquared_cdf_c(chi2ev, ndfev); + ccdfevsave[ic] = ccdfev; + + if (!ic || ccdfev > ccdfevsave[icbest]) icbest = ic; + } + + _next_combination: + ; + } //for ic + } //for itr + + if (calibration) + UpdateYields(); + else { + // Now check how the PID procedure performed and fill out histograms; + // Sure of interest is only to see a flat CCDF distribution for the right combination + // of event-level hypotheses; + if (Plots()) { + Plots()->hccdfev()->Fill(ccdfevsave[icbest]); + + for(unsigned ip=0; ipChargedParticles().size(); ip++) + Plots()->hccdftr()->Fill(ccdftrsave[icbest][ip]); + } //if + + { + // A running variable, to simplify hypothesis calculation; + unsigned id = icbest; + + for(auto mcparticle: Event()->ChargedParticles()) { + unsigned hypo = id%hdim; + auto rcparticle = m_Hypotheses[hypo]; + + //if (mcparticle->m_HadronicInteractionOccured) continue; + + if (Plots()) { + unsigned nhits = mcparticle->GetRecoCherenkovHitCount(); + + if (nhits < m_HitCountCutoff) { + Plots()->hmatch()->Fill(0.5); + if (BeVerbose()) printf("Only %2d hits attached (min required %2d)!\n", + nhits, m_HitCountCutoff); + } else if (abs(mcparticle->GetPDG()) == abs(rcparticle->PdgCode())) { + Plots()->hmatch()->Fill(1.5); + } else { + Plots()->hmatch()->Fill(2.5); + if (BeVerbose()) printf("PID Failure!\n"); + } //if + } //if + + // Make it the same sign as for the MC particle (assume tracker can + // determine the charge sign); + int sign = mcparticle->GetPDG() < 0 ? -1 : 1; + mcparticle->SetRecoPdgCode(sign*abs(rcparticle->PdgCode())); + + id /= Event()->ChargedParticles().size(); + } //for ip + } + } //if +} // ReconstructionFactory::LaunchRingFinder() + +// ------------------------------------------------------------------------------------- + +int ReconstructionFactory::VerifyEventStructure( void ) +{ + bool ret = 0; + + // FIXME: duplicate code; + for(auto mcparticle: Event()->ChargedParticles()) { + unsigned npe_per_track = 0; + + for(auto rhptr: mcparticle->GetRadiatorHistory()) { + auto radiator = mcparticle->GetRadiator(rhptr); + if (!radiator->UsedInRingImaging()) continue; + + for(auto photon: mcparticle->GetHistory(rhptr)->Photons()) + if (photon->WasDetected()) + npe_per_track++; + } // for rhistory + + if (!npe_per_track) { + mcparticle->m_GoodForReconstruction = false; + + // If at least one MC particle had no detected photons associated with it, + // skip the event all together; FIXME: once the debugging phase is over, + // just exclude particular particles; + ret = -1; + } //if + } //for mcparticle + + return ret; +} // ReconstructionFactory::VerifyEventStructure() + +// ------------------------------------------------------------------------------------- + +CherenkovEvent *ReconstructionFactory::GetEvent(unsigned ev, bool calibration) +{ + // Prepair for next event; + ClearBlackoutCells(); + ClearDigitizedHits(); + + // Get it from the ROOT tree; otherwise assume it is an EICrecon mode where event structure + // has been populated by the IrtInterface already; + if (m_Tree) GetInputTreeEntry(ev); + + if (VerifyEventStructure()) return Event(); + //return 0; + + // Use undetected photons (HERE DO THIS ON TRACK PER TRACK BASIS) to extract the + // expected average emission point 3D location, time and parent particle 3D momentum; + /*if (!m_ExperimentalMode)*/ CalibratePhotonEmissionPoints(); + //return 0; + + // Loop through all photons (both calibration and detected ones) of all tracks and + // produce event-level hit array; "calibration" (undetected) photons will be passed through + // exactly the same digitization procedure as the "detected" ones, and used to either + // evaluate the expected reconstruction procedure performance (say, SPE Cherenkov + // angle resolution) or mark "exclusion area" where window and gas photons hit the + // photocathode, or such; + ProduceDigitizedHits(calibration); + + // There are no optical photons beyond this point; their information was merged into + // the DigitizedHit array; the only cheating left are direction seeds, but this is rather a + // procedural issue than using MC truth information illegally; and t0 resolution is supposed to + // be ideal (but it will anyway be much better than anticipated HRPPD/SiPM single photon TTS); + // + // Now go through the combinatorics, build chi^2 for each of the M^{N} (M - number of suggested + // hypotheses, N - number of charged tracks) combinations, by fishing out digitized hits which fit + // a current combination of the particle hypothesis best, and choose the best one; performance is + // a non-issue here at the moment, let AI/ML do the job better later; at present complexity seems + // to scale with H*M^{N}, where H is the number of digitized hits; + /*if (!m_ExperimentalMode)*/ LaunchRingFinder(calibration); + + // Build plots if needed; + if (!calibration) + // FIXME: duplicate code; + for(auto mcparticle: Event()->ChargedParticles()) { + unsigned npe_per_track = 0, nhits_per_track = 0; + + for(auto rhptr: mcparticle->GetRadiatorHistory()) { + auto radiator = mcparticle->GetRadiator(rhptr); + if (!radiator->UsedInRingImaging()) continue; + + unsigned npe_per_radiator = 0, nhits_per_radiator = 0; + + nhits_per_radiator = mcparticle->GetRecoCherenkovPhotonCount(radiator); + nhits_per_track += nhits_per_radiator; + + auto *plots = radiator->Plots(); + + for(auto photon: mcparticle->GetHistory(rhptr)->Photons()) + if (photon->WasDetected()) { + npe_per_radiator++; + + if (plots) { + plots->hwl()->Fill(1239.8/(photon->GetVertexMomentum().Mag())); + if (plots->hri()) plots->hri() ->Fill(photon->GetVertexRefractiveIndex() - 1.0); + if (plots->hvtx()) plots->hvtx()->Fill(photon->GetVertexPosition().Z()); + } //if + } //for photon .. if + + if (plots) { + plots->hnpe() ->Fill(npe_per_radiator); + + plots->hnhits()->Fill(nhits_per_radiator); + plots->hthtr() ->Fill(1000*mcparticle->GetRecoCherenkovAverageTheta(radiator)); + } + + npe_per_track += npe_per_radiator; + } //for rhistory + + if (Plots()) { + Plots()->hnhits()->Fill(nhits_per_track); + Plots()->hnpe() ->Fill(npe_per_track); + } //if + } //for mcparticle + + if (BeVerbose() && !(ev%100)) printf("Event %5d ...\n", ev); + + return Event(); +} // ReconstructionFactory::GetEvent() + +// ------------------------------------------------------------------------------------- + +ReconstructionFactoryPlots::ReconstructionFactoryPlots( void ) +{ + m_hnpe = new TH1D("npe", "Detected MC photons per track", 60, 0.0, 60.0); + m_hnhits = new TH1D("nhits", "Used digitized hits per track", 60, 0.0, 60.0); + + m_hdtph = new TH1D("dtph", "Timing offset (photons)", 100, -500, 500); + m_hmatch = new TH1D("match", "PID evaluation correctness", 3, 0, 3); + + m_hccdftr = new TH1D("ccdftr", "Track-level chi^2 CCDF", 50, 0.0, 1.0); + m_hccdftr->SetMinimum(0); + m_hccdfev = new TH1D("ccdfev", "Event-level chi^2 CCDF", 50, 0.0, 1.0); + m_hccdfev->SetMinimum(0); +} // ReconstructionFactoryPlots::ReconstructionFactoryPlots() + +// ------------------------------------------------------------------------------------- + +void ReconstructionFactory::DisplayStandardPlots(const char *cname, int wtopx, + unsigned wtopy, unsigned wx, unsigned wy) const +{ + if (!Plots()) return; + + auto cv = new TCanvas("", cname, wtopx, wtopy, wx, wy); + cv->Divide(2, 4); + + cv->cd(1); Plots()->hnpe() ->Draw(); + cv->cd(2); Plots()->hnhits() ->Draw(); + cv->cd(3); Plots()->hccdftr()->Draw(); + cv->cd(4); Plots()->hccdfev()->Draw(); + cv->cd(5); Plots()->hdtph() ->Fit("gaus"); + cv->cd(6); Plots()->hmatch() ->Draw(); +} // ReconstructionFactory::DisplayStandardPlots() + +// ------------------------------------------------------------------------------------- diff --git a/source/SphericalSurface.cc b/source/SphericalSurface.cc index 1ec8ad3..f02c1c6 100644 --- a/source/SphericalSurface.cc +++ b/source/SphericalSurface.cc @@ -1,5 +1,5 @@ -#include "ParametricSurface.h" +#include "SphericalSurface.h" // ------------------------------------------------------------------------------------- @@ -8,26 +8,8 @@ bool SphericalSurface::GetCrossing(const TVector3 &x0, const TVector3 &n0, TVect { TVector3 dx = x0 - GetCenter(); double a = 1.0, b = 2*dx.Dot(n0), c = dx.Mag2() - pow(m_Radius, 2); - double det = b*b - 4*a*c; - if (!crs || det < 0.0) return false; - - { - // Assume that n0[] was defining a proper direction, and the surface was "complete", - // so that one is looking for the smallest positive root; - double tt[2] = {(-b - sqrt(det))/(2*a), (-b + sqrt(det))/(2*a)}; - for(unsigned iq=0; iq<2; iq++) { - double t = tt[iq]; - - if (t < 0.0) continue; - *crs = x0 + t*n0; - if (check_normal && n0.Dot(GetNormal(*crs)) >= 0.0) continue; - - return true; - } //for iq - - return false; - } + return GetQuadraticEquationCaseCrossing(x0, n0, crs, check_normal, a, b, c); } // SphericalSurface::GetCrossing() // ------------------------------------------------------------------------------------- diff --git a/source/ToricSurface.cc b/source/ToricSurface.cc new file mode 100644 index 0000000..8ca2d7b --- /dev/null +++ b/source/ToricSurface.cc @@ -0,0 +1,32 @@ + +#include "ToricSurface.h" + +// ------------------------------------------------------------------------------------- + +bool ToricSurface::GetCrossing(const TVector3 &x0, const TVector3 &n0, TVector3 *crs, + bool check_normal) const +{ + TVector3 dx = x0 - GetCenter(); + + + //double a = 1.0, b = 2*dx.Dot(n0), c = dx.Mag2() - pow(m_Radius, 2); + + return true;//GetQuadraticEquationCaseCrossing(x0, n0, crs, check_normal, a, b, c); +} // ToricSurface::GetCrossing() + +// ------------------------------------------------------------------------------------- + +double ToricSurface::GetDistance(const TVector3 &xx) const +{ + // FIXME: unify with GetU(); + auto dx = xx - GetCenter(); + // Rotate to align torus axis with (0,0,1); + dx.Rotate(-m_Alfa, m_Nr); + dx.Rotate(-dx.Phi(), TVector3(0,0,1)); + TVector3 pc(m_R, 0.0, 0.0); + dx -= pc; + + return fabs(dx.Mag() - m_r); +} // ToricSurface::GetDistance() + +// -------------------------------------------------------------------------------------