diff --git a/CMakeLists.txt b/CMakeLists.txt index eabf3820..9a4541b9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -115,7 +115,7 @@ message(STATUS "Creating Project") project(CROWN CXX) message(STATUS "Finding Packages") # Find ROOT and print details -find_package(ROOT 6.26 REQUIRED COMPONENTS ROOTVecOps ROOTDataFrame RooFit GenVector) +find_package(ROOT 6.28 REQUIRED COMPONENTS ROOTVecOps ROOTDataFrame RooFit GenVector PyMVA) # add OpenMP and MPI find_package(OpenMP) find_package(MPI) @@ -287,7 +287,7 @@ if(BUILD_CROWNLIB_ONLY) message(STATUS "Building only the CROWNLIB library") add_library(CROWNLIB SHARED ${SOURCES}) target_include_directories(CROWNLIB PRIVATE ${CMAKE_SOURCE_DIR} ${ROOT_INCLUDE_DIRS}) - target_link_libraries(CROWNLIB ROOT::ROOTVecOps ROOT::ROOTDataFrame ROOT::RooFit ROOT::GenVector logging correctionlib nlohmann_json::nlohmann_json) + target_link_libraries(CROWNLIB ROOT::ROOTVecOps ROOT::ROOTDataFrame ROOT::RooFit ROOT::GenVector ROOT::PyMVA logging correctionlib nlohmann_json::nlohmann_json) install(TARGETS CROWNLIB DESTINATION ${INSTALLDIR}/lib ) return() endif() @@ -298,7 +298,7 @@ if(NOT CROWNLIB_FOUND OR REBUILD_CROWN_LIB) # CROWNLIB not found, build it add_library(CROWNLIB SHARED ${SOURCES}) target_include_directories(CROWNLIB PRIVATE ${CMAKE_SOURCE_DIR} ${ROOT_INCLUDE_DIRS}) - target_link_libraries(CROWNLIB ROOT::ROOTVecOps ROOT::ROOTDataFrame ROOT::RooFit ROOT::GenVector logging correctionlib nlohmann_json::nlohmann_json) + target_link_libraries(CROWNLIB ROOT::ROOTVecOps ROOT::ROOTDataFrame ROOT::RooFit ROOT::GenVector ROOT::PyMVA logging correctionlib nlohmann_json::nlohmann_json) install(TARGETS CROWNLIB DESTINATION ${INSTALLDIR}/lib) else() message(STATUS "Found CROWNLIB in ${CROWNLIB_FOUND}") @@ -380,7 +380,7 @@ foreach(FILENAME ${FILELIST}) add_executable(${TARGET_NAME} ${FULL_PATH} ${GENERATED_CXX_FILES}) # Adds a pre-build event to the Target copying the correctionlib.so file into the /lib folder in the install directory target_include_directories(${TARGET_NAME} PRIVATE ${CMAKE_SOURCE_DIR} ${ROOT_INCLUDE_DIRS} $ORIGIN/lib/ lib/) - target_link_libraries(${TARGET_NAME} ROOT::ROOTVecOps ROOT::ROOTDataFrame ROOT::RooFit ROOT::GenVector logging correctionlib nlohmann_json::nlohmann_json CROWNLIB) + target_link_libraries(${TARGET_NAME} ROOT::ROOTVecOps ROOT::ROOTDataFrame ROOT::RooFit ROOT::GenVector ROOT::PyMVA logging correctionlib nlohmann_json::nlohmann_json CROWNLIB) add_custom_command(TARGET ${TARGET_NAME} PRE_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CORRECTION_LIB_PATH}" diff --git a/code_generation/analysis_template.cxx b/code_generation/analysis_template.cxx index af11d1a7..dfd39513 100644 --- a/code_generation/analysis_template.cxx +++ b/code_generation/analysis_template.cxx @@ -8,6 +8,7 @@ #include "include/lorentzvectors.hxx" #include "include/met.hxx" #include "include/metfilter.hxx" +#include "include/ml.hxx" #include "include/pairselection.hxx" #include "include/tripleselection.hxx" #include "include/physicsobjects.hxx" diff --git a/code_generation/analysis_template_friends.cxx b/code_generation/analysis_template_friends.cxx index 160774c4..d775b22e 100644 --- a/code_generation/analysis_template_friends.cxx +++ b/code_generation/analysis_template_friends.cxx @@ -9,6 +9,7 @@ #include "include/lorentzvectors.hxx" #include "include/met.hxx" #include "include/metfilter.hxx" +#include "include/ml.hxx" #include "include/pairselection.hxx" #include "include/physicsobjects.hxx" #include "include/quantities.hxx" diff --git a/code_generation/code_generation.py b/code_generation/code_generation.py index 82bff184..04ae1bd2 100644 --- a/code_generation/code_generation.py +++ b/code_generation/code_generation.py @@ -347,7 +347,6 @@ def write_code(self, calls: str, includes: str, run_commands: str) -> None: ) .replace("{ANALYSISTAG}", '"Analysis={}"'.format(self.analysis_name)) .replace("{CONFIGTAG}", '"Config={}"'.format(self.config_name)) - .replace("{PROGRESS_CALLBACK}", self.set_process_tracking()) .replace("{OUTPUT_QUANTITIES}", self.set_output_quantities()) .replace("{SHIFT_QUANTITIES_MAP}", self.set_shift_quantities_map()) .replace("{QUANTITIES_SHIFT_MAP}", self.set_quantities_shift_map()) @@ -548,8 +547,6 @@ def generate_run_commands(self) -> str: outputname=self._outputfiles_generated[scope], outputstring=outputstring, ) - # add code for tracking the progress - runcommands += self.set_process_tracking() # add code for the time taken for the dataframe setup runcommands += self.set_setup_printout() # add trigger of dataframe execution, for nonempty scopes @@ -684,37 +681,6 @@ def zero_events_fallback(self) -> str: return printout - def set_process_tracking(self) -> str: - """This function replaces the template placeholder for the process tracking with the correct process tracking. - - Returns: - The code to be added to the template - """ - tracking = "" - scope = self.scopes[-1] - tracking += " ULong64_t {scope}_processed = 0;\n".format(scope=scope) - tracking += " std::mutex {scope}_bar_mutex;\n".format(scope=scope) - tracking += " auto c_{scope} = df{counter}_{scope}.Count();\n".format( - counter=self.main_counter[scope], scope=scope - ) - tracking += " c_{scope}.OnPartialResultSlot(quantile, [&{scope}_bar_mutex, &{scope}_processed, &quantile, &nevents](unsigned int /*slot*/, ULong64_t /*_c*/) {{".format( - scope=scope - ) - tracking += ( - "\n std::lock_guard lg({scope}_bar_mutex);\n".format( - scope=scope - ) - ) - tracking += " {scope}_processed += quantile;\n".format(scope=scope) - tracking += " float percentage = 100 * (float){scope}_processed / (float)nevents;\n".format( - scope=scope - ) - tracking += ' Logger::get("main")->info("{{0:d}} / {{1:d}} ({{2:.2f}} %) Events processed ...", {scope}_processed, nevents, percentage);\n'.format( - scope=scope - ) - tracking += " });\n" - return tracking - def set_shift_quantities_map(self) -> str: """ This function is used to generate a mapping of all quantities and the shifts, diff --git a/code_generation/subset_template.cxx b/code_generation/subset_template.cxx index 86180b53..ea0f846b 100644 --- a/code_generation/subset_template.cxx +++ b/code_generation/subset_template.cxx @@ -9,6 +9,7 @@ #include "include/lorentzvectors.hxx" #include "include/met.hxx" #include "include/metfilter.hxx" +#include "include/ml.hxx" #include "include/pairselection.hxx" #include "include/tripleselection.hxx" #include "include/physicsobjects.hxx" diff --git a/data/custom_top_sf/btag_eff/2018_UL/btag_eff_2018.json.gz.tight b/data/custom_top_sf/btag_eff/2018_UL/btag_eff_2018.json.gz.tight new file mode 100644 index 00000000..ecee8481 Binary files /dev/null and b/data/custom_top_sf/btag_eff/2018_UL/btag_eff_2018.json.gz.tight differ diff --git a/data/prescale/HLT_Mu20.json b/data/prescale/HLT_Mu20.json deleted file mode 100644 index a8139162..00000000 --- a/data/prescale/HLT_Mu20.json +++ /dev/null @@ -1,6257 +0,0 @@ -{ - "273158": { - "1": 20, - "17": 10, - "32": 20 - }, - "273302": { - "1": 20 - }, - "273402": { - "1": 0, - "10": 40, - "46": 60, - "59": 40, - "79": 20, - "190": 40, - "255": 60 - }, - "273403": { - "1": 20 - }, - "273404": { - "1": 20 - }, - "273405": { - "1": 20 - }, - "273406": { - "1": 20 - }, - "273408": { - "1": 1, - "4": 1 - }, - "273409": { - "1": 10 - }, - "273410": { - "1": 10 - }, - "273411": { - "1": 10 - }, - "273425": { - "1": 0, - "8": 20, - "54": 10, - "61": 20 - }, - "273446": { - "1": 40 - }, - "273447": { - "1": 40 - }, - "273448": { - "1": 40, - "379": 20 - }, - "273449": { - "1": 0, - "7": 20 - }, - "273450": { - "1": 20 - }, - "273492": { - "1": 0, - "30": 90, - "41": 1, - "55": 20 - }, - "273493": { - "1": 0, - "4": 20 - }, - "273494": { - "1": 20 - }, - "273502": { - "1": 0, - "15": 20 - }, - "273503": { - "1": 20 - }, - "273554": { - "1": 0, - "63": 40 - }, - "273555": { - "1": 40 - }, - "273725": { - "1": 0, - "7": 20, - "109": 40, - "1224": 20 - }, - "273728": { - "1": 20 - }, - "273730": { - "1": 20, - "287": 10, - "295": 20, - "1491": 10 - }, - "274094": { - "1": 20 - }, - "274146": { - "1": 0, - "4": 40 - }, - "274157": { - "1": 0, - "20": 90, - "355": 0, - "359": 60, - "484": 40 - }, - "274159": { - "1": 40 - }, - "274160": { - "1": 40 - }, - "274161": { - "1": 40 - }, - "274172": { - "1": 0, - "7": 90, - "55": 60 - }, - "274198": { - "1": 60, - "115": 90 - }, - "274199": { - "1": 90, - "14": 60 - }, - "274200": { - "1": 0, - "5": 60, - "74": 40 - }, - "274240": { - "1": 90 - }, - "274241": { - "1": 90, - "442": 60, - "853": 40 - }, - "274244": { - "1": 0, - "15": 40, - "152": 20 - }, - "274250": { - "1": 90 - }, - "274251": { - "1": 90, - "273": 60 - }, - "274283": { - "1": 90 - }, - "274284": { - "1": 90 - }, - "274286": { - "1": 90 - }, - "274314": { - "1": 90 - }, - "274315": { - "1": 90 - }, - "274316": { - "1": 90 - }, - "274317": { - "1": 1 - }, - "274319": { - "1": 90 - }, - "274335": { - "1": 90 - }, - "274336": { - "1": 90 - }, - "274337": { - "1": 90 - }, - "274338": { - "1": 90, - "38": 60 - }, - "274339": { - "1": 60 - }, - "274344": { - "1": 0, - "6": 60, - "35": 40, - "398": 20 - }, - "274345": { - "1": 20 - }, - "274382": { - "1": 90 - }, - "274387": { - "1": 90 - }, - "274388": { - "1": 90, - "756": 60, - "1755": 40 - }, - "274420": { - "1": 90 - }, - "274421": { - "1": 90 - }, - "274422": { - "1": 90, - "363": 60, - "1159": 40, - "1734": 20 - }, - "274440": { - "1": 400 - }, - "274441": { - "1": 400, - "333": 300 - }, - "274442": { - "1": 300 - }, - "274954": { - "1": 400, - "31": 120 - }, - "274955": { - "1": 120 - }, - "274968": { - "1": 400, - "8": 50000, - "270": 400, - "277": 50000, - "314": 400 - }, - "274969": { - "1": 400, - "115": 300 - }, - "274970": { - "1": 300 - }, - "274971": { - "1": 300 - }, - "274998": { - "1": 400, - "61": 400 - }, - "274999": { - "1": 400, - "218": 300 - }, - "275000": { - "1": 300 - }, - "275001": { - "1": 300, - "1086": 200 - }, - "275059": { - "1": 400, - "67": 400, - "89": 50000 - }, - "275066": { - "1": 400 - }, - "275067": { - "1": 400, - "288": 400 - }, - "275068": { - "1": 400, - "826": 300 - }, - "275073": { - "1": 400, - "8": 300 - }, - "275074": { - "1": 300 - }, - "275124": { - "1": 400, - "85": 400, - "309": 400 - }, - "275125": { - "1": 400, - "757": 300 - }, - "275282": { - "1": 460, - "141": 400 - }, - "275283": { - "1": 400 - }, - "275284": { - "1": 400 - }, - "275290": { - "1": 400 - }, - "275291": { - "1": 400, - "278": 300 - }, - "275292": { - "1": 300 - }, - "275293": { - "1": 300 - }, - "275309": { - "1": 400, - "380": 300 - }, - "275310": { - "1": 300, - "1932": 200 - }, - "275311": { - "1": 200 - }, - "275319": { - "1": 400, - "142": 460, - "280": 400 - }, - "275337": { - "1": 400 - }, - "275338": { - "1": 400, - "256": 300 - }, - "275344": { - "1": 400, - "77": 460 - }, - "275345": { - "1": 400 - }, - "275370": { - "1": 400, - "65": 460 - }, - "275371": { - "1": 460, - "36": 400 - }, - "275375": { - "1": 400, - "81": 460, - "250": 400, - "1181": 300 - }, - "275376": { - "1": 300, - "1971": 200, - "3014": 120 - }, - "275657": { - "1": 460, - "9": 600, - "49": 460 - }, - "275658": { - "1": 460, - "211": 400, - "232": 460 - }, - "275659": { - "1": 460 - }, - "275761": { - "1": 600 - }, - "275767": { - "1": 1 - }, - "275772": { - "1": 460 - }, - "275773": { - "1": 1 - }, - "275774": { - "1": 460, - "232": 400 - }, - "275776": { - "1": 400 - }, - "275777": { - "1": 400 - }, - "275778": { - "1": 400 - }, - "275782": { - "1": 600, - "4": 300 - }, - "275832": { - "1": 600, - "202": 460 - }, - "275833": { - "1": 460 - }, - "275834": { - "1": 460, - "170": 400 - }, - "275835": { - "1": 400 - }, - "275836": { - "1": 400, - "769": 300 - }, - "275837": { - "1": 300 - }, - "275847": { - "1": 300, - "671": 200 - }, - "275886": { - "1": 600, - "8": 460, - "22": 600, - "25": 460, - "69": 600 - }, - "275890": { - "1": 600, - "9": 460, - "504": 400 - }, - "275911": { - "1": 600, - "259": 460 - }, - "275912": { - "1": 460, - "261": 400 - }, - "275913": { - "1": 400 - }, - "275918": { - "1": 400 - }, - "275920": { - "1": 400, - "13": 300 - }, - "275921": { - "1": 300 - }, - "275923": { - "1": 300 - }, - "275931": { - "1": 300 - }, - "275963": { - "1": 600 - }, - "276092": { - "1": 600 - }, - "276097": { - "1": 600, - "107": 460 - }, - "276242": { - "1": 600, - "9": 460, - "465": 400, - "1385": 300 - }, - "276243": { - "1": 300 - }, - "276244": { - "1": 300 - }, - "276282": { - "1": 600, - "376": 460, - "971": 400 - }, - "276283": { - "1": 400, - "778": 300 - }, - "276315": { - "1": 600, - "126": 460 - }, - "276317": { - "1": 460 - }, - "276318": { - "1": 460, - "350": 400 - }, - "276355": { - "1": 600 - }, - "276361": { - "1": 460, - "464": 400 - }, - "276363": { - "1": 400, - "503": 300 - }, - "276384": { - "1": 300 - }, - "276437": { - "1": 600, - "240": 460, - "762": 400, - "1882": 300 - }, - "276454": { - "1": 600, - "8": 300 - }, - "276458": { - "1": 300, - "233": 200 - }, - "276495": { - "1": 600 - }, - "276501": { - "1": 600, - "354": 460, - "821": 400, - "1849": 300 - }, - "276502": { - "1": 300 - }, - "276525": { - "1": 600, - "89": 460, - "620": 400, - "1490": 300 - }, - "276527": { - "1": 300 - }, - "276528": { - "1": 300, - "328": 200 - }, - "276542": { - "1": 600, - "321": 460 - }, - "276543": { - "1": 460, - "29": 400, - "936": 300 - }, - "276544": { - "1": 300 - }, - "276545": { - "1": 300 - }, - "276581": { - "1": 600, - "330": 460 - }, - "276582": { - "1": 460, - "443": 400 - }, - "276583": { - "1": 400 - }, - "276584": { - "1": 1 - }, - "276585": { - "1": 400 - }, - "276586": { - "1": 400, - "24": 300 - }, - "276587": { - "1": 300 - }, - "276653": { - "1": 600, - "74": 460, - "541": 400 - }, - "276655": { - "1": 400, - "828": 300 - }, - "276659": { - "1": 600, - "3": 300 - }, - "276775": { - "1": 600, - "184": 460, - "780": 400 - }, - "276776": { - "1": 400, - "458": 300 - }, - "276794": { - "1": 600, - "8": 300, - "413": 200 - }, - "276807": { - "1": 600, - "158": 460 - }, - "276808": { - "1": 460, - "512": 400 - }, - "276810": { - "1": 400 - }, - "276811": { - "1": 400, - "216": 300, - "2170": 200 - }, - "276831": { - "1": 600, - "125": 460, - "665": 400, - "1485": 300 - }, - "276834": { - "1": 300, - "411": 200 - }, - "276870": { - "1": 750, - "78": 720, - "137": 600, - "488": 460, - "1040": 400, - "1803": 300 - }, - "276935": { - "1": 750, - "81": 720, - "265": 600, - "483": 460, - "496": 600, - "604": 460 - }, - "276940": { - "1": 750, - "82": 720, - "123": 600 - }, - "276946": { - "1": 720, - "9": 600 - }, - "276947": { - "1": 600, - "96": 460 - }, - "276948": { - "1": 460 - }, - "276950": { - "1": 460, - "42": 400, - "881": 300 - }, - "277069": { - "1": 750, - "85": 720, - "89": 750, - "94": 720 - }, - "277070": { - "1": 720, - "11": 600, - "39": 720, - "67": 600, - "323": 460, - "803": 400 - }, - "277071": { - "1": 400 - }, - "277072": { - "1": 400, - "306": 300 - }, - "277073": { - "1": 750, - "21": 300 - }, - "277076": { - "1": 300 - }, - "277087": { - "1": 750, - "168": 200 - }, - "277094": { - "1": 720, - "253": 600 - }, - "277096": { - "1": 600, - "8": 460, - "556": 400, - "1319": 300 - }, - "277112": { - "1": 750, - "38": 300 - }, - "277126": { - "1": 750, - "31": 720 - }, - "277127": { - "1": 720, - "13": 600, - "356": 460, - "855": 400 - }, - "277148": { - "1": 750, - "84": 600, - "395": 460 - }, - "277166": { - "1": 750, - "102": 600, - "193": 460 - }, - "277168": { - "1": 750, - "9": 460, - "267": 400, - "973": 300 - }, - "277180": { - "1": 750, - "93": 720, - "147": 600 - }, - "277194": { - "1": 720, - "336": 600, - "711": 460, - "1275": 400, - "2028": 300 - }, - "277305": { - "1": 750, - "116": 720, - "319": 600, - "681": 460 - }, - "277420": { - "1": 750, - "73": 600, - "78": 750, - "84": 720, - "237": 600 - }, - "277981": { - "1": 400, - "85": 200 - }, - "277991": { - "1": 750, - "7": 120 - }, - "277992": { - "1": 120 - }, - "278017": { - "1": 750, - "429": 720, - "455": 600 - }, - "278018": { - "1": 600, - "195": 460, - "702": 400 - }, - "278167": { - "1": 750, - "86": 460, - "431": 400, - "1098": 300 - }, - "278175": { - "1": 750, - "4": 300, - "63": 200 - }, - "278193": { - "1": 750, - "3": 600, - "76": 720, - "122": 600 - }, - "278239": { - "1": 750, - "79": 600, - "381": 460 - }, - "278240": { - "1": 460, - "65": 400, - "778": 300 - }, - "278273": { - "1": 840, - "67": 700, - "84": 626 - }, - "278274": { - "1": 626 - }, - "278288": { - "1": 840, - "74": 626 - }, - "278289": { - "1": 626 - }, - "278290": { - "1": 626 - }, - "278308": { - "1": 700, - "325": 626, - "986": 501, - "1330": 438 - }, - "278310": { - "1": 438, - "674": 313 - }, - "278315": { - "1": 700, - "233": 626, - "488": 501 - }, - "278345": { - "1": 700, - "309": 626, - "620": 501 - }, - "278346": { - "1": 501, - "112": 438 - }, - "278349": { - "1": 438, - "318": 313, - "325": 438, - "467": 313 - }, - "278366": { - "1": 313 - }, - "278406": { - "1": 840, - "183": 700, - "477": 626, - "650": 501, - "1017": 438 - }, - "278509": { - "1": 700, - "100": 840, - "191": 700, - "529": 626, - "691": 501, - "1044": 438 - }, - "278769": { - "1": 840 - }, - "278770": { - "1": 840, - "42": 700, - "435": 626, - "645": 501 - }, - "278801": { - "1": 840 - }, - "278802": { - "1": 840 - }, - "278803": { - "1": 840, - "107": 700 - }, - "278804": { - "1": 100 - }, - "278805": { - "1": 700, - "88": 626, - "285": 501 - }, - "278808": { - "1": 501, - "343": 438, - "1235": 313 - }, - "278820": { - "1": 840, - "22": 700, - "25": 840, - "106": 700, - "411": 626, - "645": 501, - "956": 438 - }, - "278822": { - "1": 438, - "218": 313, - "1472": 219, - "1504": 125 - }, - "278873": { - "1": 840, - "76": 626, - "95": 501 - }, - "278874": { - "1": 501, - "53": 626, - "197": 501, - "404": 438 - }, - "278875": { - "1": 438, - "219": 313, - "224": 438, - "422": 313, - "424": 438, - "533": 313 - }, - "278923": { - "1": 840, - "348": 700 - }, - "278957": { - "1": 840 - }, - "278962": { - "1": 840, - "195": 700 - }, - "278963": { - "1": 700, - "108": 626 - }, - "278969": { - "1": 840, - "373": 700, - "644": 626, - "872": 501, - "1198": 438 - }, - "278975": { - "1": 438, - "600": 313 - }, - "278976": { - "1": 313 - }, - "278986": { - "1": 840 - }, - "279024": { - "1": 840, - "86": 438 - }, - "279029": { - "1": 438 - }, - "279071": { - "1": 840, - "70": 438, - "158": 313 - }, - "279080": { - "1": 840, - "80": 219 - }, - "279115": { - "1": 840, - "123": 438, - "216": 501, - "248": 626, - "295": 700, - "351": 840, - "564": 313 - }, - "279116": { - "1": 700, - "163": 626, - "391": 501 - }, - "279479": { - "1": 840, - "32": 626, - "124": 219 - }, - "279588": { - "1": 840, - "206": 700, - "208": 840, - "281": 700, - "464": 626, - "706": 501, - "990": 438 - }, - "279653": { - "1": 840 - }, - "279654": { - "1": 840, - "14": 700, - "306": 626, - "506": 501, - "831": 438 - }, - "279656": { - "1": 438 - }, - "279658": { - "1": 438, - "173": 313 - }, - "279667": { - "1": 840, - "107": 900, - "145": 840, - "310": 700, - "584": 626, - "785": 501 - }, - "279681": { - "1": 840, - "81": 900 - }, - "279682": { - "1": 900, - "6": 840 - }, - "279683": { - "1": 840 - }, - "279684": { - "1": 840 - }, - "279685": { - "1": 840, - "7": 700, - "10": 840, - "43": 700 - }, - "279691": { - "1": 840, - "94": 900 - }, - "279694": { - "1": 900, - "44": 840, - "248": 700, - "524": 626, - "745": 501, - "1036": 438, - "1913": 313 - }, - "279715": { - "1": 840, - "197": 700, - "531": 626 - }, - "279716": { - "1": 626, - "30": 501, - "353": 438, - "1271": 313 - }, - "279760": { - "1": 840, - "77": 900, - "213": 840, - "373": 700, - "609": 626 - }, - "279766": { - "1": 626, - "60": 501, - "429": 438, - "1395": 313 - }, - "279767": { - "1": 313 - }, - "279794": { - "1": 840, - "79": 900, - "157": 840, - "341": 700, - "628": 626, - "870": 501 - }, - "279823": { - "1": 840, - "26": 900, - "50": 840, - "366": 700 - }, - "279841": { - "1": 840, - "75": 700, - "748": 626, - "957": 501, - "1204": 438 - }, - "279844": { - "1": 840, - "83": 900, - "207": 840 - }, - "279887": { - "1": 840, - "65": 900, - "78": 840, - "298": 700 - }, - "279931": { - "1": 840, - "71": 438, - "74": 840, - "262": 700, - "521": 626, - "752": 501, - "1088": 438, - "1946": 313 - }, - "279966": { - "1": 840, - "77": 900, - "275": 840, - "402": 700 - }, - "279975": { - "1": 840, - "76": 900, - "87": 1000, - "118": 900, - "279": 840, - "489": 700, - "749": 626, - "952": 501 - }, - "279993": { - "1": 840, - "89": 900 - }, - "279994": { - "1": 900 - }, - "280013": { - "1": 840 - }, - "280015": { - "1": 840, - "7": 700, - "82": 626, - "287": 501 - }, - "280016": { - "1": 840, - "6": 438 - }, - "280017": { - "1": 438 - }, - "280018": { - "1": 438, - "160": 313, - "596": 219 - }, - "280020": { - "1": 219 - }, - "280024": { - "1": 219 - }, - "280187": { - "1": 840, - "16": 900 - }, - "280188": { - "1": 900, - "66": 840, - "219": 700 - }, - "280191": { - "1": 700, - "205": 626, - "406": 501, - "728": 438 - }, - "280194": { - "1": 840, - "14": 438 - }, - "280242": { - "1": 840, - "10": 900, - "86": 840, - "242": 700, - "510": 626 - }, - "280249": { - "1": 626, - "58": 501, - "406": 438, - "1268": 313 - }, - "280251": { - "1": 313 - }, - "280327": { - "1": 840 - }, - "280330": { - "1": 840, - "187": 700, - "470": 626, - "690": 501 - }, - "280349": { - "1": 501, - "151": 438, - "471": 313, - "481": 438 - }, - "280363": { - "1": 840, - "3": 313, - "5": 438, - "243": 313 - }, - "280364": { - "1": 313, - "1202": 219 - }, - "280383": { - "1": 840, - "68": 900 - }, - "280384": { - "1": 900, - "15": 840 - }, - "280385": { - "1": 840, - "178": 700, - "466": 626, - "631": 501, - "1011": 438, - "2002": 313 - }, - "281613": { - "1": 840, - "108": 31, - "123": 44, - "131": 63, - "141": 900, - "157": 840, - "170": 700, - "178": 626, - "185": 501, - "193": 438, - "200": 313, - "206": 219, - "212": 125, - "219": 63, - "228": 44, - "237": 31, - "242": 44 - }, - "281639": { - "1": 840, - "23": 700, - "32": 840, - "111": 700 - }, - "281641": { - "1": 840, - "3": 700, - "24": 626, - "33": 501, - "36": 626, - "139": 501 - }, - "281693": { - "1": 900, - "11": 840, - "194": 700, - "420": 626, - "615": 501, - "900": 438, - "1721": 313 - }, - "281707": { - "1": 1000, - "99": 900, - "102": 1000, - "151": 900, - "156": 1000, - "193": 900, - "322": 840, - "475": 700, - "684": 626, - "873": 501 - }, - "281726": { - "1": 501, - "42": 438 - }, - "281727": { - "1": 438, - "526": 313, - "1529": 219 - }, - "281797": { - "1": 1000, - "185": 900, - "386": 840, - "564": 700, - "776": 626, - "984": 501, - "1211": 438, - "2169": 313 - }, - "281975": { - "1": 1000, - "27": 900, - "166": 840 - }, - "281976": { - "1": 840, - "203": 700, - "311": 626, - "531": 501, - "710": 438, - "1077": 313, - "1111": 219, - "1119": 313, - "1242": 438, - "1362": 313, - "2058": 219 - }, - "282033": { - "1": 1000, - "81": 960, - "111": 900, - "115": 840 - }, - "282034": { - "1": 840 - }, - "282035": { - "1": 840, - "12": 700, - "34": 626 - }, - "282037": { - "1": 840, - "15": 700, - "67": 840, - "203": 700, - "426": 626, - "645": 501, - "865": 438, - "1490": 313 - }, - "282092": { - "1": 1000, - "4": 1000, - "96": 960, - "111": 900, - "248": 840, - "429": 700, - "598": 626, - "815": 501, - "1074": 438, - "1836": 313 - }, - "282708": { - "1": 960 - }, - "282710": { - "1": 160 - }, - "282712": { - "1": 960, - "44": 900 - }, - "282730": { - "1": 960, - "90": 1000, - "126": 960 - }, - "282731": { - "1": 960, - "118": 900 - }, - "282732": { - "1": 900 - }, - "282733": { - "1": 900, - "29": 840, - "172": 700 - }, - "282734": { - "1": 700, - "207": 626 - }, - "282735": { - "1": 626, - "70": 501, - "308": 438, - "1133": 313 - }, - "282800": { - "1": 960, - "80": 900, - "143": 840, - "235": 700, - "242": 840, - "256": 700, - "312": 840 - }, - "282807": { - "1": 840, - "35": 700, - "243": 626 - }, - "282814": { - "1": 626, - "153": 501, - "405": 438, - "1116": 313 - }, - "282842": { - "1": 960, - "14": 1000, - "40": 960 - }, - "282917": { - "1": 960, - "117": 900 - }, - "282918": { - "1": 900, - "14": 840 - }, - "282919": { - "1": 840, - "101": 700, - "106": 840, - "140": 700 - }, - "282922": { - "1": 626, - "123": 501 - }, - "282923": { - "1": 501, - "219": 438 - }, - "283042": { - "1": 160, - "4": 100, - "8": 150 - }, - "283043": { - "1": 900, - "57": 840, - "193": 700, - "434": 626 - }, - "283049": { - "1": 960, - "81": 1000, - "88": 960 - }, - "283050": { - "1": 1000, - "38": 960, - "134": 900 - }, - "283052": { - "1": 900, - "104": 840 - }, - "283059": { - "1": 840, - "69": 700, - "296": 626 - }, - "283270": { - "1": 960, - "76": 1000, - "154": 960, - "304": 900, - "498": 840, - "663": 700, - "912": 626, - "1096": 501, - "1381": 438, - "1906": 313 - }, - "283283": { - "1": 313, - "1315": 219 - }, - "283305": { - "1": 960 - }, - "283306": { - "1": 960, - "133": 900, - "278": 840 - }, - "283307": { - "1": 840, - "158": 700, - "297": 626 - }, - "283308": { - "1": 626, - "93": 501, - "360": 438 - }, - "283353": { - "1": 960, - "3": 1000, - "167": 960, - "309": 900, - "461": 840, - "656": 700 - }, - "283358": { - "1": 700, - "57": 626, - "213": 501, - "515": 438 - }, - "283359": { - "1": 438, - "372": 313 - }, - "283407": { - "1": 960, - "88": 1000 - }, - "283408": { - "1": 1000, - "90": 960, - "239": 900, - "440": 840, - "609": 700, - "883": 626, - "1073": 438, - "1085": 501, - "1295": 438, - "2122": 313 - }, - "283416": { - "1": 313 - }, - "283453": { - "1": 960, - "154": 900, - "163": 960, - "302": 900, - "491": 840 - }, - "283469": { - "1": 960 - }, - "283478": { - "1": 960, - "229": 900, - "324": 1000, - "328": 900, - "428": 840, - "589": 700, - "836": 626 - }, - "283548": { - "1": 960, - "149": 501, - "159": 626 - }, - "283680": { - "1": 960, - "22": 840 - }, - "283681": { - "1": 840, - "10": 700 - }, - "283682": { - "1": 700, - "175": 626, - "346": 501 - }, - "283685": { - "1": 501, - "7": 438, - "49": 219, - "57": 125, - "74": 22, - "76": 44, - "95": 13, - "98": 22, - "100": 31, - "102": 44, - "157": 31, - "166": 44, - "213": 31, - "256": 501, - "294": 438 - }, - "283820": { - "1": 960, - "51": 501, - "1531": 438 - }, - "283830": { - "1": 438, - "414": 313 - }, - "283834": { - "1": 313 - }, - "283835": { - "1": 313 - }, - "283865": { - "1": 960, - "143": 900, - "324": 840, - "484": 700, - "722": 626, - "932": 501, - "1166": 438 - }, - "283876": { - "1": 960, - "205": 900, - "402": 840, - "554": 700 - }, - "283877": { - "1": 700, - "64": 626, - "249": 501, - "503": 438, - "1346": 313 - }, - "283884": { - "1": 960, - "428": 900, - "618": 840 - }, - "283885": { - "1": 840, - "24": 700, - "249": 626, - "444": 501, - "740": 438, - "1482": 313 - }, - "283933": { - "1": 960, - "100": 1000, - "119": 960 - }, - "283934": { - "1": 960, - "33": 900, - "271": 840, - "410": 700, - "698": 626, - "842": 501, - "1075": 438 - }, - "283946": { - "1": 1000, - "133": 960, - "263": 900, - "425": 840, - "583": 700, - "826": 626, - "1012": 501, - "1225": 438 - }, - "283964": { - "1": 960, - "3": 438 - }, - "284006": { - "1": 960, - "105": 501, - "162": 438, - "190": 501 - }, - "284014": { - "1": 501 - }, - "284025": { - "1": 1000, - "155": 960 - }, - "284029": { - "1": 960, - "39": 900 - }, - "284035": { - "1": 900, - "74": 840, - "278": 700 - }, - "284036": { - "1": 700, - "140": 626 - }, - "284037": { - "1": 626, - "7": 501, - "258": 438 - }, - "284038": { - "1": 438 - }, - "284039": { - "1": 438 - }, - "284040": { - "1": 438 - }, - "284041": { - "1": 438 - }, - "284042": { - "1": 438 - }, - "284043": { - "1": 438 - }, - "284044": { - "1": 438 - }, - "297050": { - "1": 0, - "12": 6 - }, - "297056": { - "1": 0, - "4": 6 - }, - "297057": { - "1": 6 - }, - "297099": { - "1": 0, - "3": 6 - }, - "297100": { - "1": 6, - "164": 6, - "182": 6, - "195": 6, - "207": 6, - "217": 6 - }, - "297101": { - "1": 6 - }, - "297113": { - "1": 6 - }, - "297114": { - "1": 6 - }, - "297175": { - "1": 6 - }, - "297176": { - "1": 0, - "11": 6 - }, - "297177": { - "1": 6 - }, - "297178": { - "1": 6 - }, - "297215": { - "1": 720 - }, - "297218": { - "1": 720, - "9": 6 - }, - "297219": { - "1": 6, - "28": 6 - }, - "297224": { - "1": 0, - "10": 6 - }, - "297225": { - "1": 6 - }, - "297227": { - "1": 0, - "9": 6 - }, - "297292": { - "1": 6, - "326": 6 - }, - "297293": { - "1": 6 - }, - "297296": { - "1": 6, - "208": 6 - }, - "297308": { - "1": 6 - }, - "297359": { - "1": 0, - "34": 840, - "51": 720 - }, - "297411": { - "1": 0, - "25": 6, - "35": 6, - "449": 6 - }, - "297424": { - "1": 0, - "13": 720 - }, - "297425": { - "1": 720 - }, - "297426": { - "1": 720, - "7": 6 - }, - "297429": { - "1": 6, - "49": 6 - }, - "297430": { - "1": 6 - }, - "297431": { - "1": 6 - }, - "297432": { - "1": 6 - }, - "297433": { - "1": 6 - }, - "297434": { - "1": 6, - "134": 6 - }, - "297435": { - "1": 6 - }, - "297467": { - "1": 0, - "4": 840, - "54": 720 - }, - "297468": { - "1": 720 - }, - "297469": { - "1": 720 - }, - "297483": { - "1": 0, - "32": 720, - "172": 6 - }, - "297484": { - "1": 6 - }, - "297485": { - "1": 6, - "201": 6 - }, - "297486": { - "1": 6, - "306": 6 - }, - "297487": { - "1": 6 - }, - "297488": { - "1": 6, - "158": 6 - }, - "297503": { - "1": 0, - "5": 6, - "324": 6 - }, - "297504": { - "1": 6 - }, - "297505": { - "1": 6, - "311": 6 - }, - "297557": { - "1": 0, - "7": 720, - "29": 0, - "42": 0, - "50": 0, - "58": 0, - "67": 720, - "301": 6 - }, - "297558": { - "1": 0, - "9": 6, - "258": 6 - }, - "297562": { - "1": 6, - "70": 0, - "77": 0, - "87": 0, - "96": 0, - "107": 0, - "120": 6 - }, - "297563": { - "1": 6, - "63": 6 - }, - "297598": { - "1": 0, - "18": 720 - }, - "297599": { - "1": 720, - "91": 6 - }, - "297603": { - "1": 6, - "110": 6 - }, - "297604": { - "1": 6 - }, - "297605": { - "1": 600, - "190": 450, - "224": 0, - "233": 0, - "242": 0, - "250": 0, - "257": 450 - }, - "297606": { - "1": 450 - }, - "297620": { - "1": 0, - "24": 720, - "26": 720, - "37": 720 - }, - "297656": { - "1": 0, - "21": 600, - "36": 840, - "51": 720 - }, - "297665": { - "1": 600 - }, - "297666": { - "1": 600 - }, - "297670": { - "1": 0, - "5": 0, - "14": 0, - "21": 720 - }, - "297674": { - "1": 0, - "3": 720 - }, - "297675": { - "1": 720, - "57": 720, - "410": 600 - }, - "297722": { - "1": 0, - "35": 720 - }, - "297723": { - "1": 720, - "14": 0, - "28": 0, - "34": 0, - "42": 0, - "51": 720 - }, - "298996": { - "1": 0, - "28": 450 - }, - "298997": { - "1": 450, - "4": 1800, - "38": 0 - }, - "299000": { - "1": 0, - "4": 450 - }, - "299042": { - "1": 0, - "13": 450 - }, - "299061": { - "1": 0, - "22": 300, - "35": 720, - "37": 720, - "249": 600 - }, - "299062": { - "1": 600 - }, - "299064": { - "1": 0, - "7": 600 - }, - "299065": { - "1": 600 - }, - "299067": { - "1": 600, - "31": 450 - }, - "299096": { - "1": 0, - "2": 720 - }, - "299149": { - "1": 0, - "18": 720, - "33": 720, - "215": 720 - }, - "299178": { - "1": 0, - "36": 720, - "52": 720 - }, - "299180": { - "1": 0, - "5": 720 - }, - "299184": { - "1": 720, - "201": 600 - }, - "299185": { - "1": 600 - }, - "299327": { - "1": 720, - "30": 600 - }, - "299329": { - "1": 600 - }, - "299368": { - "1": 0, - "35": 720 - }, - "299369": { - "1": 720 - }, - "299370": { - "1": 720, - "8": 0, - "47": 720, - "56": 649, - "163": 541 - }, - "299380": { - "1": 0, - "34": 720, - "132": 910, - "137": 720, - "143": 910, - "151": 910 - }, - "299381": { - "1": 910 - }, - "299394": { - "1": 0, - "5": 910 - }, - "299395": { - "1": 910, - "29": 720 - }, - "299396": { - "1": 720 - }, - "299420": { - "1": 0, - "2": 720, - "11": 720 - }, - "299443": { - "1": 0, - "51": 720 - }, - "299450": { - "1": 0, - "38": 720 - }, - "299477": { - "1": 0, - "39": 720 - }, - "299478": { - "1": 720 - }, - "299479": { - "1": 720, - "100": 649 - }, - "299480": { - "1": 649, - "389": 541 - }, - "299481": { - "1": 541, - "416": 406, - "676": 270, - "691": 135 - }, - "299593": { - "1": 720, - "216": 720, - "361": 649, - "713": 541 - }, - "299594": { - "1": 541 - }, - "299595": { - "1": 541 - }, - "299597": { - "1": 0, - "3": 541 - }, - "299649": { - "1": 0, - "9": 649, - "36": 720, - "64": 910, - "87": 720, - "96": 649, - "103": 900, - "263": 720 - }, - "300087": { - "1": 0, - "35": 270, - "49": 135 - }, - "300105": { - "1": 720 - }, - "300106": { - "1": 720 - }, - "300107": { - "1": 720 - }, - "300117": { - "1": 0, - "30": 720 - }, - "300122": { - "1": 0, - "46": 1190, - "50": 720, - "482": 649, - "817": 541, - "1210": 406 - }, - "300123": { - "1": 406 - }, - "300155": { - "1": 0, - "29": 720, - "423": 649, - "750": 541 - }, - "300156": { - "1": 541 - }, - "300157": { - "1": 0, - "9": 541, - "180": 406, - "948": 270 - }, - "300226": { - "1": 0, - "38": 720, - "64": 1190, - "154": 720 - }, - "300233": { - "1": 0, - "43": 720 - }, - "300234": { - "1": 720 - }, - "300235": { - "1": 720 - }, - "300236": { - "1": 0, - "11": 720 - }, - "300237": { - "1": 720, - "5": 649, - "286": 541 - }, - "300238": { - "1": 0, - "30": 541, - "253": 406 - }, - "300239": { - "1": 406 - }, - "300240": { - "1": 406, - "329": 270 - }, - "300280": { - "1": 0, - "24": 720, - "578": 649 - }, - "300281": { - "1": 1 - }, - "300282": { - "1": 649, - "180": 541 - }, - "300283": { - "1": 541 - }, - "300284": { - "1": 541, - "679": 406 - }, - "300364": { - "1": 0, - "27": 649, - "30": 720 - }, - "300365": { - "1": 720 - }, - "300366": { - "1": 720 - }, - "300367": { - "1": 720 - }, - "300368": { - "1": 720 - }, - "300369": { - "1": 720 - }, - "300370": { - "1": 720 - }, - "300371": { - "1": 720 - }, - "300372": { - "1": 120 - }, - "300373": { - "1": 720 - }, - "300374": { - "1": 720 - }, - "300375": { - "1": 720, - "22": 649 - }, - "300389": { - "1": 541 - }, - "300390": { - "1": 0, - "2": 720 - }, - "300391": { - "1": 720 - }, - "300392": { - "1": 720 - }, - "300393": { - "1": 720 - }, - "300394": { - "1": 720 - }, - "300395": { - "1": 720 - }, - "300396": { - "1": 720 - }, - "300397": { - "1": 720 - }, - "300398": { - "1": 720 - }, - "300399": { - "1": 720 - }, - "300400": { - "1": 720, - "93": 649, - "405": 541 - }, - "300401": { - "1": 0, - "19": 541, - "396": 406 - }, - "300459": { - "1": 0, - "29": 649, - "34": 720 - }, - "300461": { - "1": 720 - }, - "300462": { - "1": 720, - "12": 649 - }, - "300463": { - "1": 649 - }, - "300464": { - "1": 649, - "87": 541 - }, - "300466": { - "1": 541, - "501": 406, - "627": 270 - }, - "300467": { - "1": 270, - "10": 406, - "519": 270 - }, - "300497": { - "1": 0, - "25": 910, - "50": 900 - }, - "300514": { - "1": 0, - "27": 720, - "34": 910, - "62": 900, - "100": 910, - "116": 720 - }, - "300515": { - "1": 720, - "416": 649, - "738": 541 - }, - "300516": { - "1": 541 - }, - "300517": { - "1": 541, - "309": 406 - }, - "300558": { - "1": 0, - "8": 649, - "104": 541 - }, - "300560": { - "1": 541, - "253": 406, - "954": 270 - }, - "300574": { - "1": 0, - "15": 649, - "20": 720 - }, - "300575": { - "1": 720 - }, - "300576": { - "1": 0, - "7": 720, - "152": 649, - "517": 541, - "865": 406, - "873": 541 - }, - "300631": { - "1": 0, - "41": 720 - }, - "300632": { - "1": 720 - }, - "300633": { - "1": 720, - "292": 649 - }, - "300635": { - "1": 649, - "165": 541 - }, - "300636": { - "1": 541, - "835": 406, - "1493": 270 - }, - "300673": { - "1": 0, - "46": 720 - }, - "300674": { - "1": 720 - }, - "300675": { - "1": 720 - }, - "300676": { - "1": 720 - }, - "300742": { - "1": 0, - "56": 720 - }, - "300777": { - "1": 0, - "19": 910, - "21": 720, - "388": 649 - }, - "300780": { - "1": 0, - "3": 649, - "243": 541 - }, - "300785": { - "1": 541, - "579": 406, - "1262": 270 - }, - "300806": { - "1": 0, - "36": 910, - "69": 900, - "201": 910 - }, - "300811": { - "1": 0, - "6": 910, - "124": 720 - }, - "300812": { - "1": 649 - }, - "300816": { - "1": 0, - "6": 649 - }, - "300817": { - "1": 649, - "114": 541 - }, - "301046": { - "1": 0, - "162": 4422 - }, - "301141": { - "1": 0, - "12": 18090, - "21": 42280 - }, - "301142": { - "1": 42280, - "30": 18090 - }, - "301161": { - "1": 0, - "36": 42280, - "410": 18090 - }, - "301165": { - "1": 18090 - }, - "301179": { - "1": 0, - "34": 80500 - }, - "301180": { - "1": 80500, - "29": 42280 - }, - "301183": { - "1": 0, - "3": 42280 - }, - "301281": { - "1": 0, - "36": 42280 - }, - "301283": { - "1": 0, - "3": 42280, - "524": 18090, - "859": 4422, - "862": 18090 - }, - "301298": { - "1": 0, - "45": 80500, - "547": 42280 - }, - "301323": { - "1": 0, - "35": 42280, - "39": 80500, - "509": 42280 - }, - "301330": { - "1": 0, - "21": 80500 - }, - "301359": { - "1": 0, - "32": 80500 - }, - "301384": { - "1": 80500 - }, - "301391": { - "1": 0, - "37": 80500 - }, - "301392": { - "1": 80500, - "288": 42280 - }, - "301393": { - "1": 0, - "2": 42280 - }, - "301396": { - "1": 42280 - }, - "301397": { - "1": 42280, - "267": 18090 - }, - "301398": { - "1": 18090 - }, - "301399": { - "1": 18090 - }, - "301417": { - "1": 0, - "50": 80500 - }, - "301447": { - "1": 0, - "33": 80500, - "220": 42280 - }, - "301448": { - "1": 42280 - }, - "301449": { - "1": 42280, - "78": 18090 - }, - "301450": { - "1": 18090 - }, - "301461": { - "1": 0, - "28": 80500, - "424": 42280 - }, - "301472": { - "1": 0, - "34": 80500, - "489": 42280 - }, - "301475": { - "1": 42280 - }, - "301476": { - "1": 42280, - "239": 18090, - "787": 4422 - }, - "301519": { - "1": 0, - "34": 80500, - "187": 42280 - }, - "301524": { - "1": 42280 - }, - "301529": { - "1": 42280 - }, - "301530": { - "1": 42280 - }, - "301531": { - "1": 42280, - "6": 18090 - }, - "301532": { - "1": 18090 - }, - "301567": { - "1": 0, - "12": 80500, - "20": 80500, - "267": 42280 - }, - "301627": { - "1": 0, - "43": 80500, - "45": 80500, - "62": 42280, - "82": 80500, - "264": 42280 - }, - "301664": { - "1": 0, - "27": 42280, - "49": 80500, - "203": 42280 - }, - "301665": { - "1": 42280 - }, - "301694": { - "1": 0, - "27": 1120, - "64": 1360 - }, - "301912": { - "1": 0, - "43": 42280 - }, - "301913": { - "1": 42280 - }, - "301914": { - "1": 42280 - }, - "301941": { - "1": 0, - "11": 1360, - "32": 42280 - }, - "301959": { - "1": 0, - "25": 80500, - "433": 42280, - "1061": 18090 - }, - "301960": { - "1": 18090 - }, - "301970": { - "1": 0, - "6": 80500 - }, - "301984": { - "1": 0, - "12": 80500 - }, - "301985": { - "1": 80500, - "51": 42280 - }, - "301986": { - "1": 42280, - "343": 18090 - }, - "301987": { - "1": 18090, - "1057": 4422 - }, - "301997": { - "1": 0, - "33": 80500, - "285": 42280 - }, - "301998": { - "1": 42280, - "639": 18090 - }, - "302019": { - "1": 0, - "33": 80500 - }, - "302026": { - "1": 0, - "15": 800 - }, - "302029": { - "1": 800 - }, - "302031": { - "1": 800, - "100": 630 - }, - "302033": { - "1": 630, - "2": 405 - }, - "302034": { - "1": 405 - }, - "302037": { - "1": 0, - "3": 405 - }, - "302038": { - "1": 405 - }, - "302040": { - "1": 405 - }, - "302041": { - "1": 405 - }, - "302042": { - "1": 405 - }, - "302043": { - "1": 405, - "201": 198 - }, - "302131": { - "1": 0, - "29": 630, - "340": 405 - }, - "302159": { - "1": 0, - "33": 630 - }, - "302163": { - "1": 0, - "31": 630, - "456": 405 - }, - "302165": { - "1": 405 - }, - "302166": { - "1": 405 - }, - "302225": { - "1": 0, - "54": 630, - "562": 405 - }, - "302228": { - "1": 0, - "58": 405, - "72": 800, - "80": 630, - "83": 800, - "115": 630 - }, - "302229": { - "1": 630 - }, - "302240": { - "1": 800, - "8": 630, - "609": 405, - "624": 630, - "625": 405, - "633": 630, - "673": 405 - }, - "302262": { - "1": 0, - "13": 198, - "28": 630, - "33": 800, - "271": 630 - }, - "302263": { - "1": 630, - "530": 405 - }, - "302277": { - "1": 0, - "5": 630 - }, - "302279": { - "1": 405, - "28": 198 - }, - "302280": { - "1": 198 - }, - "302322": { - "1": 0, - "27": 405, - "31": 630, - "116": 405 - }, - "302328": { - "1": 0, - "41": 630, - "514": 405 - }, - "302337": { - "1": 0, - "24": 800, - "117": 630 - }, - "302342": { - "1": 0, - "19": 630 - }, - "302343": { - "1": 630 - }, - "302344": { - "1": 0, - "3": 630 - }, - "302350": { - "1": 405 - }, - "302388": { - "1": 0, - "21": 800, - "577": 630 - }, - "302392": { - "1": 0, - "34": 800 - }, - "302393": { - "1": 800, - "483": 630, - "586": 630, - "591": 630, - "601": 630 - }, - "302448": { - "1": 0, - "21": 800, - "620": 630, - "1501": 405 - }, - "302472": { - "1": 0, - "20": 800 - }, - "302473": { - "1": 800, - "2": 630 - }, - "302474": { - "1": 630 - }, - "302475": { - "1": 70 - }, - "302476": { - "1": 630, - "78": 405 - }, - "302479": { - "1": 0, - "30": 800, - "36": 920, - "82": 800 - }, - "302484": { - "1": 920, - "32": 800 - }, - "302485": { - "1": 800, - "579": 630 - }, - "302492": { - "1": 0, - "10": 630 - }, - "302493": { - "1": 1 - }, - "302494": { - "1": 630, - "183": 405 - }, - "302509": { - "1": 0, - "34": 920 - }, - "302513": { - "1": 0, - "28": 920 - }, - "302522": { - "1": 0, - "24": 800 - }, - "302523": { - "1": 800 - }, - "302525": { - "1": 800, - "621": 630 - }, - "302526": { - "1": 630 - }, - "302548": { - "1": 0, - "40": 920, - "54": 800 - }, - "302551": { - "1": 100 - }, - "302553": { - "1": 800 - }, - "302554": { - "1": 100 - }, - "302555": { - "1": 800 - }, - "302563": { - "1": 0, - "40": 920, - "45": 800 - }, - "302565": { - "1": 100 - }, - "302572": { - "1": 0, - "6": 800 - }, - "302573": { - "1": 800, - "78": 630, - "980": 800, - "1030": 405 - }, - "302596": { - "1": 0, - "31": 198, - "39": 800, - "648": 630 - }, - "302597": { - "1": 630, - "586": 405 - }, - "302634": { - "1": 0, - "37": 800 - }, - "302635": { - "1": 800, - "124": 630, - "916": 405 - }, - "302651": { - "1": 800 - }, - "302654": { - "1": 800 - }, - "302661": { - "1": 800 - }, - "302663": { - "1": 800, - "208": 630, - "432": 405 - }, - "303825": { - "1": 630, - "77": 405 - }, - "303832": { - "1": 0, - "9": 1680, - "63": 920, - "144": 800, - "1079": 630, - "1594": 405 - }, - "303838": { - "1": 0, - "51": 1120, - "243": 920, - "523": 800, - "1248": 630, - "1857": 405 - }, - "303885": { - "1": 0, - "59": 1120, - "87": 1190, - "173": 1120, - "415": 920, - "585": 800, - "1399": 630, - "2015": 405 - }, - "303948": { - "1": 0, - "50": 1120, - "55": 1190, - "150": 1120, - "158": 1520, - "162": 1120, - "336": 920, - "641": 800, - "1347": 630 - }, - "303998": { - "1": 0, - "49": 1190, - "79": 1520, - "131": 1190, - "206": 1120 - }, - "303999": { - "1": 1120, - "17": 920, - "298": 800 - }, - "304000": { - "1": 800 - }, - "304062": { - "1": 0, - "53": 198, - "56": 630, - "58": 920, - "61": 198, - "63": 1120, - "64": 1190, - "127": 1120, - "145": 920, - "377": 800, - "1181": 630, - "1914": 405 - }, - "304119": { - "1": 0, - "7": 1520, - "56": 1190, - "62": 1520 - }, - "304120": { - "1": 1520, - "40": 1190, - "95": 1120, - "111": 1190, - "169": 1120, - "235": 920 - }, - "304125": { - "1": 920, - "261": 800, - "893": 630, - "1603": 405 - }, - "304144": { - "1": 0, - "63": 1520, - "70": 1680, - "138": 1520, - "411": 1190, - "488": 1120, - "535": 920, - "916": 800, - "1574": 630, - "2222": 405 - }, - "304158": { - "1": 0, - "163": 1120, - "226": 920, - "459": 800, - "708": 630, - "930": 405, - "1144": 800, - "1221": 630, - "2012": 405 - }, - "304169": { - "1": 0, - "38": 1520, - "79": 1120, - "88": 1190, - "167": 1120, - "199": 920, - "458": 800, - "1109": 630, - "1312": 405, - "1438": 198 - }, - "304170": { - "1": 198 - }, - "304199": { - "1": 0, - "10": 1190 - }, - "304200": { - "1": 1190, - "39": 1120, - "194": 920 - }, - "304204": { - "1": 0, - "47": 1520, - "59": 1120, - "61": 1520, - "79": 1680, - "105": 1520, - "259": 1190, - "262": 1120, - "365": 920 - }, - "304209": { - "1": 0, - "39": 1520, - "178": 1190, - "190": 1520, - "219": 1190, - "280": 1120, - "433": 920 - }, - "304291": { - "1": 0, - "12": 1520, - "13": 0, - "37": 1520 - }, - "304292": { - "1": 1520, - "50": 1680, - "69": 1520, - "78": 1680, - "138": 1520, - "185": 1190, - "249": 1120, - "360": 920, - "505": 800, - "1083": 630, - "1735": 405, - "1780": 0, - "1781": 405 - }, - "304333": { - "1": 0, - "4": 1680, - "71": 0, - "74": 1680, - "82": 1520, - "120": 1680, - "448": 1190, - "503": 1120, - "579": 920, - "739": 800, - "1366": 630 - }, - "304354": { - "1": 0, - "80": 1680 - }, - "304366": { - "1": 0, - "4": 1680, - "26": 0, - "32": 1680, - "339": 1520, - "354": 1680, - "380": 1520, - "507": 1190, - "570": 1120, - "639": 920, - "755": 800, - "1388": 630 - }, - "304446": { - "1": 0, - "34": 1680 - }, - "304447": { - "1": 1680, - "230": 1520, - "289": 1190, - "420": 1120, - "483": 920, - "615": 800, - "1145": 630, - "1370": 405 - }, - "304451": { - "1": 405 - }, - "304505": { - "1": 0, - "47": 1680 - }, - "304506": { - "1": 1680 - }, - "304507": { - "1": 1680, - "50": 1520, - "76": 1190, - "172": 1120 - }, - "304508": { - "1": 920, - "130": 800, - "710": 630, - "1259": 405 - }, - "304562": { - "1": 0, - "4": 1680, - "57": 0, - "60": 1680, - "268": 1520, - "416": 1190, - "473": 1120, - "520": 920, - "579": 800, - "626": 630, - "684": 405, - "821": 198 - }, - "304616": { - "1": 0, - "48": 1680, - "287": 1520, - "461": 1190, - "501": 1120, - "580": 920, - "720": 800 - }, - "304625": { - "1": 0, - "49": 1680, - "56": 0, - "65": 1680, - "382": 1520 - }, - "304626": { - "1": 1520 - }, - "304654": { - "1": 0, - "41": 1680, - "351": 1520, - "538": 1190, - "595": 1120, - "668": 920 - }, - "304655": { - "1": 920, - "91": 800, - "686": 630 - }, - "304661": { - "1": 0, - "43": 1680 - }, - "304662": { - "1": 1680, - "109": 1520 - }, - "304663": { - "1": 1520, - "127": 1190, - "207": 1120, - "278": 920, - "405": 800 - }, - "304671": { - "1": 0, - "41": 1680, - "360": 1520, - "362": 1680, - "434": 1520, - "544": 1190, - "612": 1120, - "679": 920, - "783": 800 - }, - "304672": { - "1": 800 - }, - "304737": { - "1": 0, - "69": 1680, - "76": 1520, - "90": 1680 - }, - "304738": { - "1": 1680, - "365": 1520, - "489": 1190, - "563": 1120, - "631": 920, - "769": 800, - "1332": 630, - "1579": 405 - }, - "304739": { - "1": 0, - "3": 405 - }, - "304740": { - "1": 405 - }, - "304776": { - "1": 0, - "16": 1680, - "20": 0, - "48": 1680 - }, - "304777": { - "1": 1680, - "101": 1680, - "226": 1680, - "263": 1520, - "266": 1680, - "357": 1520 - }, - "304778": { - "1": 0, - "4": 1120, - "47": 1120, - "122": 920, - "257": 800, - "854": 630 - }, - "304797": { - "1": 0, - "4": 1680, - "11": 0, - "22": 1680, - "426": 1520, - "554": 1190, - "581": 1120, - "672": 920, - "772": 800, - "1459": 630, - "2087": 405, - "2864": 198 - }, - "305044": { - "1": 0, - "3": 1680, - "56": 1520 - }, - "305045": { - "1": 1520, - "2": 1190, - "67": 1120, - "143": 920, - "286": 800, - "376": 630, - "789": 405 - }, - "305046": { - "1": 405, - "5": 630, - "267": 405 - }, - "305059": { - "1": 0, - "62": 1680, - "529": 1520, - "535": 1680 - }, - "305062": { - "1": 210 - }, - "305063": { - "1": 1680, - "30": 1520 - }, - "305064": { - "1": 1520, - "97": 1190, - "173": 1120, - "243": 920, - "460": 800, - "982": 630, - "1587": 405 - }, - "305081": { - "1": 0, - "52": 1680, - "69": 1520, - "756": 1190, - "828": 1120, - "900": 920, - "1096": 800 - }, - "305112": { - "1": 0, - "66": 1680, - "147": 1520, - "720": 1190, - "813": 1120, - "891": 920, - "957": 800 - }, - "305113": { - "1": 0, - "9": 800 - }, - "305114": { - "1": 800, - "32": 630 - }, - "305178": { - "1": 0, - "50": 1680 - }, - "305179": { - "1": 1680 - }, - "305180": { - "1": 210 - }, - "305181": { - "1": 210 - }, - "305182": { - "1": 210 - }, - "305183": { - "1": 1680 - }, - "305184": { - "1": 210 - }, - "305186": { - "1": 1680, - "100": 1520, - "232": 1190, - "373": 1120, - "407": 920 - }, - "305188": { - "1": 920, - "17": 800, - "34": 630, - "469": 405, - "481": 198 - }, - "305202": { - "1": 0, - "65": 1680, - "550": 1520 - }, - "305204": { - "1": 1190, - "146": 920, - "320": 800, - "861": 630 - }, - "305207": { - "1": 0, - "43": 1680, - "667": 1520, - "786": 1190, - "859": 1120, - "944": 920, - "1059": 800 - }, - "305208": { - "1": 800 - }, - "305234": { - "1": 0, - "50": 1680, - "63": 1520 - }, - "305236": { - "1": 1520 - }, - "305237": { - "1": 1520, - "595": 1190, - "672": 1120, - "796": 920, - "843": 800 - }, - "305247": { - "1": 0, - "38": 1680, - "58": 1520 - }, - "305248": { - "1": 1520, - "294": 1190, - "373": 1120, - "507": 920, - "668": 800 - }, - "305252": { - "1": 800, - "204": 630 - }, - "305282": { - "1": 0, - "73": 1680, - "87": 1520 - }, - "305310": { - "1": 0, - "59": 1680, - "65": 1520 - }, - "305311": { - "1": 1520 - }, - "305312": { - "1": 1520, - "99": 1190, - "164": 1120 - }, - "305313": { - "1": 1120, - "89": 920, - "258": 800 - }, - "305314": { - "1": 800, - "76": 630, - "367": 405 - }, - "305336": { - "1": 0, - "36": 1680 - }, - "305338": { - "1": 1680 - }, - "305341": { - "1": 1680, - "265": 1520, - "381": 1190, - "468": 1120 - }, - "305349": { - "1": 1120 - }, - "305350": { - "1": 920 - }, - "305351": { - "1": 920, - "148": 800, - "559": 630 - }, - "305358": { - "1": 0, - "90": 1680 - }, - "305364": { - "1": 0, - "45": 1680 - }, - "305365": { - "1": 1680, - "443": 1520, - "444": 1680, - "462": 1520, - "569": 1190, - "651": 1120, - "723": 920 - }, - "305366": { - "1": 920, - "73": 800, - "590": 630, - "1058": 405 - }, - "305376": { - "1": 0, - "65": 1680 - }, - "305377": { - "1": 1680, - "217": 1520, - "398": 1680, - "438": 1520, - "591": 1190, - "663": 1120, - "705": 920, - "780": 800, - "1374": 630 - }, - "305405": { - "1": 1470, - "491": 1330, - "544": 1470, - "549": 1470 - }, - "305406": { - "1": 1470, - "29": 1330, - "126": 1190, - "238": 1120, - "370": 1035, - "522": 900, - "1020": 700, - "1462": 450 - }, - "305440": { - "1": 0, - "18": 1470 - }, - "305441": { - "1": 1470 - }, - "305516": { - "1": 0, - "27": 1470, - "42": 1470, - "64": 1470, - "232": 1330, - "557": 1470, - "611": 1330 - }, - "305517": { - "1": 1330, - "37": 1190 - }, - "305518": { - "1": 1120, - "129": 1035, - "328": 900, - "837": 700 - }, - "305586": { - "1": 1470, - "4": 0, - "33": 1470, - "45": 1470, - "55": 1470, - "548": 1330 - }, - "305589": { - "1": 1470, - "2": 1190, - "40": 1120, - "221": 1035, - "362": 900 - }, - "305590": { - "1": 900, - "177": 700, - "714": 450 - }, - "305636": { - "1": 1470, - "22": 0, - "60": 1470, - "167": 1470, - "199": 1470, - "528": 1330, - "673": 1190, - "813": 1120, - "905": 1035, - "1107": 900, - "1605": 700, - "2209": 450 - }, - "305766": { - "1": 0, - "54": 1470, - "629": 1330, - "717": 1190, - "829": 1120 - }, - "305809": { - "1": 1470 - }, - "305814": { - "1": 1470, - "5": 0, - "84": 1470, - "560": 1330, - "651": 1190, - "780": 1120, - "879": 1035, - "1030": 900, - "1160": 700, - "1164": 900, - "1416": 700 - }, - "305821": { - "1": 1470, - "35": 0, - "42": 1470, - "49": 0, - "57": 1470, - "567": 1330, - "720": 1190 - }, - "305832": { - "1": 1470, - "5": 0, - "86": 1470 - }, - "305840": { - "1": 1190, - "135": 1120, - "257": 1035, - "448": 900, - "965": 700 - }, - "305842": { - "1": 700, - "431": 450 - }, - "305862": { - "1": 0, - "79": 1470, - "637": 1330 - }, - "305898": { - "1": 1470, - "66": 0, - "68": 1470, - "647": 1330, - "747": 1190 - }, - "305902": { - "1": 1470, - "42": 0, - "51": 1470 - }, - "305967": { - "1": 1470 - }, - "306029": { - "1": 0, - "3": 0, - "10": 0, - "17": 0, - "24": 0, - "30": 0, - "35": 0, - "41": 0, - "47": 0, - "58": 0, - "62": 1470, - "73": 1470 - }, - "306030": { - "1": 1470 - }, - "306036": { - "1": 1470, - "6": 0, - "58": 1470 - }, - "306037": { - "1": 1470, - "3": 1470 - }, - "306038": { - "1": 1470, - "7": 1470, - "13": 1470, - "74": 1470 - }, - "306041": { - "1": 1470, - "299": 1330 - }, - "306042": { - "1": 1330, - "70": 1190, - "196": 1120, - "317": 1035 - }, - "306048": { - "1": 1035 - }, - "306049": { - "1": 1035, - "7": 900 - }, - "306051": { - "1": 900, - "137": 700 - }, - "306091": { - "1": 1470, - "3": 0, - "45": 0, - "422": 1470, - "437": 1470, - "565": 1330 - }, - "306092": { - "1": 1330, - "56": 1190, - "182": 1120, - "275": 1035, - "433": 900 - }, - "306095": { - "1": 900, - "25": 700 - }, - "306121": { - "1": 1470 - }, - "306122": { - "1": 1470 - }, - "306125": { - "1": 1470, - "343": 1330, - "435": 1190, - "573": 1120, - "672": 1035, - "899": 900, - "1379": 700, - "2004": 450 - }, - "306126": { - "1": 450, - "38": 242, - "48": 450, - "96": 242, - "171": 242, - "199": 242, - "247": 242 - }, - "306134": { - "1": 1470, - "9": 0, - "51": 1470 - }, - "306135": { - "1": 1470, - "520": 1330, - "524": 1470, - "603": 1330, - "705": 1190, - "819": 1120, - "994": 1035 - }, - "306138": { - "1": 1470, - "6": 900, - "387": 700, - "1018": 450 - }, - "306139": { - "1": 450, - "20": 450, - "42": 450, - "524": 242, - "528": 450, - "550": 242, - "1087": 242, - "1094": 450 - }, - "306153": { - "1": 1470, - "6": 0, - "77": 1470 - }, - "306154": { - "1": 1470, - "405": 1330, - "594": 1190, - "706": 1120, - "842": 1035, - "1034": 900 - }, - "306155": { - "1": 900, - "303": 700, - "945": 450 - }, - "306169": { - "1": 450, - "371": 242 - }, - "306170": { - "1": 242 - }, - "306171": { - "1": 1470, - "10": 242 - }, - "306418": { - "1": 1470 - }, - "306419": { - "1": 1470 - }, - "306420": { - "1": 1470 - }, - "306422": { - "1": 1470, - "4": 1330 - }, - "306423": { - "1": 1330, - "111": 1120, - "237": 1035 - }, - "306432": { - "1": 900, - "174": 242, - "337": 900 - }, - "306454": { - "1": 1470 - }, - "306455": { - "1": 210 - }, - "306456": { - "1": 1470, - "484": 1190, - "625": 1120 - }, - "306457": { - "1": 1120 - }, - "306458": { - "1": 1120, - "12": 900, - "40": 1035 - }, - "306459": { - "1": 1035, - "5": 900, - "357": 700, - "952": 450, - "2020": 242 - }, - "306460": { - "1": 242 - }, - "315257": { - "1": 2100 - }, - "315259": { - "1": 2100 - }, - "315264": { - "1": 2100 - }, - "315265": { - "1": 2100 - }, - "315267": { - "1": 2100 - }, - "315270": { - "1": 2100 - }, - "315322": { - "1": 2100 - }, - "315339": { - "1": 2100 - }, - "315357": { - "1": 2100, - "2": 1890 - }, - "315361": { - "1": 1890 - }, - "315363": { - "1": 1890, - "130": 0 - }, - "315366": { - "1": 2100, - "3": 1890 - }, - "315420": { - "1": 1890 - }, - "315488": { - "1": 1470, - "8": 1470 - }, - "315489": { - "1": 1470 - }, - "315490": { - "1": 1470 - }, - "315506": { - "1": 1470 - }, - "315510": { - "1": 1470 - }, - "315512": { - "1": 1470 - }, - "315543": { - "1": 1470 - }, - "315555": { - "1": 1470, - "5": 1470 - }, - "315556": { - "1": 1470 - }, - "315557": { - "1": 1470 - }, - "315640": { - "1": 1470 - }, - "315641": { - "1": 210 - }, - "315642": { - "1": 1470 - }, - "315644": { - "1": 1470 - }, - "315645": { - "1": 1470 - }, - "315646": { - "1": 1470 - }, - "315647": { - "1": 1470 - }, - "315648": { - "1": 1470 - }, - "315689": { - "1": 1470 - }, - "315690": { - "1": 1470 - }, - "315702": { - "1": 1470 - }, - "315703": { - "1": 1470 - }, - "315704": { - "1": 1470 - }, - "315705": { - "1": 1470 - }, - "315713": { - "1": 1470 - }, - "315721": { - "1": 1470 - }, - "315741": { - "1": 1470 - }, - "315764": { - "1": 1470 - }, - "315770": { - "1": 1470 - }, - "315784": { - "1": 1470 - }, - "315785": { - "1": 1470 - }, - "315786": { - "1": 1470 - }, - "315790": { - "1": 1470 - }, - "315800": { - "1": 1470 - }, - "315801": { - "1": 1470 - }, - "315840": { - "1": 1470 - }, - "315973": { - "1": 1470 - }, - "315974": { - "1": 1050, - "21": 1050 - }, - "316058": { - "1": 1050, - "36": 1050 - }, - "316059": { - "1": 1050, - "54": 1050, - "60": 1050 - }, - "316060": { - "1": 1050, - "219": 1050 - }, - "316061": { - "1": 1050, - "112": 1050 - }, - "316062": { - "1": 1050 - }, - "316082": { - "1": 1050 - }, - "316110": { - "1": 1050 - }, - "316111": { - "1": 1050 - }, - "316113": { - "1": 1050 - }, - "316114": { - "1": 1050, - "10": 1050, - "726": 1050 - }, - "316153": { - "1": 1050, - "158": 1050, - "392": 1050, - "407": 1050, - "475": 1050, - "684": 1050 - }, - "316186": { - "1": 1050, - "4": 1050, - "62": 1050 - }, - "316187": { - "1": 1050, - "228": 1050, - "523": 1050, - "793": 1050, - "1127": 1050, - "1534": 1050 - }, - "316199": { - "1": 1050, - "429": 1050, - "702": 1050, - "989": 1050 - }, - "316200": { - "1": 1050 - }, - "316201": { - "1": 1050, - "145": 1050 - }, - "316202": { - "1": 1050, - "126": 1050 - }, - "316216": { - "1": 1050, - "234": 1050 - }, - "316217": { - "1": 1050, - "189": 1050 - }, - "316218": { - "1": 1050, - "190": 1050, - "547": 1050, - "929": 1050, - "935": 1050, - "962": 1050 - }, - "316219": { - "1": 1050 - }, - "316239": { - "1": 1050, - "199": 1050, - "563": 1050 - }, - "316240": { - "1": 1050, - "19": 1050, - "38": 1050, - "155": 1050, - "473": 1050, - "1155": 1050 - }, - "316241": { - "1": 1050 - }, - "316271": { - "1": 1050 - }, - "316361": { - "1": 1050, - "53": 1050 - }, - "316362": { - "1": 1050, - "7": 1050, - "238": 1050 - }, - "316363": { - "1": 1050, - "49": 1050 - }, - "316377": { - "1": 1050 - }, - "316378": { - "1": 1050 - }, - "316379": { - "1": 1050 - }, - "316380": { - "1": 1050, - "57": 1050, - "319": 1050, - "391": 1050, - "607": 1050, - "1002": 1050 - }, - "316455": { - "1": 1050, - "68": 1050 - }, - "316457": { - "1": 1050, - "12": 1050, - "19": 1050, - "130": 1050, - "143": 1050, - "154": 1050, - "161": 1050, - "416": 1050, - "771": 1050, - "1355": 1050 - }, - "316469": { - "1": 1050, - "400": 1050, - "600": 1050 - }, - "316470": { - "1": 1050, - "255": 1050 - }, - "316472": { - "1": 1050, - "89": 1050 - }, - "316505": { - "1": 1050, - "284": 1050, - "567": 1050, - "846": 1050, - "1247": 1050 - }, - "316569": { - "1": 1050, - "196": 1050, - "370": 1050, - "636": 1050, - "709": 1050, - "790": 1050, - "1155": 1050, - "1651": 1050 - }, - "316590": { - "1": 1050, - "262": 1050, - "474": 1050 - }, - "316613": { - "1": 1050 - }, - "316615": { - "1": 1050, - "268": 1050 - }, - "316666": { - "1": 1050, - "3": 1050, - "182": 1050, - "559": 1050, - "906": 1050 - }, - "316667": { - "1": 1050 - }, - "316700": { - "1": 1050, - "299": 1050 - }, - "316701": { - "1": 1050, - "103": 1050, - "389": 1050 - }, - "316702": { - "1": 1050, - "236": 1050 - }, - "316715": { - "1": 1050 - }, - "316716": { - "1": 1050, - "23": 1050 - }, - "316717": { - "1": 1050, - "119": 1050 - }, - "316718": { - "1": 1050, - "265": 1050 - }, - "316719": { - "1": 1050 - }, - "316720": { - "1": 1050, - "106": 1050 - }, - "316721": { - "1": 1050 - }, - "316722": { - "1": 1050, - "378": 1050 - }, - "316723": { - "1": 1050 - }, - "316758": { - "1": 1050, - "267": 1050, - "516": 1050, - "781": 1050, - "1089": 1050, - "1602": 1050 - }, - "316766": { - "1": 1050, - "363": 1050, - "588": 1050, - "871": 1050, - "1267": 1050, - "1897": 1050 - }, - "316876": { - "1": 1050, - "295": 1050, - "461": 1050, - "479": 1050, - "607": 1050 - }, - "316877": { - "1": 1050, - "210": 1050 - }, - "316879": { - "1": 1050, - "140": 1050 - }, - "316928": { - "1": 1050, - "3": 1050, - "58": 1050 - }, - "316985": { - "1": 1050, - "263": 1050 - }, - "316993": { - "1": 1050, - "121": 1050 - }, - "316994": { - "1": 1050 - }, - "316995": { - "1": 1050, - "86": 1050, - "401": 1050 - }, - "317080": { - "1": 1050 - }, - "317087": { - "1": 1050, - "267": 1050, - "510": 1050, - "836": 1050 - }, - "317089": { - "1": 1050, - "240": 1050, - "693": 1050 - }, - "317182": { - "1": 1050, - "237": 1050, - "516": 1050, - "807": 1050, - "1180": 1050 - }, - "317212": { - "1": 1050 - }, - "317213": { - "1": 1050, - "11": 1050, - "283": 1050 - }, - "317279": { - "1": 1050, - "35": 1050 - }, - "317291": { - "1": 1050, - "250": 1050, - "540": 1050 - }, - "317292": { - "1": 1050, - "25": 1050, - "325": 1050, - "336": 1050, - "337": 1050, - "342": 1050 - }, - "317297": { - "1": 1050, - "4": 1050, - "357": 1050 - }, - "317319": { - "1": 1050 - }, - "317320": { - "1": 1050, - "106": 1050, - "348": 1050, - "626": 1050, - "856": 1050, - "1363": 1050 - }, - "317338": { - "1": 1050 - }, - "317339": { - "1": 1050 - }, - "317340": { - "1": 1050, - "39": 1050, - "277": 1050 - }, - "317382": { - "1": 1050 - }, - "317383": { - "1": 1050 - }, - "317391": { - "1": 1050 - }, - "317392": { - "1": 1050, - "204": 1050, - "513": 1050, - "715": 1050, - "1048": 1050, - "1479": 1050 - }, - "317435": { - "1": 1050, - "4": 1050, - "214": 1050, - "484": 1050, - "832": 1050, - "1375": 1050 - }, - "317438": { - "1": 1050 - }, - "317475": { - "1": 1050, - "91": 1050, - "113": 1050 - }, - "317478": { - "1": 1050 - }, - "317484": { - "1": 1050, - "145": 1050, - "424": 1050 - }, - "317488": { - "1": 1050, - "228": 1050, - "708": 1050 - }, - "317527": { - "1": 1050, - "395": 1050, - "609": 1050, - "1043": 1050, - "1453": 1050 - }, - "317591": { - "1": 1050, - "298": 1050 - }, - "317626": { - "1": 1050, - "314": 1050, - "563": 1050, - "846": 1050, - "1132": 1050, - "1650": 1050 - }, - "317640": { - "1": 1050, - "279": 1050, - "424": 1050, - "718": 1050 - }, - "317641": { - "1": 1050, - "246": 1050, - "607": 1050, - "686": 1050, - "756": 1050 - }, - "317648": { - "1": 1050 - }, - "317649": { - "1": 1050, - "41": 1050, - "239": 1050, - "541": 1050 - }, - "317650": { - "1": 1050, - "197": 1050, - "751": 1050 - }, - "317661": { - "1": 1050, - "254": 1050, - "503": 1050, - "797": 1050, - "1113": 1050 - }, - "317663": { - "1": 1050, - "5": 1050, - "210": 1050, - "242": 1050, - "340": 1050 - }, - "317683": { - "1": 1050, - "269": 1050 - }, - "317696": { - "1": 1050, - "251": 1050, - "543": 1050 - }, - "318733": { - "1": 1050, - "3": 1050 - }, - "318828": { - "1": 1050, - "62": 1050 - }, - "318872": { - "1": 1050, - "31": 1050, - "266": 1050 - }, - "318874": { - "1": 1050 - }, - "318876": { - "1": 1050 - }, - "318877": { - "1": 1050, - "49": 1050 - }, - "319077": { - "1": 1050 - }, - "319337": { - "1": 1050, - "47": 1050, - "92": 1050, - "694": 1050 - }, - "319347": { - "1": 1050, - "114": 1050, - "274": 1050, - "487": 1050 - }, - "319348": { - "1": 1050 - }, - "319349": { - "1": 1050, - "21": 1050, - "44": 1050 - }, - "319449": { - "1": 1050, - "176": 1050 - }, - "319450": { - "1": 1050, - "100": 1050, - "593": 1050 - }, - "319456": { - "1": 1050, - "184": 1050 - }, - "319459": { - "1": 1050 - }, - "319486": { - "1": 1050 - }, - "319503": { - "1": 1050, - "10": 1050, - "261": 1050 - }, - "319524": { - "1": 1050, - "264": 1050, - "703": 1050, - "1248": 1050 - }, - "319526": { - "1": 1050, - "184": 1050, - "193": 1050, - "195": 1050, - "275": 1050 - }, - "319528": { - "1": 0, - "6": 1050, - "111": 1050 - }, - "319579": { - "1": 1050, - "277": 1050, - "758": 1050, - "1173": 1050, - "1401": 1050, - "1979": 1050, - "1987": 1050, - "2273": 1050, - "2278": 1050, - "2511": 1050, - "2516": 1050 - }, - "319625": { - "1": 0, - "7": 1050 - }, - "319639": { - "1": 0, - "9": 1050, - "162": 1050, - "1061": 1050 - }, - "319656": { - "1": 0, - "55": 1050, - "136": 1050 - }, - "319657": { - "1": 1050, - "68": 1050 - }, - "319658": { - "1": 0, - "4": 1050, - "93": 1050 - }, - "319659": { - "1": 1050 - }, - "319678": { - "1": 0, - "17": 1050, - "181": 1050 - }, - "319687": { - "1": 0, - "7": 1050 - }, - "319697": { - "1": 1050, - "28": 1050 - }, - "319698": { - "1": 1050 - }, - "319756": { - "1": 0, - "5": 1050, - "176": 1050, - "412": 1050, - "702": 1050, - "1056": 1050, - "1672": 1050 - }, - "319840": { - "1": 1050 - }, - "319841": { - "1": 1050 - }, - "319847": { - "1": 1050 - }, - "319848": { - "1": 1050 - }, - "319849": { - "1": 1050, - "140": 1050, - "381": 1050 - }, - "319851": { - "1": 1050 - }, - "319853": { - "1": 1050, - "110": 1050 - }, - "319854": { - "1": 1050, - "167": 1050 - }, - "319908": { - "1": 1050 - }, - "319909": { - "1": 210 - }, - "319910": { - "1": 1050, - "106": 1050, - "248": 1050, - "358": 1050, - "642": 1050 - }, - "319912": { - "1": 1050, - "2": 1050 - }, - "319913": { - "1": 1050, - "3": 1050 - }, - "319914": { - "1": 1050, - "4": 1050 - }, - "319915": { - "1": 1050 - }, - "319941": { - "1": 1050, - "63": 1050, - "272": 1050 - }, - "319942": { - "1": 1050, - "47": 1050 - }, - "319950": { - "1": 1050 - }, - "319991": { - "1": 1050, - "332": 1050, - "544": 1050, - "828": 1050 - }, - "319992": { - "1": 1050, - "249": 1050 - }, - "319993": { - "1": 1050, - "574": 1050 - }, - "320002": { - "1": 1050 - }, - "320006": { - "1": 1050, - "17": 1050, - "201": 1050 - }, - "320010": { - "1": 1050, - "4": 1050, - "86": 1050 - }, - "320011": { - "1": 1050 - }, - "320012": { - "1": 1050, - "13": 1050 - }, - "320023": { - "1": 1050, - "162": 1050 - }, - "320024": { - "1": 1050, - "93": 1050, - "373": 1050 - }, - "320025": { - "1": 1050 - }, - "320026": { - "1": 1050, - "157": 1050 - }, - "320038": { - "1": 1050, - "291": 1050, - "495": 1050 - }, - "320039": { - "1": 1050 - }, - "320040": { - "1": 1050, - "48": 1050, - "401": 1050 - }, - "320059": { - "1": 1050 - }, - "320060": { - "1": 1050, - "14": 1050 - }, - "320061": { - "1": 1050 - }, - "320062": { - "1": 1050 - }, - "320063": { - "1": 1050 - }, - "320064": { - "1": 1050, - "110": 1050 - }, - "320065": { - "1": 1050, - "191": 1050, - "536": 1050 - }, - "320673": { - "1": 1050 - }, - "320674": { - "1": 1050, - "14": 1050 - }, - "320688": { - "1": 1050, - "73": 1050, - "261": 1050, - "561": 1050 - }, - "320712": { - "1": 1050, - "82": 1050 - }, - "320757": { - "1": 1050, - "132": 1050 - }, - "320804": { - "1": 1050, - "52": 1050, - "249": 1050, - "456": 1050, - "465": 1050, - "512": 1050, - "820": 1050, - "1239": 1050 - }, - "320807": { - "1": 210 - }, - "320809": { - "1": 1050, - "698": 1050 - }, - "320821": { - "1": 1050, - "68": 1050 - }, - "320822": { - "1": 1050, - "35": 1050, - "285": 1050 - }, - "320823": { - "1": 1050, - "71": 1050 - }, - "320824": { - "1": 1050, - "151": 1050, - "951": 1050 - }, - "320838": { - "1": 1050, - "146": 1050 - }, - "320840": { - "1": 1050, - "76": 1050, - "349": 1050 - }, - "320841": { - "1": 1050, - "194": 1050 - }, - "320853": { - "1": 1050, - "186": 1050 - }, - "320854": { - "1": 1050, - "25": 1050 - }, - "320855": { - "1": 1050, - "129": 1050, - "448": 1050 - }, - "320856": { - "1": 1050 - }, - "320857": { - "1": 1050, - "217": 1050 - }, - "320858": { - "1": 1050 - }, - "320859": { - "1": 1050 - }, - "320887": { - "1": 1050, - "283": 1050 - }, - "320888": { - "1": 1050 - }, - "320916": { - "1": 1050 - }, - "320917": { - "1": 1050, - "99": 1050, - "326": 1050, - "605": 1050, - "952": 1050, - "1469": 1050 - }, - "320920": { - "1": 1050 - }, - "320933": { - "1": 1050, - "52": 1050 - }, - "320934": { - "1": 1050, - "169": 1050, - "530": 1050 - }, - "320936": { - "1": 1050 - }, - "320941": { - "1": 1050, - "4": 1050 - }, - "320980": { - "1": 1050 - }, - "320995": { - "1": 1050, - "4": 1050 - }, - "320996": { - "1": 1050 - }, - "321004": { - "1": 1050, - "66": 1050, - "165": 1050 - }, - "321005": { - "1": 1050 - }, - "321006": { - "1": 1050 - }, - "321007": { - "1": 1050, - "102": 1050, - "433": 1050 - }, - "321009": { - "1": 1050, - "44": 1050 - }, - "321010": { - "1": 1050 - }, - "321011": { - "1": 1050 - }, - "321012": { - "1": 1050 - }, - "321051": { - "1": 1050, - "209": 1050, - "454": 1050, - "716": 1050, - "1049": 1050 - }, - "321055": { - "1": 1050, - "350": 1050 - }, - "321067": { - "1": 1050, - "42": 1050, - "401": 1050, - "530": 1050 - }, - "321068": { - "1": 1050, - "179": 1050, - "647": 1050 - }, - "321069": { - "1": 1050 - }, - "321119": { - "1": 1050 - }, - "321121": { - "1": 1050 - }, - "321122": { - "1": 1050, - "212": 1050 - }, - "321124": { - "1": 1050, - "116": 1050, - "397": 1050 - }, - "321126": { - "1": 1050, - "14": 1050, - "110": 1050 - }, - "321134": { - "1": 1050, - "35": 1050 - }, - "321138": { - "1": 1050, - "105": 1050, - "647": 1050 - }, - "321140": { - "1": 1050 - }, - "321149": { - "1": 1050, - "269": 1050, - "478": 1050, - "741": 1050, - "1056": 1050, - "1527": 1050 - }, - "321165": { - "1": 210 - }, - "321166": { - "1": 1050 - }, - "321167": { - "1": 1050, - "145": 1050, - "381": 1050, - "660": 1050 - }, - "321177": { - "1": 1050, - "356": 1050, - "480": 0 - }, - "321178": { - "1": 0, - "5": 1050, - "46": 1050 - }, - "321218": { - "1": 1050, - "298": 1050, - "553": 1050, - "823": 1050 - }, - "321219": { - "1": 1050, - "168": 1050, - "604": 1050 - }, - "321221": { - "1": 1050 - }, - "321230": { - "1": 1050 - }, - "321231": { - "1": 1050 - }, - "321232": { - "1": 1050 - }, - "321233": { - "1": 1050, - "162": 1050, - "404": 1050, - "669": 1050 - }, - "321262": { - "1": 1050 - }, - "321283": { - "1": 1050 - }, - "321294": { - "1": 1050, - "15": 1050 - }, - "321295": { - "1": 1050, - "141": 1050, - "432": 1050, - "608": 1050 - }, - "321296": { - "1": 1050 - }, - "321305": { - "1": 1050, - "338": 1050, - "612": 1050, - "876": 1050, - "882": 1050, - "904": 1050, - "1214": 1050, - "1711": 1050, - "2446": 1050 - }, - "321311": { - "1": 1050 - }, - "321312": { - "1": 1050, - "4": 1050 - }, - "321313": { - "1": 1050, - "4": 1050 - }, - "321393": { - "1": 1050 - }, - "321396": { - "1": 1050, - "61": 1050, - "292": 1050, - "567": 1050, - "892": 1050, - "1296": 1050 - }, - "321397": { - "1": 1050, - "13": 1050 - }, - "321414": { - "1": 1050, - "386": 1050, - "627": 1050, - "875": 1050, - "1240": 1050 - }, - "321415": { - "1": 1050, - "384": 1050 - }, - "321431": { - "1": 1050 - }, - "321432": { - "1": 1050 - }, - "321433": { - "1": 1050, - "54": 1050 - }, - "321434": { - "1": 1050, - "155": 1050, - "424": 1050 - }, - "321436": { - "1": 1050, - "92": 1050, - "498": 1050 - }, - "321457": { - "1": 1050, - "357": 1050, - "593": 1050, - "852": 1050, - "1201": 1050, - "1627": 1050 - }, - "321461": { - "1": 1050 - }, - "321475": { - "1": 1050, - "197": 1050, - "479": 1050, - "741": 1050, - "1052": 1050, - "1525": 1050, - "1916": 1050, - "1922": 1050 - }, - "321710": { - "1": 1050 - }, - "321712": { - "1": 1050, - "15": 1050, - "201": 1050 - }, - "321730": { - "1": 1050, - "196": 1050 - }, - "321732": { - "1": 1050, - "107": 1050, - "382": 1050, - "693": 1050, - "1054": 1050 - }, - "321735": { - "1": 1050, - "4": 1050 - }, - "321755": { - "1": 1050, - "63": 1050, - "438": 1050, - "539": 1050 - }, - "321758": { - "1": 1050, - "90": 1050 - }, - "321760": { - "1": 1050, - "3": 1050, - "226": 1050 - }, - "321773": { - "1": 0, - "3": 1050 - }, - "321774": { - "1": 1050, - "78": 1050 - }, - "321775": { - "1": 1050 - }, - "321776": { - "1": 1050 - }, - "321777": { - "1": 1050, - "89": 1050 - }, - "321778": { - "1": 1050, - "58": 1050 - }, - "321780": { - "1": 1050, - "177": 1050, - "508": 1050 - }, - "321781": { - "1": 1050, - "662": 1050 - }, - "321813": { - "1": 1050, - "213": 1050 - }, - "321815": { - "1": 1050 - }, - "321817": { - "1": 1050, - "199": 1050, - "519": 1050 - }, - "321818": { - "1": 1050, - "311": 1050 - }, - "321820": { - "1": 1050 - }, - "321831": { - "1": 1050, - "172": 1050, - "412": 1050, - "582": 1050 - }, - "321832": { - "1": 1050, - "188": 1050 - }, - "321833": { - "1": 1050, - "3": 1050 - }, - "321834": { - "1": 1050, - "298": 1050 - }, - "321879": { - "1": 1050, - "60": 1050, - "103": 1050, - "113": 1050, - "325": 1050 - }, - "321880": { - "1": 1050 - }, - "321887": { - "1": 1050, - "171": 1050, - "395": 1050, - "646": 1050, - "951": 1050 - }, - "321908": { - "1": 1050, - "182": 1050, - "282": 1050, - "292": 1050, - "388": 1050 - }, - "321909": { - "1": 1050, - "182": 1050, - "482": 1050, - "797": 1050, - "1549": 1050 - }, - "321917": { - "1": 1050, - "179": 1050, - "407": 1050, - "637": 1050 - }, - "321919": { - "1": 1050 - }, - "321933": { - "1": 1050, - "150": 1050 - }, - "321960": { - "1": 1050 - }, - "321961": { - "1": 1050, - "185": 1050 - }, - "321973": { - "1": 1050, - "201": 1050, - "420": 1050, - "693": 1050, - "997": 1050 - }, - "321975": { - "1": 1050, - "81": 1050, - "321": 1050, - "336": 1050 - }, - "321988": { - "1": 1050, - "213": 1050, - "463": 1050, - "704": 1050, - "1023": 1050, - "1393": 1050 - }, - "321990": { - "1": 1050 - }, - "322013": { - "1": 1050 - }, - "322014": { - "1": 1050 - }, - "322022": { - "1": 1050, - "192": 1050, - "370": 1050, - "700": 1050, - "1012": 1050, - "1353": 1050 - }, - "322040": { - "1": 1050 - }, - "322057": { - "1": 1050 - }, - "322068": { - "1": 1050, - "270": 1050, - "499": 1050, - "723": 1050 - }, - "322079": { - "1": 1050, - "331": 1050 - }, - "322106": { - "1": 1050, - "327": 1050, - "497": 1050, - "773": 1050 - }, - "322113": { - "1": 1050 - }, - "322118": { - "1": 1050, - "116": 1050, - "318": 1050, - "544": 1050, - "827": 1050 - }, - "322179": { - "1": 1050, - "233": 1050, - "475": 1050, - "872": 1050, - "1055": 1050, - "1448": 1050 - }, - "322201": { - "1": 1050 - }, - "322204": { - "1": 1050, - "14": 1050, - "220": 1050, - "473": 1050, - "767": 1050, - "1120": 1050 - }, - "322222": { - "1": 1050 - }, - "322252": { - "1": 1050, - "180": 1050, - "425": 1050, - "684": 1050, - "996": 1050, - "1403": 1050 - }, - "322317": { - "1": 1050 - }, - "322319": { - "1": 1050, - "36": 1050, - "82": 1050, - "146": 1050 - }, - "322322": { - "1": 1050, - "194": 1050, - "432": 1050, - "723": 1050, - "1085": 1050, - "1121": 1050, - "1181": 1050 - }, - "322324": { - "1": 1050 - }, - "322332": { - "1": 1050, - "211": 1050, - "419": 1050, - "639": 1050, - "942": 1050 - }, - "322348": { - "1": 1050, - "189": 1050, - "451": 1050, - "699": 1050, - "1011": 1050, - "1304": 1050 - }, - "322355": { - "1": 1050, - "124": 1050 - }, - "322356": { - "1": 1050, - "187": 1050, - "458": 1050, - "777": 1050 - }, - "322381": { - "1": 1050, - "142": 1050, - "342": 1050, - "570": 1050 - }, - "322407": { - "1": 1050, - "90": 1050, - "214": 1050 - }, - "322430": { - "1": 1050, - "178": 1050, - "353": 1050, - "614": 1050 - }, - "322431": { - "1": 1050, - "122": 1050, - "516": 1050 - }, - "322480": { - "1": 1050, - "78": 1050, - "290": 1050 - }, - "322492": { - "1": 1050, - "7": 1050, - "300": 1050, - "701": 1050 - }, - "322510": { - "1": 1050 - }, - "322599": { - "1": 1050, - "232": 1050 - }, - "322602": { - "1": 1050 - }, - "322603": { - "1": 1050 - }, - "322605": { - "1": 1050, - "65": 1050 - }, - "322617": { - "1": 1050, - "3": 1050, - "175": 1050, - "510": 1050, - "563": 1050 - }, - "322625": { - "1": 1050, - "178": 1050, - "398": 1050, - "663": 1050, - "975": 1050 - }, - "322633": { - "1": 1050, - "167": 1050 - }, - "323414": { - "1": 1050, - "17": 1050 - }, - "323423": { - "1": 1050 - }, - "323470": { - "1": 1050, - "46": 1050, - "76": 1050, - "202": 1050 - }, - "323471": { - "1": 1050, - "116": 1050 - }, - "323472": { - "1": 1050, - "2": 1050, - "41": 1050 - }, - "323473": { - "1": 1050, - "204": 1050 - }, - "323474": { - "1": 1050, - "325": 1050 - }, - "323475": { - "1": 1050 - }, - "323487": { - "1": 1050, - "98": 1050, - "144": 1050, - "165": 1050, - "382": 1050 - }, - "323488": { - "1": 1050, - "150": 1050, - "445": 1050, - "787": 1050 - }, - "323492": { - "1": 1050 - }, - "323493": { - "1": 1050 - }, - "323495": { - "1": 1050 - }, - "323524": { - "1": 1050, - "22": 1050, - "216": 1050, - "513": 1050 - }, - "323525": { - "1": 1050, - "276": 1050, - "681": 1050 - }, - "323526": { - "1": 1050, - "317": 1050 - }, - "323693": { - "1": 1050, - "110": 1050 - }, - "323696": { - "1": 1050, - "206": 1050 - }, - "323702": { - "1": 1050, - "185": 1050 - }, - "323725": { - "1": 1050, - "169": 1050 - }, - "323726": { - "1": 1050, - "44": 1050 - }, - "323727": { - "1": 1050, - "22": 1050, - "222": 1050, - "544": 1050, - "907": 1050 - }, - "323755": { - "1": 1050, - "247": 1050, - "380": 1050, - "659": 1050 - }, - "323775": { - "1": 1050, - "152": 1050 - }, - "323778": { - "1": 1050, - "198": 1050, - "469": 1050, - "761": 1050 - }, - "323790": { - "1": 1050, - "137": 1050, - "246": 1050, - "267": 1050, - "345": 1050, - "644": 1050, - "857": 1050 - }, - "323794": { - "1": 1050 - }, - "323841": { - "1": 1050, - "110": 1050, - "332": 1050 - }, - "323857": { - "1": 1050, - "46": 1050 - }, - "323940": { - "1": 1050, - "292": 1050, - "497": 1050, - "749": 1050, - "957": 1050, - "1335": 1050 - }, - "323954": { - "1": 1050 - }, - "323976": { - "1": 1050 - }, - "323978": { - "1": 1050 - }, - "323980": { - "1": 1050, - "8": 1050, - "194": 1050 - }, - "323983": { - "1": 1050, - "139": 1050 - }, - "323997": { - "1": 1050, - "310": 1050 - }, - "324021": { - "1": 1050, - "279": 1050, - "456": 1050, - "675": 1050 - }, - "324022": { - "1": 1050, - "176": 1050, - "550": 1050 - }, - "324077": { - "1": 1050, - "281": 1050, - "537": 1050, - "755": 1050 - }, - "324201": { - "1": 1050, - "92": 1050, - "304": 1050, - "555": 1050, - "833": 1050, - "1214": 1050 - }, - "324202": { - "1": 1050, - "3": 1050 - }, - "324205": { - "1": 1050 - }, - "324206": { - "1": 1050, - "37": 1050 - }, - "324207": { - "1": 1050 - }, - "324209": { - "1": 1050 - }, - "324237": { - "1": 1050, - "174": 1050 - }, - "324245": { - "1": 1050, - "95": 1050, - "264": 1050, - "507": 1050, - "828": 1050, - "1264": 1050 - }, - "324293": { - "1": 1050, - "161": 1050, - "341": 1050, - "611": 1050, - "889": 1050, - "1332": 1050, - "2006": 1050 - }, - "324315": { - "1": 1050, - "64": 1050 - }, - "324318": { - "1": 1050, - "182": 1050 - }, - "324420": { - "1": 1050, - "4": 1050, - "268": 1050, - "527": 1050 - }, - "324729": { - "1": 1050 - }, - "324747": { - "1": 1050, - "103": 1050, - "106": 1050, - "205": 1050, - "364": 1050, - "563": 1050, - "858": 1050 - }, - "324764": { - "1": 1050 - }, - "324765": { - "1": 1050, - "42": 1050 - }, - "324769": { - "1": 1050, - "244": 1050 - }, - "324772": { - "1": 1050 - }, - "324785": { - "1": 1050, - "123": 1050, - "157": 1050, - "195": 1050, - "335": 1050, - "550": 1050 - }, - "324791": { - "1": 1050, - "179": 1050, - "618": 1050 - }, - "324835": { - "1": 1050, - "156": 1050 - }, - "324840": { - "1": 1050, - "9": 1050 - }, - "324841": { - "1": 1050, - "123": 1050, - "450": 1050, - "897": 1050 - }, - "324846": { - "1": 1050, - "261": 1050 - }, - "324878": { - "1": 0, - "14": 1050, - "107": 1050, - "190": 1050, - "474": 1050, - "778": 1050, - "1063": 1050 - }, - "324897": { - "1": 0, - "13": 1050, - "135": 1050 - }, - "324970": { - "1": 1050, - "181": 1050, - "359": 1050, - "461": 1050, - "745": 1050, - "1174": 1050, - "1934": 1050 - }, - "324980": { - "1": 0, - "25": 1050, - "205": 1050, - "371": 1050, - "617": 1050, - "908": 1050, - "1371": 1050, - "2129": 1050 - }, - "324997": { - "1": 0, - "29": 1050, - "116": 1050 - }, - "324998": { - "1": 1050, - "133": 1050 - }, - "324999": { - "1": 1050, - "6": 1050 - }, - "325000": { - "1": 1050, - "261": 1050 - }, - "325001": { - "1": 1050, - "343": 1050 - }, - "325022": { - "1": 0, - "17": 1050, - "38": 1050, - "64": 1050, - "378": 1050, - "387": 1050, - "1317": 1050, - "1485": 1050 - }, - "325057": { - "1": 0, - "22": 1050, - "181": 1050, - "368": 1050 - }, - "325097": { - "1": 0, - "32": 1050, - "40": 1050 - }, - "325098": { - "1": 1050 - }, - "325099": { - "1": 1050, - "106": 1050, - "328": 1050 - }, - "325100": { - "1": 1050, - "184": 1050 - }, - "325101": { - "1": 1050, - "245": 1050 - }, - "325110": { - "1": 1050, - "3": 1050 - }, - "325117": { - "1": 0, - "3": 1050 - }, - "325159": { - "1": 0, - "2": 1050, - "70": 1050, - "236": 1050 - }, - "325168": { - "1": 1050 - }, - "325169": { - "1": 1050 - }, - "325170": { - "1": 1050, - "197": 1050, - "222": 1050, - "333": 1050, - "703": 1050 - }, - "325172": { - "1": 0, - "4": 1050, - "353": 1050 - } -} diff --git a/include/ml.hxx b/include/ml.hxx new file mode 100644 index 00000000..97bbb567 --- /dev/null +++ b/include/ml.hxx @@ -0,0 +1,48 @@ +#ifndef GUARD_ML_H +#define GUARD_ML_H + +#include "basefunctions.hxx" +#include "defaults.hxx" +#include "utility/Logger.hxx" +#include "vectoroperations.hxx" +#include +#include "TMVA/RModel.hxx" + + +std::vector> readCSV(const std::string& filename); + +namespace ml { + +ROOT::RDF::RNode GaussianTransform(ROOT::RDF::RNode df, + const std::string &inputname, + const std::string &outputname, + const std::string ¶mfile, + const unsigned position, + const std::string &vartype); + + +namespace sofie { + + void CompileModelForRDF(const std::string & headerModelFile, unsigned int ninputs, unsigned int nslots=0); + + + std::string SOFIEGenerator(const std::vector &input_vec, + TMVA::Experimental::SOFIE::RModel &model, + const std::string &modelFilePath); + + ROOT::RDF::RNode KerasEvaluate(ROOT::RDF::RNode df, const std::vector &input_vec, + const std::string &outputname, + const std::string &modelFilePath); + + ROOT::RDF::RNode PyTorchEvaluate(ROOT::RDF::RNode df, const std::vector &input_vec, + const std::string &outputname, + const std::string &modelFilePath); + + // ROOT::RDF::RNode ONNXEvaluate(ROOT::RDF::RNode df, const std::vector &input_vec, + // const std::string &outputname, + // const std::string &modelFilePath); + + +} // end namespace sofie +} // end namespace ml +#endif /* GUARD_ML_H */ diff --git a/include/physicsobjects.hxx b/include/physicsobjects.hxx index d947bcd9..effeb518 100644 --- a/include/physicsobjects.hxx +++ b/include/physicsobjects.hxx @@ -165,6 +165,10 @@ ROOT::RDF::RNode AntiCutCBID(ROOT::RDF::RNode df, const std::string &maskname, ROOT::RDF::RNode CutIsolation(ROOT::RDF::RNode df, const std::string &maskname, const std::string &isolationName, const float &Threshold); +ROOT::RDF::RNode AntiCutIsolation(ROOT::RDF::RNode df, + const std::string &maskname, + const std::string &isolationName, + const float &Threshold); ROOT::RDF::RNode CutIP(ROOT::RDF::RNode df, const std::string &eta, const std::string &detasc, const std::string &dxy, const std::string &dz, const std::string &maskname, @@ -176,6 +180,8 @@ ROOT::RDF::RNode CutGap(ROOT::RDF::RNode df, const std::string &eta, const std::string &detasc, const std::string &maskname, const float &end_eb, const float &start_ee); +ROOT::RDF::RNode CutCBIDBitmapNoIso(ROOT::RDF::RNode df, const std::string &maskname, const int &IDvalue, const std::string &bitmap); + } // end namespace electron } // namespace physicsobject #endif /* GUARD_PHYSICSOBJECTS_H */ diff --git a/include/topreco.hxx b/include/topreco.hxx index a5760789..81d02f7f 100644 --- a/include/topreco.hxx +++ b/include/topreco.hxx @@ -59,11 +59,11 @@ TopReco(ROOT::RDF::RNode df, const std::string &str_wlep_p4, const std::string &str_nonbjet_btag_2, const std::string &str_n_bjets, const std::string &str_bjet_p4_1, const std::string &str_bjet_btag_1, const std::string &str_bjet_p4_2, const std::string &str_bjet_btag_2, - const std::string &str_is_reco, const std::string &str_is_jjb, - const std::string &str_is_jjbb, const std::string &str_is_jjjb, - const std::string &str_is_jjjbb, const std::string &str_reco_p4s, - const std::string &str_top_p4, const std::string &str_tb_p4, - const std::string &str_sb_p4); + const std::string &str_is_reco, const std::string &str_is_jj, + const std::string &str_is_jjb, const std::string &str_is_jjbb, + const std::string &str_is_jjjb, const std::string &str_is_jjjbb, + const std::string &str_reco_p4s, const std::string &str_top_p4, + const std::string &str_tb_p4, const std::string &str_sb_p4); ROOT::RDF::RNode DNNQuantities( ROOT::RDF::RNode df, const std::string &str_is_reco, @@ -121,10 +121,11 @@ ROOT::RDF::RNode LeptonScaleFactors( ROOT::RDF::RNode BTagScaleFactors( ROOT::RDF::RNode df, const std::string &str_is_iso, - const std::string &str_is_reco, const std::string &str_is_jjb, - const std::string &str_is_jjbb, const std::string &str_is_jjjb, - const std::string &str_is_jjjbb, const std::string &str_nonbjet_pt_1, - const std::string &str_nonbjet_eta_1, const std::string &str_nonbjet_btag_1, + const std::string &str_is_reco, const std::string &str_is_jj, + const std::string &str_is_jjb, const std::string &str_is_jjbb, + const std::string &str_is_jjjb, const std::string &str_is_jjjbb, + const std::string &str_nonbjet_pt_1, const std::string &str_nonbjet_eta_1, + const std::string &str_nonbjet_btag_1, const std::string &str_nonbjet_flavor_1, const std::string &str_nonbjet_pt_2, const std::string &str_nonbjet_eta_2, const std::string &str_nonbjet_btag_2, @@ -163,6 +164,13 @@ ROOT::RDF::RNode BTagScaleFactorsGeneric( const std::string &btag_wp, const float &btag_cut, const float &max_bjet_eta_sf); +ROOT::RDF::RNode +CombineDNNOutputs(ROOT::RDF::RNode df, const std::string &str_lep_is_mu, + const std::string &str_lep_is_el, + const std::string &str_lep_is_iso, + const std::string &str_is_reco, const std::string &str_dnn_mu, + const std::string &str_dnn_el, const std::string &str_dnn); + } // end namespace topreco #endif /* GUARD_TOPRECO_H */ diff --git a/src/ml.cxx b/src/ml.cxx new file mode 100644 index 00000000..db5f5dc5 --- /dev/null +++ b/src/ml.cxx @@ -0,0 +1,273 @@ +#ifndef GUARD_ML_H +#define GUARD_ML_H + +#include "../include/ml.hxx" +#include "../include/basefunctions.hxx" +#include "../include/defaults.hxx" +#include "../include/utility/Logger.hxx" +#include "../include/vectoroperations.hxx" +#include "ROOT/RDataFrame.hxx" +#include "ROOT/RVec.hxx" +#include +#include + +#include "TMVA/RModel.hxx" +#include "TMVA/RModelParser_Keras.h" +#include "TMVA/RModelParser_PyTorch.h" +// #include "TMVA/RModelParser_ONNX.hxx" +#include "TMVA/SOFIEHelpers.hxx" +#include "TInterpreter.h" +#include "TSystem.h" + + +#include +#include + + +std::vector> readCSV(const std::string& filename) { + + std::vector> data; + + // Open the CSV file + std::ifstream file(filename); + + // Check if the file is open + if (!file.is_open()) { + std::cerr << "Error opening file: " << filename << std::endl; + return data; // Return an empty vector + } + + std::string line; + + // Read the file line by line + while (std::getline(file, line)) { + std::vector row; + std::stringstream lineStream(line); + std::string cell; + + // skip header row + if (line.find("mean") != std::string::npos) + continue; + + // Split the line into cells using a comma as a delimiter + while (std::getline(lineStream, cell, ',')) { + row.push_back(std::stod(cell.c_str())); + } + + // Add the row to the 2D vector + data.push_back(row); + } + + // Close the file + file.close(); + + return data; +} + + + +namespace ml { + + +ROOT::RDF::RNode GaussianTransform(ROOT::RDF::RNode df, + const std::string &inputname, + const std::string &outputname, + const std::string ¶mfile, + const unsigned position, + const std::string &vartype) { + // read params from file + Logger::get("GaussianTransform") + ->debug("reading file {}...", paramfile); + std::vector> params = readCSV(paramfile); + + // shifting to index counting + unsigned var_idx = position - 1; + + auto transform_int = [params, var_idx](const int input){ + double shifted = -10; + shifted = (input - params[var_idx][1]) / params[var_idx][2]; + Logger::get("GaussianTransform") + ->debug("transforming var {} with mean {} and std {} from {} to {}", var_idx + 1, params[var_idx][1], params[var_idx][2], input, shifted); + return shifted; + }; + + auto transform_float = [params, var_idx](const float input){ + double shifted = -10; + shifted = (input - params[var_idx][1]) / params[var_idx][2]; + Logger::get("GaussianTransform") + ->debug("transforming var {} with mean {} and std {} from {} to {}", var_idx + 1, params[var_idx][1], params[var_idx][2], input, shifted); + return shifted; + }; + + auto transform_double = [params, var_idx](const double input){ + double shifted = -10; + shifted = (input - params[var_idx][1]) / params[var_idx][2]; + Logger::get("GaussianTransform") + ->debug("transforming var {} with mean {} and std {} from {} to {}", var_idx + 1, params[var_idx][1], params[var_idx][2], input, shifted); + return shifted; + }; + + + + if (vartype.rfind("i", 0) == 0) { + auto df2 = df.Define(outputname, transform_int, {inputname}); + return df2; + } + else if (vartype.rfind("d", 0) == 0) { + auto df2 = df.Define(outputname, transform_double, {inputname}); + return df2; + } + else { + auto df2 = df.Define(outputname, transform_float, {inputname}); + return df2; + } + + +} + + +namespace sofie { + + void CompileModelForRDF(const std::string & headerModelFile, unsigned int ninputs, unsigned int nslots=0) { + + std::string modelName = headerModelFile.substr(0,headerModelFile.find(".hxx")); + std::string cmd = std::string("#include \"") + headerModelFile + std::string("\""); + auto ret = gInterpreter->Declare(cmd.c_str()); + if (!ret) + throw std::runtime_error("Error compiling : " + cmd); + std::cout << "compiled : " << cmd << std::endl; + + cmd = "auto sofie_functor_" + modelName + " = TMVA::Experimental::SofieFunctor<" + std::to_string(ninputs) + ",TMVA_SOFIE_" + modelName + "::Session>(" + std::to_string(nslots) + ");"; + ret = gInterpreter->Declare(cmd.c_str()); + if (!ret) + throw std::runtime_error("Error compiling : " + cmd); + std::cout << "compiled : " << cmd << std::endl; + std::cout << "Model is ready to be evaluated" << std::endl; + return; + } + + std::string SOFIEGenerator(const std::vector &input_vec, + TMVA::Experimental::SOFIE::RModel &model, + const std::string &modelFilePath) { + + std::string modelFileName = std::filesystem::path(modelFilePath).filename(); + std::string::size_type const p(modelFileName.find_last_of('.')); + std::string modelName = modelFileName.substr(0, p); + + std::string modelHeaderFile = modelName + std::string(".hxx"); + + if (!std::filesystem::exists(modelHeaderFile)) { + Logger::get("SOFIEGenerator") + ->debug("generating model code..."); + model.Generate(); + Logger::get("SOFIEGenerator") + ->debug("dumping model code... {}", modelHeaderFile); + model.OutputGenerated(modelHeaderFile); + // Logger::get("SOFIEGenerator") + // ->debug("printing model code..."); + // model.PrintGenerated(); + + std::string modelWeightFile = modelName + std::string(".dat"); + + Logger::get("SOFIEGenerator") + ->debug("compiling model code..."); + CompileModelForRDF(modelHeaderFile, input_vec.size()); + } + else { + Logger::get("SOFIEGenerator") + ->debug("model already compiled, skipping"); + } + + std::string sofie_func_str = "sofie_functor_" + modelName + "(rdfslot_, "; + sofie_func_str += input_vec[0]; + for (unsigned i = 1; i < input_vec.size(); i++) { + sofie_func_str += ", " + input_vec[i]; + } + sofie_func_str += ")"; + + return sofie_func_str; + +} + + +ROOT::RDF::RNode KerasEvaluate(ROOT::RDF::RNode df, + const std::vector &input_vec, + const std::string &outputname, + const std::string &modelFilePath) { + + + Logger::get("KerasEvaluate") + ->debug("loading model file {} ...", modelFilePath); + TMVA::Experimental::SOFIE::RModel model = TMVA::Experimental::SOFIE::PyKeras::Parse(modelFilePath); + Logger::get("KerasEvaluate") + ->debug("finished loading model"); + + auto eval_func = SOFIEGenerator(input_vec, model, modelFilePath); + Logger::get("KerasEvaluate") + ->debug("evaluating model code..."); + + auto df2 = df.Define(outputname, eval_func); + + return df2; + +} + + +ROOT::RDF::RNode PyTorchEvaluate(ROOT::RDF::RNode df, + const std::vector &input_vec, + const std::string &outputname, + const std::string &modelFilePath) { + + + Logger::get("PyTorchEvaluate") + ->debug("deriving input shapes..."); + std::vector inputTensorShapeSequential{1,input_vec.size()}; + std::vector> inputShapesSequential{inputTensorShapeSequential}; + + Logger::get("PyTorchEvaluate") + ->debug("loading model file {} ...", modelFilePath); + TMVA::Experimental::SOFIE::RModel model = TMVA::Experimental::SOFIE::PyTorch::Parse(modelFilePath, inputShapesSequential); + Logger::get("PyTorchEvaluate") + ->debug("finished loading model"); + + auto eval_func = SOFIEGenerator(input_vec, model, modelFilePath); + Logger::get("PyTorchEvaluate") + ->debug("evaluating model code..."); + + auto df2 = df.Define(outputname, eval_func); + + return df2; + +} + + +// ROOT::RDF::RNode ONNXEvaluate(ROOT::RDF::RNode df, +// const std::vector &input_vec, +// const std::string &outputname, +// const std::string &modelFilePath) { + + +// bool verboseParser = false; + +// Logger::get("ONNXEvaluate") +// ->debug("loading model file {} ...", modelFilePath); +// TMVA::Experimental::SOFIE::RModelParser_ONNX parser; +// TMVA::Experimental::SOFIE::RModel model = parser.Parse(modelFilePath, verboseParser); +// Logger::get("ONNXEvaluate") +// ->debug("finished loading model"); + +// auto eval_func = SOFIEGenerator(input_vec, model, modelFilePath); +// Logger::get("ONNXEvaluate") +// ->debug("evaluating model code..."); + +// auto df2 = df.Define(outputname, eval_func); + +// return df2; + +// } + + + +} // end namespace sofie +} // end namespace ml +#endif /* GUARD_ML_H */ diff --git a/src/physicsobjects.cxx b/src/physicsobjects.cxx index f56c4aa6..c394f261 100644 --- a/src/physicsobjects.cxx +++ b/src/physicsobjects.cxx @@ -11,10 +11,13 @@ #include "correction.h" #include #include +#include #include +#include #include #include #include + /// Namespace containing function to apply cuts on physics objects. The /// cut results are typically stored within a mask, which is represented by /// an `ROOT::RVec`. @@ -37,9 +40,9 @@ namespace physicsobject { /// \return a dataframe containing the new mask ROOT::RDF::RNode CutPt(ROOT::RDF::RNode df, const std::string &quantity, const std::string &maskname, const float &ptThreshold) { - auto df1 = - df.Define(maskname, basefunctions::FilterMin(ptThreshold), {quantity}); - return df1; + auto df1 = + df.Define(maskname, basefunctions::FilterMin(ptThreshold), {quantity}); + return df1; } /// Function to select objects blow an eta threshold, using /// basefunctions::FilterAbsMax @@ -53,9 +56,9 @@ ROOT::RDF::RNode CutPt(ROOT::RDF::RNode df, const std::string &quantity, ROOT::RDF::RNode CutEta(ROOT::RDF::RNode df, const std::string &quantity, const std::string &maskname, const float &EtaThreshold) { - auto df1 = df.Define(maskname, basefunctions::FilterAbsMax(EtaThreshold), - {quantity}); - return df1; + auto df1 = df.Define(maskname, basefunctions::FilterAbsMax(EtaThreshold), + {quantity}); + return df1; } /// Function to select objects below an Dz threshold, using /// basefunctions::FilterMax @@ -68,9 +71,9 @@ ROOT::RDF::RNode CutEta(ROOT::RDF::RNode df, const std::string &quantity, /// \return a dataframe containing the new mask ROOT::RDF::RNode CutDz(ROOT::RDF::RNode df, const std::string &quantity, const std::string &maskname, const float &Threshold) { - auto df1 = - df.Define(maskname, basefunctions::FilterAbsMax(Threshold), {quantity}); - return df1; + auto df1 = + df.Define(maskname, basefunctions::FilterAbsMax(Threshold), {quantity}); + return df1; } /// Function to select objects below an Dxy threshold, using /// basefunctions::FilterMax @@ -83,9 +86,9 @@ ROOT::RDF::RNode CutDz(ROOT::RDF::RNode df, const std::string &quantity, /// \return a dataframe containing the new mask ROOT::RDF::RNode CutDxy(ROOT::RDF::RNode df, const std::string &quantity, const std::string &maskname, const float &Threshold) { - auto df1 = - df.Define(maskname, basefunctions::FilterAbsMax(Threshold), {quantity}); - return df1; + auto df1 = + df.Define(maskname, basefunctions::FilterAbsMax(Threshold), {quantity}); + return df1; } /// Function to select objects with eta dependent upper and lower thesholds /// for a given variable @@ -109,20 +112,20 @@ ROOT::RDF::RNode CutVariableBarrelEndcap( const float &etaBoundary, const float &lowerThresholdBarrel, const float &upperThresholdBarrel, const float &lowerThresholdEndcap, const float &upperThresholdEndcap) { - auto lambda = [etaBoundary, lowerThresholdBarrel, upperThresholdBarrel, - lowerThresholdEndcap, - upperThresholdEndcap](const ROOT::RVec &eta, - const ROOT::RVec &variable) { - ROOT::RVec mask = - (((abs(eta) < etaBoundary) && (variable >= lowerThresholdBarrel) && - (variable < upperThresholdBarrel)) || - ((abs(eta) >= etaBoundary) && (variable >= lowerThresholdEndcap) && - (variable < upperThresholdEndcap))); - return mask; - }; + auto lambda = [etaBoundary, lowerThresholdBarrel, upperThresholdBarrel, + lowerThresholdEndcap, + upperThresholdEndcap](const ROOT::RVec &eta, + const ROOT::RVec &variable) { + ROOT::RVec mask = + (((abs(eta) < etaBoundary) && (variable >= lowerThresholdBarrel) && + (variable < upperThresholdBarrel)) || + ((abs(eta) >= etaBoundary) && (variable >= lowerThresholdEndcap) && + (variable < upperThresholdEndcap))); + return mask; + }; - auto df1 = df.Define(maskname, lambda, {etaColumnName, cutVarColumnName}); - return df1; + auto df1 = df.Define(maskname, lambda, {etaColumnName, cutVarColumnName}); + return df1; } /// Function to take a mask and create a new one where a particle candidate is @@ -141,19 +144,19 @@ ROOT::RDF::RNode VetoCandInMask(ROOT::RDF::RNode df, const std::string &inputmaskname, const std::string &dileptonpair, const int index) { - return df.Define(outputmaskname, - [index, inputmaskname](const ROOT::RVec &mask, - const ROOT::RVec &pair) { - Logger::get("VetoCandInMask") - ->debug("Vetoing the selected candidate (index " - "{}) from the mask {}", - index, inputmaskname); - auto newmask = mask; - if (pair.at(index) >= 0) - newmask.at(pair.at(index)) = 0; - return newmask; - }, - {inputmaskname, dileptonpair}); + return df.Define(outputmaskname, + [index, inputmaskname](const ROOT::RVec &mask, + const ROOT::RVec &pair) { + Logger::get("VetoCandInMask") + ->debug("Vetoing the selected candidate (index " + "{}) from the mask {}", + index, inputmaskname); + auto newmask = mask; + if (pair.at(index) >= 0) + newmask.at(pair.at(index)) = 0; + return newmask; + }, + {inputmaskname, dileptonpair}); } /// Function to filter events based on a mask. If the mask contains at least @@ -165,13 +168,13 @@ ROOT::RDF::RNode VetoCandInMask(ROOT::RDF::RNode df, /// /// \return a new df with the events filtered ROOT::RDF::RNode FilterMasks(ROOT::RDF::RNode df, const std::string &maskname) { - auto df1 = df.Filter( - [](const ROOT::RVec &mask) { - auto result = Any(mask); - return result; - }, - {maskname}); - return df1; + auto df1 = df.Filter( + [](const ROOT::RVec &mask) { + auto result = Any(mask); + return result; + }, + {maskname}); + return df1; } /// Function to generate a veto based on a mask. If the mask contains at least @@ -192,11 +195,11 @@ ROOT::RDF::RNode FilterMasks(ROOT::RDF::RNode df, const std::string &maskname) { ROOT::RDF::RNode LeptonVetoFlag(ROOT::RDF::RNode df, const std::string &outputname, const std::string &vetomap) { - return df.Define(outputname, - [](const ROOT::RVec &mask) { - return ROOT::VecOps::Nonzero(mask).size() != 0; - }, - {vetomap}); + return df.Define(outputname, + [](const ROOT::RVec &mask) { + return ROOT::VecOps::Nonzero(mask).size() != 0; + }, + {vetomap}); } /// Function to create a boolian flag based on the number of non-zero masks. @@ -209,11 +212,11 @@ ROOT::RDF::RNode LeptonVetoFlag(ROOT::RDF::RNode df, /// \return a new df containing the output flag column ROOT::RDF::RNode IsEmptyFlag(ROOT::RDF::RNode df, const std::string &outputname, const std::string &vetomap) { - return df.Define(outputname, - [](const ROOT::RVec &mask) { - return ROOT::VecOps::Nonzero(mask).size() == 0; - }, - {vetomap}); + return df.Define(outputname, + [](const ROOT::RVec &mask) { + return ROOT::VecOps::Nonzero(mask).size() == 0; + }, + {vetomap}); } /// Function to create a boolian flag based on the number of non-zero masks. @@ -228,11 +231,11 @@ ROOT::RDF::RNode IsEmptyFlag(ROOT::RDF::RNode df, const std::string &outputname, /// \return a new df containing the output flag column ROOT::RDF::RNode CutNFlag(ROOT::RDF::RNode df, const std::string &outputname, const std::string &map, const int &n) { - return df.Define(outputname, - [n](const ROOT::RVec &mask) { - return ROOT::VecOps::Nonzero(mask).size() == n; - }, - {map}); + return df.Define(outputname, + [n](const ROOT::RVec &mask) { + return ROOT::VecOps::Nonzero(mask).size() == n; + }, + {map}); } /// Function to create a column for a vector of indices of objects based on @@ -247,15 +250,15 @@ ROOT::RDF::RNode CutNFlag(ROOT::RDF::RNode df, const std::string &outputname, ROOT::RDF::RNode SelectedObjects(ROOT::RDF::RNode df, const std::string &outputname, const std::string &inputmaskname) { - return df.Define(outputname, - [](const ROOT::RVec &mask) { - Logger::get("SelectedObjects") - ->debug("size = {}", - ROOT::VecOps::Nonzero(mask).size()); - return static_cast>( - ROOT::VecOps::Nonzero(mask)); - }, - {inputmaskname}); + return df.Define(outputname, + [](const ROOT::RVec &mask) { + Logger::get("SelectedObjects") + ->debug("size = {}", + ROOT::VecOps::Nonzero(mask).size()); + return static_cast>( + ROOT::VecOps::Nonzero(mask)); + }, + {inputmaskname}); } /** @@ -288,40 +291,39 @@ ROOT::RDF::RNode DeltaRParticleVeto( const std::string &particle_mask, const std::string &particle_pt, const std::string &particle_eta, const std::string &particle_phi, const std::string &particle_mass, const float dR_cut) { - auto veto_overlapping_particle = - [dR_cut](const ROOT::Math::PtEtaPhiMVector &p4, - const ROOT::RVec &particle_pt, - const ROOT::RVec &particle_eta, - const ROOT::RVec &particle_phi, - const ROOT::RVec &particle_mass, - const ROOT::RVec &particle_mask) { - // for all particles in the mask, check if they overlap with the - // particle, if so, return true - ROOT::RVec valid_particle_indices = - ROOT::VecOps::Nonzero(particle_mask); - const auto selected_pt = - ROOT::VecOps::Take(particle_pt, valid_particle_indices); - const auto selected_eta = - ROOT::VecOps::Take(particle_eta, valid_particle_indices); - const auto selected_phi = - ROOT::VecOps::Take(particle_phi, valid_particle_indices); - const auto selected_mass = - ROOT::VecOps::Take(particle_mass, valid_particle_indices); - auto selected_p4s = - ROOT::VecOps::Construct( - selected_pt, selected_eta, selected_phi, selected_mass); - for (const auto &p4_test : selected_p4s) { - if (ROOT::Math::VectorUtil::DeltaR(p4_test, p4) < dR_cut) { - return true; - } - } - // if no particle is close enough to the p4, return false - return false; - }; - auto df1 = df.Define(output_flag, veto_overlapping_particle, - {p4, particle_pt, particle_eta, particle_phi, - particle_mass, particle_mask}); - return df1; + auto veto_overlapping_particle = [dR_cut]( + const ROOT::Math::PtEtaPhiMVector &p4, + const ROOT::RVec &particle_pt, + const ROOT::RVec &particle_eta, + const ROOT::RVec &particle_phi, + const ROOT::RVec &particle_mass, + const ROOT::RVec &particle_mask) { + // for all particles in the mask, check if they overlap with the + // particle, if so, return true + ROOT::RVec valid_particle_indices = + ROOT::VecOps::Nonzero(particle_mask); + const auto selected_pt = + ROOT::VecOps::Take(particle_pt, valid_particle_indices); + const auto selected_eta = + ROOT::VecOps::Take(particle_eta, valid_particle_indices); + const auto selected_phi = + ROOT::VecOps::Take(particle_phi, valid_particle_indices); + const auto selected_mass = + ROOT::VecOps::Take(particle_mass, valid_particle_indices); + auto selected_p4s = ROOT::VecOps::Construct( + selected_pt, selected_eta, selected_phi, selected_mass); + for (const auto &p4_test : selected_p4s) { + if (ROOT::Math::VectorUtil::DeltaR(p4_test, p4) < dR_cut) { + return true; + } + } + // if no particle is close enough to the p4, return false + return false; + }; + auto df1 = df.Define(output_flag, veto_overlapping_particle, + {p4, particle_pt, particle_eta, particle_phi, + particle_mass, particle_mask}); + return df1; } /// Function to correct object mass in alignment with object pt correction @@ -338,21 +340,20 @@ ROOT::RDF::RNode ObjectMassCorrectionWithPt(ROOT::RDF::RNode df, const std::string &raw_mass, const std::string &raw_pt, const std::string &corrected_pt) { - auto mass_correction_lambda = - [](const ROOT::RVec &mass_values, - const ROOT::RVec &pt_values, - const ROOT::RVec &corrected_pt_values) { - ROOT::RVec corrected_mass_values(mass_values.size()); - for (int i = 0; i < mass_values.size(); i++) { - corrected_mass_values[i] = mass_values.at(i) * - corrected_pt_values.at(i) / - pt_values.at(i); - } - return corrected_mass_values; - }; - auto df1 = df.Define(corrected_mass, mass_correction_lambda, - {raw_mass, raw_pt, corrected_pt}); - return df1; + auto mass_correction_lambda = + [](const ROOT::RVec &mass_values, + const ROOT::RVec &pt_values, + const ROOT::RVec &corrected_pt_values) { + ROOT::RVec corrected_mass_values(mass_values.size()); + for (int i = 0; i < mass_values.size(); i++) { + corrected_mass_values[i] = + mass_values.at(i) * corrected_pt_values.at(i) / pt_values.at(i); + } + return corrected_mass_values; + }; + auto df1 = df.Define(corrected_mass, mass_correction_lambda, + {raw_mass, raw_pt, corrected_pt}); + return df1; } /// Function to check whether at least one lepton pair is present @@ -377,34 +378,34 @@ ROOT::RDF::RNode CheckForDiLeptonPairs( const std::string &leptons_phi, const std::string &leptons_mass, const std::string &leptons_charge, const std::string &leptons_mask, const float dR_cut) { - auto pair_finder_lambda = [dR_cut](const ROOT::RVec &pt_values, - const ROOT::RVec &eta_values, - const ROOT::RVec &phi_values, - const ROOT::RVec &mass_values, - const ROOT::RVec &charge_values, - const ROOT::RVec &mask) { - const auto valid_lepton_indices = ROOT::VecOps::Nonzero(mask); - for (auto it1 = valid_lepton_indices.begin(); - it1 != valid_lepton_indices.end(); it1++) { - for (auto it2 = it1 + 1; it2 != valid_lepton_indices.end(); it2++) { - if (charge_values.at(*it1) != charge_values.at(*it2)) { - auto p4_1 = ROOT::Math::PtEtaPhiMVector( - pt_values.at(*it1), eta_values.at(*it1), - phi_values.at(*it1), mass_values.at(*it1)); - auto p4_2 = ROOT::Math::PtEtaPhiMVector( - pt_values.at(*it2), eta_values.at(*it2), - phi_values.at(*it2), mass_values.at(*it2)); - if (ROOT::Math::VectorUtil::DeltaR(p4_1, p4_2) >= dR_cut) - return true; - } - } + auto pair_finder_lambda = [dR_cut](const ROOT::RVec &pt_values, + const ROOT::RVec &eta_values, + const ROOT::RVec &phi_values, + const ROOT::RVec &mass_values, + const ROOT::RVec &charge_values, + const ROOT::RVec &mask) { + const auto valid_lepton_indices = ROOT::VecOps::Nonzero(mask); + for (auto it1 = valid_lepton_indices.begin(); + it1 != valid_lepton_indices.end(); it1++) { + for (auto it2 = it1 + 1; it2 != valid_lepton_indices.end(); it2++) { + if (charge_values.at(*it1) != charge_values.at(*it2)) { + auto p4_1 = ROOT::Math::PtEtaPhiMVector( + pt_values.at(*it1), eta_values.at(*it1), phi_values.at(*it1), + mass_values.at(*it1)); + auto p4_2 = ROOT::Math::PtEtaPhiMVector( + pt_values.at(*it2), eta_values.at(*it2), phi_values.at(*it2), + mass_values.at(*it2)); + if (ROOT::Math::VectorUtil::DeltaR(p4_1, p4_2) >= dR_cut) + return true; } - return false; - }; - auto df1 = df.Define(output_flag, pair_finder_lambda, - {leptons_pt, leptons_eta, leptons_phi, leptons_mass, - leptons_charge, leptons_mask}); - return df1; + } + } + return false; + }; + auto df1 = df.Define(output_flag, pair_finder_lambda, + {leptons_pt, leptons_eta, leptons_phi, leptons_mass, + leptons_charge, leptons_mask}); + return df1; } /// Function to select objects based on matching a specific integer value /// @@ -434,11 +435,11 @@ namespace muon { /// \return a dataframe containing the new mask ROOT::RDF::RNode CutID(ROOT::RDF::RNode df, const std::string &maskname, const std::string &nameID) { - auto df1 = df.Define( - maskname, - [](const ROOT::RVec &id) { return (ROOT::RVec)id; }, - {nameID}); - return df1; + auto df1 = df.Define( + maskname, + [](const ROOT::RVec &id) { return (ROOT::RVec)id; }, + {nameID}); + return df1; } /// Function to cut on muons based on the muon isolation using /// basefunctions::FilterMax @@ -453,9 +454,9 @@ ROOT::RDF::RNode CutID(ROOT::RDF::RNode df, const std::string &maskname, ROOT::RDF::RNode CutIsolation(ROOT::RDF::RNode df, const std::string &maskname, const std::string &isolationName, const float &Threshold) { - auto df1 = df.Define(maskname, basefunctions::FilterMax(Threshold), - {isolationName}); - return df1; + auto df1 = + df.Define(maskname, basefunctions::FilterMax(Threshold), {isolationName}); + return df1; } /// Function to cut on muons based on the muon isolation using /// basefunctions::FilterMin @@ -471,9 +472,9 @@ ROOT::RDF::RNode AntiCutIsolation(ROOT::RDF::RNode df, const std::string &maskname, const std::string &isolationName, const float &Threshold) { - auto df1 = df.Define(maskname, basefunctions::FilterMin(Threshold), - {isolationName}); - return df1; + auto df1 = + df.Define(maskname, basefunctions::FilterMin(Threshold), {isolationName}); + return df1; } /// Function to cut on muons based on the muon signature: isTracker or isGlobal /// @@ -488,16 +489,15 @@ ROOT::RDF::RNode CutIsTrackerOrIsGlobal(ROOT::RDF::RNode df, const std::string &isTracker, const std::string &isGlobal, const std::string &maskname) { - auto lambda = [](const ROOT::RVec &tracker, - const ROOT::RVec &global) { - ROOT::RVec mask = (tracker == 1 || global == 1); - Logger::get("lep1lep1_lep2::TripleSelectionAlgo") - ->debug("istracker {}, isglobal {}, mask {}", tracker, global, - mask); - return mask; - }; - auto df1 = df.Define(maskname, lambda, {isTracker, isGlobal}); - return df1; + auto lambda = [](const ROOT::RVec &tracker, + const ROOT::RVec &global) { + ROOT::RVec mask = (tracker == 1 || global == 1); + Logger::get("lep1lep1_lep2::TripleSelectionAlgo") + ->debug("istracker {}, isglobal {}, mask {}", tracker, global, mask); + return mask; + }; + auto df1 = df.Define(maskname, lambda, {isTracker, isGlobal}); + return df1; } /// Function to create a column of vector of random numbers between 0 and 1 /// with size of the input object collection @@ -511,18 +511,18 @@ ROOT::RDF::RNode CutIsTrackerOrIsGlobal(ROOT::RDF::RNode df, ROOT::RDF::RNode GenerateRndmRVec(ROOT::RDF::RNode df, const std::string &outputname, const std::string &objCollection, int seed) { - gRandom->SetSeed(seed); - auto lambda = [](const ROOT::RVec &objects) { - const int len = objects.size(); - float rndm[len]; - gRandom->RndmArray(len, rndm); - ROOT::RVec out = {}; - for (auto &x : rndm) { - out.push_back(x); - } - return out; - }; - return df.Define(outputname, lambda, {objCollection}); + gRandom->SetSeed(seed); + auto lambda = [](const ROOT::RVec &objects) { + const int len = objects.size(); + float rndm[len]; + gRandom->RndmArray(len, rndm); + ROOT::RVec out = {}; + for (auto &x : rndm) { + out.push_back(x); + } + return out; + }; + return df.Define(outputname, lambda, {objCollection}); } /// Function to create a column of Rochester correction applied transverse @@ -548,24 +548,24 @@ applyRoccoRData(ROOT::RDF::RNode df, const std::string &outputname, const std::string &chargColumn, const std::string &ptColumn, const std::string &etaColumn, const std::string &phiColumn, int error_set, int error_member) { - RoccoR rc(filename); - auto lambda = [rc, position, error_set, - error_member](const ROOT::RVec &objects, - const ROOT::RVec &chargCol, - const ROOT::RVec &ptCol, - const ROOT::RVec &etaCol, - const ROOT::RVec &phiCol) { - const int index = objects.at(position); - double pt_rc = - ptCol.at(index) * rc.kScaleDT(chargCol.at(index), ptCol.at(index), - etaCol.at(index), phiCol.at(index), - error_set, error_member); - return pt_rc; - }; + RoccoR rc(filename); + auto lambda = [rc, position, error_set, + error_member](const ROOT::RVec &objects, + const ROOT::RVec &chargCol, + const ROOT::RVec &ptCol, + const ROOT::RVec &etaCol, + const ROOT::RVec &phiCol) { + const int index = objects.at(position); + double pt_rc = + ptCol.at(index) * rc.kScaleDT(chargCol.at(index), ptCol.at(index), + etaCol.at(index), phiCol.at(index), + error_set, error_member); + return pt_rc; + }; - return df.Define( - outputname, lambda, - {objCollection, chargColumn, ptColumn, etaColumn, phiColumn}); + return df.Define( + outputname, lambda, + {objCollection, chargColumn, ptColumn, etaColumn, phiColumn}); } /// Function to create a column of Rochester correction applied transverse @@ -596,37 +596,35 @@ applyRoccoRMC(ROOT::RDF::RNode df, const std::string &outputname, const std::string &phiColumn, const std::string &genPtColumn, const std::string &nTrackerLayersColumn, const std::string &rndmColumn, int error_set, int error_member) { - RoccoR rc(filename); - auto lambda = [rc, position, error_set, error_member]( - const ROOT::RVec &objects, - const ROOT::RVec &chargCol, - const ROOT::RVec &ptCol, - const ROOT::RVec &etaCol, - const ROOT::RVec &phiCol, const float &genPt, - const ROOT::RVec &nTrackerLayersCol, - const ROOT::RVec &rndmCol) { - double pt_rc = default_float; - const int index = objects.at(position); - if (genPt > 0.) { - pt_rc = ptCol.at(index) * - rc.kSpreadMC(chargCol.at(index), ptCol.at(index), - etaCol.at(index), phiCol.at(index), genPt, - error_set, error_member); - } else { - pt_rc = ptCol.at(index) * - rc.kSmearMC(chargCol.at(index), ptCol.at(index), - etaCol.at(index), phiCol.at(index), - nTrackerLayersCol.at(index), - rndmCol.at(position), error_set, error_member); - } + RoccoR rc(filename); + auto lambda = [rc, position, error_set, error_member]( + const ROOT::RVec &objects, + const ROOT::RVec &chargCol, + const ROOT::RVec &ptCol, + const ROOT::RVec &etaCol, + const ROOT::RVec &phiCol, const float &genPt, + const ROOT::RVec &nTrackerLayersCol, + const ROOT::RVec &rndmCol) { + double pt_rc = default_float; + const int index = objects.at(position); + if (genPt > 0.) { + pt_rc = + ptCol.at(index) * rc.kSpreadMC(chargCol.at(index), ptCol.at(index), + etaCol.at(index), phiCol.at(index), + genPt, error_set, error_member); + } else { + pt_rc = ptCol.at(index) * + rc.kSmearMC(chargCol.at(index), ptCol.at(index), etaCol.at(index), + phiCol.at(index), nTrackerLayersCol.at(index), + rndmCol.at(position), error_set, error_member); + } - return pt_rc; - }; + return pt_rc; + }; - return df.Define(outputname, lambda, - {objCollection, chargColumn, ptColumn, etaColumn, - phiColumn, genPtColumn, nTrackerLayersColumn, - rndmColumn}); + return df.Define(outputname, lambda, + {objCollection, chargColumn, ptColumn, etaColumn, phiColumn, + genPtColumn, nTrackerLayersColumn, rndmColumn}); } } // end namespace muon /// Tau specific functions @@ -644,19 +642,19 @@ namespace tau { ROOT::RDF::RNode CutDecayModes(ROOT::RDF::RNode df, const std::string &maskname, const std::string &tau_dms, const std::vector &SelectedDecayModes) { - auto df1 = df.Define( - maskname, - [SelectedDecayModes](const ROOT::RVec &decaymodes) { - ROOT::RVec mask; - for (auto n : decaymodes) { - mask.push_back(int(std::find(SelectedDecayModes.begin(), - SelectedDecayModes.end(), - n) != SelectedDecayModes.end())); - } - return mask; - }, - {tau_dms}); - return df1; + auto df1 = + df.Define(maskname, + [SelectedDecayModes](const ROOT::RVec &decaymodes) { + ROOT::RVec mask; + for (auto n : decaymodes) { + mask.push_back(int(std::find(SelectedDecayModes.begin(), + SelectedDecayModes.end(), n) != + SelectedDecayModes.end())); + } + return mask; + }, + {tau_dms}); + return df1; } /// Function to cut taus based on the tau ID /// @@ -668,8 +666,8 @@ ROOT::RDF::RNode CutDecayModes(ROOT::RDF::RNode df, const std::string &maskname, /// \return a dataframe containing the new mask ROOT::RDF::RNode CutTauID(ROOT::RDF::RNode df, const std::string &maskname, const std::string &nameID, const int &idxID) { - auto df1 = df.Define(maskname, basefunctions::FilterID(idxID), {nameID}); - return df1; + auto df1 = df.Define(maskname, basefunctions::FilterID(idxID), {nameID}); + return df1; } /// Function to correct e to tau fake pt /// @@ -708,61 +706,54 @@ PtCorrection_eleFake(ROOT::RDF::RNode df, const std::string &corrected_pt, const std::string &idAlgorithm, const std::string &sf_dm0_b, const std::string &sf_dm1_b, const std::string &sf_dm0_e, const std::string &sf_dm1_e) { - auto evaluator = - correction::CorrectionSet::from_file(sf_file)->at(jsonESname); - auto tau_pt_correction_lambda = [evaluator, idAlgorithm, sf_dm0_b, sf_dm1_b, - sf_dm0_e, sf_dm1_e]( - const ROOT::RVec &pt_values, - const ROOT::RVec &eta_values, - const ROOT::RVec &decay_modes, - const ROOT::RVec &genmatch) { - ROOT::RVec corrected_pt_values(pt_values.size()); - for (int i = 0; i < pt_values.size(); i++) { - if (genmatch.at(i) == 1 || genmatch.at(i) == 3) { - // only considering wanted tau decay modes - if (decay_modes.at(i) == 0 && - std::abs(eta_values.at(i)) <= 1.5) { - auto sf = evaluator->evaluate( - {pt_values.at(i), std::abs(eta_values.at(i)), - decay_modes.at(i), static_cast(genmatch.at(i)), - idAlgorithm, sf_dm0_b}); - corrected_pt_values[i] = pt_values.at(i) * sf; - } else if (decay_modes.at(i) == 0 && - std::abs(eta_values.at(i)) > 1.5 && - std::abs(eta_values.at(i)) <= 2.5) { - auto sf = evaluator->evaluate( - {pt_values.at(i), std::abs(eta_values.at(i)), - decay_modes.at(i), static_cast(genmatch.at(i)), - idAlgorithm, sf_dm0_e}); - corrected_pt_values[i] = pt_values.at(i) * sf; - } else if (decay_modes.at(i) == 1 && - std::abs(eta_values.at(i)) <= 1.5) { - auto sf = evaluator->evaluate( - {pt_values.at(i), std::abs(eta_values.at(i)), - decay_modes.at(i), static_cast(genmatch.at(i)), - idAlgorithm, sf_dm1_b}); - corrected_pt_values[i] = pt_values.at(i) * sf; - } else if (decay_modes.at(i) == 1 && - std::abs(eta_values.at(i)) > 1.5 && - std::abs(eta_values.at(i)) <= 2.5) { - auto sf = evaluator->evaluate( - {pt_values.at(i), std::abs(eta_values.at(i)), - decay_modes.at(i), static_cast(genmatch.at(i)), - idAlgorithm, sf_dm1_e}); - corrected_pt_values[i] = pt_values.at(i) * sf; - } - } else { - corrected_pt_values[i] = pt_values.at(i); - } - Logger::get("ptcorrection ele fake") - ->debug("tau pt before {}, tau pt after {}", pt_values.at(i), - corrected_pt_values.at(i)); + auto evaluator = + correction::CorrectionSet::from_file(sf_file)->at(jsonESname); + auto tau_pt_correction_lambda = [evaluator, idAlgorithm, sf_dm0_b, sf_dm1_b, + sf_dm0_e, sf_dm1_e]( + const ROOT::RVec &pt_values, + const ROOT::RVec &eta_values, + const ROOT::RVec &decay_modes, + const ROOT::RVec &genmatch) { + ROOT::RVec corrected_pt_values(pt_values.size()); + for (int i = 0; i < pt_values.size(); i++) { + if (genmatch.at(i) == 1 || genmatch.at(i) == 3) { + // only considering wanted tau decay modes + if (decay_modes.at(i) == 0 && std::abs(eta_values.at(i)) <= 1.5) { + auto sf = evaluator->evaluate( + {pt_values.at(i), std::abs(eta_values.at(i)), decay_modes.at(i), + static_cast(genmatch.at(i)), idAlgorithm, sf_dm0_b}); + corrected_pt_values[i] = pt_values.at(i) * sf; + } else if (decay_modes.at(i) == 0 && std::abs(eta_values.at(i)) > 1.5 && + std::abs(eta_values.at(i)) <= 2.5) { + auto sf = evaluator->evaluate( + {pt_values.at(i), std::abs(eta_values.at(i)), decay_modes.at(i), + static_cast(genmatch.at(i)), idAlgorithm, sf_dm0_e}); + corrected_pt_values[i] = pt_values.at(i) * sf; + } else if (decay_modes.at(i) == 1 && + std::abs(eta_values.at(i)) <= 1.5) { + auto sf = evaluator->evaluate( + {pt_values.at(i), std::abs(eta_values.at(i)), decay_modes.at(i), + static_cast(genmatch.at(i)), idAlgorithm, sf_dm1_b}); + corrected_pt_values[i] = pt_values.at(i) * sf; + } else if (decay_modes.at(i) == 1 && std::abs(eta_values.at(i)) > 1.5 && + std::abs(eta_values.at(i)) <= 2.5) { + auto sf = evaluator->evaluate( + {pt_values.at(i), std::abs(eta_values.at(i)), decay_modes.at(i), + static_cast(genmatch.at(i)), idAlgorithm, sf_dm1_e}); + corrected_pt_values[i] = pt_values.at(i) * sf; } - return corrected_pt_values; - }; - auto df1 = df.Define(corrected_pt, tau_pt_correction_lambda, - {pt, eta, decayMode, genMatch}); - return df1; + } else { + corrected_pt_values[i] = pt_values.at(i); + } + Logger::get("ptcorrection ele fake") + ->debug("tau pt before {}, tau pt after {}", pt_values.at(i), + corrected_pt_values.at(i)); + } + return corrected_pt_values; + }; + auto df1 = df.Define(corrected_pt, tau_pt_correction_lambda, + {pt, eta, decayMode, genMatch}); + return df1; } /// Function to correct mu to tau fake pt /// @@ -792,36 +783,35 @@ PtCorrection_muFake(ROOT::RDF::RNode df, const std::string &corrected_pt, const std::string &decayMode, const std::string &genMatch, const std::string &sf_file, const std::string &jsonESname, const std::string &idAlgorithm, const std::string &sf_es) { - auto evaluator = - correction::CorrectionSet::from_file(sf_file)->at(jsonESname); - auto tau_pt_correction_lambda = - [evaluator, idAlgorithm, sf_es](const ROOT::RVec &pt_values, - const ROOT::RVec &eta_values, - const ROOT::RVec &decay_modes, - const ROOT::RVec &genmatch) { - ROOT::RVec corrected_pt_values(pt_values.size()); - for (int i = 0; i < pt_values.size(); i++) { - if (genmatch.at(i) == 2 || genmatch.at(i) == 4) { - // only considering wanted tau decay modes - auto sf = evaluator->evaluate( - {pt_values.at(i), std::abs(eta_values.at(i)), - decay_modes.at(i), static_cast(genmatch.at(i)), - idAlgorithm, sf_es}); - corrected_pt_values[i] = pt_values.at(i) * sf; - } else { - corrected_pt_values[i] = pt_values.at(i); - } - if (genmatch.at(i) == 2 || genmatch.at(i) == 4) { - Logger::get("mu fake")->debug( - "tau pt before {}, tau pt after {}", pt_values.at(i), - corrected_pt_values.at(i)); - } - } - return corrected_pt_values; - }; - auto df1 = df.Define(corrected_pt, tau_pt_correction_lambda, - {pt, eta, decayMode, genMatch}); - return df1; + auto evaluator = + correction::CorrectionSet::from_file(sf_file)->at(jsonESname); + auto tau_pt_correction_lambda = [evaluator, idAlgorithm, + sf_es](const ROOT::RVec &pt_values, + const ROOT::RVec &eta_values, + const ROOT::RVec &decay_modes, + const ROOT::RVec &genmatch) { + ROOT::RVec corrected_pt_values(pt_values.size()); + for (int i = 0; i < pt_values.size(); i++) { + if (genmatch.at(i) == 2 || genmatch.at(i) == 4) { + // only considering wanted tau decay modes + auto sf = evaluator->evaluate( + {pt_values.at(i), std::abs(eta_values.at(i)), decay_modes.at(i), + static_cast(genmatch.at(i)), idAlgorithm, sf_es}); + corrected_pt_values[i] = pt_values.at(i) * sf; + } else { + corrected_pt_values[i] = pt_values.at(i); + } + if (genmatch.at(i) == 2 || genmatch.at(i) == 4) { + Logger::get("mu fake")->debug("tau pt before {}, tau pt after {}", + pt_values.at(i), + corrected_pt_values.at(i)); + } + } + return corrected_pt_values; + }; + auto df1 = df.Define(corrected_pt, tau_pt_correction_lambda, + {pt, eta, decayMode, genMatch}); + return df1; } /// Function to correct tau pt /// @@ -841,27 +831,26 @@ PtCorrection_byValue(ROOT::RDF::RNode df, const std::string &corrected_pt, const std::string &pt, const std::string &decayMode, const float &sf_dm0, const float &sf_dm1, const float &sf_dm10, const float &sf_dm11) { - auto tau_pt_correction_lambda = - [sf_dm0, sf_dm1, sf_dm10, sf_dm11](const ROOT::RVec &pt_values, - const ROOT::RVec &decay_modes) { - ROOT::RVec corrected_pt_values(pt_values.size()); - for (int i = 0; i < pt_values.size(); i++) { - if (decay_modes.at(i) == 0) - corrected_pt_values[i] = pt_values.at(i) * sf_dm0; - else if (decay_modes.at(i) > 0 && decay_modes.at(i) < 5) - corrected_pt_values[i] = pt_values.at(i) * sf_dm1; - else if (decay_modes.at(i) == 10) - corrected_pt_values[i] = pt_values.at(i) * sf_dm10; - else if (decay_modes.at(i) > 10 && decay_modes.at(i) < 15) - corrected_pt_values[i] = pt_values.at(i) * sf_dm11; - else - corrected_pt_values[i] = pt_values.at(i); - } - return corrected_pt_values; - }; - auto df1 = - df.Define(corrected_pt, tau_pt_correction_lambda, {pt, decayMode}); - return df1; + auto tau_pt_correction_lambda = + [sf_dm0, sf_dm1, sf_dm10, sf_dm11](const ROOT::RVec &pt_values, + const ROOT::RVec &decay_modes) { + ROOT::RVec corrected_pt_values(pt_values.size()); + for (int i = 0; i < pt_values.size(); i++) { + if (decay_modes.at(i) == 0) + corrected_pt_values[i] = pt_values.at(i) * sf_dm0; + else if (decay_modes.at(i) > 0 && decay_modes.at(i) < 5) + corrected_pt_values[i] = pt_values.at(i) * sf_dm1; + else if (decay_modes.at(i) == 10) + corrected_pt_values[i] = pt_values.at(i) * sf_dm10; + else if (decay_modes.at(i) > 10 && decay_modes.at(i) < 15) + corrected_pt_values[i] = pt_values.at(i) * sf_dm11; + else + corrected_pt_values[i] = pt_values.at(i); + } + return corrected_pt_values; + }; + auto df1 = df.Define(corrected_pt, tau_pt_correction_lambda, {pt, decayMode}); + return df1; } /// Function to correct tau pt with correctionlib /// @@ -896,56 +885,51 @@ PtCorrection_genTau(ROOT::RDF::RNode df, const std::string &corrected_pt, const std::string &idAlgorithm, const std::string &DM0, const std::string &DM1, const std::string &DM10, const std::string &DM11) { - auto evaluator = - correction::CorrectionSet::from_file(sf_file)->at(jsonESname); - auto tau_pt_correction_lambda = [evaluator, idAlgorithm, DM0, DM1, DM10, - DM11]( - const ROOT::RVec &pt_values, - const ROOT::RVec &eta_values, - const ROOT::RVec &decay_modes, - const ROOT::RVec &genmatch) { - ROOT::RVec corrected_pt_values(pt_values.size()); - for (int i = 0; i < pt_values.size(); i++) { - if (genmatch.at(i) == 5) { - // only considering wanted tau decay modes - if (decay_modes.at(i) == 0) { - auto sf = evaluator->evaluate( - {pt_values.at(i), std::abs(eta_values.at(i)), - decay_modes.at(i), static_cast(genmatch.at(i)), - idAlgorithm, DM0}); - corrected_pt_values[i] = pt_values.at(i) * sf; - } else if (decay_modes.at(i) == 1) { - auto sf = evaluator->evaluate( - {pt_values.at(i), std::abs(eta_values.at(i)), - decay_modes.at(i), static_cast(genmatch.at(i)), - idAlgorithm, DM1}); - corrected_pt_values[i] = pt_values.at(i) * sf; - } else if (decay_modes.at(i) == 10) { - auto sf = evaluator->evaluate( - {pt_values.at(i), std::abs(eta_values.at(i)), - decay_modes.at(i), static_cast(genmatch.at(i)), - idAlgorithm, DM10}); - corrected_pt_values[i] = pt_values.at(i) * sf; - } else if (decay_modes.at(i) == 11) { - auto sf = evaluator->evaluate( - {pt_values.at(i), std::abs(eta_values.at(i)), - decay_modes.at(i), static_cast(genmatch.at(i)), - idAlgorithm, DM11}); - corrected_pt_values[i] = pt_values.at(i) * sf; - } - } else { - corrected_pt_values[i] = pt_values.at(i); - } - Logger::get("tauEnergyCorrection") - ->debug("tau pt before {}, tau pt after {}, decaymode {}", - pt_values.at(i), corrected_pt_values.at(i), - decay_modes.at(i)); + auto evaluator = + correction::CorrectionSet::from_file(sf_file)->at(jsonESname); + auto tau_pt_correction_lambda = [evaluator, idAlgorithm, DM0, DM1, DM10, + DM11](const ROOT::RVec &pt_values, + const ROOT::RVec &eta_values, + const ROOT::RVec &decay_modes, + const ROOT::RVec &genmatch) { + ROOT::RVec corrected_pt_values(pt_values.size()); + for (int i = 0; i < pt_values.size(); i++) { + if (genmatch.at(i) == 5) { + // only considering wanted tau decay modes + if (decay_modes.at(i) == 0) { + auto sf = evaluator->evaluate( + {pt_values.at(i), std::abs(eta_values.at(i)), decay_modes.at(i), + static_cast(genmatch.at(i)), idAlgorithm, DM0}); + corrected_pt_values[i] = pt_values.at(i) * sf; + } else if (decay_modes.at(i) == 1) { + auto sf = evaluator->evaluate( + {pt_values.at(i), std::abs(eta_values.at(i)), decay_modes.at(i), + static_cast(genmatch.at(i)), idAlgorithm, DM1}); + corrected_pt_values[i] = pt_values.at(i) * sf; + } else if (decay_modes.at(i) == 10) { + auto sf = evaluator->evaluate( + {pt_values.at(i), std::abs(eta_values.at(i)), decay_modes.at(i), + static_cast(genmatch.at(i)), idAlgorithm, DM10}); + corrected_pt_values[i] = pt_values.at(i) * sf; + } else if (decay_modes.at(i) == 11) { + auto sf = evaluator->evaluate( + {pt_values.at(i), std::abs(eta_values.at(i)), decay_modes.at(i), + static_cast(genmatch.at(i)), idAlgorithm, DM11}); + corrected_pt_values[i] = pt_values.at(i) * sf; } - return corrected_pt_values; - }; - auto df1 = df.Define(corrected_pt, tau_pt_correction_lambda, - {pt, eta, decayMode, genMatch}); - return df1; + } else { + corrected_pt_values[i] = pt_values.at(i); + } + Logger::get("tauEnergyCorrection") + ->debug("tau pt before {}, tau pt after {}, decaymode {}", + pt_values.at(i), corrected_pt_values.at(i), + decay_modes.at(i)); + } + return corrected_pt_values; + }; + auto df1 = df.Define(corrected_pt, tau_pt_correction_lambda, + {pt, eta, decayMode, genMatch}); + return df1; } } // end namespace tau @@ -964,24 +948,23 @@ ROOT::RDF::RNode PtCorrection_byValue(ROOT::RDF::RNode df, const std::string &corrected_pt, const std::string &pt, const std::string &eta, const float &sf_barrel, const float &sf_endcap) { - auto electron_pt_correction_lambda = - [sf_barrel, sf_endcap](const ROOT::RVec &pt_values, - const ROOT::RVec &eta) { - ROOT::RVec corrected_pt_values(pt_values.size()); - for (int i = 0; i < pt_values.size(); i++) { - if (abs(eta.at(i)) <= 1.479) { - corrected_pt_values[i] = pt_values.at(i) * sf_barrel; - } else if (abs(eta.at(i)) > 1.479) { - corrected_pt_values[i] = pt_values.at(i) * sf_endcap; - } else { - corrected_pt_values[i] = pt_values.at(i); - } - } - return corrected_pt_values; - }; - auto df1 = - df.Define(corrected_pt, electron_pt_correction_lambda, {pt, eta}); - return df1; + auto electron_pt_correction_lambda = + [sf_barrel, sf_endcap](const ROOT::RVec &pt_values, + const ROOT::RVec &eta) { + ROOT::RVec corrected_pt_values(pt_values.size()); + for (int i = 0; i < pt_values.size(); i++) { + if (abs(eta.at(i)) <= 1.479) { + corrected_pt_values[i] = pt_values.at(i) * sf_barrel; + } else if (abs(eta.at(i)) > 1.479) { + corrected_pt_values[i] = pt_values.at(i) * sf_endcap; + } else { + corrected_pt_values[i] = pt_values.at(i); + } + } + return corrected_pt_values; + }; + auto df1 = df.Define(corrected_pt, electron_pt_correction_lambda, {pt, eta}); + return df1; } /// Function to correct electron pt, based on correctionlib file /// @@ -997,40 +980,36 @@ PtCorrection_byValue(ROOT::RDF::RNode df, const std::string &corrected_pt, /// \return a dataframe containing the new mask ROOT::RDF::RNode PtCorrection(ROOT::RDF::RNode df, const std::string &corrected_pt, - const std::string &pt, const std::string &eta, - const std::string &sf_barrel, const std::string &sf_endcap, - const std::string &sf_file, const std::string &jsonESname) { - auto evaluator = - correction::CorrectionSet::from_file(sf_file)->at(jsonESname); - auto electron_pt_correction_lambda = - [evaluator, sf_barrel, sf_endcap](const ROOT::RVec &pt_values, + const std::string &pt, const std::string &eta, + const std::string &sf_barrel, const std::string &sf_endcap, + const std::string &sf_file, const std::string &jsonESname) { + auto evaluator = + correction::CorrectionSet::from_file(sf_file)->at(jsonESname); + auto electron_pt_correction_lambda = + [evaluator, sf_barrel, sf_endcap](const ROOT::RVec &pt_values, const ROOT::RVec &eta) { - ROOT::RVec corrected_pt_values(pt_values.size()); - for (int i = 0; i < pt_values.size(); i++) { - if (abs(eta.at(i)) <= 1.479) { - auto sf = evaluator->evaluate( - {"barrel", sf_barrel}); - corrected_pt_values[i] = pt_values.at(i) * sf; - Logger::get("eleEnergyCorrection") + ROOT::RVec corrected_pt_values(pt_values.size()); + for (int i = 0; i < pt_values.size(); i++) { + if (abs(eta.at(i)) <= 1.479) { + auto sf = evaluator->evaluate({"barrel", sf_barrel}); + corrected_pt_values[i] = pt_values.at(i) * sf; + Logger::get("eleEnergyCorrection") ->debug("barrel: ele pt before {}, ele pt after {}, sf {}", - pt_values.at(i), corrected_pt_values.at(i), - sf); - } else if (abs(eta.at(i)) > 1.479) { - auto sf = evaluator->evaluate( - {"endcap", sf_endcap}); - corrected_pt_values[i] = pt_values.at(i) * sf; - Logger::get("eleEnergyCorrection") + pt_values.at(i), corrected_pt_values.at(i), sf); + } else if (abs(eta.at(i)) > 1.479) { + auto sf = evaluator->evaluate({"endcap", sf_endcap}); + corrected_pt_values[i] = pt_values.at(i) * sf; + Logger::get("eleEnergyCorrection") ->debug("endcap: ele pt before {}, ele pt after {}, sf {}", - pt_values.at(i), corrected_pt_values.at(i), - sf); - } else { - corrected_pt_values[i] = pt_values.at(i); - } - } - return corrected_pt_values; - }; - auto df1 = df.Define(corrected_pt, electron_pt_correction_lambda, {pt, eta}); - return df1; + pt_values.at(i), corrected_pt_values.at(i), sf); + } else { + corrected_pt_values[i] = pt_values.at(i); + } + } + return corrected_pt_values; + }; + auto df1 = df.Define(corrected_pt, electron_pt_correction_lambda, {pt, eta}); + return df1; } /// Function to cut electrons based on the electron MVA ID /// @@ -1041,11 +1020,11 @@ PtCorrection(ROOT::RDF::RNode df, const std::string &corrected_pt, /// \return a dataframe containing the new mask ROOT::RDF::RNode CutID(ROOT::RDF::RNode df, const std::string &maskname, const std::string &nameID) { - auto df1 = df.Define( - maskname, - [](const ROOT::RVec &id) { return (ROOT::RVec)id; }, - {nameID}); - return df1; + auto df1 = df.Define( + maskname, + [](const ROOT::RVec &id) { return (ROOT::RVec)id; }, + {nameID}); + return df1; } /// Function to cut electrons based on the cut based electron ID /// @@ -1058,9 +1037,9 @@ ROOT::RDF::RNode CutID(ROOT::RDF::RNode df, const std::string &maskname, /// \return a dataframe containing the new mask ROOT::RDF::RNode CutCBID(ROOT::RDF::RNode df, const std::string &maskname, const std::string &nameID, const int &IDvalue) { - auto df1 = - df.Define(maskname, basefunctions::FilterMinInt(IDvalue), {nameID}); - return df1; + auto df1 = + df.Define(maskname, basefunctions::FilterMinInt(IDvalue), {nameID}); + return df1; } /// Function to cut electrons based on failing the cut based electron ID /// @@ -1073,9 +1052,9 @@ ROOT::RDF::RNode CutCBID(ROOT::RDF::RNode df, const std::string &maskname, /// \return a dataframe containing the new mask ROOT::RDF::RNode AntiCutCBID(ROOT::RDF::RNode df, const std::string &maskname, const std::string &nameID, const int &IDvalue) { - auto df1 = - df.Define(maskname, basefunctions::FilterMaxInt(IDvalue), {nameID}); - return df1; + auto df1 = + df.Define(maskname, basefunctions::FilterMaxInt(IDvalue), {nameID}); + return df1; } /// Function to cut electrons based on the electron isolation using @@ -1091,9 +1070,27 @@ ROOT::RDF::RNode AntiCutCBID(ROOT::RDF::RNode df, const std::string &maskname, ROOT::RDF::RNode CutIsolation(ROOT::RDF::RNode df, const std::string &maskname, const std::string &isolationName, const float &Threshold) { - auto df1 = df.Define(maskname, basefunctions::FilterMax(Threshold), - {isolationName}); - return df1; + auto df1 = + df.Define(maskname, basefunctions::FilterMax(Threshold), {isolationName}); + return df1; +} +/// Function to cut on electrons based on the electron isolation using +/// basefunctions::FilterMin +/// +/// \param[in] df the input dataframe +/// \param[in] isolationName name of the isolation column in the NanoAOD +/// \param[out] maskname the name of the new mask to be added as column to the +/// dataframe +/// \param[in] Threshold minimal isolation threshold +/// +/// \return a dataframe containing the new mask +ROOT::RDF::RNode AntiCutIsolation(ROOT::RDF::RNode df, + const std::string &maskname, + const std::string &isolationName, + const float &Threshold) { + auto df1 = + df.Define(maskname, basefunctions::FilterMin(Threshold), {isolationName}); + return df1; } /// Function to select electrons below an Dxy and Dz threshold, based on the /// electrons supercluster @@ -1119,20 +1116,19 @@ ROOT::RDF::RNode CutIP(ROOT::RDF::RNode df, const std::string &eta, const float &abseta_eb_ee, const float &max_dxy_eb, const float &max_dz_eb, const float &max_dxy_ee, const float &max_dz_ee) { - auto lambda = [abseta_eb_ee, max_dxy_eb, max_dz_eb, max_dxy_ee, - max_dz_ee](const ROOT::RVec &eta, - const ROOT::RVec &detasc, - const ROOT::RVec &dxy, - const ROOT::RVec &dz) { - ROOT::RVec mask = (((abs(eta + detasc) < abseta_eb_ee) && - (dxy < max_dxy_eb) && (dz < max_dz_eb)) || - ((abs(eta + detasc) >= abseta_eb_ee) && - (dxy < max_dxy_ee) && (dz < max_dz_ee))); - return mask; - }; + auto lambda = [abseta_eb_ee, max_dxy_eb, max_dz_eb, max_dxy_ee, max_dz_ee]( + const ROOT::RVec &eta, + const ROOT::RVec &detasc, + const ROOT::RVec &dxy, const ROOT::RVec &dz) { + ROOT::RVec mask = (((abs(eta + detasc) < abseta_eb_ee) && + (dxy < max_dxy_eb) && (dz < max_dz_eb)) || + ((abs(eta + detasc) >= abseta_eb_ee) && + (dxy < max_dxy_ee) && (dz < max_dz_ee))); + return mask; + }; - auto df1 = df.Define(maskname, lambda, {eta, detasc, dxy, dz}); - return df1; + auto df1 = df.Define(maskname, lambda, {eta, detasc, dxy, dz}); + return df1; } /// Function to veto electrons in the transition region of EB and EE, based on @@ -1152,15 +1148,138 @@ ROOT::RDF::RNode CutIP(ROOT::RDF::RNode df, const std::string &eta, ROOT::RDF::RNode CutGap(ROOT::RDF::RNode df, const std::string &eta, const std::string &detasc, const std::string &maskname, const float &end_eb, const float &start_ee) { - auto lambda = [end_eb, start_ee](const ROOT::RVec &eta, - const ROOT::RVec &detasc) { - ROOT::RVec mask = - (abs(eta + detasc) < end_eb) || (abs(eta + detasc) > start_ee); - return mask; - }; + auto lambda = [end_eb, start_ee](const ROOT::RVec &eta, + const ROOT::RVec &detasc) { + ROOT::RVec mask = + (abs(eta + detasc) < end_eb) || (abs(eta + detasc) > start_ee); + return mask; + }; - auto df1 = df.Define(maskname, lambda, {eta, detasc}); - return df1; + auto df1 = df.Define(maskname, lambda, {eta, detasc}); + return df1; +} + +// electron selection using WP and bitmap information, see also https://twiki.cern.ch/twiki/bin/view/CMS/CutBasedElectronIdentificationRun2#Applying_Individual_Cuts_of_a_Se +// code taken from https://github.com/WMass/WRemnants/blob/main/wremnants/include/electron_selections.h + +const int icut_min_pt = 0; +const int icut_sc_eta = 3; +const int icut_deta_seed = 6; +const int icut_dphi_in = 9; +const int icut_sieie_5x5 = 12; +const int icut_hoe = 15; +const int icut_inve_over_invp = 18; +const int icut_relpfiso = 21; +const int icut_conv_veto = 24; +const int icut_miss_hit = 27; + +template constexpr std::size_t last_n(std::size_t bits) { + static_assert(N < sizeof(std::size_t), + "ERROR: this function makes no sense for too large N!"); + return bits & + std::bitset(std::numeric_limits::max()).to_ullong(); +} + +template +const int bitset(int wp, std::integer_sequence) { + return ((wp << cuts) + ...); +} + +const auto iseq_min_pt = std::integer_sequence{}; +const auto iseq_sc_eta = std::integer_sequence{}; +const auto iseq_deta_seed = std::integer_sequence{}; +const auto iseq_dphi_in = std::integer_sequence{}; +const auto iseq_sieie_5x5 = std::integer_sequence{}; +const auto iseq_hoe = std::integer_sequence{}; +const auto iseq_inve_over_invp = + std::integer_sequence{}; +const auto iseq_relpfiso = std::integer_sequence{}; +const auto iseq_conv_veto = std::integer_sequence{}; +const auto iseq_miss_hit = std::integer_sequence{}; +const auto iseq_all_but_pfiso = + std::integer_sequence{}; +const auto iseq_all = + std::integer_sequence{}; + +template const int bitset_min_pt = bitset(WP, iseq_min_pt); +template const int bitset_sc_eta = bitset(WP, iseq_sc_eta); +template const int bitset_deta_seed = bitset(WP, iseq_deta_seed); +template const int bitset_dphi_in = bitset(WP, iseq_dphi_in); +template const int bitset_sieie_5x5 = bitset(WP, iseq_sieie_5x5); +template const int bitset_hoe = bitset(WP, iseq_hoe); +template +const int bitset_inve_over_invp = bitset(WP, iseq_inve_over_invp); +template const int bitset_relpfiso = bitset(WP, iseq_relpfiso); +template const int bitset_conv_veto = bitset(WP, iseq_conv_veto); +template const int bitset_miss_hit = bitset(WP, iseq_miss_hit); +template +const int bitset_all_but_pfiso = bitset(WP, iseq_all_but_pfiso); +template const int bitset_all = bitset(WP, iseq_all); + +/// Function to select electrons passing all bits but rel iso of +/// cutbased electron id (using bitmap of cutbased id) +/// +/// \param[in] df the input dataframe +/// \param[out] maskname the name of the new mask to be added as column to +/// the dataframe +/// \param[in] nameID name of the ID column in the NanoAOD +/// \param[in] IDvalue value of the WP for which bits are read out and +/// modified such that rel iso bit is set to fail +// \param[in] bitmap name of the ID bitmap in the NanoAOD +/// +/// \return a dataframe containing the new mask +ROOT::RDF::RNode CutCBIDBitmapNoIso(ROOT::RDF::RNode df, + const std::string &maskname, + const int &IDvalue, + const std::string &bitmap) { + + const int nbit = 3; + + const int tight = 4; + const int medium = 3; + const int loose = 2; + const int veto = 1; + const int fail = 0; + + const int ncut = 10; + + + // hacky coding to avoid "IDvalue is not a constant expression" error when directly using `const int bits = bitset_all_but_pfiso;` + int bits_tmp; + + if (IDvalue == tight) bits_tmp = bitset_all_but_pfiso; + else if (IDvalue == medium) bits_tmp = bitset_all_but_pfiso; + else if (IDvalue == loose) bits_tmp = bitset_all_but_pfiso; + else if (IDvalue == veto) bits_tmp = bitset_all_but_pfiso; + else bits_tmp = bitset_all_but_pfiso; + + const int bits = bits_tmp; + + auto lambda = [IDvalue, ncut, bits](const ROOT::VecOps::RVec bitmap) { + + ROOT::VecOps::RVec passID(bitmap.size(), 0); + for (std::size_t ibit = 0ull; ibit < bitmap.size(); ++ibit) { + bool pass_cuts = true; + + for (int icut = 0; icut < ncut; ++icut) { + const int nshift = icut * nbit; + pass_cuts = pass_cuts and (last_n(bitmap[ibit] >> nshift) >= + last_n(bits >> nshift)); + } + + passID[ibit] = pass_cuts; + } + + return passID; + }; + + auto df1 = df.Define(maskname, lambda, {bitmap}); + return df1; } } // end namespace electron diff --git a/src/reweighting.cxx b/src/reweighting.cxx index 010ef306..7d9b3651 100644 --- a/src/reweighting.cxx +++ b/src/reweighting.cxx @@ -110,20 +110,20 @@ ROOT::RDF::RNode topptreweighting(ROOT::RDF::RNode df, std::cout << top_pts.size(); Logger::get("topptreweighting") ->error("TTbar reweighting applied to event with not exactly " - "two top quarks. Probably due to wrong sample type."); + "two top quarks. Probably due to wrong sample type. " + "n_top: {}", + top_pts.size()); throw std::runtime_error("Bad number of top quarks."); } - if (top_pts[0] > 472.0) - top_pts[0] = 472.0; - if (top_pts[1] > 472.0) - top_pts[1] = 472.0; - const float parameter_a = 0.088; - const float parameter_b = -0.00087; - const float parameter_c = 0.00000092; - return sqrt(exp(parameter_a + parameter_b * top_pts[0] + - parameter_c * top_pts[0] * top_pts[0]) * - exp(parameter_a + parameter_b * top_pts[1] + - parameter_c * top_pts[1] * top_pts[1])); + + if (top_pts[0] > 500.0) + top_pts[0] = 500.0; + if (top_pts[1] > 500.0) + top_pts[1] = 500.0; + const float parameter_a = 0.0615; + const float parameter_b = -0.0005; + return sqrt(exp(parameter_a + parameter_b * top_pts[0]) * + exp(parameter_a + parameter_b * top_pts[1])); }; auto df1 = df.Define(weightname, ttbarreweightlambda, {gen_pdgids, gen_status, gen_pt}); @@ -244,4 +244,4 @@ ROOT::RDF::RNode lhe_scale_weights(ROOT::RDF::RNode df, return df1; } } // namespace reweighting -#endif /* GUARD_REWEIGHTING_H */ \ No newline at end of file +#endif /* GUARD_REWEIGHTING_H */ diff --git a/src/topreco.cxx b/src/topreco.cxx index 8cc51764..81a22442 100644 --- a/src/topreco.cxx +++ b/src/topreco.cxx @@ -724,6 +724,8 @@ ROOT::RDF::RNode JetSelection(ROOT::RDF::RNode df, const int &njets, * b-tagged jet b tagging score. * @param[out] str_is_reco Name of the output column for the flag if the top * quark is reconstructable. + * @param[out] str_is_jj Name of the output column for the flag if the event + * falls into the 2j0b category. * @param[out] str_is_jjb Name of the output column for the flag if the event * falls into the 2j1b category. * @param[out] str_is_jjbb Name of the output column for the flag if the event @@ -751,19 +753,26 @@ TopReco(ROOT::RDF::RNode df, const std::string &str_wlep_p4, const std::string &str_nonbjet_btag_2, const std::string &str_n_bjets, const std::string &str_bjet_p4_1, const std::string &str_bjet_btag_1, const std::string &str_bjet_p4_2, const std::string &str_bjet_btag_2, - const std::string &str_is_reco, const std::string &str_is_jjb, - const std::string &str_is_jjbb, const std::string &str_is_jjjb, - const std::string &str_is_jjjbb, const std::string &str_reco_p4s, - const std::string &str_top_p4, const std::string &str_tb_p4, - const std::string &str_sb_p4) { - - auto df2 = - df.Define(str_is_jjb, + const std::string &str_is_reco, const std::string &str_is_jj, + const std::string &str_is_jjb, const std::string &str_is_jjbb, + const std::string &str_is_jjjb, const std::string &str_is_jjjbb, + const std::string &str_reco_p4s, const std::string &str_top_p4, + const std::string &str_tb_p4, const std::string &str_sb_p4) { + + auto df2a = + df.Define(str_is_jj, [](const int n_nonbjets, const int n_bjets) { - return int((n_nonbjets + n_bjets) == 2 && n_bjets == 1); + return int((n_nonbjets + n_bjets) == 2 && n_bjets == 0); }, {str_n_nonbjets, str_n_bjets}); + auto df2 = + df2a.Define(str_is_jjb, + [](const int n_nonbjets, const int n_bjets) { + return int((n_nonbjets + n_bjets) == 2 && n_bjets == 1); + }, + {str_n_nonbjets, str_n_bjets}); + auto df3 = df2.Define(str_is_jjbb, [](const int n_nonbjets, const int n_bjets) { @@ -792,8 +801,8 @@ TopReco(ROOT::RDF::RNode df, const std::string &str_wlep_p4, }, {str_is_jjb, str_is_jjbb, str_is_jjjb, str_is_jjjbb}); - auto top_reco = [](const int is_reco, const int is_jjb, const int is_jjbb, - const int is_jjjb, const int is_jjjbb, + auto top_reco = [](const int is_reco, const int is_jj, const int is_jjb, + const int is_jjbb, const int is_jjjb, const int is_jjjbb, const ROOT::Math::PtEtaPhiMVector wlep_p4, const ROOT::Math::PtEtaPhiMVector nonbjet_p4_1, const float nonbjet_btag_1, @@ -856,11 +865,11 @@ TopReco(ROOT::RDF::RNode df, const std::string &str_wlep_p4, }; auto df7 = df6.Define(str_reco_p4s, top_reco, - {str_is_reco, str_is_jjb, str_is_jjbb, str_is_jjjb, - str_is_jjjbb, str_wlep_p4, str_nonbjet_p4_1, - str_nonbjet_btag_1, str_nonbjet_p4_2, - str_nonbjet_btag_2, str_bjet_p4_1, str_bjet_btag_1, - str_bjet_p4_2, str_bjet_btag_2}); + {str_is_reco, str_is_jj, str_is_jjb, str_is_jjbb, + str_is_jjjb, str_is_jjjbb, str_wlep_p4, + str_nonbjet_p4_1, str_nonbjet_btag_1, + str_nonbjet_p4_2, str_nonbjet_btag_2, str_bjet_p4_1, + str_bjet_btag_1, str_bjet_p4_2, str_bjet_btag_2}); auto df8 = df7.Define(str_top_p4, @@ -1711,6 +1720,8 @@ ROOT::RDF::RNode LeptonScaleFactors( * category * @param[in] str_is_reco Name of the column containing the flag if the event is * reconstructable + * @param[out] str_is_jj Name of the output column for the flag if the event + * falls into the 2j0b category. * @param[in] str_is_jjb Name of the column containing the flag if the event * falls into the 2j1b category * @param[in] str_is_jjbb Name of the column containing the flag if the event @@ -1783,10 +1794,11 @@ ROOT::RDF::RNode LeptonScaleFactors( */ ROOT::RDF::RNode BTagScaleFactors( ROOT::RDF::RNode df, const std::string &str_is_iso, - const std::string &str_is_reco, const std::string &str_is_jjb, - const std::string &str_is_jjbb, const std::string &str_is_jjjb, - const std::string &str_is_jjjbb, const std::string &str_nonbjet_pt_1, - const std::string &str_nonbjet_eta_1, const std::string &str_nonbjet_btag_1, + const std::string &str_is_reco, const std::string &str_is_jj, + const std::string &str_is_jjb, const std::string &str_is_jjbb, + const std::string &str_is_jjjb, const std::string &str_is_jjjbb, + const std::string &str_nonbjet_pt_1, const std::string &str_nonbjet_eta_1, + const std::string &str_nonbjet_btag_1, const std::string &str_nonbjet_flavor_1, const std::string &str_nonbjet_pt_2, const std::string &str_nonbjet_eta_2, const std::string &str_nonbjet_btag_2, @@ -1870,22 +1882,22 @@ ROOT::RDF::RNode BTagScaleFactors( btag_corr_algo_HF, btag_corr_algo_LF, evaluator_btag_eff_b, evaluator_btag_eff_c, evaluator_btag_eff_udsg, btag_wp, max_bjet_eta_sf, shift_HF, shift_LF]( - const int &is_iso, const int &is_reco, const int &is_jjb, - const int &is_jjbb, const int &is_jjjb, - const int &is_jjjbb, const float &nonbjet_pt_1, - const float &nonbjet_eta_1, const float &nonbjet_btag_1, - const int &nonbjet_flavor_1, const float &nonbjet_pt_2, - const float &nonbjet_eta_2, const float &nonbjet_btag_2, - const int &nonbjet_flavor_2, const float &bjet_pt_1, - const float &bjet_eta_1, const float &bjet_btag_1, - const int &bjet_flavor_1, const float &bjet_pt_2, - const float &bjet_eta_2, const float &bjet_btag_2, - const int &bjet_flavor_2) { + const int &is_iso, const int &is_reco, const int &is_jj, + const int &is_jjb, const int &is_jjbb, + const int &is_jjjb, const int &is_jjjbb, + const float &nonbjet_pt_1, const float &nonbjet_eta_1, + const float &nonbjet_btag_1, const int &nonbjet_flavor_1, + const float &nonbjet_pt_2, const float &nonbjet_eta_2, + const float &nonbjet_btag_2, const int &nonbjet_flavor_2, + const float &bjet_pt_1, const float &bjet_eta_1, + const float &bjet_btag_1, const int &bjet_flavor_1, + const float &bjet_pt_2, const float &bjet_eta_2, + const float &bjet_btag_2, const int &bjet_flavor_2) { unsigned n_vars = shift_HF.size(); ROOT::RVec sf_vec(n_vars, 1.); - if (is_iso != +1 || is_reco == 0) + if ( ( ( is_iso != +1 || is_reco == 0 ) && is_jj != 1 ) || ( is_iso != +1 && is_jj == 1 ) ) return sf_vec; double P_MC = 1.; @@ -1901,6 +1913,78 @@ ROOT::RDF::RNode BTagScaleFactors( double eff_nonb1 = 1.; double eff_nonb2 = 1.; + if (is_jj) { + if (std::abs(nonbjet_eta_1) < max_bjet_eta_sf) { + if (nonbjet_flavor_1 == 5) { + eff_nonb1 = evaluator_btag_eff_b->evaluate( + {nonbjet_eta_1, nonbjet_pt_1}); + for (unsigned i = 0; i < n_vars; i++) + sf_nonb1[i] = evaluator_btag_sf_HF->evaluate( + {shift_HF[i], btag_wp, nonbjet_flavor_1, + std::abs(nonbjet_eta_1), nonbjet_pt_1}); + } else if (nonbjet_flavor_1 == 4) { + eff_nonb1 = evaluator_btag_eff_c->evaluate( + {nonbjet_eta_1, nonbjet_pt_1}); + for (unsigned i = 0; i < n_vars; i++) + sf_nonb1[i] = evaluator_btag_sf_HF->evaluate( + {shift_HF[i], btag_wp, nonbjet_flavor_1, + std::abs(nonbjet_eta_1), nonbjet_pt_1}); + } else { + eff_nonb1 = evaluator_btag_eff_udsg->evaluate( + {nonbjet_eta_1, nonbjet_pt_1}); + for (unsigned i = 0; i < n_vars; i++) + sf_nonb1[i] = evaluator_btag_sf_LF->evaluate( + {shift_LF[i], btag_wp, nonbjet_flavor_1, + std::abs(nonbjet_eta_1), nonbjet_pt_1}); + } + + P_MC *= (1 - eff_nonb1); + for (unsigned i = 0; i < n_vars; i++) { + P_data[i] *= (1 - sf_nonb1[i] * eff_nonb1); + Logger::get("btagsf")->debug( + "updating P ... eff_nonb1 {}, sf_nonb1 {}, P_MC {}, " + "P_data {}", + eff_nonb1, sf_nonb1[i], P_MC, P_data[i]); + } + } + if (std::abs(nonbjet_eta_2) < max_bjet_eta_sf) { + Logger::get("btagsf")->debug( + "val 1 {}, val 2 {}, < ??? {}", std::abs(nonbjet_eta_2), + max_bjet_eta_sf, std::abs(nonbjet_eta_2) < max_bjet_eta_sf); + if (nonbjet_flavor_2 == 5) { + eff_nonb2 = evaluator_btag_eff_b->evaluate( + {nonbjet_eta_2, nonbjet_pt_2}); + for (unsigned i = 0; i < n_vars; i++) + sf_nonb2[i] = evaluator_btag_sf_HF->evaluate( + {shift_HF[i], btag_wp, nonbjet_flavor_2, + std::abs(nonbjet_eta_2), nonbjet_pt_2}); + } else if (nonbjet_flavor_2 == 4) { + eff_nonb2 = evaluator_btag_eff_c->evaluate( + {nonbjet_eta_2, nonbjet_pt_2}); + for (unsigned i = 0; i < n_vars; i++) + sf_nonb2[i] = evaluator_btag_sf_HF->evaluate( + {shift_HF[i], btag_wp, nonbjet_flavor_2, + std::abs(nonbjet_eta_2), nonbjet_pt_2}); + } else { + eff_nonb2 = evaluator_btag_eff_udsg->evaluate( + {nonbjet_eta_2, nonbjet_pt_2}); + for (unsigned i = 0; i < n_vars; i++) + sf_nonb2[i] = evaluator_btag_sf_LF->evaluate( + {shift_LF[i], btag_wp, nonbjet_flavor_2, + std::abs(nonbjet_eta_2), nonbjet_pt_2}); + } + + P_MC *= (1 - eff_nonb2); + for (unsigned i = 0; i < n_vars; i++) { + P_data[i] *= (1 - sf_nonb2[i] * eff_nonb2); + Logger::get("btagsf")->debug( + "updating P ... eff_nonb2 {}, sf_nonb2 {}, P_MC {}, " + "P_data {}", + eff_nonb2, sf_nonb2[i], P_MC, P_data[i]); + } + } + } + if (is_jjb) { Logger::get("btagsf")->debug( @@ -2283,14 +2367,14 @@ ROOT::RDF::RNode BTagScaleFactors( auto df2 = df.Define( str_btag_sf_vec, btag_sf, - {str_is_iso, str_is_reco, str_is_jjb, - str_is_jjbb, str_is_jjjb, str_is_jjjbb, - str_nonbjet_pt_1, str_nonbjet_eta_1, str_nonbjet_btag_1, - str_nonbjet_flavor_1, str_nonbjet_pt_2, str_nonbjet_eta_2, - str_nonbjet_btag_2, str_nonbjet_flavor_2, str_bjet_pt_1, - str_bjet_eta_1, str_bjet_btag_1, str_bjet_flavor_1, - str_bjet_pt_2, str_bjet_eta_2, str_bjet_btag_2, - str_bjet_flavor_2}); + {str_is_iso, str_is_reco, str_is_jj, + str_is_jjb, str_is_jjbb, str_is_jjjb, + str_is_jjjbb, str_nonbjet_pt_1, str_nonbjet_eta_1, + str_nonbjet_btag_1, str_nonbjet_flavor_1, str_nonbjet_pt_2, + str_nonbjet_eta_2, str_nonbjet_btag_2, str_nonbjet_flavor_2, + str_bjet_pt_1, str_bjet_eta_1, str_bjet_btag_1, + str_bjet_flavor_1, str_bjet_pt_2, str_bjet_eta_2, + str_bjet_btag_2, str_bjet_flavor_2}); auto df3 = df2.Define(str_btagw_nom, @@ -2599,6 +2683,56 @@ ROOT::RDF::RNode BTagScaleFactorsGeneric( return df11; } +/** + * Function to combine lepton flavor dependent DNN output into a single column + * + * @param[in] df The input dataframe. + * @param[in] str_lep_is_mu name of the column containing the flag if the event + * contains a muon + * @param[in] str_lep_is_el name of the column containing the flag if the event + * contains an electron + * @param[in] str_lep_is_iso name of the column containing the flag if the event + * is (anti-)isolated + * @param[in] str_is_reco The name of the column containing the flag if a top + * quark was reconstructed. + * @param[in] str_dnn_mu name of the column containing DNN output for muons + * @param[in] str_dnn_el name of the column containing DNN output for electrons + * + * @param[out] str_dnn Name of the output column for the final DNN output column + * + * @return A dataframe containing the new column. + */ +ROOT::RDF::RNode +CombineDNNOutputs(ROOT::RDF::RNode df, const std::string &str_lep_is_mu, + const std::string &str_lep_is_el, + const std::string &str_lep_is_iso, + const std::string &str_is_reco, const std::string &str_dnn_mu, + const std::string &str_dnn_el, const std::string &str_dnn) { + + auto DNN_output = [](const int is_mu, const int is_el, const int is_iso, + const int is_reco, const double dnn_mu, + const double dnn_el) { + double output = -10; + + if (!is_reco or is_iso == 0) + return output; + + if (is_mu) + output = dnn_mu; + + if (is_el) + output = dnn_el; + + return output; + }; + + auto df2 = df.Define(str_dnn, DNN_output, + {str_lep_is_mu, str_lep_is_el, str_lep_is_iso, + str_is_reco, str_dnn_mu, str_dnn_el}); + + return df2; +} + } // end namespace topreco #endif /* GUARD_TOPRECO_H */ diff --git a/src/triggers.cxx b/src/triggers.cxx index 75edf502..71066b0b 100644 --- a/src/triggers.cxx +++ b/src/triggers.cxx @@ -145,25 +145,34 @@ bool matchParticle(const ROOT::Math::PtEtaPhiMVector &particle, bool pt = particle.pt() > pt_cut; bool eta = abs(particle.eta()) < eta_cut; Logger::get("CheckTriggerMatch") - ->debug("Partice Lorentz Vector: {}, {}, {}, {}", particle.pt(), particle.eta(), particle.phi(), particle.mass()); + ->debug("Partice Lorentz Vector: {}, {}, {}, {}", particle.pt(), + particle.eta(), particle.phi(), particle.mass()); Logger::get("CheckTriggerMatch") ->debug("-------------------------------------------------------"); - Logger::get("CheckTriggerMatch")->debug("deltaR/matchDeltaR Check: {}/{}", deltaR, matchDeltaR); + Logger::get("CheckTriggerMatch") + ->debug("deltaR/matchDeltaR Check: {}/{}", deltaR, matchDeltaR); Logger::get("CheckTriggerMatch") ->debug("deltaR Value: {}", ROOT::Math::VectorUtil::DeltaR(triggerobject, particle)); - Logger::get("CheckTriggerMatch")->debug("id/trigger_particle_id_cut Check: {}/{}", id, trigger_particle_id_cut); + Logger::get("CheckTriggerMatch") + ->debug("id/trigger_particle_id_cut Check: {}/{}", id, + trigger_particle_id_cut); Logger::get("CheckTriggerMatch") ->debug("id Value: {}", triggerobject_ids[idx]); - Logger::get("CheckTriggerMatch")->debug("bit/triggerbit_cut Check: {}/{}", bit, triggerbit_cut); + Logger::get("CheckTriggerMatch") + ->debug("bit/triggerbit_cut Check: {}/{}", bit, triggerbit_cut); Logger::get("CheckTriggerMatch") ->debug("bit Value: {}", IntBits(triggerobject_bits[idx])); - Logger::get("CheckTriggerMatch")->debug("pt/pt_cut Check: {}/{}", pt, pt_cut); Logger::get("CheckTriggerMatch") - ->debug("pt Value (trg): {}, pt Value (reco): {}", triggerobject_pts[idx], particle.pt()); - Logger::get("CheckTriggerMatch")->debug("eta/eta_cut Check: {}/{}", eta, eta_cut); + ->debug("pt/pt_cut Check: {}/{}", pt, pt_cut); + Logger::get("CheckTriggerMatch") + ->debug("pt Value (trg): {}, pt Value (reco): {}", + triggerobject_pts[idx], particle.pt()); Logger::get("CheckTriggerMatch") - ->debug("eta (trg) Value: {}, eta (reco) Value: {}", triggerobject_etas[idx], abs(particle.eta())); + ->debug("eta/eta_cut Check: {}/{}", eta, eta_cut); + Logger::get("CheckTriggerMatch") + ->debug("eta (trg) Value: {}, eta (reco) Value: {}", + triggerobject_etas[idx], abs(particle.eta())); Logger::get("CheckTriggerMatch") ->debug("-------------------------------------------------------"); if (deltaR && bit && id && pt && eta) { @@ -219,38 +228,38 @@ ROOT::RDF::RNode GenerateSingleTriggerFlag( const int &trigger_particle_id_cut, const int &triggerbit_cut, const float &DeltaR_threshold) { - auto triggermatch = - [DeltaR_threshold, pt_cut, eta_cut, trigger_particle_id_cut, - triggerbit_cut, hltpath](bool hltpath_match, - const ROOT::Math::PtEtaPhiMVector &particle_p4, - ROOT::RVec triggerobject_bits, - ROOT::RVec triggerobject_ids, - ROOT::RVec triggerobject_pts, - ROOT::RVec triggerobject_etas, - ROOT::RVec triggerobject_phis) { - Logger::get("GenerateSingleTriggerFlag")->debug("Checking Trigger"); + auto triggermatch = [DeltaR_threshold, pt_cut, eta_cut, + trigger_particle_id_cut, triggerbit_cut, hltpath]( + bool hltpath_match, + const ROOT::Math::PtEtaPhiMVector &particle_p4, + ROOT::RVec triggerobject_bits, + ROOT::RVec triggerobject_ids, + ROOT::RVec triggerobject_pts, + ROOT::RVec triggerobject_etas, + ROOT::RVec triggerobject_phis) { + Logger::get("GenerateSingleTriggerFlag")->debug("Checking Trigger"); + Logger::get("CheckTriggerMatch") + ->debug("Selected trigger: {}", hltpath); + bool result = false; + bool match_result = false; + if (hltpath_match) { Logger::get("CheckTriggerMatch") - ->debug("Selected trigger: {}", hltpath); - bool result = false; - bool match_result = false; - if (hltpath_match) { - Logger::get("CheckTriggerMatch") - ->debug("Checking Triggerobject match with particles ...."); - match_result = matchParticle( - particle_p4, triggerobject_pts, triggerobject_etas, - triggerobject_phis, triggerobject_bits, triggerobject_ids, - DeltaR_threshold, pt_cut, eta_cut, trigger_particle_id_cut, - triggerbit_cut); - } - result = hltpath_match & match_result; - Logger::get("GenerateSingleTriggerFlag") - ->debug("---> HLT Match: {}", hltpath_match); - Logger::get("GenerateSingleTriggerFlag") - ->debug("---> Total Match: {}", match_result); - Logger::get("GenerateSingleTriggerFlag") - ->debug("--->>>> result: {}", result); - return result; - }; + ->debug("Checking Triggerobject match with particles ...."); + match_result = matchParticle( + particle_p4, triggerobject_pts, triggerobject_etas, + triggerobject_phis, triggerobject_bits, triggerobject_ids, + DeltaR_threshold, pt_cut, eta_cut, trigger_particle_id_cut, + triggerbit_cut); + } + result = hltpath_match & match_result; + Logger::get("GenerateSingleTriggerFlag") + ->debug("---> HLT Match: {}", hltpath_match); + Logger::get("GenerateSingleTriggerFlag") + ->debug("---> Total Match: {}", match_result); + Logger::get("GenerateSingleTriggerFlag") + ->debug("--->>>> result: {}", result); + return result; + }; auto available_trigger = df.GetColumnNames(); std::vector matched_trigger_names; std::regex hltpath_regex = std::regex(hltpath); @@ -365,7 +374,7 @@ ROOT::RDF::RNode GenerateDoubleTriggerFlag( ROOT::RVec triggerobject_phis) { Logger::get("GenerateDoubleTriggerFlag")->debug("Checking Trigger"); Logger::get("CheckTriggerMatch") - ->debug("Selected trigger: {}", hltpath); + ->debug("Selected trigger: {}", hltpath); bool result = false; bool match_result_p1 = false; bool match_result_p2 = false; @@ -669,25 +678,34 @@ bool matchParticle(const ROOT::Math::PtEtaPhiMVector &particle, (trigger_particle_pt_cut < 0.) || (triggerobject_pts[idx] > trigger_particle_pt_cut); Logger::get("CheckTriggerMatch") - ->debug("Partice Lorentz Vector: {}, {}, {}, {}", particle.pt(), particle.eta(), particle.phi(), particle.mass()); + ->debug("Partice Lorentz Vector: {}, {}, {}, {}", particle.pt(), + particle.eta(), particle.phi(), particle.mass()); Logger::get("CheckTriggerMatch") ->debug("-------------------------------------------------------"); - Logger::get("CheckTriggerMatch")->debug("deltaR/matchDeltaR Check: {}/{}", deltaR, matchDeltaR); + Logger::get("CheckTriggerMatch") + ->debug("deltaR/matchDeltaR Check: {}/{}", deltaR, matchDeltaR); Logger::get("CheckTriggerMatch") ->debug("deltaR Value: {}", ROOT::Math::VectorUtil::DeltaR(triggerobject, particle)); - Logger::get("CheckTriggerMatch")->debug("id/trigger_particle_id_cut Check: {}/{}", id, trigger_particle_id_cut); + Logger::get("CheckTriggerMatch") + ->debug("id/trigger_particle_id_cut Check: {}/{}", id, + trigger_particle_id_cut); Logger::get("CheckTriggerMatch") ->debug("id Value: {}", triggerobject_ids[idx]); - Logger::get("CheckTriggerMatch")->debug("bit/triggerbit_cut Check: {}/{}", bit, triggerbit_cut); + Logger::get("CheckTriggerMatch") + ->debug("bit/triggerbit_cut Check: {}/{}", bit, triggerbit_cut); Logger::get("CheckTriggerMatch") ->debug("bit Value: {}", IntBits(triggerobject_bits[idx])); - Logger::get("CheckTriggerMatch")->debug("pt/pt_cut Check: {}/{}", pt, pt_cut); Logger::get("CheckTriggerMatch") - ->debug("pt Value (trg): {}, pt Value (reco): {}", triggerobject_pts[idx], particle.pt()); - Logger::get("CheckTriggerMatch")->debug("eta/eta_cut Check: {}/{}", eta, eta_cut); + ->debug("pt/pt_cut Check: {}/{}", pt, pt_cut); + Logger::get("CheckTriggerMatch") + ->debug("pt Value (trg): {}, pt Value (reco): {}", + triggerobject_pts[idx], particle.pt()); Logger::get("CheckTriggerMatch") - ->debug("eta (trg) Value: {}, eta (reco) Value: {}", triggerobject_etas[idx], abs(particle.eta())); + ->debug("eta/eta_cut Check: {}/{}", eta, eta_cut); + Logger::get("CheckTriggerMatch") + ->debug("eta (trg) Value: {}, eta (reco) Value: {}", + triggerobject_etas[idx], abs(particle.eta())); Logger::get("CheckTriggerMatch") ->debug("-------------------------------------------------------"); if (deltaR && bit && id && pt && eta && trigger_particle_pt) { @@ -743,7 +761,8 @@ ROOT::RDF::RNode MatchSingleTriggerObject( const float &DeltaR_threshold, const float &trigger_particle_pt_cut) { auto triggermatch = [DeltaR_threshold, pt_cut, eta_cut, - trigger_particle_id_cut, triggerbit_cut, trigger_particle_pt_cut]( + trigger_particle_id_cut, triggerbit_cut, + trigger_particle_pt_cut]( const ROOT::Math::PtEtaPhiMVector &particle_p4, ROOT::RVec triggerobject_bits, ROOT::RVec triggerobject_ids, @@ -753,11 +772,11 @@ ROOT::RDF::RNode MatchSingleTriggerObject( Logger::get("MatchSingleTriggerObject")->debug("Checking Trigger"); Logger::get("MatchSingleTriggerObject") ->debug("Checking Triggerobject match with particles ...."); - bool match_result = - matchParticle(particle_p4, triggerobject_pts, triggerobject_etas, - triggerobject_phis, triggerobject_bits, - triggerobject_ids, DeltaR_threshold, pt_cut, eta_cut, - trigger_particle_id_cut, triggerbit_cut, trigger_particle_pt_cut); + bool match_result = matchParticle( + particle_p4, triggerobject_pts, triggerobject_etas, + triggerobject_phis, triggerobject_bits, triggerobject_ids, + DeltaR_threshold, pt_cut, eta_cut, trigger_particle_id_cut, + triggerbit_cut, trigger_particle_pt_cut); Logger::get("MatchSingleTriggerObject") ->debug("--->>>> match_result: {}", match_result); return match_result; @@ -821,7 +840,7 @@ ROOT::RDF::RNode GenerateSingleTriggerFlag( ROOT::RVec triggerobject_phis) { Logger::get("GenerateSingleTriggerFlag")->debug("Checking Trigger"); Logger::get("CheckTriggerMatch") - ->debug("Selected trigger: {}", hltpath); + ->debug("Selected trigger: {}", hltpath); bool result = false; bool match_result = false; if (hltpath_match) { @@ -1082,7 +1101,7 @@ ROOT::RDF::RNode GetPrescaleValues(ROOT::RDF::RNode df, Logger::get("prescale") ->debug("... checking lumi {}, prescale {} ...", std::stoi(i_key), int(i_value)); - if (lumiblock > std::stoi(i_key)) { + if (lumiblock >= std::stoi(i_key)) { if (std::stoi(i_key) >= highest_lumi) { highest_lumi = std::stoi(i_key); prescale = i_value;