From edffcc0a09fb11217a727287e44de296dcec195d Mon Sep 17 00:00:00 2001 From: Wojciech Krupa <wojciech.krupa@cern.ch> Date: Tue, 1 Oct 2024 14:33:22 +0200 Subject: [PATCH 1/4] Adding PulshShape algorithm, other small improvements --- UTEmuAlgorithms/CMakeLists.txt | 3 +- .../include/UTEmu/UTEmuPedestalCalculator.h | 1 + .../include/UTEmu/UTEmuPulseShape.h | 61 +++++ .../src/UTEmuPedestalCalculator.cpp | 35 ++- ...PedestalCalculatorDataMonitorAlgorithm.cpp | 16 +- UTEmuAlgorithms/src/UTEmuPulseShape.cpp | 61 +++++ UTEmuAlgorithms/src/modules.cpp | 2 + .../options/UT_Emulation_NoiseComponents.py | 8 +- ...lMonitoring.py => UT_MeanADCMonitoring.py} | 9 +- .../options/UT_PedestalCalculation.py | 4 +- .../options/UT_PedestalSubtraction.py | 2 +- UTEmuOptions/options/UT_PulseShape.py | 148 ++++++++++ UTEmuOptions/options/UT_RawADC_Run.py | 8 +- UTScripts/BadChannels/UTBadChannels.py | 258 ++++++++++++------ UTScripts/BadChannels/UTBadChannels_Wojtek.py | 241 ---------------- UTScripts/NoisyChannels/UTNoisyChannels.py | 47 ++++ .../overlay_center_natural_asic_UTaU.root | Bin 23881 -> 24586 bytes .../overlay_center_natural_asic_UTaX.root | Bin 24200 -> 24394 bytes .../overlay_center_natural_asic_UTbV.root | Bin 20376 -> 20377 bytes .../overlay_center_natural_asic_UTbX.root | Bin 18959 -> 18782 bytes UTScripts/References/overlay_tell40A0.root | Bin 70823 -> 71198 bytes UTScripts/References/overlay_tell40A1.root | Bin 73633 -> 72929 bytes UTScripts/References/overlay_tell40C0.root | Bin 111196 -> 68357 bytes UTScripts/References/overlay_tell40C1.root | Bin 71513 -> 71184 bytes .../Vetra_Plotter_EmuNoiseComponents.cpp | 43 +-- ...edestals.cpp => Vetra_Plotter_MeanADC.cpp} | 46 ++-- UTScripts/Vetra_Plotter_PedSub.cpp | 4 +- UTScripts/Vetra_Plotter_PedestalRun.cpp | 2 +- UTScripts/Vetra_Plotter_RawADC.cpp | 4 +- 29 files changed, 596 insertions(+), 407 deletions(-) create mode 100644 UTEmuAlgorithms/include/UTEmu/UTEmuPulseShape.h create mode 100644 UTEmuAlgorithms/src/UTEmuPulseShape.cpp rename UTEmuOptions/options/{UT_PedestalMonitoring.py => UT_MeanADCMonitoring.py} (96%) create mode 100644 UTEmuOptions/options/UT_PulseShape.py delete mode 100644 UTScripts/BadChannels/UTBadChannels_Wojtek.py create mode 100644 UTScripts/NoisyChannels/UTNoisyChannels.py rename UTScripts/{Vetra_Plotter_Pedestals.cpp => Vetra_Plotter_MeanADC.cpp} (90%) diff --git a/UTEmuAlgorithms/CMakeLists.txt b/UTEmuAlgorithms/CMakeLists.txt index 12c3ac17..b0fee69a 100644 --- a/UTEmuAlgorithms/CMakeLists.txt +++ b/UTEmuAlgorithms/CMakeLists.txt @@ -21,7 +21,8 @@ gaudi_add_library(UTEmuLib src/UTEmuPedestalSubtractor.cpp src/UTEmuPedestalCalculatorDataMonitorAlgorithm.cpp src/UTEmuPedestalSubtractorDataMonitorAlgorithm.cpp - src/UTEmuCommonModeSubtractor.cpp + src/UTEmuCommonModeSubtractor.cpp + src/UTEmuPulseShape.cpp LINK PUBLIC Gaudi::GaudiKernel diff --git a/UTEmuAlgorithms/include/UTEmu/UTEmuPedestalCalculator.h b/UTEmuAlgorithms/include/UTEmu/UTEmuPedestalCalculator.h index 924a9b47..09566ce3 100644 --- a/UTEmuAlgorithms/include/UTEmu/UTEmuPedestalCalculator.h +++ b/UTEmuAlgorithms/include/UTEmu/UTEmuPedestalCalculator.h @@ -61,6 +61,7 @@ namespace UTEmu { void calculatePedestals(); void findBadChannels(); void saveThresholdsToCsv(); + void saveExtraToCsv(); // properties Gaudi::Property<std::string> m_runNumber{ this, "RunNumber", "00000000" }; diff --git a/UTEmuAlgorithms/include/UTEmu/UTEmuPulseShape.h b/UTEmuAlgorithms/include/UTEmu/UTEmuPulseShape.h new file mode 100644 index 00000000..0dcc3527 --- /dev/null +++ b/UTEmuAlgorithms/include/UTEmu/UTEmuPulseShape.h @@ -0,0 +1,61 @@ +/*****************************************************************************\ +* (c) Copyright 2000-2023 CERN for the benefit of the LHCb Collaboration * +* * +* This software is distributed under the terms of the GNU General Public * +* Licence version 3 (GPL Version 3), copied verbatim in the file "COPYING". * +* * +* In applying this licence, CERN does not waive the privileges and immunities * +* granted to it by virtue of its status as an Intergovernmental Organization * +* or submit itself to any jurisdiction. * +\*****************************************************************************/ + +/* + * UTEmuPulseShape.h + * + * Created on: August, 2023 + * Author: Wojciech Krupa (wokrupa@cern.ch) + */ + +#pragma once + +#include "Event/ODIN.h" +#include "Event/UTDigit.h" +#include "GaudiAlg/GaudiTupleAlg.h" +#include "GaudiKernel/IEventProcessor.h" +#include "Kernel/IEventCounter.h" +#include "Kernel/IUTReadoutTool.h" +#include "Kernel/UTDAQID.h" +#include "LHCbAlgs/Consumer.h" +#include "UTDAQ/UTCoordinatesMap.h" +#include "UTDet/DeUTDetector.h" +#include "UTEmu/UTEmuVetraHelper.h" + +using namespace LHCb; + +namespace UTEmu { + + class PulseShape + : public LHCb::Algorithm::Consumer<void( UTDigits const&, const LHCb::ODIN&, DeUTDetector const& ), + LHCb::DetDesc::usesBaseAndConditions<GaudiHistoAlg, DeUTDetector>> { + public: + /// constructer + PulseShape( const std::string& name, ISvcLocator* svcloc ) + : Consumer{ name, + svcloc, + { { "DigitLocation", UTEmu::UTDigitLocation::UTDigits }, + { "ODINLocation", LHCb::ODINLocation::Default }, + { "UTLocation", DeUTDetLocation::location() } } } {} + + StatusCode initialize() override; + void operator()( const UTDigits&, const LHCb::ODIN&, DeUTDetector const& ) const override; + + mutable UTCoordinatesMap UTMap; + + mutable std::map<std::string, Gaudi::Accumulators::Histogram<2>> m_2d_ch; + + Gaudi::Property<unsigned int> m_layer{ this, "Layer", 0 }; + + private: + void fillHistograms( const LHCb::UTDigit*, DeUTDetector const&, const LHCb::ODIN& ) const; + }; +} // namespace UTEmu \ No newline at end of file diff --git a/UTEmuAlgorithms/src/UTEmuPedestalCalculator.cpp b/UTEmuAlgorithms/src/UTEmuPedestalCalculator.cpp index c4ef9fe5..738ba33f 100644 --- a/UTEmuAlgorithms/src/UTEmuPedestalCalculator.cpp +++ b/UTEmuAlgorithms/src/UTEmuPedestalCalculator.cpp @@ -129,14 +129,37 @@ void PedestalCalculator::saveThresholdsToCsv() { fout.open( input_path.c_str(), std::ios::out | std::ios::trunc ); for ( const auto& sigmaNoise : SigmaNoiseAv ) { - float zs_th = std::ceil( 5 * sigmaNoise.second.mean() ); - if ( zs_th == 3 ) zs_th = 4; // this is very temporary + float zs_th = std::ceil( 5 * sigmaNoise.second.mean() ) - 1; // Tomasz optimistic version fout << sigmaNoise.first << ", " << zs_th << "\n"; } - info() << "Saving zs_threshold file" << endmsg; }; +void PedestalCalculator::saveExtraToCsv() { + + std::fstream fout; + + std::string input_path = std::string( UTEMU_PATH ) + "/extra_" + m_runNumber + ".csv"; + fout.open( input_path.c_str(), std::ios::out | std::ios::trunc ); + + for ( const auto& pedestal : Pedestal ) { + auto bad = 0; + Detector::UT::ChannelID channelID( pedestal.first ); + auto tuple = + UTMap.getTuple( channelID.module(), channelID.face(), channelID.stave(), channelID.side(), channelID.sector() ); + + std::string module_name = std::get<4>( tuple ); + + std::string current_asic_name = UTEmu::UT_layers[channelID.layer()] + "_" + module_name + "_" + + std::to_string( int( channelID.strip() / UTEmu::UTNumbers::nStripsPerASIC ) ); + + float zs_th = std::ceil( 5 * SigmaNoiseAv[current_asic_name].mean() ) - 1; // Tomasz optimistic version + if ( pedestal.second > zs_th ) { bad = 1; } + if ( zs_th > 0 ) fout << current_asic_name<<" "<< channelID.strip()%128<<" "<<pedestal.second << ", " << zs_th << ", " << bad << "\n"; + } + info() << "Saving extra file" << endmsg; +}; + void PedestalCalculator::savePedestalsToCsv() { // file pointer @@ -157,7 +180,9 @@ void PedestalCalculator::saveSigmaNoiseToCsv() { std::string input_path = std::string( UTEMU_PATH ) + "/sigmaNoise_" + m_runNumber + ".csv"; fout.open( input_path.c_str(), std::ios::out | std::ios::trunc ); - for ( const auto& sigmaNoise : SigmaNoise ) { fout << sigmaNoise.first << ", " << sigmaNoise.second << "\n"; } + for ( const auto& sigmaNoise : SigmaNoise ) { + fout << sigmaNoise.first << ", " << Pedestal[sigmaNoise.first] << ", " << sigmaNoise.second << "\n"; + } info() << "Saving sigma of sigmaNoise file" << endmsg; }; @@ -169,6 +194,8 @@ StatusCode PedestalCalculator::finalize() { saveSigmaNoiseToCsv(); findBadChannels(); saveBadChannelsToCsv(); + saveExtraToCsv(); saveThresholdsToCsv(); + return StatusCode::SUCCESS; } diff --git a/UTEmuAlgorithms/src/UTEmuPedestalCalculatorDataMonitorAlgorithm.cpp b/UTEmuAlgorithms/src/UTEmuPedestalCalculatorDataMonitorAlgorithm.cpp index c291ea3a..d8e0b4f4 100644 --- a/UTEmuAlgorithms/src/UTEmuPedestalCalculatorDataMonitorAlgorithm.cpp +++ b/UTEmuAlgorithms/src/UTEmuPedestalCalculatorDataMonitorAlgorithm.cpp @@ -45,8 +45,8 @@ StatusCode PedestalCalculatorDataMonitorAlgorithm::makePedestalsPlots() { if ( type == "D" ) type = "C"; // Pedestal 1D plots - auto title_pedestal = "Pedestals_" + UTEmu::UT_layers[channelID.layer()] + "_" + module_name; - auto title_pedestal_ = "Pedestals_" + UTEmu::UT_layers[channelID.layer()] + "_" + module_name + ";Channel;ADC"; + auto title_pedestal = "MeanADC_" + UTEmu::UT_layers[channelID.layer()] + "_" + module_name; + auto title_pedestal_ = "MeanADC_" + UTEmu::UT_layers[channelID.layer()] + "_" + module_name + ";Channel;ADC"; plot1D( channelID.strip(), title_pedestal, title_pedestal_, 0, UTEmu::UTNumbers::nStrips, UTEmu::UTNumbers::nStrips, pedestal.second ); @@ -56,10 +56,10 @@ StatusCode PedestalCalculatorDataMonitorAlgorithm::makePedestalsPlots() { Pedestal_Av.at( current_asic_name ) += pedestal.second; - plot1D( pedestal.second, "Projection_Pedestal", "Projection_Pedestal", -31, 31, 62 ); - if(type == "A") plot1D( pedestal.second, "Projection_Pedestal_A", "Projection_Pedestal_A", -31, 31, 62 ); - if(type == "B") plot1D( pedestal.second, "Projection_Pedestal_B", "Projection_Pedestal_B", -31, 31, 62 ); - if(type == "C") plot1D( pedestal.second, "Projection_Pedestal_C", "Projection_Pedestal_C", -31, 31, 62 ); + plot1D( pedestal.second, "Projection_MeanADC", "Projection_MeanADC", -31, 31, 62 ); + if(type == "A") plot1D( pedestal.second, "Projection_MeanADC_A", "Projection_MeanADC_A", -31, 31, 62 ); + if(type == "B") plot1D( pedestal.second, "Projection_MeanADC_B", "Projection_MeanADC_B", -31, 31, 62 ); + if(type == "C") plot1D( pedestal.second, "Projection_MeanADC_C", "Projection_MeanADC_C", -31, 31, 62 ); }; @@ -82,7 +82,7 @@ StatusCode PedestalCalculatorDataMonitorAlgorithm::makePedestalsPlots() { if ( type == "D" ) type = "C"; - auto title_layer = "PedestalAverage_" + UTEmu::UT_layers[channelID.layer()]; + auto title_layer = "MeanADCAverage_" + UTEmu::UT_layers[channelID.layer()]; // Let's include mirroring! Probably it could be done better if ( ( channelID.face() == 1 && y < 0 && x < 0 ) || ( channelID.face() == 0 && y > 0 && x < 0 ) || @@ -245,7 +245,7 @@ StatusCode PedestalCalculatorDataMonitorAlgorithm::initialize() { for ( unsigned int i = 0; i < UTEmu::UTNumbers::nASICs; i++ ) { auto chip_name = module + "_" + std::to_string( i ); - auto title = "PedestalAv_" + chip_name; + auto title = "MeanADCAv_" + chip_name; vector_emplace( Pedestal_Av, chip_name, this, title ); title = "SigmaNoiseAv_" + chip_name; vector_emplace( SigmaNoise_Av, chip_name, this, title ); diff --git a/UTEmuAlgorithms/src/UTEmuPulseShape.cpp b/UTEmuAlgorithms/src/UTEmuPulseShape.cpp new file mode 100644 index 00000000..991f3501 --- /dev/null +++ b/UTEmuAlgorithms/src/UTEmuPulseShape.cpp @@ -0,0 +1,61 @@ +/*****************************************************************************\ +* (c) Copyright 2000-2023 CERN for the benefit of the LHCb Collaboration * +* * +* This software is distributed under the terms of the GNU General Public * +* Licence version 3 (GPL Version 3), copied verbatim in the file "COPYING". * +* * +* In applying this licence, CERN does not waive the privileges and immunities * +* granted to it by virtue of its status as an Intergovernmental Organization * +* or submit itself to any jurisdiction. * +\*****************************************************************************/ + +/* + * UTEmuPulseShape.cpp + * + * Created on: August, 2023 + * Author: Wojciech Krupa (wokrupa@cern.ch) + */ + +#include "UTEmu/UTEmuPulseShape.h" + +using namespace LHCb; +using namespace UTEmu; + +StatusCode PulseShape::initialize() { + return Consumer::initialize().andThen( [&] { + for ( const auto& module : UTMap.getModulesNames() ) { + for ( unsigned int i = 0; i < 512; i++ ) { + auto title = module + ".Chip" + std::to_string( i / 512 ) + ".Ch" + std::to_string( i % 512 ); + if ( title.find( UTEmu::UT_layers[m_layer] ) != std::string::npos ) { + Utility::map_emplace( m_2d_ch, title, 0, this, title, { 128, 0, 128 }, { 64, -32.5, 31.5 } ); + } + } + } + return StatusCode::SUCCESS; + } ); +} + +void PulseShape::operator()( const UTDigits& digitsCont, const LHCb::ODIN& odin, DeUTDetector const& det ) const { + + // fill histos for each digit + for ( const auto& d : digitsCont ) fillHistograms( d, det, odin ); +} + +void PulseShape::fillHistograms( const LHCb::UTDigit* aDigit, DeUTDetector const&, const LHCb::ODIN& odin ) const { + + auto tuple = UTMap.getTuple( aDigit->module(), aDigit->face(), aDigit->stave(), aDigit->side(), aDigit->sector() ); + + auto x = std::get<0>( tuple ); + auto y = std::get<1>( tuple ); + std::string module_name = std::get<4>( tuple ); + std::string type = std::get<5>( tuple ); + if ( type == "D" ) type = "C"; + + Detector::UT::ChannelID channelID = aDigit->channelID(); + + auto title_charge = UTEmu::UT_layers[aDigit->layer()] + "_" + module_name + ".Chip" + + std::to_string( aDigit->strip() / 512 ) + ".Ch" + std::to_string( aDigit->strip() % 512 ); + if ( title_charge.find( UTEmu::UT_layers[m_layer] ) != std::string::npos ) { + ++m_2d_ch.at( title_charge )[{ odin.calibrationStep(), aDigit->depositedCharge() }]; + } +} diff --git a/UTEmuAlgorithms/src/modules.cpp b/UTEmuAlgorithms/src/modules.cpp index d085d4f6..dfd81711 100644 --- a/UTEmuAlgorithms/src/modules.cpp +++ b/UTEmuAlgorithms/src/modules.cpp @@ -16,6 +16,7 @@ #include <UTEmu/UTEmuPedestalSubtractorDataMonitorAlgorithm.h> #include <UTEmu/UTEmuRawDataMonitorAlgorithm.h> #include <UTEmu/UTEmuTrimDAC.h> +#include <UTEmu/UTEmuPulseShape.h> DECLARE_COMPONENT( UTEmu::RawDataMonitorAlgorithm ) DECLARE_COMPONENT( UTEmu::TrimDACAlgorithm ) @@ -24,3 +25,4 @@ DECLARE_COMPONENT( UTEmu::PedestalSubtractor ) DECLARE_COMPONENT( UTEmu::PedestalCalculatorDataMonitorAlgorithm ) DECLARE_COMPONENT( UTEmu::PedestalSubtractorDataMonitorAlgorithm ) DECLARE_COMPONENT( UTEmu::CommonModeSubtractor ) +DECLARE_COMPONENT( UTEmu::PulseShape ) diff --git a/UTEmuOptions/options/UT_Emulation_NoiseComponents.py b/UTEmuOptions/options/UT_Emulation_NoiseComponents.py index 861b0802..d0d77060 100644 --- a/UTEmuOptions/options/UT_Emulation_NoiseComponents.py +++ b/UTEmuOptions/options/UT_Emulation_NoiseComponents.py @@ -28,7 +28,7 @@ from DDDB.CheckDD4Hep import UseDD4Hep app = LHCbApp() app.DataType = "Upgrade" app.Simulation = False -app.EvtMax = 500 +app.EvtMax = 300 # ------------------------------------------------------------------------------- # DD4hep ------------------------------------------------------------- @@ -59,7 +59,7 @@ EventSelector().PrintFreq = 100 # ------------------------------------------------------------------------------- # Setup input ------------------------------------------------------------- -run_number = "0000297288" +run_number = "0000307324" input_path = '/hlt2/objects/UT/' + run_number + '/' data = [] @@ -76,8 +76,8 @@ IOHelper("MDF").inputFiles(data) # Multithreading ------------------------------------------------------------- # ------------------------------------------------------------------------------- -evtslots = 12 -threads = 10 +evtslots = 1 +threads = 1 # Event Loop Manager ----------------------------------------------------------- # It's called slim since it has less functionalities overall than the good-old diff --git a/UTEmuOptions/options/UT_PedestalMonitoring.py b/UTEmuOptions/options/UT_MeanADCMonitoring.py similarity index 96% rename from UTEmuOptions/options/UT_PedestalMonitoring.py rename to UTEmuOptions/options/UT_MeanADCMonitoring.py index 12da0a59..f1913486 100644 --- a/UTEmuOptions/options/UT_PedestalMonitoring.py +++ b/UTEmuOptions/options/UT_MeanADCMonitoring.py @@ -59,8 +59,9 @@ EventSelector().PrintFreq = 100 # ------------------------------------------------------------------------------- # Setup input ------------------------------------------------------------- -run_number = "0000297288" -input_path = '/hlt2/objects/UT/' + run_number + '/' +run_number = "0000307324" +input_path = '/swdev/wokrupa/DATA/' + run_number + '/' + data = [] if os.path.exists(input_path): @@ -117,7 +118,7 @@ odin = createODIN(RawBanks="DAQ/RawBanks/ODIN") decoder = UTRawBankToUTNZSDigitsAlg("UTRawToDigits", OutputLevel=INFO, Type="", OutputDigitData = '/Event/UT/Digits', OutputBankData = '/Event/UT/Banks') -pedestal_monitor = UTEmu__PedestalCalculatorDataMonitorAlgorithm('UTPedestalMonitor', RunNumber = run_number, OutputLevel=INFO) +pedestal_monitor = UTEmu__PedestalCalculatorDataMonitorAlgorithm('UTMeanADCMonitor', RunNumber = run_number, OutputLevel=INFO) monSeq.Members = [unpacker, odin, iovProd, decoder, pedestal_monitor] @@ -133,7 +134,7 @@ appMgr = ApplicationMgr( ExtSvc=[ MessageSvcSink(), whiteboard, - RootHistoSink(FileName="./Vetra/ut_data_pedestals_"+run_number+".root"), + RootHistoSink(FileName="./Vetra/ut_data_meanADC_"+run_number+".root"), ], ) diff --git a/UTEmuOptions/options/UT_PedestalCalculation.py b/UTEmuOptions/options/UT_PedestalCalculation.py index 48369a3f..ba8b9407 100644 --- a/UTEmuOptions/options/UT_PedestalCalculation.py +++ b/UTEmuOptions/options/UT_PedestalCalculation.py @@ -58,7 +58,7 @@ EventSelector().PrintFreq = 1 # ------------------------------------------------------------------------------- # Setup input ------------------------------------------------------------- -run_number = "0000297288" +run_number = "0000307324" input_path = '/hlt2/objects/UT/' + run_number + '/' # Algorithms ---------------------------------------------------------- @@ -76,7 +76,7 @@ unpacker = LHCb__UnpackRawEvent( odin = createODIN(RawBanks="DAQ/RawBanks/ODIN") pedestals = UTEmu__PedestalCalculator( - 'UTDigitsToPedestals', OutputLevel=DEBUG, RunNumber = run_number) + 'UTDigitsToPedestals', OutputLevel=INFO, RunNumber = run_number) monSeq.Members = [unpacker, odin, iovProd, pedestals] diff --git a/UTEmuOptions/options/UT_PedestalSubtraction.py b/UTEmuOptions/options/UT_PedestalSubtraction.py index d0166f7c..6f9421a3 100644 --- a/UTEmuOptions/options/UT_PedestalSubtraction.py +++ b/UTEmuOptions/options/UT_PedestalSubtraction.py @@ -60,7 +60,7 @@ EventSelector().PrintFreq = 100 # ------------------------------------------------------------------------------- # Setup input ------------------------------------------------------------- -run_number = "0000297288" +run_number = "0000307299" input_path = '/hlt2/objects/UT/' + run_number + '/' data = [] diff --git a/UTEmuOptions/options/UT_PulseShape.py b/UTEmuOptions/options/UT_PulseShape.py new file mode 100644 index 00000000..0e0a2207 --- /dev/null +++ b/UTEmuOptions/options/UT_PulseShape.py @@ -0,0 +1,148 @@ +############################################################################### +# (c) Copyright 2020 CERN for the benefit of the LHCb Collaboration # +# # +# This software is distributed under the terms of the GNU General Public # +# Licence version 3 (GPL Version 3), copied verbatim in the file "COPYING". # +# # +# In applying this licence, CERN does not waive the privileges and immunities # +# granted to it by virtue of its status as an Intergovernmental Organizatiodn # +# or submit itself to any jurisdiction. # +############################################################################### + + +import sys, os, glob +from Gaudi.Configuration import MessageSvc, VERBOSE, DEBUG, INFO, ERROR, WARNING +from Gaudi.Configuration import ApplicationMgr +from Configurables import LHCbApp,GaudiSequencer +from Configurables import LoKiSvc +from Configurables import AlgResourcePool, CPUCrunchSvc, HiveSlimEventLoopMgr, HiveWhiteBoard, AvalancheSchedulerSvc +from Configurables import UTEmu__PulseShape, UTRawBankToUTNZSDigitsAlg +from Configurables import Gaudi__Histograming__Sink__Root as RootHistoSink +from Configurables import Gaudi__Monitoring__MessageSvcSink as MessageSvcSink +from Configurables import LHCb__Det__LbDD4hep__IOVProducer as IOVProducer +from Configurables import createODIN, LHCb__UnpackRawEvent, EventSelector +from Configurables import LHCbTimingAuditor, LHCbSequencerTimerTool, TimingAuditor, AuditorSvc, SequencerTimerTool +from GaudiConf import IOHelper +from DDDB.CheckDD4Hep import UseDD4Hep + +# ------------------------------------------------------------------------------- +app = LHCbApp() +app.DataType = "Upgrade" +app.Simulation = False +app.EvtMax = -1 +# ----------------------------------------------------------------------------- +# DD4hep ------------------------------------------------------------- + +if UseDD4Hep: + # Prepare detector description + from Configurables import LHCb__Det__LbDD4hep__DD4hepSvc as DD4hepSvc + dd4hepsvc = DD4hepSvc() + dd4hepsvc.VerboseLevel = 1 + dd4hepsvc.GeometryLocation = "${DETECTOR_PROJECT_ROOT}/compact" + dd4hepsvc.GeometryVersion = "run3/trunk" + dd4hepsvc.GeometryMain = "LHCb.xml" + dd4hepsvc.DetectorList = ["/world", "UT"] + iovProd = IOVProducer("ReserveIOVDD4hep", ODIN='DAQ/ODIN') + +else: + # DetDesc case + LHCbApp().DataType = "Upgrade" + LHCbApp().DDDBtag = 'upgrade/UTv4r2-newUTID' + LHCbApp().CondDBtag = "master" + LHCbApp().Simulation = False + iovProd = IOVProducer() + +LoKiSvc().Welcome = False +MessageSvc().OutputLevel = INFO +EventSelector().PrintFreq = 100 + +# ------------------------------------------------------------------------------- +# Setup input ------------------------------------------------------------- +run_number = "0000306890" +input_path = '/hlt2/objects/UT/' + run_number + '/' + +data = [] +if os.path.exists(input_path): + data = glob.glob('/' + input_path + '*.mdf') +else: + print("Input directory doesn't exist!") + sys.exit() +if data == []: + print("Input data doesn't exist!") + sys.exit() + +IOHelper("MDF").inputFiles(data) + +# Multithreading ------------------------------------------------------------- +# ----------------------------------------------------------------------------- +evtslots = 7 +threads = 6 + +# Event Loop Manager ----------------------------------------------------------- +# It's called slim since it has less functionalities overall than the good-old +# event loop manager. Here we just set its outputlevel to DEBUG. + +whiteboard = HiveWhiteBoard("EventDataSvc", EventSlots=evtslots) +slimeventloopmgr = HiveSlimEventLoopMgr( + SchedulerName="AvalancheSchedulerSvc", OutputLevel=INFO +) + +# ForwardScheduler ------------------------------------------------------------- +# We just decide how many algorithms in flight we want to have and how many +# threads in the pool. The default value is -1, which is for TBB equivalent +# to take over the whole machine. + +scheduler = AvalancheSchedulerSvc(ThreadPoolSize=threads, OutputLevel=INFO) + +# Algo Resource Pool ----------------------------------------------------------- +# Nothing special here, we just set the debug level. +AlgResourcePool(OutputLevel=INFO) + +CPUCrunchSvc(shortCalib=True) + +# Algorithms ---------------------------------------------------------- +# Declare the algorithms we want to run. We set the output level to INFO + +monSeq = GaudiSequencer("UTSequence") +monSeq.IgnoreFilterPassed = True + +unpacker = LHCb__UnpackRawEvent( + 'UnpackRawEvent', + BankTypes=['ODIN'], + RawBankLocations=['/Event/DAQ/RawBanks/ODIN' + ]) + +odin = createODIN(RawBanks="DAQ/RawBanks/ODIN") + +decoder = UTRawBankToUTNZSDigitsAlg("UTRawToDigits", OutputLevel=INFO, Type="", OutputDigitData = '/Event/UT/Digits', OutputBankData = '/Event/UT/Banks') + +#0-4 +layer = 2 +pulse = UTEmu__PulseShape( + "UTPulseShape", OutputLevel=INFO, Layer = layer) + +monSeq.Members = [unpacker, odin, iovProd, decoder, pulse] + +# Application Manager ---------------------------------------------------------- +# We put everything together and change the type of message service + +appMgr = ApplicationMgr( + EvtMax=-1, + TopAlg=[monSeq], + HistogramPersistency="ROOT", + EventLoop=slimeventloopmgr, + ExtSvc=[ + MessageSvcSink(), + whiteboard, + RootHistoSink(FileName="./Vetra/ut_data_pulse_"+run_number+"_Layer"+str(layer)+".root"), + ], +) + +# Some extra stuff for timing table +ApplicationMgr().ExtSvc += ['ToolSvc', 'AuditorSvc'] +ApplicationMgr().AuditAlgorithms = True +AuditorSvc().Auditors += ['TimingAuditor'] +SequencerTimerTool().OutputLevel = 4 + +# No error messages when reading MDF +#IODataManager().DisablePFNWarning = True diff --git a/UTEmuOptions/options/UT_RawADC_Run.py b/UTEmuOptions/options/UT_RawADC_Run.py index 9005cfc3..18f27513 100644 --- a/UTEmuOptions/options/UT_RawADC_Run.py +++ b/UTEmuOptions/options/UT_RawADC_Run.py @@ -26,11 +26,11 @@ from GaudiConf import IOHelper from DDDB.CheckDD4Hep import UseDD4Hep # ------------------------------------------------------------------------------- -app = LHCbApp() +app = LHCbApp() app.DataType = "Upgrade" app.Simulation = False app.EvtMax = 1000 -# ------------------------------------------------------------------------------- +# ----------------------------------------------------------------------------- # DD4hep ------------------------------------------------------------- if UseDD4Hep: @@ -58,8 +58,8 @@ EventSelector().PrintFreq = 100 # ------------------------------------------------------------------------------- # Setup input ------------------------------------------------------------- -run_number = "0000299973" -input_path = '/group/ut/ONLINE/DATA/' + run_number + '/' +run_number = "0000307324" +input_path = '/hlt2/objects/UT/' + run_number + '/' data = [] if os.path.exists(input_path): diff --git a/UTScripts/BadChannels/UTBadChannels.py b/UTScripts/BadChannels/UTBadChannels.py index ab2478d8..cfa14f14 100644 --- a/UTScripts/BadChannels/UTBadChannels.py +++ b/UTScripts/BadChannels/UTBadChannels.py @@ -5,7 +5,7 @@ import re import yaml from collections import OrderedDict -run = "0000294135" +run = "0000302970" # Code to convert channelID to online name + channel strip_mask = 0x1ff @@ -27,6 +27,9 @@ max_side_number = 1 side_names = ("C", "A") layer_names = ("aX", "aU", "bV", "bX") +def remove_duplicates_from_list(lst): + return list(set(lst)) + def get_online_name(aChan): det_type, side, layer, stave, face, module, sector, _ = extract_bits(aChan) assert det_type == det_type_ut @@ -96,77 +99,73 @@ def get_last(t): return t[-1] # import data -data = pd.read_csv("/swdev/wokrupa/stack2/Vetra/CMS_noise_" + run + ".csv") +data = pd.read_csv("/swdev/wokrupa/stack3/Vetra/CMS_noise_" + run + ".csv") columns_name = ['channel_ID', 'mean', 'sigma', 'N'] data.columns = columns_name -data = data[data['N'] > 50] - -# get online name and channel +# Extract online name and channel data['name'] = data['channel_ID'].apply(get_online_name) -m = data['channel_ID'].apply(extract_bits) - -df = pd.DataFrame(m) - -# Calculate last_value from channel_ID -df['last_value'] = df['channel_ID'].apply(get_last) -data['channel'] = df['last_value'] +data['channel'] = data['channel_ID'].apply(extract_bits).apply(get_last) data['chip'] = (data['channel'] // 128).astype(int) -# Compute the mean and std of the noise (sigma) of each chip without outliers -mean_noise = data.groupby(['name', 'chip'])['sigma'].apply( - mean_wo_outliers).reset_index() -std_noise = data.groupby(['name', 'chip'])[ - 'sigma'].apply(compute_ci).reset_index() +# Compute the mean and std of noise (sigma) for each chip without outliers +mean_noise = data.groupby(['name', 'chip'])['sigma'].apply(mean_wo_outliers).reset_index() +std_noise = data.groupby(['name', 'chip'])['sigma'].apply(compute_ci).reset_index() -# Merge dataframes -merged_df2 = pd.merge(data, mean_noise, on=[ - 'name', 'chip'], how='inner', suffixes=('', '_mean')) -merged_df2 = pd.merge(merged_df2, std_noise, on=[ - 'name', 'chip'], how='inner', suffixes=('', '_std')) +# Merge dataframes - calculate mean and std of sigma per chip +merged_df = pd.merge(data, mean_noise, on=['name', 'chip'], suffixes=('', '_mean')) +merged_df = pd.merge(merged_df, std_noise, on=['name', 'chip'], suffixes=('', '_std')) + +#Save all +merged_df.to_csv('all_' + run + '.csv', index=False) # Select noisy channels -condition = (merged_df2['sigma'] > - merged_df2['sigma_mean'] + 10 * merged_df2['sigma_std']) -condition_n = ( - merged_df2['sigma'] < merged_df2['sigma_mean'] - 10 * merged_df2['sigma_std']) -condition0 = (merged_df2['mean'] > 2.5 * merged_df2['sigma']) -condition0_n = (merged_df2['mean'] < -2.5 * merged_df2['sigma']) - -result_df2 = merged_df2.loc[condition | condition_n | - condition0 | condition0_n, ['channel', 'name']] - -# selection of bad channels -condition2 = merged_df2['sigma'] > 2*merged_df2['sigma_mean'] -condition20 = merged_df2['sigma'] < 0.5*merged_df2['sigma_mean'] -result_df = pd.DataFrame({ - 'channel': merged_df2.loc[condition2 | condition20, 'channel'], - 'name': merged_df2.loc[condition2 | condition20, 'name'] -}) - -# Convert the list in the correct format +condition = (merged_df['sigma'] > merged_df['sigma_mean'] + 10 * merged_df['sigma_std']) | \ + (merged_df['sigma'] < merged_df['sigma_mean'] - 10 * merged_df['sigma_std']) | \ + (merged_df['mean'] > 2.5 * merged_df['sigma']) | \ + (merged_df['mean'] < -2.5 * merged_df['sigma']) + +result_df = merged_df.loc[condition, ['channel', 'name']] + +# Select bad channels based on sigma thresholds +condition_high = merged_df['sigma'] > 2 * merged_df['sigma_mean'] +condition_low = merged_df['sigma'] < 0.5 * merged_df['sigma_mean'] + +result_df2 = merged_df.loc[condition_high | condition_low, ['channel', 'name']] + +# Convert the list in the correct format result_df['chip'] = result_df['channel'] // 128 result_df['chip'] = result_df['chip'].astype(int) +# Convert the list in the correct format +result_df2['chip'] = result_df2['channel'] // 128 +result_df2['chip'] = result_df2['chip'].astype(int) + # Group by name and chip, aggregate channels as lists -tot = result_df.groupby(['name', 'chip'])['channel'].agg(list).reset_index() -tot['nBadC'] = tot['channel'].apply(lambda x: [(i % 128) for i in x]) +combined_df = pd.concat([result_df, result_df2], ignore_index=True) -# Print noisy channels -print("Noisy channels") -print(tot) +tot_n = combined_df.groupby(['name', 'chip'])['channel'].agg(list).reset_index() + +tot_n['nBadC'] = tot_n['channel'].apply(lambda x: [(i % 128) for i in x]) # Calculate positions -tot['pos'] = tot['nBadC'].apply(lambda x: [num // 8 for num in x]) +tot_n['pos'] = tot_n['nBadC'].apply(lambda x: [num // 8 for num in x]) +# Verify the lengths are the same +assert all(tot_n['nBadC'].apply(len) == tot_n['pos'].apply(len)), "Mismatch in lengths of 'nBadC' and 'pos'" +# Print noisy channels -# Open a file for writing -file = open('bad_ch_list_' + run + '.txt', 'w') +# Apply the function to the relevant columns +tot_n['nBadC'] = tot_n['nBadC'].apply(remove_duplicates_from_list) +tot_n['pos'] = tot_n['pos'].apply(remove_duplicates_from_list) +tot_n['channel'] = tot_n['channel'].apply(remove_duplicates_from_list) + +print("CMS_based") +print(tot_n) # Tag saturation with pedestal value # Import pedestals -ped = pd.read_csv("/swdev/wokrupa/stack2/Vetra/pedestals_" + run + ".csv") -columns_name_ped = ['channel_ID', 'pedestal'] -ped.columns = columns_name_ped +ped = pd.read_csv("/swdev/wokrupa/stack3/Vetra/pedestals_" + run + ".csv") +ped.columns = ['channel_ID', 'pedestal'] ped['name'] = ped['channel_ID'].apply(get_online_name) m_ped = ped['channel_ID'].apply(extract_bits) @@ -175,69 +174,148 @@ df_ped['last_value'] = df_ped['channel_ID'].apply(lambda x: get_last(x)) ped['channel'] = df_ped['last_value'] ped['chip'] = (ped['channel'] // 128).astype(int) -merged_df_p = pd.merge(merged_df2, ped, on=[ - 'name', 'chip', 'channel_ID', 'channel'], how='inner', suffixes=('', '')) +# Select bad channels based on saturation condition +condition_p = np.abs(ped['pedestal']) > 25 +result_df_p = ped.loc[condition_p, ['channel', 'name']] -# selection of bad channels due to saturation -condition_p = np.abs(merged_df_p['pedestal']) > 25 +# Calculate chip numbers +result_df_p['chip'] = (result_df_p['channel'] // 128).astype(int) -result_df_p = pd.DataFrame({ - 'channel': merged_df_p.loc[condition_p, 'channel'], - 'name': merged_df_p.loc[condition_p, 'name'] -}) +# Group channels by name and chip +tot_p = result_df_p.groupby(['name', 'chip'])['channel'].agg(list).reset_index() -result_df_p['chip'] = result_df_p['channel']/128 -result_df_p['chip'] = result_df_p['chip'].astype(int) - -tot_p = result_df_p.groupby(['name', 'chip'])[ - 'channel'].agg(list).reset_index() +# Calculate positions tot_p['nBadC'] = tot_p['channel'].apply(lambda x: [(i % 128) for i in x]) tot_p['pos'] = tot_p['nBadC'].apply(lambda x: [num // 8 for num in x]) -print("Pedestal") + +# Verify equal lengths +assert all(tot_p['nBadC'].apply(len) == tot_p['pos'].apply(len)), "Mismatch in lengths of 'nBadC' and 'pos'" + +# Apply the function to the relevant columns +tot_p['nBadC'] = tot_p['nBadC'].apply(remove_duplicates_from_list) +tot_p['pos'] = tot_p['pos'].apply(remove_duplicates_from_list) +tot_p['channel'] = tot_p['channel'].apply(remove_duplicates_from_list) + +print("Pedestal_based") print(tot_p) +# Tag disabled channels +# Import total noise not biased by CMS + +# import data +data = pd.read_csv("/swdev/wokrupa/stack3/Vetra/sigmaNoise_" + run + ".csv") +columns_name = ['channel_ID', 'mean', 'sigma'] +data.columns = columns_name + +# Extract online name and channel +data['name'] = data['channel_ID'].apply(get_online_name) +data['channel'] = data['channel_ID'].apply(extract_bits).apply(get_last) +data['chip'] = (data['channel'] // 128).astype(int) + +# Compute the mean and std of noise (sigma) for each chip without outliers +mean_noise = data.groupby(['name', 'chip'])['sigma'].apply(mean_wo_outliers).reset_index() +std_noise = data.groupby(['name', 'chip'])['sigma'].apply(compute_ci).reset_index() + +# Merge dataframes - calculate mean and std of sigma per chip +merged_df = pd.merge(data, mean_noise, on=['name', 'chip'], suffixes=('', '_mean')) +merged_df = pd.merge(merged_df, std_noise, on=['name', 'chip'], suffixes=('', '_std')) + +#Save all +merged_df.to_csv('all2_' + run + '.csv', index=False) + +# Select noisy channels +condition = (merged_df['sigma_mean'] > 0 ) +condition2 = (merged_df['sigma'] == 0 ) + +result_df = merged_df.loc[condition & condition2, ['channel', 'name']] + +# Convert the list in the correct format +result_df['chip'] = result_df['channel'] // 128 +result_df['chip'] = result_df['chip'].astype(int) + +tot_s = result_df.groupby(['name', 'chip'])['channel'].agg(list).reset_index() +tot_s['nBadC'] = tot_s['channel'].apply(lambda x: [(i % 128) for i in x]) + +# Calculate positions +tot_s['pos'] = tot_s['nBadC'].apply(lambda x: [num // 8 for num in x]) + +# Verify the lengths are the same +assert all(tot_s['nBadC'].apply(len) == tot_s['pos'].apply(len)), "Mismatch in lengths of 'nBadC' and 'pos'" + +# Apply the function to the relevant columns +tot_s['nBadC'] = tot_s['nBadC'].apply(remove_duplicates_from_list) +tot_s['pos'] = tot_s['pos'].apply(remove_duplicates_from_list) +tot_s['channel'] = tot_s['channel'].apply(remove_duplicates_from_list) + +print("TotSig_based") +print(tot_s) + # merging bad channels from noise and from pedestal distributions -all_bad_ch = pd.concat([tot, tot_p]) +all_bad_ch = pd.concat([tot_n, tot_p, tot_s]) # Define a function to merge lists def merge_lists(series): - return list(set(x for sublist in series for x in sublist)) - -# Group by 'channel' and 'name' and apply the merge_lists function -result1 = all_bad_ch.groupby(['chip', 'name'])[ - 'nBadC'].agg(merge_lists).reset_index() -result2 = all_bad_ch.groupby(['chip', 'name'])[ - 'pos'].agg(merge_lists).reset_index() -result3 = all_bad_ch.groupby(['chip', 'name'])[ - 'channel'].agg(merge_lists).reset_index() - -final_list = pd.merge(result1, result2, on=['chip', 'name'], how='inner') -final_list = pd.merge(final_list, result3, on=['chip', 'name'], how='inner') + return [x for sublist in series for x in sublist] + +# Group by 'chip' and 'name' and apply the merge_lists function +result1 = all_bad_ch.groupby(['chip', 'name'])['nBadC'].agg(merge_lists).reset_index() +result2 = all_bad_ch.groupby(['chip', 'name'])['pos'].agg(merge_lists).reset_index() +result3 = all_bad_ch.groupby(['chip', 'name'])['channel'].agg(merge_lists).reset_index() + +# Merge the results +final_list = pd.merge(result1, result2, on=['chip', 'name'], how='inner') +final_list = pd.merge(final_list, result3, on=['chip', 'name'], how='inner') + +# Apply the function to the relevant columns +final_list['nBadC'] = final_list['nBadC'].apply(remove_duplicates_from_list) +final_list['channel'] = final_list['channel'].apply(remove_duplicates_from_list) + +#trick to have repetition but only when needed! +final_list['pos'] = final_list['nBadC'].apply(lambda x: [num // 8 for num in x]) + + tot = final_list +print("Total") +print(tot) +tot.to_csv('total_list_1_' + run + '.txt', index=False) + +# Open a file for writing +file = open('bad_ch_list_' + run + '.txt', 'w') + +exclusions = ["UTbV_1AT_S1E.Chip3.Ch104", "UTaU_2AT_M2.Chip3.Ch18", "UTbV_9CT_S3.Chip0.Ch90",] # write the bad channels in the correct format for i in range(len(tot)): - + exc = 1 mask_list = ['0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00'] sum_dict = {} prova = [] mask_dict = {} for val1, val2 in zip(tot.iloc[i]['nBadC'], tot.iloc[i]['pos']): + name = tot.iloc[i]['name'] + ".Chip" + str(tot.iloc[i]['chip']) + ".Ch" + str(val1) + print(name) + if name in exclusions: + exc = 0 + print("Exclusion! ", name) + continue if val2 not in mask_dict: mask_dict[val2] = 0 mask_dict[val2] |= (1 << val1 % 8) - mask_list2 = list(mask_dict.values()) mask = [hex(0x00 | element) for element in mask_list2] - no_rep_pos = list(set(tot.iloc[i]['pos'])) no_rep_pos.sort() - - if tot.iloc[i]['nBadC']: - for jj in range(len(no_rep_pos)): - mask_list[no_rep_pos[jj]] = mask[jj] - line = '--- {}.{} {}\n'.format(tot.iloc[i] - ['name'], tot.iloc[i]['chip'], mask_list) - file.write(line) - + if(exc): + if tot.iloc[i]['nBadC']: + for jj in range(len(no_rep_pos)): + mask_list[no_rep_pos[jj]] = mask[jj] + line = '--- {}.{} {}\n'.format(tot.iloc[i] + ['name'], tot.iloc[i]['chip'], mask_list) + file.write(line) + +# extra stuff for extra studies + +tot_p.to_csv('bad_ch_list_1_' + run + '.txt', index=False) +tot_n.to_csv('bad_ch_list_2_' + run + '.txt', index=False) +tot_s.to_csv('bad_ch_list_3_' + run + '.txt', index=False) diff --git a/UTScripts/BadChannels/UTBadChannels_Wojtek.py b/UTScripts/BadChannels/UTBadChannels_Wojtek.py deleted file mode 100644 index 19d514af..00000000 --- a/UTScripts/BadChannels/UTBadChannels_Wojtek.py +++ /dev/null @@ -1,241 +0,0 @@ -import pandas as pd -import numpy as np -import matplotlib.pyplot as plt -import re -import yaml -from collections import OrderedDict - -run = "0000294165" - -# Code to convert channelID to online name + channel -strip_mask = 0x1ff -sector_mask = 0x200 -module_mask = 0x1c00 -face_mask = 0x2000 -stave_mask = 0x3c000 -layer_mask = 0xc0000 -side_mask = 0x100000 -det_type_mask = 0x600000 -det_type_ut = 2 -max_strip_number = 511 -max_sector_number = 1 -max_module_number = 7 -max_face_number = 1 -max_stave_number = 8 -max_layer_number = 3 -max_side_number = 1 -side_names = ("C", "A") -layer_names = ("aX", "aU", "bV", "bX") - -def get_online_name(aChan): - det_type, side, layer, stave, face, module, sector, _ = extract_bits(aChan) - assert det_type == det_type_ut - side_str = side_names[side] - layer_str = layer_names[layer] - stave_str = str(stave + 1) # Convert stave to string - - # Determine module_str - if stave == 0: - if face == 0: - module_str = f"B_S{4 - module}" if module < 4 else f"T_M{module - 3}" - elif face == 1: - module_str = f"B_M{4 - module}" if module < 4 else f"T_S{module - 3}" - else: - if face == 0: - module_str = f"B_S{3 - module}" if module < 4 else f"T_M{module - 3}" - elif face == 1: - module_str = f"B_M{4 - module}" if module < 4 else f"T_S{module - 4}" - - # Determine sector_str - if stave < 2 and face == 0 and 2 <= module < 5: - sector_str = "W" if sector == 0 else "E" - elif stave < 2 and face == 1 and 2 < module <= 5: - sector_str = "W" if sector == 0 else "E" - else: - assert sector == 0 - sector_str = "" - - name = f"UT{layer_str}_{stave_str}{side_str}{module_str}{sector_str}" - return name - -def extract_bits(aChan): - binary_aChan = bin(aChan)[2:] # Convert to binary string - strip = int(binary_aChan, 2) & strip_mask - sector = (int(binary_aChan, 2) & sector_mask) >> 9 - module = (int(binary_aChan, 2) & module_mask) >> 10 - face = (int(binary_aChan, 2) & face_mask) >> 13 - stave = (int(binary_aChan, 2) & stave_mask) >> 14 - layer = (int(binary_aChan, 2) & layer_mask) >> 18 - side = (int(binary_aChan, 2) & side_mask) >> 20 - det_type = (int(binary_aChan, 2) & det_type_mask) >> 21 - return det_type, side, layer, stave, face, module, sector, strip - -def compute_ci(x, confidence=0.68): - intervallo = np.percentile( - x, [100*(1-confidence)/2, 100*(1-(1-confidence)/2)]) - return (intervallo[1] - intervallo[0]) / 2 - - -def compute_min(x, confidence): - intervallo = np.percentile( - x, [100*(1-confidence)/2, 100*(1-(1-confidence)/2)]) - return intervallo[0] - -def compute_max(x, confidence): - intervallo = np.percentile( - x, [100*(1-confidence)/2, 100*(1-(1-confidence)/2)]) - return intervallo[1] - -def mean_wo_outliers(x): - minimo = compute_min(x, 0.98) - maximo = compute_max(x, 0.98) - a_sel = np.array(x)[(x > minimo) & (x < maximo)] - return np.mean(a_sel) - -def get_last(t): - return t[-1] - -# import data -data = pd.read_csv("/swdev/wokrupa/stack2/Vetra/total_noise_" + run + ".csv") -columns_name = ['channel_ID', 'mean', 'sigma'] -data.columns = columns_name - -# get online name and channel -data['name'] = data['channel_ID'].apply(get_online_name) -m = data['channel_ID'].apply(extract_bits) - -df = pd.DataFrame(m) - -# Calculate last_value from channel_ID -df['last_value'] = df['channel_ID'].apply(get_last) -data['channel'] = df['last_value'] -data['chip'] = (data['channel'] // 128).astype(int) - -# Compute the mean and std of the noise (sigma) of each chip without outliers -mean_noise = data.groupby(['name', 'chip'])['sigma'].apply( - mean_wo_outliers).reset_index() -std_noise = data.groupby(['name', 'chip'])[ - 'sigma'].apply(compute_ci).reset_index() - -# Merge dataframes -merged_df2 = pd.merge(data, mean_noise, on=[ - 'name', 'chip'], how='inner', suffixes=('', '_mean')) -merged_df2 = pd.merge(merged_df2, std_noise, on=[ - 'name', 'chip'], how='inner', suffixes=('', '_std')) - -# Select noisy channels -condition = (merged_df2['sigma'] > - merged_df2['sigma_mean'] + 10 * merged_df2['sigma_std']) -condition_n = ( - merged_df2['sigma'] < merged_df2['sigma_mean'] - 10 * merged_df2['sigma_std']) -condition0 = (merged_df2['mean'] > 2.5 * merged_df2['sigma']) -condition0_n = (merged_df2['mean'] < -2.5 * merged_df2['sigma']) - -result_df2 = merged_df2.loc[condition - condition0 | condition0_n, ['channel', 'name']] - -# selection of bad channels -condition2 = merged_df2['sigma'] > 2*merged_df2['sigma_mean'] -condition20 = merged_df2['sigma'] < 0.5*merged_df2['sigma_mean'] -result_df = pd.DataFrame({ - 'channel': merged_df2.loc[condition2 | condition20, 'channel'], - 'name': merged_df2.loc[condition2 | condition20, 'name'] -}) - -# Convert the list in the correct format -result_df['chip'] = result_df['channel'] // 128 -result_df['chip'] = result_df['chip'].astype(int) - -# Group by name and chip, aggregate channels as lists -tot = result_df.groupby(['name', 'chip'])['channel'].agg(list).reset_index() -tot['nBadC'] = tot['channel'].apply(lambda x: [(i % 128) for i in x]) - -print("Noisy channels") -with pd.option_context("display.max_rows", None, "display.max_columns", None): - print(tot) - -# Calculate positions -tot['pos'] = tot['nBadC'].apply(lambda x: [num // 8 for num in x]) - -# Open a file for writing -file = open('bad_ch_list_' + run + '.txt', 'w') - -# Tag saturation with pedestal value -# Import pedestals -ped = pd.read_csv("/swdev/wokrupa/stack2/Vetra/pedestals_" + run + ".csv") -columns_name_ped = ['channel_ID', 'pedestal'] -ped.columns = columns_name_ped -ped['name'] = ped['channel_ID'].apply(get_online_name) -m_ped = ped['channel_ID'].apply(extract_bits) - -df_ped = pd.DataFrame(m_ped) -df_ped['last_value'] = df_ped['channel_ID'].apply(lambda x: get_last(x)) -ped['channel'] = df_ped['last_value'] -ped['chip'] = (ped['channel'] // 128).astype(int) - -merged_df_p = pd.merge(merged_df2, ped, on=[ - 'name', 'chip', 'channel_ID', 'channel'], how='inner', suffixes=('', '')) - -# selection of bad channels due to saturation -condition_p = np.abs(merged_df_p['pedestal']) > 25 - -result_df_p = pd.DataFrame({ - 'channel': merged_df_p.loc[condition_p, 'channel'], - 'name': merged_df_p.loc[condition_p, 'name'] -}) - -result_df_p['chip'] = result_df_p['channel']/128 -result_df_p['chip'] = result_df_p['chip'].astype(int) - -tot_p = result_df_p.groupby(['name', 'chip'])[ - 'channel'].agg(list).reset_index() -tot_p['nBadC'] = tot_p['channel'].apply(lambda x: [(i % 128) for i in x]) -tot_p['pos'] = tot_p['nBadC'].apply(lambda x: [num // 8 for num in x]) -print("Pedestal") -print(tot_p) - -# merging bad channels from noise and from pedestal distributions -all_bad_ch = pd.concat([tot, tot_p]) - -# Define a function to merge lists -def merge_lists(series): - return list(set(x for sublist in series for x in sublist)) - -# Group by 'channel' and 'name' and apply the merge_lists function -result1 = all_bad_ch.groupby(['chip', 'name'])[ - 'nBadC'].agg(merge_lists).reset_index() -result2 = all_bad_ch.groupby(['chip', 'name'])[ - 'pos'].agg(merge_lists).reset_index() -result3 = all_bad_ch.groupby(['chip', 'name'])[ - 'channel'].agg(merge_lists).reset_index() - -final_list = pd.merge(result1, result2, on=['chip', 'name'], how='inner') -final_list = pd.merge(final_list, result3, on=['chip', 'name'], how='inner') -tot = final_list - -# write the bad channels in the correct format -for i in range(len(tot)): - - mask_list = ['0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', - '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00', '0x00'] - sum_dict = {} - prova = [] - mask_dict = {} - for val1, val2 in zip(tot.iloc[i]['nBadC'], tot.iloc[i]['pos']): - if val2 not in mask_dict: - mask_dict[val2] = 0 - mask_dict[val2] |= (1 << val1 % 8) - - mask_list2 = list(mask_dict.values()) - mask = [hex(0x00 | element) for element in mask_list2] - - no_rep_pos = list(set(tot.iloc[i]['pos'])) - no_rep_pos.sort() - - if tot.iloc[i]['nBadC']: - for jj in range(len(no_rep_pos)): - mask_list[no_rep_pos[jj]] = mask[jj] - line = '--- {}.{} {}\n'.format(tot.iloc[i] - ['name'], tot.iloc[i]['chip'], mask_list) - file.write(line) - diff --git a/UTScripts/NoisyChannels/UTNoisyChannels.py b/UTScripts/NoisyChannels/UTNoisyChannels.py new file mode 100644 index 00000000..27ca50a6 --- /dev/null +++ b/UTScripts/NoisyChannels/UTNoisyChannels.py @@ -0,0 +1,47 @@ +import os +import sys +import importlib +import ROOT # Assuming you have ROOT installed + +class UTSEUCheck: + def __init__(self, hist_path): + self.hist_name = ["UTOnlineBSMonitor/hitRateChannels_UA", "UTOnlineBSMonitor/hitRateChannels_UC"] + self.hist_path = hist_path + self.root_file = ROOT.TFile.Open(hist_path) + self.hists = {} + noisy = {} + + if os.path.exists('/hist/Reference/UTZSMon'): + sys.path.append('/hist/Reference/UTZSMon') + try: + importlib.import_module('ut_dict') + print(f"UT Module 'ut_dict' imported successfully!") + from ut_dict import UT_dict + except ImportError: + print(f"UT Error: Module 'ut_dict' not found.") + else: + print(f"UT Error: Directory '/hist/Reference/UTZSMon' not found.") + + for hist_name in self.hist_name: + self.hists[hist_name] = self.root_file.Get(hist_name) + + for hist_name, hist in self.hists.items(): + print(f"UT - found {hist_name}") + try: + bins = hist.GetXaxis().GetNbins() + except AttributeError: + continue + + for checkedBin in range(1, bins + 1): + binContent = hist.GetBinContent(checkedBin) + if binContent > 0.1: + if hist_name == "UTOnlineBSMonitor/hitRateChannels_UC": + ch=checkedBin+268288-1 + print(UT_dict[int(ch/128)]+".Ch"+str(ch%128), "Hitrate: ", binContent) + else: + ch=checkedBin-1 + print(UT_dict[int(ch/128)]+".Ch"+str(ch%128), "Hitrate: ", binContent) + +if __name__ == "__main__": + hist_path = "/hist/Savesets/ByRun/UTBSMon/300000/307000/UTBSMon-run307346.root" + UTSEUCheck(hist_path) diff --git a/UTScripts/References/overlay_center_natural_asic_UTaU.root b/UTScripts/References/overlay_center_natural_asic_UTaU.root index 2e7753fd05a67c651444d406932ec2b2b8962469..f7a7caad011ebaa46006c1d79063f1de83192578 100644 GIT binary patch delta 4407 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 delta 4158 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 diff --git a/UTScripts/References/overlay_center_natural_asic_UTaX.root b/UTScripts/References/overlay_center_natural_asic_UTaX.root index 59f8d8b66c2d0624091cdb7f9d93eb0f3d0d6e6f..aa6876c3787a1150d7dc531213aacbebbbbe991a 100644 GIT binary patch delta 4388 zcmZu!3pkY78$aVRCPUL;42E$Tmlz3Ux6P%Ywi`prWo+vfww|=^RvQ|$T@*<N|J7wt z*)A@Tc8hY`LXqn}6<buQO%0V$N%8;YJKxuMcGqLRci#8+dw=ga-}lWq@7Y&NX|1Cy zi;0Yk1K_PL03Z~Az_kDbOk&?Xu@43NL?~dFFaQ=|fYvCW<o5g&wDcVFRZVPhQi^ij zt88aeZ2-;zDJ>+v^;`p3h38>f0Ki7q1=%GQ7FZaEfLa|Ejle!Q41k;cKNPcPbmTEM z)TPAX_O-Ve>{8{yeu@R|Um<)iIpn9xA)Y4@cacZ&NclLrbTD>62>|(CSgGm)trZaF zuYhurz09D1WdThTdAPQ#BAG)6K=C4UraD79m5*Zs8_Zx3RfvDDppv|~04Ql=JQo<P zgtV98JRTe(d}YE9q#-<mhH4kCm+JALa1M%xW4?fG0o&%Fv5d|^JPH=?Qni59$|(Lo znXJtQfW8`=*BW@5j<9w*%30uva(s>E!4X3`tWcq$d#6I?asW^@#&ZjFX)s8OgX0I+ zN%PPg4d#+uE&y}Wajq(t24Bxb+*cl`Mj!*#t|9z8g#VF&#<GrxU!R9~9Ng!@#Y{Bs zU?$>Kx=ZzVu!PBgHfpGbhZ;EsGXT^sLqpaY$W})>j_N3{UnqTse3+%K1XVRq9$$mZ z;{%|PgXfKDpgbp>kLGxY^)o(iz9z}H0zfkdpDQ`u0ypV%A^2>PX9ECx@}KwbFh&ic z8o?GV^vb;QH-K5%b})iMgCi6r=%=lYmutl1zWDd&+6nk;Y9;;s=y=0XZ6Um@V}xV< zIwVE~fU^e2N;wGY<|N>pvTvm|7Q+HvG(9olYwIE36Y~T0P_1e`Qcnc{t_f_^6T%>d z63pVF+g8RUaqP9$*T!-8c}j4XKEjLiQBB8<25_OF9gH$SV_^{f3&MZ&jTA>U(+x>Y z4FC)$V78$Uii}WRvJr`C0$}tU!`z@N4~;vThibL^8NeB1J18(lIR%7YL-^6Sk81gu zkb2l!X3_+MO@wg1DasR?x~Kq(%4z`sasV_Kzyx!1;>Kg|w`nzYbC)Ve36L`12EVh; zW-cfIO;NyKB)!!}D5z?Nf(vH{_Yy(M?BH{A8=?>o0CSG4P>2Ny7-K-L4CuE&+Ikkm z2z>b@(-Z)UbQ!aokC;q8!F07mfe{~kth%x(3zV@%7yDcG8d-q~?Br?VGp+wOS&JZ% zRvX%wB62n&3uMX-1gQag!qUG6Y+=IfJY=!!4t#fT!?yq{fc+>fC9+90S(>Xql@d(i zal(A*_OT!gQWmhp7ZpLg3D`~<IU?K=`t`gPNp1dh!_x9V$tqEQaKAx0&8qc8#Np=? zyra9nvaH#k?Pz?aq;bWVp_-!2j<Hh%cec;j`LKW2-Nk8zhmM6#=!{=Dz;+(LSn88- zw|;X^{u1{IU5DPAM_;^nH*o&kl@iGWr@8Bf(QTE?;nU%&-HW}&XAFF~QDt5y564eG z{$OzTY)pQ5*1Gs@v9Tqe9{R+r3dzm7#CA&9`)9RAZd>XjjpYY7y$U;496n6zPAPI$ zA3u^>chQ~EAx`WTaO+1q6SyCqCRbe^`AhuMMYEOSnTTo0fy|=E%Vu`GuADMxPn0~_ z|6{_@J(D@GT(r8E-S=MnrkAn7*XdYV^84RLpZ}eDd#^|RU}VJ9mXDe_wW0Tl>y89$ zUgh*dSo@tX{rha4XRZtM845hxr=L!CJeI6&3`xG*zqldyciZpx1$;Qr)|XzKKgpid z*>R`yC7h16?O4|7SRiqj*;cfXan*bI?af!qHn=XLFRUtiVSdhbVyP2f9N-=9WO_{R zSq#6!YBYZN{nqcTe!ZNt+i{p5x<d19;bMWB-W%%Cs<!i0jx~lO%f9rfd-Fdx?$M}L zwwH~UPf}!L%pJMPQ<Nnm)S{%0<C}uQnZt1}9SV+~Hk{tJD=O;zt<qao_8te<<=St* zy>ZEo!K#8i&2I~?Y#z^wbc(8t6~{Zp=Ije-xUtr)G<svprlp*usuJf_;fqAq4RRhz zwq$aIn|DRV+x<Ll-OTf83ZQ;<@7uqo?sqH_eKmBeqpCFDy|HVj_s!PHw|izJGsl?~ z`p3sQ1bK^M_na{g|KwfJ(wy+Dyj9WfcZcfL+#A|mnNJR$xOqL@TPH66G^fP9PP`&- z$Re*d%kqhBX5b~0o$2LoB!B;8QnNok`42V!ra`kk{OGGId@JS7HL3Yu`|FS+<zrfT za5|@Z;gF8z1xu-;9j#zFWZ`3*Wg5a2ss(m=?=*>yv>hBUmN08t&l`KBQ2Jb_Z6~a= zHLF*~u_RHL?ll+pgF8)z13qYp{cfZNrI&9q)NH`Yxy)5?jbqWnl`OlxORbMb!|%Vo zTd`@bMtxzpXmI5?y=D(9w(z~8|25meeN4?b7C(R0lNBs}`a=AgD82e+-AK34e8X;@ z4t$yaapTX4$N4|%r%v8m{=-;_IzP;%GdMMPeolbsa!YG%mtmqfI9N5L{nYwvYxBEe zML`Yq7-AMySj+Ya-L|(;>7-%Jp5L-73KQ>~5c79ziir3jxUXJIn6TaE8^}I+=biRd zjh>$OPDw(=^s&D)y}fFOi|M1486$2TJ;Iln=AvwBPhwFBzsFVo&&0C#XM-OFs4VI2 zN*txXYhVohntb&a@!LmZL*e|;eKkq?qUwkB3@iJq{&(f?ul@bJ)!3y>6^E*|mom;a z$Xx(!Jac`^LR#Ll@0>&erX}NDQbmf<5*53ryA&0y*ZY2<WsuV3Ue^LB8BdOk*a!fp zGDnp<KW&P|>gBJDsvp$iw9sDOZM|k?n>LlpuPDw4x*7T6rg+hW^{3UxR{zo0w;-)p z!aQc*%*3j6WbUVFu2Xo{9IZf~pBC#Ipg^Yu85a+q0kojXlbsQ-v1-{l7aXayAYR^u zM(}l1{RuftVT#pqBZ7JVeD2<1&Bp3JRnJt+)(o#~s$27m)un`zw($dkyyZFLTC6LL z+nU)aHsbuP)?buHKfT?QMzhn>;y>DLSW&YiLUlJYW?YnFedcX1SDD5)PTYK^;Se`z zm0X^6n^K$0yuCLEbhc`R*S09BWrdk<PRw8_9jex=Q#$)rtB}Th$=*Ic#roIp0=qI_ zPjEv{%9$@uWu2vl@WaA-=CMTSTcaNDANO1Fc<Y&<jawXg?Q%OGbk4-EZXa~m`QhxM zcDSLuNFccxZ<H`>_0-QaL+3>Bj6L(+8#mSI^v><EvEj#xr<f}|yTDAwsrMZDyryRS z+<>j`Ve0t$j%^*%(?r!R+W{^0I_bi%mVg8JxxvjI*19fc1Y)~J0={dwNU_6iwnR6N zIxnUWb&rSGX3$zl$G5S9&m7dnksQ9JjN>FEbx>#cnWG`&^b2iqJx6ssM$|<eD9QIw zlkqFv5kHtIi*Y<qY#m`gGGtf{5qsr9js<ntq_)9a8Ta5il7l*Sl5<5x##!KrYPHkx z7%^USIw1KElx2L%dc+@{Ba4L-u|mRT&}5kM2E<>sfgB4u^^n>XR2g^RGY6fZNRF$b zjFaqz^!yd@7%^USN+bD^@-n`sH{z$t$zoTC*lWV-Qp}*64|)#{vCOf4@;`eHPhZqs zX8WKHy`Hcmgk|y#-~&QtjW6QpS>Q2zm{!0TZ`Cjz!bd$FsY?-|oP~t-C#<vCYz@?K zk~u=t*%<0vW%}4-H*tj|H`)*B7ZA3cu+hBP8mOBlbCQi_W2g(4>8oR1dE#gNN8ccQ z#ztfv30tH;TLYaANc}SIYz&<&Wct`^pjYx)-}76fD<*6iVY@lAHPC5?)bH1sjbW<= zc1n`z%LAZ&@3VfRKhl5Y&$IuJmJ)j_LY2Ih2V?tGtXzmS_K!t8@l{4ywgLrALScX% LHE?Z$T@Ls^=x^Gw delta 4260 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 diff --git a/UTScripts/References/overlay_center_natural_asic_UTbV.root b/UTScripts/References/overlay_center_natural_asic_UTbV.root index 7631d8e0a9dd091d33513d4a49bb100311e300c0..70dcb8bcf44f63a0ef0c94f300d08c7c67dcee7f 100644 GIT binary patch delta 3613 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 VYZmN_zGg0(=o=VZxO?eQ@NWhNOYr~z delta 3579 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 IO*6p%0NaY8+5i9m diff --git a/UTScripts/References/overlay_center_natural_asic_UTbX.root b/UTScripts/References/overlay_center_natural_asic_UTbX.root index feebcdbefe632e8392cee2c3c8fc2e71d62bd0f8..6339d142deee73634808235ad95d6edb05cebdb6 100644 GIT binary patch delta 3206 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 Ys@KrDj{dL^&2_wJ=6i)Ff0G0K1*S{)UH||9 delta 3329 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 diff --git a/UTScripts/References/overlay_tell40A0.root b/UTScripts/References/overlay_tell40A0.root index 8b0e84e18a41ae474fc61a8cbd57455518a7c54a..d5a1f5069936f0a41b84637045c34e61c2fce23c 100644 GIT binary patch delta 13628 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 F{Rge_3>^Rf delta 13466 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 CMX*T# diff --git a/UTScripts/References/overlay_tell40A1.root b/UTScripts/References/overlay_tell40A1.root index ddae94730798c8d1d05d68e5032192d470ce1c61..35b4ba589196912fb0bbe6ae484d8f6278d602ee 100644 GIT binary patch delta 13774 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 delta 14150 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 BK>`2( diff --git a/UTScripts/References/overlay_tell40C0.root b/UTScripts/References/overlay_tell40C0.root index fa1e7265cb95771f1eb8a3664e6d72f62c83da2e..374014fddb050ea1f042579a48f3bdb8c32f137d 100644 GIT binary patch delta 14250 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 GLH`51XL@}A literal 111196 zcmb@P30w``|HscITXssyR@TTadz2(e6s5=>rAU!%p)Se3lO>@<n`}`DC0n78HWA8B zNtTLI{J)d=-sid9=iJ})@7x#NX8N4-o-=3Wyl3t*<Kpb>N=UI9A!IHQg-?V3t>E_& z@LvS~$1A`OTO#WIk&u>6iKtJT0|RPkHZ55D{?ux*Vr&8YRnTJ#;VLp;+B>No8CX&C zT&`R#3quD-TV>~Ewl0pdSI%^`b#&D3J+gOC7jCI2vq>$k7Wl7D$U+UMWIX(@sEvpW zO8@5~F0WV;{fZ^&U$G>gx$?CvOdOnS|Nd+=LfsK2)R)-KTWIU#sz=ChQnMloNm3W4 z>yjEZ55gP~{9c2b`QHz{L6Z5>SSTa1g}+q~tNTS#eZ?<0O~uv(?6YcP^`xl;r>R)z z`Woid$JUkR>haT5Y%Rdvt3I|#B`iNp#nvXICb#=kuW$8~Dq;C)Dz*+_FI6AgvJ#e` zredKJ6na%3+qx2#pQd8#0XDGuSoKO+ewvC^gdwX<^|9?MVfkq)wmx9@RUg~25|*E) zVjB=r8_?C=k~>$z^3zmoL%^=9K3205mY=3#8v(YY`q*xju>3R?+nA6#i>i<9UJ1)j zQ?W3L)p=iiY|lzqewvDH3htayeQfVaSbmy{Z3fu%>SOy<!t&EpY;!{DnN%O!w-T10 zreZ-A^=?)l+piLqpQd7!2~iwUeXMpREI&=fwgBw;>SOy?!t&EptO_CZxgn*RnjcUJ z%TH6W;N$wos*fF53CmAYv8seLfE8Wc)()zK<)^7wI4x<gz53X}m9YFY6$@uT4dI}* zx~=7QhJQWu_-QH@4tg4{f&$gtq=x>B3BT&`(^M=R&@}v3eXLF;EI&=fwk4#IL-n!4 zDq;C)Dz+V9bE=OWUJ1)jQ?crVG`6ZfR<{zCpQd8r{J8Oh>SOgPVfkq)77l2ejADQl zOL6t|{!UY|9RPc^`dIGl?OzW)ewvDf<LIWG9ILtCju8I~3i~ZTO~rNsY-shd`chP) z$4^tSaQNN~HmmBkR$nZ|)#InB*e-xQSbgkBDJs$9r>R&_d~-NNuWoBcilw-E{4^EY z6|ftsk2R2@5<PyJiiMMv=H(2qVkxek!QW{rR*MiNS13}=9f%uo{`Jt~r>R&tM^egz z0@cNe{{@BpcGTZ#Dz*n9$~M)<8cI=#9zRXR!l{|^69(A7twXq;;ooU07G4}`VOD+Y zXaxR!*5jwCSU4kWk-z{emg4G-{yR;@!Wp3ocPLQJP0C1$O7!??Di+QNRU#N*|F#a{ zdPaYzsaTL+OYVh+YPNO^0{=ei@zYc+oDsGRV1N}%arMUhou*>pj8GL$NUGafV<{@p z<EN=uI3rZu%>etibqLop{yR;@!Wp4j-Rfh<BJl6C9zRXR!Wp5ON42riP#BXdEe8Bu z`VAR4BUCG9hLyY#!((w;1`B6|trjxF>OoE116!+CF;($Hy0vgd*y;_;uik!(wM*WJ z!M^1-o4*ffESwRxo(g|pgl+PdA!#i?4RfWja7NfVg&kI@5|*Eq!GZ?ba3dL`*0!vK z<)>w^a7NfBjvcmjB`iNJgViIXE%zc4qt>cJRq&AXt$M{I_d~jG;nb|{8JNom+x{;` zg5{@Wu=<3wgVQfoSU7>?9uh1+4YQ<M3nwe>d|@u5)^_Hg|HAUqFiRQ>XASDjVJ;)A zCI|f&mY;@M(pWfrSKk728DZhvhI>d>GCvKoq_J=uts#QBjIiAC5j-SVei~*;W8r{S zV+G7*goUGh?jgbQ(=baKYXsN=n9B$Yhuz#mg5{@SmNXUy#`bnFmk}1<h(QDK(=u2% z)@uKp9Twk+K`cKlgN46$uwaM9H)0UWPs?CU0Gr4T3y0m@L(;eWG|ZCj+i`?+gaMLO z-{KoF*jj#C20I?G(d@AJMhs&4X&J03A)UCboY9tyZ^R&$pO(Rz0XB#o77n|)hoo=$ zX_)0!@p&neiqA{+<URz|xh>3{t6-t;yrSYqJ@`d^j^pelOY{galKr3*_c5u84@%W0 zHAvH%A0br(NH`p$`*586M?%tMDAV~MQ!-D|L-Ic!k|x(Aq)RiVWHca>|51@NSpmq~ zn38d=Bbk2&hBUbrA)2+Bk}DDQ{t=Qi8K|0KresthF2O%ek|x&yaw$_XPm*k5|7b~? zT$hlpu1v`&L~QdvW|Ah?1M+94WOO2u|B;h4S&@)#_DspBMI`^@CuwqhAirWtMl&M$ zA4N%%8xW#3jVT%Bh~$4PB~5M!<P4@{^dpl05tTH#5h2|{Rt$}SibOKaRq(b=_j^pp zNJ3ZPh(dE!6GD2xNfU!MBN<(VWSXm*0y&l`8C`{BnybK&J-ME!{*eK;8C`{Bem*dy zx3K0w4rfZnB|tL&EJIczq!*WE*XBw@J({bOfgH$`jIP2Zpt-6AA-&a^lF?O2rnyQ5 z$UaQT=qe=BT-B10KG4?;`x#w@WSXl~fxLq$8C`{BnycWQj=peQ!m!QgDkRff)e6Y# zn3B;|NT#_8Ufk?k#*~b%LNd)&Z3yYNj0qV@=qlW=X|95^xqe@mlF?O2rn#yeA=>kq zlF?O2rnyQT$ZwdE(N##Mxk`hO{xg`8(N#$1`yUw6mTV8?Or~Vq(vZwQ%aA(|GGHQ8 zawVc3%~h}u3`k;1Mpxky&|C#?4h%G8N=8>9ndU0k`v%4_C8Mj5OmkHiLI%MbnhcDA zTNb(s$uw8Nen03UQ!=^=$uw7WC1fzSwADWX#5SX=kW6zGj5vdXnUc{}NT#_;i;y8O znlNZH_Aj~$*E-ErFxCyJc>k-~uRbCfU4>+tt9lSJv<1^PqpOfia}{hCLw7MHqpOfi za}|7YOGl9@8C`{Bewzn|w5wnX)LGAzjC&W7`E6W=4CA}bZ>D72n~+R%6^!r0Rxl-_ ztB_1{6^!r0zA+`EtB_1{73_t>9hs8RRY>Odb6`ksVet3i@0gNtL_sqDEJKFzU3V5! zawVc3%~deI>po>lMpxky&|C#3(X(JmMpq%3<|_DHm)-*=WMeT@1GS;6@C`betKdjz zgb@^|{*eKa(N##Mxe7krHR1+SGP(-MG*{^mq7VNWwi#W8WSXnsGhX_UOv&gfB=ZIV zhV)1>oRE>+7|*Vsd6MM4SemQglU^f3nUc{}*k+om^awHF_5*fpMpq%3<|_ESm%&k{ zWONmhX|B>IWK>J0WONmhX|94#eT~|~l#H%IGR;*6gcvqpO2+XT$uw8NXTJ<LFeRg_ zkW6!xAtCTlESB3gx(dlOR{?gk8xwLx1ODZz(PFMeM33ew@YLu+2vmQ6Ml!kz$uw8N z=fI4dn3B;|NT#{U7|0)(lF?O2rnw5XgE2Nt$>=I1(_Cc&<Y!FD=qe=BTm_#AGqz+( zMpq%3=Bn{PPG(9*S0S0^D)?mBSlG%K?p5e2B-31F2IN~z$>=I1(_A%y5ED2eV%TPM z6_RPLnh4}eOv&gfB-31FPRKZ}XV{IN=qe=BTx9{|Fs5X56_RPLngo|!<HmRfZ5Bf{ z|8f<$sA8JtDi}q^`$2*o8C`{B-XOq`KGL@$#8izbnI}oU-bZuQWFYTjN=8><n`y3^ zLWo%-ret&#l4-882J$ARWONmhX|95=C{3url#H%IGR;-ffV`S18C`{BnyaP*xtJ*# zU4>+tt7Z@~aS>B8x(dlOSIq=+E>kkP3duBA&4No|&SgqQS0S0^s@Xt(!IX@yLNd)& zaKvi?;~2wn8(oEDnycmjIfV%sN!)86@Q{2zn&v9#<4JJL&7jRlmbgmHEdbHeta##n zNW01w$nh|@`j$j8Pm;8m<|;cvEcKX@C9V=fwa{jotL6duG6dMQS>h@&2PV|dtlJY} z#qIm-$P!nHIWVDq4$uL}XCT0iEOC{X0~6|JE9Mh2ncF7VktMDYb6}!JbJYSMABO-t zvcy$l4oviDu5u(~N^1zPBTHN*=D<Xc=BkB2-VXtGWQnW99GK|QT;)WFbrT4%BTHN* z=D>vdew8zjw?Kd$S>h@&2PS$nSHbbfR0RmIBTHN*=D_4%mp_mmw-*E19Rk%S<9@8p z@qmbXSNp%y@Kc)X0_2}CmmQfWNyxl4WynhinFe%*Wb`w(ndWC#Ab(;?Mn5B&x28;+ zml84^Ov$j#=w~F;{JadvIZVmuXC%}7yqu63a8}2#&FE(&^VS50^tQbM$Z1T;=w~GJ zdz%b-B_T7%GbQ7Gjb#2=hU^C9J50%yh*UqXB4n06Q!@G)mw@JHICq|Pl_?qhjAWXh z*AOzBvkSY?6a9>2nxDZIv(GUlqo0w?TN4=4dzA+vHr&3?uFdFYB-8vX2J#7}Wb`wV zY3Gt_37OND2^mT1P#ZjOZ_=arc^!}sLa_R48_DQr+`DLg_5^4%reyRpl4*Wk59Do3 z$>?V!)BNlOcRi`il#G5xGR@B$fGlQ8Mn5B&=I4z-E@etaKO>pu=S_sz!Lb;_Z5#cJ zWSXBh1Nk#kGWr?G{N4r(>CtlwA@l5+l5xLAGXE??-U{SbOv#mq)bnT9m+hx9C8M8l z321)a4&)4`Wb`wVX@1^8h=UnZGWr?GG(YbI@;#<x^fQuae%?jMd;_Lr^fQuae%=k_ zSSDm7sY7k>z-^l9=RJfh;FhZTenv9-8MkqopZ5YeoGBUojAWXh_YvaAjq&W-jDAKk z&ClLI4rEG3KO>pu=lyWkF?FV7^fQuqYXU>s7zcpt!<5XEB-=L4&v4x7q{Nhre#SP_ z{Co(=FoH7N!qCr1ruiAxv~yjiWb`wV`TZOi(*1lG$Z)jJu+2E4Aen!bA^QTkj48Pi zk^1`f5keL%V@gIp;}X#Pd=$uEn3B=YNT&Ju7$J-2GbN*+kxcWmACTWLC8M8_O!Kop zAucnRkddSgwZQ|oEUKT61343d)pr$=(a*T0(fk}h$dZXn$>?V!)BJn_$Vp7e=w~F; z{CtuSS3{;`^fQuaeukq0*EptR^fQuaehwmJ=@6!5^fQuaehvomMW$r*Gm>e34k2V2 zmu0tCp`VdV^K&SWq1_D0=w~F;{Co;7c**Vi?AnZeMlwIb07Lr7APmUhXoh4Q%aF`J z%aBhKvZ4i3awQ`5{pT}4-o=!Re#RxB`S~m%D;1fN(a%Vx`S~1>*E1!fpOH-S^LZfu zW<oX+Lp9)K^@=AVxv2whO_(daZHL2*6)?B@dliz=&+r`+?t$OjgkPn}7huLWn9Gig zenv9Q&ld?<<;awbenv9Q&k;a=$CQkIMl#LMk%X+C#gvSGMsjzk{qIA%pQC{M6#l@j zpLvpG+ot*X5+Q3Wn3B=Y*k+oaqk;T@DH;8YWSXBZ6XI^fl#G5xGR@CdfP8}~8U2i8 znxC%{;-SNojDAKkKYjy4dfScxGVEClw{0{9l4<A9@M^1=+a}oURp@6V)BJo5$Z!<M zkc@stGR@C%gskPpcy?_@KO>pu=j%X*S1cHik)#f_!9#NQBbuLKk6PCfg4J&`k|ll? za|=NC^GzV{fdD(Q#Lr?5O#fc&EkZmSK!6=t;%6}jrhk6>Hjp<!fE`)lXE6tsTz?&Y zl^#jr30cnt*pVfE7IXE|Kfj#-WH$(~BTM`&=D_sNZ{GoOAq3cwC4LrjVEX5`?-JtW z1OawriJ!$BSn|0~_*J@}?*aJ(%w<QG_*o3q0-5ILL_#*$K!6=t;%6}jmb_O7ze=|` z3CPc2E<3Ws&tj++$TUCSCuE}~1lW-!ein0J`scUd=x<{(1lW-!ein0J`scSF60*q{ z0_?~VKZ`jq{qx(<-c2xeGbBs=Eat%U&u>2>Wb<$cFle)w1O0RU%&kdon&#&eAj5eE zLo)gq$-FgzA-z|n60(Kc1KG8iCrNIN$Xio}oCf4DreyRpwwbr43^|>Utz4E}o6*lm z?gq90eMqnE3?Tc#AJ~z3l4Nc3)&zz$`7t5e)R>ad&)8<(nlj`}An#*J=1Gz^^VXCh zKOtm$Bc^2ZGq#y_{tT~FY~RF`jDAKk&Cgkc?5M$%jDAKk?fe<sykj*}GWr?GG(SHF zaxqgf`WeZz^XC_Y>|Df@jDAKkZ%trG@6Xvl&SgqQKO>oT{+vU|uDMLf=w~F;&Yxcb z8P+(1(GyAPP#ZiX_tT~M`4u6%CquCM<2I5deim~JKtF$e4P-bvU`UquS<Hdy=g)5l z*<%6$c5RmUS<Hdy=g)6}91j6@WQm`}9GHIo{Em>ldJteo?#A(eXe|EwO!M=5Aj7M! z49OBd^JJQzKM=By8}Hb)S>k7&O!M<cAfI7MmiU<`)BK!Eh&Q)Quxqo#&pest=R6=E zXG)g%nJ3fy{E3kLt(lS~e&)$EKj#B^KU1>A&pest=g)*3Xu^~%@iR}R`MChdTbPn1 ze&)$EKYt<QpaN5}#LqmL=I5_Kc4tB!!IQ9`^`TaHP(Nqz4ah$sQ2qTG$=J_GruFl8 zLJqkwC1XD$nbyyRK!$yqVVkj^kxc97B0_xZn2-&`P!04e_VcKUNqRpQ133pW)$eBm zF;w%<7Nv(|T0j3F<ghgqU`NJ&Ml!9RVY@z@#*~cxjAU9rmk{DRo(b7d4AsEe=Eh>~ zc{Km5^!FKlN}t`70{ITit^V3ZGEb6_TT;ls2sy%S|Ln*-NkZlv{P!W<<}x5(g+H(( z^CSsbo#$3w+vS8D<+jG^lksR5&oS^Alt1zZhIE^M1Nj_NGEc(m3{kJK^oNjR+|sgZ zGoE8$oB4H7xy>S&aqI+BGOl$b^UpG5K>M|2O0GntU1Ld91IP!NlJOh^m!LP){`VoZ zg^6ks;@=GZz^<Qpl4J{`oMVXK7|eegQ!<`oV4L|Pe_%+rxfUVEYcnPDBuSeo=NKZO z9v3qu<2eSlnLkpHX>%PQgEbiTGf$GVnR1RHs!K?KD^oHadt#d@$0VY9K!!6MhHb`U z5+qZONkoc-oUms~#$ysBQ;tbQ^@03~2^mS~DjZRGg8)N%uWCTZ$!Sc<JPAilnyW+& zft<mVjIP2q(_GbvkU%r0WONmh`CgD&+l_&Ik0}}Z8_E2$47mv*K?Y38m58+K0g9Re zIhH9IU4=_Pa}^jenA_v3Z%JIs=qe=BT-6-N;Y`WsDkRff1!n{y+|sgZGr9`NG*>AD zIglwCU4>+tt6C5es?L;*u0k@+RVqOCVM<0<A(`eXIR82Yea*0+(N##Mxk?qtJD8A> zgs#H<n&v7sLc-v<gh88;jIKg5ZxCQeTe209*D)odtB_1{6`bvcl`$owtB_1{RU1N1 zFJnr^Q54C1FUYKIIGa2Dg((^P8_E2$47nX4XXY~{S0dt-CuPX$Kz_rNjIP2Zpt(we zkh3$GlF?O2rn#y;kTaQ*(N##MxvB#p=O!{GqpOfia}|tr=aQI`(N##MxvCQ(=M9;X z(N##Mxe7+v^Knec=qe=BT-Ak;@F7gd*uUs1T<bJf!T272ktrEng=Ctmx)O4M8}F)r z1c+@$S0S0^DwuyEm?;@ug=Ctmv<SHfqY1+{qpOfia~0$+`Z6V>tB}lZ<G_$UCh0*) zL<^>5+?$Y0JFkKzjM&ALjIKg5%~ib!iBx1tMpq%3<|<e>k?Wa~(N#$1_cmZi_cN@U z$lpxKxL+fgf0iM`x`|rBlw65OyUw}@)=ktmret&#E&<I|ux>6nG9{y{kW6zG{Qc59 zCS+qVR0HovqN~PMOj17+CxUeoJqt3`HwKc?RY<0}3f4{ZQ>J8e6_RPLf?l|6!IX@y zLNd)&gMs{jDH&abWEh|MhxAASM?zPOn38$Y|GF=*Xef|xFeRg_u+21A=@4=i{xjUR z(N##MxoQ}YBbk!XRY<0}YB(V=-1=d+KclOVOmmekkVBc0(N#$1M^Ru%Z`*o=#B$>u zyEfx^jbz>+GUO3JKFXAgu0k@+Rr-WnYsr+1u0k@+RU?7ChY1-!GlQ-gErx2rU9|Hm z147~&K%n~ljAV2bl4-7j&lSaOU`j?;A(`eXLqe`|D}`N~(N##MxeC_NbvLGDbQO|m zt^!Y8FJwwaS0R}<2r#5ak}-tbaAHbES0S0^Dq|pjU`j?;A(`eX*xzs3FeRg_kW6!x z36P&LC8Mj5Omo#ZLT*_yC8Mj5Omo$EASW{=qpOfibCoF}w_z(|IFg{NkW6!x8IW%= zC8Mj5Omo!)LgL|wh((*lP|d&2t6+?(n5MaEB9JdZg2A{gmLf^+&dVDF{wO_$nG=%0 z?SbsbJV`>Pxyk~_VNA*BDqPz%S4|@14%ZXx+KjG3GR;*mirn#IN=8>9ndT}hLhh<D zC8Mj5Omo#_An#*JMpq%3=Bg=#+-t;?jIKg5%~jSw-o%uQu0k@+RZ|H`tihCwu0k@+ zRnvgHnkgAwg=CtmrUSW{DH&abWSXmH5R$ZrDH&abWSXmH0y&on8A*6vWh91b<(yZ| zBIN#D2vmRcL^5wh$=!K1Iex`M+EufG`~v2)Bl9E)ndT}u;(Y+)7(=qeRpN?<;-_q3 zLb}a!fSkgVEO8Z2rnw6G_@N0?vcy$9ndT~6AjdN$OI*d1X|A#(Bw3FsS>h_5Omo#d zAYW!mmbi*1(_Cdw$RloyXSY{LT*Z@Vu5tkK8Kz{3t9UZaRr3i+;r4xYZI-x-C(~TD z0LaIgk|nO<$uw6v5|Y}QDOutwo=kJqLLl#FLdN}A9cqIIenyIRT`7?hA!$t@Sp9xR za{CJKKV;sTFjsoqb_VhmreyRpjwrk}Wyp&NNmpP>Mn5B&=I6ygc4taPKO>puXBQy< zWJ*RqBbm3R%-UW;NCwauZei$WB-8xt3gk~r$>?V!^V_^ko0k&u7);5q&A4|VnSYic zF9UK8Q*tFD?YfVm<%DFySslYRqn~jJXntM+<TR#a^fQuaeqKq)lkrT+=w~F;{Oktg zJ50&wXC%}7yo!*g`b^2_XC%}74Cl^IuQDa0pOH-S^BO|3xTUPVC6S~KwZQ}TCaRyo z7Fp*Y$c~JD#=VQ?XAeT2abr9?GWr?GG(U@he1a(%{fuOqpVt!dye(5Q`WeYIKd%Gw zL8fH%Gm>e3_9Wy*Gp1zpGm>e3UJvALOv&hHB-8xtMM!pSreyRplKK4{7}7_*8-Ofk zO2!cd$^5enc_WZZnUX6J@jjC><V}R+z_A#^kp%sWOF;AUW*~oNN=82;ndav$guJw8 zN=82;ndaxMKz_xPjDAKk&CjqeznaFBjDAKk&ClC`oWX>QBz33_9=J_Y{k(&a*Jco` zz9o^2e#UK_=I5P2zQ>e|env9Q&$|eDW5AS*env9Q&%1#f%an|MMl#LMdkA^UZGG(e z8U2i8nxFRqIh-jO{fuOqpZ5{+j?1!ZGx{0HG(UR-IglwC{fuOqpZ62;UY#i!{fuOO zKL>{Nk--5V`!FTrh=OGPS%wV9ogb8#k}DDM>TNRQLqLWRl;IYJe#RxB`5D&q$GS|( z=w~F;{CpV5aJ0{`&FE(&)BNlU<T9pY^fQuaem+7-?lLB1B&kDf@W3sL>gS_C{sO`3 zk6}ngKjW50^Ybx6^5!!oqo0vX^Rpk2-!LVkpOH-Svp*r9W-ukApOH-S^Kl?&G9{y* zkxcV*03rDknUc}ZNT&Ju1dx-MlF`pdruq3KA)gJIlF`pdrujJ#$Z<@`=w~F;{2W9` z!4Rfo^fQwA5e692M+U(_zQ~k}V;Pe9XBlz`Az!#{g5Bs@iAcL%uP7AA&~Aog^fN92 z&CjO@`O1y)?AnZeMl#LMVL%2)GbE#*kxcXRX+plWU_v$$Lp9)K^@^wed0$}B86fY1 zZ1vYRlF`rb-2?7{-`s>>rT40{gnU<ox$Ma3XC%}7d=AL#nUc}ZNan36)8_L){>_xk zlO*@ZrTICWkir#A$>?Wnb9boy??bwuF97)){DECR^CU@|X@0&)NRcB`GWr?YO!IRD zkl!&Sqo0vX^K&F2#j}`_(a%Vx`8f*6PnnX@&q${E`4S;NESQqf&q(ISZ(vAo+tEON zz?6)pKr(Ml8S-U9ei|_)qo0vX^YaxT-(X5cKO>pu=c|O2=rARtpOH-Sa}1DS&tfo! zAxRx-gUA26FR%z+Z7t>Y{pydNNS63n%q;-j&)0wqM}Z8<5<iPMF#UV6afJNhvh3O{ z@v|7J1v1Ug*MSVLSTH0@{4D0c)cYEVV2>(m2?2I(miSrBfvNWe7TpB$9tf}_OZ+V6 zz|{K!i*6B8-T(sZ$Pzz`IWYCUz@png-T(o1WQm`}99Z({OZZjV81aN~2Y?L85<iQ% zdL^G|fnTM`2|#v(x$N33@v|7J1v1UgcYs_70d{1GpT!(l@+u_!D&6M0g#2-Wx$MXi zKZ~JSAk+MO56B-Nz>X~OvzP-@?+YwSBqCx10d{1GpT!)QdS75s5|E!kfE`)lXE6t+ z-WOPOpNK@35MV$SbD)3DpN%UfsrLmIJpghtWZ03>&q(I22@L6N`ymn4;4<vU=w~GJ z)|4S90~y9{hGg_Jl4*W^L_{@*GbN*+k=zYx|ND?$+bKYX^9+V<=1G!!<nq=8hBP^q zh!nVymR&!ipRvunHD$<YKn`O{Mn5B&x26m^orr32+XTBdqo0vXJAcjqvL912`WeZ* zHGv`B&yR_ywi;71`WeYIKW74YA5${=8OgjgW!n6Ni0U+AN=82;ndaxGK;FcZjDAKk zZ%vstXAx1|8cfOPXC%|kpPvDFHB&PB8OgNs=jT8!W<o}iI@AUa$z5A{Yr-t)z3K%K z)msE}t3Q$;S>k6gR0~T$^K&+kb0NTvEb+6L1Jlo+bBIWBE(F+-C4LrjVEXy<OCZ01 z06Vh8&teWtKYxBjMD-^_fE~G81@NCOjOORpKu%#wmiSp*u?Tqg8JLjXw%-s@0~4lX ziJy5g&ChRv9M6<2@iR}R`S~3YHPmBDmiU<`)BOA%$ndHw!!1nWXP!*+^9Leo#CeU~ zwk`29Pp0|#BaqK9B}@FwlWBg=C8EaMzR#}B5<l}~nxFH4e4Hs+;%A;r^YbSnYSNl1 zS>k7&O!IR-koPkokKjqz&-zd+JgBded?uo%O(0PHenv9(Gm>fjTma-POv%{KNT&7k z7b0q=z?6*rjAU9re+9BT6S9FAs)2sRejZgZN$=-xK>i7t>i4sOxB`V+)c?9Ku;@Dx zHFsf3#(u^&)B3p($e);!v7eDl>*pdOQnF)0HWWiO(9hgH$~}+fpOyYT!%yjBl42m| zz})KhGm?3dgxr!s{y{{_)=bGfNkZnv=D!c=Hva^28vKD>n|YFitj=>Quk8{dYB9bV z<i<5W>Jd@{`W26}@t6dUerd-fr9i&Jgp5R7+jwk3Tid^gNQE2c{=aMcpElQpTHv9F zTNrNRv@NU*$XB62^~nZesODd59rtH`t;3(Bx3F>|YRQc{?8w-^NT!|L{08zlrer+c zMl#?3GHw1tM5^3UvTJj1s0|(xV^Gd9V0RFyo`4`bGH&D8X3AbwLqtSsZJCmBZ$h#* zw+6UJvk3%_LGBtY?VY4fG~t~ak=j9+J-3d<$k|TIW-qBRr#JkwHmR%Lj2PV|D@6Iv zO}9;dKRw~)<9_4kPFWY(UVnn-?75@7RZm*38$0s*!-O5LO}33_p>fi$eN$0SZ%vCH zTg3{O!<uL*G;3z-W$<Lg)c!rDc5k8VJ<ay|x}Fof%sNayH``O;<+CLo5A*JxAG_~I zUak7sX~Vz2P}ThrQ!w~Pzl4P1{IuAW(MNoq>aGr2lb!aoS48=;;|rbNNBxL2U+CQS z;h+2MbO(7nE6(=Ob-R3I_2-P!&Tanm$<B(@?dkZg-L+p&dO3MGCVbDo^?T~jIYSRV zwTv#g>FoRGmezZZ&+k6A8u)wG?`+rd1yL_n7iJtzUE=KPk?Z~4blkO{XOETs{C!O) zHOjOs`PlGpnI&gU54XGeb=9ArZ?8qfl)O20c815V{6DdaN&~V>q8i73nVt2~G&X$A zxdG+Bb)!bVGhG;!l{Iea&Y4;DXa0USx@Vi%l0G|~XL$S==<zeZ*Y97Z+1Bn~&mZeq zmf-XyCNd$`wPaEG(!7VJx<&CN`3v1j<6RCP&0gb`Uz+#l;n%CNSy`J`p1$^VX8zg| z&#b5ztH6xmMa8RsJ<&S0D!<>g%g@^#n_T?)VRzkjMdi8$ze<)Y&;C<XH|ojClU5IB ztxO9!Qug!P<X&q&M?C!fv}|&hne)5MEBbZd_3V<jT}*o<+$vriX&$@Acg^zOms7vT zd|#6_XMSvcQJ22uZ(I_-wM-nHYWnH(LF-?;--^zzDgAyeVvSR~$;1BSd**vAE!h*$ z<*Z{JkM!c8$f#>NS?w~1KOO&cLF0pk%bFIu&;AvndbPa$iuZ4vl8*f{89MCG>IM$^ zYah>CRi1h*`@x&@%Us;o{kfoX<7GdO64Rh#tFpUz6h8S=_DlEa@GJQV-{&=&y5L&h zKa-s-(^kYB`TSdat^7>mOI|yM<>XH~?de>u7oYmP-IwJribPfq&*}PEdDXeJ<jSAt zLkq6_8a89_@;{$e7q~`wzWixbaNo04Lcyg!U;i9azEqNMY+C0zSAIM_YkGS6smG<x z-P^4C{a{)CpD8hpQA2;MdUo;kt%#5at;5ARkvau7r*}?!-E@Kb#pTboZ48SJOmH^e zzA@}ay94i3%;1-emX_R4EAD6GGhu3tr_|9p6+bfLkoTn58hPg{evYh|^Mw0-!LK9V zGZ%(_-Bt9nkNxjO@XJys+w>K8+-xd-x^O>B|CTDd$HjJ6)R0h7|IUi~O;2-_rH#hT z&5S)zuroD5^U7%m7FNWQDt>;d`1y?cIqBN+j-|ui>{_}uJZpUaw&8(LU!Miv8#($c zgXMcQG<ZPziX`j%c{aVzjy<(9eTDsu1D4-8@QwL1`nSDc`Q2^yz_#H%&%Wb|^*@_< z{pyTq_o0E`-4^#h3(H}}r4L5<JobJLt#E*OJExpl8KabxXV3lp{@<r5y|97<%K@9q z*L_(n=~U0QK1a50?(p3vGkjZi;^4hAQ_prv)7d^cEX3@4-?ri7^UpcKI&taYe>7l0 z{gL|@)Z<!zrqj9kI&-7<$8jt0ob|7YSqH7QZ|wfK*<@(t@QZFc;ORld3Omzj1vfEm z?5v84)<QQVMkqjs@nJ!KICZ8+VL_YzGs3J6ocejd{d>`Xh+-!XQnL1KW4|Bo5?yBO zZ}#Toq$im+j|b*I>ebNSTH&<&++fWSd8%`RZN(V_Mp|WBINUXhS!Xq;uf-+5o{omA zW?uI@v&b-b--zkC+swv!T5b&QuRJh#>#;{BlN#lAvtNI&P1@V!y6MC0Bj!7f)9Chg zRFg@Hp%asXCz^S$GxS~;s&w)5!wjWHrx$KGbFORXKGjeqolqr<lYSFU`gN<dy<4qG zUF|Kp1{;qEFdi{UQBA6B@V?jmD`!s^O*Zpe))Fc;8+0*J_419t;E8s@6Tke!)2>{E zuYSr{@9+lyNwprjsJo`wXwk(T>l!T8ge5r?BDFl1b*GyD7wqz7hpem<6MG&T#kI3C z_d~R8$ot!EqciICI5G3^Hm;@p{-eFQZxvx~k<Z48m4%g*omBMxrqbcK>`Dn$Dx5a4 ztGz~ZjQ-En2#a<q&2Ht#!X+UA&$S%xb(;jM`+~7D^itSFFYd1v{@rTb|9{MeKJy*h zCf(D(dtI@yvRh=nQ|cY(m403(cF>VewI*@x&G+sGOM1~N6gG+E86o;mX4Ofq$%6i{ z<DqBdv$Bs5T<r$7y|ST3j}rmjHyWgy_gWVmWEUEgeBsBdk18q0+|$harJMKL?xvV- zZl7izd{jU0w`0Lg|A_m^$^%9X>pyas*XUthxm~q$yIPp~PcZd&Q~Xyp;HZA1WunEJ zwh##!sYS~aDXA4H0dt6ZLQ0*Y_Tr3kRmF`JyNps%T7x2`wiSO34l*0&W%zHHhTHs& zlN1vgL7z41q@vW%!t}m&Zpa}yOH-s|-D}IIUEl7l%kZ=fRvo$Eu)mh$7Pt8u+!S~I z(?nS8ibXmelu?}YdG%7qf|2#lKfVBS(@gMhu(+}dBx!w2O1NisqOx`4{r+|h{_dc; zA*#7ub^g5y+%8VJG5BLh)RSPP9r>Evc2`<H{6E%WJJZ;&BkF$~+Knp=Ev&SrV^&|V z+E-ie6dWyggk?G!dsJU)A$Pq<z5lH=>C7?xRi^c!bMlAvfI2SzxCr6o7pYtr{;=jM zw~1vNh+Fhs84yzO7axZ-bNd1Zu2*A%xHVsVv;}n3(^b~6B~bp5k*eS5smtLr8IcnQ z6>oo-IMLL9is`^B&~)uQ2UtD#-K=37YJ8we@1F(Z!yGi$jJ6$i`Ve%Q-LM|e^eLwG zVLO9Lij;hcE<%6Hojt)+qt3$UaaMUFj#sqdKN{CK>+^u^zQ+20S06Om?tis_+O#xt zXD_F5y&~T3pT2j4wYmMpK(hsk+cT8rkMn=zGviE~IpbztRau}I5twX0&Obv*?R3{P zAN_#-G2sqbhod?kExQ@HasQP%4@>;LTnk^WTH7M!kz2sa0ozv(>~CH$<I~4>9s3P? zR&L{A^6XEqrN{dz1@}|R4h^Vywtuc08E7`ueqldXujd|T9}LMbY~()lj_Q_(?GMcS z;Gc57V}X{g_K=Z%%-?P_e7mumu68$FixU3{B^vJS-f9o~XWTw*t2*?AUq%b-AM-R@ zTW2+xKKn=ZseVSs+MJk}G2ow=^k`~vui#f@iDX#stW|6N#u0hH8+cXhMoHInlFY1D z<vdDnYnm0Uq&?)oe~jEHB)P`;6w!F8l3t$X9kY$iv@dsF7${{k7=OmSOnz$jLGj9; z8Aq-kDonrsZEMV!Nggxra;Ey$S^STQK14s?v!hK=vVN%#=YV~Oq)bq0cwf>rcu7}# z*PgYO_N=x2!O3asmiK&ny6E`d*_B1QWXwrFuV>H~&j;QJo|s{A@>B4Cdh&j^h$s0A zy@x!F+2dP#`<m>5{k+%Nd50eQFE@Occ5jDE1>5hzNxw(YN@=hfPg$G>Wm231o#J*f zcLXe>{aFkDdEB;MHbwj5u3rV|(P6g5^HyhEw3>fm<o`<y<BOd;_|LPnKe_0WLc`FY z844AH`>-pAR}M(!*5|x6cDZ2>O#&_q556$m-Zi7n(u_K%e_iO$Zw;-w+XWxJ5pdM) zX=NkeXdfK3%hUK+K#oZ>C3}q>rXF{fei{UtI3zX1OGebc?)iDYI95e;v2FK}_ghwM zy)S0<8OaGEEj5GplhoMPWLU(_2OWobwRmNAj~n0rEi$Pfs^#Jgr8(Z~+-(1~U0)eM zYe`|+)1zbD6nos7@la6Ze~0cO<5s7X(m)Q9UGT}Ztph5HbmxGvg9@%$y?0W*nr)G0 zz5sn=shBWhLbCp6_|s?2O>XnY6{YP6J>VP}piQhB-Z9fyYxw>@6yW*RXny%~wTGYL z=L}V}HX5Cm)_3HQV{R8BK9r@I969#a0Rt0l#{V7bhr9P$W&vaKsP{p3xn*fSP^a1Z zpyUr_O1Wj6t3d&rjVe1tYWxig@@jqYZANyDzTCj?7V!mURI<SG#NI#iPr%-};~u94 z9|xfW|GzW=OXHHff2v3QJAa+EQg-}y%Ul-a@TOM;6A7el^_rYIc44&b;}icH<h?3< zaKLIo>8qH@=E42F4F4^HkKW_5UT{6;q*`_**3<Uq(HEhGYkoP8JDq?3TKtbyZ*`x| z{yk*;;cK5t1BaEKT)8T(IBWCspsbLUtLN7q@A&7iuKS|jKL;qTTJa<OoI}oOW9NV% z#Z|$P1!oryyOU|s%elqLUY@Tn?$;Q3x|3_p#rMUj1I@F4_}9$-QDAVyU$4#sv(E-? zY9+7TyLsq@F3pomk4AjD9W&G2=6CkDmu0CT2|cfs-78w4;^Dq(<Lk)jWm_|PwoUr+ zZ1K>N$KSPHJqd{zy}yIomAovkUaMa|Ja%na-qeQ=v+5r{H26{5gN=VS|5HELclv!o zS~lfgP@2`T;sqr=?ggdpAGsHlYFU^#EOBjM?&@MYd!en%7$-aDW(LknZ5&ssJ32Tm zu$>D}OI+cFraLO6<1FrlrfE|hTUogcKVk5EVZzs?3%eZ6+}uHHnPb=SsVg2&G2X8{ zG;eFOM|~U;HjjR@O}pvs-SakF9yGB1;pYl5-6NlmN<Kc~QL+DlsN#?wic0-2k85W= ztKDV$C_QKU37-;=t6Vgi*<#$aKf3ca%(I`U)@@H#kG?k+4GMU<`cHn@d)+@J59i+Q zF><bfv3=Hyun(7tyGA~<$eHr)>f7nTnP=kCCp<c=Y*WYSfNtEp&dVQ#OtuMrzt?<) zK^><dak?>m%S(gbAJQtkF#J)|(H}Z%>x8I{RPDEB>zP=?olUJqbs4@hXJfOmbsrtM zX@1(~T$|-XM!i0%W#zIV(dx^?KA+C#AO7{{!zFkBC62DSt$Usb*U#*)@%h!yZX@5e z%<a=Aw97y>g<DSsl)~$EUwl8#pH;FVZdg{-m50-ldu=fK7}msnT>JZd_S`k<Fl1so zjqTf`6Fa>AWf;HRA<DYzU~kpcQ)bk()LHg&^!-_5Hbk}Rl&7>rtA6(v2S%w4H0j%^ z&QjwcpUS>uTz&a8{#?73_0O2sTi;~Z`~?4!j7cu1Qf;;BJ7gHR>FzkCuCyVl#Q+rz z-S#V6hU^=#bz{@JH{F`}9ZpN_ui=!l!gp%w8KYX~z9--C>N_KIerWwDkGdhhm(S5M zuJ8DBwBM~6EgXEGgk?5=WbV}@rZ|1ek}LD4x6IZ$ymi9cB{#cH@s2y+Ch_L<sppp4 zI7c_M(2DJ6e%`ot_YPXOuHJ|+P@8wQ&u70KhtDVY#%1@<SE$|lUZ<Olll*d9jXh)4 zOyBY5(bl^<Morwi=gR#(S#4&IaGBt#9NIr{@t<1H8b3N|*lN^ck$to0J#OpIII+06 z*@Z=#ZedN1KMXAP$mnrpM!Qw(+ON5-YxMJC)U&?7!}4|?Y-VFpOUrhw&Cf#R#xE9a zTQI)sLGPAh3;PeQT`$jg`^jEM=Y1^LeoNuwg7GHno$6g%QTLj9>hp9>kL#^2Z#Z_n zjeY$#1z-EMOFQ=Dkf*s)#`BPQi<Z>+yjK0ALz|NLpxs;B*O<4c=E|Z!R&DP1+JqYQ zZBlE%BY&gu`cr<dH}6?+qVY|G12KjPUq8-lT(0BZa^askrKc38C%ivme!Nj}zh&d= zEJ(Ti+2N(l-T3u={ah_KdE72fyXBFbsrh8^t9JWc&JP@=Ht%t!d%MT^Q4a&>g>QXs z8I@C9?x?R`d_m3Z@Piia?{e(7+q!;vVmE$4O83oe&i=_gTdy$q(sGs0UaK29IqYk^ z{`&a5Q<v8IX0&=1>wIB#ylY9}`x(ow`pw_}^-VxPs(a3%+i?dC&p9e31{So6%v1e& z%=uv5l@ENpN0ps&@E!8=X1lWC{u`!de!hFYtk><3MNdAKi#^7j_}VpQYWEF(ey)w{ zoU~nj_uICs6I`1PAEeyRuV?u7585J&*((~44r&&9?vPnY)4P+F&Yqnbt+spGnBbx% zMGa4$I(y;Fe8&(g*RjuS-q%!VG2~<Ssc)mr=RLo7{B6mOscY4HWG&m$=*GAKkFPGi zU(}>Y?K88-|8i38pfzW$d-_r1>`6+`XK$$y_#tfkgmx1;-d)*Vb#R{Ft8t@7#aUP! z+|qA|a!ga@(fdnE;#E6b)}E&`L08q<&~aMNh%R0VZe2U3jeQyWv6j;5(<<A2?>`!A zbbGhAQLmSsGRCgxdojFGjC!PPc5&OR+gXk(2VAdY+RRKZ>>Ivi?Tr3CcOEMbJAE?n z!xTF=oxph(K|wn|?6w~4v;N@H4{vrHzdlFpp2<y>rE0w`Cu!?gJ8MCeV^;KCZ!qS3 z%>F%k9eQ<1yOa21Ob5St3%48Ga@=94uh#Z-)SfTR7If56wRW7^q26k%On(I@_w?bN zUhFoTGa<%g)qp*Irn9}83_exVHEhdL^WA=?^+E=<|J5MZ{KnWY?=N$WA_Iy~B=4W0 zxG;BAbWyRU@tFhqePhD5Zh7O@we{{b8v+lkJ9FU1F2`~CV_x=nt9z>b5#<}Ue@c8m z>#q8wbKI)1h3Co>yFBBL47|6$je3pm-Rf%Zem1>#*R=_s^WyK$xjAs4uXtU1zjIv` z-t1H88LrTIa*d+a-41??{BEV9PF63Rw_;aLv{#YNkGw4}q7J>V4g9fk`W)3?YQe*9 zM@O6K+C90gq<6IFjoWv-C()i4^PbqhdELtM=lw^;gI3R+@U4+~_>FzOJI!6%nyx9m z`Zg)4_Tq_(t;XK-(f=6rve>(m?&h;Dn|5u~ot`;))p*0reLoKA<h4CW;qJmlD$W<& z-c24Bw6v&jm&qN=w%Zj_QtUI!vRbx2t9qc%phF3Bnyy$d)IlZY_~fWVMN^a99BT(8 z#$MJbuqdAC((S?Or7tFHCr(O?i|czZBH1L#c4M=)3%?vzSbVaR&FsBR4!pnrw){Zc z{WWjSE5CAEG0nm)>|EP<Q+7W5(D|9|d%M$dIt?Of-I-`*cdvz)(bgRia}N%;F5b54 z##y(>DUSW3Qym+9a%dBsdenDmqh3iv6w@<XKI{K_t!P!+%sAhov35C^HV!N8`0%o; z&3>KvyTexuirD>2Q?)F+_*153GY{`hN9S!$u&Z-9KQX<;Au(&zb9b+6@j>N7Nap64 zw;3Aqe)&Wk%rqF_ny2)Bf4igMHTLA6dzon{){4LS@xI33u2;0<9DBdIm%GVpK$F8y zoRezJ`?U3Q(zn;1^Tsz@zA|9j-4Ut%%8pNo+@U(};QR2Q9eSDl@ZI-#?j0=+mzVAx zvg_?W>)bj#$nnS0-47He*kqO0i@9I?)M$aJ&$(-!yC?LxKje#Qeb?Qg9q;_P8J@Mv z^+NYMmv%gzcdTey_ObqL3MLocuWL4Jc7yPzT4yFSDCn(Izj>bfEbpg}mQ7ha!{)(E z+Xtq(+KwTqy+4*-IX84sYh@SZrmn4Yt|&Th_&T@gy>mMrJMYv8aaw7<so#%1K?mQN zw+ng`xT5>mVUE`MgS4}cPbsjo*<rds^UheOyF<D?djB=OrOxoxfp2<F+M(K|kL$Xy zPF)kWz3i7>tC@?7n$J?j^Phts*B+9tyRU)mthF02**Ij>c&Kgitzq)5f#m0iPa*Fd z6HgsUJu~%z;v<uohA)%8A2qjran|$3v80^i??Bbgw#qu+_O#mgc<k<OJ1vW6jH)wl z!`D@7ayM-2+GoavGhOUrV~V5qG(Q-u|MWnITKfA(9j()$p>^)eeD$88wFBz(eVE(O zZfNHok8BsLS+&0VFPFWm%7e$6CgnYhSB#n)lhx7N#^10`;K}An{ocB-N?G#mWv3QB z{=9tsaJsA6jZvQEACC9=U==hwZFq!#uQ@^X(Qh-n!iVd&yr=lpy#LpqKNhXFI`Orn z^RLjeAC7+rf7oN{s6U6AgnxMOa8BoxAoW>K`*tsDo;tMClTZ^UtBm&J6ryk2q<0t@ zw`A|cek#oy=Qe*-FS#JdK<(IpgO|&PELHv0w_D3qox7G^SJAkoSsar&)#<s#k4^9G zye>^??)hi!>q)!g-z&S9jVyiL^+UaTmc54Q`Z*sTMv{Ji^DAgrJGif2_n}|NZRfpp zd#%&kuhGW)YwNC7EtdEny;sk!X@;7e^2fFY2S?3aHP?G$%9nsCb-wO<@P65^@QBtQ zTtA(tpXasyUP?jw`b%qHAJ*CW+pBKFo|ebHwV0owwm0pg%Gc&5fkC~r#|O?+i2U?k zS+A&cbGnwL)hW^~eeQ@GS~c2R^<TWPLw?<E6Af;6Yv8V>TAn-T+WEZf$k!^5T3EJr zwewnWw)5f_b6XE?qkQ;k{@obO^6bT-4KlX0v1r<1u$ofe77iwp`n)^+Ds0N)vXZ(c ze^N@`j6R=wu0>13)bhst2i*Exa6uzu$>!d-c1`kcDSH0=nrGJR_0O-R+pkY@u&jHb zbC&Cf6N?AjUO1$4ocpi#6T=UfILC(+re9OEFrQO!>xD~VCY)-7-Z)+(S|er9-rFhX z72k<|buxZEW}kch75h5z6MOeKwLDUNTR`^<w^Wl&pVn|2Cz{?Ijt6^%C%1ic`pm-z z(e<0199Wvs;#T;&$+I>+R&77va$flN0fs80ziGC%6b;lLvC~|s)5B@69@T!{bXljn z>E7f@T&CCdgriog^Ojz2`0|71?1FYZ0<JC}9`?x3KfUze!u@x*jr*pbY@t~8Gjv_x z&?cUPMkzMkGj@n*#oFsu-i1T1A08EYe(iLXlo2_3aWThdbg{W`bZCoK&KJ7qC=72t zd;9b8-<}Sb-adbSfSE?auBk6vwr*H9MkC;!L&H7IIv=h(W}3^|W3}&2i=6WI!0l%~ z^ZWNmNHRWm%eF(uCDGBld`li*ntNx!*2~x5F1&rRL&_knaMNwI+#4Hx4+*NXEIohp zj--b7n$>mC$s6dG;kQrylFB}pT4bD3&hfn}?H*s+tKxCzNZEtnc_X@Hd%teczUSwX ztse0m%rE^?Su}7`g!_f_I}`F-+xL9A;mW1!Z*y+jMBjF?I`pi6Sk7RbEjd@$xz-ME znHaCWX3@FdX<rxDR9<|i{`W=O+Nx#E`1#;UyALWiE_JPCIq}+*Iq>5~n08ovdkcT} zM&l<s=h!XU^R3ljjk~*N&A8t1)|efGSFRnrdAr}GM%R`%II$$UtNYT2fm;d#@-(8` zOwsUZc+#V9GhO%N?~gW`pRy;T=(X><bu0Q^n=!}M);;>r^I-*t>R)L8edeDrf!i|s zdiGv>(R+%0nx(Fj`ob8`Rz_3DhMiuSVd?n$n%3yo&r_Pbn-Xl;vZQgh#sdc1bPZ`5 z(8p-x%Q-G_#vjEOGUsGv|M^^hW=gO1isNhx-an20b+zzik<Y$-?L^B5CtIiY@V1Ip zS2%LvYW}x#@n7D57^z!+)6T|Z<hJ|zUYV<ncdj|~IH#meZU^_3*MByfzoz#%qbJrn zvGsq2de-jm`F(cx<u?{+MkMVCQ`{H*Va|}p4nsY142=@Uh4s1~I{w~pvo9O2Dvg@g z<@{Nn@wxjKC~Vx6vgz!Z)>$5wo2<wA4qyAao3@fqie8^*wI7L18oZA#G%>k(HO?Sn z;)(Nt9wv9UPn>4!?Qr3yhnnXA%b3M|+|#3U=Fgn9aA`?e>cS?q_WG+h#D9CYrg)|L z<$jxTHfZ;?yScTtUeg@^N2$BK-WjER`srgZ*X8}jE}CyQKG?o@;u)jYNwd2&U-D#F zq|YW@rDMCgq<Qs?_iT{Z++9mQJT`P?+JRl2*Y5xRdgH6_Z;mxp>t-A?b#Hm@5xX-! zF`;JeO`UpsxoLc!+-tz)+(wH`)Q(+mxP0-|#-|<`cN<r-#i-^NTg%J<w^sY7B<FWq z+-z#`;BI?@Mml%()p>pA?Vb%g0#f{IDhB6o(+qjJpnu4QsL2g~^z66qsFh~6PkgVy zFZH)9j!iLE?qr*MdG(GDu8rf4?3wz0l2OfjQ5(mkUEFoON2B{u_H!+ax7@6`p-E8r z+8Y;dME6XYvgKKmA)5}y{!-RW8(FBe%;MnDrV9#N^u2B1Gst4EPiBIT{bb*IGc|sH zo!V~4>%~g%)~s9A)#mpB!#2ALzx4J|di~DqRo2;l_f0<x`5^xFWZ>%6&khaDeGnF# zw7G5Sr8X-%|7ufi-7>In?#kz?ub<D=IpnqVZr$i%x%WCpeqHOP{owQjk7W;+#r)ap z@wnFpJ*AzE^;+$_)ArH>o2PBR?prrEZm*fey5P0*7HOT(UUYnd@vjdbpFDg$w5isN zm!qC*2WIa&dHTn|*aeoV>j!x0M)>y)viDB>-Mr|F)6<Zjo;P2Q-l<yFZqA~)Wx-!> zr8l=aw?i>L+8}bw^Re@OZnGP$oL_R@-n4Vd-5b`Ox9#2+U^M$m_n>~p`)3yVdWo&B z91|t~IK0;Dao^|(Wi57&p5a!e(b{Tl*WTO0dSw|L%xkdZ$jxI#H)a(k?cUWZC1*^d zD4VfYN<Z~Uy<(FUtE@9%(CTk*?rIz`-Ql7zVEa?`B;yrz>oirJu(Xv!@6*d#`#4YV z2)FBb;Xuw{<-%Zt_YIQc#aUaH$6V|lxhN`OxYc!okhjifr}o~H;96_-gt!B}Ka4za zYob$hU8UJxGmp%CdT2?_3yvoKMCpaw=EQwj>u>b6+ThdtWB1a!pS{N4p4w^T_SV~G zmqeYKY}L5OndTW2&UL=|VpitCpuGL9dlqcDZrozyx8pq)9}lu^Ta<hJ^^l#z6dmW9 znqOS@)yLL&&KTzgD#<M-q+UL|H0ed#tz*<}L%zgjbl6v{{&?T~Yim?bmNuX4o9{OC zqt>MS#ON_;7mRhE8V3CI+x(~P>EvJgayF*?^qsA>MLD`Sb8@80rAY;T+Z=l9^cehG zU$tiO@v=I;$;T%J8h&qGaX8RzxY|RPMg=#rUj<toyA^(9`T(`JDR=xe_vtS=8J}|T z`9;qLU2fHCdAa$PQJ<d|d)HFi>%7zO_J%~2O$ie|E%?&X+imr@hF7zjeeC}Bv1Z`W z<f#o`m^W$k^_b3Y-vNc=_lSOmPfl!QSZiS5{MgdM#g29=^-{aJBuon%=oh<j%+H=V z9XB`Hm7lY1YtphiTjDZ(XGOVviEX9!bew0|uPuG<{}j*f@-;Oeb==xM3T3gcCe7T_ zEN^DiD`kD}u1N=veAm$|Z5rbEB>H&oK0ewbqh_r<n)udWfuT{B$i1|1u#T$f(vQ*V zZ##^-7X|0s*|W+`b4#=5H*YgRbJ_eo`^~>*CG=j@d%~97iMh4TTI#oXTW{dD%;431 zkMD7G8JD}vDA#6|ebMxo{u;fLJ{W)P9iWkK`se_>3KUM(5AV3^Pwj!`?Mqf|uerU) zrM0W?>>Str(4Z{Cb_?EE&s?nADWTcImrb@mU3?)bv31JQEZdoZnX48I+vRVrvtZo9 z5c^ezQ%n<^be{A6yzkt{qfBZ|IjK6Su)yD_v0j`*z?_4V%%Tj2XsvH;l#r69VB51G z_MY?py4Sx1?kbvn{`KSYHfP_*`K|33v7~|Bc(deY?>8>?sWUbIQt6&oV@*@EXN?=Q zt7ZH;W2dw?7Jq7ooe1@@9OU+`W5!9pJMC^f9ntQ@ks^QX!;`m<T0OnY<>Kz=<}EJU zDNTFb$>B|x+_R%w5mSdxJ)%xO`jvUZYWo_$$u~8$ZnY_%ect-MXrI=DsjvHXZW%jq z@Y+Yln)>&i)c$#P+O)Sf7yE~`iKy`*UTe}-g^4X}I`*7<I^^h7)42)p*UC*26>1q@ zfBkyJk;JBkquZ;f?C^Igytw$=ljb)&bUC^vqh;H{<!K?QT|%xn1euO5jJxYP%x%*o zo24VuQ#Wml+;IDp?eJO+-b9stIoWIZi^6#ymyf&@6}HQAb9A4b4SRc-)>XFL-|B9k zbZyb5M90&Mop*hF^&;nm)yu^j{Z_Z1HtT)%OLy10M?9WnYOL?KHCbh+n(La|?{u4F z@An<G@x}Y&@4FvgphJcYwpgjyOZ&Rfir~KMdU?<G`D64{TjTaB!=9$O?w22SjvX}i z%3<BRLqg0pC$=-mRT$Ok^@7YguRj(yT{1X0t%K*R;Dt?Roj7+<|E7OQi|ucEc%_B! zXw*xs<B59fKW2UK9O=81^v`Q!<33NX#$DgrHNWXi+;*;6=S>$ThX))?8MZ8GZ?{0r z`Z3<aGd6p!oMmY~;lx_Ez0a*3^~Rn#F=+Xt&?JQmL*K4#*ui>DXM<MCa~D`^temjV zZS0f$u&uj3^$M+F+B3fYqzx&fZ*-_Pyycd~M<(A{8?G5NW#8FznsYA1bTpoI{&c~n z?!!0if0ldr<S?7T9=BCh%XZw!eO$Bl0ZsR_ofT@#{hIZu*$)Hv4qgNO3?EpRm1L=W zR&>1dwcN+|!iu0rU0$iI_T1j;vz^t-alK>8GaI*U9W*fK%&z7>H=iv~J@7%a{qXlL z9%Xe(BYNxKZ_=aP<Bng$hlglf?$X5H{pj`k*ESt~nRNSMM0?*{qfLv_cITMKHX9H* zZSDf6dzTv)?VqqtVdD<(5tHLByINn|up#$*+R{0$pTg|J%Y(~q?<`8x(CQvhkkL`g z<DT0fzdV1D<@$$rofJ&Vqlb)a{P<eRw}ANN?>=7Kn0*#Ly0%8iJ!sAy^EzpJOHZnO z-&fk=d)m3l{yRFQjZ}v>uKRcGy7bh9F>MM9Kdm{UZaDId_Lid_jxGBoEBtT@t*>|` z?Xt4?*@RDH`gOg(XNl=3OK}}r$6}jJ-Ol$uloJ*{$~Hl1$^7_@L&sPw2<&IHUu8kc zyZ9-(4f~hPKeWrJ*37u?DNj1~3Y-*>-)QjD*ySy(W9Lm+9X|O)+W2l-DISyNtO>f7 z6<pBsnV$BUCuehpEuLd}ZtfK2tF4;UJRE1R^_E(<ScCdOnwQ7CINLE!YyAqZhH<OR zi+Yr<`eGB|Fm-Nr-<Q$fgL8DlX5XlNwAYo?JFgZMc$Ut+8dbZX)P8HWU3B?mHzm*X zX7Q>!!>pH$U+$>wIJ^0*$J^A*=8r#jrJzTD=bfXz>h8Ji-JFnx8r&NKj=2?Y2n^)j z5HKkH`-Xs_gQKmo^D<i($Jr}qy4pHAYWE)5yQhn@vn%|)#zgqBoGVK7p=dkOpO_KS zDd=xe69*?-?i~du+eRa}_YZ8<m)Oo*XzRq4lrCfng}6`rR=fcrv=Drlz9U@Jt!jnF zL7|FIr2kzoVT)%%NQcC#lEy+Ii>ekfCZzrIsuqH)g|)Bv21!-gWJHKYK~+icjS`I& zRV`!)g+x^?1fPLc-%`~=22cn#=BjNGBME8eTh&6a3AO7~)j}f(X<P9P&8qa19u(rf zN>rs?Lzj>?aaAn@7i($5U3jiaq+x`#PN`}k9Vj%ls)dFU(&|lB3k`un3#(daFd=Hi zRV_3K3VBqu5Ok~>_sy0nt#bHsiR$jE7J_eDs;X7BkT$$i43})L+Ty{t7+P}QP^nUz z;7b=O5mhY&-w9EHjkane&`gVjsut=6g+OdoBlRRi`AJm^^?*V)RV@UoTPd%qg|wg$ zXW}aL6MV_1d3jX}b%jD3s#-`B3N@~3p)T-UnTl`5RAq$i423kRN`k?^X=qgob%a8& zdsJ<ecOaxm#W&fi(x&!Mi2E8*l{yzzLgNQjEu;>Gtg2e59U+Z!s#*xXY}Lr2s)gDR z((qeV3$=zqtEyV46%^tQgsZg5VMuPUy{d&&p-_ve7HUaI{bN-vqymLtN32?#V9^xM zSGABb6araSjif|KJ-8%l)e6A@Vm&yZuUesIgw##1YN4i3Xhu~FH6f(V`>Ga#fwIn` zsupTQNbQoU7HSBE)>XAo11MC#s)e9Ht$kH3qzHvzm#<pq)+0nAu&RaNuuTCD3#vw{ zL&)DN6INv`uMLIZ)S+smT5xiHud0P$_^M%E)j~DlE4a_9TBrsTvaM<%5fu3RzY9ry z9b5j_bfGfowA`-~S5AxMe(hN%E%)o$GHJPABbQ0b{kpqMTJG2KWzuplA0U&Kdzk~7 zwA{-v$fV_7HbN#X_wp7pX}Oo-kV(tET!>6s?qyA6(sD1qB9oSTnHZV0+{@X>q~%_A zM<y-z@<1|axtB4LNz1+5l1y6eWuau!axY&cla_m#Et$03%Yn(H<zBW-CN1~!YBFiL zmw}T>%e`EkOj_<`^<>g=FaIZ#ekt!Vg)-?Jd6!d^Nz1+LqfA=v<tb&-axbGPla_nA zPnopb%aY2Z<z7BjCN1|euQF-5m!p+Q%e`!_Oj_>cePz<=@-9Oxla_nAWSO+w%R0-X z<z9YTCN1|e*)nOlm-CiM%f0NlOj_>c(Ph$dFXJwgmV3E*nY7%?;>)DrFqeM$ewp-L zdAAvmN#BuoI|P|Dysk*UZG%iY9?~%Lzb{=QlfEtQHW)JLTk>w#A(Mu4X!>nMWYRa} z-Tp)-eO=ydT4d63@@^+1lfEYJwl^~ASb4YSkx9qMyN!@c8eX8I-|k2zeMR1FnPk$J z<=s9?CLJyBHdiv~OY&~VC6kVlciS+Tbfmo7o5`f%)qnbJ*ksZd<=rk$CVfHPZS7>z z;qq?3CzFO(y6CqFlu4hHcRNFw^jS#5D;fevh%@qT4=GdkX?eG?lu3ulyWOTt`joue zg36>r<=wtiCLJR0Hmfq}V0pKLl}QK5yKSvZ8eTH`90zm%^U`B7>64H)6r4UG?{>v9 zbqC11t+Gt|xV+mx%cT9~-KJV5?I-Vc+A?W)J(_;oZ<+K_dABE*Ngt7S8+Dnque{s6 z%cKv>yDhy;+6U6`YN5dG<Paerb_h<xn_VB^Rd9iIA0XsCERDeQen_hePJ0vb4)zFv zb;Aq0@8Dfaf$6=3yoFI&V0sUv2MJE^Cgcqq83?R<7o-gYr*{(ay5dDx1q*%W6%{|~ z!7u7_9A__C0<}oJ_9%j0e{CkXZg|(|Rfgd7Hb_qsoZd>v%U6QaTOe&OIK7#WoQfB5 z1+9}!kaiVZ_eMgpO9iJlKw2y~?FH%Dg462>c>(KO;8x`cX?TZ8V0s-P&tbn8m|hF% zwt~}QLY{$p1lH{V>28A4?u2B)@sGf|*FbuJ;Ph%jp29J>z`9pKT3>M5jgTjI1gBR* zdc5HD3PLi|1gDon+FEdW86l5z1gDom+D>p9_Q{M-g3~b8Ww;1VLo)rR;Phfh!<Hqm z=NCa*L2%lckTe+G1lH{Y=_Z2H3kgXD!wRh15z?&%rxy^C0!MiQ>z)s3O~GjgLLQwF zoCYsE(iWVaM@aHz!D-l9ll26r;oZiE@q*KHA#EZ!J%^A7DT32Bke)0!J)4mGF9fG& zK^m4_V9(DaBq>*LdIqFn{}EXCbV3q~1*hTIBoW4Nfpt%XbPd627%}g`afHCSr$D-q z;578(-F<@7R*+T`oVFz7j-TN4BuIA_oVFk&Axv=E9MXLSrza8;e@Sq90;GovPMZ;O z`<CFeDWr`Br@`8{k_D&7K^l5U;8q1=$<1ei(_<kGqlCb^p@la-2u_cIG?+?Y-A065 zFBF^}4QV&QX+uauSm2V3A|!5u;Isjx8wgI1B;?v2!D)R+w-lTnK}hUT!D&56cNCn~ zB_t+Pa2ocqnBIcZ!w9(=DLAbIY4|U&FNYFx<%Zz&5J<yzD6sCqgj{|gI6Vl`Fcu1| zdmtgvPX(t3Kzf$obbmrFy%U_)hP0#LbU#9(z6nmlNFTLAaJmm6k-r6}Vf%|*FF4%` z(u#u9Jqd}}B{<y!(k%q1yAyKJS8!Sj((MJOyAg6BSa7;4q@kq(w^&U=!Y>L=cY!qQ zZ363tqmA=%g43NK4I{q5x?v1Fmn1md0n%{PA+T=fnX{RK(;ASTAvmp0$eA~S)9oNV zUvRoDA*a6xPPc*dGQsKAgoKp|PPc;eI>Bi*NY@pdRwd-r4#8>g@F^w1X%#|3eFUdr zbO==!oK_|zBv5b~mN^8*6oFf8b3%f{1*e-q8oVa3?xutU#R^V0fwY0(bYnsS?+H#f zg0z|7bVEW;W(ZC<fb=xM>H376cqKRuhB{#{I9-pBfX{-{u-^o@3QpG{<anvzbZtnB z1*dC48cGP<suT$E-zGR+6VkBN3aq;ZA$|u1r$vy4kyBvZ5IlB5Xqx<iG}v2M-Q0(L zj-C^oE{F60!D$$~k6aa;{sn1$!D-l{eD4TOmq2>F;Pg*I4yOrD|A4f$;B+w|J~@KZ zMUb`=oGv8f&?mv^?~ry8oc>10L0B&Wx2ms@b{Cw6<A;N=ZwjotfRF=Q1gBwCI{<zV zSa&`l`}Ye@!@AzzT5vj#5bxuH)47n=6rBD@$i6dz(;pzMEjaz2kiC}$r{6(ZPjLDz zA$#Hlr{6%@L~!~wA-huqr@^edCksx$BxKhM!RZ`G&lQ}`CS)h{zQ8ROmSX23!RhCO z?0^wSVBOCky;^WO3({agfptG6Wcwz;=_inGBsiT($hLig(~lvoCODlz$W}kW>2yeU z7Mup>YzY&bPK9(|!D-kNHeV8)egx^^g44-_Y`P^l{SeZ|g3}KO*$DLu+^X(F+EQ>j ziI5GjjSH+h5z;n-)AtDRf^k-0-FG4FBshJCkoDktfpsT9+D&j8M&tDm7FhRfLOeGJ zPQy0h*+6jmCL!zg2u|OCbW6eM>x8U5DmWbn>5hWa*9Z}Z3QosDy0_qT3?Uwog40(a zts^*ng%EdGivoN8{~Ej3m@Ml!jN?~i9?;CtJfInADj;%DKtxawL_7l`ct8a40FQ(R z5KuwU$_}0t&D6@Q)DD`F9dypQ=3F`FTx-s?)|zv!HRqgbtvTnq9^dpT_ub&#=ec%2 z_x=0-e*YKG?!R{g>vFL^Ej4>3!)*7d=0dE$m6|+FV7BjGQyJD@OKWdoeagBT>#zJ% zyL(u-SvO++rL_7X)+eoliyr-ESYKF&Vtqnt+=2CR>z-J9RyG{O`ZMbRSbGK6AH(_+ z>sYLvyUMi!@ApybRIHCkb?34E*g6O6kEB}9OnBWNS{Gn_SXy}<>kq6;u|6cNxQX@q z)&Z<NMV8;i`d#aKtX<p79$<aIdL!2Rtvh1<j#RS^>wVTeuzuSwdi2%6s@iKEf%P80 zKGG`!X17|$V7*&f>aGm4cUh-ky;BN!X8^O^Ujx}#Z<nerVeO}0m523Ksqz}uTdYg4 z-YhM-f%RL~l~}(iExv>G8`gDLzb-AhkM$<&7OY>hZjZHR{6gPzSXHkWhGFf_Q{i<F zvo~1x$GSyY;MoJS*IP$py-q4WiFLDeGS*E#&F(DLYpus&y+)e<1J<jpr(xYFmHv!% zgY_J&J^kkWj`b?*#aMeymfXg=)_Nt@mUI8XdWE$s3s&rM>vmW#ljgX)!R#9AZdku8 z&Gv+a+11wluwE+7I*fI|Iuh$DsrUreo(si^STB)^&S33oEy}=pku>un)(fqtU|k^< z{)F`c>seTrOEZ4My3E?w4y$UuRPZO(rPf|QFngYq|2Nj&o8-HP!|b`%Ay~U(=6N3h zvu9g(#oEttdMnn&*5OzeNz)EtJ=1zH)`im4&#|6iJsj%-Y07t4=Ub1#I!~H>0qg13 zld$&Go^%!Ksn&i%u&UfkCjN@`WNUW`nC)+v`v=w&tv#t=cCIwxFRUk6ufaOU+8AER zcqwNS*4frwu+Eak@4|YVb#JUQrR?{x&ai$7>#<VSr&xQHWyNEi?js$(!8*;_|L|Fk zmNLJ`I@Q{B2(w2?8CS4Qv34(n*(0T~zhIqgU50g%H0Bo8iPqIvkC4*uVeL+z-iURA zl=cv7*I(MJSjSn1VjU}u-huTn>z-K0NT~<09%?-R>u71zF|4Dk{Y_!TMoKBCupVOV z)dsV@+ZcHs>p|A;_%Pc&F!?gp1FgO5fZ2XBN!PJ{(Yh4t2r2O<)-PBGu<kF7xQq4k z*7aETlZHRQy07&{ti!E4V%<kd*oL*|a6%8Pdr9&8v37TekHGplDeef?zUDah6j-s{ zrPwyC!>m2mVD_`puya^<v(Co)87bxx)?Kahuzp$^dJXF?)+JbXmZEQ9?FkiKiFGF_ z>JHXkH&Jz1caS3QW8L1m1?#7*{RvoA?W7@Fuzu3oRSUC2q`~{Je!|+F^Z&BL@`I<B z{h0gc;Iqi!!Dr!*vO5%JmDkjl*M?NY`_G@x3_6AWcR*U3yI}C0?2kJj&2eod4N0x~ E7xnuYYybcN diff --git a/UTScripts/References/overlay_tell40C1.root b/UTScripts/References/overlay_tell40C1.root index e511cee8713f661a62c1703bf416e3ef45c619c8..c7841c647c48ac7ffb6ecaa2ea74d74bf9c668fb 100644 GIT binary patch delta 13857 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 delta 14568 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 ML74p-JU$-%4@;m;H2?qr diff --git a/UTScripts/Vetra_Plotter_EmuNoiseComponents.cpp b/UTScripts/Vetra_Plotter_EmuNoiseComponents.cpp index 1ee53a12..c6ce10fe 100644 --- a/UTScripts/Vetra_Plotter_EmuNoiseComponents.cpp +++ b/UTScripts/Vetra_Plotter_EmuNoiseComponents.cpp @@ -45,7 +45,7 @@ void drawLine( Double_t x1, Double_t y1, Double_t x2, Double_t y2, Color_t color } // Function for plotting 2D histograms -void plot2D( TDirectory* f2, std::string parameter, bool invertPalette, float max, std::string number, +void plot2D( TDirectory* f2, std::string parameter, bool invertPalette, float max_fixed, std::string number, std::string parentDir ) { std::cout << parameter << std::endl; @@ -56,6 +56,7 @@ void plot2D( TDirectory* f2, std::string parameter, bool invertPalette, float ma canva->Divide( 2, 2 ); + float max = 0; for ( unsigned int layer = 0; layer < 4; layer++ ) { std::string title_occ = parameter + "_" + layers_names[layer]; auto hist = (TH2D*)f2->Get( title_occ.c_str() ); @@ -106,8 +107,12 @@ void plot2D( TDirectory* f2, std::string parameter, bool invertPalette, float ma gStyle->SetPalette( 57 ); hist->SetFillStyle( 3001 ); hist->SetStats( 0 ); + if ( max_fixed != 0 ) + hist->GetZaxis()->SetRangeUser( 0, max_fixed ); + else hist->GetZaxis()->SetRangeUser( 0, max ); + std::string title = hist->GetTitle(); title = title.substr( 0, title.size() ); hist->SetTitle( title.c_str() ); @@ -326,7 +331,7 @@ void plot_histos_noise_stave( TDirectory* f3, TDirectory* f4, unsigned int layer std::string title_canva = "CMSNoiseSigma_" + layers_names[layer] + "_" + std::to_string( stave ) + side_name; TCanvas* c_noise = new TCanvas( title_canva.c_str(), title_canva.c_str(), 2000, 3000 ); - c_noise->Divide(6, 8); + c_noise->Divide( 6, 8 ); unsigned int counter_noise = 1; std::string title; @@ -350,7 +355,6 @@ void plot_histos_noise_stave( TDirectory* f3, TDirectory* f4, unsigned int layer not_empty = 1; - c_noise->GetPad( counter_noise )->SetRightMargin( 0.105 ); c_noise->cd( counter_noise++ ); @@ -374,9 +378,9 @@ void plot_histos_noise_stave( TDirectory* f3, TDirectory* f4, unsigned int layer hist_incoh->Draw( "SAME" ); // Create the legend - auto legend = new TLegend(0.6, 0.7, 0.88, 0.88); - legend->AddEntry(hist, "CMSNoiseSigma", "l"); // Black line - legend->AddEntry(hist_incoh, "TotalNoiseSigma", "l"); // Red line with error bars + auto legend = new TLegend( 0.6, 0.7, 0.88, 0.88 ); + legend->AddEntry( hist, "CMSNoiseSigma", "l" ); // Black line + legend->AddEntry( hist_incoh, "TotalNoiseSigma", "l" ); // Red line with error bars legend->Draw(); // Creating histograms for projections @@ -428,11 +432,10 @@ void plot_histos_noise_stave( TDirectory* f3, TDirectory* f4, unsigned int layer hist_incoh_proj->Draw( "HISTOSAME" ); // Create the legend - auto legend_proj = new TLegend(0.6, 0.7, 0.88, 0.88); - legend_proj->AddEntry(hist_incoh_proj, "CMSNoiseSigma", "l"); // Black line - legend_proj->AddEntry(hist_proj, "TotalNoiseSigma", "l"); // Red line with error bars + auto legend_proj = new TLegend( 0.6, 0.7, 0.88, 0.88 ); + legend_proj->AddEntry( hist_incoh_proj, "CMSNoiseSigma", "l" ); // Black line + legend_proj->AddEntry( hist_proj, "TotalNoiseSigma", "l" ); // Red line with error bars legend_proj->Draw(); - } } } @@ -449,7 +452,7 @@ void plot_histos_noise_stave( TDirectory* f3, TDirectory* f4, unsigned int layer void Vetra_Plotter_EmuNoiseComponents() { ///////////////////////////////// - const char* number = "0000297288"; + const char* number = "0000302970"; ///////////////////////////////// std::string number_str( number ); @@ -475,12 +478,12 @@ void Vetra_Plotter_EmuNoiseComponents() { } TDirectory* f3 = (TDirectory*)f1->Get( "UTPedDigitsToCMDigits" ); - TFile* f0 = TFile::Open( ( "./Vetra/ut_data_pedestals_" + std::string( number ) + ".root" ).c_str() ); + TFile* f0 = TFile::Open( ( "./Vetra/ut_data_meanADC_" + std::string( number ) + ".root" ).c_str() ); if ( !f0 ) { - std::cerr << "Error: Failed to open file './Vetra/ut_data_pedestals_" << number << ".root'\n"; + std::cerr << "Error: Failed to open file './Vetra/ut_data_meanADC_" << number << ".root'\n"; exit( -1 ); } - TDirectory* f4 = (TDirectory*)f0->Get( "UTPedestalMonitor" ); + TDirectory* f4 = (TDirectory*)f0->Get( "UTMeanADCMonitor" ); if ( f3 == nullptr ) { std::cerr << "Error: UTIncNoiseDigitMonitor directory not found in the file." << std::endl; @@ -488,7 +491,7 @@ void Vetra_Plotter_EmuNoiseComponents() { } if ( f4 == nullptr ) { - std::cerr << "Error: UTPedestalMonitor directory not found in the file." << std::endl; + std::cerr << "Error: UTMeanADCMonitor directory not found in the file." << std::endl; exit( -1 ); } @@ -515,16 +518,16 @@ void Vetra_Plotter_EmuNoiseComponents() { for ( unsigned int layer = 0; layer < 4; layer++ ) for ( unsigned int side = 0; side < 2; side++ ) for ( unsigned int stave = 1; stave <= 9; stave++ ) { - plot_histos_noise_stave( f3, f4, layer, side, stave, moduleData, number_str, parentDir ); - // plot_histos_incnoise_stave_mean( f3, layer, side, stave, number_str, parentDir ); - // plot_histos_stave( f3, layer, side, stave, number_str, parentDir ); + plot_histos_noise_stave( f3, f4, layer, side, stave, moduleData, number_str, parentDir ); + // plot_histos_incnoise_stave_mean( f3, layer, side, stave, number_str, parentDir ); + plot_histos_stave( f3, layer, side, stave, number_str, parentDir ); } // Plotting histograms 2D: CommonModeMean, CommonModeSigma, CMSNoiseMean, CMSNoiseSigma plot2D( f3, "CommonModeSigmaAverage", 0, 2, number_str, parentDir ); plot2D( f3, "CommonModeMeanAverage", 0, 2, number_str, parentDir ); - plot2D( f3, "CMSNoiseSigmaAverage", 0, 0, number_str, parentDir ); - plot2D( f3, "CMSNoiseMeanAverage", 0, 0, number_str, parentDir ); + plot2D( f3, "CMSNoiseSigmaAverage", 0, 1.2, number_str, parentDir ); + plot2D( f3, "CMSNoiseMeanAverage", 0, 1.2, number_str, parentDir ); TCanvas* c_proj = new TCanvas( "Projections_NoiseSigma", "Projections_NoiseSigma", 1400, 1200 ); diff --git a/UTScripts/Vetra_Plotter_Pedestals.cpp b/UTScripts/Vetra_Plotter_MeanADC.cpp similarity index 90% rename from UTScripts/Vetra_Plotter_Pedestals.cpp rename to UTScripts/Vetra_Plotter_MeanADC.cpp index 095cc185..175c4951 100644 --- a/UTScripts/Vetra_Plotter_Pedestals.cpp +++ b/UTScripts/Vetra_Plotter_MeanADC.cpp @@ -10,7 +10,7 @@ \*****************************************************************************/ /* - * Vetra_Plotter_Pedestals.cpp + * Vetra_Plotter_MeanADCs.cpp * * Created on: September, 2023 * Author: Wojciech Krupa (wokrupa@cern.ch) @@ -108,7 +108,7 @@ void plot2D( TDirectory* f2, std::string parameter, bool invertPalette, float ma gStyle->SetPalette( 57 ); hist->SetFillStyle( 3001 ); hist->SetStats( 0 ); - hist->GetZaxis()->SetRangeUser( 0, max ); + hist->GetZaxis()->SetRangeUser( 0, 6 ); std::string title = hist->GetTitle(); title = title.substr( 0, title.size()); @@ -249,7 +249,7 @@ void plot_histos_stave( TDirectory* f2, std::string parameter, unsigned int laye hist->SetFillStyle( 3001 ); hist->GetXaxis()->SetTitle( "Strip" ); hist->GetYaxis()->SetTitle( "ADC" ); - if ( parameter == "Pedestals_" ) + if ( parameter == "MeanADC_" ) hist->GetYaxis()->SetRangeUser( -31, 31 ); else hist->GetYaxis()->SetRangeUser( 0, 3 ); @@ -262,12 +262,12 @@ void plot_histos_stave( TDirectory* f2, std::string parameter, unsigned int laye c_pedsub->SaveAs( path.c_str() ); } -// To run: root -l -b Vetra/Ut/UTScripts/Vetra_Plotter_Pedestals.cpp +// To run: root -l -b Vetra/Ut/UTScripts/Vetra_Plotter_MeanADC.cpp -void Vetra_Plotter_Pedestals() { +void Vetra_Plotter_MeanADC() { ///////////////////////////////// - const char* number = "0000297288"; + const char* number = "0000306848"; ///////////////////////////////// std::string number_str( number ); @@ -283,21 +283,21 @@ void Vetra_Plotter_Pedestals() { if ( stat( dir_name.c_str(), &st ) == -1 ) { mkdir( dir_name.c_str(), 0755 ); } - TFile* f1 = TFile::Open( ( parentDir + '/' + "ut_data_pedestals_" + std::string( number ) + ".root" ).c_str() ); + TFile* f1 = TFile::Open( ( parentDir + '/' + "ut_data_meanADC_" + std::string( number ) + ".root" ).c_str() ); if ( !f1 ) exit( -1 ); - TDirectory* f3 = (TDirectory*)f1->Get( "UTPedestalMonitor" ); + TDirectory* f3 = (TDirectory*)f1->Get( "UTMeanADCMonitor" ); for ( unsigned int layer = 0; layer < 4; layer++ ) for ( unsigned int side = 0; side < 2; side++ ) for ( unsigned int stave = 1; stave <= 9; stave++ ) { - plot_histos_stave( f3, "Pedestals_", layer, side, stave, number_str, parentDir ); - plot_histos_stave( f3, "SigmaNoise_", layer, side, stave, number_str, parentDir ); + //plot_histos_stave( f3, "MeanADC_", layer, side, stave, number_str, parentDir ); + //plot_histos_stave( f3, "SigmaNoise_", layer, side, stave, number_str, parentDir ); } - plot2D( f3, "PedestalAverage", 1, 4, number_str, parentDir ); + plot2D( f3, "MeanADCAverage", 1, 4, number_str, parentDir ); plot2D( f3, "SigmaNoiseAverage", 1, 2, number_str, parentDir ); - plot2D( f3, "ZS_th", 1, 5, number_str, parentDir ); + plot2D( f3, "ZS_th", 1, 4, number_str, parentDir ); TCanvas* c_proj = new TCanvas( "Projections_SigmaNoise", "Projections_SigmaNoise", 1400, 1200 ); @@ -342,32 +342,32 @@ void Vetra_Plotter_Pedestals() { c_proj->SaveAs( ( parentDir + '/' + std::string( number_str ) + "/Projections_SigmaNoise.png" ).c_str() ); - TCanvas* c_proj2 = new TCanvas( "Projections_Pedestals", "Projections_Pedestals", 1400, 1200 ); + TCanvas* c_proj2 = new TCanvas( "Projections_MeanADC", "Projections_MeanADC", 1400, 1200 ); // Plotting projections c_proj2->Divide( 2, 2 ); - TH1F* h5 = (TH1F*)f3->Get( "Projection_Pedestal" ); + TH1F* h5 = (TH1F*)f3->Get( "Projection_MeanADC" ); if ( !h5 ) { - std::cerr << "Failed to get histogram Projection_Pedestal\n"; + std::cerr << "Failed to get histogram Projection_MeanADC\n"; return; } - TH1F* h6 = (TH1F*)f3->Get( "Projection_Pedestal_A" ); + TH1F* h6 = (TH1F*)f3->Get( "Projection_MeanADC_A" ); if ( !h6 ) { - std::cerr << "Failed to get histogram Projection_Pedestal_A\n"; + std::cerr << "Failed to get histogram Projection_MeanADC_A\n"; return; } - TH1F* h7 = (TH1F*)f3->Get( "Projection_Pedestal_B" ); + TH1F* h7 = (TH1F*)f3->Get( "Projection_MeanADC_B" ); if ( !h7 ) { - std::cerr << "Failed to get histogram Projection_Pedestal_B\n"; + std::cerr << "Failed to get histogram Projection_MeanADC_B\n"; return; } - TH1F* h8 = (TH1F*)f3->Get( "Projection_Pedestal_C" ); + TH1F* h8 = (TH1F*)f3->Get( "Projection_MeanADC_C" ); if ( !h8 ) { - std::cerr << "Failed to get histogram Projection_Pedestal_C\n"; + std::cerr << "Failed to get histogram Projection_MeanADC_C\n"; return; } @@ -383,7 +383,7 @@ void Vetra_Plotter_Pedestals() { c_proj2->cd( 4 ); h8->Draw(); - c_proj2->SaveAs( ( parentDir + '/' + std::string( number_str ) + "/Projections_Pedestal.png" ).c_str() ); + c_proj2->SaveAs( ( parentDir + '/' + std::string( number_str ) + "/Projections_MeanADC.png" ).c_str() ); gPad->SetLogy(); c_proj2->cd( 1 ); @@ -401,7 +401,7 @@ void Vetra_Plotter_Pedestals() { c_proj2->cd( 4 ); h8->Draw(); - c_proj2->SaveAs( ( parentDir + '/' + std::string( number_str ) + "/Projections_PedestalLog.png" ).c_str() ); + c_proj2->SaveAs( ( parentDir + '/' + std::string( number_str ) + "/Projections_MeanADCLog.png" ).c_str() ); gSystem->Exit( 0 ); } diff --git a/UTScripts/Vetra_Plotter_PedSub.cpp b/UTScripts/Vetra_Plotter_PedSub.cpp index 64b8b6cd..92150bfd 100644 --- a/UTScripts/Vetra_Plotter_PedSub.cpp +++ b/UTScripts/Vetra_Plotter_PedSub.cpp @@ -1,4 +1,4 @@ -/*****************************************************************************\ + /*****************************************************************************\ * (c) Copyright 2000-2023 CERN for the benefit of the LHCb Collaboration * * * * This software is distributed under the terms of the GNU General Public * @@ -139,7 +139,7 @@ void plot_histos_stave( TDirectory* f2, unsigned int layer, unsigned int side, u void Vetra_Plotter_PedSub() { ///////////////////////////////// - const char* number = "0000297288"; + const char* number = "0000307299"; ///////////////////////////////// std::string number_str( number ); diff --git a/UTScripts/Vetra_Plotter_PedestalRun.cpp b/UTScripts/Vetra_Plotter_PedestalRun.cpp index 0290084f..40b9a668 100644 --- a/UTScripts/Vetra_Plotter_PedestalRun.cpp +++ b/UTScripts/Vetra_Plotter_PedestalRun.cpp @@ -497,7 +497,7 @@ void plot_histos_noise_stave( TDirectory* f3, unsigned int layer, unsigned side, void Vetra_Plotter_PedestalRun() { ///////////////////////////////// - const char* number = "0000294162"; + const char* number = "0000301203"; ///////////////////////////////// std::string number_str( number ); diff --git a/UTScripts/Vetra_Plotter_RawADC.cpp b/UTScripts/Vetra_Plotter_RawADC.cpp index 7f1aad1a..f135513a 100644 --- a/UTScripts/Vetra_Plotter_RawADC.cpp +++ b/UTScripts/Vetra_Plotter_RawADC.cpp @@ -316,7 +316,7 @@ void plot_histos_stave( TDirectory* f2, unsigned int layer, unsigned int side, u void Vetra_Plotter_RawADC() { ///////////////////////////////// - const char* number = "0000297288"; + const char* number = "0000307328"; ///////////////////////////////// std::string number_str( number ); @@ -349,7 +349,7 @@ void Vetra_Plotter_RawADC() { for ( unsigned int layer = 0; layer < NUM_LAYERS; layer++ ) for ( unsigned int side = 0; side < NUM_SIDES; side++ ) for ( unsigned int stave = 1; stave <= NUM_STAVES; stave++ ) { - // plot_histos_stave( f2, layer, side, stave, number_str, parentDir ); + plot_histos_stave( f2, layer, side, stave, number_str, parentDir ); } // MCMS -- GitLab From 61d4b00ad9c738c33cbb1022f6787b88326165ee Mon Sep 17 00:00:00 2001 From: Wojciech Krupa <wojciech.krupa@cern.ch> Date: Thu, 7 Nov 2024 14:47:50 +0100 Subject: [PATCH 2/4] Imroving logic of algorithms --- CMakeLists.txt | 2 +- UTEmuAlgorithms/CMakeLists.txt | 2 + .../UTEmu/UTEmuPedestalCalculatorDev.h | 84 +++++++ .../include/UTEmu/UTEmuStepMonitorAlgorithm.h | 65 ++++++ .../src/UTEmuPedestalCalculatorDev.cpp | 212 ++++++++++++++++++ UTEmuAlgorithms/src/UTEmuPulseShape.cpp | 4 +- .../src/UTEmuStepMonitorAlgorithm.cpp | 83 +++++++ UTEmuAlgorithms/src/modules.cpp | 4 + .../options/UT_Emulation_NoiseComponents.py | 5 +- UTEmuOptions/options/UT_MeanADCMonitoring.py | 5 +- .../options/UT_PedestalCalculation.py | 3 +- .../options/UT_PedestalCalculationDev.py | 106 +++++++++ UTEmuOptions/options/UT_PulseShape.py | 7 +- UTEmuOptions/options/UT_RawADC_Run.py | 12 +- UTEmuOptions/options/UT_Step_Run.py | 146 ++++++++++++ UTScripts/BadChannels/UTBadChannels.py | 2 +- UTScripts/NoisyChannels/UTNoisyChannels.py | 3 +- UTScripts/Vetra_Plotter_MeanADC.cpp | 2 +- UTScripts/Vetra_Plotter_PedSub.cpp | 2 +- UTScripts/Vetra_Plotter_PedestalRun.cpp | 3 +- UTScripts/Vetra_Plotter_RawADC.cpp | 2 +- release.notes | 5 +- 22 files changed, 732 insertions(+), 27 deletions(-) create mode 100644 UTEmuAlgorithms/include/UTEmu/UTEmuPedestalCalculatorDev.h create mode 100644 UTEmuAlgorithms/include/UTEmu/UTEmuStepMonitorAlgorithm.h create mode 100644 UTEmuAlgorithms/src/UTEmuPedestalCalculatorDev.cpp create mode 100644 UTEmuAlgorithms/src/UTEmuStepMonitorAlgorithm.cpp create mode 100644 UTEmuOptions/options/UT_PedestalCalculationDev.py create mode 100644 UTEmuOptions/options/UT_Step_Run.py diff --git a/CMakeLists.txt b/CMakeLists.txt index 1bb9eacf..941dc0a2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,7 +11,7 @@ cmake_minimum_required(VERSION 3.15) -project(Vetra VERSION 2.0 +project(Vetra VERSION 4.5 LANGUAGES CXX) # Definition of path for ut diff --git a/UTEmuAlgorithms/CMakeLists.txt b/UTEmuAlgorithms/CMakeLists.txt index b0fee69a..c9d6d71f 100644 --- a/UTEmuAlgorithms/CMakeLists.txt +++ b/UTEmuAlgorithms/CMakeLists.txt @@ -16,8 +16,10 @@ VP/VPEmu gaudi_add_library(UTEmuLib SOURCES src/UTEmuRawDataMonitorAlgorithm.cpp + src/UTEmuStepMonitorAlgorithm.cpp src/UTEmuTrimDAC.cpp src/UTEmuPedestalCalculator.cpp + src/UTEmuPedestalCalculatorDev.cpp src/UTEmuPedestalSubtractor.cpp src/UTEmuPedestalCalculatorDataMonitorAlgorithm.cpp src/UTEmuPedestalSubtractorDataMonitorAlgorithm.cpp diff --git a/UTEmuAlgorithms/include/UTEmu/UTEmuPedestalCalculatorDev.h b/UTEmuAlgorithms/include/UTEmu/UTEmuPedestalCalculatorDev.h new file mode 100644 index 00000000..489dca2b --- /dev/null +++ b/UTEmuAlgorithms/include/UTEmu/UTEmuPedestalCalculatorDev.h @@ -0,0 +1,84 @@ +/*****************************************************************************\ +* (c) Copyright 2000-2023 CERN for the benefit of the LHCb Collaboration * +* * +* This software is distributed under the terms of the GNU General Public * +* Licence version 3 (GPL Version 3), copied verbatim in the file "COPYING". * +* * +* In applying this licence, CERN does not waive the privileges and immunities * +* granted to it by virtue of its status as an Intergovernmental Organization * +* or submit itself to any jurisdiction. * +\*****************************************************************************/ + +/* + * UTEmuPedestalCalculatorDev.h + * + * Created on: August, 2023 + * Author: Wojciech Krupa (wokrupa@cern.ch) + */ + +#pragma once +#include "Event/ODIN.h" +#include "Event/UTDigit.h" +#include "Kernel/IEventCounter.h" +#include "Kernel/IUTReadoutTool.h" +#include "Kernel/UTDAQBoard.h" +#include "Kernel/UTDAQDefinitions.h" +#include "Kernel/UTDAQID.h" +#include "LHCbAlgs/Consumer.h" +#include "UTDAQ/UTADCWord.h" +#include "UTDAQ/UTCoordinatesMap.h" +#include "UTDAQ/UTHeaderWord.h" +#include "UTEmu/UTEmuVetraHelper.h" +#include "TCanvas.h" +#include "TFile.h" +#include "TH1D.h" +#include "TH2D.h" +#include "TKey.h" +#include <fstream> +#include <map> +#include <math.h> + +using namespace LHCb; + +namespace UTEmu { + + class PedestalCalculatorDev : public LHCb::Algorithm::Consumer<void( const LHCb::ODIN& ), + LHCb::DetDesc::usesBaseAndConditions<GaudiHistoAlg>> { + public: + PedestalCalculatorDev( const std::string& name, // algorithm instance name + ISvcLocator* pSvcLocator ) // service locator + : Consumer{ name, + pSvcLocator, + { { "ODINLocation", LHCb::ODINLocation::Default } } } {} + + StatusCode initialize() override; + StatusCode finalize() override; + void operator()( const LHCb::ODIN& ) const override; + + void savePedestalsToCsv(); + void saveBadChannelsToCsv(); + void saveSigmaNoiseToCsv(); + void calculatePedestals(); + void findBadChannels(); + void saveThresholdsToCsv(); + void saveExtraToCsv(); + + // properties + Gaudi::Property<std::string> m_runNumber{ this, "RunNumber", "00000000" }; + mutable std::map<std::string, Gaudi::Accumulators::Histogram<2>> m_2d_ADCCounter; + mutable std::map<unsigned int, float> Pedestal; + mutable std::map<unsigned int, float> SigmaNoise; + mutable std::map<std::string, int> Pedestal_Max; + mutable std::map<std::string, Gaudi::Accumulators::SigmaCounter<>> SigmaNoiseAv; + mutable std::map<std::string, Gaudi::Accumulators::SigmaCounter<>> PedestalAv; + + mutable std::map<unsigned int, bool> BadChannels; + + Gaudi::Property<std::string> m_layer{ this, "Layer", "UTaX" }; + mutable std::map<std::string, int> m_layerNumber = { { "UTaX", 0 }, { "UTaU", 1 }, { "UTbV", 2 }, { "UTbX", 3 } }; + + UTCoordinatesMap UTMap; + + private: + }; +} // namespace UTEmu \ No newline at end of file diff --git a/UTEmuAlgorithms/include/UTEmu/UTEmuStepMonitorAlgorithm.h b/UTEmuAlgorithms/include/UTEmu/UTEmuStepMonitorAlgorithm.h new file mode 100644 index 00000000..5c80c642 --- /dev/null +++ b/UTEmuAlgorithms/include/UTEmu/UTEmuStepMonitorAlgorithm.h @@ -0,0 +1,65 @@ +/*****************************************************************************\ +* (c) Copyright 2000-2023 CERN for the benefit of the LHCb Collaboration * +* * +* This software is distributed under the terms of the GNU General Public * +* Licence version 3 (GPL Version 3), copied verbatim in the file "COPYING". * +* * +* In applying this licence, CERN does not waive the privileges and immunities * +* granted to it by virtue of its status as an Intergovernmental Organization * +* or submit itself to any jurisdiction. * +\*****************************************************************************/ + +/* + * UTEmuStepMonitorAlgorithm.h + * + * Created on: October, 2024 + * Author: Wojciech Krupa (wokrupa@cern.ch) + */ + +#pragma once + +#include "Event/ODIN.h" +#include "Event/UTDigit.h" +#include "GaudiAlg/GaudiTupleAlg.h" +#include "GaudiKernel/IEventProcessor.h" +#include "Kernel/IEventCounter.h" +#include "Kernel/IUTReadoutTool.h" +#include "Kernel/UTDAQID.h" +#include "LHCbAlgs/Consumer.h" +#include "UTDAQ/UTCoordinatesMap.h" +#include "UTDet/DeUTDetector.h" +#include "UTEmu/UTEmuVetraHelper.h" + +using namespace LHCb; + +namespace UTEmu { + + class StepMonitorAlgorithm + : public LHCb::Algorithm::Consumer<void( UTDigits const&, const LHCb::ODIN&, + std::vector<std::pair<unsigned int, int>> const&, DeUTDetector const& ), + LHCb::DetDesc::usesBaseAndConditions<GaudiHistoAlg, DeUTDetector>> { + public: + /// constructer + StepMonitorAlgorithm( const std::string& name, ISvcLocator* svcloc ) + : Consumer{ name, + svcloc, + { { "DigitLocation", UTEmu::UTDigitLocation::UTDigits }, + { "ODINLocation", LHCb::ODINLocation::Default }, + { "InputBankData", UTEmu::UTDigitLocation::UTBanks }, + { "UTLocation", DeUTDetLocation::location() } } } {} + + ToolHandle<IUTReadoutTool> readoutTool{ this, "ReadoutTool", "UTReadoutTool" }; + Gaudi::Property<float> m_events{ this, "Events", 100 }; + Gaudi::Property<float> m_steps{ this, "Steps", 100 }; + + StatusCode initialize() override; + void operator()( const UTDigits&, const LHCb::ODIN&, const std::vector<std::pair<unsigned int, int>>&, + DeUTDetector const& ) const override; + + mutable UTCoordinatesMap UTMap; + + mutable std::map<std::string, Gaudi::Accumulators::Histogram<2>> m_2d_ADCCounter; + private: + void fillHistograms( const LHCb::UTDigit*, DeUTDetector const&, const LHCb::ODIN& ) const; + }; +} // namespace UTEmu \ No newline at end of file diff --git a/UTEmuAlgorithms/src/UTEmuPedestalCalculatorDev.cpp b/UTEmuAlgorithms/src/UTEmuPedestalCalculatorDev.cpp new file mode 100644 index 00000000..1f229f27 --- /dev/null +++ b/UTEmuAlgorithms/src/UTEmuPedestalCalculatorDev.cpp @@ -0,0 +1,212 @@ +/*****************************************************************************\ +* (c) Copyright 2000-2023 CERN for the benefit of the LHCb Collaboration * +* * +* This software is distributed under the terms of the GNU General Public * +* Licence version 3 (GPL Version 3), copied verbatim in the file "COPYING". * +* * +* In applying this licence, CERN does not waive the privileges and immunities * +* granted to it by virtue of its status as an Intergovernmental Organization * +* or submit itself to any jurisdiction. * +\*****************************************************************************/ + +/* + * UTEmuPedestalCalculatorDev.cpp + * + * Created on: August, 2023 + * Author: Wojciech Krupa (wokrupa@cern.ch) + */ + +#include "UTEmu/UTEmuPedestalCalculatorDev.h" + +using namespace LHCb; +using namespace UTEmu; + +StatusCode PedestalCalculatorDev::initialize() { return StatusCode::SUCCESS; } + +void PedestalCalculatorDev::operator()( const LHCb::ODIN& odin ) const {} + +void PedestalCalculatorDev::calculatePedestals() { + + TFile* f1 = + TFile::Open( ( std::string( UTEMU_PATH ) + "/ut_step_nzs_" + std::string( m_runNumber ) + ".root" ).c_str() ); + + if ( !f1 ) { + std::cerr << "Error: ut_step_nzs.root file does not exist." << std::endl; + exit( -1 ); + } + static TString classname_th2( "TH2D" ); + + TDirectory* f2 = (TDirectory*)f1->Get( "UTStepMonitor" ); + + if ( f2 == nullptr ) { + std::cerr << "Error: UTStepMonitor directory not found in the file." << std::endl; + exit( -1 ); + } + + // Description of method: read 2D histogram and after removing outliers from the projection for each bin (channel) get + // the mu. + for ( const auto& module : UTMap.getModulesNames() ) { + if ( module.find( m_layer ) != std::string::npos ) { + for ( unsigned int step = 0; step < 100; step++ ) { + TH2D* hist2D = dynamic_cast<TH2D*>( f2->Get( ( module + ".Step" + std::to_string( step ) ).c_str() ) ); + if ( hist2D ) { + debug() << module << " " << std::to_string( step ) << endmsg; + + for ( unsigned int bin = 1; bin <= hist2D->GetNbinsX(); bin++ ) { + + TH1D* projection = hist2D->ProjectionY( "Projection", bin, bin, "" ); + float mean = projection->GetMean(); + float rms = projection->GetRMS(); + + // Filter out outliers + for ( Int_t bin = 1; bin <= projection->GetNbinsX(); ++bin ) { + if ( TMath::Abs( projection->GetBinCenter( bin ) - mean ) > 3 * rms ) { + projection->SetBinContent( bin, 0 ); + } + } + + int channel = UTMap.getChannel( module ) + ( bin - 1 ); + + if ( step == 0 ) { + Pedestal[channel] = projection->GetMean(); + SigmaNoise[channel] = projection->GetRMS(); + } + + // Detector::UT::ChannelID channelID( UTMap.getChannel( module ) + ( bin - 1 ) ); + + if ( ( ( module.find( "W" ) != std::string::npos ) ) || ( ( module.find( "E" ) != std::string::npos ) ) ) { + if ( Pedestal[channel] < projection->GetMean() ) Pedestal[channel] = projection->GetMean(); + if ( SigmaNoise[channel] < projection->GetRMS() ) SigmaNoise[channel] = projection->GetRMS(); + } else { + if ( Pedestal[channel] > projection->GetMean() ) Pedestal[channel] = projection->GetMean(); + if ( SigmaNoise[channel] > projection->GetRMS() ) SigmaNoise[channel] = projection->GetRMS(); + } + + delete projection; + } + + } else { + // info() << "Very serious Problem" << endmsg; + } + delete hist2D; + } + } + } +} + +void PedestalCalculatorDev::findBadChannels() { + + // bad channels + for ( const auto& ped : Pedestal ) { + + Detector::UT::ChannelID channelID( ped.first ); + + auto tuple = + UTMap.getTuple( channelID.module(), channelID.face(), channelID.stave(), channelID.side(), channelID.sector() ); + + std::string module_name = std::get<4>( tuple ); + + std::string current_asic_name = UTEmu::UT_layers[channelID.layer()] + "_" + module_name + "_" + + std::to_string( int( channelID.strip() / UTEmu::UTNumbers::nStripsPerASIC ) ); + + float zs_th = std::ceil( 4.5 * SigmaNoiseAv[current_asic_name].mean() ); + if ( std::round( std::abs( ped.second ) ) > zs_th ) + BadChannels[ped.first] = 1; + else + BadChannels[ped.first] = 0; + } +} + +void PedestalCalculatorDev::saveBadChannelsToCsv() { + + // file pointer + std::fstream fout; + + // opens an existing csv file or creates a new file. + std::string input_path = std::string( UTEMU_PATH ) + "/above_thresholds_" + m_layer + "_" + m_runNumber + ".csv"; + fout.open( input_path.c_str(), std::ios::out | std::ios::trunc ); + + for ( const auto& channel : BadChannels ) { fout << channel.first << ", " << channel.second << "\n"; }; + info() << "Saving channels above threshold file" << endmsg; +} + +void PedestalCalculatorDev::saveThresholdsToCsv() { + + std::fstream fout; + + std::string input_path = std::string( UTEMU_PATH ) + "/zs_th_mcms_" + m_layer + "_" + m_runNumber + ".csv"; + fout.open( input_path.c_str(), std::ios::out | std::ios::trunc ); + + for ( const auto& sigmaNoise : SigmaNoiseAv ) { + float zs_th = std::ceil( 5 * sigmaNoise.second.mean() ) - 1; // Tomasz optimistic version + fout << sigmaNoise.first << ", " << zs_th << "\n"; + } + info() << "Saving zs_threshold file" << endmsg; +}; + +void PedestalCalculatorDev::saveExtraToCsv() { + + std::fstream fout; + + std::string input_path = std::string( UTEMU_PATH ) + "/extra_" + m_layer + "_" + m_runNumber + ".csv"; + fout.open( input_path.c_str(), std::ios::out | std::ios::trunc ); + + for ( const auto& pedestal : Pedestal ) { + auto bad = 0; + Detector::UT::ChannelID channelID( pedestal.first ); + auto tuple = + UTMap.getTuple( channelID.module(), channelID.face(), channelID.stave(), channelID.side(), channelID.sector() ); + + std::string module_name = std::get<4>( tuple ); + + std::string current_asic_name = UTEmu::UT_layers[channelID.layer()] + "_" + module_name + "_" + + std::to_string( int( channelID.strip() / UTEmu::UTNumbers::nStripsPerASIC ) ); + + float zs_th = std::ceil( 5 * SigmaNoiseAv[current_asic_name].mean() ) - 1; // Tomasz optimistic version + if ( pedestal.second > zs_th ) { bad = 1; } + if ( zs_th > 0 ) + fout << current_asic_name << " " << channelID.strip() % 128 << " " << pedestal.second << ", " << zs_th << ", " + << bad << "\n"; + } + info() << "Saving extra file" << endmsg; +}; + +void PedestalCalculatorDev::savePedestalsToCsv() { + + // file pointer + std::fstream fout; + + // opens an existing csv file or creates a new file. + std::string input_path = std::string( UTEMU_PATH ) + "/pedestals_" + m_layer + "_" + m_runNumber + ".csv"; + fout.open( input_path.c_str(), std::ios::out | std::ios::trunc ); + + for ( const auto& ped : Pedestal ) { fout << ped.first << ", " << std::round( ped.second ) << "\n"; }; + info() << "Saving pedestal file" << endmsg; +} + +void PedestalCalculatorDev::saveSigmaNoiseToCsv() { + + std::fstream fout; + + std::string input_path = std::string( UTEMU_PATH ) + "/sigmaNoise_" + m_layer + "_" + m_runNumber + ".csv"; + fout.open( input_path.c_str(), std::ios::out | std::ios::trunc ); + + for ( const auto& sigmaNoise : SigmaNoise ) { + fout << sigmaNoise.first << ", " << Pedestal[sigmaNoise.first] << ", " << sigmaNoise.second << "\n"; + } + + info() << "Saving sigma of sigmaNoise file" << endmsg; +}; + +StatusCode PedestalCalculatorDev::finalize() { + + calculatePedestals(); + savePedestalsToCsv(); + saveSigmaNoiseToCsv(); + // findBadChannels(); + // saveBadChannelsToCsv(); + // saveExtraToCsv(); + // saveThresholdsToCsv(); + + return StatusCode::SUCCESS; +} diff --git a/UTEmuAlgorithms/src/UTEmuPulseShape.cpp b/UTEmuAlgorithms/src/UTEmuPulseShape.cpp index 991f3501..a71a9bdc 100644 --- a/UTEmuAlgorithms/src/UTEmuPulseShape.cpp +++ b/UTEmuAlgorithms/src/UTEmuPulseShape.cpp @@ -25,7 +25,7 @@ StatusCode PulseShape::initialize() { return Consumer::initialize().andThen( [&] { for ( const auto& module : UTMap.getModulesNames() ) { for ( unsigned int i = 0; i < 512; i++ ) { - auto title = module + ".Chip" + std::to_string( i / 512 ) + ".Ch" + std::to_string( i % 512 ); + auto title = module + ".Chip" + std::to_string( i / 128 ) + ".Ch" + std::to_string( i % 128 ); if ( title.find( UTEmu::UT_layers[m_layer] ) != std::string::npos ) { Utility::map_emplace( m_2d_ch, title, 0, this, title, { 128, 0, 128 }, { 64, -32.5, 31.5 } ); } @@ -54,7 +54,7 @@ void PulseShape::fillHistograms( const LHCb::UTDigit* aDigit, DeUTDetector const Detector::UT::ChannelID channelID = aDigit->channelID(); auto title_charge = UTEmu::UT_layers[aDigit->layer()] + "_" + module_name + ".Chip" + - std::to_string( aDigit->strip() / 512 ) + ".Ch" + std::to_string( aDigit->strip() % 512 ); + std::to_string( aDigit->strip() / 128 ) + ".Ch" + std::to_string( aDigit->strip() % 128 ); if ( title_charge.find( UTEmu::UT_layers[m_layer] ) != std::string::npos ) { ++m_2d_ch.at( title_charge )[{ odin.calibrationStep(), aDigit->depositedCharge() }]; } diff --git a/UTEmuAlgorithms/src/UTEmuStepMonitorAlgorithm.cpp b/UTEmuAlgorithms/src/UTEmuStepMonitorAlgorithm.cpp new file mode 100644 index 00000000..196bc6c4 --- /dev/null +++ b/UTEmuAlgorithms/src/UTEmuStepMonitorAlgorithm.cpp @@ -0,0 +1,83 @@ +/*****************************************************************************\ +* (c) Copyright 2000-2023 CERN for the benefit of the LHCb Collaboration * +* * +* This software is distributed under the terms of the GNU General Public * +* Licence version 3 (GPL Version 3), copied verbatim in the file "COPYING". * +* * +* In applying this licence, CERN does not waive the privileges and immunities * +* granted to it by virtue of its status as an Intergovernmental Organization * +* or submit itself to any jurisdiction. * +\*****************************************************************************/ + +/* + * UTEmuStepMonitorAlgorithm.cpp + * + * Created on: October, 2024 + * Author: Wojciech Krupa (wokrupa@cern.ch) + */ + +#include "UTEmu/UTEmuStepMonitorAlgorithm.h" + +using namespace LHCb; +using namespace UTEmu; + +StatusCode StepMonitorAlgorithm::initialize() { + + return Consumer::initialize().andThen( [&] { + for ( const auto& module : UTMap.getModulesNames() ) { + for ( unsigned int i = 0; i < m_steps; i++ ) { + auto title = module + ".Step" + std::to_string( i ); + Utility::map_emplace( m_2d_ADCCounter, title, 0, this, title, { 512, 0, 512 }, { 64, -32.5, 31.5 } ); + } + } + return StatusCode::SUCCESS; + } ); +} + +void StepMonitorAlgorithm::operator()( const UTDigits& digitsCont, const LHCb::ODIN& odin, + const std::vector<std::pair<unsigned int, int>>& bank_types, + DeUTDetector const& det ) const { + + // fill histos for each digit + for ( const auto& d : digitsCont ) fillHistograms( d, det, odin ); +} + +void StepMonitorAlgorithm::fillHistograms( const LHCb::UTDigit* aDigit, DeUTDetector const&, + const LHCb::ODIN& odin ) const { + + // aDigit (channelID) .stave() / module() = software side + + // Let's see where we are + auto tuple = UTMap.getTuple( aDigit->module(), aDigit->face(), aDigit->stave(), aDigit->side(), aDigit->sector() ); + auto x = std::get<0>( tuple ); + auto y = std::get<1>( tuple ); + std::string module_name = std::get<4>( tuple ); + std::string type = std::get<5>( tuple ); + if ( type == "D" ) type = "C"; + + unsigned int asic = aDigit->asic() % UTEmu::UTNumbers::nASICs; + + Detector::UT::ChannelID channelID = aDigit->channelID(); + UTDAQID daqID = readoutTool->channelIDToDAQID( channelID ); + auto board_ID = daqID.board(); + + // Digits occupancy plots + if ( aDigit->strip() == 0 ) { + debug() << " Stave: " << aDigit->stave() << " Side: " << aDigit->side() << " Module: " << aDigit->module() + << " Sector: " << aDigit->sector() << " Face: " << aDigit->face() << " Module name: " << module_name << " " + << "Type: " << type << " Stave_x: " << x << " Module_y: " << y << endmsg; + } + + auto title_layer = "Occupancy_" + UTEmu::UT_layers[aDigit->layer()]; + + // Let's include mirroring! Probably it could be done better + if ( ( aDigit->face() == 1 && y < 0 && x < 0 ) || ( aDigit->face() == 0 && y > 0 && x < 0 ) || + ( aDigit->face() == 0 && y < 0 && x > 0 ) || ( aDigit->face() == 1 && y > 0 && x > 0 ) ) + asic = ( 3 - asic ) % 4; + + // Raw ADC vs channel + auto title_charge = UTEmu::UT_layers[aDigit->layer()] + "_" + module_name + ".Step" + std::to_string( odin.calibrationStep() ); + auto title_charge_ = UTEmu::UT_layers[aDigit->layer()] + "_" + module_name + ".Step" + std::to_string( odin.calibrationStep() ); ";Channel;ADC"; + + ++m_2d_ADCCounter.at( title_charge )[{ aDigit->strip(), aDigit->depositedCharge() }]; +} diff --git a/UTEmuAlgorithms/src/modules.cpp b/UTEmuAlgorithms/src/modules.cpp index dfd81711..d0e7b742 100644 --- a/UTEmuAlgorithms/src/modules.cpp +++ b/UTEmuAlgorithms/src/modules.cpp @@ -11,16 +11,20 @@ #include <UTEmu/UTEmuCommonModeSubtractor.h> #include <UTEmu/UTEmuPedestalCalculator.h> +#include <UTEmu/UTEmuPedestalCalculatorDev.h> #include <UTEmu/UTEmuPedestalCalculatorDataMonitorAlgorithm.h> #include <UTEmu/UTEmuPedestalSubtractor.h> #include <UTEmu/UTEmuPedestalSubtractorDataMonitorAlgorithm.h> #include <UTEmu/UTEmuRawDataMonitorAlgorithm.h> +#include <UTEmu/UTEmuStepMonitorAlgorithm.h> #include <UTEmu/UTEmuTrimDAC.h> #include <UTEmu/UTEmuPulseShape.h> DECLARE_COMPONENT( UTEmu::RawDataMonitorAlgorithm ) +DECLARE_COMPONENT( UTEmu::StepMonitorAlgorithm ) DECLARE_COMPONENT( UTEmu::TrimDACAlgorithm ) DECLARE_COMPONENT( UTEmu::PedestalCalculator ) +DECLARE_COMPONENT( UTEmu::PedestalCalculatorDev ) DECLARE_COMPONENT( UTEmu::PedestalSubtractor ) DECLARE_COMPONENT( UTEmu::PedestalCalculatorDataMonitorAlgorithm ) DECLARE_COMPONENT( UTEmu::PedestalSubtractorDataMonitorAlgorithm ) diff --git a/UTEmuOptions/options/UT_Emulation_NoiseComponents.py b/UTEmuOptions/options/UT_Emulation_NoiseComponents.py index d0d77060..aea4a8c5 100644 --- a/UTEmuOptions/options/UT_Emulation_NoiseComponents.py +++ b/UTEmuOptions/options/UT_Emulation_NoiseComponents.py @@ -28,7 +28,7 @@ from DDDB.CheckDD4Hep import UseDD4Hep app = LHCbApp() app.DataType = "Upgrade" app.Simulation = False -app.EvtMax = 300 +app.EvtMax = 500 # ------------------------------------------------------------------------------- # DD4hep ------------------------------------------------------------- @@ -58,8 +58,7 @@ EventSelector().PrintFreq = 100 # ------------------------------------------------------------------------------- # Setup input ------------------------------------------------------------- - -run_number = "0000307324" +run_number = "0000309695" input_path = '/hlt2/objects/UT/' + run_number + '/' data = [] diff --git a/UTEmuOptions/options/UT_MeanADCMonitoring.py b/UTEmuOptions/options/UT_MeanADCMonitoring.py index f1913486..a040c3e9 100644 --- a/UTEmuOptions/options/UT_MeanADCMonitoring.py +++ b/UTEmuOptions/options/UT_MeanADCMonitoring.py @@ -59,9 +59,8 @@ EventSelector().PrintFreq = 100 # ------------------------------------------------------------------------------- # Setup input ------------------------------------------------------------- -run_number = "0000307324" -input_path = '/swdev/wokrupa/DATA/' + run_number + '/' - +run_number = "0000309677" +input_path = '/hlt2/objects/UT/' + run_number + '/' data = [] if os.path.exists(input_path): diff --git a/UTEmuOptions/options/UT_PedestalCalculation.py b/UTEmuOptions/options/UT_PedestalCalculation.py index ba8b9407..a690448d 100644 --- a/UTEmuOptions/options/UT_PedestalCalculation.py +++ b/UTEmuOptions/options/UT_PedestalCalculation.py @@ -58,9 +58,8 @@ EventSelector().PrintFreq = 1 # ------------------------------------------------------------------------------- # Setup input ------------------------------------------------------------- -run_number = "0000307324" +run_number = "0000309697" input_path = '/hlt2/objects/UT/' + run_number + '/' - # Algorithms ---------------------------------------------------------- # Declare the algorithms we want to run. We set the output level to INFO diff --git a/UTEmuOptions/options/UT_PedestalCalculationDev.py b/UTEmuOptions/options/UT_PedestalCalculationDev.py new file mode 100644 index 00000000..7f8f6768 --- /dev/null +++ b/UTEmuOptions/options/UT_PedestalCalculationDev.py @@ -0,0 +1,106 @@ +############################################################################### +# (c) Copyright 2020 CERN for the benefit of the LHCb Collaboration # +# # +# This software is distributed under the terms of the GNU General Public # +# Licence version 3 (GPL Version 3), copied verbatim in the file "COPYING". # +# # +# In applying this licence, CERN does not waive the privileges and immunities # +# granted to it by virtue of its status as an Intergovernmental Organizatiodn # +# or submit itself to any jurisdiction. # +############################################################################### + +import sys, os, glob +from Gaudi.Configuration import MessageSvc, VERBOSE, DEBUG, INFO, ERROR, WARNING +from Gaudi.Configuration import ApplicationMgr +from Configurables import LHCbApp,GaudiSequencer +from Configurables import LoKiSvc +from Configurables import AlgResourcePool, CPUCrunchSvc, HiveSlimEventLoopMgr, HiveWhiteBoard, AvalancheSchedulerSvc +from Configurables import UTRawBankToUTNZSDigitsAlg, UTEmu__PedestalCalculatorDev, UTEmu__PedestalCalculatorDataMonitorAlgorithm +from Configurables import Gaudi__Histograming__Sink__Root as RootHistoSink +from Configurables import Gaudi__Monitoring__MessageSvcSink as MessageSvcSink +from Configurables import LHCb__Det__LbDD4hep__IOVProducer as IOVProducer +from Configurables import createODIN, LHCb__UnpackRawEvent, EventSelector +from Configurables import LHCbTimingAuditor, LHCbSequencerTimerTool, TimingAuditor, AuditorSvc, SequencerTimerTool +from GaudiConf import IOHelper +from DDDB.CheckDD4Hep import UseDD4Hep + +# ------------------------------------------------------------------------------- +app = LHCbApp() +app.DataType = "Upgrade" +app.Simulation = False +app.EvtMax = 1 + +# ------------------------------------------------------------------------------- +# DD4hep ------------------------------------------------------------- + +if UseDD4Hep: + # Prepare detector description + from Configurables import LHCb__Det__LbDD4hep__DD4hepSvc as DD4hepSvc + dd4hepsvc = DD4hepSvc() + dd4hepsvc.VerboseLevel = 1 + dd4hepsvc.GeometryLocation = "${DETECTOR_PROJECT_ROOT}/compact" + dd4hepsvc.GeometryVersion = "run3/trunk" + dd4hepsvc.GeometryMain = "LHCb.xml" + dd4hepsvc.DetectorList = ["/world", "UT"] + iovProd = IOVProducer("ReserveIOVDD4hep", ODIN='DAQ/ODIN') + +else: + # DetDesc case + LHCbApp().DataType = "Upgrade" + LHCbApp().DDDBtag = 'upgrade/UTv4r2-newUTID' + LHCbApp().CondDBtag = "master" + LHCbApp().Simulation = False + iovProd = IOVProducer() + +LoKiSvc().Welcome = False +MessageSvc().OutputLevel = INFO +EventSelector().PrintFreq = 1 + +# ------------------------------------------------------------------------------- +# Setup input ------------------------------------------------------------- +run_number = "0000309677" +input_path = '/hlt2/objects/UT/' + run_number + '/' +layer = "UTaX" +# Algorithms ---------------------------------------------------------- +# Declare the algorithms we want to run. We set the output level to INFO + +monSeq = GaudiSequencer("UTSequence") +monSeq.IgnoreFilterPassed = True + +unpacker = LHCb__UnpackRawEvent( + 'UnpackRawEvent', + BankTypes=['ODIN'], + RawBankLocations=['/Event/DAQ/RawBanks/ODIN' + ]) + +odin = createODIN(RawBanks="DAQ/RawBanks/ODIN") + +pedestals = UTEmu__PedestalCalculatorDev( + 'UTDigitsToPedestals', OutputLevel=DEBUG, RunNumber = run_number, Layer = layer) + +monSeq.Members = [unpacker, odin, iovProd, pedestals] + +# Application Manager ---------------------------------------------------------- +# We put everything together and change the type of message service + +appMgr = ApplicationMgr( + EvtMax=-1, + TopAlg=[monSeq], + ExtSvc=[ + MessageSvcSink(), + #RootHistoSink(FileName="./Vetra/ut_data_pedestals_"+run_number+".root"), + ], +) + +# Some extra stuff for timing table +ApplicationMgr().ExtSvc += ['ToolSvc', 'AuditorSvc'] +ApplicationMgr().AuditAlgorithms = True +AuditorSvc().Auditors += ['TimingAuditor'] +SequencerTimerTool().OutputLevel = 4 + +# No error messages when reading MDF +#IODataManager().DisablePFNWarning = True + + + + diff --git a/UTEmuOptions/options/UT_PulseShape.py b/UTEmuOptions/options/UT_PulseShape.py index 0e0a2207..1fc2992e 100644 --- a/UTEmuOptions/options/UT_PulseShape.py +++ b/UTEmuOptions/options/UT_PulseShape.py @@ -58,8 +58,9 @@ EventSelector().PrintFreq = 100 # ------------------------------------------------------------------------------- # Setup input ------------------------------------------------------------- -run_number = "0000306890" -input_path = '/hlt2/objects/UT/' + run_number + '/' +run_number = "0000307556" +input_path = '/swdev/wokrupa/DATA/CalibRuns/' + run_number + '/' + data = [] if os.path.exists(input_path): @@ -117,7 +118,7 @@ odin = createODIN(RawBanks="DAQ/RawBanks/ODIN") decoder = UTRawBankToUTNZSDigitsAlg("UTRawToDigits", OutputLevel=INFO, Type="", OutputDigitData = '/Event/UT/Digits', OutputBankData = '/Event/UT/Banks') #0-4 -layer = 2 +layer = 3 pulse = UTEmu__PulseShape( "UTPulseShape", OutputLevel=INFO, Layer = layer) diff --git a/UTEmuOptions/options/UT_RawADC_Run.py b/UTEmuOptions/options/UT_RawADC_Run.py index 18f27513..6d42b78e 100644 --- a/UTEmuOptions/options/UT_RawADC_Run.py +++ b/UTEmuOptions/options/UT_RawADC_Run.py @@ -29,7 +29,7 @@ from DDDB.CheckDD4Hep import UseDD4Hep app = LHCbApp() app.DataType = "Upgrade" app.Simulation = False -app.EvtMax = 1000 +app.EvtMax = 10000 # ----------------------------------------------------------------------------- # DD4hep ------------------------------------------------------------- @@ -58,7 +58,7 @@ EventSelector().PrintFreq = 100 # ------------------------------------------------------------------------------- # Setup input ------------------------------------------------------------- -run_number = "0000307324" +run_number = "0000310021" input_path = '/hlt2/objects/UT/' + run_number + '/' data = [] @@ -75,8 +75,8 @@ IOHelper("MDF").inputFiles(data) # Multithreading ------------------------------------------------------------- # ----------------------------------------------------------------------------- -evtslots = 12 -threads = 10 +evtslots = 6 +threads = 5 # Event Loop Manager ----------------------------------------------------------- # It's called slim since it has less functionalities overall than the good-old @@ -114,10 +114,10 @@ unpacker = LHCb__UnpackRawEvent( odin = createODIN(RawBanks="DAQ/RawBanks/ODIN") -decoder = UTRawBankToUTNZSDigitsAlg("UTRawToDigits", OutputLevel=INFO, Type="", OutputDigitData = '/Event/UT/Digits', OutputBankData = '/Event/UT/Banks') +decoder = UTRawBankToUTNZSDigitsAlg("UTRawToDigits", OutputLevel=ERROR, Type="", OutputDigitData = '/Event/UT/Digits', OutputBankData = '/Event/UT/Banks') monitor = UTEmu__RawDataMonitorAlgorithm( - "UTDigitMonitor", OutputLevel=INFO, Events = app.EvtMax) + "UTDigitMonitor", OutputLevel=ERROR, Events = app.EvtMax) monSeq.Members = [unpacker, odin, iovProd, decoder, monitor] diff --git a/UTEmuOptions/options/UT_Step_Run.py b/UTEmuOptions/options/UT_Step_Run.py new file mode 100644 index 00000000..af7dfbaa --- /dev/null +++ b/UTEmuOptions/options/UT_Step_Run.py @@ -0,0 +1,146 @@ +############################################################################### +# (c) Copyright 2020 CERN for the benefit of the LHCb Collaboration # +# # +# This software is distributed under the terms of the GNU General Public # +# Licence version 3 (GPL Version 3), copied verbatim in the file "COPYING". # +# # +# In applying this licence, CERN does not waive the privileges and immunities # +# granted to it by virtue of its status as an Intergovernmental Organizatiodn # +# or submit itself to any jurisdiction. # +############################################################################### + + +import sys, os, glob +from Gaudi.Configuration import MessageSvc, VERBOSE, DEBUG, INFO, ERROR, WARNING +from Gaudi.Configuration import ApplicationMgr +from Configurables import LHCbApp,GaudiSequencer +from Configurables import LoKiSvc +from Configurables import AlgResourcePool, CPUCrunchSvc, HiveSlimEventLoopMgr, HiveWhiteBoard, AvalancheSchedulerSvc +from Configurables import UTEmu__StepMonitorAlgorithm, UTRawBankToUTNZSDigitsAlg +from Configurables import Gaudi__Histograming__Sink__Root as RootHistoSink +from Configurables import Gaudi__Monitoring__MessageSvcSink as MessageSvcSink +from Configurables import LHCb__Det__LbDD4hep__IOVProducer as IOVProducer +from Configurables import createODIN, LHCb__UnpackRawEvent, EventSelector +from Configurables import LHCbTimingAuditor, LHCbSequencerTimerTool, TimingAuditor, AuditorSvc, SequencerTimerTool +from GaudiConf import IOHelper +from DDDB.CheckDD4Hep import UseDD4Hep + +# ------------------------------------------------------------------------------- +app = LHCbApp() +app.DataType = "Upgrade" +app.Simulation = False +app.EvtMax = 10000 +# ----------------------------------------------------------------------------- +# DD4hep ------------------------------------------------------------- + +if UseDD4Hep: + # Prepare detector description + from Configurables import LHCb__Det__LbDD4hep__DD4hepSvc as DD4hepSvc + dd4hepsvc = DD4hepSvc() + dd4hepsvc.VerboseLevel = 1 + dd4hepsvc.GeometryLocation = "${DETECTOR_PROJECT_ROOT}/compact" + dd4hepsvc.GeometryVersion = "run3/trunk" + dd4hepsvc.GeometryMain = "LHCb.xml" + dd4hepsvc.DetectorList = ["/world", "UT"] + iovProd = IOVProducer("ReserveIOVDD4hep", ODIN='DAQ/ODIN') + +else: + # DetDesc case + LHCbApp().DataType = "Upgrade" + LHCbApp().DDDBtag = 'upgrade/UTv4r2-newUTID' + LHCbApp().CondDBtag = "master" + LHCbApp().Simulation = False + iovProd = IOVProducer() + +LoKiSvc().Welcome = False +MessageSvc().OutputLevel = INFO +EventSelector().PrintFreq = 100 + +# ------------------------------------------------------------------------------- +# Setup input ------------------------------------------------------------- +run_number = "0000310017" +input_path = '/hlt2/objects/UT/' + run_number + '/' + +data = [] +if os.path.exists(input_path): + data = glob.glob('/' + input_path + '*.mdf') +else: + print("Input directory doesn't exist!") + sys.exit() +if data == []: + print("Input data doesn't exist!") + sys.exit() + +IOHelper("MDF").inputFiles(data) + +# Multithreading ------------------------------------------------------------- +# ----------------------------------------------------------------------------- +evtslots = 6 +threads = 5 + +# Event Loop Manager ----------------------------------------------------------- +# It's called slim since it has less functionalities overall than the good-old +# event loop manager. Here we just set its outputlevel to DEBUG. + +whiteboard = HiveWhiteBoard("EventDataSvc", EventSlots=evtslots) +slimeventloopmgr = HiveSlimEventLoopMgr( + SchedulerName="AvalancheSchedulerSvc", OutputLevel=INFO +) + +# ForwardScheduler ------------------------------------------------------------- +# We just decide how many algorithms in flight we want to have and how many +# threads in the pool. The default value is -1, which is for TBB equivalent +# to take over the whole machine. + +scheduler = AvalancheSchedulerSvc(ThreadPoolSize=threads, OutputLevel=INFO) + +# Algo Resource Pool ----------------------------------------------------------- +# Nothing special here, we just set the debug level. +AlgResourcePool(OutputLevel=INFO) + +CPUCrunchSvc(shortCalib=True) + +# Algorithms ---------------------------------------------------------- +# Declare the algorithms we want to run. We set the output level to INFO + +monSeq = GaudiSequencer("UTSequence") +monSeq.IgnoreFilterPassed = True + +unpacker = LHCb__UnpackRawEvent( + 'UnpackRawEvent', + BankTypes=['ODIN'], + RawBankLocations=['/Event/DAQ/RawBanks/ODIN' + ]) + +odin = createODIN(RawBanks="DAQ/RawBanks/ODIN") + +decoder = UTRawBankToUTNZSDigitsAlg("UTRawToDigits", OutputLevel=ERROR, Type="", OutputDigitData = '/Event/UT/Digits', OutputBankData = '/Event/UT/Banks') + +monitor = UTEmu__StepMonitorAlgorithm( + "UTStepMonitor", OutputLevel=ERROR, Steps = 100, Events = app.EvtMax) + +monSeq.Members = [unpacker, odin, iovProd, decoder, monitor] + +# Application Manager ---------------------------------------------------------- +# We put everything together and change the type of message service + +appMgr = ApplicationMgr( + EvtMax=-1, + TopAlg=[monSeq], + HistogramPersistency="ROOT", + EventLoop=slimeventloopmgr, + ExtSvc=[ + MessageSvcSink(), + whiteboard, + RootHistoSink(FileName="./Vetra/ut_step_nzs_"+run_number+".root"), + ], +) + +# Some extra stuff for timing table +ApplicationMgr().ExtSvc += ['ToolSvc', 'AuditorSvc'] +ApplicationMgr().AuditAlgorithms = True +AuditorSvc().Auditors += ['TimingAuditor'] +SequencerTimerTool().OutputLevel = 4 + +# No error messages when reading MDF +#IODataManager().DisablePFNWarning = True diff --git a/UTScripts/BadChannels/UTBadChannels.py b/UTScripts/BadChannels/UTBadChannels.py index cfa14f14..0d81c5f6 100644 --- a/UTScripts/BadChannels/UTBadChannels.py +++ b/UTScripts/BadChannels/UTBadChannels.py @@ -5,7 +5,7 @@ import re import yaml from collections import OrderedDict -run = "0000302970" +run = "0000307299" # Code to convert channelID to online name + channel strip_mask = 0x1ff diff --git a/UTScripts/NoisyChannels/UTNoisyChannels.py b/UTScripts/NoisyChannels/UTNoisyChannels.py index 27ca50a6..7f37e2be 100644 --- a/UTScripts/NoisyChannels/UTNoisyChannels.py +++ b/UTScripts/NoisyChannels/UTNoisyChannels.py @@ -43,5 +43,6 @@ class UTSEUCheck: print(UT_dict[int(ch/128)]+".Ch"+str(ch%128), "Hitrate: ", binContent) if __name__ == "__main__": - hist_path = "/hist/Savesets/ByRun/UTBSMon/300000/307000/UTBSMon-run307346.root" + hist_path = "/hist/Savesets/2024/UT/UTBSMon/10/29/UTBSMon-309439-20241029T204254.root" UTSEUCheck(hist_path) + diff --git a/UTScripts/Vetra_Plotter_MeanADC.cpp b/UTScripts/Vetra_Plotter_MeanADC.cpp index 175c4951..1b598f4a 100644 --- a/UTScripts/Vetra_Plotter_MeanADC.cpp +++ b/UTScripts/Vetra_Plotter_MeanADC.cpp @@ -267,7 +267,7 @@ void plot_histos_stave( TDirectory* f2, std::string parameter, unsigned int laye void Vetra_Plotter_MeanADC() { ///////////////////////////////// - const char* number = "0000306848"; + const char* number = "0000309677"; ///////////////////////////////// std::string number_str( number ); diff --git a/UTScripts/Vetra_Plotter_PedSub.cpp b/UTScripts/Vetra_Plotter_PedSub.cpp index 92150bfd..4aa41c2b 100644 --- a/UTScripts/Vetra_Plotter_PedSub.cpp +++ b/UTScripts/Vetra_Plotter_PedSub.cpp @@ -152,7 +152,7 @@ void Vetra_Plotter_PedSub() { // Setting up the directory std::string dir_name = parentDir + std::string( number ); - struct stat st = { 0 }; + struct stat st = { 0 }; if ( stat( dir_name.c_str(), &st ) == -1 ) { mkdir( dir_name.c_str(), 0755 ); } diff --git a/UTScripts/Vetra_Plotter_PedestalRun.cpp b/UTScripts/Vetra_Plotter_PedestalRun.cpp index 40b9a668..93b373a0 100644 --- a/UTScripts/Vetra_Plotter_PedestalRun.cpp +++ b/UTScripts/Vetra_Plotter_PedestalRun.cpp @@ -492,7 +492,8 @@ void plot_histos_noise_stave( TDirectory* f3, unsigned int layer, unsigned side, } } -// To run: root -l -b Vetra/Ut/UTScripts/Vetra_Plotter_PedestalRun.cpp +// To run: root -l -b Vetra/Ut/UTScripts/Vetra_Plotter_ +Run.cpp void Vetra_Plotter_PedestalRun() { diff --git a/UTScripts/Vetra_Plotter_RawADC.cpp b/UTScripts/Vetra_Plotter_RawADC.cpp index f135513a..9b4d0b17 100644 --- a/UTScripts/Vetra_Plotter_RawADC.cpp +++ b/UTScripts/Vetra_Plotter_RawADC.cpp @@ -316,7 +316,7 @@ void plot_histos_stave( TDirectory* f2, unsigned int layer, unsigned int side, u void Vetra_Plotter_RawADC() { ///////////////////////////////// - const char* number = "0000307328"; + const char* number = "0000308864"; ///////////////////////////////// std::string number_str( number ); diff --git a/release.notes b/release.notes index db843952..cec458e6 100644 --- a/release.notes +++ b/release.notes @@ -4,6 +4,10 @@ ! Purpose : Calibration and offline monitoring of the UT !----------------------------------------------------------------------------- +!============================ UTEmu v4r5 2024-11 =========================== +! 2024-06-7 - Wojciech Krupa + - Improving algorithms logic + !============================ UTEmu v4r4 2024-03 =========================== ! 2024-06-7 - Wojciech Krupa - Simplifying code @@ -39,7 +43,6 @@ - Script for initialisation of DB xml file - Migration to Vetra repository - !============================ UTEmu v2r1 2020-04 =========================== ! 202-04 - Wojciech Krupa -- GitLab From f0b297b9d9b107cc2b91ddd0761a30da999c525e Mon Sep 17 00:00:00 2001 From: Wojciech Krupa <wojciech.krupa@cern.ch> Date: Thu, 7 Nov 2024 17:23:32 +0100 Subject: [PATCH 3/4] Adding algorithm which indicate disabled ASICs --- .../include/UTEmu/UTEmuPedestalCalculator.h | 4 +-- .../src/UTEmuPedestalCalculator.cpp | 26 +++++++++++++++++-- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/UTEmuAlgorithms/include/UTEmu/UTEmuPedestalCalculator.h b/UTEmuAlgorithms/include/UTEmu/UTEmuPedestalCalculator.h index 09566ce3..0502b790 100644 --- a/UTEmuAlgorithms/include/UTEmu/UTEmuPedestalCalculator.h +++ b/UTEmuAlgorithms/include/UTEmu/UTEmuPedestalCalculator.h @@ -62,7 +62,7 @@ namespace UTEmu { void findBadChannels(); void saveThresholdsToCsv(); void saveExtraToCsv(); - + void saveDisabledToCsv(); // properties Gaudi::Property<std::string> m_runNumber{ this, "RunNumber", "00000000" }; mutable std::map<std::string, Gaudi::Accumulators::Histogram<2>> m_2d_ADCCounter; @@ -71,7 +71,7 @@ namespace UTEmu { mutable std::map<std::string, int> Pedestal_Max; mutable std::map<std::string, Gaudi::Accumulators::SigmaCounter<>> SigmaNoiseAv; mutable std::map<std::string, Gaudi::Accumulators::SigmaCounter<>> PedestalAv; - + mutable std::vector<std::string> disabledASICs; mutable std::map<unsigned int, bool> BadChannels; diff --git a/UTEmuAlgorithms/src/UTEmuPedestalCalculator.cpp b/UTEmuAlgorithms/src/UTEmuPedestalCalculator.cpp index 738ba33f..67c6f597 100644 --- a/UTEmuAlgorithms/src/UTEmuPedestalCalculator.cpp +++ b/UTEmuAlgorithms/src/UTEmuPedestalCalculator.cpp @@ -45,10 +45,19 @@ void PedestalCalculator::calculatePedestals() { // Description of method: read 2D histogram and after removing outliers from the projection for each bin (channel) get // the mu. + for ( const auto& module : UTMap.getModulesNames() ) { TH2D* hist2D = dynamic_cast<TH2D*>( f2->Get( module.c_str() ) ); if ( hist2D ) { + + for ( int asic = 0; asic < UTEmu::UTNumbers::nASICs; ++asic ) { + int start_bin = asic * UTEmu::UTNumbers::nStripsPerASIC + 1; // ROOT bins start at 1 + int end_bin = ( asic + 1 ) * UTEmu::UTNumbers::nStripsPerASIC; + + TH1D* projection = hist2D->ProjectionY( "Projection", start_bin, end_bin, "" ); + if ( projection->GetEntries() == 0 ) { disabledASICs.push_back( module + ".Chip" + std::to_string( asic ) ); } + } for ( unsigned int bin = 1; bin <= hist2D->GetNbinsX(); bin++ ) { TH1D* projection = hist2D->ProjectionY( "Projection", bin, bin, "" ); @@ -78,7 +87,6 @@ void PedestalCalculator::calculatePedestals() { delete projection; } - } else { info() << "Very serious Problem" << endmsg; } @@ -155,11 +163,24 @@ void PedestalCalculator::saveExtraToCsv() { float zs_th = std::ceil( 5 * SigmaNoiseAv[current_asic_name].mean() ) - 1; // Tomasz optimistic version if ( pedestal.second > zs_th ) { bad = 1; } - if ( zs_th > 0 ) fout << current_asic_name<<" "<< channelID.strip()%128<<" "<<pedestal.second << ", " << zs_th << ", " << bad << "\n"; + if ( zs_th > 0 ) + fout << current_asic_name << " " << channelID.strip() % 128 << " " << pedestal.second << ", " << zs_th << ", " + << bad << "\n"; } info() << "Saving extra file" << endmsg; }; +void PedestalCalculator::saveDisabledToCsv() { + + std::fstream fout; + + std::string input_path = std::string( UTEMU_PATH ) + "/disabled_" + m_runNumber + ".csv"; + fout.open( input_path.c_str(), std::ios::out | std::ios::trunc ); + + for ( const auto& asic : disabledASICs ) { fout << asic << "\n"; } + info() << "Saving disabled asics file" << endmsg; +}; + void PedestalCalculator::savePedestalsToCsv() { // file pointer @@ -196,6 +217,7 @@ StatusCode PedestalCalculator::finalize() { saveBadChannelsToCsv(); saveExtraToCsv(); saveThresholdsToCsv(); + saveDisabledToCsv(); return StatusCode::SUCCESS; } -- GitLab From e0e51791db46d71da6df4d5a75c01f764186aef1 Mon Sep 17 00:00:00 2001 From: Wojciech Krupa <wojciech.krupa@cern.ch> Date: Tue, 12 Nov 2024 16:52:19 +0100 Subject: [PATCH 4/4] release Vetra v4.5 --- UTEmuAlgorithms/CMakeLists.txt | 4 +- .../include/UTEmu/UTEmuPedestalCalculator.h | 2 +- ...torDev.h => UTEmuPedestalCalculatorStep.h} | 11 +-- .../src/UTEmuCommonModeSubtractor.cpp | 2 +- .../src/UTEmuPedestalCalculator.cpp | 28 -------- ...PedestalCalculatorDataMonitorAlgorithm.cpp | 2 + ...ev.cpp => UTEmuPedestalCalculatorStep.cpp} | 67 +++++------------- UTEmuAlgorithms/src/modules.cpp | 4 +- .../options/UT_Emulation_NoiseComponents.py | 6 +- .../options/UT_PedestalCalculation.py | 2 +- ...onDev.py => UT_PedestalCalculationStep.py} | 7 +- ...Monitoring.py => UT_PedestalMonitoring.py} | 4 +- .../options/UT_PedestalSubtraction.py | 2 +- UTEmuOptions/options/UT_RawADC_Run.py | 6 +- UTEmuOptions/options/UT_Step_Run.py | 2 +- .../options/{UT_trimDAC.py => UT_TrimDAC.py} | 0 ...Channels_Basem.py => UTBadChannels_alt.py} | 0 UTScripts/NoisyChannels/UTNoisyASICs.py | 55 ++++++++++++++ UTScripts/NoisyChannels/UTNoisyChannels.py | 4 +- .../overlay_center_natural_asic_UTaU.root | Bin 24586 -> 24766 bytes .../overlay_center_natural_asic_UTaX.root | Bin 24394 -> 24936 bytes .../overlay_center_natural_asic_UTbV.root | Bin 20377 -> 20731 bytes UTScripts/References/overlay_tell40A0.root | Bin 71198 -> 71370 bytes UTScripts/References/overlay_tell40A1.root | Bin 72929 -> 74859 bytes UTScripts/References/overlay_tell40C1.root | Bin 71184 -> 71356 bytes UTScripts/Subtract_MCM.py | 34 +++++++++ .../Vetra_Plotter_EmuNoiseComponents.cpp | 39 +++++----- UTScripts/Vetra_Plotter_MeanADC.cpp | 2 +- UTScripts/Vetra_Plotter_RawADC.cpp | 2 +- release.notes | 1 + 30 files changed, 156 insertions(+), 130 deletions(-) rename UTEmuAlgorithms/include/UTEmu/{UTEmuPedestalCalculatorDev.h => UTEmuPedestalCalculatorStep.h} (86%) rename UTEmuAlgorithms/src/{UTEmuPedestalCalculatorDev.cpp => UTEmuPedestalCalculatorStep.cpp} (73%) rename UTEmuOptions/options/{UT_PedestalCalculationDev.py => UT_PedestalCalculationStep.py} (95%) rename UTEmuOptions/options/{UT_MeanADCMonitoring.py => UT_PedestalMonitoring.py} (98%) rename UTEmuOptions/options/{UT_trimDAC.py => UT_TrimDAC.py} (100%) rename UTScripts/BadChannels/{UTBadChannels_Basem.py => UTBadChannels_alt.py} (100%) create mode 100644 UTScripts/NoisyChannels/UTNoisyASICs.py create mode 100644 UTScripts/Subtract_MCM.py diff --git a/UTEmuAlgorithms/CMakeLists.txt b/UTEmuAlgorithms/CMakeLists.txt index c9d6d71f..a3c65cd5 100644 --- a/UTEmuAlgorithms/CMakeLists.txt +++ b/UTEmuAlgorithms/CMakeLists.txt @@ -19,11 +19,11 @@ gaudi_add_library(UTEmuLib src/UTEmuStepMonitorAlgorithm.cpp src/UTEmuTrimDAC.cpp src/UTEmuPedestalCalculator.cpp - src/UTEmuPedestalCalculatorDev.cpp + src/UTEmuPedestalCalculatorStep.cpp src/UTEmuPedestalSubtractor.cpp src/UTEmuPedestalCalculatorDataMonitorAlgorithm.cpp src/UTEmuPedestalSubtractorDataMonitorAlgorithm.cpp - src/UTEmuCommonModeSubtractor.cpp + src/UTEmuCommonModeSubtractor.cpp src/UTEmuPulseShape.cpp LINK PUBLIC diff --git a/UTEmuAlgorithms/include/UTEmu/UTEmuPedestalCalculator.h b/UTEmuAlgorithms/include/UTEmu/UTEmuPedestalCalculator.h index 0502b790..e5271659 100644 --- a/UTEmuAlgorithms/include/UTEmu/UTEmuPedestalCalculator.h +++ b/UTEmuAlgorithms/include/UTEmu/UTEmuPedestalCalculator.h @@ -61,8 +61,8 @@ namespace UTEmu { void calculatePedestals(); void findBadChannels(); void saveThresholdsToCsv(); - void saveExtraToCsv(); void saveDisabledToCsv(); + // properties Gaudi::Property<std::string> m_runNumber{ this, "RunNumber", "00000000" }; mutable std::map<std::string, Gaudi::Accumulators::Histogram<2>> m_2d_ADCCounter; diff --git a/UTEmuAlgorithms/include/UTEmu/UTEmuPedestalCalculatorDev.h b/UTEmuAlgorithms/include/UTEmu/UTEmuPedestalCalculatorStep.h similarity index 86% rename from UTEmuAlgorithms/include/UTEmu/UTEmuPedestalCalculatorDev.h rename to UTEmuAlgorithms/include/UTEmu/UTEmuPedestalCalculatorStep.h index 489dca2b..50672c1b 100644 --- a/UTEmuAlgorithms/include/UTEmu/UTEmuPedestalCalculatorDev.h +++ b/UTEmuAlgorithms/include/UTEmu/UTEmuPedestalCalculatorStep.h @@ -10,7 +10,7 @@ \*****************************************************************************/ /* - * UTEmuPedestalCalculatorDev.h + * UTEmuPedestalCalculatorStep.h * * Created on: August, 2023 * Author: Wojciech Krupa (wokrupa@cern.ch) @@ -42,10 +42,10 @@ using namespace LHCb; namespace UTEmu { - class PedestalCalculatorDev : public LHCb::Algorithm::Consumer<void( const LHCb::ODIN& ), + class PedestalCalculatorStep : public LHCb::Algorithm::Consumer<void( const LHCb::ODIN& ), LHCb::DetDesc::usesBaseAndConditions<GaudiHistoAlg>> { public: - PedestalCalculatorDev( const std::string& name, // algorithm instance name + PedestalCalculatorStep( const std::string& name, // algorithm instance name ISvcLocator* pSvcLocator ) // service locator : Consumer{ name, pSvcLocator, @@ -61,7 +61,6 @@ namespace UTEmu { void calculatePedestals(); void findBadChannels(); void saveThresholdsToCsv(); - void saveExtraToCsv(); // properties Gaudi::Property<std::string> m_runNumber{ this, "RunNumber", "00000000" }; @@ -73,10 +72,6 @@ namespace UTEmu { mutable std::map<std::string, Gaudi::Accumulators::SigmaCounter<>> PedestalAv; mutable std::map<unsigned int, bool> BadChannels; - - Gaudi::Property<std::string> m_layer{ this, "Layer", "UTaX" }; - mutable std::map<std::string, int> m_layerNumber = { { "UTaX", 0 }, { "UTaU", 1 }, { "UTbV", 2 }, { "UTbX", 3 } }; - UTCoordinatesMap UTMap; private: diff --git a/UTEmuAlgorithms/src/UTEmuCommonModeSubtractor.cpp b/UTEmuAlgorithms/src/UTEmuCommonModeSubtractor.cpp index 8f3da68f..8014a4c3 100644 --- a/UTEmuAlgorithms/src/UTEmuCommonModeSubtractor.cpp +++ b/UTEmuAlgorithms/src/UTEmuCommonModeSubtractor.cpp @@ -60,7 +60,7 @@ void CommonModeSubtractor::makeCMSNoisePlots() const { auto module_y = std::get<1>( tuple ); std::string module_name = std::get<4>( tuple ); std::string type = std::get<5>( tuple ); - if ( type == "D" ) type = "C"; + if ( type == "D" ) type = "C"; //C & D goes together // CMSNoise 1D plots mean auto title_CMSNoise = "CMSNoiseMean_" + UTEmu::UT_layers[channelID.layer()] + "_" + module_name; diff --git a/UTEmuAlgorithms/src/UTEmuPedestalCalculator.cpp b/UTEmuAlgorithms/src/UTEmuPedestalCalculator.cpp index 67c6f597..61a5f003 100644 --- a/UTEmuAlgorithms/src/UTEmuPedestalCalculator.cpp +++ b/UTEmuAlgorithms/src/UTEmuPedestalCalculator.cpp @@ -143,33 +143,6 @@ void PedestalCalculator::saveThresholdsToCsv() { info() << "Saving zs_threshold file" << endmsg; }; -void PedestalCalculator::saveExtraToCsv() { - - std::fstream fout; - - std::string input_path = std::string( UTEMU_PATH ) + "/extra_" + m_runNumber + ".csv"; - fout.open( input_path.c_str(), std::ios::out | std::ios::trunc ); - - for ( const auto& pedestal : Pedestal ) { - auto bad = 0; - Detector::UT::ChannelID channelID( pedestal.first ); - auto tuple = - UTMap.getTuple( channelID.module(), channelID.face(), channelID.stave(), channelID.side(), channelID.sector() ); - - std::string module_name = std::get<4>( tuple ); - - std::string current_asic_name = UTEmu::UT_layers[channelID.layer()] + "_" + module_name + "_" + - std::to_string( int( channelID.strip() / UTEmu::UTNumbers::nStripsPerASIC ) ); - - float zs_th = std::ceil( 5 * SigmaNoiseAv[current_asic_name].mean() ) - 1; // Tomasz optimistic version - if ( pedestal.second > zs_th ) { bad = 1; } - if ( zs_th > 0 ) - fout << current_asic_name << " " << channelID.strip() % 128 << " " << pedestal.second << ", " << zs_th << ", " - << bad << "\n"; - } - info() << "Saving extra file" << endmsg; -}; - void PedestalCalculator::saveDisabledToCsv() { std::fstream fout; @@ -215,7 +188,6 @@ StatusCode PedestalCalculator::finalize() { saveSigmaNoiseToCsv(); findBadChannels(); saveBadChannelsToCsv(); - saveExtraToCsv(); saveThresholdsToCsv(); saveDisabledToCsv(); diff --git a/UTEmuAlgorithms/src/UTEmuPedestalCalculatorDataMonitorAlgorithm.cpp b/UTEmuAlgorithms/src/UTEmuPedestalCalculatorDataMonitorAlgorithm.cpp index d8e0b4f4..c9e6ef6a 100644 --- a/UTEmuAlgorithms/src/UTEmuPedestalCalculatorDataMonitorAlgorithm.cpp +++ b/UTEmuAlgorithms/src/UTEmuPedestalCalculatorDataMonitorAlgorithm.cpp @@ -291,6 +291,8 @@ StatusCode PedestalCalculatorDataMonitorAlgorithm::getSigmaNoise() { unsigned int channelID = atof( line.substr( 0, line.find( delimiter ) ).c_str() ); line.erase( 0, line.find( delimiter ) + 1 ); + auto pedestal = atof( line.c_str() ); + line.erase( 0, line.find( delimiter ) + 1 ); auto noise_sigma = atof( line.c_str() ); SigmaNoise[channelID] = noise_sigma; } diff --git a/UTEmuAlgorithms/src/UTEmuPedestalCalculatorDev.cpp b/UTEmuAlgorithms/src/UTEmuPedestalCalculatorStep.cpp similarity index 73% rename from UTEmuAlgorithms/src/UTEmuPedestalCalculatorDev.cpp rename to UTEmuAlgorithms/src/UTEmuPedestalCalculatorStep.cpp index 1f229f27..b0391d55 100644 --- a/UTEmuAlgorithms/src/UTEmuPedestalCalculatorDev.cpp +++ b/UTEmuAlgorithms/src/UTEmuPedestalCalculatorStep.cpp @@ -10,22 +10,22 @@ \*****************************************************************************/ /* - * UTEmuPedestalCalculatorDev.cpp + * UTEmuPedestalCalculatorStep.cpp * * Created on: August, 2023 * Author: Wojciech Krupa (wokrupa@cern.ch) */ -#include "UTEmu/UTEmuPedestalCalculatorDev.h" +#include "UTEmu/UTEmuPedestalCalculatorStep.h" using namespace LHCb; using namespace UTEmu; -StatusCode PedestalCalculatorDev::initialize() { return StatusCode::SUCCESS; } +StatusCode PedestalCalculatorStep::initialize() { return StatusCode::SUCCESS; } -void PedestalCalculatorDev::operator()( const LHCb::ODIN& odin ) const {} +void PedestalCalculatorStep::operator()( const LHCb::ODIN& odin ) const {} -void PedestalCalculatorDev::calculatePedestals() { +void PedestalCalculatorStep::calculatePedestals() { TFile* f1 = TFile::Open( ( std::string( UTEMU_PATH ) + "/ut_step_nzs_" + std::string( m_runNumber ) + ".root" ).c_str() ); @@ -46,7 +46,6 @@ void PedestalCalculatorDev::calculatePedestals() { // Description of method: read 2D histogram and after removing outliers from the projection for each bin (channel) get // the mu. for ( const auto& module : UTMap.getModulesNames() ) { - if ( module.find( m_layer ) != std::string::npos ) { for ( unsigned int step = 0; step < 100; step++ ) { TH2D* hist2D = dynamic_cast<TH2D*>( f2->Get( ( module + ".Step" + std::to_string( step ) ).c_str() ) ); if ( hist2D ) { @@ -73,7 +72,7 @@ void PedestalCalculatorDev::calculatePedestals() { } // Detector::UT::ChannelID channelID( UTMap.getChannel( module ) + ( bin - 1 ) ); - + // This code finds maximum pedestal in the direction of pulse if ( ( ( module.find( "W" ) != std::string::npos ) ) || ( ( module.find( "E" ) != std::string::npos ) ) ) { if ( Pedestal[channel] < projection->GetMean() ) Pedestal[channel] = projection->GetMean(); if ( SigmaNoise[channel] < projection->GetRMS() ) SigmaNoise[channel] = projection->GetRMS(); @@ -90,11 +89,10 @@ void PedestalCalculatorDev::calculatePedestals() { } delete hist2D; } - } } } -void PedestalCalculatorDev::findBadChannels() { +void PedestalCalculatorStep::findBadChannels() { // bad channels for ( const auto& ped : Pedestal ) { @@ -117,24 +115,24 @@ void PedestalCalculatorDev::findBadChannels() { } } -void PedestalCalculatorDev::saveBadChannelsToCsv() { +void PedestalCalculatorStep::saveBadChannelsToCsv() { // file pointer std::fstream fout; // opens an existing csv file or creates a new file. - std::string input_path = std::string( UTEMU_PATH ) + "/above_thresholds_" + m_layer + "_" + m_runNumber + ".csv"; + std::string input_path = std::string( UTEMU_PATH ) + "/above_thresholds_" + m_runNumber + ".csv"; fout.open( input_path.c_str(), std::ios::out | std::ios::trunc ); for ( const auto& channel : BadChannels ) { fout << channel.first << ", " << channel.second << "\n"; }; info() << "Saving channels above threshold file" << endmsg; } -void PedestalCalculatorDev::saveThresholdsToCsv() { +void PedestalCalculatorStep::saveThresholdsToCsv() { std::fstream fout; - std::string input_path = std::string( UTEMU_PATH ) + "/zs_th_mcms_" + m_layer + "_" + m_runNumber + ".csv"; + std::string input_path = std::string( UTEMU_PATH ) + "/zs_th_mcms_" + m_runNumber + ".csv"; fout.open( input_path.c_str(), std::ios::out | std::ios::trunc ); for ( const auto& sigmaNoise : SigmaNoiseAv ) { @@ -144,51 +142,25 @@ void PedestalCalculatorDev::saveThresholdsToCsv() { info() << "Saving zs_threshold file" << endmsg; }; -void PedestalCalculatorDev::saveExtraToCsv() { - - std::fstream fout; - - std::string input_path = std::string( UTEMU_PATH ) + "/extra_" + m_layer + "_" + m_runNumber + ".csv"; - fout.open( input_path.c_str(), std::ios::out | std::ios::trunc ); - - for ( const auto& pedestal : Pedestal ) { - auto bad = 0; - Detector::UT::ChannelID channelID( pedestal.first ); - auto tuple = - UTMap.getTuple( channelID.module(), channelID.face(), channelID.stave(), channelID.side(), channelID.sector() ); - - std::string module_name = std::get<4>( tuple ); - - std::string current_asic_name = UTEmu::UT_layers[channelID.layer()] + "_" + module_name + "_" + - std::to_string( int( channelID.strip() / UTEmu::UTNumbers::nStripsPerASIC ) ); - - float zs_th = std::ceil( 5 * SigmaNoiseAv[current_asic_name].mean() ) - 1; // Tomasz optimistic version - if ( pedestal.second > zs_th ) { bad = 1; } - if ( zs_th > 0 ) - fout << current_asic_name << " " << channelID.strip() % 128 << " " << pedestal.second << ", " << zs_th << ", " - << bad << "\n"; - } - info() << "Saving extra file" << endmsg; -}; -void PedestalCalculatorDev::savePedestalsToCsv() { +void PedestalCalculatorStep::savePedestalsToCsv() { // file pointer std::fstream fout; // opens an existing csv file or creates a new file. - std::string input_path = std::string( UTEMU_PATH ) + "/pedestals_" + m_layer + "_" + m_runNumber + ".csv"; + std::string input_path = std::string( UTEMU_PATH ) + "/pedestals_" + m_runNumber + ".csv"; fout.open( input_path.c_str(), std::ios::out | std::ios::trunc ); for ( const auto& ped : Pedestal ) { fout << ped.first << ", " << std::round( ped.second ) << "\n"; }; info() << "Saving pedestal file" << endmsg; } -void PedestalCalculatorDev::saveSigmaNoiseToCsv() { +void PedestalCalculatorStep::saveSigmaNoiseToCsv() { std::fstream fout; - std::string input_path = std::string( UTEMU_PATH ) + "/sigmaNoise_" + m_layer + "_" + m_runNumber + ".csv"; + std::string input_path = std::string( UTEMU_PATH ) + "/sigmaNoise_" + m_runNumber + ".csv"; fout.open( input_path.c_str(), std::ios::out | std::ios::trunc ); for ( const auto& sigmaNoise : SigmaNoise ) { @@ -198,15 +170,14 @@ void PedestalCalculatorDev::saveSigmaNoiseToCsv() { info() << "Saving sigma of sigmaNoise file" << endmsg; }; -StatusCode PedestalCalculatorDev::finalize() { +StatusCode PedestalCalculatorStep::finalize() { calculatePedestals(); savePedestalsToCsv(); saveSigmaNoiseToCsv(); - // findBadChannels(); - // saveBadChannelsToCsv(); - // saveExtraToCsv(); - // saveThresholdsToCsv(); + findBadChannels(); + saveBadChannelsToCsv(); + saveThresholdsToCsv(); return StatusCode::SUCCESS; } diff --git a/UTEmuAlgorithms/src/modules.cpp b/UTEmuAlgorithms/src/modules.cpp index d0e7b742..ed963f70 100644 --- a/UTEmuAlgorithms/src/modules.cpp +++ b/UTEmuAlgorithms/src/modules.cpp @@ -11,7 +11,7 @@ #include <UTEmu/UTEmuCommonModeSubtractor.h> #include <UTEmu/UTEmuPedestalCalculator.h> -#include <UTEmu/UTEmuPedestalCalculatorDev.h> +#include <UTEmu/UTEmuPedestalCalculatorStep.h> #include <UTEmu/UTEmuPedestalCalculatorDataMonitorAlgorithm.h> #include <UTEmu/UTEmuPedestalSubtractor.h> #include <UTEmu/UTEmuPedestalSubtractorDataMonitorAlgorithm.h> @@ -24,7 +24,7 @@ DECLARE_COMPONENT( UTEmu::RawDataMonitorAlgorithm ) DECLARE_COMPONENT( UTEmu::StepMonitorAlgorithm ) DECLARE_COMPONENT( UTEmu::TrimDACAlgorithm ) DECLARE_COMPONENT( UTEmu::PedestalCalculator ) -DECLARE_COMPONENT( UTEmu::PedestalCalculatorDev ) +DECLARE_COMPONENT( UTEmu::PedestalCalculatorStep ) DECLARE_COMPONENT( UTEmu::PedestalSubtractor ) DECLARE_COMPONENT( UTEmu::PedestalCalculatorDataMonitorAlgorithm ) DECLARE_COMPONENT( UTEmu::PedestalSubtractorDataMonitorAlgorithm ) diff --git a/UTEmuOptions/options/UT_Emulation_NoiseComponents.py b/UTEmuOptions/options/UT_Emulation_NoiseComponents.py index aea4a8c5..f95cabbd 100644 --- a/UTEmuOptions/options/UT_Emulation_NoiseComponents.py +++ b/UTEmuOptions/options/UT_Emulation_NoiseComponents.py @@ -58,7 +58,7 @@ EventSelector().PrintFreq = 100 # ------------------------------------------------------------------------------- # Setup input ------------------------------------------------------------- -run_number = "0000309695" +run_number = "0000310462" input_path = '/hlt2/objects/UT/' + run_number + '/' data = [] @@ -75,8 +75,8 @@ IOHelper("MDF").inputFiles(data) # Multithreading ------------------------------------------------------------- # ------------------------------------------------------------------------------- -evtslots = 1 -threads = 1 +evtslots = 12 +threads = 10 # Event Loop Manager ----------------------------------------------------------- # It's called slim since it has less functionalities overall than the good-old diff --git a/UTEmuOptions/options/UT_PedestalCalculation.py b/UTEmuOptions/options/UT_PedestalCalculation.py index a690448d..e03adfbc 100644 --- a/UTEmuOptions/options/UT_PedestalCalculation.py +++ b/UTEmuOptions/options/UT_PedestalCalculation.py @@ -58,7 +58,7 @@ EventSelector().PrintFreq = 1 # ------------------------------------------------------------------------------- # Setup input ------------------------------------------------------------- -run_number = "0000309697" +run_number = "0000310465" input_path = '/hlt2/objects/UT/' + run_number + '/' # Algorithms ---------------------------------------------------------- # Declare the algorithms we want to run. We set the output level to INFO diff --git a/UTEmuOptions/options/UT_PedestalCalculationDev.py b/UTEmuOptions/options/UT_PedestalCalculationStep.py similarity index 95% rename from UTEmuOptions/options/UT_PedestalCalculationDev.py rename to UTEmuOptions/options/UT_PedestalCalculationStep.py index 7f8f6768..0f29f655 100644 --- a/UTEmuOptions/options/UT_PedestalCalculationDev.py +++ b/UTEmuOptions/options/UT_PedestalCalculationStep.py @@ -15,7 +15,7 @@ from Gaudi.Configuration import ApplicationMgr from Configurables import LHCbApp,GaudiSequencer from Configurables import LoKiSvc from Configurables import AlgResourcePool, CPUCrunchSvc, HiveSlimEventLoopMgr, HiveWhiteBoard, AvalancheSchedulerSvc -from Configurables import UTRawBankToUTNZSDigitsAlg, UTEmu__PedestalCalculatorDev, UTEmu__PedestalCalculatorDataMonitorAlgorithm +from Configurables import UTRawBankToUTNZSDigitsAlg, UTEmu__PedestalCalculatorStep, UTEmu__PedestalCalculatorDataMonitorAlgorithm from Configurables import Gaudi__Histograming__Sink__Root as RootHistoSink from Configurables import Gaudi__Monitoring__MessageSvcSink as MessageSvcSink from Configurables import LHCb__Det__LbDD4hep__IOVProducer as IOVProducer @@ -60,7 +60,6 @@ EventSelector().PrintFreq = 1 # Setup input ------------------------------------------------------------- run_number = "0000309677" input_path = '/hlt2/objects/UT/' + run_number + '/' -layer = "UTaX" # Algorithms ---------------------------------------------------------- # Declare the algorithms we want to run. We set the output level to INFO @@ -75,8 +74,8 @@ unpacker = LHCb__UnpackRawEvent( odin = createODIN(RawBanks="DAQ/RawBanks/ODIN") -pedestals = UTEmu__PedestalCalculatorDev( - 'UTDigitsToPedestals', OutputLevel=DEBUG, RunNumber = run_number, Layer = layer) +pedestals = UTEmu__PedestalCalculatorStep( + 'UTDigitsToPedestals', OutputLevel=INFO, RunNumber = run_number) monSeq.Members = [unpacker, odin, iovProd, pedestals] diff --git a/UTEmuOptions/options/UT_MeanADCMonitoring.py b/UTEmuOptions/options/UT_PedestalMonitoring.py similarity index 98% rename from UTEmuOptions/options/UT_MeanADCMonitoring.py rename to UTEmuOptions/options/UT_PedestalMonitoring.py index a040c3e9..cadbdd9b 100644 --- a/UTEmuOptions/options/UT_MeanADCMonitoring.py +++ b/UTEmuOptions/options/UT_PedestalMonitoring.py @@ -59,7 +59,7 @@ EventSelector().PrintFreq = 100 # ------------------------------------------------------------------------------- # Setup input ------------------------------------------------------------- -run_number = "0000309677" +run_number = "0000310462" input_path = '/hlt2/objects/UT/' + run_number + '/' data = [] @@ -133,7 +133,7 @@ appMgr = ApplicationMgr( ExtSvc=[ MessageSvcSink(), whiteboard, - RootHistoSink(FileName="./Vetra/ut_data_meanADC_"+run_number+".root"), + RootHistoSink(FileName="./Vetra/ut_data_pedestals_"+run_number+".root"), ], ) diff --git a/UTEmuOptions/options/UT_PedestalSubtraction.py b/UTEmuOptions/options/UT_PedestalSubtraction.py index 6f9421a3..134a8482 100644 --- a/UTEmuOptions/options/UT_PedestalSubtraction.py +++ b/UTEmuOptions/options/UT_PedestalSubtraction.py @@ -60,7 +60,7 @@ EventSelector().PrintFreq = 100 # ------------------------------------------------------------------------------- # Setup input ------------------------------------------------------------- -run_number = "0000307299" +run_number = "0000310462" input_path = '/hlt2/objects/UT/' + run_number + '/' data = [] diff --git a/UTEmuOptions/options/UT_RawADC_Run.py b/UTEmuOptions/options/UT_RawADC_Run.py index 6d42b78e..82b7c37d 100644 --- a/UTEmuOptions/options/UT_RawADC_Run.py +++ b/UTEmuOptions/options/UT_RawADC_Run.py @@ -58,7 +58,7 @@ EventSelector().PrintFreq = 100 # ------------------------------------------------------------------------------- # Setup input ------------------------------------------------------------- -run_number = "0000310021" +run_number = "0000310465" input_path = '/hlt2/objects/UT/' + run_number + '/' data = [] @@ -75,8 +75,8 @@ IOHelper("MDF").inputFiles(data) # Multithreading ------------------------------------------------------------- # ----------------------------------------------------------------------------- -evtslots = 6 -threads = 5 +evtslots = 12 +threads = 10 # Event Loop Manager ----------------------------------------------------------- # It's called slim since it has less functionalities overall than the good-old diff --git a/UTEmuOptions/options/UT_Step_Run.py b/UTEmuOptions/options/UT_Step_Run.py index af7dfbaa..a898b477 100644 --- a/UTEmuOptions/options/UT_Step_Run.py +++ b/UTEmuOptions/options/UT_Step_Run.py @@ -58,7 +58,7 @@ EventSelector().PrintFreq = 100 # ------------------------------------------------------------------------------- # Setup input ------------------------------------------------------------- -run_number = "0000310017" +run_number = "0000310472" input_path = '/hlt2/objects/UT/' + run_number + '/' data = [] diff --git a/UTEmuOptions/options/UT_trimDAC.py b/UTEmuOptions/options/UT_TrimDAC.py similarity index 100% rename from UTEmuOptions/options/UT_trimDAC.py rename to UTEmuOptions/options/UT_TrimDAC.py diff --git a/UTScripts/BadChannels/UTBadChannels_Basem.py b/UTScripts/BadChannels/UTBadChannels_alt.py similarity index 100% rename from UTScripts/BadChannels/UTBadChannels_Basem.py rename to UTScripts/BadChannels/UTBadChannels_alt.py diff --git a/UTScripts/NoisyChannels/UTNoisyASICs.py b/UTScripts/NoisyChannels/UTNoisyASICs.py new file mode 100644 index 00000000..b9321173 --- /dev/null +++ b/UTScripts/NoisyChannels/UTNoisyASICs.py @@ -0,0 +1,55 @@ +import os +import sys +import importlib +import ROOT # Assuming you have ROOT installed + +class UTSEUCheck: + def __init__(self, hist_path): + self.hist_name = ["UTOnlineBSMonitor/Average_hitRate_UCaU", "UTOnlineBSMonitor/Average_hitRate_UCaX", + "UTOnlineBSMonitor/Average_hitRate_UCbX", "UTOnlineBSMonitor/Average_hitRate_UCbV", + "UTOnlineBSMonitor/Average_hitRate_UAaU", "UTOnlineBSMonitor/Average_hitRate_UAaX", + "UTOnlineBSMonitor/Average_hitRate_UAbX", "UTOnlineBSMonitor/Average_hitRate_UAbV" + ] + self.hist_path = hist_path + self.root_file = ROOT.TFile.Open(hist_path) + self.hists = {} + noisy = {} + + if os.path.exists('/hist/Reference/UTZSMon'): + sys.path.append('/hist/Reference/UTZSMon') + try: + importlib.import_module('ut_dict') + print(f"UT Module 'ut_dict' imported successfully!") + from ut_dict import UT_dict + except ImportError: + print(f"UT Error: Module 'ut_dict' not found.") + else: + print(f"UT Error: Directory '/hist/Reference/UTZSMon' not found.") + + # Open the output text file + with open("noisy_chips.txt", "w") as output_file: + for hist_name in self.hist_name: + self.hists[hist_name] = self.root_file.Get(hist_name) + + for hist_name, hist in self.hists.items(): + print(f"UT - found {hist_name}") + try: + bins = hist.GetXaxis().GetNbins() + except AttributeError: + continue + + for checkedBin in range(1, bins + 1): + binContent = hist.GetBinContent(checkedBin) + if binContent > 0.1: + ch = checkedBin - 1 + hist.GetBinLowEdge(1) + 0.5 + output_line = f"{UT_dict[ch]} Hitrate: {binContent}\n" + + # Save to the text file + output_file.write(f"{UT_dict[ch]}\n") + + # Also print to console + print(output_line.strip()) + +if __name__ == "__main__": + hist_path = "/hist/Savesets/2024/UT/UTBSMon/11/07/UTBSMon-310209-20241107T174311.root" + UTSEUCheck(hist_path) diff --git a/UTScripts/NoisyChannels/UTNoisyChannels.py b/UTScripts/NoisyChannels/UTNoisyChannels.py index 7f37e2be..8fbc976d 100644 --- a/UTScripts/NoisyChannels/UTNoisyChannels.py +++ b/UTScripts/NoisyChannels/UTNoisyChannels.py @@ -34,7 +34,7 @@ class UTSEUCheck: for checkedBin in range(1, bins + 1): binContent = hist.GetBinContent(checkedBin) - if binContent > 0.1: + if binContent > 0.05: if hist_name == "UTOnlineBSMonitor/hitRateChannels_UC": ch=checkedBin+268288-1 print(UT_dict[int(ch/128)]+".Ch"+str(ch%128), "Hitrate: ", binContent) @@ -43,6 +43,6 @@ class UTSEUCheck: print(UT_dict[int(ch/128)]+".Ch"+str(ch%128), "Hitrate: ", binContent) if __name__ == "__main__": - hist_path = "/hist/Savesets/2024/UT/UTBSMon/10/29/UTBSMon-309439-20241029T204254.root" + hist_path = "/hist/Savesets/2024/UT/UTBSMon/11/07/UTBSMon-310205-20241107T173911-EOR.root" UTSEUCheck(hist_path) diff --git a/UTScripts/References/overlay_center_natural_asic_UTaU.root b/UTScripts/References/overlay_center_natural_asic_UTaU.root index f7a7caad011ebaa46006c1d79063f1de83192578..754447cc9b873963444fdaa459d928ba6d135286 100644 GIT binary patch delta 4531 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 OUXNd>)ucEb0RI8pp|73* delta 4280 zcmZ`-2~-nT7oNxx3_;dFfB*?WlMohDp<2{pP*hBSvM51>5D>M1QWistVsL8(`-}K0 z$ZFAA6tJMEh-d%{E>%HW6e}REMF{}`w^m~RN#;$A=lnnC40Gpx-}}D%W?o+IMBYZo zYbE%mrKDsa$ZHycAgd81mV_YUCNvH~4+45@&`19zAjqsf1fh;0gap6deLhFbN6Vkr zZ_XjfM+^8fOc10RQPbi#{#Kb@kQT>LpVbF~SPZK*&;!+0{|Rq=BvGKU*H;t4tq2yl zY2pgj6P&R`nI^#m{R9q{AWccff~|O<TA?1p1b%vulA@PR*4TO@L<G^h3r?8$ftmUc zje+zkeGbl=iXi%z0D}?$rW-(CfdRB>S<V8nhR(p)&=vE|(<Fr0MZF=U(KT5nNF_p> z3Zk|MGXyar0=}Ui5F0^sYq(mK3GUztAxs2Lg^aAJP<adwj)!6Qrilb=93W{eY!JkF zDLT&pP-P6!X^`$ncE;yviy-7rHLM6{GoWM`gL*O%n@BSm+NFeIE(d8wAeL%}p+1@< zoHKnIq}~j{s3wj^;KejZoo1>nijE+rnHsx0rm!d;91>^-6O&(H8tr&u$PB7W%wZ6% zp)f&>xhddTK$~C-tqluZUS~B=&&Cp}%7a;80fh_lEgAUSIS69;Gs;?qCW*kr3hHpJ zpo^1ch%1<|f*M0XY7IE&y_6#CPH?RuKL>@?D^**#K+U(o`8JUDFz|oe&Mj0}yodU; zMI8iVwt-*+!3Zb`L=b6ffmx;4O0nQM9+ZmdAm7#-oV8<MNWUGV_(G)C9wN8wAtInj zv0LDQpv#=rh<XWutpl8-uLGnt;Q=>>4#W=LAl8%!@*Uw_I_?N*UC|gCWJUzrogiB2 z1W|js*2^40=-+_?Mj#lX!;(xHkd})F&8z6Zli>|S&XAJr3@Ks_;spduSZFE}A_}I~ z16|H85kN9M5S(*?0s}6P7C9XTf+#xp*ToyKXFy8e42X=bq=SQQUcjCOJ@_n$G_$lG z3<P1b0KwfKY-7VuW*u7yMmcad;BW##qANstBk7=v?FJsZLe#-k2%@?0LI%+uJYmia z1fgzl>~5|QTyt~9pB1`Xxo-fEvuH}oOQ2%2vF9yw69RvCsQ0&9AZT@m!;?gq^(e;( z@ICCT3{>i^czUO1A7rbSnfm}p@u0}A8z7z2k*^8LlHhfH{#KU<MjK11eyS)6XL->* zTCI`wk)wep>)r>1U8!70Vb1qDdb(}VAB$W_kA`l5teP>4$?ch@F_~ui`=7YnPC8m- zJ>Td~#iHz46Y_@A=a*j1ZXlWl^<UpS*x1swY1YJF%E>zkcJKBqK5(h?=4oL@UZN~~ zult+c7`w{QQ<LCz{i$QpfR(0U*>Uml4ezF3SS`L$c>eyXf4b$hg`wRZ-+W6E7RHU3 zmsKWRr`|IAW9Fv$7jIruylj2cGidv&vh<hpuO0-Cj{oW2`>$SN`qz_<Db_9X259p$ z9u8i}zrVX=Ad(gJR_T6^S(LnfH{ayl%Gtg$-?yq^r_rv9pHC*r&Zi0#mGPcUrOofX zWUu0?&MA)nV%yU7efGL*C0{1rJ$W@o)_xOIw645-Ue^6d%NeUrdNNP1TWS}buqQWW zQt(^uv8PQPHp5x-9<O*a^-ZQvZA<NiRf-Gmr3UZ5Z;ec-_Ejc3L{~)lFwYDvIp)!= zcv77uTke#~lPE<+b5o@u_h-9a_<e2svSpD6vVY;%Zj`)EBqko3Ti#au_x^|u$9`(Q z*e6MRwo&L*cJk4zYTkbD+4uVIl&}iD^sAIEKXly_Oc_qzrtB;)Oxo?`Dr=@&^wp%- zOmOc2Rd^BM{c|_koXM;Chb?;!p5HY2rtW^j;Rf0IrnH=06_>9k3Tp$zT^BEy$nW?3 zcx0oko1a<Yi&v*+l=t;Mu+KJG%p{NPiar7OS3kAMl%G+Nq|*!=RMqSe3b}vO)xT_H z<ZX*;pqMbx7BEO2O53nCcTGlJ%kcQ!C%2nwq(P0x-8}XY(+s_mM%Zh1%(;C?Qu@t5 zC+waqlf@njiaVxi_45#nDb8H+ydAKmpLQagbz;LVQ8f^a=Sl<z(4<@bP<?n+{k^Oi zIpUifw~frV2IUw13U{h6RxD}V78K{NxMHig60(`k`kT@*e{K8xCGX6AuGX=GbGDva z_Wseg;-%YH9rnpR?HPA0NWx$dTb!l)d4|@qG`iYnmq9)1xmT|(w7mV|eS%=4#Wl~h zb5`5m=G5-hyY2bRs_>lo<hCHmPTJ8e{Hl79gCv2^I&o;@q99?M|Jcs51MPW_96#gb zQj|-cw7Xc3+x+!jTv6N?b|AZq`;@lzRd40UV1(z2>pMCnTic!pDApsqEKjc?S2x+P zWVrZjkfcNSjAl)JQAaX<(@uUFAu+gAcyRN~lIk##a+iTpw6;I&)?;Ji2?2Mc?OAv} z@vwLH%%RN(8Bq+68!4)u@S~~a;-t#wL#_*roUYC3e3IP%?Ec<umcK99?CG_~dHE&k zKvH*?mGwx+j_oGV9iDx9zCSi?l2@cXlucaW*0e90o9(o&F5p>rXVd8RYmUJ^CZ@AX zlnU<n`on!0=lvUlmPR|&()H@MxIEoXv1<LNsn~SI7l`7!O`nVSgyE`^@ix*F>M^c8 z*{n5@H4vYJEKa-eno7@!bWhk$AU)vw8+7Io<{h1Lsg0LIJU#JM9{B<PDT&6>6Uio` z#vi5r>gj92+V_=IY8>m3g$#D4B3yP(`eElB)T}9$)=DBh=qtBrMNI-Yb6t@sBIQqO zXMc^lEnW7fqn`fEnj^_G7oY}57f6jC@H==XqY%@?K}NH|R~w`Y!|CXGrSx!I&ndT} zvi|yYhEXeRZv5mPLrl)_kQL03AS%kQ$BoIssq96aSIS9$&?7GXz&3kWG|by`m+E6} z8McqSczo)sLMMKdVs(ANm3o7a*s`I`;(g>bIWLNd3%{IOXGuYe8JG2~Z!4?XR7;o6 z`E%y4@&YFcLim1;V|QnmM{&P=XZyi<6y-IajOonb@v6A+HqrU$YFT=t*MPh~UcPYS z2rd4Z<C5<89gQVXa%p;U>C^N#S7q|BEujtno`?^2JowosNpndr9V1yM>uLnw_!&JG zp1Q0;IuaB=PfFLNt%*+$O?;=wJM<&t@9bq`vnhqYwP<>Cbl*>~)a?5U)cd}=V@FmS zgbTk+&mf02?C`oprK0UP%Cb13VJ%U!(1sjk6>M?0K+m!0k*R6r{nQMwg~|f;!6fWE z=wToa3-;RRWCcMmn}Y{jYaMt9&pHJ|9@k0-&c(CxU>@GEVQpPOF#LiGw$R~6e*sk_ z<~rFSGo6b`oWcvyO42nAsaA5DsSf{U2$ZBx)5-dT!fXm2G?O(jUM1F2e~=8*nqe)u z78xMv$Q}=avSU+qvRS$p!f;608m^VZUL>@V6-1rE^yQFWZ>W>a!?P`TATZFtc>UO` zk5)2fh1Lvvb<!d!dOEVI6?kz|bh0Gfi?RqvxrGONDIDM_f~zP=1iP4GJdnAe?N}t~ z;|8cw1begHTn&n?ypTvZScV73@t`+S+d?rBgkul13U%y{^s&ZHi#D@#^xIZK{ZTw{ zh=LhGlvdv!?XLtM^aor%(#M)pt-gY(qt9Cf)x>!4A3SJYrPa4Y5XPnt`lgJJ^sxq8 zt8Y)&(XWh#`dxUS!UJxMR^J#w9BMx3`#OB2kG(8t^#wE?eRDC?_r-(tcu*?V>gyqh tZSM#D6x)yV(LD!!@u?L3pH?+0mS*;0chdY6q28TH>b)wKl<EBg@?VJn@DTt2 diff --git a/UTScripts/References/overlay_center_natural_asic_UTaX.root b/UTScripts/References/overlay_center_natural_asic_UTaX.root index aa6876c3787a1150d7dc531213aacbebbbbe991a..d0cc0704a1dc8be461726c481006678d9fcdec64 100644 GIT binary patch delta 4635 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 z	nILQz$U4gv@zhfW;e<n;C+tjY++jYz73X(}152$qk9IB3chGL#hfOG4x{;`l13 z8B;7_cL-i^dzseyXhBY{j)=0yBMhGy>;X|ODFlehOCdlMaVS8nM~MIxfT7qUBNP{X z<z$0ls{qr(Fl=HYixTr=56oqyr-FwW3K&7TN4b@P$RH`g3CC(4mI`nx85K^O<Uy3u z3La>IS@?YQ=rUIj5iiBkIb<W=OabmCqiOs}9>mc=!9y3F6;i)?Xz>(8T9;vu39@mN zqW~|9!0;K<Ngil%p(Bri2U=VvC0{+<OcX>sBC*JNve9a!05_4*4#P<vXgfnkI0cU> u0I*+t^;pkV5UE_wpY#9K%xLxb%c^>{uUn<q0Bx1ir=m?$ylS)Se(+yYshK4J delta 4410 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 R;UBPl&Y2Y9o8+7e{tN#dFOL8K diff --git a/UTScripts/References/overlay_center_natural_asic_UTbV.root b/UTScripts/References/overlay_center_natural_asic_UTbV.root index 70dcb8bcf44f63a0ef0c94f300d08c7c67dcee7f..018971551ae90ea5f5f16101520e8a87da996b05 100644 GIT binary patch delta 3830 zcma)9c|6qVAAd%SV;BjUaf}(WuE9`_A~MDmjiX}MmTQXIw2lZ}Ytl`AMUNGsUy|x) zvyMuUvqRUeqf%D%N^5JC<A;<&{l3?HY5)3pdA{H0`}w>-=l6M@?|bt8O_?g9ILF7v zZUf-GE&w0`0RJgulp^z0$e<u2Mi#k50$|b%0AmzTtVKCSsa<L#2U`br?@?+P$#OAL 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 delta 3576 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 diff --git a/UTScripts/References/overlay_tell40A0.root b/UTScripts/References/overlay_tell40A0.root index d5a1f5069936f0a41b84637045c34e61c2fce23c..f2baa7ca694c0be77ac3c23fb5cf3bc8ffe1ecd3 100644 GIT binary patch delta 13403 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 P_%;px|A+hqQRsgFnXvGf delta 13152 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 X{BtF@>O}tM47ci}FQ*+Y+K2uhD*I+a diff --git a/UTScripts/References/overlay_tell40A1.root b/UTScripts/References/overlay_tell40A1.root index 35b4ba589196912fb0bbe6ae484d8f6278d602ee..99afb0c1a692b2bd5df2460824eaea709025482e 100644 GIT binary patch delta 13863 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 delta 13267 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 N#K9VGLj;NF{{WDd;Ryf$ diff --git a/UTScripts/References/overlay_tell40C1.root b/UTScripts/References/overlay_tell40C1.root index c7841c647c48ac7ffb6ecaa2ea74d74bf9c668fb..56222ba9ab8bfab13418470b8fab3696f80f7b99 100644 GIT binary patch delta 14472 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 A5&!@I delta 12916 zcma)@2|QJK`2W9@6hb8miDt?!YP2XWnVAaZq77wf4_Vs~H=4$jNDkfXOvxTC#w1bA zG&Q0{+7OjeSyLoie&2J>bIv{H|9icD|9Oq+InU?w{k+dPH|}-5&y*F6jmaO&^Y`)D zgU}aMgwR$brYMiZrryW31^yDlU#rLB|7=6(N;g8&CLys0&k`=1T%Oc*$vgAlA*u4N zlNNI(B6JLqHix~H<+3OJmuZuKl3xf}R+Aa{Yb*Z3|I~<&ia7Z~Wh}L5D1iEt=z6V5 zn2(!9l!@ukjaD&G+{K~bQ<m?DS!1+mi|v>I8H#3%BoP|(C!sNJ86iIw)C;f3#P5g* zrg0D&-<XE31iM}uA&EF@eY*s#fANxBZ$qPE#<5m>apU?atDPiRLnT>N9wEthl*$_q zs@Hh9fV3w1jPxgf;xqx2hfu_VBUTC=6;f=n5<=2iRPrHdP~98pz&@s-2Muo-a3smF z>s1h%IF?$!aU!TuFEojwiS#AL%Cb&1gk*P7&Kt7e>=dc$2+6Id)IvE>8|2_RY#Znk zN|6VpQXUkGNl+Bk(-!f`V3|9a1#2QS`7{;%kx?gsea94rRY$LHWE#>6?0Q{<6!s8e zQ!R;V1ugo8GsSlGsqiZLPGzkI2u*!Xp^OwE*+r364G~hjO{p`LK($eV3mADupTNXv zpqNYp<pNW<fyIA1Skk7m(F+k$9#2KPDT8|BsU{JlszWp?&!SKII5gI(KqFX%UB3h& zl{bW+sul60ss?TEctWm+YkaB7TFnrev68ap%mC}X8LVoKklI2@6{>++rUqA1_?S%8 zC59x%6Hzm#)0o_uplYZ?ArH1zbqJ8tVB?n~q;Y_Xf2IMdUoD+#I|~|1p%L+;JTc=( zDdOcUNgCBQi_Nh{=({yk&gJi5S;`~L*ze(T`QNin{L|+9E0lBkY;c;*W>r2yv$H5w zat^3^bN10cKMasKLUT?N?#<H(b4_Dnka4JM?xRmA5ei}OR55kRvr7w7qP1v`a3&*d z(xxS0w*r{0UF3)s?a6f3kT#2zLP%#Pi@mD@ksoyc>!AzT(oE7~J@B~bfmApJLtYvf z6Z-mq4P!c4&>^byS>$Ad3>HyHa!rx}#9cQ4q{&>!O_~h36AZy)U<eYAk%mDMPGUOy zjli62#3Gdunm3+Bdd>q!%sfC!&4*mwNf>!(fidxXK6t({(tUZ5s(+v*VFuG#ZVYBG zV-`6JA>(Hhl8jrj032=$09glx@Twf-<}3uyy@hZ#u8fqj2#`ihM`<ybmo8?JItVS! zW|7h+;4m}+WG)m!Ygvrsn-~*;OTd%51dv@5LE60(kT;l4zmXiFws<`8ZK)Lf*GR^c zMbAUX^Z<n>W9v=nwXtSE4uV2hF9Y!_c|i8&0a?IErshDlV>%_!AsWnCq6z+>u!16f zv@j;}EFkWI1t6`KL9VAXMv|WCmf$h71WAsOCjJP>S5jb(fDV!WBa2*y&`;A?WbjWA zm;MtVm4AlZ!3mJ^;b-v3E(a-%lwwvI6EBtn(vRt^UjgQWD_EozLMz@=NOFz!N^tnD z1Y|1|!pQNEd&LSojaGo1%SZ**fD~gonl@mzv0;(+2-*C}B2`v_!+aGWOQ8^|NMfX+ zoiTBAHF(ai24uxJkV0$$d6Mb$L5EP~vq&d|_`gv|GOmpeaq@P6JO+g@PXcls?ZFdj z4@g@^TIB#p4W@G&Iz+nzi`<ORnhh-S>Kcf9xdxC<Yaw^ZSTXh3wZ??@I<Tx>2TIcz zTA8sPfES=4ga%Qzp5=KUv_XsHky()&AggEt;B*`z^sYD^+V2P!H78JfK<RJ-oCP#? zID_@LGmG;_$oVUEdFdOC3FnRAIJ6OX15gN^#qb>^J^yY3Pv<7u6F&mVH5Xcme+Z3* zu3+8h$^wHBa=pU>b=|<hcLQK0Q?!lHyaac!l)HoF1SnCPL2-wM<Q8b?ZDD!g2yHn{ z@yxg4w@b#Mz7@g}nIiZbez(MyUE3fedK*|~g0g8lDBZ)fHPTRyC|bz*K{vFW<sL(5 z$4-`ecLyx}xC25xc0wTyVT*Tx#bp;Lg+nw(-vg8|Xk;;sDi4+yi;(9ciuckJzgc?1 zlIxxjX5s}!(ja~h#+C`Y!D6r*6dowUj4}xt`@O-M?9K8L5%L+&@;rUO5#s}4Qoc~= z4$!>kzF_&rDEIqmrP>da3}`I(hlZCw%ljQ6|7R5MPyl|L3;>5)0AT8v;_6rY#*8gF zd%$vU4_I75N!bgE5j2$cL1XDYmY0jrzHF8!y&oKg`ynisDXjZwUf=<+q#giE*B4sZ z9SF(|XuM+@GC?fwB0@n2D4u#Seq#)xm&67`RuEIv_o@@5W92~z^*#s|0Vt*+px8m9 zglRN{u((o$LRYZ3yii#3AQZx^1W<VP(7fq~z+!d?6gf~PhJo_xGi{Av8u?)??<PXw z(<t8caAP7k9G0YqLzwbmC<Z^N6Qt$CVX(;l0!kVvFMa{V4;t%_K;z&MmRE_;k@qam z`d4uH{t98OOcB{l^R7gIr7;35b3rNi4HPkGXdZ=z%~6(DgV51GDW2OgV?yN^ILwbh zSSeGed{ie$%h5=%oR0)cMHj7v90%njH2Ro^Y81<>Ln!Jume&>qOXQ;=>=;wzb<(Mh zC%_VV0xY(mtcn3e0~)uPMtcm)dyUY^4J0o%)|j|@5>~uC30Y3DP%P<CCmq@ZI93xN zG__O0j5rW3(8ogNxGaukwIUR+#jqmdVL?$mB<Y-j;%*xi*?$TgYC;fvXrV(0f(3oN z<1`!}Kh3f}A$0mHbsy6c@cUl^I1VL1)BsaBx01h1=@WC4#}of1f~_+VY$G2;>a`?L zAF@sO?RjG|%N;-{`3}YPO)(~PQ(y@{1p+IXqV2sp;hUmQ_~eZz5>mldo(i@TppK;B z-+t3Tb!VHv)k|l%V&Vv;pQgCx8Tjom9hRtPKwu(M1iz!X?!QAw^zUGq3Ch|tpmev; z*85Cj=nTt~Lg?&HiYK3GOx!&SypLxg%p(&DX$Ubo2dOUSKq-8S-zKv0FO6BSI1CzD zOrt7`<xNH?dlAJWmn3DwlIz(JW|9L%(i=K;LM~VgazWu?g}LLyj5>*J!s#XFu}o!z z^2ft#Nxx8@`4AeD?=6t&C7(PVY^9$6X^~GX^M~+b#;uZTEZx2Lxd(`EF~t8m*^K{N z2DKhU2gEvF*#5R@$Bciv_kTMpW3l_ztl3XYevyAIZ~40RpO&UF!e$O(WMz16U5*<+ zOY!)rCqL<}J+J<ouAO{-seJyD;?1=MH&P5|ODmNsoUHj>TCmW-xcpu6yTO*0>ZtB- zsd^g^?DlWDHorf)FFE*LU*qDV`~8Eui!aAKigdO1xu+d6uR1fK_Qk2I!H<?D>NkI? z_|zTpw)uy?pZnjhNaU4Y8*cqt=<m}ST5!Cwa4v7qzb{WkSYOqka`@py|JFFquCmgh zH%H!{aH+pi+}r!f)l4vQx1;TZm+Sr8g$6Uriw-Ulye`g4J3V;!Vd>JZ(OvCzmxl6| z1`R%0A39Q5=;*R!PxtG7m4)A~T>N~2H`4pcq02p?V)(Q7Hf=$#?XLCxYf9R^pKiDq zs=wZ)|HT<i;d$P@frO_%p#xF8@}UyB-F<=s?IrOQa)+1b-!8vAQZy_m{qnj0@Ot4@ zXS0isn?4<VrMuw|*O8gGw~g#8Nw`?(`qiS&&g{>?q$|k|K?6Tu3E4V)#ahUFWU6NS z<wR%1VAI0ZW>>YrPgnjuQSro=&<`$s9v)h-xSIE{u&pXUm^$p`_;e`Y2iMw?p4*lq zx8ErZZ28^UcH!Hk+t1tHw(UC=EVvu;!f37crM;G)BnOrZ?CqKPwoh*Vo4Cfug&!N{ z-xpk{|D$9<eN%x~r_!*{OVz1s9B*~N;_7?7&Vzq=?>_uP(mulv-kMdRWrJ(Pd{W1j ztoF`3*y&&A7&_C^zRvG$P5h43uI(2!tA!JX)>r(Rd4@Oe*S+RGUT^1?k*^&KuNDZ} z%nZ^Tt+Yc*hgyBw?f&VQXY2Ax*jaj0R@wPg^|jo?g_|ZdFAY30w_)#*YQ-m0{nr(R z*9!v*n?jr31TPAhBlx2sNpprwv#Y7|IOpd5LnF;2DW<+1&bGaT`{Lja0gE#OOrG+Z z_P77t(UCZKesz84jcb2J?W;<@t6gxSCS;Q!uyb?qa)ajI);`&HH_Gphj`56&ZBdp_ z#x&b64*NmYQEtJhe>B=M{;65C)wE%Qazy?uvh48I!=6;C+)b9{WV!c#@|Kc(zdLoj zaq)7O@G|o)yHqdAQVD#rY^)~}-cn(8WZ7pdAmcBPof%~2DHqG{HWwwg^c(S_=jlz4 z$p0=X)9;Q6W!^%Sjd-12NY`(7`eHOZCAMwY9%Z=>uiWzFy`tVbch!sQd@}5xEZT1T z*~z$N@5Kb+KN*23UM*zE<0|Xs(~qm#Y7J!_J*&%ph<2<ldm=a<nBtA)oi15Pf%p`k zkpI1u7+4_J9JBWvUT&0^@O1hX7Ztofw%YRy?r5}m&7T{!W!?P3OMflex_iOr8WLCc zLrZ34L{)U;(UXDhMSpKzTJ1UKo6WUT>4Ed2H#lm2-mH32aa_I=KKb*rcdA_ZL;m8Q zrw(QM3GTdh636!-(sKfJcegirs$%6jra5l3zE0lj-GA6M#}pS{pgL|U#*E;nFJ|2w zbE|kPzHf?8Cl|3R{tqG3Q@ZzxWpiWcGuK-@LH`k5?W{c|6^F_yMx@_A_jinb6g$?> zLtACWzR)<ee#h~dKc%-uL`<H|-yIflQN_Ht=fSwUR*?}ky1vH$SWZyVQd&^3JS{xT z|Hz|dE2nD-P4wf=h2>f{n$7l3-#B!6yVYCsD^eaAZ)D@{W++<qnLo~bW+stgpFDP5 zrg@G+w%l56zK(>)TB$gzu+~tYG-B<gdB&u$R$E@@RyQp;#fxX!r_&3*?A6msU+R`# z+GKgdf;yRXnWr`4#Y+hJOW%)cx7NAkU4%<T!Q(O0q@}c$i)BZP%f01`7wg=zp<+kj z!Vi0V$e4Jlz{<!{N5Y#r3#a%x)y&RQISRu2`Bq`}+Wb8G^fgkoxe8kGI7GrK(_F6S zYH54>onkY-MsM9&@&azz6#UmZ3wtX+NRby1pvGNYVAXv>CtG2}@Ft;gX^Iri?m6V3 z&DWSts9#bbW?WK|CvkbT*}T22o;gvkY$}O|mz9Vsm*)yv*ILmhanmzrV!_|J3Oftp z9)#@r^X;9IrRmG&&BsV5-OL1hy9(kbWAf#7R`@<XaMI4e_s%o(m;YZO`u?rjrmyuW zWx>;KpU*fXm6L7%KBFgY0dc)mdwynC`e5g+7U`TMpWe8H8i(y3y$W%u;ZCL!SSf7^ z?qOaQ+XM|$iIN~GqWcd8hvFb9D_e_#)Nnmnu~+<0<k8~G`KjSG4*a~V^d5!UR&6a) z3D(85*WC8e3rSBN%YC`IxypFOGTXrGaW|i7Na*}xc~ttCnw4!r&SQt|Bz7G)Fh!wJ z<5q%1ZhWBD{Be(KELHTJO}G8pqtNibpw)ZgLaqiMxTYN3V{znTb})HyRqQ#E(SlLY zyBcrY{~+~$M0+0}@ZBC%S?{HF<btHsnib=U%bO(eO<QMc@j*NLu>(IyioTbf`%}M~ zAE}kBB+qQyx&KFR?diQYM@t#yjys^GAyynz+4AVWx6wY>r1idS*8t)2=M2RM!{pzQ ziXYL`*uXQ|_<k2>CFVRPY)jOLH6>FPKXuTE%&B<0N<aSQvneyPW}8a%2AL>tUtw!; zEmaDipNs908ixm&p<}{FDyDqNi5V~tG<|IIL3=*&sbucT-XI<N<#)6h*7xz4jnCH8 z_6Yv#P+&S0U(V$(Yw)E#sB_4$CQrh8CH|%fyBH+p6r7td+C-j@VD##^l4U#6Qf-E- zug;lRX(mzpMO$l7p|&n7z1@NDnRfm|n0s1kxzeCQT!@rMhXenMc6PC?#q+H6M_rGu zbXDy7u8)^kR6fkRZ<lwb_QipUf8$2l-epgCZ|@VIW@OmPd%5H80j>LX>5q8JSDn@- z3juF=R7Tk<)3>fqy-$}9P2pF{nS}J;eqdbPuA%?*=V3`lpGMW-bo0RFJ0IL?Ol_&Z zb0Oj4b2*t6!+BpNXY464lyR{)@Lm4qrR3C`JjIu*Dz*&9rNt~8_<A(q5$~rH_#A5_ zO+p6dq@R`BGtjfjeC5pS`0^;b5yKs_q30bOB?Tkr_|f8x<>nFV+8;`8YS&C|4c@<V zwp!(`N}J-za@*3vod$bOFK~Vr)bi(JtIhM@%D;a3ZpZKjNnX;b%x5L|+x+=KzUOBP z$8eA7^;!F`e_cLStx{KEd#;ia`R9WV6_ILr3Q6~M75HsarL+q9=3W2lDumyRJo@6V z1jYI+L0S8xSc`(5uuruzrF||{YgVM>$X<BXGG8OL&oNhGIBN%QZ_!Xzp^bF#lY1_U z1m3+{Ud))^aCP9XxOGa?qvpO7*t=Ysc~`rmRj?>vVfE!tHP%f_{JaMrPucc-_|2<? zgv)1!+FKF?W8{w|N>K9v_`|o`_tb}PbNu0Z3?37>bfol~(v)iQW4YxiN?AyLEUyt4 zo>UZ@g(nES@aOaW)V#nlQYQYbF`{=ezSS5p`}p)8-oqOBeSrVHCh@TbHat=uu{L^B zkhQhV;@FnfLabjc>!&v(S-+eH$1ndF{2J<<ZV=NgWQsC1N@mWK-acg`S3hB4^tLOj zyj11Hc8F~BMlNd$R^ix=KZSF;@sy3FH;!3<+H{WJ?HTwlOyhJbneGTv*eFpla}D%1 zHyfGyoQ2Wb<E-L4l@n`P$J%tM4R_Wit-!H0)WJDTs%QP0)CNE6pF5f3FRBN>#UxHw zxdFPiOwk}m$;>sVQ{xD1WM=~lqsJH+C03S`8ufy8(PI&ei%62;*z_6!?%v4y=`jq} zUm+#($2Nie;RI2W@L;-WOyM=2l9?-zr$$EDM6;JHOO_fnVU?J1oY)s4n>01N!rF8t zIJSeY;G8bJVq+z#VHwtMJBH)uzh*93oYO63x?ND59MUALo8cQXCSRR!eIrF*kAWET zn>)-dB<E2o{jEOf4UG5jn8F~JBPYGlk*0oh7>Fq#ltWm|olYjxYp-XI!Y~gd08^F4 z$q9Q4m_nv-ImeNuTUd+?LYai0E(i1R>?jQLtOYPbXE-_CEr6N%4vOgCIdbqj7K48% zW)K;g9E^I#C=Bxm2{3x;oE-P}kbZ(G%2PRV+j|Cs@FS2E;-MP{!%yL25c7l#FdLIO zIS)SoW`rp^6FIVTD~sttD1i{$#K9a&7=>XT00QRtX-<ws8(@5xLQTk#@3yg+c7#q5 zMvfdzQT!+j^Gp*kWpSLG3+;euVv5xSM_$swV%{JWOSrG)U|yaag<&4k0;WBNlcUiI z7+a<YJ;9OlI$2BuLea!YI}S!ZdK9J(o<0LcHHwpSvI{U3OmRMvBddI5F|~LokGQdl zgE2og3R43Q)d6F3l#?UY4Vbx1(HOyzBfD8l6+*uf-77g5-(N>zDq*hxFb9uta{N94 zCXFd%f8of3pIFS_2puLge&%4(!$)Cm!WIZ%^20beuRa4tt_KRULmb(&hsBg3Bp~dT zaWD@;M`21~X9qA1A)Fk$UPu=(h4(>@T;I!LE+Z67gqevjvB9G#7h$^!C^A8um>XY! z(!~_12RO2IA4|!{AG3%HCL#)9xPKHT7k1$QvveOP$LK3yT$$qD9*%tVD~macPyq32 z0SDt2FbeZKY%T)E%b$~z(GQsWO!3W^BkK;Zm}I;qN=%y1!NmBC!X(0;DPWSlIXROC z0mEYogWViCX^_RlA>{R+w;Rt<m{`~f227O)CnszOFojIvvWp{253`u#2<`mO+s%$q zm}9WR4Va<roSg1qz|8yxMf5g~9Q=*N{DPl^|L5&y>nKb(Y~TY%Zwn{KeFV}^Fh#jL zM{Z-fm2R9apFV)k04N9s5+Hx0tH_E68R&dG;sBt|O(L0`iGcRNMp2tML?18!e;Ba< zz;S1hRftD3=ma62+JG!ICyoJ+c|cpoQPd`iHc$r)!UKjz08zGHWEJ9J6F}fO6v$e= zj$^=sE6{dYD{2!j*Nj4JhB+8Ov^$8bLOehN2s~T^S)ukE10KhL_AxtAn~<jun5%Gt z=^j9+@<mo59t#2l9vOnH^Q$=qJY)pz(p921VNM?~2z!`W0)&l?$STCcPJqCJP>|JV z#WCQ~DQLH@6txLo`hY=L!6X(S4z3Vcg?NMu5O}-`vSgQY40s?6+R8tR+C=(K)B%H7 z2J>Zr$p2Af72?4(K;WS@$TG9!81R@Iw5^tj+Qb8kQ3w;5ngc|GxyUNS<92|+qj-?z z&EpvG@E){-%tY;2x@In79!vrPLB>?%6yi}rAmA}Wh)P|;G2p>OXy=-U+Jqr}z#w#B z&Jhqx7mKVyJRk`OJUj_m_ZD&tc-#`&bqhpo!i_#)5VK%<6A)g;A}cxe2?#tA3R&Og za}0Qh6xvdpHW4$A@-PTxm`MdhvJoc%53>RS54u8@fg#6$M`NLFGFQ|lt{aR(OomBY zKve0AtU^4Z3kW>E3t29D90MNsg|>&Ts7-v-8HJF7`C&i|X^X7n@G&6pU@~MyYjF&C zlo{HInxZzLP9HEgN*pGm0iicXT@j)GZTD5UOHoXfUPV6m!T&c2`QT@cg#3QvIP^b; CB^`|b diff --git a/UTScripts/Subtract_MCM.py b/UTScripts/Subtract_MCM.py new file mode 100644 index 00000000..15019986 --- /dev/null +++ b/UTScripts/Subtract_MCM.py @@ -0,0 +1,34 @@ +import pandas as pd + +#This simple script allows to subtract MCM from pedestal file. + +# Read the input CSV file (adjust the filename as needed) +input_filename = '/swdev/wokrupa/stack3/Vetra/pedestals_0000309677_test_3.csv' +df = pd.read_csv(input_filename, header=None, names=['channel', 'value']) + +# Calculate the average for each group of channels (128 channels in your case) +group_size = 128 +num_groups = len(df) // group_size + +for group_num in range(num_groups): + start_idx = group_num * group_size + end_idx = (group_num + 1) * group_size + group_values = df.loc[start_idx:end_idx - 1, 'value'] + + # Initial average calculation + initial_avg = group_values.mean() + + # Identify non-outliers (values within the ±5 range of initial average) + non_outliers = group_values[abs(group_values - initial_avg) <= 5] + + # Recalculate average excluding outliers + adjusted_avg = int(non_outliers.mean()) + + # Adjust only the non-outliers + df.loc[non_outliers.index, 'value'] -= adjusted_avg + +# Save the modified data to a new CSV file +output_filename = '/swdev/wokrupa/stack3/Vetra/pedestals_0000309677_test_4.csv' +df.to_csv(output_filename, index=False) + +print(f"Modified data saved to {output_filename}") diff --git a/UTScripts/Vetra_Plotter_EmuNoiseComponents.cpp b/UTScripts/Vetra_Plotter_EmuNoiseComponents.cpp index c6ce10fe..6fc7b820 100644 --- a/UTScripts/Vetra_Plotter_EmuNoiseComponents.cpp +++ b/UTScripts/Vetra_Plotter_EmuNoiseComponents.cpp @@ -45,7 +45,7 @@ void drawLine( Double_t x1, Double_t y1, Double_t x2, Double_t y2, Color_t color } // Function for plotting 2D histograms -void plot2D( TDirectory* f2, std::string parameter, bool invertPalette, float max_fixed, std::string number, +void plot2D( TDirectory* f2, std::string parameter, bool invertPalette, float max, std::string number, std::string parentDir ) { std::cout << parameter << std::endl; @@ -56,7 +56,6 @@ void plot2D( TDirectory* f2, std::string parameter, bool invertPalette, float ma canva->Divide( 2, 2 ); - float max = 0; for ( unsigned int layer = 0; layer < 4; layer++ ) { std::string title_occ = parameter + "_" + layers_names[layer]; auto hist = (TH2D*)f2->Get( title_occ.c_str() ); @@ -107,12 +106,8 @@ void plot2D( TDirectory* f2, std::string parameter, bool invertPalette, float ma gStyle->SetPalette( 57 ); hist->SetFillStyle( 3001 ); hist->SetStats( 0 ); - if ( max_fixed != 0 ) - hist->GetZaxis()->SetRangeUser( 0, max_fixed ); - else hist->GetZaxis()->SetRangeUser( 0, max ); - std::string title = hist->GetTitle(); title = title.substr( 0, title.size() ); hist->SetTitle( title.c_str() ); @@ -331,7 +326,7 @@ void plot_histos_noise_stave( TDirectory* f3, TDirectory* f4, unsigned int layer std::string title_canva = "CMSNoiseSigma_" + layers_names[layer] + "_" + std::to_string( stave ) + side_name; TCanvas* c_noise = new TCanvas( title_canva.c_str(), title_canva.c_str(), 2000, 3000 ); - c_noise->Divide( 6, 8 ); + c_noise->Divide(6, 8); unsigned int counter_noise = 1; std::string title; @@ -355,6 +350,7 @@ void plot_histos_noise_stave( TDirectory* f3, TDirectory* f4, unsigned int layer not_empty = 1; + c_noise->GetPad( counter_noise )->SetRightMargin( 0.105 ); c_noise->cd( counter_noise++ ); @@ -378,9 +374,9 @@ void plot_histos_noise_stave( TDirectory* f3, TDirectory* f4, unsigned int layer hist_incoh->Draw( "SAME" ); // Create the legend - auto legend = new TLegend( 0.6, 0.7, 0.88, 0.88 ); - legend->AddEntry( hist, "CMSNoiseSigma", "l" ); // Black line - legend->AddEntry( hist_incoh, "TotalNoiseSigma", "l" ); // Red line with error bars + auto legend = new TLegend(0.6, 0.7, 0.88, 0.88); + legend->AddEntry(hist, "CMSNoiseSigma", "l"); // Black line + legend->AddEntry(hist_incoh, "TotalNoiseSigma", "l"); // Red line with error bars legend->Draw(); // Creating histograms for projections @@ -432,10 +428,11 @@ void plot_histos_noise_stave( TDirectory* f3, TDirectory* f4, unsigned int layer hist_incoh_proj->Draw( "HISTOSAME" ); // Create the legend - auto legend_proj = new TLegend( 0.6, 0.7, 0.88, 0.88 ); - legend_proj->AddEntry( hist_incoh_proj, "CMSNoiseSigma", "l" ); // Black line - legend_proj->AddEntry( hist_proj, "TotalNoiseSigma", "l" ); // Red line with error bars + auto legend_proj = new TLegend(0.6, 0.7, 0.88, 0.88); + legend_proj->AddEntry(hist_incoh_proj, "CMSNoiseSigma", "l"); // Black line + legend_proj->AddEntry(hist_proj, "TotalNoiseSigma", "l"); // Red line with error bars legend_proj->Draw(); + } } } @@ -452,7 +449,7 @@ void plot_histos_noise_stave( TDirectory* f3, TDirectory* f4, unsigned int layer void Vetra_Plotter_EmuNoiseComponents() { ///////////////////////////////// - const char* number = "0000302970"; + const char* number = "0000310462"; ///////////////////////////////// std::string number_str( number ); @@ -478,9 +475,9 @@ void Vetra_Plotter_EmuNoiseComponents() { } TDirectory* f3 = (TDirectory*)f1->Get( "UTPedDigitsToCMDigits" ); - TFile* f0 = TFile::Open( ( "./Vetra/ut_data_meanADC_" + std::string( number ) + ".root" ).c_str() ); + TFile* f0 = TFile::Open( ( "./Vetra/ut_data_pedestals_" + std::string( number ) + ".root" ).c_str() ); if ( !f0 ) { - std::cerr << "Error: Failed to open file './Vetra/ut_data_meanADC_" << number << ".root'\n"; + std::cerr << "Error: Failed to open file './Vetra/ut_data_pedestals_" << number << ".root'\n"; exit( -1 ); } TDirectory* f4 = (TDirectory*)f0->Get( "UTMeanADCMonitor" ); @@ -518,16 +515,16 @@ void Vetra_Plotter_EmuNoiseComponents() { for ( unsigned int layer = 0; layer < 4; layer++ ) for ( unsigned int side = 0; side < 2; side++ ) for ( unsigned int stave = 1; stave <= 9; stave++ ) { - plot_histos_noise_stave( f3, f4, layer, side, stave, moduleData, number_str, parentDir ); - // plot_histos_incnoise_stave_mean( f3, layer, side, stave, number_str, parentDir ); - plot_histos_stave( f3, layer, side, stave, number_str, parentDir ); + plot_histos_noise_stave( f3, f4, layer, side, stave, moduleData, number_str, parentDir ); + // plot_histos_incnoise_stave_mean( f3, layer, side, stave, number_str, parentDir ); + // plot_histos_stave( f3, layer, side, stave, number_str, parentDir ); } // Plotting histograms 2D: CommonModeMean, CommonModeSigma, CMSNoiseMean, CMSNoiseSigma plot2D( f3, "CommonModeSigmaAverage", 0, 2, number_str, parentDir ); plot2D( f3, "CommonModeMeanAverage", 0, 2, number_str, parentDir ); - plot2D( f3, "CMSNoiseSigmaAverage", 0, 1.2, number_str, parentDir ); - plot2D( f3, "CMSNoiseMeanAverage", 0, 1.2, number_str, parentDir ); + plot2D( f3, "CMSNoiseSigmaAverage", 0, 0, number_str, parentDir ); + plot2D( f3, "CMSNoiseMeanAverage", 0, 0, number_str, parentDir ); TCanvas* c_proj = new TCanvas( "Projections_NoiseSigma", "Projections_NoiseSigma", 1400, 1200 ); diff --git a/UTScripts/Vetra_Plotter_MeanADC.cpp b/UTScripts/Vetra_Plotter_MeanADC.cpp index 1b598f4a..99b41ca8 100644 --- a/UTScripts/Vetra_Plotter_MeanADC.cpp +++ b/UTScripts/Vetra_Plotter_MeanADC.cpp @@ -267,7 +267,7 @@ void plot_histos_stave( TDirectory* f2, std::string parameter, unsigned int laye void Vetra_Plotter_MeanADC() { ///////////////////////////////// - const char* number = "0000309677"; + const char* number = "0000310281"; ///////////////////////////////// std::string number_str( number ); diff --git a/UTScripts/Vetra_Plotter_RawADC.cpp b/UTScripts/Vetra_Plotter_RawADC.cpp index 9b4d0b17..357a4e06 100644 --- a/UTScripts/Vetra_Plotter_RawADC.cpp +++ b/UTScripts/Vetra_Plotter_RawADC.cpp @@ -316,7 +316,7 @@ void plot_histos_stave( TDirectory* f2, unsigned int layer, unsigned int side, u void Vetra_Plotter_RawADC() { ///////////////////////////////// - const char* number = "0000308864"; + const char* number = "0000310462"; ///////////////////////////////// std::string number_str( number ); diff --git a/release.notes b/release.notes index cec458e6..199b8209 100644 --- a/release.notes +++ b/release.notes @@ -7,6 +7,7 @@ !============================ UTEmu v4r5 2024-11 =========================== ! 2024-06-7 - Wojciech Krupa - Improving algorithms logic + - Adding new pedestal calculator (step) !============================ UTEmu v4r4 2024-03 =========================== ! 2024-06-7 - Wojciech Krupa -- GitLab