commit 87c674d48757da9e1d26abc698c93aacdebead56 Author: Gordon McCann Date: Tue May 24 13:14:21 2022 -0400 First commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..fac614d --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +*.so +*.o +*.pcm +*.cxx +SabreCal + +!.gitignore diff --git a/etc/ChannelMap_May2022_SABRE.txt b/etc/ChannelMap_May2022_SABRE.txt new file mode 100644 index 0000000..a999fa4 --- /dev/null +++ b/etc/ChannelMap_May2022_SABRE.txt @@ -0,0 +1,146 @@ +Format: global_channel detectorID_number detectorType_identifier detectorPart_identifier +NOTE: the focal plane ionchamber is given the UNIQUE detector id of 11. All other detector id ranges should be 0 to nDetectors-1. +0 4 SABREWEDGE 0 +1 4 SABREWEDGE 1 +2 4 SABREWEDGE 2 +3 4 SABREWEDGE 3 +4 4 SABREWEDGE 4 +5 4 SABREWEDGE 5 +6 4 SABREWEDGE 6 +7 4 SABREWEDGE 7 +8 -1 UNUSED 0 +9 -1 UNUSED 0 +10 -1 UNUSED 0 +11 -1 UNUSED 0 +12 -1 UNUSED 0 +13 -1 UNUSED 0 +14 -1 UNUSED 0 +15 -1 UNUSED 0 +16 2 SABREWEDGE 0 +17 2 SABREWEDGE 1 +18 2 SABREWEDGE 2 +19 2 SABREWEDGE 3 +20 2 SABREWEDGE 4 +21 2 SABREWEDGE 5 +22 2 SABREWEDGE 6 +23 2 SABREWEDGE 7 +24 3 SABREWEDGE 0 +25 3 SABREWEDGE 1 +26 3 SABREWEDGE 2 +27 3 SABREWEDGE 3 +28 3 SABREWEDGE 4 +29 3 SABREWEDGE 5 +30 3 SABREWEDGE 6 +31 3 SABREWEDGE 7 +32 1 SABREWEDGE 0 +33 1 SABREWEDGE 1 +34 1 SABREWEDGE 2 +35 1 SABREWEDGE 3 +36 1 SABREWEDGE 4 +37 1 SABREWEDGE 5 +38 1 SABREWEDGE 6 +39 1 SABREWEDGE 7 +40 0 SABREWEDGE 0 +41 0 SABREWEDGE 1 +42 0 SABREWEDGE 2 +43 0 SABREWEDGE 3 +44 0 SABREWEDGE 4 +45 0 SABREWEDGE 5 +46 0 SABREWEDGE 6 +47 0 SABREWEDGE 7 +48 4 SABRERING 0 +49 4 SABRERING 1 +50 4 SABRERING 2 +51 4 SABRERING 3 +52 4 SABRERING 4 +53 4 SABRERING 5 +54 4 SABRERING 6 +55 4 SABRERING 7 +56 4 SABRERING 8 +57 4 SABRERING 9 +58 4 SABRERING 10 +59 4 SABRERING 11 +60 4 SABRERING 12 +61 4 SABRERING 13 +62 4 SABRERING 14 +63 4 SABRERING 15 +64 3 SABRERING 0 +65 3 SABRERING 1 +66 3 SABRERING 2 +67 3 SABRERING 3 +68 3 SABRERING 4 +69 3 SABRERING 5 +70 3 SABRERING 6 +71 3 SABRERING 7 +72 3 SABRERING 8 +73 3 SABRERING 9 +74 3 SABRERING 10 +75 3 SABRERING 11 +76 3 SABRERING 12 +77 3 SABRERING 13 +78 3 SABRERING 14 +79 3 SABRERING 15 +80 2 SABRERING 0 +81 2 SABRERING 1 +82 2 SABRERING 2 +83 2 SABRERING 3 +84 2 SABRERING 4 +85 2 SABRERING 5 +86 2 SABRERING 6 +87 2 SABRERING 7 +88 2 SABRERING 8 +89 2 SABRERING 9 +90 2 SABRERING 10 +91 2 SABRERING 11 +92 2 SABRERING 12 +93 2 SABRERING 13 +94 2 SABRERING 14 +95 2 SABRERING 15 +96 1 SABRERING 0 +97 1 SABRERING 1 +98 1 SABRERING 2 +99 1 SABRERING 3 +100 1 SABRERING 4 +101 1 SABRERING 5 +102 1 SABRERING 6 +103 1 SABRERING 7 +104 1 SABRERING 8 +105 1 SABRERING 9 +106 1 SABRERING 10 +107 1 SABRERING 11 +108 1 SABRERING 12 +109 1 SABRERING 13 +110 1 SABRERING 14 +111 1 SABRERING 15 +112 0 SABRERING 0 +113 0 SABRERING 1 +114 0 SABRERING 2 +115 0 SABRERING 3 +116 0 SABRERING 4 +117 0 SABRERING 5 +118 0 SABRERING 6 +119 0 SABRERING 7 +120 0 SABRERING 8 +121 0 SABRERING 9 +122 0 SABRERING 10 +123 0 SABRERING 11 +124 0 SABRERING 12 +125 0 SABRERING 13 +126 0 SABRERING 14 +127 0 SABRERING 15 +128 11 FOCALPLANE SCINTRIGHT +129 11 FOCALPLANE SCINTLEFT +130 -1 UNUSED 0 +131 11 FOCALPLANE RF +132 -1 UNUSED 0 +133 -1 UNUSED 0 +134 -1 UNUSED 0 +135 11 FOCALPLANE CATHODE +136 11 FOCALPLANE DELAYFL +137 11 FOCALPLANE DELAYFR +138 11 FOCALPLANE DELAYBL +139 11 FOCALPLANE DELAYBR +140 -1 UNUSED 0 +141 11 FOCALPLANE ANODEFRONT +142 -1 UNUSED 0 +143 11 FOCALPLANE ANODEBACK diff --git a/premake5.lua b/premake5.lua new file mode 100644 index 0000000..7f2c372 --- /dev/null +++ b/premake5.lua @@ -0,0 +1,114 @@ +workspace "SabreCal" + architecture "x64" + configurations { + "Release", + "Debug" + } + +ROOTIncludeDir = "/usr/include/root/" +ROOTLibDir = "/usr/lib64/root/" + +project "CalDict" + kind "SharedLib" + language "C++" + cppdialect "c++11" + targetdir "./lib/" + objdir "./objs/" + + prebuildcommands { + "rootcint -f src/CalDict/cal_dict.cxx src/CalDict/DataStructs.h src/CalDict/LinkDef_CalDict.h", + "{COPY} src/CalDict/*.pcm ./lib/" + } + + postbuildcommands { + "{COPY} src/CalDict/DataStructs.h ./include/" + } + + files { + "src/CalDict/DataStructs.h", + "src/CalDict/*.cpp", + "src/CalDict/*.cxx" + } + + includedirs { + "./", + "src/CalDict", + } + + sysincludedirs { + ROOTIncludeDir + } + + libdirs { + ROOTLibDir + } + + links { + "Gui", "Core", "Imt", "RIO", "Net", "Hist", + "Graf", "Graf3d", "Gpad", "ROOTDataFrame", "ROOTVecOps", + "Tree", "TreePlayer", "Rint", "Postscript", "Matrix", + "Physics", "MathCore", "Thread", "MultiProc", "m", "dl" + } + + filter "system:macosx or linux" + linkoptions { + "-pthread", + "-rdynamic" + } + + filter "configurations:Debug" + symbols "On" + + filter "configurations:Release" + optimize "On" + +project "SabreCal" + kind "ConsoleApp" + language "C++" + cppdialect "c++11" + targetdir "./bin/" + objdir "./objs/" + + files { + "src/*.cpp", + "src/*.h", + "src/Detectors/*.cpp", + "src/Detectors/*.h", + "src/EnergyLoss/*.cpp", + "src/EnergyLoss/*.h", + "src/CalDict/*.h" + } + + includedirs { + "src/", + "src/CalDict", + "src/Detectors", + "src/EnergyLoss" + } + + sysincludedirs { + ROOTIncludeDir + } + + libdirs { + ROOTLibDir, + } + + links { + "CalDict", "Gui", "Core", "Imt", "RIO", "Net", "Hist", + "Graf", "Graf3d", "Gpad", "ROOTDataFrame", "ROOTVecOps", + "Tree", "TreePlayer", "Rint", "Postscript", "Matrix", + "Physics", "MathCore", "Thread", "MultiProc", "m", "dl" + } + + filter "system:macosx or linux" + linkoptions { + "-pthread", + "-rdynamic" + } + + filter "configurations:Debug" + symbols "On" + + filter "configurations:Release" + optimize "On" \ No newline at end of file diff --git a/scal2.sublime-project b/scal2.sublime-project new file mode 100644 index 0000000..24db303 --- /dev/null +++ b/scal2.sublime-project @@ -0,0 +1,8 @@ +{ + "folders": + [ + { + "path": "." + } + ] +} diff --git a/scal2.sublime-workspace b/scal2.sublime-workspace new file mode 100644 index 0000000..3abc28f --- /dev/null +++ b/scal2.sublime-workspace @@ -0,0 +1,769 @@ +{ + "auto_complete": + { + "selected_items": + [ + [ + "tar", + "targ_z" + ], + [ + "cin", + "cstdint" + ], + [ + "m_eve", + "m_eventInit" + ], + [ + "resi", + "resid_vec" + ], + [ + "massDec", + "massDecayFrag" + ], + [ + "d", + "decayBreak_vec" + ], + [ + "massD", + "massDecayBreak" + ], + [ + "par", + "parent_vec" + ], + [ + "GetSabre", + "GetSabre4VectorEloss" + ], + [ + "resize", + "resizeColumnsToContents" + ], + [ + "syb", + "Symbol" + ], + [ + "if", + "ifmain" + ], + [ + "QTab", + "QTableWidget" + ], + [ + "fi", + "fitCanvas" + ], + [ + "outpu", + "output" + ], + [ + "Cal", + "CalculateRhoUncertainty" + ], + [ + "KE_eject_at", + "KE_eject_at_det" + ], + [ + "KE", + "KE_eject_at_det" + ], + [ + "myla", + "mylar_eff_thickness" + ], + [ + "e", + "mylar_eff_thickness" + ], + [ + "myl", + "mylar_s" + ], + [ + "MYL", + "MYLAR_THICKNESS" + ], + [ + "mylar", + "mylar_density" + ], + [ + "uex", + "uexInput" + ], + [ + "uxsy", + "uxsysInput" + ], + [ + "peak", + "peakKey" + ], + [ + "Sen", + "SendCalibrationPeak" + ], + [ + "upda", + "update_calibration" + ], + [ + "cali", + "calib_peaks" + ], + [ + "pe", + "peakName" + ], + [ + "Upd", + "UpdateReaction" + ], + [ + "poly", + "poly_order" + ], + [ + "y_", + "y_errors" + ], + [ + "x_", + "x_errors" + ], + [ + "Qu", + "QuadraticFit" + ], + [ + "x", + "x_data" + ], + [ + "y", + "y_errors" + ], + [ + "M", + "MAX_ITERS" + ], + [ + "chi", + "chi_lastmain" + ], + [ + "chisq", + "chisq" + ], + [ + "func", + "func_vals" + ], + [ + "st", + "student_resids" + ], + [ + "s", + "student_resids" + ], + [ + "sq", + "sq_diff" + ], + [ + "ures", + "uresid_array" + ], + [ + "resid", + "residualTable" + ], + [ + "ure", + "uresid_array" + ], + [ + "output", + "output" + ], + [ + "input", + "inputGroupBox" + ], + [ + "key", + "key" + ], + [ + "out", + "output_peaks" + ], + [ + "ft", + "fitTypeBox" + ], + [ + "uxstat", + "uxstat" + ], + [ + "calib", + "calib_peaks" + ], + [ + "reaction", + "reactionTable" + ], + [ + "l", + "layered_target" + ], + [ + "QTable", + "QTableWidgetItem" + ], + [ + "tabl", + "tableTab" + ], + [ + "ftab", + "ftableGroup" + ], + [ + "fitO", + "fitOptionLayout" + ], + [ + "fitOpti", + "fitOptionGroup" + ], + [ + "QD", + "QDoubleSpinBox" + ], + [ + "na", + "nameLabel" + ], + [ + "layer1", + "layer1GroupBox" + ], + [ + "layer1com", + "layer1ComponentsBox" + ], + [ + "layer", + "layer1compLayout" + ], + [ + "layer1comp", + "layer1compLayout" + ], + [ + "targe", + "targetNameBox" + ], + [ + "fwh", + "fwhm_x" + ], + [ + "fw", + "fwhm_Ex" + ], + [ + "Evalu", + "EvaluateFunction" + ], + [ + "Eva", + "EvaluateFunction" + ], + [ + "fit", + "fit_name" + ], + [ + "ux", + "ux_sys" + ], + [ + "cal", + "calib_peaks" + ], + [ + "ca", + "calib_peaks" + ], + [ + "Cu", + "CubicFunction" + ], + [ + "Line", + "LinearFunction" + ], + [ + "uf", + "ufwhm_x" + ], + [ + "Spanc", + "SpancFit" + ], + [ + "lin", + "linear_func" + ], + [ + "p_", + "p_project" + ], + [ + "p_ej", + "p_eject_at_rxn" + ], + [ + "p", + "p_project" + ], + [ + "BK", + "BKE_atRxn" + ], + [ + "GetE", + "GetEnergyLoss" + ], + [ + "B", + "BKE" + ], + [ + "K", + "KE_eject_at_det" + ], + [ + "KE_ej", + "KE_eject_at_det" + ], + [ + "Q", + "QBRHO2P" + ], + [ + "GetEje", + "GetEjectileKineticEnergyAtDet" + ], + [ + "GetRever", + "GetReverseEnergyLossTotal" + ], + [ + "GetEnergy", + "GetEnergyLossHalf" + ], + [ + "targetA", + "targetA" + ], + [ + "Hyd", + "HydrogenCoeff" + ], + [ + "Hy", + "HydrogenCoeff" + ], + [ + "conv", + "conversion_factor" + ], + [ + "i", + "i" + ], + [ + "xerr", + "xerr_array" + ], + [ + "energy", + "energyFlag" + ], + [ + "inp", + "inputNumberLayout" + ], + [ + "Levl", + "LevelDialog" + ], + [ + "re", + "reactionList" + ], + [ + "__", + "__init__" + ], + [ + "QDia", + "QDialog" + ], + [ + "react", + "reaction_params" + ], + [ + "reac", + "reaction_params" + ], + [ + "Reac", + "ReactionDialog" + ], + [ + "Re", + "ReadConfig" + ], + [ + "QDial", + "QDialogButtonBox" + ], + [ + "beam", + "beamKE" + ], + [ + "GetEJe", + "GetEjectileKineticEnergy" + ], + [ + "rho", + "rhoMin" + ] + ] + }, + "buffers": + [ + ], + "build_system": "Packages/Python/Python.sublime-build", + "build_system_choices": + [ + [ + [ + [ + "Packages/Makefile/Make.sublime-build", + "" + ], + [ + "Packages/Makefile/Make.sublime-build", + "Clean" + ] + ], + [ + "Packages/Makefile/Make.sublime-build", + "" + ] + ], + [ + [ + [ + "Packages/Python/Python.sublime-build", + "" + ], + [ + "Packages/Python/Python.sublime-build", + "Syntax Check" + ] + ], + [ + "Packages/Python/Python.sublime-build", + "Syntax Check" + ] + ] + ], + "build_varint": "", + "command_palette": + { + "height": 0.0, + "last_filter": "", + "selected_items": + [ + ], + "width": 0.0 + }, + "console": + { + "height": 200.0, + "history": + [ + ] + }, + "distraction_free": + { + "menu_visible": true, + "show_minimap": false, + "show_open_files": false, + "show_tabs": false, + "side_bar_visible": false, + "status_bar_visible": false + }, + "expanded_folders": + [ + "/home/gwm17/SabreCal2" + ], + "file_history": + [ + "/home/gwm17/SabreRecon2/premake5.lua", + "/home/gwm17/SabreRecon2/input.txt", + "/home/gwm17/SabreRecon2/src/CalDict/DataStructs.h", + "/home/gwm17/SabreRecon2/src/CutHandler.h", + "/home/gwm17/SabreRecon2/src/CutHandler.cpp", + "/home/gwm17/SabreRecon2/src/Reconstructor.h", + "/home/gwm17/SabreRecon2/src/RandomGenerator.cpp", + "/home/gwm17/SabreRecon2/src/RandomGenerator.h", + "/home/gwm17/SabreRecon2/src/Detectors/SabreDetector.cpp", + "/home/gwm17/SabreRecon/input.txt", + "/home/gwm17/SabreRecon2/src/Histogrammer.cpp", + "/home/gwm17/SabreRecon2/src/Histogrammer.h", + "/home/gwm17/SabreRecon2/src/Detectors/FocalPlaneDetector.cpp", + "/home/gwm17/SabreRecon2/src/Reconstructor.cpp", + "/home/gwm17/SabreRecon2/src/Detectors/FocalPlaneDetector.h", + "/home/gwm17/SabreRecon2/src/EnergyLoss/Target.h", + "/home/gwm17/SPS_SABRE_EventBuilder/premake5.lua", + "/home/gwm17/SabreRecon2/src/EnergyLoss/Target.cpp", + "/home/gwm17/SabreRecon2/src/Detectors/SabreDetector.h", + "/home/gwm17/SabreRecon2/src/CalDict/LinkDef_CalDict.h", + "/home/gwm17/SabreRecon2/src/CalDict/DataStructs.cpp", + "/home/gwm17/SabreRecon2/src/DataStructs.h", + "/home/gwm17/SabreRecon2/src/main.cpp", + "/home/gwm17/SabreRecon2/src/MassLookup.h", + "/home/gwm17/SabreRecon2/src/MassLookup.cpp", + "/home/gwm17/SabreRecon2/src/EnergyLoss/EnergyLoss.h", + "/home/gwm17/SabreRecon2/src/EnergyLoss/EnergyLoss.cpp", + "/home/gwm17/SabreRecon2/src/EnergyLoss/EnergyLossConstants.h", + "/home/gwm17/NucKage/src/RootPlotter.cpp", + "/home/gwm17/NucKage/src/RootPlotter.h", + "/home/gwm17/python_scripts/NavServer.py", + "/home/gwm17/spspy/fpcheck/NucData.py", + "/home/gwm17/spspy/fpcheck/Reaction.py", + "/home/gwm17/spspy/fpcheck/FPCheckGUI.py", + "/home/gwm17/spspy/spanc/SpancGUI.py", + "/home/gwm17/spspy/spsplot/SPSPlotGUI.py", + "/home/gwm17/spspy/spanc/Spanc.py", + "/home/gwm17/spspy/spanc/Reaction.py", + "/home/gwm17/spspy/spsplot/NucData.py", + "/home/gwm17/spspy/spanc/IngoFit.py", + "/home/gwm17/spspy/spanc/Fitter.py", + "/home/gwm17/spspy/README.md", + "/home/gwm17/spspy/.gitignore", + "/home/gwm17/spspy/spsplot/NuclearRxn.py", + "/home/gwm17/spspy/spsplot/SPSPlot.py", + "/home/gwm17/spspy/test_config.txt", + "/home/gwm17/spspy/spanc/LayeredTarget.py", + "/home/gwm17/spspy/spanc/EnergyLoss.py", + "/home/gwm17/Spanc_Redux/src/Reaction.cpp", + "/home/gwm17/Spanc_Redux/src/IngoFit.cpp", + "/home/gwm17/spspy/bin/spsplot", + "/home/gwm17/spspy/bin/spanc", + "/home/gwm17/Spanc_Redux/src/SpancRedux.cpp", + "/home/gwm17/spspy/spanc/EnergyLossData.py", + "/home/gwm17/Spanc_Redux/src/EnergyLoss.cpp", + "/home/gwm17/Spanc_Redux/include/SpancRedux.h", + "/home/gwm17/Spanc_Redux/src/TargetCreationFrame.cpp", + "/home/gwm17/Spanc_Redux/include/Reaction.h", + "/home/gwm17/Kinematics/src/LayeredTarget.cpp", + "/home/gwm17/Kinematics/src/Target.cpp", + "/home/gwm17/Kinematics/include/Target.h", + "/home/gwm17/Kinematics/include/LayeredTarget.h", + "/home/gwm17/Spanc_Redux/src/LayeredTarget.cpp", + "/home/gwm17/Spanc_Redux/include/LayeredTarget.h", + "/home/gwm17/Spanc_Redux/src/Target.cpp", + "/home/gwm17/Spanc_Redux/include/Target.h", + "/home/gwm17/Spanc_Redux/include/EnergyLoss.h", + "/home/gwm17/Spanc_Redux/tests/unittests.cpp", + "/home/gwm17/spspy/spanc/NucData.py", + "/home/gwm17/GWM_EventBuilder/etc/ChannelMap_March2020_newFormat_092020.txt", + "/home/gwm17/Spanc_Redux/include/Eloss_Tables.h", + "/home/gwm17/Spanc_Redux/include/IngoFit.h", + "/home/gwm17/spspy/SPSPlotGUI.py", + "/home/gwm17/spspy/SPSPlot.py", + "/home/gwm17/spspy/NuclearRxn.py", + "/home/gwm17/spspy/NucData.py", + "/home/gwm17/spspy/etc/mass.txt", + "/home/gwm17/Kinematics/src/Reaction.cpp", + "/home/gwm17/WiggleKiller/src/WiggleKiller.cpp" + ], + "find": + { + "height": 70.0 + }, + "find_in_files": + { + "height": 0.0, + "where_history": + [ + ] + }, + "find_state": + { + "case_sensitive": false, + "find_history": + [ + "Nucleus", + "setPrecision", + "layer1GroupBox", + "targetGroup", + "addLayout", + "H_RESTMASS", + "comp_denom", + "}", + "{", + "/*", + "print", + "energySwitch" + ], + "highlight": true, + "in_selection": false, + "preserve_case": false, + "regex": false, + "replace_history": + [ + "setDecimals", + "setLayout", + "]", + "[" + ], + "reverse": false, + "scrollbar_highlights": true, + "show_context": true, + "use_buffer2": true, + "use_gitignore": true, + "whole_word": false, + "wrap": true + }, + "groups": + [ + { + "sheets": + [ + ] + } + ], + "incremental_find": + { + "height": 29.0 + }, + "input": + { + "height": 67.0 + }, + "layout": + { + "cells": + [ + [ + 0, + 0, + 1, + 1 + ] + ], + "cols": + [ + 0.0, + 1.0 + ], + "rows": + [ + 0.0, + 1.0 + ] + }, + "menu_visible": true, + "output.SublimeLinter": + { + "height": 138.0 + }, + "output.exec": + { + "height": 126.0 + }, + "output.find_results": + { + "height": 0.0 + }, + "output.mdpopups": + { + "height": 0.0 + }, + "output.unsaved_changes": + { + "height": 126.0 + }, + "pinned_build_system": "", + "project": "scal2.sublime-project", + "replace": + { + "height": 114.0 + }, + "save_all_on_build": true, + "select_file": + { + "height": 0.0, + "last_filter": "", + "selected_items": + [ + ], + "width": 0.0 + }, + "select_project": + { + "height": 500.0, + "last_filter": "", + "selected_items": + [ + [ + "", + "~/SPS_SABRE_EventBuilder/spsevb.sublime-project" + ] + ], + "width": 380.0 + }, + "select_symbol": + { + "height": 0.0, + "last_filter": "", + "selected_items": + [ + ], + "width": 0.0 + }, + "selected_group": 0, + "settings": + { + }, + "show_minimap": true, + "show_open_files": false, + "show_tabs": true, + "side_bar_visible": true, + "side_bar_width": 237.0, + "status_bar_visible": true, + "template_settings": + { + } +} diff --git a/src/CalDict/DataStructs.cpp b/src/CalDict/DataStructs.cpp new file mode 100644 index 0000000..116c55a --- /dev/null +++ b/src/CalDict/DataStructs.cpp @@ -0,0 +1,3 @@ +#include "DataStructs.h" + +bool EnforceDictionaryLinked() { return true; } \ No newline at end of file diff --git a/src/CalDict/DataStructs.h b/src/CalDict/DataStructs.h new file mode 100644 index 0000000..9d00ad6 --- /dev/null +++ b/src/CalDict/DataStructs.h @@ -0,0 +1,90 @@ +#ifndef DATA_STRUCTS_H +#define DATA_STRUCTS_H + +#include + +struct DPPChannel +{ + double Timestamp; + int Channel, Board, Energy, EnergyShort; + int Flags; +}; + +struct DetectorHit +{ + double Long=-1, Short=-1, Time=-1; + int Ch=-1; +}; + +struct SabreDetector +{ + std::vector rings; + std::vector wedges; +}; + +struct FPDetector +{ + std::vector delayFL, delayFR, delayBL, delayBR; + std::vector anodeF, anodeB, scintL, scintR, cathode; + std::vector monitor; +}; + +struct CoincEvent +{ + FPDetector focalPlane; + SabreDetector sabreArray[5]; //index = ChannelMap Id# -1 +}; + +struct ProcessedEvent +{ + double fp1_tdiff = -1e6, fp2_tdiff = -1e6, fp1_tsum = -1, fp2_tsum = -1, + fp1_tcheck = -1, fp2_tcheck = -1; + double fp1_y=-1, fp2_y=-1; + double anodeFront = -1, anodeBack = -1, scintRight = -1, scintLeft = -1; + double scintRightShort = -1, scintLeftShort = -1; + double cathode = -1; + double xavg = -1e6, x1 = -1e6, x2 = -1e6; + double theta = -1e6; + double sabreRingE[5] = {-1,-1,-1,-1,-1}, sabreWedgeE[5] = {-1,-1,-1,-1,-1}; + double sabreRingChannel[5] = {-1,-1,-1,-1,-1}, sabreWedgeChannel[5] = {-1,-1,-1,-1,-1}; + double sabreRingTime[5] = {-1,-1,-1,-1,-1}, sabreWedgeTime[5] = {-1,-1,-1,-1,-1}; + + double delayFrontRightE = -1, delayFrontLeftE = -1; + double delayBackRightE = -1, delayBackLeftE = -1; + double delayFrontRightShort = -1, delayFrontLeftShort = -1; + double delayBackRightShort = -1, delayBackLeftShort = -1; + double anodeFrontTime = -1, anodeBackTime = -1; + double scintRightTime = -1, scintLeftTime = -1; + double delayFrontMaxTime = -1, delayBackMaxTime = -1; + double delayFrontLeftTime = -1, delayFrontRightTime = -1; + double delayBackLeftTime = -1, delayBackRightTime = -1; + double cathodeTime = -1; + + double monitorE = -1, monitorShort = -1; + double monitorTime = -1; + + + SabreDetector sabreArray[5]; //index = ChannelMap Id# -1 +}; + +struct SabrePair +{ + int ringch, wedgech; //global + int detID; + int local_ring, local_wedge; //local (obv.) + double ringE, wedgeE; + double ringT, wedgeT; +}; + +struct CalEvent +{ + double xavg = -1e6, x1 = -1e6, x2 = -1e6; + double theta = -1, cathodeE = -1, scintE = -1; + double anodeFrontE = -1, anodeBackE = -1; + double scintT = -1; + std::vector sabre; +}; + +bool EnforceDictionaryLinked(); + +#endif \ No newline at end of file diff --git a/src/CalDict/LinkDef_CalDict.h b/src/CalDict/LinkDef_CalDict.h new file mode 100644 index 0000000..f3bc2a8 --- /dev/null +++ b/src/CalDict/LinkDef_CalDict.h @@ -0,0 +1,13 @@ +#ifdef __ROOTCLING__ + +#pragma link C++ struct DPPChannel+; +#pragma link C++ struct DetectorHit+; +#pragma link C++ class std::vector+; +#pragma link C++ struct SabreDetector+; +#pragma link C++ struct FPDetector+; +#pragma link C++ struct CoincEvent+; +#pragma link C++ struct ProcessedEvent+; +#pragma link C++ struct SabrePair+; +#pragma link C++ struct CalEvent+; + +#endif \ No newline at end of file diff --git a/src/CalibrationStructs.h b/src/CalibrationStructs.h new file mode 100644 index 0000000..ee48ae6 --- /dev/null +++ b/src/CalibrationStructs.h @@ -0,0 +1,24 @@ +#ifndef CALIBRATION_STRUCTS_H +#define CALIBRATION_STRUCTS_H + +#include +#include + +namespace SabreCal { + + struct Parameters + { + double slope = 0; + double offset = 0; + }; + + struct GraphData + { + std::vector x; + std::vector y; + std::string name = ""; + std::string title = ""; + }; +} + +#endif \ No newline at end of file diff --git a/src/ChannelMap.cpp b/src/ChannelMap.cpp new file mode 100644 index 0000000..90ea8a4 --- /dev/null +++ b/src/ChannelMap.cpp @@ -0,0 +1,83 @@ +#include "ChannelMap.h" +#include + +namespace SabreCal { + + ChannelMap::ChannelMap() : + m_isValid(false) + { + } + + ChannelMap::ChannelMap(const std::string& mapfile) : + m_isValid(false) + { + Init(mapfile); + } + + void ChannelMap::Init(const std::string& mapfile) + { + m_isValid = false; + + std::ifstream input(mapfile); + std::string junk; + std::string rev_key; + Channel this_channel; + int gchan; + + if(!input.is_open()) + return; + + std::getline(input, junk); + std::getline(input, junk); + + while(input>>gchan) + { + input>>this_channel.detID>>junk>>this_channel.localChannel; + rev_key = std::to_string(this_channel.detID); + if(junk == "SABRERING") + { + this_channel.isRing = true; + this_channel.isWedge = false; + rev_key += "ring"; + } + else if (junk == "SABREWEDGE") + { + this_channel.isRing = false; + this_channel.isWedge = true; + rev_key += "wedge"; + } + else + continue; + m_map[gchan] = this_channel; + rev_key += std::to_string(this_channel.localChannel); + m_revmap[rev_key] = gchan; + } + + m_isValid = true; + } + + const Channel& ChannelMap::GetChannel(int gchan) const + { + auto iter = m_map.find(gchan); + if(iter != m_map.end()) + return iter->second; + else + return m_dummy; + } + + int ChannelMap::GetGlobalChannel(const Channel& channel) const + { + std::string key = std::to_string(channel.detID); + if(channel.isRing) + key += "ring"; + else + key += "wedge"; + key += std::to_string(channel.localChannel); + + auto iter = m_revmap.find(key); + if(iter != m_revmap.end()) + return iter->second; + else + return -1; + } +} \ No newline at end of file diff --git a/src/ChannelMap.h b/src/ChannelMap.h new file mode 100644 index 0000000..05e72db --- /dev/null +++ b/src/ChannelMap.h @@ -0,0 +1,42 @@ +#ifndef CHANNEL_MAP_H +#define CHANNEL_MAP_H + +#include +#include + +namespace SabreCal { + + struct Channel + { + Channel() {} + Channel(int id, bool ring, bool wedge, int local) : + detID(id), isRing(ring), isWedge(wedge), localChannel(local) + {} + int detID = -1; + bool isRing = false; + bool isWedge = false; + int localChannel = -1; + }; + + class ChannelMap + { + public: + ChannelMap(); + ChannelMap(const std::string& mapfile); + ~ChannelMap(); + + void Init(const std::string& mapfile); + const Channel& GetChannel(int gchan) const; + int GetGlobalChannel(const Channel& channel) const; + + inline const bool IsValid() const { return m_isValid; } + + private: + bool m_isValid; + std::unordered_map m_map; + std::unordered_map m_revmap; //ReverseMap takes string detID + ring/wedge + localChannel to global channel + Channel m_dummy; //for invalid results + }; +} + +#endif \ No newline at end of file diff --git a/src/GainMatcher.cpp b/src/GainMatcher.cpp new file mode 100644 index 0000000..8e1bed0 --- /dev/null +++ b/src/GainMatcher.cpp @@ -0,0 +1,182 @@ +#include "GainMatcher.h" +#include "CalDict/DataStructs.h" +#include "TFile.h" +#include "TTree.h" +#include "TF1.h" +#include "TFitResult.h" + +#include +#include + +namespace SabreCal { + + GainMatcher::GainMatcher(const std::string& mapfile, int ring_to_match, int wedge_to_match) : + m_map(mapfile), m_ringToFit(ring_to_match), m_wedgeToFit(wedge_to_match) + { + } + + GainMatcher::~GainMatcher() {} + + void GainMatcher::Run(const std::string& datafile, const std::string& outputfile, const std::string& graphfile) + { + if(!m_map.IsValid()) + { + std::cerr<<"ERR -- GainMatcher::Run() ChannelMap is invalid."<IsOpen()) + { + std::cerr<<"ERR -- GainMatcher::Run() data file is invalid."<Get("SPSTree"); + tree->SetBranchAddress("event", &eventPtr); + + uint64_t nentries = tree->GetEntries(); + uint64_t count=0, flushes=0; + float flush_percent = 0.1f; + uint64_t flush_val = flush_percent*nentries; + + //start data loop + for(uint64_t i=0; iGetEntry(i); + count++; + if(count == flush_val) + { + count = 0; + flushes++; + std::cout<<"\rPercent of data processed: "<sabreArray[j]; + for(auto& ring : this_detector.rings) + { + auto& ringChannel = m_map.GetChannel(ring.Ch); + for(auto& wedge : this_detector.wedges) + { + auto& wedgeChannel = m_map.GetChannel(wedge.Ch); + + if(ringChannel.localChannel == m_ringToFit && ring.Long > 200.0 && wedge.Long > 200.0) + { + m_data[wedge.Ch].x.push_back(wedge.Long); + m_data[wedge.Ch].y.push_back(ring.Long); + if(m_data[wedge.Ch].name == "") + { + m_data[wedge.Ch].name = "channel_"+std::to_string(wedge.Ch); + m_data[wedge.Ch].title = m_data[wedge.Ch].name + ";" + m_data[wedge.Ch].name + ";channel_"+std::to_string(ring.Ch); + } + } + if(wedgeChannel.localChannel == m_wedgeToFit && ring.Long > 200.0 && wedge.Long > 200.0) + { + m_data[ring.Ch].x.push_back(ring.Long); + m_data[ring.Ch].y.push_back(wedge.Long); + if(m_data[ring.Ch].name == "") + { + m_data[ring.Ch].name = "channel_"+std::to_string(ring.Ch); + m_data[ring.Ch].title = m_data[ring.Ch].name + ";" + m_data[ring.Ch].name + ";channel_"+std::to_string(wedge.Ch); + } + } + } + } + } + } + //data loop complete + + std::cout<Close(); + } + + void GainMatcher::DoMatching(const std::string& graphfile) + { + std::vector graph_array; + graph_array.resize(m_totalChannels); + + //Make all of the wedge graphs, and get the gain match parameters + for(size_t i=0; iSetName(m_data[i].name.c_str()); + graph_array[i]->SetTitle(m_data[i].title.c_str()); + auto result = graph_array[i]->Fit("pol1","R|ROB|Q+"); + m_params[i].slope = result->Parameter(1); + m_params[i].offset = result->Parameter(0); + } + else + graph_array[i] = nullptr; + } + + //Now do rings, after applying parameters from wedges + for(size_t i=m_firstRing; iSetName(m_data[i].name.c_str()); + graph_array[i]->SetTitle(m_data[i].title.c_str()); + auto result = graph_array[i]->Fit("pol1","R|ROB|Q+"); + m_params[i].slope = result->Parameter(1); + m_params[i].offset = result->Parameter(0); + } + else + graph_array[i] = nullptr; + } + + if(graphfile != "") + WriteGraphs(graph_array, graphfile); + + for(size_t i=0; i& graphs, const std::string& graphfile) + { + TFile* graphout = TFile::Open(graphfile.c_str(), "RECREATE"); + if(!graphout->IsOpen()) + return; + + for(auto graph : graphs) + { + if(graph) + graph->Write(); + } + + graphout->Close(); + } + + void GainMatcher::WriteParameters(const std::string& outputfile) + { + std::ofstream output(outputfile); + if(!output.is_open()) + { + std::cerr<<"ERR -- Unable to write results at GainMatcher::WriteParameters() with filename "< +#include +#include "CalibrationStructs.h" +#include "ChannelMap.h" +#include "TGraph.h" + +namespace SabreCal { + + class GainMatcher + { + public: + GainMatcher(const std::string& mapfile, int ring_to_match, int wedge_to_match); + ~GainMatcher(); + + void Run(const std::string& datafile, const std::string& outputfile, const std::string& graphfile=""); + + private: + void DoMatching(const std::string& graphfile); + void WriteGraphs(const std::vector& graphs, const std::string& graphfile); + void WriteParameters(const std::string& outputfile); + + ChannelMap m_map; + + static constexpr int m_totalChannels = 128; + static constexpr int m_firstRing = 48; //Wedges are 0-47, rings 48-127 + std::array m_data; + std::array m_params; + + int m_ringToFit; + int m_wedgeToFit; + + }; +} + +#endif \ No newline at end of file