diff --git a/Tracker/TrackerConditions/FaserSCT_ConditionsTools/CMakeLists.txt b/Tracker/TrackerConditions/FaserSCT_ConditionsTools/CMakeLists.txt index b19cee24e9260527698b0040339c7560a97feb49..1450b0a07133ff3ea8a5517244cbdb9a54b0262a 100644 --- a/Tracker/TrackerConditions/FaserSCT_ConditionsTools/CMakeLists.txt +++ b/Tracker/TrackerConditions/FaserSCT_ConditionsTools/CMakeLists.txt @@ -19,6 +19,8 @@ atlas_add_component ( FaserSCT_ConditionsTools atlas_add_library( FaserSCT_ConditionsToolsLib + FaserSCT_ConditionsTools/*.h + src/*.h src/*.cxx PUBLIC_HEADERS FaserSCT_ConditionsTools INCLUDE_DIRS ${ROOT_INCLUDE_DIRS} ${CLHEP_INCLUDE_DIRS} diff --git a/Tracker/TrackerConditions/FaserSCT_ConditionsTools/FaserSCT_ConditionsTools/ISCT_NoisyStripTool.h b/Tracker/TrackerConditions/FaserSCT_ConditionsTools/FaserSCT_ConditionsTools/ISCT_NoisyStripTool.h new file mode 100644 index 0000000000000000000000000000000000000000..9fcf6b9a54f891e52edcedb729a3ff8510af319a --- /dev/null +++ b/Tracker/TrackerConditions/FaserSCT_ConditionsTools/FaserSCT_ConditionsTools/ISCT_NoisyStripTool.h @@ -0,0 +1,23 @@ +/* + Copyright (C) 2002-2022 CERN for the benefit of the ATLAS and FAsER collaborations +*/ + +#ifndef ISCT_NOISY_STRIP_TOOL +#define ISCT_NOISY_STRIP_TOOL + +#include "GaudiKernel/IAlgTool.h" +#include "GaudiKernel/EventContext.h" +#include <vector> + + +class ISCT_NoisyStripTool: virtual public IAlgTool { +public: + virtual ~ISCT_NoisyStripTool() = default; + + DeclareInterfaceID(ISCT_NoisyStripTool, 1, 0); + + virtual std::map<std::pair<int,int>, double> getNoisyStrips(const EventContext& ctx) const = 0; + virtual std::map<std::pair<int,int>, double> getNoisyStrips(void) const = 0; +}; + +#endif // ISCT_NOISY_STRIP_TOOL diff --git a/Tracker/TrackerConditions/FaserSCT_ConditionsTools/src/FaserSCT_NoisyStripTool.cxx b/Tracker/TrackerConditions/FaserSCT_ConditionsTools/src/FaserSCT_NoisyStripTool.cxx new file mode 100644 index 0000000000000000000000000000000000000000..459e6ccdbf7e9b0be4922b4c0d56261ff28bcb6c --- /dev/null +++ b/Tracker/TrackerConditions/FaserSCT_ConditionsTools/src/FaserSCT_NoisyStripTool.cxx @@ -0,0 +1,104 @@ +/* + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS and FASER collaborations +*/ + +#include "FaserSCT_NoisyStripTool.h" + + +FaserSCT_NoisyStripTool::FaserSCT_NoisyStripTool (const std::string& type, + const std::string& name, const IInterface* parent) : + base_class(type, name, parent) {} + + +StatusCode FaserSCT_NoisyStripTool::initialize() { + return StatusCode::SUCCESS; +} + + +StatusCode FaserSCT_NoisyStripTool::finalize() { + return StatusCode::SUCCESS; +} + + +std::map<std::pair<int, int>, double> +FaserSCT_NoisyStripTool::getNoisyStrips(const EventContext& ctx) const { + // TODO fix hard-coded definition of noisy strip and read from NoisyPixels.xml database + std::map<std::pair<int, int>, double> noisyStrips {}; + noisyStrips.insert({std::make_pair(0, 643), 0.576470588235}); + noisyStrips.insert({std::make_pair(1, 69), 1.0}); + noisyStrips.insert({std::make_pair(1, 660), 1.0}); + noisyStrips.insert({std::make_pair(13, 350), 0.279069767442}); + noisyStrips.insert({std::make_pair(13, 351), 0.255813953488}); + noisyStrips.insert({std::make_pair(35, 114), 0.988235294118}); + noisyStrips.insert({std::make_pair(38, 544), 0.438845997562}); + noisyStrips.insert({std::make_pair(48, 79), 1.0}); + noisyStrips.insert({std::make_pair(48, 183), 1.0}); + noisyStrips.insert({std::make_pair(49, 550), 1.0}); + noisyStrips.insert({std::make_pair(52, 215), 1.0}); + noisyStrips.insert({std::make_pair(52, 610), 1.0}); + noisyStrips.insert({std::make_pair(82, 722), 1.0}); + noisyStrips.insert({std::make_pair(84, 297), 0.837209302326}); + noisyStrips.insert({std::make_pair(96, 597), 1.0}); + noisyStrips.insert({std::make_pair(96, 665), 1.0}); + noisyStrips.insert({std::make_pair(97, 9), 1.0}); + noisyStrips.insert({std::make_pair(97, 492), 1.0}); + noisyStrips.insert({std::make_pair(97, 566), 1.0}); + noisyStrips.insert({std::make_pair(98, 267), 1.0}); + noisyStrips.insert({std::make_pair(99, 393), 0.447058823529}); + noisyStrips.insert({std::make_pair(99, 394), 0.480270574972}); + noisyStrips.insert({std::make_pair(99, 395), 0.484304932735}); + noisyStrips.insert({std::make_pair(99, 396), 0.501702259362}); + noisyStrips.insert({std::make_pair(99, 397), 0.418604651163}); + noisyStrips.insert({std::make_pair(99, 398), 0.493949736271}); + noisyStrips.insert({std::make_pair(99, 399), 0.325581395349}); + noisyStrips.insert({std::make_pair(99, 600), 1.0}); + noisyStrips.insert({std::make_pair(103, 417), 0.620384047267}); + noisyStrips.insert({std::make_pair(104, 698), 0.247058823529}); + noisyStrips.insert({std::make_pair(104, 699), 0.288910042837}); + noisyStrips.insert({std::make_pair(105, 396), 0.348837209302}); + noisyStrips.insert({std::make_pair(105, 397), 0.412532637076}); + noisyStrips.insert({std::make_pair(106, 620), 0.3867114595}); + noisyStrips.insert({std::make_pair(106, 621), 0.463041933191}); + noisyStrips.insert({std::make_pair(107, 146), 0.418604651163}); + noisyStrips.insert({std::make_pair(107, 147), 0.47397094431}); + noisyStrips.insert({std::make_pair(110, 737), 0.52737482452}); + noisyStrips.insert({std::make_pair(110, 738), 0.511627906977}); + noisyStrips.insert({std::make_pair(110, 739), 0.542948717949}); + noisyStrips.insert({std::make_pair(112, 7), 1.0}); + noisyStrips.insert({std::make_pair(113, 763), 1.0}); + noisyStrips.insert({std::make_pair(116, 613), 0.999635966509}); + noisyStrips.insert({std::make_pair(119, 175), 1.0}); + noisyStrips.insert({std::make_pair(122, 90), 0.457503320053}); + noisyStrips.insert({std::make_pair(122, 91), 0.325581395349}); + noisyStrips.insert({std::make_pair(125, 18), 1.0}); + noisyStrips.insert({std::make_pair(125, 484), 1.0}); + noisyStrips.insert({std::make_pair(126, 230), 1.0}); + noisyStrips.insert({std::make_pair(126, 530), 1.0}); + noisyStrips.insert({std::make_pair(127, 683), 1.0}); + noisyStrips.insert({std::make_pair(128, 418), 1.0}); + noisyStrips.insert({std::make_pair(129, 149), 1.0}); + noisyStrips.insert({std::make_pair(129, 345), 1.0}); + noisyStrips.insert({std::make_pair(130, 214), 1.0}); + noisyStrips.insert({std::make_pair(130, 508), 0.497357039885}); + noisyStrips.insert({std::make_pair(130, 673), 0.586547972305}); + noisyStrips.insert({std::make_pair(131, 651), 0.999676480104}); + noisyStrips.insert({std::make_pair(134, 525), 0.395348837209}); + noisyStrips.insert({std::make_pair(134, 526), 0.486304661221}); + noisyStrips.insert({std::make_pair(137, 493), 0.372093023256}); + noisyStrips.insert({std::make_pair(137, 494), 0.372093023256}); + noisyStrips.insert({std::make_pair(139, 427), 0.902074990899}); + noisyStrips.insert({std::make_pair(140, 696), 0.602847324497}); + noisyStrips.insert({std::make_pair(140, 752), 1.0}); + noisyStrips.insert({std::make_pair(141, 249), 0.107441471572}); + noisyStrips.insert({std::make_pair(141, 338), 0.238879736409}); + noisyStrips.insert({std::make_pair(143, 170), 1.0}); + noisyStrips.insert({std::make_pair(143, 406), 1.0}); + return noisyStrips; +} + + +std::map<std::pair<int, int>, double> +FaserSCT_NoisyStripTool::getNoisyStrips() const { + const EventContext& ctx{Gaudi::Hive::currentContext()}; + return getNoisyStrips(ctx); +} diff --git a/Tracker/TrackerConditions/FaserSCT_ConditionsTools/src/FaserSCT_NoisyStripTool.h b/Tracker/TrackerConditions/FaserSCT_ConditionsTools/src/FaserSCT_NoisyStripTool.h new file mode 100644 index 0000000000000000000000000000000000000000..c554620885b0cf28beb5c3d93c6d6fa31377e3a4 --- /dev/null +++ b/Tracker/TrackerConditions/FaserSCT_ConditionsTools/src/FaserSCT_NoisyStripTool.h @@ -0,0 +1,25 @@ +/* + Copyright (C) 2002-2022 CERN for the benefit of the ATLAS and CERN collaborations +*/ + +#ifndef FASERSCT_NOISY_STRIP_TOOL +#define FASERSCT_NOISY_STRIP_TOOL + +#include "AthenaBaseComps/AthAlgTool.h" +#include "FaserSCT_ConditionsTools/ISCT_NoisyStripTool.h" +#include "GaudiKernel/ICondSvc.h" +#include "GaudiKernel/EventContext.h" + + +class FaserSCT_NoisyStripTool: public extends<AthAlgTool, ISCT_NoisyStripTool> { +public: + FaserSCT_NoisyStripTool(const std::string& type, const std::string& name, const IInterface* parent); + virtual ~FaserSCT_NoisyStripTool() = default; + virtual StatusCode initialize() override; + virtual StatusCode finalize() override; + + virtual std::map<std::pair<int, int>, double> getNoisyStrips(const EventContext& ctx) const override; + virtual std::map<std::pair<int, int>, double> getNoisyStrips() const override; +}; + +#endif // FASERSCT_NOISY_STRIP_TOOL diff --git a/Tracker/TrackerConditions/FaserSCT_ConditionsTools/src/components/FaserSCT_ConditionsTools_entries.cxx b/Tracker/TrackerConditions/FaserSCT_ConditionsTools/src/components/FaserSCT_ConditionsTools_entries.cxx index cae3df3c65e74cecd79c4729d2dc57cc8e7e4cf3..adad7ee37337a3d347bedc9c1f5b28cf731fb837 100644 --- a/Tracker/TrackerConditions/FaserSCT_ConditionsTools/src/components/FaserSCT_ConditionsTools_entries.cxx +++ b/Tracker/TrackerConditions/FaserSCT_ConditionsTools/src/components/FaserSCT_ConditionsTools_entries.cxx @@ -20,6 +20,7 @@ // #include "../SCT_StripVetoTool.h" // #include "../SCT_TdaqEnabledTool.h" #include "../FaserSCT_CableMappingTool.h" +#include "../FaserSCT_NoisyStripTool.h" // DECLARE_COMPONENT( SCT_ByteStreamErrorsTool ) // DECLARE_COMPONENT( SCT_ChargeTrappingTool ) @@ -42,4 +43,5 @@ DECLARE_COMPONENT( FaserSCT_ReadCalibChipDataTool ) DECLARE_COMPONENT( FaserSCT_SiliconConditionsTool ) // DECLARE_COMPONENT( SCT_StripVetoTool ) // DECLARE_COMPONENT( SCT_TdaqEnabledTool ) -DECLARE_COMPONENT( FaserSCT_CableMappingTool ) \ No newline at end of file +DECLARE_COMPONENT( FaserSCT_CableMappingTool ) +DECLARE_COMPONENT( FaserSCT_NoisyStripTool ) diff --git a/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerByteStreamCnv.cxx b/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerByteStreamCnv.cxx index bd6ff38f7fc46fe44c62e5ccb339744e46cad90c..87bb2437c36c0d0c4f2cbe0cbfb4f3a1270c1e1a 100644 --- a/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerByteStreamCnv.cxx +++ b/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerByteStreamCnv.cxx @@ -28,6 +28,7 @@ TrackerByteStreamCnv::TrackerByteStreamCnv(ISvcLocator* svcloc) , m_tool("TrackerDataDecoderTool") , m_mappingTool("FaserSCT_CableMappingTool") , m_rdpSvc("FaserROBDataProviderSvc", "TrackerByteStreamCnv") + , m_noisyStripTool("FaserSCT_NoisyStripTool") , m_detStoreSvc("StoreGateSvc/DetectorStore", "TrackerByteStreamCnv") { } @@ -48,6 +49,7 @@ StatusCode TrackerByteStreamCnv::initialize() CHECK(m_rdpSvc.retrieve()); CHECK(m_tool.retrieve()); CHECK(m_mappingTool.retrieve()); + CHECK(m_noisyStripTool.retrieve()); ATH_CHECK(m_detStoreSvc.retrieve()); ATH_CHECK(m_detStoreSvc->retrieve(m_sctID, "FaserSCT_ID")); @@ -98,10 +100,13 @@ StatusCode TrackerByteStreamCnv::createObj(IOpaqueAddress* pAddr, DataObject*& p auto mapping = m_mappingTool->getCableMapping(); ATH_MSG_DEBUG("Cable mapping contains " << mapping.size() << " entries"); - + + auto noisyStrips = m_noisyStripTool->getNoisyStrips(); + ATH_MSG_DEBUG(noisyStrips.size() << " noisy strips"); + // Convert raw data into this container - CHECK( m_tool->convert(re, cont, key, mapping) ); + CHECK( m_tool->convert(re, cont, key, mapping, noisyStrips) ); pObj = SG::asStorable(cont); diff --git a/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerByteStreamCnv.h b/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerByteStreamCnv.h index de0095b637bc99a9b0e30e2b34fba5842bcdbcf6..77fae1331adba459e99f22bbbca6984388a6c048 100644 --- a/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerByteStreamCnv.h +++ b/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerByteStreamCnv.h @@ -15,6 +15,7 @@ #include "AthenaBaseComps/AthMessaging.h" #include "FaserByteStreamCnvSvcBase/FaserByteStreamAddress.h" #include "FaserSCT_ConditionsTools/ISCT_CableMappingTool.h" +#include "FaserSCT_ConditionsTools/ISCT_NoisyStripTool.h" class TrackerDataDecoderTool; class IFaserROBDataProviderSvc; @@ -42,6 +43,7 @@ public: private: ToolHandle<TrackerDataDecoderTool> m_tool; ToolHandle<ISCT_CableMappingTool> m_mappingTool; + ToolHandle<ISCT_NoisyStripTool> m_noisyStripTool; ServiceHandle<IFaserROBDataProviderSvc> m_rdpSvc; ServiceHandle<StoreGateSvc> m_detStoreSvc; const FaserSCT_ID* m_sctID{nullptr}; diff --git a/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerDataDecoderTool.cxx b/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerDataDecoderTool.cxx index 9971d0292356a1e8437f5734c2703a0bac10ee2a..520bb5dbbc46e07001af6939edd9ff39f0a4afaa 100644 --- a/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerDataDecoderTool.cxx +++ b/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerDataDecoderTool.cxx @@ -81,7 +81,9 @@ StatusCode TrackerDataDecoderTool::convert(const DAQFormats::EventFull* re, FaserSCT_RDO_Container* container, std::string key, - const std::map<int, std::pair<int, int> >& cableMapping) + const std::map<int, std::pair<int, int> >& cableMapping, + const std::map<std::pair<int, int>, double>& noisyStrips) + { ATH_MSG_DEBUG("TrackerDataDecoderTool::convert()"); @@ -231,6 +233,12 @@ TrackerDataDecoderTool::convert(const DAQFormats::EventFull* re, ATH_MSG_ERROR("Invalid strip number on side: " << stripOnSide); continue; } + // check if strip is noisy + auto it = noisyStrips.find(std::make_pair(waferHash, stripOnSide)); + if (it != noisyStrips.end() && it->second >= m_occupancyCut) { + ATH_MSG_VERBOSE("Mask wafer " << waferHash << ", strip " << stripOnSide << " with an occupancy of " << it->second); + continue; + } Identifier digitID {m_sctID->strip_id(id, stripOnSide)}; int errors{0}; int groupSize{1}; diff --git a/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerDataDecoderTool.h b/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerDataDecoderTool.h index 32b42ced60b494d93661aa4f3ea8dbcbdc6ce63b..3bc337276a3f8eaba28fa51d90f7eb4f903592c7 100644 --- a/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerDataDecoderTool.h +++ b/Tracker/TrackerEventCnv/TrackerByteStream/src/TrackerDataDecoderTool.h @@ -31,7 +31,9 @@ class TrackerDataDecoderTool : public AthAlgTool { virtual StatusCode initialize(); virtual StatusCode finalize(); - StatusCode convert(const DAQFormats::EventFull* re, FaserSCT_RDO_Container* cont, std::string key, const std::map<int, std::pair<int, int> >& cableMapping); + StatusCode convert(const DAQFormats::EventFull* re, FaserSCT_RDO_Container* cont, std::string key, + const std::map<int, std::pair<int, int> >& cableMapping, + const std::map<std::pair<int, int>, double>& noisyStrips); private: const FaserSCT_ID* m_sctID{nullptr}; @@ -41,7 +43,8 @@ private: "ModuleMap", {7, 2, 5, 0, 3, 6, 1, 4}, "Mapping from online to offline module numbers" }; - + Gaudi::Property<double> m_occupancyCut {this, "OccupancyCut", 0.1, "Mask strips with an occupancy larger than the OccupancyCut"}; + // Gaudi::Property<uint32_t> m_trb0Station { this, "Trb0StationNumber", 1, "Station number for TRB #0" }; }; diff --git a/Tracker/TrackerRecAlgs/NoisyStripFinder/test/NoisyStripFinderDbg.py b/Tracker/TrackerRecAlgs/NoisyStripFinder/test/NoisyStripFinderDbg.py new file mode 100644 index 0000000000000000000000000000000000000000..b3c0697cfcef6539190aeeebf26e16b4e0d3b100 --- /dev/null +++ b/Tracker/TrackerRecAlgs/NoisyStripFinder/test/NoisyStripFinderDbg.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python +""" + Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +""" + +import sys +from AthenaCommon.Logging import log, logging +from AthenaCommon.Constants import DEBUG, VERBOSE, INFO +from AthenaCommon.Configurable import Configurable +from CalypsoConfiguration.AllConfigFlags import ConfigFlags +from CalypsoConfiguration.MainServicesConfig import MainServicesCfg +from AthenaPoolCnvSvc.PoolWriteConfig import PoolWriteCfg +from FaserByteStreamCnvSvc.FaserByteStreamCnvSvcConfig import FaserByteStreamCnvSvcCfg +from TrackerPrepRawDataFormation.TrackerPrepRawDataFormationConfig import FaserSCT_ClusterizationCfg +from NoisyStripFinder.NoisyStripFinderConfig import NoisyStripFinderCfg + +log.setLevel(DEBUG) +Configurable.configurableRun3Behavior = True + +run = 1792 +ConfigFlags.Input.Files = [f"/home/tboeckh/Documents/data/TI12/Faser-Physics-00{run}-00000.raw"] +ConfigFlags.Output.ESDFileName = f"run00{run}-00000.ESD.pool.root" +ConfigFlags.IOVDb.GlobalTag = "OFLCOND-FASER-01" +ConfigFlags.IOVDb.DatabaseInstance = "OFLP200" +ConfigFlags.Input.ProjectName = "data21" +ConfigFlags.Input.isMC = False +ConfigFlags.GeoModel.FaserVersion = "FASER-01" +ConfigFlags.Common.isOnline = False +ConfigFlags.GeoModel.Align.Dynamic = False +ConfigFlags.Beam.NumberOfCollisions = 0. +ConfigFlags.Detector.GeometryFaserSCT = True +ConfigFlags.lock() + +acc = MainServicesCfg(ConfigFlags) +acc.merge(PoolWriteCfg(ConfigFlags)) +acc.merge(FaserByteStreamCnvSvcCfg(ConfigFlags)) +acc.merge(FaserSCT_ClusterizationCfg( + ConfigFlags, + name="LevelClustering", + DataObjectName="SCT_LEVELMODE_RDOs", + ClusterToolTimingPattern="X1X")) +acc.merge(NoisyStripFinderCfg(ConfigFlags)) + +# Hack to avoid problem with our use of MC databases when isMC = False +replicaSvc = acc.getService("DBReplicaSvc") +replicaSvc.COOLSQLiteVetoPattern = "" +replicaSvc.UseCOOLSQLite = True +replicaSvc.UseCOOLFrontier = False +replicaSvc.UseGeomSQLite = True + +sc = acc.run(maxEvents=-1) +sys.exit(not sc.isSuccess())