From 5be2b92c3f04321b474686c3bbcd25c4fb0e9f6a Mon Sep 17 00:00:00 2001 From: Matti Kortelainen Date: Mon, 11 Aug 2025 22:45:28 +0200 Subject: [PATCH 1/5] Remove SwitchProducer tests --- .../test/test_catch2_ScheduleBuilder.cc | 6 +- .../Framework/test/test_module_delete_cfg.py | 20 - FWCore/Integration/plugins/BuildFile.xml | 2 +- .../SwitchProducerProvenanceAnalyzer.cc | 115 ------ FWCore/Integration/test/BuildFile.xml | 11 - .../Integration/test/ProcessAccelerator_t.cpp | 144 ------- FWCore/Integration/test/SwitchProducer_t.cpp | 350 ------------------ .../test/run_TestProcessAccelerator.sh | 35 -- .../test/run_TestSwitchProducer.sh | 143 ------- .../test/testProcessAccelerator_cfg.py | 69 ---- .../test/testSwitchProducerAliasOutput_cfg.py | 45 --- ...estSwitchProducerAliasToNonExistent_cfg.py | 55 --- ...nditionalTaskEDAliasConsumeAllCases_cfg.py | 69 ---- ...ducerConditionalTaskEDAliasWildcard_cfg.py | 83 ----- ...witchProducerConditionalTaskEDAlias_cfg.py | 73 ---- .../test/testSwitchProducerMerge_cfg.py | 20 - .../test/testSwitchProducerPathFilter_cfg.py | 62 ---- .../testSwitchProducerPathWrongOrder_cfg.py | 45 --- .../test/testSwitchProducerPath_cfg.py | 85 ----- ...estSwitchProducerProvenanceAnalyzer_cfg.py | 24 -- .../test/testSwitchProducerTask_cfg.py | 106 ------ FWCore/ParameterSet/python/Config.py | 284 +------------- FWCore/ParameterSet/python/Modules.py | 193 ---------- 23 files changed, 6 insertions(+), 2033 deletions(-) delete mode 100644 FWCore/Integration/plugins/SwitchProducerProvenanceAnalyzer.cc delete mode 100644 FWCore/Integration/test/SwitchProducer_t.cpp delete mode 100755 FWCore/Integration/test/run_TestProcessAccelerator.sh delete mode 100755 FWCore/Integration/test/run_TestSwitchProducer.sh delete mode 100644 FWCore/Integration/test/testProcessAccelerator_cfg.py delete mode 100644 FWCore/Integration/test/testSwitchProducerAliasOutput_cfg.py delete mode 100644 FWCore/Integration/test/testSwitchProducerAliasToNonExistent_cfg.py delete mode 100644 FWCore/Integration/test/testSwitchProducerConditionalTaskEDAliasConsumeAllCases_cfg.py delete mode 100644 FWCore/Integration/test/testSwitchProducerConditionalTaskEDAliasWildcard_cfg.py delete mode 100644 FWCore/Integration/test/testSwitchProducerConditionalTaskEDAlias_cfg.py delete mode 100644 FWCore/Integration/test/testSwitchProducerMerge_cfg.py delete mode 100644 FWCore/Integration/test/testSwitchProducerPathFilter_cfg.py delete mode 100644 FWCore/Integration/test/testSwitchProducerPathWrongOrder_cfg.py delete mode 100644 FWCore/Integration/test/testSwitchProducerPath_cfg.py delete mode 100644 FWCore/Integration/test/testSwitchProducerProvenanceAnalyzer_cfg.py delete mode 100644 FWCore/Integration/test/testSwitchProducerTask_cfg.py diff --git a/FWCore/Framework/test/test_catch2_ScheduleBuilder.cc b/FWCore/Framework/test/test_catch2_ScheduleBuilder.cc index c0038123d9b8b..e867a99ef8472 100644 --- a/FWCore/Framework/test/test_catch2_ScheduleBuilder.cc +++ b/FWCore/Framework/test/test_catch2_ScheduleBuilder.cc @@ -30,7 +30,7 @@ namespace { std::string type_; std::string edmType_; }; - enum class EdmType { kProducer, kFilter, kAnalyzer, kSwitchProducer, kOutputModule }; + enum class EdmType { kProducer, kFilter, kAnalyzer, kOutputModule }; struct ConfigBuilder { void addModule(std::string const& iLabel, std::string const& iType, EdmType iEdmType) { @@ -47,8 +47,6 @@ namespace { return "EDAnalyzer"; case EdmType::kOutputModule: return "OutputModule"; - case EdmType::kSwitchProducer: - return "SwitchProducer"; } return ""; } @@ -244,4 +242,4 @@ TEST_CASE("test edm::ScheduleBuilder", "[ScheduleBuilder]") { REQUIRE(builder.endPathStatusInserters_.empty()); REQUIRE(not builder.resultsInserter_); } -} \ No newline at end of file +} diff --git a/FWCore/Framework/test/test_module_delete_cfg.py b/FWCore/Framework/test/test_module_delete_cfg.py index 6f6f04890fae9..6a9f73b9d02da 100644 --- a/FWCore/Framework/test/test_module_delete_cfg.py +++ b/FWCore/Framework/test/test_module_delete_cfg.py @@ -16,7 +16,6 @@ # - DAG of event/lumi/run producers that are not consumed by an always-running module, whole DAG deleted # - DAG of event(/lumi/run) producers that are partly consumed (kept) and partly non-consumed (delete) # - EDAlias with one instance consumed (original producer kept) and another non-consumed (original producer deleted) -# - SwitchProducer non-chosen case deleted intEventProducer = cms.EDProducer("IntProducer", ivalue = cms.int32(1)) intNonEventProducer = cms.EDProducer("NonEventIntProducer", ivalue = cms.int32(1)) @@ -114,20 +113,6 @@ def nonEventConsumer(transition, sourcePattern, expected): srcEvent = cms.untracked.VInputTag("producerEventAlias:consumed") ) -class SwitchProducerTest(cms.SwitchProducer): - def __init__(self, **kargs): - super(SwitchProducerTest,self).__init__( - dict( - test1 = lambda accelerators: (True, -10), - test2 = lambda accelerators: (True, -9) - ), **kargs) -process.producerEventSwitchProducerNotConsumed = cms.EDProducer("edmtest::TestModuleDeleteProducer") -process.producerEventSwitchProducerConsumed = intEventProducerMustRun.clone() -process.producerEventSwitchProducer = SwitchProducerTest( - test1 = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag("producerEventSwitchProducerNotConsumed")), - test2 = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag("producerEventSwitchProducerConsumed")), -) - process.consumerNotExist = cms.EDAnalyzer("edmtest::GenericIntsAnalyzer", inputShouldBeMissing = cms.untracked.bool(True), srcBeginProcess = cms.untracked.VInputTag( @@ -179,9 +164,6 @@ def __init__(self, **kargs): # process.producerEventAliasNotConsumed, process.producerEventAliasConsumed, - # - process.producerEventSwitchProducerNotConsumed, - process.producerEventSwitchProducerConsumed, ) process.p = cms.Path( @@ -199,8 +181,6 @@ def __init__(self, **kargs): # process.consumerEventAlias+ # - process.producerEventSwitchProducer+ - # process.intAnalyzerDelete , process.t diff --git a/FWCore/Integration/plugins/BuildFile.xml b/FWCore/Integration/plugins/BuildFile.xml index 29791b0c49053..84e979b5a4583 100644 --- a/FWCore/Integration/plugins/BuildFile.xml +++ b/FWCore/Integration/plugins/BuildFile.xml @@ -22,7 +22,7 @@ - + diff --git a/FWCore/Integration/plugins/SwitchProducerProvenanceAnalyzer.cc b/FWCore/Integration/plugins/SwitchProducerProvenanceAnalyzer.cc deleted file mode 100644 index 9dd4b8c4148f9..0000000000000 --- a/FWCore/Integration/plugins/SwitchProducerProvenanceAnalyzer.cc +++ /dev/null @@ -1,115 +0,0 @@ -#include "DataFormats/Common/interface/Handle.h" -#include "DataFormats/Provenance/interface/Provenance.h" -#include "DataFormats/TestObjects/interface/ToyProducts.h" -#include "FWCore/Framework/interface/global/EDAnalyzer.h" -#include "FWCore/Framework/interface/Event.h" -#include "FWCore/Framework/interface/MakerMacros.h" -#include "FWCore/ParameterSet/interface/ParameterSet.h" -#include "FWCore/ParameterSet/interface/Registry.h" -#include "FWCore/Utilities/interface/EDGetToken.h" -#include "FWCore/Utilities/interface/InputTag.h" - -namespace edm { - class EventSetup; - class StreamID; -} // namespace edm - -namespace edmtest { - class SwitchProducerProvenanceAnalyzer : public edm::global::EDAnalyzer<> { - public: - explicit SwitchProducerProvenanceAnalyzer(edm::ParameterSet const& iConfig); - void analyze(edm::StreamID, edm::Event const& iEvent, edm::EventSetup const& iSetup) const override; - - private: - void testProduct(edm::Handle const& prod, int mode, edm::Event const& iEvent) const; - - edm::EDGetTokenT inputToken1_; - edm::EDGetTokenT inputToken2_; - std::string producerPrefix_; - bool const aliasMode_; - }; - - SwitchProducerProvenanceAnalyzer::SwitchProducerProvenanceAnalyzer(edm::ParameterSet const& iConfig) - : inputToken1_(consumes(iConfig.getParameter("src1"))), - inputToken2_(consumes(iConfig.getParameter("src2"))), - producerPrefix_(iConfig.getParameter("producerPrefix")), - aliasMode_(iConfig.getParameter("aliasMode")) {} - - void SwitchProducerProvenanceAnalyzer::analyze(edm::StreamID, - edm::Event const& iEvent, - edm::EventSetup const& iSetup) const { - edm::Handle h; - iEvent.getByToken(inputToken1_, h); - testProduct(h, iEvent.id().luminosityBlock(), iEvent); - - iEvent.getByToken(inputToken2_, h); - testProduct(h, iEvent.id().luminosityBlock(), iEvent); - } - - void SwitchProducerProvenanceAnalyzer::testProduct(edm::Handle const& prod, - int mode, - edm::Event const& iEvent) const { - assert(prod->value == mode); - - edm::Provenance const* provenance = prod.provenance(); - assert(provenance != nullptr); - auto const* productProvenance = provenance->productProvenance(); - assert(productProvenance != nullptr); - auto const& processHistory = iEvent.processHistory(); - - edm::pset::Registry const* psetRegistry = edm::pset::Registry::instance(); - assert(psetRegistry != nullptr); - - auto const& moduleLabel = provenance->moduleLabel(); - - // Switch output should not look like an alias - assert(productProvenance->branchID() == provenance->branchID()); - - // Check that the provenance of the Switch itself is recorded correctly - for (edm::ProcessConfiguration const& pc : processHistory) { - if (pc.processName() == provenance->processName()) { - edm::ParameterSetID const& psetID = pc.parameterSetID(); - edm::ParameterSet const* processPSet = psetRegistry->getMapped(psetID); - assert(processPSet); - auto const& modPSet = processPSet->getParameterSet(moduleLabel); - assert(modPSet.getParameter("@module_edm_type") == "EDProducer"); - assert(modPSet.getParameter("@module_type") == "SwitchProducer"); - assert(modPSet.getParameter("@module_label") == moduleLabel); - auto const& allCases = modPSet.getParameter>("@all_cases"); - assert(allCases.size() == 2); - assert(allCases[0] == moduleLabel + "@test1"); - assert(allCases[1] == moduleLabel + "@test2"); - assert(modPSet.exists("@chosen_case") == false); - } - } - - // Check the parentage (foo -> foo@case -> possible input) - auto const& parent = productProvenance->parentage(); - // Here is where Switch differs from a normal EDProducer: each Switch output branch has exactly one parent - assert(parent.parents().size() == 1); - auto const& parentProvenance = iEvent.getProvenance(parent.parents()[0]); - edm::ProductProvenance const* parentProductProvenance = nullptr; - if (not(aliasMode_ and mode == 2)) { - // If parent is EDAlias, it is skipped in the provenance, so in - // that case the normal grandparent can be found on the place of - // the parent. - - assert(parentProvenance.productDescription().moduleLabel() == moduleLabel + "@test" + std::to_string(mode)); - - // Check grandparent as well - parentProductProvenance = parentProvenance.productProvenance(); - assert(parentProductProvenance != nullptr); - } - auto const& grandParent = parentProductProvenance ? parentProductProvenance->parentage() : parent; - //auto const& grandParent = parentProductProvenance->parentage(); - assert(grandParent.parents().size() == 1); // behaviour of the AddIntsProducer - auto const& grandParentProvenance = iEvent.getProvenance(grandParent.parents()[0]); - int postfix = mode; - if (aliasMode_ and mode == 2) { - postfix = 3; - } - assert(grandParentProvenance.productDescription().moduleLabel() == producerPrefix_ + std::to_string(postfix)); - } -} // namespace edmtest -using edmtest::SwitchProducerProvenanceAnalyzer; -DEFINE_FWK_MODULE(SwitchProducerProvenanceAnalyzer); diff --git a/FWCore/Integration/test/BuildFile.xml b/FWCore/Integration/test/BuildFile.xml index 7cd52f161d90f..40b12e280314f 100644 --- a/FWCore/Integration/test/BuildFile.xml +++ b/FWCore/Integration/test/BuildFile.xml @@ -33,9 +33,7 @@ - - @@ -52,15 +50,6 @@ - - - - - - - - - diff --git a/FWCore/Integration/test/ProcessAccelerator_t.cpp b/FWCore/Integration/test/ProcessAccelerator_t.cpp index 7dd31841cac9a..58ae58041855f 100644 --- a/FWCore/Integration/test/ProcessAccelerator_t.cpp +++ b/FWCore/Integration/test/ProcessAccelerator_t.cpp @@ -14,51 +14,6 @@ static constexpr auto s_tag = "[ProcessAccelerator]"; namespace { - std::string makeSwitchConfig(bool test2Enabled, - std::string_view test1, - std::string_view test2, - std::string_view accelerator) { - const std::string appendTest2 = test2Enabled ? "self._enabled.append('test2')" : ""; - return fmt::format( - R"_(from FWCore.TestProcessor.TestProcess import * -import FWCore.ParameterSet.Config as cms - -class ProcessAcceleratorTest(cms.ProcessAccelerator): - def __init__(self): - super(ProcessAcceleratorTest,self).__init__() - self._labels = ["test1", "test2"] - self._enabled = ["test1"] - {} - def labels(self): - return self._labels - def enabledLabels(self): - return self._enabled - -class SwitchProducerTest(cms.SwitchProducer): - def __init__(self, **kargs): - super(SwitchProducerTest,self).__init__( - dict( - cpu = cms.SwitchProducer.getCpu(), - test1 = lambda accelerators: ("test1" in accelerators, 2), - test2 = lambda accelerators: ("test2" in accelerators, 3), - ), **kargs) - -process = TestProcess() -process.options.accelerators = ["{}"] -process.ProcessAcceleratorTest = ProcessAcceleratorTest() -process.s = SwitchProducerTest( - cpu = cms.EDProducer('IntProducer', ivalue = cms.int32(0)), - test1 = {}, - test2 = {} -) -process.moduleToTest(process.s) -)_", - appendTest2, - accelerator, - test1, - test2); - } - std::string makeResolverConfig(bool enableOther, std::string_view accelerator, std::string_view variant) { const std::string appendOther = enableOther ? "self._enabled.append('other')" : ""; const std::string explicitVariant = @@ -116,105 +71,6 @@ process.moduleToTest(process.m) } } // namespace -TEST_CASE("Configuration with SwitchProducer", s_tag) { - const std::string test1{"cms.EDProducer('IntProducer', ivalue = cms.int32(1))"}; - const std::string test2{"cms.EDProducer('ManyIntProducer', ivalue = cms.int32(2), values = cms.VPSet())"}; - - const std::string baseConfig_auto = makeSwitchConfig(true, test1, test2, "*"); - const std::string baseConfig_test1 = makeSwitchConfig(true, test1, test2, "test1"); - const std::string baseConfig_test2 = makeSwitchConfig(true, test1, test2, "test2"); - const std::string baseConfigTest2Disabled_auto = makeSwitchConfig(false, test1, test2, "*"); - const std::string baseConfigTest2Disabled_test1 = makeSwitchConfig(false, test1, test2, "test1"); - const std::string baseConfigTest2Disabled_test2 = makeSwitchConfig(false, test1, test2, "test2"); - - SECTION("Configuration hash is not changed") { - std::unique_ptr pset_auto, pset_test1, pset_test2; - std::unique_ptr psetTest2Disabled_auto, psetTest2Disabled_test1, psetTest2Disabled_test2; - edm::makeParameterSets(baseConfig_auto, pset_auto); - edm::makeParameterSets(baseConfig_test1, pset_test1); - edm::makeParameterSets(baseConfig_test2, pset_test2); - edm::makeParameterSets(baseConfigTest2Disabled_auto, psetTest2Disabled_auto); - edm::makeParameterSets(baseConfigTest2Disabled_test1, psetTest2Disabled_test1); - edm::makeParameterSets(baseConfigTest2Disabled_test2, psetTest2Disabled_test2); - pset_auto->registerIt(); - pset_test1->registerIt(); - pset_test2->registerIt(); - psetTest2Disabled_auto->registerIt(); - psetTest2Disabled_test1->registerIt(); - psetTest2Disabled_test2->registerIt(); - REQUIRE(pset_auto->id() == pset_test1->id()); - REQUIRE(pset_auto->id() == pset_test2->id()); - REQUIRE(pset_auto->id() == psetTest2Disabled_auto->id()); - REQUIRE(pset_auto->id() == psetTest2Disabled_test1->id()); - REQUIRE(pset_auto->id() == psetTest2Disabled_test2->id()); - } - - edm::test::TestProcessor::Config config_auto{baseConfig_auto}; - edm::test::TestProcessor::Config config_test1{baseConfig_test1}; - edm::test::TestProcessor::Config config_test2{baseConfig_test2}; - edm::test::TestProcessor::Config configTest2Disabled_auto{baseConfigTest2Disabled_auto}; - edm::test::TestProcessor::Config configTest2Disabled_test1{baseConfigTest2Disabled_test1}; - edm::test::TestProcessor::Config configTest2Disabled_test2{baseConfigTest2Disabled_test2}; - - SECTION("Base configuration is OK") { REQUIRE_NOTHROW(edm::test::TestProcessor(config_auto)); } - - SECTION("No event data") { - edm::test::TestProcessor tester(config_auto); - REQUIRE_NOTHROW(tester.test()); - } - - SECTION("beginJob and endJob only") { - edm::test::TestProcessor tester(config_auto); - REQUIRE_NOTHROW(tester.testBeginAndEndJobOnly()); - } - - SECTION("Run with no LuminosityBlocks") { - edm::test::TestProcessor tester(config_auto); - REQUIRE_NOTHROW(tester.testRunWithNoLuminosityBlocks()); - } - - SECTION("LuminosityBlock with no Events") { - edm::test::TestProcessor tester(config_auto); - REQUIRE_NOTHROW(tester.testLuminosityBlockWithNoEvents()); - } - - SECTION("Test2 enabled, acclerators=*") { - edm::test::TestProcessor tester(config_auto); - auto event = tester.test(); - REQUIRE(event.get()->value == 2); - } - - SECTION("Test2 enabled, acclerators=test1") { - edm::test::TestProcessor tester(config_test1); - auto event = tester.test(); - REQUIRE(event.get()->value == 1); - } - - SECTION("Test2 enabled, acclerators=test2") { - edm::test::TestProcessor tester(config_test2); - auto event = tester.test(); - REQUIRE(event.get()->value == 2); - } - - SECTION("Test2 disabled, accelerators=*") { - edm::test::TestProcessor tester(configTest2Disabled_auto); - auto event = tester.test(); - REQUIRE(event.get()->value == 1); - } - - SECTION("Test2 disabled, accelerators=test1") { - edm::test::TestProcessor tester(configTest2Disabled_test1); - auto event = tester.test(); - REQUIRE(event.get()->value == 1); - } - - SECTION("Test2 disabled, accelerators=test2") { - REQUIRE_THROWS_WITH( - edm::test::TestProcessor(configTest2Disabled_test2), - Catch::Contains("The system has no compute accelerators that match the patterns") && Catch::Contains("test1")); - } -} - TEST_CASE("Configuration with ModuleTypeResolver", s_tag) { const std::string baseConfig_auto = makeResolverConfig(true, "*", ""); const std::string baseConfig_cpu = makeResolverConfig(true, "cpu", ""); diff --git a/FWCore/Integration/test/SwitchProducer_t.cpp b/FWCore/Integration/test/SwitchProducer_t.cpp deleted file mode 100644 index fb66b9ab73946..0000000000000 --- a/FWCore/Integration/test/SwitchProducer_t.cpp +++ /dev/null @@ -1,350 +0,0 @@ -#define CATCH_CONFIG_MAIN -#include "catch.hpp" - -#include "DataFormats/TestObjects/interface/ToyProducts.h" -#include "FWCore/ParameterSet/interface/ParameterSet.h" -#include "FWCore/ParameterSetReader/interface/ParameterSetReader.h" -#include "FWCore/TestProcessor/interface/TestProcessor.h" - -#include - -static constexpr auto s_tag = "[SwitchProducer]"; - -namespace { - std::string makeConfig(bool test2Enabled, - const std::string& test1, - const std::string& test2, - const std::string& otherprod = "", - const std::string& othername = "") { - std::string otherline; - std::string othertask; - if (not otherprod.empty()) { - otherline = "process." + othername + " = " + otherprod + "\n"; - othertask = ", cms.Task(process." + othername + ")"; - } - - return std::string{ - R"_(from FWCore.TestProcessor.TestProcess import * -import FWCore.ParameterSet.Config as cms - -class SwitchProducerTest(cms.SwitchProducer): - def __init__(self, **kargs): - super(SwitchProducerTest,self).__init__( - dict( - test1 = lambda accelerators: (True, -10), - test2 = lambda accelerators: ()_"} + - (test2Enabled ? "True" : "False") + ", -9)\n" + - R"_( ), **kargs) -process = TestProcess() -)_" + otherline + - R"_(process.s = SwitchProducerTest( - test1 = )_" + - test1 + ",\n" + " test2 = " + test2 + "\n" + ")\n" + "process.moduleToTest(process.s" + othertask + ")\n"; - } -} // namespace - -TEST_CASE("Configuration", s_tag) { - const std::string test1{"cms.EDProducer('IntProducer', ivalue = cms.int32(1))"}; - const std::string test2{"cms.EDProducer('ManyIntProducer', ivalue = cms.int32(2), values = cms.VPSet())"}; - - const std::string baseConfig = makeConfig(true, test1, test2); - const std::string baseConfigTest2Disabled = makeConfig(false, test1, test2); - - SECTION("Configuration hash is not changed") { - std::unique_ptr pset, psetTest2Disabled; - edm::makeParameterSets(baseConfig, pset); - edm::makeParameterSets(baseConfigTest2Disabled, psetTest2Disabled); - pset->registerIt(); - psetTest2Disabled->registerIt(); - REQUIRE(pset->id() == psetTest2Disabled->id()); - } - - edm::test::TestProcessor::Config config{baseConfig}; - edm::test::TestProcessor::Config configTest2Disabled{baseConfigTest2Disabled}; - - SECTION("Base configuration is OK") { REQUIRE_NOTHROW(edm::test::TestProcessor(config)); } - - SECTION("No event data") { - edm::test::TestProcessor tester(config); - REQUIRE_NOTHROW(tester.test()); - } - - SECTION("beginJob and endJob only") { - edm::test::TestProcessor tester(config); - REQUIRE_NOTHROW(tester.testBeginAndEndJobOnly()); - } - - SECTION("Run with no LuminosityBlocks") { - edm::test::TestProcessor tester(config); - REQUIRE_NOTHROW(tester.testRunWithNoLuminosityBlocks()); - } - - SECTION("LuminosityBlock with no Events") { - edm::test::TestProcessor tester(config); - REQUIRE_NOTHROW(tester.testLuminosityBlockWithNoEvents()); - } - - SECTION("Test2 enabled") { - edm::test::TestProcessor tester(config); - auto event = tester.test(); - REQUIRE(event.get()->value == 2); - } - - SECTION("Test2 disabled") { - edm::test::TestProcessor tester(configTest2Disabled); - auto event = tester.test(); - REQUIRE(event.get()->value == 1); - } -} - -TEST_CASE("Configuration with EDAlias", s_tag) { - const std::string otherprod{"cms.EDProducer('ManyIntProducer', ivalue = cms.int32(2), values = cms.VPSet())"}; - const std::string othername{"intprod"}; - - const std::string test1{"cms.EDProducer('IntProducer', ivalue = cms.int32(1))"}; - const std::string test2{"cms.EDAlias(intprod = cms.VPSet(cms.PSet(type = cms.string('edmtestIntProduct'))))"}; - - const std::string baseConfig = makeConfig(true, test1, test2, otherprod, othername); - const std::string baseConfigTest2Disabled = makeConfig(false, test1, test2, otherprod, othername); - - SECTION("Configuration hash is not changed") { - std::unique_ptr pset, psetTest2Disabled; - edm::makeParameterSets(baseConfig, pset); - edm::makeParameterSets(baseConfigTest2Disabled, psetTest2Disabled); - pset->registerIt(); - psetTest2Disabled->registerIt(); - REQUIRE(pset->id() == psetTest2Disabled->id()); - } - - edm::test::TestProcessor::Config config{baseConfig}; - edm::test::TestProcessor::Config configTest2Disabled{baseConfigTest2Disabled}; - - SECTION("Base configuration is OK") { REQUIRE_NOTHROW(edm::test::TestProcessor(config)); } - - SECTION("No event data") { - edm::test::TestProcessor tester(config); - REQUIRE_NOTHROW(tester.test()); - } - - SECTION("beginJob and endJob only") { - edm::test::TestProcessor tester(config); - REQUIRE_NOTHROW(tester.testBeginAndEndJobOnly()); - } - - SECTION("Run with no LuminosityBlocks") { - edm::test::TestProcessor tester(config); - REQUIRE_NOTHROW(tester.testRunWithNoLuminosityBlocks()); - } - - SECTION("LuminosityBlock with no Events") { - edm::test::TestProcessor tester(config); - REQUIRE_NOTHROW(tester.testLuminosityBlockWithNoEvents()); - } - - SECTION("Test2 enabled") { - edm::test::TestProcessor tester(config); - auto event = tester.test(); - REQUIRE(event.get()->value == 2); - } - - SECTION("Test2 disabled") { - edm::test::TestProcessor tester(configTest2Disabled); - auto event = tester.test(); - REQUIRE(event.get()->value == 1); - } -} - -TEST_CASE("Configuration with many branches", s_tag) { - const std::string test1{ - R"_(cms.EDProducer('ManyIntProducer', ivalue = cms.int32(1), values = cms.VPSet(cms.PSet(instance=cms.string('foo'),value=cms.int32(11)), - cms.PSet(instance=cms.string('bar'),value=cms.int32(21)))))_"}; - const std::string test2{ - R"_(cms.EDProducer('ManyIntProducer', ivalue = cms.int32(2), values = cms.VPSet(cms.PSet(instance=cms.string('foo'),value=cms.int32(12)), - cms.PSet(instance=cms.string('bar'),value=cms.int32(22)))))_"}; - - const std::string baseConfig = makeConfig(true, test1, test2); - const std::string baseConfigTest2Disabled = makeConfig(false, test1, test2); - - edm::test::TestProcessor::Config config{baseConfig}; - edm::test::TestProcessor::Config configTest2Disabled{baseConfigTest2Disabled}; - - SECTION("Test2 enabled") { - edm::test::TestProcessor tester(config); - auto event = tester.test(); - REQUIRE(event.get()->value == 2); - REQUIRE(event.get("foo")->value == 12); - REQUIRE(event.get("bar")->value == 22); - } - - SECTION("Test2 disabled") { - edm::test::TestProcessor tester(configTest2Disabled); - auto event = tester.test(); - REQUIRE(event.get()->value == 1); - REQUIRE(event.get("foo")->value == 11); - REQUIRE(event.get("bar")->value == 21); - } -} - -TEST_CASE("Configuration with many branches with EDAlias", s_tag) { - const std::string otherprod{ - R"_(cms.EDProducer('ManyIntProducer', ivalue = cms.int32(2), values = cms.VPSet(cms.PSet(instance=cms.string('foo'),value=cms.int32(12)), - cms.PSet(instance=cms.string('bar'),value=cms.int32(22)))) -)_"}; - const std::string othername{"intprod"}; - - const std::string test1{ - R"_(cms.EDProducer('ManyIntProducer', ivalue = cms.int32(1), values = cms.VPSet(cms.PSet(instance=cms.string('foo'),value=cms.int32(11)), - cms.PSet(instance=cms.string('bar'),value=cms.int32(21)))))_"}; - const std::string test2{ - R"_(cms.EDAlias(intprod = cms.VPSet(cms.PSet(type = cms.string('edmtestIntProduct'), fromProductInstance = cms.string(''), toProductInstance = cms.string('')), - cms.PSet(type = cms.string('edmtestIntProduct'), fromProductInstance = cms.string('foo'), toProductInstance = cms.string('foo')), - cms.PSet(type = cms.string('edmtestIntProduct'), fromProductInstance = cms.string('bar'), toProductInstance = cms.string('bar')))))_"}; - - const std::string baseConfig = makeConfig(true, test1, test2, otherprod, othername); - const std::string baseConfigTest2Disabled = makeConfig(false, test1, test2, otherprod, othername); - - edm::test::TestProcessor::Config config{baseConfig}; - edm::test::TestProcessor::Config configTest2Disabled{baseConfigTest2Disabled}; - - SECTION("Test2 enabled") { - edm::test::TestProcessor tester(config); - auto event = tester.test(); - REQUIRE(event.get()->value == 2); - REQUIRE(event.get("foo")->value == 12); - REQUIRE(event.get("bar")->value == 22); - } - - SECTION("Test2 disabled") { - edm::test::TestProcessor tester(configTest2Disabled); - auto event = tester.test(); - REQUIRE(event.get()->value == 1); - REQUIRE(event.get("foo")->value == 11); - REQUIRE(event.get("bar")->value == 21); - } -} - -TEST_CASE("Configuration with different branches", s_tag) { - const std::string test1{"cms.EDProducer('ManyIntProducer', ivalue = cms.int32(1), values = cms.VPSet())"}; - const std::string test2{ - "cms.EDProducer('ManyIntProducer', ivalue = cms.int32(2), values = " - "cms.VPSet(cms.PSet(instance=cms.string('foo'),value=cms.int32(3))))"}; - - const std::string baseConfig1 = makeConfig(true, test1, test2); - const std::string baseConfig2 = makeConfig(false, test1, test2); - - SECTION("Different branches are not allowed") { - edm::test::TestProcessor::Config config1{baseConfig1}; - REQUIRE_THROWS_WITH( - edm::test::TestProcessor(config1), - Catch::Contains("that does not produce a product") && Catch::Contains("that is produced by the chosen case") && - Catch::Contains("Products for case s@test1") && Catch::Contains("Products for case s@test2") && - Catch::Contains("edmtestIntProduct \n") && Catch::Contains("edmtestIntProduct foo")); - - edm::test::TestProcessor::Config config2{baseConfig2}; - REQUIRE_THROWS_WITH( - edm::test::TestProcessor(config2), - Catch::Contains("with a product") && Catch::Contains("that is not produced by the chosen case") && - Catch::Contains("Products for case s@test1") && Catch::Contains("Products for case s@test2") && - Catch::Contains("edmtestIntProduct \n") && Catch::Contains("edmtestIntProduct foo")); - } -} - -TEST_CASE("Configuration with different transient branches", s_tag) { - const std::string test1{"cms.EDProducer('ManyIntProducer', ivalue = cms.int32(1), values = cms.VPSet())"}; - const std::string test2{ - "cms.EDProducer('ManyIntProducer', ivalue = cms.int32(2), transientValues = " - "cms.VPSet(cms.PSet(instance=cms.string('foo'),value=cms.int32(3))))"}; - - const std::string baseConfig1 = makeConfig(true, test1, test2); - const std::string baseConfig2 = makeConfig(false, test1, test2); - - SECTION("Different transient branches are allowed") { - edm::test::TestProcessor::Config config1{baseConfig1}; - edm::test::TestProcessor testProcessor1{config1}; - auto event1 = testProcessor1.test(); - REQUIRE(event1.get()->value == 2); - - // It would be better if the next line of executable code would - // throw an exception, but that is not the current expected behavior. - // It would be nice to have all cases of a SwitchProducer fail if - // any case fails on a "get" (but it is intentional and desirable - // that it does not fail only because a case declares it produces - // different transient products). We decided it was not worth the - // effort and complexity to implement this behavior (at least not yet). - REQUIRE(event1.get("foo")->value == 3); - - edm::test::TestProcessor::Config config2{baseConfig2}; - edm::test::TestProcessor testProcessor2{config2}; - auto event2 = testProcessor2.test(); - REQUIRE(event2.get()->value == 1); - REQUIRE_THROWS(event2.get()->value == 3); - } -} - -TEST_CASE("Configuration with different branches with EDAlias", s_tag) { - const std::string otherprod{ - "cms.EDProducer('ManyIntProducer', ivalue = cms.int32(2), values = " - "cms.VPSet(cms.PSet(instance=cms.string('foo'),value=cms.int32(3))))"}; - const std::string othername{"intprod"}; - - const std::string test1{"cms.EDProducer('ManyIntProducer', ivalue = cms.int32(1), values = cms.VPSet())"}; - const std::string test2{ - R"_(cms.EDAlias(intprod = cms.VPSet(cms.PSet(type = cms.string('edmtestIntProduct'), fromProductInstance = cms.string(''), toProductInstance = cms.string('')), - cms.PSet(type = cms.string('edmtestIntProduct'), fromProductInstance = cms.string('foo'), toProductInstance = cms.string('foo')))))_"}; - - const std::string baseConfig1 = makeConfig(true, test1, test2, otherprod, othername); - const std::string baseConfig2 = makeConfig(false, test1, test2, otherprod, othername); - - SECTION("Different branches are not allowed") { - edm::test::TestProcessor::Config config1{baseConfig1}; - REQUIRE_THROWS_WITH( - edm::test::TestProcessor(config1), - Catch::Contains("that does not produce a product") && Catch::Contains("that is produced by the chosen case") && - Catch::Contains("Products for case s@test1") && Catch::Contains("Products for case s@test2") && - Catch::Contains("edmtestIntProduct \n") && Catch::Contains("edmtestIntProduct foo")); - - edm::test::TestProcessor::Config config2{baseConfig2}; - REQUIRE_THROWS_WITH( - edm::test::TestProcessor(config2), - Catch::Contains("with a product") && Catch::Contains("that is not produced by the chosen case") && - Catch::Contains("Products for case s@test1") && Catch::Contains("Products for case s@test2") && - Catch::Contains("edmtestIntProduct \n") && Catch::Contains("edmtestIntProduct foo")); - } -} - -TEST_CASE("Configuration with lumi and run", s_tag) { - const std::string test1{"cms.EDProducer('ThingProducer', nThings = cms.int32(10))"}; - const std::string test2{"cms.EDProducer('ThingProducer', nThings = cms.int32(20))"}; - const std::string baseConfig = makeConfig(true, test1, test2); - - edm::test::TestProcessor::Config config{baseConfig}; - - SECTION("Lumi and run products are not supported") { - REQUIRE_THROWS_WITH(edm::test::TestProcessor(config), - Catch::Contains("SwitchProducer does not support non-event branches")); - } -}; - -TEST_CASE("Configuration with ROOT branch alias", s_tag) { - const std::string test1{ - "cms.EDProducer('ManyIntProducer', ivalue = cms.int32(1), values = " - "cms.VPSet(cms.PSet(instance=cms.string('foo'),value=cms.int32(3))))"}; - const std::string test2{ - "cms.EDProducer('ManyIntProducer', ivalue = cms.int32(2), values = " - "cms.VPSet(cms.PSet(instance=cms.string('foo'),value=cms.int32(4),branchAlias=cms.string('bar'))))"}; - - const std::string baseConfig1 = makeConfig(true, test1, test2); - const std::string baseConfig2 = makeConfig(false, test1, test2); - - SECTION("ROOT branch aliases are not supported for the chosen case") { - edm::test::TestProcessor::Config config{baseConfig1}; - REQUIRE_THROWS_WITH(edm::test::TestProcessor(config), - Catch::Contains("SwitchProducer does not support ROOT branch aliases")); - } - - SECTION("ROOT branch aliases are not supported for the non-chosen case") { - edm::test::TestProcessor::Config config{baseConfig2}; - REQUIRE_THROWS_WITH(edm::test::TestProcessor(config), - Catch::Contains("SwitchProducer does not support ROOT branch aliases")); - } -} diff --git a/FWCore/Integration/test/run_TestProcessAccelerator.sh b/FWCore/Integration/test/run_TestProcessAccelerator.sh deleted file mode 100755 index 87254eba4343c..0000000000000 --- a/FWCore/Integration/test/run_TestProcessAccelerator.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash - -test=testProcessAccelerator -LOCAL_TEST_DIR=${SCRAM_TEST_PATH} - -function die { echo Failure $1: status $2 ; exit $2 ; } - -echo "*************************************************" -echo "accelerators=*" -cmsRun ${LOCAL_TEST_DIR}/${test}_cfg.py || die "cmsRun ${test}_cfg.py" $? - -echo "*************************************************" -echo "accelerators=*, enableTest2" -cmsRun ${LOCAL_TEST_DIR}/${test}_cfg.py --enableTest2 || die "cmsRun ${test}_cfg.py --enableTest2" $? - -echo "*************************************************" -echo "accelerators=test1" -cmsRun ${LOCAL_TEST_DIR}/${test}_cfg.py --accelerators=test1 || die "cmsRun ${test}_cfg.py --accelerators=test1" $? - -echo "*************************************************" -echo "accelerators=test2" -cmsRun -j testProcessAccelerators_jobreport.xml ${LOCAL_TEST_DIR}/${test}_cfg.py --accelerators=test2 && die "cmsRun ${test}_cfg.py --accelerators=test2 did not fail" 1 -EXIT_CODE=$(edmFjrDump --exitCode testProcessAccelerators_jobreport.xml) -if [ "x${EXIT_CODE}" != "x8035" ]; then - echo "ProcessAccelerator test for unavailable accelerator reported exit code ${EXIT_CODE} which is different from the expected 8035" - exit 1 -fi - -echo "*************************************************" -echo "accelerators=test1, enableTest2" -cmsRun ${LOCAL_TEST_DIR}/${test}_cfg.py --accelerators=test1 --enableTest2 || die "cmsRun ${test}_cfg.py --accelerators=test1 --enableTest2" $? - -echo "*************************************************" -echo "accelerators=test2, enableTest2" -cmsRun ${LOCAL_TEST_DIR}/${test}_cfg.py --accelerators=test2 --enableTest2 || die "cmsRun ${test}_cfg.py --accelerators=test2 --enableTest2" $? diff --git a/FWCore/Integration/test/run_TestSwitchProducer.sh b/FWCore/Integration/test/run_TestSwitchProducer.sh deleted file mode 100755 index 981c5e745058f..0000000000000 --- a/FWCore/Integration/test/run_TestSwitchProducer.sh +++ /dev/null @@ -1,143 +0,0 @@ -#!/bin/bash - -test=testSwitchProducer - -function die { echo Failure $1: status $2 ; exit $2 ; } - -# Running on multiple threads and streams to test any behavior that -# occurs when there are many of them -NUMTHREADS=4 -LOCAL_TEST_DIR=${SCRAM_TEST_PATH} - - echo "*************************************************" - echo "SwitchProducer in a Task" - cmsRun -n ${NUMTHREADS} ${LOCAL_TEST_DIR}/${test}Task_cfg.py || die "cmsRun ${test}Task_cfg.py" $? - - echo "*************************************************" - echo "SwitchProducer in a Task, case test2 disabled" - cmsRun -n ${NUMTHREADS} ${LOCAL_TEST_DIR}/${test}Task_cfg.py --disableTest2 || die "cmsRun ${test}Task_cfg.py --disableTest2" $? - - echo "*************************************************" - echo "SwitchProducer in a Task, SwitchProducers have same labels as products in input file" - cmsRun -n ${NUMTHREADS} ${LOCAL_TEST_DIR}/${test}Task_cfg.py --input|| die "cmsRun ${test}Task_cfg.py --input" $? - - echo "*************************************************" - echo "SwitchProducer in a Task, SwitchProducers have same labels as products in input file, case test2 disabled" - cmsRun -n ${NUMTHREADS} ${LOCAL_TEST_DIR}/${test}Task_cfg.py --input --disableTest2 || die "cmsRun ${test}TaskInput_cfg.py --input --disableTest2" $? - - echo "*************************************************" - echo "Merge outputs (Task)" - cmsRun ${LOCAL_TEST_DIR}/${test}Merge_cfg.py outputFile=testSwitchProducerTaskMerge1.root inputFiles=file:testSwitchProducerTask1.root inputFiles=file:testSwitchProducerTask2.root || die "Merge Task1: order 1 2" $? - echo "*************************************************" - echo "Merge outputs in reverse order (Task)" - cmsRun ${LOCAL_TEST_DIR}/${test}Merge_cfg.py outputFile=testSwitchProducerTaskMerge2.root inputFiles=file:testSwitchProducerTask2.root inputFiles=file:testSwitchProducerTask1.root || die "Merge Task2: order 2 1" $? - - echo "*************************************************" - echo "Test provenance of merged output (Task)" - cmsRun ${LOCAL_TEST_DIR}/${test}ProvenanceAnalyzer_cfg.py testSwitchProducerTaskMerge1.root || die "cmsRun ${test}ProvenanceAnalyzer_cfg.py Task1" $? - echo "*************************************************" - echo "Test provenance of reversely merged output (Task)" - cmsRun ${LOCAL_TEST_DIR}/${test}ProvenanceAnalyzer_cfg.py testSwitchProducerTaskMerge2.root || die "cmsRun ${test}ProvenanceAnalyzer_cfg.py Task2" $? - - - echo "*************************************************" - echo "SwitchProducer in a ConditionalTask" - cmsRun -n ${NUMTHREADS} ${LOCAL_TEST_DIR}/${test}Task_cfg.py --conditionalTask || die "cmsRun ${test}Task_cfg.py --conditionalTask" $? - - echo "*************************************************" - echo "SwitchProducer in a ConditionalTask, case test2 disabled" - cmsRun -n ${NUMTHREADS} ${LOCAL_TEST_DIR}/${test}Task_cfg.py --conditionalTask --disableTest2 || die "cmsRun ${test}Task_cfg.py --conditionalTask --disableTest2" $? - - echo "*************************************************" - echo "Merge outputs (ConditionalTask)" - cmsRun ${LOCAL_TEST_DIR}/${test}Merge_cfg.py outputFile=testSwitchProducerConditionalTaskMerge1.root inputFiles=file:testSwitchProducerConditionalTask1.root inputFiles=file:testSwitchProducerConditionalTask2.root || die "Merge ConditionalTask1: order 1 2" $? - echo "*************************************************" - echo "Merge outputs in reverse order (ConditionalTask)" - cmsRun ${LOCAL_TEST_DIR}/${test}Merge_cfg.py outputFile=testSwitchProducerConditionalTaskMerge2.root inputFiles=file:testSwitchProducerConditionalTask2.root inputFiles=file:testSwitchProducerConditionalTask1.root || die "Merge ConditionalTask2: order 2 1" $? - - echo "*************************************************" - echo "Test provenance of merged output (ConditionalTask)" - cmsRun ${LOCAL_TEST_DIR}/${test}ProvenanceAnalyzer_cfg.py testSwitchProducerConditionalTaskMerge1.root || die "cmsRun ${test}ProvenanceAnalyzer_cfg.py ConditionalTask1" $? - echo "*************************************************" - echo "Test provenance of reversely merged output (ConditionalTask)" - cmsRun ${LOCAL_TEST_DIR}/${test}ProvenanceAnalyzer_cfg.py testSwitchProducerConditionalTaskMerge2.root || die "cmsRun ${test}ProvenanceAnalyzer_cfg.py ConditionalTask2" $? - - echo "*************************************************" - echo "SwitchProducer in a ConditionalTask, more extensive EDAlias tests" - cmsRun -n ${NUMTHREADS} ${LOCAL_TEST_DIR}/${test}ConditionalTaskEDAlias_cfg.py || die "cmsRun ${test}ConditionalTaskEDAlias_cfg.py 1" $? - - echo "*************************************************" - echo "SwitchProducer in a ConditionalTask, more extensive EDAlias tests, case test2 disabled" - cmsRun -n ${NUMTHREADS} ${LOCAL_TEST_DIR}/${test}ConditionalTaskEDAlias_cfg.py disableTest2 || die "cmsRun ${test}ConditionalTaskEDAlias_cfg.py 2" $? - - echo "*************************************************" - echo "SwitchProducer in a ConditionalTask, test EDAlias with all cases being explicitly consumed" - cmsRun -n ${NUMTHREADS} ${LOCAL_TEST_DIR}/${test}ConditionalTaskEDAliasConsumeAllCases_cfg.py || die "cmsRun ${test}ConditionalTaskEDAliasConsumeAllCases_cfg.py 1" $? - - echo "*************************************************" - echo "SwitchProducer in a ConditionalTask, test EDAlias with all cases being explicitly consumed, case test2 disabled" - cmsRun -n ${NUMTHREADS} ${LOCAL_TEST_DIR}/${test}ConditionalTaskEDAliasConsumeAllCases_cfg.py disableTest2 || die "cmsRun ${test}ConditionalTaskEDAliasConsumeAllCases_cfg.py 2" $? - - echo "*************************************************" - echo "SwitchProducer in a ConditionalTask, test EDAlias with a wildcard" - cmsRun -n ${NUMTHREADS} ${LOCAL_TEST_DIR}/${test}ConditionalTaskEDAliasWildcard_cfg.py || die "cmsRun ${test}ConditionalTaskEDAliasWildcard_cfg.py" $? - - echo "*************************************************" - echo "SwitchProducer in a ConditionalTask, test EDAlias with a wildcard pattern, other module having the wildcard" - cmsRun -n ${NUMTHREADS} ${LOCAL_TEST_DIR}/${test}ConditionalTaskEDAliasWildcard_cfg.py --wildcardOnOtherModule || die "cmsRun ${test}ConditionalTaskEDAliasWildcard_cfg.py --wildcardOnOtherModule" $? - - echo "*************************************************" - echo "SwitchProducer in a ConditionalTask, test EDAlias with an a wildcard, case test2 disabled" - cmsRun -n ${NUMTHREADS} ${LOCAL_TEST_DIR}/${test}ConditionalTaskEDAliasWildcard_cfg.py --disableTest2 || die "cmsRun ${test}ConditionalTaskEDAliasWildcard_cfg.py --disableTest2" $? - - - - echo "*************************************************" - echo "SwitchProducer in a Path" - cmsRun -n ${NUMTHREADS} ${LOCAL_TEST_DIR}/${test}Path_cfg.py || die "cmsRun ${test}Path_cfg.py 1" $? - - echo "*************************************************" - echo "SwitchProducer in a Path, case test2 disabled" - cmsRun -n ${NUMTHREADS} ${LOCAL_TEST_DIR}/${test}Path_cfg.py disableTest2 || die "cmsRun ${test}Path_cfg.py 2" $? - - echo "*************************************************" - echo "Merge outputs (Path)" - cmsRun ${LOCAL_TEST_DIR}/${test}Merge_cfg.py outputFile=testSwitchProducerPathMerge1.root inputFiles=file:testSwitchProducerPath1.root inputFiles=file:testSwitchProducerPath2.root || die "Merge Path1: order 1 2" $? - echo "*************************************************" - echo "Merge outputs in reverse order (Path)" - cmsRun ${LOCAL_TEST_DIR}/${test}Merge_cfg.py outputFile=testSwitchProducerPathMerge2.root inputFiles=file:testSwitchProducerPath2.root inputFiles=file:testSwitchProducerPath1.root || die "Merge Path2: order 2 1" $? - - echo "*************************************************" - echo "Test provenance of merged output (Path)" - cmsRun ${LOCAL_TEST_DIR}/${test}ProvenanceAnalyzer_cfg.py testSwitchProducerPathMerge1.root || die "cmsRun ${test}ProvenanceAnalyzer_cfg.py Path1" $? - echo "*************************************************" - echo "Test provenance of reversely merged output (Path)" - cmsRun ${LOCAL_TEST_DIR}/${test}ProvenanceAnalyzer_cfg.py testSwitchProducerPathMerge2.root || die "cmsRun ${test}ProvenanceAnalyzer_cfg.py Path2" $? - - - echo "*************************************************" - echo "SwitchProducer in a Path after a failing filter" - cmsRun -n ${NUMTHREADS} ${LOCAL_TEST_DIR}/${test}PathFilter_cfg.py || die "cmsRun ${test}PathFilter_cfg.py 1" $? - - echo "*************************************************" - echo "SwitchProducer in a Path after a failing filter, case test2 disabled" - cmsRun -n ${NUMTHREADS} ${LOCAL_TEST_DIR}/${test}PathFilter_cfg.py disableTest2 || die "cmsRun ${test}PathFilter_cfg.py 2" $? - - - echo "*************************************************" - echo "Keeping SwitchProducer-with-EDAlias and the aliased-for product should fail" - cmsRun -n ${NUMTHREADS} ${LOCAL_TEST_DIR}/${test}AliasOutput_cfg.py && die "cmsRun ${test}AliasOutput_cfg.py did not throw an exception" 1 - - echo "*************************************************" - echo "Alias to non-existent product should fail only when a corresponding product is accessed" - cmsRun -n ${NUMTHREADS} ${LOCAL_TEST_DIR}/${test}AliasToNonExistent_cfg.py || die "cmsRun ${test}AliasToNonExistent_cfg.py" $? - cmsRun -n ${NUMTHREADS} ${LOCAL_TEST_DIR}/${test}AliasToNonExistent_cfg.py includeFilter && die "cmsRun ${test}AliasToNonExistent_cfg.py includeFilter did not throw an exception" 1 - - echo "*************************************************" - echo "SwitchProducer-with-EDAlias being before the aliased-for producer in a Path should fail" - cmsRun -n ${NUMTHREADS} ${LOCAL_TEST_DIR}/${test}PathWrongOrder_cfg.py && die "cmsRun ${test}PathWrongOrder_cfg.py did not throw an exception" 1 - - echo "SwitchProducer tests succeeded" - echo "*************************************************" - -exit 0 diff --git a/FWCore/Integration/test/testProcessAccelerator_cfg.py b/FWCore/Integration/test/testProcessAccelerator_cfg.py deleted file mode 100644 index 2619c1f4be5cf..0000000000000 --- a/FWCore/Integration/test/testProcessAccelerator_cfg.py +++ /dev/null @@ -1,69 +0,0 @@ -import FWCore.ParameterSet.Config as cms - -import argparse -import sys - -parser = argparse.ArgumentParser(prog=sys.argv[0], description='Test ProcessAccelerator.') - -parser.add_argument("--enableTest2", help="Enable test2 accelerator", action="store_true") -parser.add_argument("--accelerators", type=str, help="Comma-separated string for accelerators to enable") - -args = parser.parse_args() - -class ProcessAcceleratorTest(cms.ProcessAccelerator): - def __init__(self): - super(ProcessAcceleratorTest,self).__init__() - self._labels = ["test1", "test2"] - self._enabled = ["test1"] - if args.enableTest2: - self._enabled.append("test2") - def labels(self): - return self._labels - def enabledLabels(self): - return self._enabled - -class SwitchProducerTest(cms.SwitchProducer): - def __init__(self, **kargs): - super(SwitchProducerTest,self).__init__( - dict( - cpu = cms.SwitchProducer.getCpu(), - test1 = lambda accelerators: ("test1" in accelerators, 2), - test2 = lambda accelerators: ("test2" in accelerators, 3), - ), **kargs) - -process = cms.Process("PROD1") - -process.add_(ProcessAcceleratorTest()) - -process.source = cms.Source("EmptySource") -process.maxEvents.input = 3 -if args.accelerators is not None: - process.options.accelerators = args.accelerators.split(",") - -process.intProducer1 = cms.EDProducer("ManyIntProducer", ivalue = cms.int32(1)) -process.intProducer2 = cms.EDProducer("ManyIntProducer", ivalue = cms.int32(2)) -process.failIntProducer = cms.EDProducer("ManyIntProducer", ivalue = cms.int32(-1), throw = cms.untracked.bool(True)) - -if args.enableTest2 and ("test2" in process.options.accelerators or "*" in process.options.accelerators): - process.intProducer1.throw = cms.untracked.bool(True) -else: - process.intProducer2.throw = cms.untracked.bool(True) - -process.intProducer = SwitchProducerTest( - cpu = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag("failIntProducer")), - test1 = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag("intProducer1")), - test2 = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag("intProducer2")) -) - -process.intConsumer = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag("intProducer")) - -process.t = cms.Task( - process.failIntProducer, - process.intProducer1, - process.intProducer2, - process.intProducer, -) -process.p = cms.Path( - process.intConsumer, - process.t -) diff --git a/FWCore/Integration/test/testSwitchProducerAliasOutput_cfg.py b/FWCore/Integration/test/testSwitchProducerAliasOutput_cfg.py deleted file mode 100644 index 40b69e0cc56ed..0000000000000 --- a/FWCore/Integration/test/testSwitchProducerAliasOutput_cfg.py +++ /dev/null @@ -1,45 +0,0 @@ -import FWCore.ParameterSet.Config as cms - -class SwitchProducerTest(cms.SwitchProducer): - def __init__(self, **kargs): - super(SwitchProducerTest,self).__init__( - dict( - test1 = lambda accelerators: (True, -10), - test2 = lambda accelerators: (True, -9) - ), **kargs) - -process = cms.Process("PROD1") - -process.options = cms.untracked.PSet( - numberOfStreams = cms.untracked.uint32(1), - numberOfConcurrentRuns = cms.untracked.uint32(1), - numberOfConcurrentLuminosityBlocks = cms.untracked.uint32(1) -) - -process.source = cms.Source("EmptySource") - -process.maxEvents = cms.untracked.PSet( - input = cms.untracked.int32(3) -) - -process.out = cms.OutputModule("PoolOutputModule", - fileName = cms.untracked.string('testSwitchProducerAliasOutput.root'), - outputCommands = cms.untracked.vstring( - 'keep *_intProducer3_*_*', - 'keep *_intProducerAlias_*_*' - ) -) - -process.intProducer1 = cms.EDProducer("ManyIntProducer", ivalue = cms.int32(1), throw = cms.untracked.bool(True)) -process.intProducer3 = cms.EDProducer("ManyIntProducer", ivalue = cms.int32(2), values = cms.VPSet(cms.PSet(instance=cms.string("foo"),value=cms.int32(2)))) - -process.intProducerAlias = SwitchProducerTest( - test1 = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag("intProducer1")), - test2 = cms.EDAlias(intProducer3 = cms.VPSet(cms.PSet(type = cms.string("edmtestIntProduct"), fromProductInstance = cms.string(""), toProductInstance = cms.string("")), - cms.PSet(type = cms.string("edmtestIntProduct"), fromProductInstance = cms.string("foo"), toProductInstance = cms.string("other")))) -) - -process.t = cms.Task(process.intProducerAlias, process.intProducer1, process.intProducer3) -process.p = cms.Path(process.t) - -process.e = cms.EndPath(process.out) diff --git a/FWCore/Integration/test/testSwitchProducerAliasToNonExistent_cfg.py b/FWCore/Integration/test/testSwitchProducerAliasToNonExistent_cfg.py deleted file mode 100644 index dab2a000620ad..0000000000000 --- a/FWCore/Integration/test/testSwitchProducerAliasToNonExistent_cfg.py +++ /dev/null @@ -1,55 +0,0 @@ -import FWCore.ParameterSet.Config as cms - -import sys -includeFilter = (sys.argv[-1] != "includeFilter") - -class SwitchProducerTest(cms.SwitchProducer): - def __init__(self, **kargs): - super(SwitchProducerTest,self).__init__( - dict( - test1 = lambda accelerators: (True, -10), - test2 = lambda accelerators: (True, -9) - ), **kargs) - -process = cms.Process("PROD1") - -process.options = cms.untracked.PSet( - numberOfStreams = cms.untracked.uint32(1), - numberOfConcurrentRuns = cms.untracked.uint32(1), - numberOfConcurrentLuminosityBlocks = cms.untracked.uint32(1) -) - -process.source = cms.Source("EmptySource") - -process.maxEvents = cms.untracked.PSet( - input = cms.untracked.int32(3) -) - -process.out = cms.OutputModule("PoolOutputModule", - fileName = cms.untracked.string('testSwitchProducerAliasToNonExistent{}.root'.format(1 if includeFilter else 2)), - outputCommands = cms.untracked.vstring( - 'keep *_intProducer3__*', - 'keep *_intProducerAlias_*_*' - ) -) - -process.intProducer1 = cms.EDProducer("ManyIntProducer", ivalue = cms.int32(1), throw = cms.untracked.bool(True)) -process.intProducer3 = cms.EDProducer("ManyIntProducer", ivalue = cms.int32(2), values = cms.VPSet(cms.PSet(instance=cms.string("foo"),value=cms.int32(2)))) -process.intProducer4 = cms.EDProducer("ManyIntProducer", ivalue = cms.int32(42), throw = cms.untracked.bool(True)) - -process.intProducerAlias = SwitchProducerTest( - test1 = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag("intProducer1")), - test2 = cms.EDAlias(intProducer4 = cms.VPSet(cms.PSet(type = cms.string("edmtestIntProduct"), fromProductInstance = cms.string(""), toProductInstance = cms.string(""))), - intProducer3 = cms.VPSet(cms.PSet(type = cms.string("edmtestIntProduct"), fromProductInstance = cms.string("foo"), toProductInstance = cms.string("other")))) -) - -process.f = cms.EDFilter("TestFilterModule", acceptValue = cms.untracked.int32(-1)) - -process.t = cms.Task(process.intProducerAlias, process.intProducer1, process.intProducer3) -process.p = cms.Path(process.t) -if includeFilter: - process.p2 = cms.Path(process.f+process.intProducer4) -else: - process.p2 = cms.Path(process.intProducer4) - -process.e = cms.EndPath(process.out) diff --git a/FWCore/Integration/test/testSwitchProducerConditionalTaskEDAliasConsumeAllCases_cfg.py b/FWCore/Integration/test/testSwitchProducerConditionalTaskEDAliasConsumeAllCases_cfg.py deleted file mode 100644 index 4afc27fbcb1a2..0000000000000 --- a/FWCore/Integration/test/testSwitchProducerConditionalTaskEDAliasConsumeAllCases_cfg.py +++ /dev/null @@ -1,69 +0,0 @@ -import FWCore.ParameterSet.Config as cms - -import sys -enableTest2 = (sys.argv[-1] != "disableTest2") -class SwitchProducerTest(cms.SwitchProducer): - def __init__(self, **kargs): - super(SwitchProducerTest,self).__init__( - dict( - test1 = lambda accelerators: (True, -10), - test2 = lambda accelerators: (enableTest2, -9) - ), **kargs) - -process = cms.Process("PROD1") - -process.source = cms.Source("EmptySource") -if enableTest2: - process.source.firstLuminosityBlock = cms.untracked.uint32(2) - -process.maxEvents.input = 3 - -process.intProducer1 = cms.EDProducer("ManyIntProducer", ivalue = cms.int32(1)) -process.intProducer2 = cms.EDProducer("ManyIntProducer", ivalue = cms.int32(2), values = cms.VPSet(cms.PSet(instance=cms.string("foo"),value=cms.int32(2)))) -if enableTest2: - process.intProducer1.throw = cms.untracked.bool(True) -else: - process.intProducer2.throw = cms.untracked.bool(True) - -process.intProducerAlias = SwitchProducerTest( - test1 = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag("intProducer1")), - test2 = cms.EDAlias(intProducer2 = cms.VPSet(cms.PSet(type = cms.string("edmtestIntProduct"), fromProductInstance = cms.string(""), toProductInstance = cms.string("")), - cms.PSet(type = cms.string("edmtestIntProduct"), fromProductInstance = cms.string("foo"), toProductInstance = cms.string("other")))) -) -process.intProducerAliasConsumer = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag("intProducerAlias")) - -# Test that direct dependence on SwitchProducer case-EDAlias within -# the same ConditionalTask does not cause the aliased-for EDProducer -# (in the same ConditionalTask) to become unscheduled, also when the -# consumption is registered within callWhenNewProductsRegistered(). -# Note that neither case of intProducerAlias gets run by the Paths in -# this test. -process.rejectingFilter = cms.EDFilter("TestFilterModule", - acceptValue = cms.untracked.int32(-1) -) -process.allCaseGenericConsumer = cms.EDAnalyzer("GenericConsumer", eventProducts = cms.untracked.vstring( - "intProducerAlias@test1", - "intProducerAlias@test2" -)) -process.test1Consumer = cms.EDAnalyzer("edmtest::GenericIntsAnalyzer", srcEvent = cms.untracked.VInputTag("intProducerAlias@test1")) -process.test2Consumer = cms.EDAnalyzer("edmtest::GenericIntsAnalyzer", srcEvent = cms.untracked.VInputTag("intProducerAlias@test2")) -if enableTest2: - process.test1Consumer.inputShouldBeMissing = cms.untracked.bool(True) - process.test2Consumer.inputShouldExist = cms.untracked.bool(True) -else: - process.test1Consumer.inputShouldExist = cms.untracked.bool(True) - process.test2Consumer.inputShouldBeMissing = cms.untracked.bool(True) - -process.ct = cms.ConditionalTask(process.intProducerAlias, process.intProducer1, process.intProducer2) - -# This path causes the chosen case of intProducerAlias to run -process.p1 = cms.Path(process.intProducerAliasConsumer, process.ct) - -# This path makes the ConditionalTask system to think that all cases -# of intProducerAlias would be run, but they are not run as part of -# this Path because their consumer is behind an EDFilter that rejects -# all events -process.p2 = cms.Path(process.rejectingFilter + process.allCaseGenericConsumer, process.ct) - -# This path tests that only the chosen case of intProducerAlias was run -process.p3 = cms.Path(process.test1Consumer + process.test2Consumer) diff --git a/FWCore/Integration/test/testSwitchProducerConditionalTaskEDAliasWildcard_cfg.py b/FWCore/Integration/test/testSwitchProducerConditionalTaskEDAliasWildcard_cfg.py deleted file mode 100644 index 66fc5478e4f1a..0000000000000 --- a/FWCore/Integration/test/testSwitchProducerConditionalTaskEDAliasWildcard_cfg.py +++ /dev/null @@ -1,83 +0,0 @@ -import FWCore.ParameterSet.Config as cms -import sys -import argparse - -parser = argparse.ArgumentParser(prog=sys.argv[0], description="Test SwitchProducer, that has an EDAlias with '*' wildcard, in a ConditionalTask") - -parser.add_argument("--disableTest2", help="Disable 'test2' case of the SwitchProducerTest", action="store_true") -parser.add_argument("--wildcardOnOtherModule", help="Use the wildcard for alias from another module", action="store_true") - -args = parser.parse_args() - -enableTest2 = not args.disableTest2 -class SwitchProducerTest(cms.SwitchProducer): - def __init__(self, **kargs): - super(SwitchProducerTest,self).__init__( - dict( - test1 = lambda accelerators: (True, -10), - test2 = lambda accelerators: (enableTest2, -9) - ), **kargs) - -process = cms.Process("PROD1") - -process.source = cms.Source("EmptySource") - -process.maxEvents.input = 3 - -process.intProducer1 = cms.EDProducer( - "ManyIntProducer", - ivalue = cms.int32(1), - values = cms.VPSet( - ) -) -process.intProducer2 = cms.EDProducer( - "ManyIntProducer", - ivalue = cms.int32(11), - values = cms.VPSet( - cms.PSet(instance=cms.string("bar"), value=cms.int32(12)) - ) -) -process.intProducer3 = cms.EDProducer( - "ManyIntProducer", - ivalue = cms.int32(21) -) -if args.wildcardOnOtherModule: - process.intProducer1.values.append(cms.PSet(instance=cms.string("bar"), value=cms.int32(2))) - process.intProducer2.values = [] - -process.intProducer4 = cms.EDProducer( - "ManyIntProducer", - ivalue = cms.int32(31), - values = cms.VPSet( - cms.PSet(instance=cms.string("foo"), value=cms.int32(32)), - cms.PSet(instance=cms.string("bar"), value=cms.int32(33)), - cms.PSet(instance=cms.string("xyzzy"), value=cms.int32(34)), - ) -) - -process.intProducer = SwitchProducerTest( - test1 = cms.EDAlias( - intProducer4 = cms.EDAlias.allProducts() - ), - test2 = cms.EDAlias() -) -allMatchName = "intProducer1" -otherName ="intProducer2" -if args.wildcardOnOtherModule: - (allMatchName, otherName) = (otherName, allMatchName) -setattr(process.intProducer.test2, allMatchName, cms.EDAlias.allProducts()) -setattr(process.intProducer.test2, otherName, cms.VPSet( - cms.PSet(type = cms.string("*"), fromProductInstance = cms.string(""), toProductInstance = cms.string("foo")), - cms.PSet(type = cms.string("*"), fromProductInstance = cms.string("bar"), toProductInstance = cms.string("*")) -)) -process.intProducer.test2.intProducer3 = cms.VPSet( - cms.PSet(type = cms.string("edmtestIntProduct"), toProductInstance = cms.string("xyzzy")) -) - -process.intConsumer = cms.EDAnalyzer("edmtest::GenericIntsAnalyzer", srcEvent = cms.untracked.VInputTag("intProducer")) -process.intConsumer2 = cms.EDAnalyzer("edmtest::GenericIntsAnalyzer", srcEvent = cms.untracked.VInputTag("intProducer", "intProducer2", "intProducer3")) - -process.ct = cms.ConditionalTask(process.intProducer1, process.intProducer2, process.intProducer3, process.intProducer4, process.intProducer) - -process.p1 = cms.Path(process.intConsumer, process.ct) -process.p2 = cms.Path(process.intConsumer2, process.ct) diff --git a/FWCore/Integration/test/testSwitchProducerConditionalTaskEDAlias_cfg.py b/FWCore/Integration/test/testSwitchProducerConditionalTaskEDAlias_cfg.py deleted file mode 100644 index b1c93258c87c8..0000000000000 --- a/FWCore/Integration/test/testSwitchProducerConditionalTaskEDAlias_cfg.py +++ /dev/null @@ -1,73 +0,0 @@ -import FWCore.ParameterSet.Config as cms - -import sys -enableTest2 = (sys.argv[-1] != "disableTest2") -class SwitchProducerTest(cms.SwitchProducer): - def __init__(self, **kargs): - super(SwitchProducerTest,self).__init__( - dict( - test1 = lambda accelerators: (True, -10), - test2 = lambda accelerators: (enableTest2, -9) - ), **kargs) - -process = cms.Process("PROD1") - -process.source = cms.Source("EmptySource") -if enableTest2: - process.source.firstLuminosityBlock = cms.untracked.uint32(2) - -process.maxEvents.input = 3 - -process.out = cms.OutputModule("PoolOutputModule", - fileName = cms.untracked.string('testSwitchProducerConditionalTaskEDAlias%d.root' % (1 if enableTest2 else 2,)), - outputCommands = cms.untracked.vstring( - 'keep *_intProducerAlias_*_*', - 'keep *_intProducerDep_*_*', - 'keep *_intProducerDepAliasDep_*_*', - ) -) - -# Test that an alias case works -process.intProducer1 = cms.EDProducer("ManyIntProducer", ivalue = cms.int32(1)) -process.intProducer2 = cms.EDProducer("ManyIntProducer", ivalue = cms.int32(2), values = cms.VPSet(cms.PSet(instance=cms.string("foo"),value=cms.int32(2)))) -process.intProducer3 = cms.EDProducer("ManyIntProducer", ivalue = cms.int32(3)) -process.intProducer4 = cms.EDProducer("ManyIntProducer", ivalue = cms.int32(4)) -if enableTest2: - process.intProducer1.throw = cms.untracked.bool(True) -else: - process.intProducer2.throw = cms.untracked.bool(True) - process.intProducer3.throw = cms.untracked.bool(True) - process.intProducer4.throw = cms.untracked.bool(True) - - -process.intProducerAlias = SwitchProducerTest( - test1 = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag("intProducer1")), - test2 = cms.EDAlias(intProducer2 = cms.VPSet(cms.PSet(type = cms.string("edmtestIntProduct"), fromProductInstance = cms.string(""), toProductInstance = cms.string("")), - cms.PSet(type = cms.string("edmtestIntProduct"), fromProductInstance = cms.string("foo"), toProductInstance = cms.string("other")))) -) - -# Test -# - SwitchProducer depending on other SwitchProducer -# - EDAlias in SwitchProducer uses aliases for two different modules with different instance names -process.intProducerDep = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag("intProducer2")) -if not enableTest2: - process.intProducerDep.labels = ["intProducer1"] - -process.intProducerDepAlias = SwitchProducerTest( - test1 = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag("intProducerDep", "intProducerAlias")), - test2 = cms.EDAlias(intProducer3 = cms.VPSet(cms.PSet(type = cms.string("*"), fromProductInstance = cms.string(""), toProductInstance = cms.string(""))), - intProducer4 = cms.VPSet(cms.PSet(type = cms.string("*"), fromProductInstance = cms.string(""), toProductInstance = cms.string("other")))) -) -process.intProducerDepAliasDep = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag("intProducer3", "intProducer4")) -if not enableTest2: - process.intProducerDepAliasDep.labels = ["intProducerAlias"] - -process.ct = cms.ConditionalTask(process.intProducer1, process.intProducer2, process.intProducer3, process.intProducer4) -process.p = cms.Path(process.intProducerAlias+process.intProducerDep + - process.intProducerDepAlias + process.intProducerDepAliasDep, - process.ct) - -process.ct2 = cms.ConditionalTask(process.intProducerAlias, process.intProducerDep, process.intProducerDepAlias, process.ct) -process.p2 = cms.Path(process.intProducerDepAliasDep, process.ct2) - -process.ep = cms.EndPath(process.out) diff --git a/FWCore/Integration/test/testSwitchProducerMerge_cfg.py b/FWCore/Integration/test/testSwitchProducerMerge_cfg.py deleted file mode 100644 index 5f33571e6c0b3..0000000000000 --- a/FWCore/Integration/test/testSwitchProducerMerge_cfg.py +++ /dev/null @@ -1,20 +0,0 @@ -import FWCore.ParameterSet.Config as cms -from FWCore.ParameterSet.VarParsing import VarParsing - -options = VarParsing("analysis") -options.parseArguments() - -process = cms.Process("MERGE") -process.source = cms.Source("PoolSource", - fileNames = cms.untracked.vstring(options.inputFiles), -) - -process.maxEvents = cms.untracked.PSet( - input = cms.untracked.int32(options.maxEvents) -) - -process.out = cms.OutputModule("PoolOutputModule", - fileName = cms.untracked.string(options.outputFile) -) - -process.ep = cms.EndPath(process.out) diff --git a/FWCore/Integration/test/testSwitchProducerPathFilter_cfg.py b/FWCore/Integration/test/testSwitchProducerPathFilter_cfg.py deleted file mode 100644 index 5655c90705be7..0000000000000 --- a/FWCore/Integration/test/testSwitchProducerPathFilter_cfg.py +++ /dev/null @@ -1,62 +0,0 @@ -import FWCore.ParameterSet.Config as cms - -import sys -enableTest2 = (sys.argv[-1] != "disableTest2") -class SwitchProducerTest(cms.SwitchProducer): - def __init__(self, **kargs): - super(SwitchProducerTest,self).__init__( - dict( - test1 = lambda accelerators: (True, -10), - test2 = lambda accelerators: (enableTest2, -9) - ), **kargs) - -process = cms.Process("PROD1") - -process.options = cms.untracked.PSet( - numberOfStreams = cms.untracked.uint32(1), - numberOfConcurrentRuns = cms.untracked.uint32(1), - numberOfConcurrentLuminosityBlocks = cms.untracked.uint32(1) -) - -process.source = cms.Source("EmptySource") -if enableTest2: - process.source.firstLuminosityBlock = cms.untracked.uint32(2) - -process.maxEvents = cms.untracked.PSet( - input = cms.untracked.int32(3) -) - -process.out = cms.OutputModule("PoolOutputModule", - fileName = cms.untracked.string('testSwitchProducerPathFilter%d.root' % (1 if enableTest2 else 2,)), - outputCommands = cms.untracked.vstring( - 'keep *_intProducer_*_*', - 'keep *_intProducerAlias_*_*', - ) -) - -process.intProducer1 = cms.EDProducer("FailingProducer") -process.intProducer2 = cms.EDProducer("FailingProducer") -process.intProducer3 = cms.EDProducer("ManyIntProducer", - ivalue = cms.int32(3), - values = cms.VPSet(cms.PSet(instance=cms.string("foo"),value=cms.int32(31))), - throw = cms.untracked.bool(True) -) - -process.intProducer = SwitchProducerTest( - test1 = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag("intProducer1")), - test2 = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag("intProducer2")) -) -# SwitchProducer with an alias -process.intProducerAlias = SwitchProducerTest( - test1 = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag("intProducer1")), - test2 = cms.EDAlias(intProducer3 = cms.VPSet(cms.PSet(type = cms.string("edmtestIntProduct"), fromProductInstance = cms.string(""), toProductInstance = cms.string("")), - cms.PSet(type = cms.string("edmtestIntProduct"), fromProductInstance = cms.string("foo"), toProductInstance = cms.string("other")))) -) - - -process.f = cms.EDFilter("TestFilterModule", acceptValue = cms.untracked.int32(-1)) - -process.t = cms.Task(process.intProducer1, process.intProducer2, process.intProducer3) -process.p = cms.Path(process.f+process.intProducer+process.intProducerAlias, process.t) - -process.e = cms.EndPath(process.out) diff --git a/FWCore/Integration/test/testSwitchProducerPathWrongOrder_cfg.py b/FWCore/Integration/test/testSwitchProducerPathWrongOrder_cfg.py deleted file mode 100644 index a0e5d0a057aff..0000000000000 --- a/FWCore/Integration/test/testSwitchProducerPathWrongOrder_cfg.py +++ /dev/null @@ -1,45 +0,0 @@ -import FWCore.ParameterSet.Config as cms - -class SwitchProducerTest(cms.SwitchProducer): - def __init__(self, **kargs): - super(SwitchProducerTest,self).__init__( - dict( - test1 = lambda accelerators: (True, -10), - test2 = lambda accelerators: (True, -9) - ), **kargs) - -process = cms.Process("PROD1") - -process.options = cms.untracked.PSet( - numberOfStreams = cms.untracked.uint32(1), - numberOfConcurrentRuns = cms.untracked.uint32(1), - numberOfConcurrentLuminosityBlocks = cms.untracked.uint32(1) -) - -process.source = cms.Source("EmptySource") - -process.maxEvents = cms.untracked.PSet( - input = cms.untracked.int32(3) -) - -process.out = cms.OutputModule("PoolOutputModule", - fileName = cms.untracked.string('testSwitchProducerPathWrongOrder.root'), - outputCommands = cms.untracked.vstring( - 'keep *_intProducerAlias_*_*' - ) -) - -process.intProducer1 = cms.EDProducer("ManyIntProducer", ivalue = cms.int32(1), throw = cms.untracked.bool(True)) -process.intProducer3 = cms.EDProducer("ManyIntProducer", ivalue = cms.int32(3), values = cms.VPSet(cms.PSet(instance=cms.string("foo"),value=cms.int32(31)))) - -# SwitchProducer with an alias -process.intProducerAlias = SwitchProducerTest( - test1 = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag("intProducer1")), - test2 = cms.EDAlias(intProducer3 = cms.VPSet(cms.PSet(type = cms.string("edmtestIntProduct"), fromProductInstance = cms.string(""), toProductInstance = cms.string("")), - cms.PSet(type = cms.string("edmtestIntProduct"), fromProductInstance = cms.string("foo"), toProductInstance = cms.string("other")))) -) - -process.t = cms.Task(process.intProducer1) -process.p = cms.Path(process.intProducerAlias + process.intProducer3, process.t) - -process.e = cms.EndPath(process.out) diff --git a/FWCore/Integration/test/testSwitchProducerPath_cfg.py b/FWCore/Integration/test/testSwitchProducerPath_cfg.py deleted file mode 100644 index d65d6fc8d4595..0000000000000 --- a/FWCore/Integration/test/testSwitchProducerPath_cfg.py +++ /dev/null @@ -1,85 +0,0 @@ -import FWCore.ParameterSet.Config as cms - -import sys -enableTest2 = (sys.argv[-1] != "disableTest2") -class SwitchProducerTest(cms.SwitchProducer): - def __init__(self, **kargs): - super(SwitchProducerTest,self).__init__( - dict( - test1 = lambda accelerators: (True, -10), - test2 = lambda accelerators: (enableTest2, -9) - ), **kargs) - -process = cms.Process("PROD1") - -process.source = cms.Source("EmptySource") -if enableTest2: - process.source.firstLuminosityBlock = cms.untracked.uint32(2) - -process.maxEvents = cms.untracked.PSet( - input = cms.untracked.int32(3) -) - -process.out = cms.OutputModule("PoolOutputModule", - fileName = cms.untracked.string('testSwitchProducerPath%d.root' % (1 if enableTest2 else 2,)), - outputCommands = cms.untracked.vstring( - 'keep *_intProducer_*_*', - 'keep *_intProducerAlias_*_*', - 'keep *_intProducerDep1_*_*', - 'keep *_intProducerDep2_*_*', - 'keep *_intProducerDep3_*_*', - ) -) - -process.intProducer1 = cms.EDProducer("ManyIntProducer", ivalue = cms.int32(1)) -process.intProducer2 = cms.EDProducer("ManyIntProducer", ivalue = cms.int32(2)) -process.intProducer3 = cms.EDProducer("ManyIntProducer", ivalue = cms.int32(2), values = cms.VPSet(cms.PSet(instance=cms.string("foo"),value=cms.int32(2)))) -if enableTest2: - process.intProducer1.throw = cms.untracked.bool(True) -else: - process.intProducer2.throw = cms.untracked.bool(True) - process.intProducer3.throw = cms.untracked.bool(True) - -process.intProducer = SwitchProducerTest( - test1 = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag("intProducer1")), - test2 = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag("intProducer2")) -) -# SwitchProducer with an alias -process.intProducerAlias = SwitchProducerTest( - test1 = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag("intProducer1")), - test2 = cms.EDAlias(intProducer3 = cms.VPSet(cms.PSet(type = cms.string("edmtestIntProduct"), fromProductInstance = cms.string(""), toProductInstance = cms.string("")), - cms.PSet(type = cms.string("edmtestIntProduct"), fromProductInstance = cms.string("foo"), toProductInstance = cms.string("other")))) -) - -# SwitchProducer of EDAlias in a Path causes alone is enough to trigger aliased-for EDProducers to be run -if enableTest2: - process.intProducer4 = cms.EDProducer("ManyIntProducer", ivalue = cms.int32(314), throw=cms.untracked.bool(True)) - process.intProducer6 = cms.EDProducer("edmtest::MustRunIntProducer", ivalue = cms.int32(4)) -else: - process.intProducer4 = cms.EDProducer("edmtest::MustRunIntProducer", ivalue = cms.int32(314)) - process.intProducer6 = cms.EDProducer("ManyIntProducer", ivalue = cms.int32(4), throw=cms.untracked.bool(True)) -process.intProducer5 = process.intProducer4.clone(ivalue = 159) -process.intProducer7 = process.intProducer6.clone(ivalue = 2) - -process.intProducerAlias2 = SwitchProducerTest( - test1 = cms.EDAlias(intProducer4 = cms.VPSet(cms.PSet(type = cms.string("*"), fromProductInstance = cms.string(""), toProductInstance = cms.string(""))), - intProducer5 = cms.VPSet(cms.PSet(type = cms.string("*"), fromProductInstance = cms.string(""), toProductInstance = cms.string("other")))), - test2 = cms.EDAlias(intProducer6 = cms.VPSet(cms.PSet(type = cms.string("*"), fromProductInstance = cms.string(""), toProductInstance = cms.string(""))), - intProducer7 = cms.VPSet(cms.PSet(type = cms.string("*"), fromProductInstance = cms.string(""), toProductInstance = cms.string("other")))) -) - - -# Test multiple consumers of a SwitchProducer -process.intProducerDep1 = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag("intProducer")) -process.intProducerDep2 = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag("intProducer")) -process.intProducerDep3 = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag("intProducer")) - - -process.t = cms.Task(process.intProducer1, process.intProducer2, process.intProducer3, - process.intProducerDep1, process.intProducerDep2, process.intProducerDep3) -process.p = cms.Path(process.intProducer + process.intProducerAlias, process.t) - -process.t2 = cms.Task(process.intProducer4, process.intProducer5, process.intProducer6, process.intProducer7) -process.p2 = cms.Path(process.intProducerAlias2, process.t2) - -process.e = cms.EndPath(process.out) diff --git a/FWCore/Integration/test/testSwitchProducerProvenanceAnalyzer_cfg.py b/FWCore/Integration/test/testSwitchProducerProvenanceAnalyzer_cfg.py deleted file mode 100644 index 1647f89c63402..0000000000000 --- a/FWCore/Integration/test/testSwitchProducerProvenanceAnalyzer_cfg.py +++ /dev/null @@ -1,24 +0,0 @@ -import FWCore.ParameterSet.Config as cms -import sys - -process = cms.Process("ANA1") - -process.source = cms.Source("PoolSource", - fileNames = cms.untracked.vstring("file:"+sys.argv[-1]) -) - -process.analyzer = cms.EDAnalyzer("SwitchProducerProvenanceAnalyzer", - src1 = cms.InputTag("intProducer"), - src2 = cms.InputTag("intProducer", "other"), - producerPrefix = cms.string("intProducer"), - aliasMode = cms.bool(False) -) - -process.analyzerAlias = cms.EDAnalyzer("SwitchProducerProvenanceAnalyzer", - src1 = cms.InputTag("intProducerAlias"), - src2 = cms.InputTag("intProducerAlias", "other"), - producerPrefix = cms.string("intProducer"), - aliasMode = cms.bool(True) -) - -process.p = cms.Path(process.analyzer + process.analyzerAlias) diff --git a/FWCore/Integration/test/testSwitchProducerTask_cfg.py b/FWCore/Integration/test/testSwitchProducerTask_cfg.py deleted file mode 100644 index f92aa69dc16f7..0000000000000 --- a/FWCore/Integration/test/testSwitchProducerTask_cfg.py +++ /dev/null @@ -1,106 +0,0 @@ -import FWCore.ParameterSet.Config as cms - -import argparse -import sys - -parser = argparse.ArgumentParser(prog=sys.argv[0], description='Test SwitchProducer in Task.') -parser.add_argument("--disableTest2", help="Disable test2 SwitchProducer case", action="store_true") -parser.add_argument("--input", help="Read input file from a previous step of this same configuration", action="store_true") -parser.add_argument("--conditionalTask", help="Use ConditionalTask instead of Task", action="store_true") - -args = parser.parse_args() - -enableTest2 = not args.disableTest2 -class SwitchProducerTest(cms.SwitchProducer): - def __init__(self, **kargs): - super(SwitchProducerTest,self).__init__( - dict( - test1 = lambda accelerators: (True, -10), - test2 = lambda accelerators: (enableTest2, -9) - ), **kargs) - -process = cms.Process("PROD2" if args.input else "PROD1") - -if args.input: - # Test that having SwitchProducers with same labels as products from - # earlier processes works - process.source = cms.Source("PoolSource", - fileNames = cms.untracked.vstring("file:testSwitchProducer{}Task{}.root".format( - "Conditional" if args.conditionalTask else "", - 1 if enableTest2 else 2, - )) - ) - process.maxEvents.input = -1 -else: - process.source = cms.Source("EmptySource") - process.maxEvents.input = 3 - if enableTest2: - process.source.firstLuminosityBlock = cms.untracked.uint32(2) - -process.out = cms.OutputModule("PoolOutputModule", - fileName = cms.untracked.string('testSwitchProducer{}Task{}{}.root'.format( - "Conditional" if args.conditionalTask else "", - "Input" if args.input else "", - 1 if enableTest2 else 2, - )), - outputCommands = cms.untracked.vstring( - 'keep *_intProducer_*_*', - 'keep *_intProducerOther_*_*', - 'keep *_intProducerAlias_*_*', - 'keep *_intProducerAlias2_other_*', - 'keep *_intProducerDep1_*_*', - 'keep *_intProducerDep2_*_*', - 'keep *_intProducerDep3_*_*', - ) -) - -process.intProducer1 = cms.EDProducer("ManyIntProducer", ivalue = cms.int32(1)) -process.intProducer2 = cms.EDProducer("ManyIntProducer", ivalue = cms.int32(2)) -process.intProducer3 = cms.EDProducer("ManyIntProducer", ivalue = cms.int32(2), values = cms.VPSet(cms.PSet(instance=cms.string("foo"),value=cms.int32(2)))) -process.intProducer4 = cms.EDProducer("ManyIntProducer", ivalue = cms.int32(42), throw = cms.untracked.bool(True)) -process.intProducer5 = cms.EDProducer("ManyIntProducer", ivalue = cms.int32(3), values = cms.VPSet(cms.PSet(instance=cms.string("foo"),value=cms.int32(3)))) -if enableTest2: - process.intProducer1.throw = cms.untracked.bool(True) -else: - process.intProducer2.throw = cms.untracked.bool(True) - process.intProducer3.throw = cms.untracked.bool(True) - process.intProducer5.throw = cms.untracked.bool(True) - -process.intProducer = SwitchProducerTest( - test1 = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag("intProducer1")), - test2 = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag("intProducer2")) -) -# Test also existence of another SwitchProducer here -process.intProducerOther = SwitchProducerTest( - test1 = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag("intProducer1")), - test2 = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag("intProducer2")) -) -# SwitchProducer with an alias -process.intProducerAlias = SwitchProducerTest( - test1 = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag("intProducer1")), - test2 = cms.EDAlias(intProducer3 = cms.VPSet(cms.PSet(type = cms.string("edmtestIntProduct"), fromProductInstance = cms.string(""), toProductInstance = cms.string("")), - cms.PSet(type = cms.string("edmtestIntProduct"), fromProductInstance = cms.string("foo"), toProductInstance = cms.string("other")))) -) - -process.intProducerAlias2 = SwitchProducerTest( - test1 = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag("intProducer1")), - test2 = cms.EDAlias(intProducer4 = cms.VPSet(cms.PSet(type = cms.string("edmtestIntProduct"), fromProductInstance = cms.string(""), toProductInstance = cms.string(""))), - intProducer5 = cms.VPSet(cms.PSet(type = cms.string("edmtestIntProduct"), fromProductInstance = cms.string("foo"), toProductInstance = cms.string("other")))) -) - -# Test multiple consumers of a SwitchProducer -process.intProducerDep1 = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag("intProducer")) -process.intProducerDep2 = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag("intProducer")) -process.intProducerDep3 = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag("intProducer")) - -if args.conditionalTask: - process.ct = cms.ConditionalTask(process.intProducer, process.intProducerOther, process.intProducerAlias, process.intProducerAlias2, - process.intProducer1, process.intProducer2, process.intProducer3, process.intProducer4, process.intProducer5) - process.p = cms.Path(process.intProducerDep1+process.intProducerDep2+process.intProducerDep3, process.ct) -else: - process.t = cms.Task(process.intProducer, process.intProducerOther, process.intProducerAlias, process.intProducerAlias2, - process.intProducerDep1, process.intProducerDep2, process.intProducerDep3, - process.intProducer1, process.intProducer2, process.intProducer3, process.intProducer4, process.intProducer5) - process.p = cms.Path(process.t) - -process.e = cms.EndPath(process.out) diff --git a/FWCore/ParameterSet/python/Config.py b/FWCore/ParameterSet/python/Config.py index 4d5c200b3360c..92ab4bc55994b 100644 --- a/FWCore/ParameterSet/python/Config.py +++ b/FWCore/ParameterSet/python/Config.py @@ -1930,13 +1930,6 @@ def add_(self, value): raise TypeError("ProcessAccelerator.apply() can only add Services. Tried to set {} with label {}".format(str(type(value)), label)) self.__process.add_(value) -# Need to be a module-level function for the configuration with a -# SwitchProducer to be pickleable. -def _switchproducer_test2_case1(accelerators): - return ("test1" in accelerators, -10) -def _switchproducer_test2_case2(accelerators): - return ("test2" in accelerators, -9) - if __name__=="__main__": import unittest import copy @@ -2027,26 +2020,6 @@ def addFileInPath(self,tracked,label,value): def newPSet(self): return TestMakePSet() - class SwitchProducerTest(SwitchProducer): - def __init__(self, **kargs): - super(SwitchProducerTest,self).__init__( - dict( - test1 = lambda accelerators: (True, -10), - test2 = lambda accelerators: (True, -9), - test3 = lambda accelerators: (True, -8), - test4 = lambda accelerators: (True, -7) - ), **kargs) - specialImportRegistry.registerSpecialImportForType(SwitchProducerTest, "from test import SwitchProducerTest") - - class SwitchProducerTest2(SwitchProducer): - def __init__(self, **kargs): - super(SwitchProducerTest2,self).__init__( - dict( - test1 = _switchproducer_test2_case1, - test2 = _switchproducer_test2_case2, - ), **kargs) - specialImportRegistry.registerSpecialImportForType(SwitchProducerTest2, "from test import SwitchProducerTest2") - class TestModuleTypeResolver: def __init__(self, accelerators): # first element is used as the default is nothing is set @@ -3512,113 +3485,6 @@ def testRefToPSet(self): self.assertEqual((True,1),p.values["ref2"][1].values["b"][1].values["a"]) self.assertEqual((True,1),p.values["ref4"][1][0].values["a"]) self.assertEqual((True,1),p.values["ref4"][1][1].values["a"]) - def testSwitchProducer(self): - proc = Process("test") - proc.sp = SwitchProducerTest(test2 = EDProducer("Foo", - a = int32(1), - b = PSet(c = int32(2))), - test1 = EDProducer("Bar", - aa = int32(11), - bb = PSet(cc = int32(12)))) - self.assertEqual(proc.sp.label_(), "sp") - self.assertEqual(proc.sp.test1.label_(), "sp@test1") - self.assertEqual(proc.sp.test2.label_(), "sp@test2") - - proc.a = EDProducer("A") - proc.s = Sequence(proc.a + proc.sp) - proc.t = Task(proc.a, proc.sp) - proc.p = Path() - proc.p.associate(proc.t) - p = TestMakePSet() - proc.fillProcessDesc(p) - self.assertEqual((True,"EDProducer"), p.values["sp"][1].values["@module_edm_type"]) - self.assertEqual((True, "SwitchProducer"), p.values["sp"][1].values["@module_type"]) - self.assertEqual((True, "sp"), p.values["sp"][1].values["@module_label"]) - all_cases = copy.deepcopy(p.values["sp"][1].values["@all_cases"]) - all_cases[1].sort() # names of all cases come via dict, i.e. their order is undefined - self.assertEqual((True, ["sp@test1", "sp@test2"]), all_cases) - self.assertEqual((False, "sp@test2"), p.values["sp"][1].values["@chosen_case"]) - self.assertEqual(["a", "sp", "sp@test1", "sp@test2"], p.values["@all_modules"][1]) - self.assertEqual((True,"EDProducer"), p.values["sp@test1"][1].values["@module_edm_type"]) - self.assertEqual((True,"Bar"), p.values["sp@test1"][1].values["@module_type"]) - self.assertEqual((True,"EDProducer"), p.values["sp@test2"][1].values["@module_edm_type"]) - self.assertEqual((True,"Foo"), p.values["sp@test2"][1].values["@module_type"]) - dump = proc.dumpPython() - self.assertEqual(dump.find('@'), -1) - self.assertEqual(specialImportRegistry.getSpecialImports(), ["from test import SwitchProducerTest"]) - self.assertTrue(dump.find("\nfrom test import SwitchProducerTest\n") != -1) - - # EDAlias as non-chosen case - proc = Process("test") - proc.sp = SwitchProducerTest(test2 = EDProducer("Foo", - a = int32(1), - b = PSet(c = int32(2))), - test1 = EDAlias(a = VPSet(PSet(type = string("Bar"))))) - proc.a = EDProducer("A") - proc.s = Sequence(proc.a + proc.sp) - proc.t = Task(proc.a, proc.sp) - proc.p = Path() - proc.p.associate(proc.t) - p = TestMakePSet() - proc.fillProcessDesc(p) - self.assertEqual((True,"EDProducer"), p.values["sp"][1].values["@module_edm_type"]) - self.assertEqual((True, "SwitchProducer"), p.values["sp"][1].values["@module_type"]) - self.assertEqual((True, "sp"), p.values["sp"][1].values["@module_label"]) - all_cases = copy.deepcopy(p.values["sp"][1].values["@all_cases"]) - all_cases[1].sort() - self.assertEqual((True, ["sp@test1", "sp@test2"]), all_cases) - self.assertEqual((False, "sp@test2"), p.values["sp"][1].values["@chosen_case"]) - self.assertEqual(["a", "sp", "sp@test2"], p.values["@all_modules"][1]) - self.assertEqual(["sp@test1"], p.values["@all_aliases"][1]) - self.assertEqual((True,"EDProducer"), p.values["sp@test2"][1].values["@module_edm_type"]) - self.assertEqual((True,"Foo"), p.values["sp@test2"][1].values["@module_type"]) - self.assertEqual((True,"EDAlias"), p.values["sp@test1"][1].values["@module_edm_type"]) - self.assertEqual((True,"Bar"), p.values["sp@test1"][1].values["a"][1][0].values["type"]) - - # EDAlias as chosen case - proc = Process("test") - proc.sp = SwitchProducerTest(test1 = EDProducer("Foo", - a = int32(1), - b = PSet(c = int32(2))), - test2 = EDAlias(a = VPSet(PSet(type = string("Bar"))))) - proc.a = EDProducer("A") - proc.s = Sequence(proc.a + proc.sp) - proc.t = Task(proc.a, proc.sp) - proc.p = Path() - proc.p.associate(proc.t) - p = TestMakePSet() - proc.fillProcessDesc(p) - self.assertEqual((True,"EDProducer"), p.values["sp"][1].values["@module_edm_type"]) - self.assertEqual((True, "SwitchProducer"), p.values["sp"][1].values["@module_type"]) - self.assertEqual((True, "sp"), p.values["sp"][1].values["@module_label"]) - self.assertEqual((True, ["sp@test1", "sp@test2"]), p.values["sp"][1].values["@all_cases"]) - self.assertEqual((False, "sp@test2"), p.values["sp"][1].values["@chosen_case"]) - self.assertEqual(["a", "sp", "sp@test1"], p.values["@all_modules"][1]) - self.assertEqual(["sp@test2"], p.values["@all_aliases"][1]) - self.assertEqual((True,"EDProducer"), p.values["sp@test1"][1].values["@module_edm_type"]) - self.assertEqual((True,"Foo"), p.values["sp@test1"][1].values["@module_type"]) - self.assertEqual((True,"EDAlias"), p.values["sp@test2"][1].values["@module_edm_type"]) - self.assertEqual((True,"Bar"), p.values["sp@test2"][1].values["a"][1][0].values["type"]) - - # ConditionalTask - proc = Process("test") - proc.spct = SwitchProducerTest(test2 = EDProducer("Foo", - a = int32(1), - b = PSet(c = int32(2))), - test1 = EDProducer("Bar", - aa = int32(11), - bb = PSet(cc = int32(12))), - test3 = EDAlias(a = VPSet(PSet(type = string("Bar"))))) - proc.spp = proc.spct.clone() - proc.a = EDProducer("A") - proc.ct = ConditionalTask(proc.spct) - proc.p = Path(proc.a, proc.ct) - proc.pp = Path(proc.a + proc.spp) - p = TestMakePSet() - proc.fillProcessDesc(p) - self.assertEqual(["a", "spct", "spct@test1", "spct@test2", "spp", "spp@test1", "spp@test2"], p.values["@all_modules"][1]) - self.assertEqual(["a", "#", "spct", "spct@test1", "spct@test2", "@"], p.values["p"][1]) - self.assertEqual(["a", "spp", "#", "spp@test1", "spp@test2", "@"], p.values["pp"][1]) def testPrune(self): p = Process("test") @@ -3921,15 +3787,11 @@ def testDelete(self): p.f = EDAnalyzer("OurAnalyzer") p.g = EDProducer("OurProducer") p.h = EDProducer("YourProducer") - p.i = SwitchProducerTest( - test1 = EDProducer("OneProducer"), - test2 = EDProducer("TwoProducer") - ) - p.t1 = Task(p.g, p.h, p.i) - t2 = Task(p.g, p.h, p.i) + p.t1 = Task(p.g, p.h) + t2 = Task(p.g, p.h) t3 = Task(p.g, p.h) p.t4 = Task(p.h) - p.ct1 = ConditionalTask(p.g, p.h, p.i) + p.ct1 = ConditionalTask(p.g, p.h) ct2 = ConditionalTask(p.g, p.h) ct3 = ConditionalTask(p.g, p.h) p.ct4 = ConditionalTask(p.h) @@ -3942,11 +3804,9 @@ def testDelete(self): p.schedule = Schedule(p.path2, p.path3, p.endpath2, tasks=[t3, p.t4]) self.assertTrue(hasattr(p, 'f')) self.assertTrue(hasattr(p, 'g')) - self.assertTrue(hasattr(p, 'i')) del p.e del p.f del p.g - del p.i self.assertFalse(hasattr(p, 'f')) self.assertFalse(hasattr(p, 'g')) self.assertEqual(p.t1.dumpPython(), 'cms.Task(process.h)\n') @@ -4321,54 +4181,6 @@ def __init__(self): self.assertTrue(hasattr(a, "bar")) self.assertEqual(a.bar[0].type, "Bar") - # SwitchProducer - sp = SwitchProducerTest(test1 = EDProducer("Foo", - a = int32(1), - b = PSet(c = int32(2))), - test2 = EDProducer("Bar", - aa = int32(11), - bb = PSet(cc = int32(12)))) - m = Modifier() - m._setChosen() - # Modify parameters - m.toModify(sp, - test1 = dict(a = 4, b = dict(c = None)), - test2 = dict(aa = 15, bb = dict(cc = 45, dd = string("foo")))) - self.assertEqual(sp.test1.a.value(), 4) - self.assertEqual(sp.test1.b.hasParameter("c"), False) - self.assertEqual(sp.test2.aa.value(), 15) - self.assertEqual(sp.test2.bb.cc.value(), 45) - self.assertEqual(sp.test2.bb.dd.value(), "foo") - # Replace a producer - m.toReplaceWith(sp.test1, EDProducer("Fred", x = int32(42))) - self.assertEqual(sp.test1.type_(), "Fred") - self.assertEqual(sp.test1.x.value(), 42) - self.assertRaises(TypeError, lambda: m.toReplaceWith(sp.test1, EDAnalyzer("Foo"))) - # Alternative way (only to be allow same syntax to be used as for adding) - m.toModify(sp, test2 = EDProducer("Xyzzy", x = int32(24))) - self.assertEqual(sp.test2.type_(), "Xyzzy") - self.assertEqual(sp.test2.x.value(), 24) - self.assertRaises(TypeError, lambda: m.toModify(sp, test2 = EDAnalyzer("Foo"))) - # Add a producer - m.toModify(sp, test3 = EDProducer("Wilma", y = int32(24))) - self.assertEqual(sp.test3.type_(), "Wilma") - self.assertEqual(sp.test3.y.value(), 24) - self.assertRaises(TypeError, lambda: m.toModify(sp, test4 = EDAnalyzer("Foo"))) - # Remove a producer - m.toModify(sp, test2 = None) - self.assertEqual(hasattr(sp, "test2"), False) - # Add an alias - m.toModify(sp, test2 = EDAlias(foo = VPSet(PSet(type = string("int"))))) - self.assertTrue(hasattr(sp.test2, "foo")) - # Replace an alias - m.toReplaceWith(sp.test2, EDAlias(bar = VPSet(PSet(type = string("int"))))) - self.assertTrue(hasattr(sp.test2, "bar")) - # Alternative way - m.toModify(sp, test2 = EDAlias(xyzzy = VPSet(PSet(type = string("int"))))) - self.assertTrue(hasattr(sp.test2, "xyzzy")) - # Replace an alias with EDProducer - self.assertRaises(TypeError, lambda: m.toReplaceWith(sp.test2, EDProducer("Foo"))) - m.toModify(sp, test2 = EDProducer("Foo")) def testProcessFragment(self): #check defaults are not overwritten f = ProcessFragment('Fragment') @@ -4555,73 +4367,6 @@ def testProcessAccelerator(self): self.assertEqual(["anothertest3", "cpu"], p.values["@selected_accelerators"][1]) self.assertEqual(["anothertest3", "anothertest4", "cpu", "test1", "test2"], p.values["@available_accelerators"][1]) - proc = Process("TEST") - proc.ProcessAcceleratorTest = ProcessAcceleratorTest() - proc.sp = SwitchProducerTest2(test2 = EDProducer("Foo", - a = int32(1), - b = PSet(c = int32(2))), - test1 = EDProducer("Bar", - aa = int32(11), - bb = PSet(cc = int32(12)))) - proc.p = Path(proc.sp) - p = TestMakePSet() - proc.fillProcessDesc(p) - self.assertEqual((False, "sp@test2"), p.values["sp"][1].values["@chosen_case"]) - - proc = Process("TEST") - proc.ProcessAcceleratorTest = ProcessAcceleratorTest(enabled=["test1"]) - proc.sp = SwitchProducerTest2(test2 = EDProducer("Foo", - a = int32(1), - b = PSet(c = int32(2))), - test1 = EDProducer("Bar", - aa = int32(11), - bb = PSet(cc = int32(12)))) - proc.p = Path(proc.sp) - p = TestMakePSet() - proc.fillProcessDesc(p) - self.assertEqual((False, "sp@test1"), p.values["sp"][1].values["@chosen_case"]) - - proc = Process("TEST") - proc.ProcessAcceleratorTest = ProcessAcceleratorTest() - proc.options.accelerators = ["test1"] - proc.sp = SwitchProducerTest2(test2 = EDProducer("Foo", - a = int32(1), - b = PSet(c = int32(2))), - test1 = EDProducer("Bar", - aa = int32(11), - bb = PSet(cc = int32(12)))) - proc.p = Path(proc.sp) - p = TestMakePSet() - proc.fillProcessDesc(p) - self.assertEqual((False, "sp@test1"), p.values["sp"][1].values["@chosen_case"]) - - proc = Process("TEST") - proc.ProcessAcceleratorTest = ProcessAcceleratorTest() - proc.options.accelerators = ["test*"] - proc.sp = SwitchProducerTest2(test2 = EDProducer("Foo", - a = int32(1), - b = PSet(c = int32(2))), - test1 = EDProducer("Bar", - aa = int32(11), - bb = PSet(cc = int32(12)))) - proc.p = Path(proc.sp) - p = TestMakePSet() - proc.fillProcessDesc(p) - self.assertEqual((False, "sp@test2"), p.values["sp"][1].values["@chosen_case"]) - - proc = Process("TEST") - proc.ProcessAcceleratorTest = ProcessAcceleratorTest() - proc.options.accelerators = ["anothertest3"] - proc.sp = SwitchProducerTest2(test2 = EDProducer("Foo", - a = int32(1), - b = PSet(c = int32(2))), - test1 = EDProducer("Bar", - aa = int32(11), - bb = PSet(cc = int32(12)))) - proc.p = Path(proc.sp) - p = TestMakePSet() - self.assertRaises(RuntimeError, proc.fillProcessDesc, p) - proc = Process("TEST") proc.ProcessAcceleratorTest = ProcessAcceleratorTest( moduleTypeResolverMaker=lambda accelerators: TestModuleTypeResolver(accelerators)) @@ -4678,29 +4423,6 @@ def testProcessAccelerator(self): p = TestMakePSet() self.assertRaises(RuntimeError, proc.fillProcessDesc, p) - import pickle - proc = Process("TEST") - proc.ProcessAcceleratorTest = ProcessAcceleratorTest() - proc.sp = SwitchProducerTest2(test2 = EDProducer("Foo", - a = int32(1), - b = PSet(c = int32(2))), - test1 = EDProducer("Bar", - aa = int32(11), - bb = PSet(cc = int32(12)))) - proc.p = Path(proc.sp) - pkl = pickle.dumps(proc) - unpkl = pickle.loads(pkl) - p = TestMakePSet() - unpkl.fillProcessDesc(p) - self.assertEqual((False, "sp@test2"), p.values["sp"][1].values["@chosen_case"]) - self.assertEqual(["anothertest3", "cpu", "test1", "test2"], p.values["@available_accelerators"][1]) - unpkl = pickle.loads(pkl) - unpkl.ProcessAcceleratorTest.setEnabled(["test1"]) - p = TestMakePSet() - unpkl.fillProcessDesc(p) - self.assertEqual((False, "sp@test1"), p.values["sp"][1].values["@chosen_case"]) - self.assertEqual(["cpu", "test1"], p.values["@available_accelerators"][1]) - def testProcessSpecialOverrideReleaseVersion(self): proc = Process("TEST") p = TestMakePSet() diff --git a/FWCore/ParameterSet/python/Modules.py b/FWCore/ParameterSet/python/Modules.py index 3ad02cdccdf0f..9d9fc75b47889 100644 --- a/FWCore/ParameterSet/python/Modules.py +++ b/FWCore/ParameterSet/python/Modules.py @@ -449,19 +449,6 @@ def _errorstr(self): from .Types import * from .SequenceTypes import * - class SwitchProducerTest(SwitchProducer): - def __init__(self, **kargs): - super(SwitchProducerTest,self).__init__( - dict( - test1 = lambda accelerators: ("test1" in accelerators, -10), - test2 = lambda accelerators: ("test2" in accelerators, -9), - test3 = lambda accelerators: ("test3" in accelerators, -8) - ), **kargs) - class SwitchProducerPickleable(SwitchProducer): - def __init__(self, **kargs): - super(SwitchProducerPickleable,self).__init__( - dict(cpu = SwitchProducer.getCpu()), **kargs) - class TestModules(unittest.TestCase): def testEDAnalyzer(self): empty = EDAnalyzer("Empty") @@ -532,9 +519,6 @@ def testIsTaskComponent(self): m = EDProducer("x") self.assertTrue(m._isTaskComponent()) self.assertTrue(m.isLeaf()) - m = SwitchProducerTest(test1=EDProducer("x")) - self.assertTrue(m._isTaskComponent()) - self.assertTrue(m.isLeaf()) m = EDFilter("x") self.assertTrue(m._isTaskComponent()) self.assertTrue(m.isLeaf()) @@ -564,181 +548,4 @@ def testIsTaskComponent(self): self.assertTrue(m._isTaskComponent()) self.assertFalse(m.isLeaf()) - def testSwitchProducer(self): - # Constructor - sp = SwitchProducerTest(test1 = EDProducer("Foo"), test2 = EDProducer("Bar")) - self.assertEqual(sp.test1.type_(), "Foo") - self.assertEqual(sp.test2.type_(), "Bar") - self.assertRaises(ValueError, lambda: SwitchProducerTest(nonexistent = EDProducer("Foo"))) - self.assertRaises(TypeError, lambda: SwitchProducerTest(test1 = EDAnalyzer("Foo"))) - self.assertRaises(TypeError, lambda: SwitchProducerTest(test1 = EDFilter("Foo"))) - self.assertRaises(TypeError, lambda: SwitchProducerTest(test1 = Source("Foo"))) - self.assertRaises(TypeError, lambda: SwitchProducerTest(test1 = OutputModule("Foo"))) - self.assertRaises(TypeError, lambda: SwitchProducerTest(test1 = Looper("Foo"))) - self.assertRaises(TypeError, lambda: SwitchProducerTest(test1 = Service("Foo"))) - self.assertRaises(TypeError, lambda: SwitchProducerTest(test1 = ESSource("Foo"))) - self.assertRaises(TypeError, lambda: SwitchProducerTest(test1 = ESProducer("Foo"))) - self.assertRaises(TypeError, lambda: SwitchProducerTest(test1 = ESPrefer("Foo"))) - self.assertRaises(TypeError, lambda: SwitchProducerTest(test1 = SwitchProducerTest(test1 = EDProducer("Foo")))) - - # Label - sp.setLabel("sp") - self.assertEqual(sp.label_(), "sp") - self.assertEqual(sp.test1.label_(), "sp@test1") - self.assertEqual(sp.test2.label_(), "sp@test2") - sp.test3 = EDProducer("Xyzzy") - self.assertEqual(sp.test3.label_(), "sp@test3") - sp.test1 = EDProducer("Fred") - self.assertEqual(sp.test1.label_(), "sp@test1") - del sp.test1 - sp.test1 = EDProducer("Wilma") - self.assertEqual(sp.test1.label_(), "sp@test1") - sp.setLabel(None) - sp.setLabel("other") - self.assertEqual(sp.label_(), "other") - self.assertEqual(sp.test1.label_(), "other@test1") - self.assertEqual(sp.test2.label_(), "other@test2") - - # Case decision - accelerators = ["test1", "test2", "test3"] - sp = SwitchProducerTest(test1 = EDProducer("Foo"), test2 = EDProducer("Bar")) - self.assertEqual(sp._getProducer(["test1", "test2", "test3"]).type_(), "Bar") - self.assertEqual(sp._getProducer(["test2", "test3"]).type_(), "Bar") - self.assertEqual(sp._getProducer(["test1", "test3"]).type_(), "Foo") - sp = SwitchProducerTest(test1 = EDProducer("Bar")) - self.assertEqual(sp._getProducer(["test1", "test2", "test3"]).type_(), "Bar") - self.assertRaises(RuntimeError, sp._getProducer, ["test2", "test3"]) - - # Mofications - from .Types import int32, string, PSet - sp = SwitchProducerTest(test1 = EDProducer("Foo", - a = int32(1), - b = PSet(c = int32(2))), - test2 = EDProducer("Bar", - aa = int32(11), - bb = PSet(cc = int32(12)))) - # Simple clone - cl = sp.clone() - self.assertEqual(cl.test1.type_(), "Foo") - self.assertEqual(cl.test1.a.value(), 1) - self.assertEqual(cl.test1.b.c.value(), 2) - self.assertEqual(cl.test2.type_(), "Bar") - self.assertEqual(cl.test2.aa.value(), 11) - self.assertEqual(cl.test2.bb.cc.value(), 12) - self.assertEqual(sp._getProducer(accelerators).type_(), "Bar") - # Modify clone - cl.test1.a = 3 - self.assertEqual(cl.test1.a.value(), 3) - cl.test1 = EDProducer("Fred") - self.assertEqual(cl.test1.type_(), "Fred") - def _assignEDAnalyzer(): - cl.test1 = EDAnalyzer("Foo") - self.assertRaises(TypeError, _assignEDAnalyzer) - def _assignSwitchProducer(): - cl.test1 = SwitchProducerTest(test1 = SwitchProducerTest(test1 = EDProducer("Foo"))) - self.assertRaises(TypeError, _assignSwitchProducer) - # Modify values with a dict - cl = sp.clone(test1 = dict(a = 4, b = dict(c = None)), - test2 = dict(aa = 15, bb = dict(cc = 45, dd = string("foo")))) - self.assertEqual(cl.test1.a.value(), 4) - self.assertEqual(cl.test1.b.hasParameter("c"), False) - self.assertEqual(cl.test2.aa.value(), 15) - self.assertEqual(cl.test2.bb.cc.value(), 45) - self.assertEqual(cl.test2.bb.dd.value(), "foo") - # Replace/add/remove EDProducers - cl = sp.clone(test1 = EDProducer("Fred", x = int32(42)), - test3 = EDProducer("Wilma", y = int32(24)), - test2 = None) - self.assertEqual(cl.test1.type_(), "Fred") - self.assertEqual(cl.test1.x.value(), 42) - self.assertEqual(cl.test3.type_(), "Wilma") - self.assertEqual(cl.test3.y.value(), 24) - self.assertEqual(hasattr(cl, "test2"), False) - self.assertRaises(TypeError, lambda: sp.clone(test1 = EDAnalyzer("Foo"))) - self.assertRaises(TypeError, lambda: sp.clone(test1 = SwitchProducerTest(test1 = SwitchProducerTest(test1 = EDProducer("Foo"))))) - - # Dump - sp = SwitchProducerTest(test2 = EDProducer("Foo", - a = int32(1), - b = PSet(c = int32(2))), - test1 = EDProducer("Bar", - aa = int32(11), - bb = PSet(cc = int32(12)))) - self.assertEqual(sp.dumpPython(), -"""SwitchProducerTest( - test1 = cms.EDProducer("Bar", - aa = cms.int32(11), - bb = cms.PSet( - cc = cms.int32(12) - ) - ), - test2 = cms.EDProducer("Foo", - a = cms.int32(1), - b = cms.PSet( - c = cms.int32(2) - ) - ) -) -""") - # Pickle - import pickle - sp = SwitchProducerPickleable(cpu = EDProducer("Foo")) - pkl = pickle.dumps(sp) - unpkl = pickle.loads(pkl) - self.assertEqual(unpkl.cpu.type_(), "Foo") - - def testSwithProducerWithAlias(self): - # Constructor - sp = SwitchProducerTest(test1 = EDProducer("Foo"), test2 = EDAlias()) - self.assertEqual(sp.test1.type_(), "Foo") - self.assertTrue(isinstance(sp.test2, EDAlias)) - - # Modifications - from .Types import int32, string, PSet, VPSet - sp = SwitchProducerTest(test1 = EDProducer("Foo"), - test2 = EDAlias(foo = VPSet(PSet(type = string("Foo2"))))) - - # Simple clone - cl = sp.clone() - self.assertTrue(hasattr(cl.test2, "foo")) - # Modify clone - cl.test2.foo[0].type = "Foo3" - self.assertEqual(cl.test2.foo[0].type, "Foo3") - # Modify values with a dict - cl = sp.clone(test2 = dict(foo = {0: dict(type = "Foo4")})) - self.assertEqual(cl.test2.foo[0].type, "Foo4") - # Replace or add EDAlias - cl = sp.clone(test1 = EDAlias(foo = VPSet(PSet(type = string("Foo5")))), - test3 = EDAlias(foo = VPSet(PSet(type = string("Foo6"))))) - self.assertEqual(cl.test1.foo[0].type, "Foo5") - self.assertEqual(cl.test3.foo[0].type, "Foo6") - # Modify clone - cl.test1 = EDProducer("Xyzzy") - self.assertEqual(cl.test1.type_(), "Xyzzy") - cl.test1 = EDAlias(foo = VPSet(PSet(type = string("Foo7")))) - self.assertEqual(cl.test1.foo[0].type, "Foo7") - - - # Dump - from .Types import int32, string, PSet, VPSet - sp = SwitchProducerTest(test1 = EDProducer("Foo"), - test2 = EDAlias(foo = VPSet(PSet(type = string("Foo2"))))) - - self.assertEqual(sp.dumpPython(), -"""SwitchProducerTest( - test1 = cms.EDProducer("Foo"), - test2 = cms.EDAlias( - foo = cms.VPSet(cms.PSet( - type = cms.string('Foo2') - )) - ) -) -""") - - # Pickle - import pickle - sp = SwitchProducerPickleable(cpu = EDAlias(foo = VPSet(PSet(type = string("Foo2"))))) - pkl = pickle.dumps(sp) - unpkl = pickle.loads(pkl) - self.assertEqual(sp.cpu.foo[0].type, "Foo2") unittest.main() From d593bf29290ee44786addff8726919f60f3aea01 Mon Sep 17 00:00:00 2001 From: Matti Kortelainen Date: Mon, 11 Aug 2025 22:58:46 +0200 Subject: [PATCH 2/5] Remove ConditionalTask tests --- FWCore/Framework/test/BuildFile.xml | 10 - .../test/test_conditionaltasks_cfg.py | 80 ---- .../test/test_conditionaltasks_nonconsumed.sh | 16 - .../test_conditionaltasks_nonconsumed_cfg.py | 101 ----- .../conditionaltasks_nonconsumed.log | 8 - FWCore/ParameterSet/python/Config.py | 384 +----------------- FWCore/ParameterSet/python/SequenceTypes.py | 225 ---------- 7 files changed, 13 insertions(+), 811 deletions(-) delete mode 100644 FWCore/Framework/test/test_conditionaltasks_cfg.py delete mode 100755 FWCore/Framework/test/test_conditionaltasks_nonconsumed.sh delete mode 100644 FWCore/Framework/test/test_conditionaltasks_nonconsumed_cfg.py delete mode 100644 FWCore/Framework/test/unit_test_outputs/conditionaltasks_nonconsumed.log diff --git a/FWCore/Framework/test/BuildFile.xml b/FWCore/Framework/test/BuildFile.xml index a8632195155d2..8087e5fe8eefd 100644 --- a/FWCore/Framework/test/BuildFile.xml +++ b/FWCore/Framework/test/BuildFile.xml @@ -362,20 +362,10 @@ - - - - - - - - - - diff --git a/FWCore/Framework/test/test_conditionaltasks_cfg.py b/FWCore/Framework/test/test_conditionaltasks_cfg.py deleted file mode 100644 index 92ab420aa2329..0000000000000 --- a/FWCore/Framework/test/test_conditionaltasks_cfg.py +++ /dev/null @@ -1,80 +0,0 @@ -import FWCore.ParameterSet.Config as cms - -import argparse -import sys - -parser = argparse.ArgumentParser(prog=sys.argv[0], description='Test ConditionalTasks.') - -parser.add_argument("--filterSucceeds", help="Have filter succeed", action="store_true") -parser.add_argument("--reverseDependencies", help="Switch the order of dependencies", action="store_true") -parser.add_argument("--testAlias", help="Get data from an alias", action="store_true") -parser.add_argument("--testView", help="Get data via a view", action="store_true") -parser.add_argument("--aliasWithStar", help="when using testAlias use '*' as type", action="store_true") - -args = parser.parse_args() - -process = cms.Process("Test") - -process.source = cms.Source("EmptySource") - -process.maxEvents.input = 1 - -process.a = cms.EDProducer("IntProducer", ivalue = cms.int32(1)) -process.b = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag(cms.InputTag("a"))) - -process.f1 = cms.EDFilter("IntProductFilter", label = cms.InputTag("b")) - -process.c = cms.EDProducer("IntProducer", ivalue = cms.int32(2)) -process.d = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag(cms.InputTag("c"))) -process.e = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag(cms.InputTag("d"))) - -process.prodOnPath = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag(cms.InputTag("d"), cms.InputTag("e"))) - -if args.filterSucceeds: - threshold = 1 -else: - threshold = 3 - -process.f2 = cms.EDFilter("IntProductFilter", label = cms.InputTag("e"), threshold = cms.int32(threshold)) - -if args.reverseDependencies: - process.d.labels[0]=cms.InputTag("e") - process.e.labels[0]=cms.InputTag("c") - process.f2.label = cms.InputTag("d") - -if args.testView: - process.f3 = cms.EDAnalyzer("SimpleViewAnalyzer", - label = cms.untracked.InputTag("f"), - sizeMustMatch = cms.untracked.uint32(10), - checkSize = cms.untracked.bool(False) - ) - process.f = cms.EDProducer("OVSimpleProducer", size = cms.int32(10)) - producttype = "edmtestSimplesOwned" -else: - process.f= cms.EDProducer("IntProducer", ivalue = cms.int32(3)) - process.f3 = cms.EDFilter("IntProductFilter", label = cms.InputTag("f")) - producttype = "edmtestIntProduct" - -if args.testAlias: - if args.aliasWithStar: - producttype = "*" - - process.f3.label = "aliasToF" - process.aliasToF = cms.EDAlias( - f = cms.VPSet( - cms.PSet( - type = cms.string(producttype), - ) - ) - ) - - -process.p = cms.Path(process.f1+process.prodOnPath+process.f2+process.f3, cms.ConditionalTask(process.a, process.b, process.c, process.d, process.e, process.f)) - -process.tst = cms.EDAnalyzer("IntTestAnalyzer", moduleLabel = cms.untracked.InputTag("f"), valueMustMatch = cms.untracked.int32(3), - valueMustBeMissing = cms.untracked.bool(not args.filterSucceeds)) - -process.endp = cms.EndPath(process.tst) - -#process.add_(cms.Service("Tracer")) -#process.options.wantSummary=True diff --git a/FWCore/Framework/test/test_conditionaltasks_nonconsumed.sh b/FWCore/Framework/test/test_conditionaltasks_nonconsumed.sh deleted file mode 100755 index 269343bb04521..0000000000000 --- a/FWCore/Framework/test/test_conditionaltasks_nonconsumed.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -function die { echo Failure $1: status $2 ; exit $2 ; } - -CONFIG=${LOCALTOP}/src/FWCore/Framework/test/test_conditionaltasks_nonconsumed_cfg.py -OUTPUT=conditionaltasks_nonconsumed.log -REFERENCE=${LOCALTOP}/src/FWCore/Framework/test/unit_test_outputs/$OUTPUT - -function run { - cmsRun $CONFIG $@ - tail -n +2 conditionaltasks_nonconsumed.log | diff - $REFERENCE || die "cmsRun $CONFIG $@ provides unexpected log" -} - -run -run --filterSucceeds -run --testView diff --git a/FWCore/Framework/test/test_conditionaltasks_nonconsumed_cfg.py b/FWCore/Framework/test/test_conditionaltasks_nonconsumed_cfg.py deleted file mode 100644 index 9e80ae9754836..0000000000000 --- a/FWCore/Framework/test/test_conditionaltasks_nonconsumed_cfg.py +++ /dev/null @@ -1,101 +0,0 @@ -import FWCore.ParameterSet.Config as cms - -import argparse -import sys - -parser = argparse.ArgumentParser(prog=sys.argv[0], description='Test ConditionalTasks.') - -parser.add_argument("--filterSucceeds", help="Have filter succeed", action="store_true") -parser.add_argument("--testView", help="Get data via a view", action="store_true") - -args = parser.parse_args() - -process = cms.Process("Test") - -process.source = cms.Source("EmptySource") - -# ensure the printout is done only once -process.maxEvents.input = 4 -process.options.numberOfThreads = 4 - -process.MessageLogger.files.conditionaltasks_nonconsumed = dict() -process.MessageLogger.files.conditionaltasks_nonconsumed.default = dict(limit=0) -process.MessageLogger.files.conditionaltasks_nonconsumed.NonConsumedConditionalModules = dict(limit=100) - -process.a = cms.EDProducer("IntProducer", ivalue = cms.int32(1)) -process.b = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag(cms.InputTag("a"))) - -process.f1 = cms.EDFilter("IntProductFilter", label = cms.InputTag("b")) - -process.c = cms.EDProducer("IntProducer", ivalue = cms.int32(2)) -process.d = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag(cms.InputTag("c"))) -process.e = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag(cms.InputTag("d"))) - -process.nonconsumed = process.a.clone() -process.nonconsumed2 = process.b.clone( - labels = ["nonconsumed"] -) -process.nonconsumedConditionalTask = cms.ConditionalTask( - process.nonconsumed, - process.nonconsumed2, -) - -process.consumedInOnePath = process.a.clone() -process.nonconsumedConditionalTask2 = cms.ConditionalTask( - process.nonconsumed, - process.consumedInOnePath -) - -process.explicitlyInDifferentPath = process.a.clone() -process.consumedInUnrelatedPath = process.a.clone() -process.nonconsumedConditionalTask3 = cms.ConditionalTask( - process.nonconsumed, - process.explicitlyInDifferentPath, - process.consumedInUnrelatedPath -) -process.nonconsumedTask3 = cms.Task( - process.consumedInUnrelatedPath -) - -process.prodOnPath = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag(cms.InputTag("d"), cms.InputTag("e"))) -process.prodOnPath2 = process.prodOnPath.clone( - labels = ["consumedInOnePath"] -) -process.prodOnPath3 = process.prodOnPath.clone( - labels = ["consumedInUnrelatedPath"] -) - -if args.filterSucceeds: - threshold = 1 -else: - threshold = 3 - -process.f2 = cms.EDFilter("IntProductFilter", label = cms.InputTag("e"), threshold = cms.int32(threshold)) - -if args.testView: - process.f3 = cms.EDAnalyzer("SimpleViewAnalyzer", - label = cms.untracked.InputTag("f"), - sizeMustMatch = cms.untracked.uint32(10), - checkSize = cms.untracked.bool(False) - ) - process.f = cms.EDProducer("OVSimpleProducer", size = cms.int32(10)) - producttype = "edmtestSimplesOwned" -else: - process.f= cms.EDProducer("IntProducer", ivalue = cms.int32(3)) - process.f3 = cms.EDFilter("IntProductFilter", label = cms.InputTag("f")) - producttype = "edmtestIntProduct" - -process.p = cms.Path(process.f1+process.prodOnPath+process.f2+process.f3, cms.ConditionalTask(process.a, process.b, process.c, process.d, process.e, process.f, process.nonconsumedConditionalTask, process.nonconsumedConditionalTask2)) - -process.p2 = cms.Path(process.prodOnPath2, process.nonconsumedConditionalTask2, process.nonconsumedConditionalTask3) - -process.p3 = cms.Path(process.explicitlyInDifferentPath) - -process.p4 = cms.Path(process.prodOnPath3, process.nonconsumedTask3) - -process.tst = cms.EDAnalyzer("IntTestAnalyzer", moduleLabel = cms.untracked.InputTag("f"), valueMustMatch = cms.untracked.int32(3), - valueMustBeMissing = cms.untracked.bool(not args.filterSucceeds)) - -process.nonconsumedConsumer = cms.EDProducer("AddIntsProducer", labels = cms.VInputTag(cms.InputTag("nonconsumed"))) - -process.endp = cms.EndPath(process.tst+process.nonconsumedConsumer) diff --git a/FWCore/Framework/test/unit_test_outputs/conditionaltasks_nonconsumed.log b/FWCore/Framework/test/unit_test_outputs/conditionaltasks_nonconsumed.log deleted file mode 100644 index 3eb77a4af4453..0000000000000 --- a/FWCore/Framework/test/unit_test_outputs/conditionaltasks_nonconsumed.log +++ /dev/null @@ -1,8 +0,0 @@ -The following modules were part of some ConditionalTask, but were not -consumed by any other module in any of the Paths the ConditionalTask -was associated with. Perhaps they should be either removed from the -job, or moved to a Task to make it explicit they are unscheduled. - consumedInUnrelatedPath - nonconsumed - nonconsumed2 -%MSG diff --git a/FWCore/ParameterSet/python/Config.py b/FWCore/ParameterSet/python/Config.py index 92ab4bc55994b..e8c7352d70d6c 100644 --- a/FWCore/ParameterSet/python/Config.py +++ b/FWCore/ParameterSet/python/Config.py @@ -2252,14 +2252,6 @@ def __init__(self,*arg,**args): self.assertRaises(ValueError, p.extend, FromArg(a = EDAlias())) self.assertRaises(ValueError, p.__setattr__, "a", EDAlias()) - p = Process('test') - p.a = EDProducer("MyProducer") - p.t = ConditionalTask(p.a) - p.p = Path(p.t) - self.assertRaises(ValueError, p.extend, FromArg(a = EDProducer("YourProducer"))) - self.assertRaises(ValueError, p.extend, FromArg(a = EDAlias())) - self.assertRaises(ValueError, p.__setattr__, "a", EDAlias()) - p = Process('test') p.a = EDProducer("MyProducer") p.s = Sequence(p.a) @@ -2499,41 +2491,6 @@ def testProcessDumpPython(self): process.p = cms.Path(process.a) process.p2 = cms.Path(process.r, process.task1, process.task2) process.schedule = cms.Schedule(*[ process.p2, process.p ], tasks=[process.task3, process.task4, process.task5])""") - # include some conditional tasks - p = Process("test") - p.a = EDAnalyzer("MyAnalyzer") - p.b = EDProducer("bProducer") - p.c = EDProducer("cProducer") - p.d = EDProducer("dProducer") - p.e = EDProducer("eProducer") - p.f = EDProducer("fProducer") - p.g = EDProducer("gProducer") - p.task5 = Task() - p.task3 = Task() - p.task2 = ConditionalTask(p.c, p.task3) - p.task1 = ConditionalTask(p.task5) - p.p = Path(p.a) - s = Sequence(p.a) - p.r = Sequence(s) - p.p2 = Path(p.r, p.task1, p.task2) - p.schedule = Schedule(p.p2,p.p,tasks=[p.task5]) - d=p.dumpPython() - self.assertEqual(_lineDiff(d,Process("test").dumpPython()), -"""process.b = cms.EDProducer("bProducer") -process.c = cms.EDProducer("cProducer") -process.d = cms.EDProducer("dProducer") -process.e = cms.EDProducer("eProducer") -process.f = cms.EDProducer("fProducer") -process.g = cms.EDProducer("gProducer") -process.a = cms.EDAnalyzer("MyAnalyzer") -process.task5 = cms.Task() -process.task3 = cms.Task() -process.task2 = cms.ConditionalTask(process.c, process.task3) -process.task1 = cms.ConditionalTask(process.task5) -process.r = cms.Sequence((process.a)) -process.p = cms.Path(process.a) -process.p2 = cms.Path(process.r, process.task1, process.task2) -process.schedule = cms.Schedule(*[ process.p2, process.p ], tasks=[process.task5])""") # only tasks p = Process("test") p.d = EDProducer("dProducer") @@ -2602,13 +2559,12 @@ def testGlobalReplace(self): t4 = Task(p.d) t5 = Task(p.d) t6 = Task(p.d) - p.ct1 = ConditionalTask(p.d) s = Sequence(p.a*p.b) - p.s4 = Sequence(p.a*p.b, p.ct1) + p.s4 = Sequence(p.a*p.b) s.associate(t2) p.s4.associate(t2) p.p = Path(p.c+s+p.a) - p.p2 = Path(p.c+p.s4+p.a, p.ct1) + p.p2 = Path(p.c+p.s4+p.a) p.e3 = EndPath(p.c+s+p.a) new = EDAnalyzer("NewAnalyzer") new2 = EDProducer("NewProducer") @@ -2625,14 +2581,14 @@ def testGlobalReplace(self): visitor_p2 = NodeVisitor() p.p2.visit(visitor_p2) self.assertTrue(visitor_p2.modules == set([new,new2,p.b,p.c])) - self.assertEqual(p.p2.dumpPython()[:-1], "cms.Path(process.c+process.s4+process.a, process.ct1)") + self.assertEqual(p.p2.dumpPython()[:-1], "cms.Path(process.c+process.s4+process.a)") visitor3 = NodeVisitor() p.e3.visit(visitor3) self.assertTrue(visitor3.modules == set([new,new2,p.b,p.c])) visitor4 = NodeVisitor() p.s4.visit(visitor4) self.assertTrue(visitor4.modules == set([new,new2,p.b])) - self.assertEqual(p.s4.dumpPython()[:-1],"cms.Sequence(process.a+process.b, cms.Task(process.d), process.ct1)") + self.assertEqual(p.s4.dumpPython()[:-1],"cms.Sequence(process.a+process.b, cms.Task(process.d))") visitor5 = NodeVisitor() p.t1.visit(visitor5) self.assertTrue(visitor5.modules == set([new2])) @@ -2640,13 +2596,6 @@ def testGlobalReplace(self): listOfTasks = list(p.schedule._tasks) listOfTasks[0].visit(visitor6) self.assertTrue(visitor6.modules == set([new2])) - visitor7 = NodeVisitor() - p.ct1.visit(visitor7) - self.assertTrue(visitor7.modules == set([new2])) - visitor8 = NodeVisitor() - listOfConditionalTasks = list(p.conditionaltasks.values()) - listOfConditionalTasks[0].visit(visitor8) - self.assertTrue(visitor8.modules == set([new2])) p.d2 = EDProducer("YourProducer") @@ -2894,194 +2843,6 @@ def testTask(self): process.path200.replace(process.g,process.e) self.assertEqual(process.path200.dumpPython(), "cms.EndPath(process.c, cms.Task(process.e))\n") - def testConditionalTask(self): - - # create some objects to use in tests - edanalyzer = EDAnalyzer("a") - edproducer = EDProducer("b") - edproducer2 = EDProducer("b2") - edproducer3 = EDProducer("b3") - edproducer4 = EDProducer("b4") - edproducer8 = EDProducer("b8") - edproducer9 = EDProducer("b9") - edfilter = EDFilter("c") - service = Service("d") - service3 = Service("d", v = untracked.uint32(3)) - essource = ESSource("e") - esproducer = ESProducer("f") - testTask2 = Task() - testCTask2 = ConditionalTask() - - # test adding things to Tasks - testTask1 = ConditionalTask(edproducer, edfilter) - self.assertRaises(RuntimeError, testTask1.add, edanalyzer) - testTask1.add(essource, service) - testTask1.add(essource, esproducer) - testTask1.add(testTask2) - testTask1.add(testCTask2) - coll = testTask1._collection - self.assertTrue(edproducer in coll) - self.assertTrue(edfilter in coll) - self.assertTrue(service in coll) - self.assertTrue(essource in coll) - self.assertTrue(esproducer in coll) - self.assertTrue(testTask2 in coll) - self.assertTrue(testCTask2 in coll) - self.assertTrue(len(coll) == 7) - self.assertTrue(len(testTask2._collection) == 0) - - taskContents = [] - for i in testTask1: - taskContents.append(i) - self.assertEqual(taskContents, [edproducer, edfilter, essource, service, esproducer, testTask2, testCTask2]) - - # test attaching Task to Process - process = Process("test") - - process.mproducer = edproducer - process.mproducer2 = edproducer2 - process.mfilter = edfilter - process.messource = essource - process.mesproducer = esproducer - process.d = service - - testTask3 = ConditionalTask(edproducer, edproducer2) - testTask1.add(testTask3) - process.myTask1 = testTask1 - - # test the validation that occurs when attaching a ConditionalTask to a Process - # first a case that passes, then one the fails on an EDProducer - # then one that fails on a service - l = set() - visitor = NodeNameVisitor(l) - testTask1.visit(visitor) - self.assertEqual(l, set(['mesproducer', 'mproducer', 'mproducer2', 'mfilter', 'd', 'messource'])) - l2 = testTask1.moduleNames() - self.assertEqual(l2, set(['mesproducer', 'mproducer', 'mproducer2', 'mfilter', 'd', 'messource'])) - - testTask4 = ConditionalTask(edproducer3) - l.clear() - self.assertRaises(RuntimeError, testTask4.visit, visitor) - try: - process.myTask4 = testTask4 - self.assertTrue(False) - except RuntimeError: - pass - - testTask5 = ConditionalTask(service3) - l.clear() - self.assertRaises(RuntimeError, testTask5.visit, visitor) - try: - process.myTask5 = testTask5 - self.assertTrue(False) - except RuntimeError: - pass - - process.d = service3 - process.myTask5 = testTask5 - - # test placement into the Process and the tasks property - expectedDict = { 'myTask1' : testTask1, 'myTask5' : testTask5 } - expectedFixedDict = DictTypes.FixedKeysDict(expectedDict); - self.assertEqual(process.conditionaltasks, expectedFixedDict) - self.assertEqual(process.conditionaltasks['myTask1'], testTask1) - self.assertEqual(process.myTask1, testTask1) - - # test replacing an EDProducer in a ConditionalTask when calling __settattr__ - # for the EDProducer on the Process. - process.mproducer2 = edproducer4 - process.d = service - l = list() - visitor1 = ModuleNodeVisitor(l) - testTask1.visit(visitor1) - l.sort(key=lambda mod: mod.__str__()) - expectedList = sorted([edproducer,essource,esproducer,service,edfilter,edproducer,edproducer4],key=lambda mod: mod.__str__()) - self.assertEqual(expectedList, l) - process.myTask6 = ConditionalTask() - process.myTask7 = ConditionalTask() - process.mproducer8 = edproducer8 - process.myTask8 = ConditionalTask(process.mproducer8) - process.myTask6.add(process.myTask7) - process.myTask7.add(process.myTask8) - process.myTask1.add(process.myTask6) - process.myTask8.add(process.myTask5) - self.assertEqual(process.myTask8.dumpPython(), "cms.ConditionalTask(process.mproducer8, process.myTask5)\n") - - testDict = process._itemsInDependencyOrder(process.conditionaltasks) - expectedLabels = ["myTask5", "myTask8", "myTask7", "myTask6", "myTask1"] - expectedTasks = [process.myTask5, process.myTask8, process.myTask7, process.myTask6, process.myTask1] - index = 0 - for testLabel, testTask in testDict.items(): - self.assertEqual(testLabel, expectedLabels[index]) - self.assertEqual(testTask, expectedTasks[index]) - index += 1 - - pythonDump = testTask1.dumpPython(PrintOptions()) - - - expectedPythonDump = 'cms.ConditionalTask(process.d, process.mesproducer, process.messource, process.mfilter, process.mproducer, process.mproducer2, process.myTask6)\n' - self.assertEqual(pythonDump, expectedPythonDump) - - process.myTask5 = ConditionalTask() - self.assertEqual(process.myTask8.dumpPython(), "cms.ConditionalTask(process.mproducer8, process.myTask5)\n") - process.myTask100 = ConditionalTask() - process.mproducer9 = edproducer9 - sequence1 = Sequence(process.mproducer8, process.myTask1, process.myTask5, testTask2, testTask3) - sequence2 = Sequence(process.mproducer8 + process.mproducer9) - process.sequence3 = Sequence((process.mproducer8 + process.mfilter)) - sequence4 = Sequence() - process.path1 = Path(process.mproducer+process.mproducer8+sequence1+sequence2+process.sequence3+sequence4) - process.path1.associate(process.myTask1, process.myTask5, testTask2, testTask3) - process.path11 = Path(process.mproducer+process.mproducer8+sequence1+sequence2+process.sequence3+ sequence4,process.myTask1, process.myTask5, testTask2, testTask3, process.myTask100) - process.path2 = Path(process.mproducer) - process.path3 = Path(process.mproducer9+process.mproducer8,testTask2) - - self.assertEqual(process.path1.dumpPython(PrintOptions()), 'cms.Path(process.mproducer+process.mproducer8+cms.Sequence(process.mproducer8, cms.ConditionalTask(process.None, process.mproducer), cms.Task(), process.myTask1, process.myTask5)+(process.mproducer8+process.mproducer9)+process.sequence3, cms.ConditionalTask(process.None, process.mproducer), cms.Task(), process.myTask1, process.myTask5)\n') - - self.assertEqual(process.path11.dumpPython(PrintOptions()), 'cms.Path(process.mproducer+process.mproducer8+cms.Sequence(process.mproducer8, cms.ConditionalTask(process.None, process.mproducer), cms.Task(), process.myTask1, process.myTask5)+(process.mproducer8+process.mproducer9)+process.sequence3, cms.ConditionalTask(process.None, process.mproducer), cms.Task(), process.myTask1, process.myTask100, process.myTask5)\n') - - # test NodeNameVisitor and moduleNames - l = set() - nameVisitor = NodeNameVisitor(l) - process.path1.visit(nameVisitor) - self.assertTrue(l == set(['mproducer', 'd', 'mesproducer', None, 'mproducer9', 'mproducer8', 'messource', 'mproducer2', 'mfilter'])) - self.assertTrue(process.path1.moduleNames() == set(['mproducer', 'd', 'mesproducer', None, 'mproducer9', 'mproducer8', 'messource', 'mproducer2', 'mfilter'])) - - # test copy - process.mproducer10 = EDProducer("b10") - process.path21 = process.path11.copy() - process.path21.replace(process.mproducer, process.mproducer10) - - self.assertEqual(process.path11.dumpPython(PrintOptions()), 'cms.Path(process.mproducer+process.mproducer8+cms.Sequence(process.mproducer8, cms.ConditionalTask(process.None, process.mproducer), cms.Task(), process.myTask1, process.myTask5)+(process.mproducer8+process.mproducer9)+process.sequence3, cms.ConditionalTask(process.None, process.mproducer), cms.Task(), process.myTask1, process.myTask100, process.myTask5)\n') - - # Some peculiarities of the way things work show up here. dumpPython sorts tasks and - # removes duplication at the level of strings. The Task and Sequence objects themselves - # remove duplicate tasks in their contents if the instances are the same (exact same python - # object id which is not the same as the string representation being the same). - # Also note that the mutating visitor replaces sequences and tasks that have - # modified contents with their modified contents, it does not modify the sequence - # or task itself. - self.assertEqual(process.path21.dumpPython(PrintOptions()), 'cms.Path(process.mproducer10+process.mproducer8+process.mproducer8+(process.mproducer8+process.mproducer9)+process.sequence3, cms.ConditionalTask(process.None, process.mproducer10), cms.ConditionalTask(process.d, process.mesproducer, process.messource, process.mfilter, process.mproducer10, process.mproducer2, process.mproducer8, process.myTask5), cms.Task(), process.myTask100, process.myTask5)\n') - - process.path22 = process.path21.copyAndExclude([process.d, process.mesproducer, process.mfilter]) - self.assertEqual(process.path22.dumpPython(PrintOptions()), 'cms.Path(process.mproducer10+process.mproducer8+process.mproducer8+(process.mproducer8+process.mproducer9)+process.mproducer8, cms.ConditionalTask(process.None, process.mproducer10), cms.ConditionalTask(process.messource, process.mproducer10, process.mproducer2, process.mproducer8, process.myTask5), cms.Task(), process.myTask100, process.myTask5)\n') - - process.path23 = process.path22.copyAndExclude([process.messource, process.mproducer10]) - self.assertEqual(process.path23.dumpPython(PrintOptions()), 'cms.Path(process.mproducer8+process.mproducer8+(process.mproducer8+process.mproducer9)+process.mproducer8, cms.ConditionalTask(process.None), cms.ConditionalTask(process.mproducer2, process.mproducer8, process.myTask5), cms.Task(), process.myTask100, process.myTask5)\n') - - process = Process("Test") - - process.b = EDProducer("b") - process.b2 = EDProducer("b2") - process.b3 = EDProducer("b3") - process.p = Path(process.b, ConditionalTask(process.b3, process.b2)) - p = TestMakePSet() - process.fillProcessDesc(p) - self.assertEqual(p.values["@all_modules"], (True, ['b', 'b2', 'b3'])) - self.assertEqual(p.values["@paths"], (True, ['p'])) - self.assertEqual(p.values["p"], (True, ['b','#','b2','b3','@'])) - - def testPath(self): p = Process("test") p.a = EDAnalyzer("MyAnalyzer") @@ -3122,17 +2883,6 @@ def testPath(self): t = Path(p.a, p.t1, Task(), p.t1) self.assertEqual(t.dumpPython(PrintOptions()), 'cms.Path(process.a, cms.Task(), process.t1)\n') - t = Path(ConditionalTask()) - self.assertEqual(t.dumpPython(PrintOptions()), 'cms.Path(cms.ConditionalTask())\n') - - t = Path(p.a, ConditionalTask()) - self.assertEqual(t.dumpPython(PrintOptions()), 'cms.Path(process.a, cms.ConditionalTask())\n') - - p.prod = EDProducer("prodName") - p.t1 = ConditionalTask(p.prod) - t = Path(p.a, p.t1, Task(), p.t1) - self.assertEqual(t.dumpPython(PrintOptions()), 'cms.Path(process.a, cms.Task(), process.t1)\n') - def testCloneSequence(self): p = Process("test") a = EDAnalyzer("MyAnalyzer") @@ -3168,8 +2918,7 @@ def testContains(self): seq1 = Sequence(e) task1 = Task(g) - ctask1 = ConditionalTask(h) - path = Path(a * c * seq1, task1, ctask1) + path = Path(a * c * seq1, task1) self.assertTrue(path.contains(a)) self.assertFalse(path.contains(b)) @@ -3178,7 +2927,7 @@ def testContains(self): self.assertTrue(path.contains(e)) self.assertFalse(path.contains(f)) self.assertTrue(path.contains(g)) - self.assertTrue(path.contains(h)) + self.assertFalse(path.contains(h)) endpath = EndPath(h * i) self.assertFalse(endpath.contains(b)) @@ -3209,14 +2958,6 @@ def testContains(self): self.assertTrue(sch.contains(l)) self.assertTrue(sch.contains(m)) - ctask2 = ConditionalTask(l, task1) - ctask = ConditionalTask(j, k, ctask2) - self.assertFalse(ctask.contains(b)) - self.assertTrue(ctask.contains(j)) - self.assertTrue(ctask.contains(k)) - self.assertTrue(ctask.contains(l)) - self.assertTrue(ctask.contains(g)) - def testSchedule(self): p = Process("test") p.a = EDAnalyzer("MyAnalyzer") @@ -3500,10 +3241,7 @@ def testPrune(self): p.t1 = Task(p.e) p.t2 = Task(p.f) p.t3 = Task(p.g, p.t1) - p.ct1 = ConditionalTask(p.h) - p.ct2 = ConditionalTask(p.f) - p.ct3 = ConditionalTask(p.ct1) - p.path1 = Path(p.a, p.t3, p.ct3) + p.path1 = Path(p.a, p.t3) p.path2 = Path(p.b) self.assertTrue(p.schedule is None) pths = p.paths @@ -3522,7 +3260,7 @@ def testPrune(self): self.assertTrue(hasattr(p, 'e')) self.assertTrue(not hasattr(p, 'f')) self.assertTrue(hasattr(p, 'g')) - self.assertTrue(hasattr(p, 'h')) + self.assertTrue(not hasattr(p, 'h')) self.assertTrue(not hasattr(p, 's')) self.assertTrue(hasattr(p, 't1')) self.assertTrue(not hasattr(p, 't2')) @@ -3628,17 +3366,6 @@ def testPrune(self): self.assertTrue(hasattr(p, 'b')) self.assertTrue(hasattr(p, 's')) self.assertTrue(hasattr(p, 'pth')) - #test ConditionalTaskPlaceholder - p = Process("test") - p.a = EDProducer("MyProducer") - p.b = EDProducer("YourProducer") - p.s = ConditionalTask(ConditionalTaskPlaceholder("a"),p.b) - p.pth = Path(p.s) - p.prune() - self.assertTrue(hasattr(p, 'a')) - self.assertTrue(hasattr(p, 'b')) - self.assertTrue(hasattr(p, 's')) - self.assertTrue(hasattr(p, 'pth')) #test unresolved SequencePlaceholder p = Process("test") p.b = EDProducer("YourAnalyzer") @@ -3717,65 +3444,6 @@ def testTaskPlaceholder(self): process.path1 = cms.Path(process.b, process.t2, process.t3) process.endpath1 = cms.EndPath(process.b, process.t5) process.schedule = cms.Schedule(*[ process.path1, process.endpath1 ], tasks=[process.t7, process.t8])""") - def testConditionalTaskPlaceholder(self): - p = Process("test") - p.a = EDProducer("ma") - p.b = EDAnalyzer("mb") - p.t1 = ConditionalTask(ConditionalTaskPlaceholder("c")) - p.t2 = ConditionalTask(p.a, ConditionalTaskPlaceholder("d"), p.t1) - p.t3 = ConditionalTask(ConditionalTaskPlaceholder("e")) - p.path1 = Path(p.b, p.t2, p.t3) - p.t5 = ConditionalTask(p.a, ConditionalTaskPlaceholder("g"), ConditionalTaskPlaceholder("t4")) - p.t4 = ConditionalTask(ConditionalTaskPlaceholder("f")) - p.path2 = Path(p.b, p.t5) - p.schedule = Schedule(p.path1, p.path2) - p.c = EDProducer("mc") - p.d = EDProducer("md") - p.e = EDProducer("me") - p.f = EDProducer("mf") - p.g = EDProducer("mg") - p.h = EDProducer("mh") - p.i = EDProducer("mi") - p.j = EDProducer("mj") - self.assertEqual(_lineDiff(p.dumpPython(),Process('test').dumpPython()), -"""process.a = cms.EDProducer("ma") -process.c = cms.EDProducer("mc") -process.d = cms.EDProducer("md") -process.e = cms.EDProducer("me") -process.f = cms.EDProducer("mf") -process.g = cms.EDProducer("mg") -process.h = cms.EDProducer("mh") -process.i = cms.EDProducer("mi") -process.j = cms.EDProducer("mj") -process.b = cms.EDAnalyzer("mb") -process.t1 = cms.ConditionalTask(cms.ConditionalTaskPlaceholder("c")) -process.t2 = cms.ConditionalTask(cms.ConditionalTaskPlaceholder("d"), process.a, process.t1) -process.t3 = cms.ConditionalTask(cms.ConditionalTaskPlaceholder("e")) -process.t5 = cms.ConditionalTask(cms.ConditionalTaskPlaceholder("g"), cms.ConditionalTaskPlaceholder("t4"), process.a) -process.t4 = cms.ConditionalTask(cms.ConditionalTaskPlaceholder("f")) -process.path1 = cms.Path(process.b, process.t2, process.t3) -process.path2 = cms.Path(process.b, process.t5) -process.schedule = cms.Schedule(*[ process.path1, process.path2 ])""") - p.resolve() - self.assertEqual(_lineDiff(p.dumpPython(),Process('test').dumpPython()), -"""process.a = cms.EDProducer("ma") -process.c = cms.EDProducer("mc") -process.d = cms.EDProducer("md") -process.e = cms.EDProducer("me") -process.f = cms.EDProducer("mf") -process.g = cms.EDProducer("mg") -process.h = cms.EDProducer("mh") -process.i = cms.EDProducer("mi") -process.j = cms.EDProducer("mj") -process.b = cms.EDAnalyzer("mb") -process.t1 = cms.ConditionalTask(process.c) -process.t2 = cms.ConditionalTask(process.a, process.d, process.t1) -process.t3 = cms.ConditionalTask(process.e) -process.t4 = cms.ConditionalTask(process.f) -process.t5 = cms.ConditionalTask(process.a, process.g, process.t4) -process.path1 = cms.Path(process.b, process.t2, process.t3) -process.path2 = cms.Path(process.b, process.t5) -process.schedule = cms.Schedule(*[ process.path1, process.path2 ])""") def testDelete(self): p = Process("test") @@ -3791,17 +3459,12 @@ def testDelete(self): t2 = Task(p.g, p.h) t3 = Task(p.g, p.h) p.t4 = Task(p.h) - p.ct1 = ConditionalTask(p.g, p.h) - ct2 = ConditionalTask(p.g, p.h) - ct3 = ConditionalTask(p.g, p.h) - p.ct4 = ConditionalTask(p.h) p.s = Sequence(p.d+p.e) - p.path1 = Path(p.a+p.f+p.s,t2,ct2) + p.path1 = Path(p.a+p.f+p.s,t2) p.path2 = Path(p.a) - p.path3 = Path(ct3, p.ct4) p.endpath2 = EndPath(p.b) p.endpath1 = EndPath(p.b+p.f) - p.schedule = Schedule(p.path2, p.path3, p.endpath2, tasks=[t3, p.t4]) + p.schedule = Schedule(p.path2, p.endpath2, tasks=[t3, p.t4]) self.assertTrue(hasattr(p, 'f')) self.assertTrue(hasattr(p, 'g')) del p.e @@ -3810,17 +3473,13 @@ def testDelete(self): self.assertFalse(hasattr(p, 'f')) self.assertFalse(hasattr(p, 'g')) self.assertEqual(p.t1.dumpPython(), 'cms.Task(process.h)\n') - self.assertEqual(p.ct1.dumpPython(), 'cms.ConditionalTask(process.h)\n') self.assertEqual(p.s.dumpPython(), 'cms.Sequence(process.d)\n') - self.assertEqual(p.path1.dumpPython(), 'cms.Path(process.a+process.s, cms.ConditionalTask(process.h), cms.Task(process.h))\n') + self.assertEqual(p.path1.dumpPython(), 'cms.Path(process.a+process.s, cms.Task(process.h))\n') self.assertEqual(p.endpath1.dumpPython(), 'cms.EndPath(process.b)\n') - self.assertEqual(p.path3.dumpPython(), 'cms.Path(cms.ConditionalTask(process.h), process.ct4)\n') del p.s - self.assertEqual(p.path1.dumpPython(), 'cms.Path(process.a+(process.d), cms.ConditionalTask(process.h), cms.Task(process.h))\n') - self.assertEqual(p.schedule_().dumpPython(), 'cms.Schedule(*[ process.path2, process.path3, process.endpath2 ], tasks=[cms.Task(process.h), process.t4])\n') + self.assertEqual(p.path1.dumpPython(), 'cms.Path(process.a+(process.d), cms.Task(process.h))\n') + self.assertEqual(p.schedule_().dumpPython(), 'cms.Schedule(*[ process.path2, process.endpath2 ], tasks=[cms.Task(process.h), process.t4])\n') del p.path2 - self.assertEqual(p.schedule_().dumpPython(), 'cms.Schedule(*[ process.path3, process.endpath2 ], tasks=[cms.Task(process.h), process.t4])\n') - del p.path3 self.assertEqual(p.schedule_().dumpPython(), 'cms.Schedule(*[ process.endpath2 ], tasks=[cms.Task(process.h), process.t4])\n') del p.endpath2 self.assertEqual(p.schedule_().dumpPython(), 'cms.Schedule(tasks=[cms.Task(process.h), process.t4])\n') @@ -4082,23 +3741,6 @@ def __init__(self): p.e =EDProducer("e") m1.toReplaceWith(p.td, Task(p.e)) self.assertTrue(p.td._collection == OrderedSet([p.e])) - #ConditionalTask - p.b =EDAnalyzer("BAn") - p.c =EDProducer("c") - p.d =EDProducer("d") - del p.tc - del p.td - p.tc = ConditionalTask(p.c) - p.td = ConditionalTask(p.d) - p.s = Sequence(p.a, p.tc) - m1.toReplaceWith(p.s, Sequence(p.a+p.b, p.td)) - self.assertEqual(p.a.wilma.value(),3) - self.assertEqual(p.a.type_(),"YourAnalyzer") - self.assertEqual(hasattr(p,"fred"),False) - self.assertTrue(p.s.dumpPython() == "cms.Sequence(process.a+process.b, process.td)\n") - p.e =EDProducer("e") - m1.toReplaceWith(p.td, ConditionalTask(p.e)) - self.assertTrue(p.td._collection == OrderedSet([p.e])) #check toReplaceWith doesn't activate not chosen m1 = Modifier() Process._firstProcess = True diff --git a/FWCore/ParameterSet/python/SequenceTypes.py b/FWCore/ParameterSet/python/SequenceTypes.py index ce61981c1a62b..1bf8c5d330704 100644 --- a/FWCore/ParameterSet/python/SequenceTypes.py +++ b/FWCore/ParameterSet/python/SequenceTypes.py @@ -1897,10 +1897,6 @@ def testBoolean(self): p6.visit(namesVisitor) self.assertEqual(l,['!&','a','b','@']) - def testTaskConstructor(self): - a = DummyModule("a") - self.assertRaises(RuntimeError, lambda : Task(ConditionalTask(a)) ) - def testDumpPython(self): a = DummyModule("a") b = DummyModule('b') @@ -1949,19 +1945,6 @@ def testDumpPython(self): s = Sequence(e, t4) p12 = Path(a+b+s+c,t1) self.assertEqual(p12.dumpPython(),"cms.Path(process.a+process.b+cms.Sequence(process.e, cms.Task(process.d, process.f))+process.c, cms.Task(process.a))\n") - ct1 = ConditionalTask(a) - ct2 = ConditionalTask(c, b) - ct3 = ConditionalTask() - p13 = Path((a+b)*c, ct1) - self.assertEqual(p13.dumpPython(),"cms.Path(process.a+process.b+process.c, cms.ConditionalTask(process.a))\n") - p14 = Path((a+b)*c, ct2, ct1) - self.assertEqual(p14.dumpPython(),"cms.Path(process.a+process.b+process.c, cms.ConditionalTask(process.a), cms.ConditionalTask(process.b, process.c))\n") - p15 = Path(ct1, ct2, ct3) - self.assertEqual(p15.dumpPython(),"cms.Path(cms.ConditionalTask(), cms.ConditionalTask(process.a), cms.ConditionalTask(process.b, process.c))\n") - ct4 = ConditionalTask(d, Task(f)) - s = Sequence(e, ct4) - p16 = Path(a+b+s+c,ct1) - self.assertEqual(p16.dumpPython(),"cms.Path(process.a+process.b+cms.Sequence(process.e, cms.ConditionalTask(process.d, process.f))+process.c, cms.ConditionalTask(process.a))\n") n = 260 mods = [] @@ -1973,8 +1956,6 @@ def testDumpPython(self): labels.sort() task = Task(*mods) self.assertEqual(task.dumpPython(), "cms.Task(*[" + ", ".join(labels) + "])\n") - conditionalTask = ConditionalTask(*mods) - self.assertEqual(conditionalTask.dumpPython(), "cms.ConditionalTask(*[" + ", ".join(labels) + "])\n") l = list() namesVisitor = DecoratedNodeNameVisitor(l) @@ -2002,9 +1983,6 @@ def testDumpPython(self): p12.visit(namesVisitor) self.assertEqual(l, ['a', 'b', 'e', 'c']) l[:] = [] - p16.visit(namesVisitor) - self.assertEqual(l, ['a', 'b', 'e', 'c']) - l[:] = [] moduleVisitor = ModuleNodeVisitor(l) p8.visit(moduleVisitor) names = [m.label_() for m in l] @@ -2013,8 +1991,6 @@ def testDumpPython(self): self.assertEqual(tph.dumpPython(), 'cms.TaskPlaceholder("process.a")\n') sph = SequencePlaceholder('a') self.assertEqual(sph.dumpPython(), 'cms.SequencePlaceholder("process.a")\n') - ctph = ConditionalTaskPlaceholder('a') - self.assertEqual(ctph.dumpPython(), 'cms.ConditionalTaskPlaceholder("process.a")\n') def testDumpConfig(self): a = DummyModule("a") @@ -2077,18 +2053,6 @@ def leave(self,visitee): e=DummyModule("e") f=DummyModule("f") g=DummyModule("g") - ct1 = ConditionalTask(d) - ct2 = ConditionalTask(e, ct1) - ct3 = ConditionalTask(f, g, ct2) - s=Sequence(plusAB, ct3, ct2) - multSC = s*c - p=Path(multSC, ct1, ct2) - l = [] - v = ModuleNodeVisitor(l) - p.visit(v) - expected = [a,b,f,g,e,d,e,d,c,d,e,d] - self.assertEqual(expected,l) - t1 = Task(d) t2 = Task(e, t1) @@ -2285,63 +2249,6 @@ def testReplace(self): t2.replace(m2,t3) self.assertTrue(t2.dumpPython() == "cms.Task(process.m1, process.m3, process.m5)\n") - #ConditionalTask - ct6 = ConditionalTask(m6) - ct7 = ConditionalTask(m7) - ct89 = ConditionalTask(m8, m9) - - cs1 = Sequence(m1+m2, ct6) - cs2 = Sequence(m3+m4, ct7) - cs3 = Sequence(cs1+cs2, ct89) - cs3.replace(m3,m5) - l[:] = [] - cs3.visit(namesVisitor) - self.assertEqual(l,['m1','m2','m5','m4']) - - cs3.replace(m8,m1) - self.assertEqual(cs3.dumpPython(), "cms.Sequence(cms.Sequence(process.m1+process.m2, cms.ConditionalTask(process.m6))+process.m5+process.m4, cms.ConditionalTask(process.m1, process.m9), cms.ConditionalTask(process.m7))\n") - - cs3.replace(m1,m7) - self.assertEqual(cs3.dumpPython(), "cms.Sequence(process.m7+process.m2+process.m5+process.m4, cms.ConditionalTask(process.m6), cms.ConditionalTask(process.m7), cms.ConditionalTask(process.m7, process.m9))\n") - result = cs3.replace(ct7, ct89) - self.assertEqual(cs3.dumpPython(), "cms.Sequence(process.m7+process.m2+process.m5+process.m4, cms.ConditionalTask(process.m6), cms.ConditionalTask(process.m7, process.m9), cms.ConditionalTask(process.m8, process.m9))\n") - self.assertTrue(result) - result = cs3.replace(ct7, ct89) - self.assertFalse(result) - - ct1 = ConditionalTask() - ct1.replace(m1,m2) - self.assertEqual(ct1.dumpPython(), "cms.ConditionalTask()\n") - - ct1 = ConditionalTask(m1) - ct1.replace(m1,m2) - self.assertEqual(ct1.dumpPython(), "cms.ConditionalTask(process.m2)\n") - - ct1 = ConditionalTask(m1,m2, m2) - ct1.replace(m2,m3) - self.assertEqual(ct1.dumpPython(), "cms.ConditionalTask(process.m1, process.m3)\n") - - ct1 = ConditionalTask(m1,m2) - ct2 = ConditionalTask(m1,m3,ct1) - ct2.replace(m1,m4) - self.assertEqual(ct2.dumpPython(), "cms.ConditionalTask(process.m2, process.m3, process.m4)\n") - - ct1 = ConditionalTask(m2) - ct2 = ConditionalTask(m1,m3,ct1) - ct2.replace(m1,m4) - self.assertEqual(ct2.dumpPython(), "cms.ConditionalTask(process.m2, process.m3, process.m4)\n") - - ct1 = ConditionalTask(m2) - ct2 = ConditionalTask(m1,m3,ct1) - ct2.replace(ct1,m4) - self.assertEqual(ct2.dumpPython(), "cms.ConditionalTask(process.m1, process.m3, process.m4)\n") - - ct1 = ConditionalTask(m2) - ct2 = ConditionalTask(m1,m3,ct1) - ct3 = ConditionalTask(m5) - ct2.replace(m2,ct3) - self.assertEqual(ct2.dumpPython(), "cms.ConditionalTask(process.m1, process.m3, process.m5)\n") - def testReplaceIfHeldDirectly(self): m1 = DummyModule("m1") m2 = DummyModule("m2") @@ -2382,23 +2289,6 @@ def testReplaceIfHeldDirectly(self): s1._replaceIfHeldDirectly(t6,t7) self.assertEqual(s1.dumpPython()[:-1],"cms.Sequence(cms.Task(process.m7))") - #ConditionalTask - ct6 = ConditionalTask(m6) - ct7 = ConditionalTask(m7) - ct89 = ConditionalTask(m8, m9) - - s1 = Sequence(m1+m2, ct6) - s2 = Sequence(m3+m4, ct7) - s3 = Sequence(s1+s2, ct89) - s3._replaceIfHeldDirectly(m3,m5) - self.assertEqual(s3.dumpPython()[:-1], "cms.Sequence(cms.Sequence(process.m1+process.m2, cms.ConditionalTask(process.m6))+cms.Sequence(process.m3+process.m4, cms.ConditionalTask(process.m7)), cms.ConditionalTask(process.m8, process.m9))") - s2._replaceIfHeldDirectly(m3,m5) - self.assertEqual(s2.dumpPython()[:-1],"cms.Sequence(process.m5+process.m4, cms.ConditionalTask(process.m7))") - self.assertEqual(s3.dumpPython()[:-1], "cms.Sequence(cms.Sequence(process.m1+process.m2, cms.ConditionalTask(process.m6))+cms.Sequence(process.m5+process.m4, cms.ConditionalTask(process.m7)), cms.ConditionalTask(process.m8, process.m9))") - - s1 = Sequence(ct6) - s1._replaceIfHeldDirectly(ct6,ct7) - self.assertEqual(s1.dumpPython()[:-1],"cms.Sequence(cms.ConditionalTask(process.m7))") def testIndex(self): m1 = DummyModule("a") m2 = DummyModule("b") @@ -2483,43 +2373,6 @@ def testExpandAndClone(self): t4 = Task() t5 = t4.expandAndClone() self.assertTrue(t5.dumpPython() == "cms.Task()\n") - #ConditionalTask - s1 = Sequence(m1*~m2*m1*m2*ignore(m2)) - s2 = Sequence(m1*m2) - s3 = Sequence(~m1*s2) - p = Path(s1+s3, ConditionalTask(m6)) - p2 = p.expandAndClone() - l[:] = [] - p2.visit(namesVisitor) - self.assertEqual(l, ['m1', '!m2', 'm1', 'm2', '-m2', '!m1', 'm1', 'm2']) - self.assertEqual(p2.dumpPython(), "cms.Path(process.m1+~process.m2+process.m1+process.m2+cms.ignore(process.m2)+~process.m1+process.m1+process.m2, cms.ConditionalTask(process.m6))\n") - - s2 = Sequence(m1*m2, ConditionalTask(m9)) - s3 = Sequence(~m1*s2) - ct8 = ConditionalTask(m8) - ct8.setLabel("ct8") - p = Path(s1+s3, ConditionalTask(m6, ConditionalTask(m7, ct8))) - p2 = p.expandAndClone() - l[:] = [] - p2.visit(namesVisitor) - self.assertEqual(l, ['m1', '!m2', 'm1', 'm2', '-m2', '!m1', 'm1', 'm2']) - self.assertEqual(p2.dumpPython(), "cms.Path(process.m1+~process.m2+process.m1+process.m2+cms.ignore(process.m2)+~process.m1+process.m1+process.m2, cms.ConditionalTask(process.m6, process.m7, process.m8, process.m9))\n") - - t1 = ConditionalTask(m1,m2,m3) - s1 = Sequence(t1) - s2 = s1.expandAndClone() - l[:] = [] - s2.visit(namesVisitor) - self.assertEqual(l, []) - self.assertEqual(s2.dumpPython(), "cms.Sequence(cms.ConditionalTask(process.m1, process.m2, process.m3))\n") - - t1 = ConditionalTask(m1,m2) - t2 = ConditionalTask(m1,m3,t1) - t3 = t2.expandAndClone() - self.assertEqual(t3.dumpPython(), "cms.ConditionalTask(process.m1, process.m2, process.m3)\n") - t4 = ConditionalTask() - t5 = t4.expandAndClone() - self.assertTrue(t5.dumpPython() == "cms.ConditionalTask()\n") def testAdd(self): m1 = DummyModule("m1") @@ -2625,26 +2478,6 @@ def testRemove(self): self.assertTrue(t3.dumpPython() == "cms.Task(process.m2)\n") t3.remove(m2) self.assertTrue(t3.dumpPython() == "cms.Task()\n") - #ConditionalTask - s1 = Sequence(m1+m2, ConditionalTask(m3), ConditionalTask(m4)) - s1.remove(m4) - self.assertEqual(s1.dumpPython(), "cms.Sequence(process.m1+process.m2, cms.ConditionalTask(process.m3))\n") - s1 = Sequence(m1+m2+Sequence(ConditionalTask(m3,m4), ConditionalTask(m3), ConditionalTask(m4))) - s1.remove(m4) - self.assertEqual(s1.dumpPython(), "cms.Sequence(process.m1+process.m2, cms.ConditionalTask(process.m3), cms.ConditionalTask(process.m4))\n") - t1 = ConditionalTask(m1) - t1.setLabel("t1") - t2 = ConditionalTask(m2,t1) - t2.setLabel("t2") - t3 = ConditionalTask(t1,t2,m1) - t3.remove(m1) - self.assertEqual(t3.dumpPython(), "cms.ConditionalTask(process.m1, process.t2)\n") - t3.remove(m1) - self.assertEqual(t3.dumpPython(), "cms.ConditionalTask(process.m1, process.m2)\n") - t3.remove(m1) - self.assertEqual(t3.dumpPython(), "cms.ConditionalTask(process.m2)\n") - t3.remove(m2) - self.assertEqual(t3.dumpPython(), "cms.ConditionalTask()\n") def testCopyAndExclude(self): a = DummyModule("a") @@ -2782,39 +2615,6 @@ def testCopyAndExclude(self): self.assertTrue(t3.dumpPython() == "cms.Task(process.f, process.g, process.t11)\n") t4 = t2.copyAndExclude([e,f,g,h,a]) self.assertTrue(t4.dumpPython() == "cms.Task()\n") - #ConditionalTask - t1 = ConditionalTask(h) - s = Sequence(a+b+c+~d, ConditionalTask(e,f,ConditionalTask(g,t1))) - self.assertEqual(s.copyAndExclude([a,h]).dumpPython(),"cms.Sequence(process.b+process.c+~process.d, cms.ConditionalTask(process.e, process.f, process.g))\n") - self.assertEqual(s.copyAndExclude([a,h]).dumpPython(),"cms.Sequence(process.b+process.c+~process.d, cms.ConditionalTask(process.e, process.f, process.g))\n") - self.assertEqual(s.copyAndExclude([a,e,h]).dumpPython(),"cms.Sequence(process.b+process.c+~process.d, cms.ConditionalTask(process.f, process.g))\n") - self.assertEqual(s.copyAndExclude([a,e,f,g,h]).dumpPython(),"cms.Sequence(process.b+process.c+~process.d)\n") - self.assertEqual(s.copyAndExclude([a,b,c,d]).dumpPython(),"cms.Sequence(cms.ConditionalTask(process.e, process.f, process.g, process.h))\n") - self.assertEqual(s.copyAndExclude([t1]).dumpPython(),"cms.Sequence(process.a+process.b+process.c+~process.d, cms.ConditionalTask(process.e, process.f, process.g))\n") - taskList = [] - taskVisitor = ConditionalTaskVisitor(taskList) - s.visit(taskVisitor) - self.assertEqual(len(taskList),3) - s2 = s.copyAndExclude([g,h]) - taskList[:] = [] - s2.visit(taskVisitor) - self.assertEqual(len(taskList),1) - t2 = ConditionalTask(t1) - taskList[:] = [] - t2.visit(taskVisitor) - self.assertEqual(taskList[0],t1) - s3 = Sequence(s) - self.assertEqual(s3.copyAndExclude([a,h]).dumpPython(),"cms.Sequence(process.b+process.c+~process.d, cms.ConditionalTask(process.e, process.f, process.g))\n") - s4 = Sequence(s) - self.assertEqual(s4.copyAndExclude([a,b,c,d,e,f,g,h]).dumpPython(),"cms.Sequence()\n") - t1 = ConditionalTask(e,f) - t11 = ConditionalTask(a) - t11.setLabel("t11") - t2 = ConditionalTask(g,t1,h,t11) - t3 = t2.copyAndExclude([e,h]) - self.assertEqual(t3.dumpPython(), "cms.ConditionalTask(process.f, process.g, process.t11)\n") - t4 = t2.copyAndExclude([e,f,g,h,a]) - self.assertEqual(t4.dumpPython(), "cms.ConditionalTask()\n") def testSequenceTypeChecks(self): m1 = DummyModule("m1") @@ -2850,15 +2650,6 @@ def testCopy(self): self.assertTrue(id(t1Contents[0]) == id(t2Contents[0])) self.assertTrue(id(t1Contents[1]) == id(t2Contents[1])) self.assertTrue(id(t1._collection) != id(t2._collection)) - #ConditionalTask - t1 = ConditionalTask(a, b) - t2 = t1.copy() - self.assertTrue(t1.dumpPython() == t2.dumpPython()) - t1Contents = list(t1._collection) - t2Contents = list(t2._collection) - self.assertTrue(id(t1Contents[0]) == id(t2Contents[0])) - self.assertTrue(id(t1Contents[1]) == id(t2Contents[1])) - self.assertTrue(id(t1._collection) != id(t2._collection)) def testCopyAndAdd(self): a = DummyModule("a") @@ -2882,22 +2673,6 @@ def testCopyAndAdd(self): self.assertEqual(t5.dumpPython(), "cms.Task(process.a, process.c, process.d, process.e)\n") t6 = t4.copyAndAdd(Task(b)) self.assertEqual(t6.dumpPython(), "cms.Task(process.a, process.b, process.c, process.d)\n") - #ConditionalTask - t1 = ConditionalTask(a, b, c) - self.assertEqual(t1.dumpPython(), "cms.ConditionalTask(process.a, process.b, process.c)\n") - t2 = t1.copyAndAdd(d, e) - self.assertEqual(t1.dumpPython(), "cms.ConditionalTask(process.a, process.b, process.c)\n") - self.assertEqual(t2.dumpPython(), "cms.ConditionalTask(process.a, process.b, process.c, process.d, process.e)\n") - t3 = t2.copyAndExclude([b]) - self.assertEqual(t1.dumpPython(), "cms.ConditionalTask(process.a, process.b, process.c)\n") - self.assertEqual(t2.dumpPython(), "cms.ConditionalTask(process.a, process.b, process.c, process.d, process.e)\n") - self.assertEqual(t3.dumpPython(), "cms.ConditionalTask(process.a, process.c, process.d, process.e)\n") - t4 = t1.copyAndExclude([b]).copyAndAdd(d) - self.assertEqual(t4.dumpPython(), "cms.ConditionalTask(process.a, process.c, process.d)\n") - t5 = t2.copyAndExclude([b]).copyAndAdd(d) - self.assertEqual(t5.dumpPython(), "cms.ConditionalTask(process.a, process.c, process.d, process.e)\n") - t6 = t4.copyAndAdd(Task(b)) - self.assertEqual(t6.dumpPython(), "cms.ConditionalTask(process.a, process.b, process.c, process.d)\n") def testInsertInto(self): from FWCore.ParameterSet.Types import vstring From c2c7612bc0399753c592093c35f8cbfb6c69de01 Mon Sep 17 00:00:00 2001 From: Matti Kortelainen Date: Tue, 12 Aug 2025 23:28:58 +0200 Subject: [PATCH 3/5] Remove SwitchProducer --- DataFormats/Common/interface/ProductData.h | 2 +- .../Provenance/interface/BranchDescription.h | 16 -- .../Provenance/src/BranchDescription.cc | 22 -- FWCore/Framework/interface/TypeMatch.h | 2 +- FWCore/Framework/src/ModuleMaker.cc | 5 - FWCore/Framework/src/Principal.cc | 4 +- FWCore/Framework/src/ProductRegistryHelper.cc | 8 - FWCore/Framework/src/ProductResolvers.cc | 165 ------------- FWCore/Framework/src/ProductResolvers.h | 100 +------- .../Framework/src/ProductResolversFactory.cc | 44 ---- FWCore/Framework/src/ProductSelector.cc | 23 +- FWCore/Framework/src/Schedule.cc | 170 ------------- FWCore/Framework/src/ScheduleBuilder.cc | 28 +-- FWCore/Framework/src/processEDAliases.cc | 14 +- FWCore/Modules/src/SwitchProducer.cc | 60 ----- FWCore/ParameterSet/python/Config.py | 30 --- FWCore/ParameterSet/python/MassReplace.py | 76 +----- FWCore/ParameterSet/python/Modules.py | 233 ------------------ .../src/GlobalRecHitsAnalyzer.cc | 2 +- 19 files changed, 27 insertions(+), 977 deletions(-) delete mode 100644 FWCore/Modules/src/SwitchProducer.cc diff --git a/DataFormats/Common/interface/ProductData.h b/DataFormats/Common/interface/ProductData.h index 0518b0f648acb..d858743c59966 100644 --- a/DataFormats/Common/interface/ProductData.h +++ b/DataFormats/Common/interface/ProductData.h @@ -45,7 +45,7 @@ namespace edm { //Not const thread-safe update void unsafe_setWrapper(std::unique_ptr iValue) const; - void unsafe_setWrapper(std::shared_ptr iValue) const; // for SwitchProducer + void unsafe_setWrapper(std::shared_ptr iValue) const; // for RepeatingCachedRootSource void resetProductDescription(std::shared_ptr bd); diff --git a/DataFormats/Provenance/interface/BranchDescription.h b/DataFormats/Provenance/interface/BranchDescription.h index fe0b27d4151f7..b351371466151 100644 --- a/DataFormats/Provenance/interface/BranchDescription.h +++ b/DataFormats/Provenance/interface/BranchDescription.h @@ -95,14 +95,6 @@ namespace edm { TypeID wrappedTypeID() const { return TypeID(transient_.wrappedType_.typeInfo()); } TypeID unwrappedTypeID() const { return TypeID(transient_.unwrappedType_.typeInfo()); } - bool isSwitchAlias() const { return not transient_.switchAliasModuleLabel_.empty(); } - std::string const& switchAliasModuleLabel() const { return transient_.switchAliasModuleLabel_; } - void setSwitchAliasModuleLabel(std::string label) { transient_.switchAliasModuleLabel_ = std::move(label); } - BranchID const& switchAliasForBranchID() const { return transient_.switchAliasForBranchID_; } - void setSwitchAliasForBranch(BranchDescription const& aliasForBranch); - - bool isAnyAlias() const { return isAlias() or isSwitchAlias(); } - bool isProvenanceSetOnRead() const noexcept { return transient_.isProvenanceSetOnRead_; } void setIsProvenanceSetOnRead(bool value = true) noexcept { transient_.isProvenanceSetOnRead_ = value; } @@ -132,14 +124,6 @@ namespace edm { // The wrapped class name, which is currently derivable from the other attributes. std::string wrappedName_; - // For SwitchProducer alias, the label of the aliased-for label; otherwise empty - std::string switchAliasModuleLabel_; - - // Need a separate (transient) BranchID for switch, because - // otherwise originalBranchID() gives wrong answer when reading - // from a file (leading to wrong ProductProvenance to be retrieved) - BranchID switchAliasForBranchID_; - // A TypeWithDict object for the wrapped object // This is set if and only if the dropped_ is false TypeWithDict wrappedType_; diff --git a/DataFormats/Provenance/src/BranchDescription.cc b/DataFormats/Provenance/src/BranchDescription.cc index 8bdb7443aface..c18a00953f26b 100644 --- a/DataFormats/Provenance/src/BranchDescription.cc +++ b/DataFormats/Provenance/src/BranchDescription.cc @@ -194,28 +194,6 @@ namespace edm { branchAliases_.insert(other.branchAliases().begin(), other.branchAliases().end()); } - void BranchDescription::setSwitchAliasForBranch(BranchDescription const& aliasForBranch) { - if (branchType_ != aliasForBranch.branchType()) { - throw Exception(errors::LogicError) << "BranchDescription::setSwitchAliasForBranch: branchType (" << branchType_ - << ") differs from aliasForBranch (" << aliasForBranch.branchType() - << ").\nPlease report this error to the FWCore developers"; - } - if (produced() != aliasForBranch.produced()) { - throw Exception(errors::LogicError) << "BranchDescription::setSwitchAliasForBranch: produced differs from " - "aliasForBranch.\nPlease report this error to the FWCore developers"; - } - if (unwrappedTypeID().typeInfo() != aliasForBranch.unwrappedType().typeInfo()) { - throw Exception(errors::LogicError) - << "BranchDescription::setSwitchAliasForBranch: unwrapped type info (" << unwrappedTypeID().name() - << ") differs from aliasForBranch (" << aliasForBranch.unwrappedType().typeInfo().name() - << ").\nPlease report this error to the FWCore developers"; - } - - branchAliases_ = aliasForBranch.branchAliases(); - transient_.switchAliasForBranchID_ = aliasForBranch.originalBranchID(); - transient_.availableOnlyAtEndTransition_ = aliasForBranch.availableOnlyAtEndTransition(); - } - void BranchDescription::write(std::ostream& os) const { os << "Branch Type = " << branchType() << std::endl; os << "Process Name = " << processName() << std::endl; diff --git a/FWCore/Framework/interface/TypeMatch.h b/FWCore/Framework/interface/TypeMatch.h index 7bdc927acf315..677bda042cd36 100644 --- a/FWCore/Framework/interface/TypeMatch.h +++ b/FWCore/Framework/interface/TypeMatch.h @@ -18,7 +18,7 @@ namespace edm { class TypeMatch { public: bool operator()(edm::ProductDescription const& productDescription) const { - return not productDescription.isAnyAlias(); + return not productDescription.isAlias(); } }; } // namespace edm diff --git a/FWCore/Framework/src/ModuleMaker.cc b/FWCore/Framework/src/ModuleMaker.cc index c52aabde21da0..b846f08234f86 100644 --- a/FWCore/Framework/src/ModuleMaker.cc +++ b/FWCore/Framework/src/ModuleMaker.cc @@ -59,11 +59,6 @@ namespace edm { MakeModuleParams const& p, signalslot::Signal& pre, signalslot::Signal& post) const { - // Add process_name for SwitchProducer - if (p.pset_->getParameter("@module_type") == "SwitchProducer") { - p.pset_->addUntrackedParameter("@process_name", p.processConfiguration_->processName()); - } - ConfigurationDescriptions descriptions(baseType(), p.pset_->getParameter("@module_type")); fillDescriptions(descriptions); try { diff --git a/FWCore/Framework/src/Principal.cc b/FWCore/Framework/src/Principal.cc index 3a893b111b3c3..ef6708ee22190 100644 --- a/FWCore/Framework/src/Principal.cc +++ b/FWCore/Framework/src/Principal.cc @@ -612,7 +612,7 @@ namespace edm { provenances.clear(); for (auto const& productResolver : *this) { if (productResolver->singleProduct() && productResolver->provenanceAvailable() && - !productResolver->productDescription().isAnyAlias()) { + !productResolver->productDescription().isAlias()) { // We do not attempt to get the event/lumi/run status from the provenance, // because the per event provenance may have been dropped. if (productResolver->provenance()->productDescription().present()) { @@ -628,7 +628,7 @@ namespace edm { void Principal::getAllStableProvenance(std::vector& provenances) const { provenances.clear(); for (auto const& productResolver : *this) { - if (productResolver->singleProduct() && !productResolver->productDescription().isAnyAlias()) { + if (productResolver->singleProduct() && !productResolver->productDescription().isAlias()) { if (productResolver->stableProvenance()->productDescription().present()) { provenances.push_back(productResolver->stableProvenance()); } diff --git a/FWCore/Framework/src/ProductRegistryHelper.cc b/FWCore/Framework/src/ProductRegistryHelper.cc index aa818a2545d1c..6f65501b0b6a1 100644 --- a/FWCore/Framework/src/ProductRegistryHelper.cc +++ b/FWCore/Framework/src/ProductRegistryHelper.cc @@ -81,14 +81,6 @@ namespace edm { p->typeID_, true, isEndTransition(p->transition_)); - if (p->aliasType_ == TypeLabelItem::AliasType::kSwitchAlias) { - if (p->branchAlias_.empty()) { - throw edm::Exception(edm::errors::LogicError) - << "Branch alias type has been set to SwitchAlias, but the alias content is empty.\n" - << "Please report this error to the FWCore developers"; - } - pdesc.setSwitchAliasModuleLabel(p->branchAlias_); - } if (p->isTransform_) { pdesc.setOnDemand(true); pdesc.setIsTransform(true); diff --git a/FWCore/Framework/src/ProductResolvers.cc b/FWCore/Framework/src/ProductResolvers.cc index 17d1a87783880..59fab7633c80e 100644 --- a/FWCore/Framework/src/ProductResolvers.cc +++ b/FWCore/Framework/src/ProductResolvers.cc @@ -679,169 +679,4 @@ namespace edm { bool AliasProductResolver::singleProduct_() const { return true; } - SwitchBaseProductResolver::SwitchBaseProductResolver(std::shared_ptr bd, - DataManagingOrAliasProductResolver& realProduct) - : realProduct_(realProduct), productData_(std::move(bd)), prefetchRequested_(false) { - // Parentage of this branch is always the same by construction, so we can compute the ID just "once" here. - Parentage p; - p.setParents(std::vector{realProduct.productDescription().originalBranchID()}); - parentageID_ = p.id(); - ParentageRegistry::instance()->insertMapped(p); - } - - void SwitchBaseProductResolver::connectTo(ProductResolverBase const& iOther, Principal const* iParentPrincipal) { - throw Exception(errors::LogicError) - << "SwitchBaseProductResolver::connectTo() not implemented and should never be called.\n" - << "Contact a Framework developer\n"; - } - - void SwitchBaseProductResolver::setupUnscheduled(UnscheduledConfigurator const& iConfigure) { - worker_ = iConfigure.findWorker(productDescription().moduleLabel()); - } - - ProductResolverBase::Resolution SwitchBaseProductResolver::resolveProductImpl(Resolution res) const { - if (res.data() == nullptr) - return res; - return Resolution(&productData_); - } - - bool SwitchBaseProductResolver::productResolved_() const { - // SwitchProducer will never put anything in the event, and - // "false" will make Event::commit_() to call putProduct() with - // null unique_ptr to signal that the produce() was - // run. - return false; - } - - void SwitchBaseProductResolver::setProductProvenanceRetriever_(ProductProvenanceRetriever const* provRetriever) { - productData_.setProvenance(provRetriever); - } - - void SwitchBaseProductResolver::setProductID_(ProductID const& pid) { - // insertIntoSet is const, so let's exploit that to fake the getting of the "input" product - productData_.setProductID(pid); - } - - void SwitchBaseProductResolver::resetProductData_(bool deleteEarly) { - productData_.resetProductData(); - realProduct_.resetProductData_(deleteEarly); - if (not deleteEarly) { - prefetchRequested_ = false; - waitingTasks_.reset(); - } - } - - void SwitchBaseProductResolver::unsafe_setWrapperAndProvenance() const { - // update provenance - productData_.provenance().store()->insertIntoSet(ProductProvenance(productDescription().branchID(), parentageID_)); - // Use the Wrapper of the pointed-to resolver, but the provenance of this resolver - productData_.unsafe_setWrapper(realProduct().getProductData().sharedConstWrapper()); - } - - SwitchProducerProductResolver::SwitchProducerProductResolver(std::shared_ptr bd, - DataManagingOrAliasProductResolver& realProduct) - : SwitchBaseProductResolver(std::move(bd), realProduct), status_(defaultStatus_) {} - - ProductResolverBase::Resolution SwitchProducerProductResolver::resolveProduct_( - Principal const& principal, SharedResourcesAcquirer* sra, ModuleCallingContext const* mcc) const { - if (status_ == ProductStatus::ResolveFailed) { - return resolveProductImpl(realProduct().resolveProduct(principal, sra, mcc)); - } - return Resolution(nullptr); - } - - void SwitchProducerProductResolver::prefetchAsync_(WaitingTaskHolder waitTask, - Principal const& principal, - ServiceToken const& token, - SharedResourcesAcquirer* sra, - ModuleCallingContext const* mcc) const noexcept { - if (productDescription().availableOnlyAtEndTransition() and mcc and not mcc->parent().isAtEndTransition()) { - return; - } - - //need to try changing prefetchRequested before adding to waitingTasks - bool expected = false; - bool doPrefetchRequested = prefetchRequested().compare_exchange_strong(expected, true); - waitingTasks().add(waitTask); - - if (doPrefetchRequested) { - //using a waiting task to do a callback guarantees that - // the waitingTasks() list will be released from waiting even - // if the module does not put this data product or the - // module has an exception while running - auto waiting = make_waiting_task([this](std::exception_ptr const* iException) { - if (nullptr != iException) { - waitingTasks().doneWaiting(*iException); - } else { - unsafe_setWrapperAndProvenance(); - waitingTasks().doneWaiting(std::exception_ptr()); - } - }); - worker()->callWhenDoneAsync(WaitingTaskHolder(*waitTask.group(), waiting)); - } - } - - void SwitchProducerProductResolver::putProduct(std::unique_ptr edp) const { - if (status_ != defaultStatus_) { - throw Exception(errors::InsertFailure) - << "Attempt to insert more than one product for a branch " << productDescription().branchName() - << "This makes no sense for SwitchProducerProductResolver.\nContact a Framework developer"; - } - // Let's use ResolveFailed to signal that produce() was called, as - // there is no real product in this resolver - status_ = ProductStatus::ResolveFailed; - bool expected = false; - if (prefetchRequested().compare_exchange_strong(expected, true)) { - unsafe_setWrapperAndProvenance(); - waitingTasks().doneWaiting(std::exception_ptr()); - } - } - - bool SwitchProducerProductResolver::productUnavailable_() const { - // if produce() was run (ResolveFailed), ask from the real resolver - if (status_ == ProductStatus::ResolveFailed) { - return realProduct().productUnavailable(); - } - return true; - } - - void SwitchProducerProductResolver::resetProductData_(bool deleteEarly) { - SwitchBaseProductResolver::resetProductData_(deleteEarly); - if (not deleteEarly) { - status_ = defaultStatus_; - } - } - - ProductResolverBase::Resolution SwitchAliasProductResolver::resolveProduct_(Principal const& principal, - SharedResourcesAcquirer* sra, - ModuleCallingContext const* mcc) const { - return resolveProductImpl(realProduct().resolveProduct(principal, sra, mcc)); - } - - void SwitchAliasProductResolver::prefetchAsync_(WaitingTaskHolder waitTask, - Principal const& principal, - ServiceToken const& token, - SharedResourcesAcquirer* sra, - ModuleCallingContext const* mcc) const noexcept { - //need to try changing prefetchRequested_ before adding to waitingTasks_ - bool expected = false; - bool doPrefetchRequested = prefetchRequested().compare_exchange_strong(expected, true); - waitingTasks().add(waitTask); - - if (doPrefetchRequested) { - //using a waiting task to do a callback guarantees that - // the waitingTasks() list will be released from waiting even - // if the module does not put this data product or the - // module has an exception while running - auto waiting = make_waiting_task([this](std::exception_ptr const* iException) { - if (nullptr != iException) { - waitingTasks().doneWaiting(*iException); - } else { - unsafe_setWrapperAndProvenance(); - waitingTasks().doneWaiting(std::exception_ptr()); - } - }); - realProduct().prefetchAsync(WaitingTaskHolder(*waitTask.group(), waiting), principal, token, sra, mcc); - } - } } // namespace edm diff --git a/FWCore/Framework/src/ProductResolvers.h b/FWCore/Framework/src/ProductResolvers.h index 8f34282cf0dc4..421ccb7cd8100 100644 --- a/FWCore/Framework/src/ProductResolvers.h +++ b/FWCore/Framework/src/ProductResolvers.h @@ -42,7 +42,7 @@ namespace edm { public: DataManagingOrAliasProductResolver() : ProductResolverBase{} {} - // Give AliasProductResolver and SwitchBaseProductResolver access by moving this method to public + // Give AliasProductResolver access by moving this method to public void resetProductData_(bool deleteEarly) override = 0; virtual ProductData const& getProductData() const = 0; }; @@ -320,104 +320,6 @@ namespace edm { DataManagingOrAliasProductResolver& realProduct_; std::shared_ptr bd_; }; - - // Switch is a mixture of DataManaging (for worker and provenance) and Alias (for product) - class SwitchBaseProductResolver : public DataManagingOrAliasProductResolver { - public: - using ProductStatus = DataManagingProductResolver::ProductStatus; - SwitchBaseProductResolver(std::shared_ptr bd, - DataManagingOrAliasProductResolver& realProduct); - - void connectTo(ProductResolverBase const& iOther, Principal const* iParentPrincipal) final; - void setupUnscheduled(UnscheduledConfigurator const& iConfigure) final; - - protected: - Resolution resolveProductImpl(Resolution) const; - WaitingTaskList& waitingTasks() const { return waitingTasks_; } - Worker* worker() const { return worker_; } - DataManagingOrAliasProductResolver const& realProduct() const { return realProduct_; } - std::atomic& prefetchRequested() const { return prefetchRequested_; } - void unsafe_setWrapperAndProvenance() const; - void resetProductData_(bool deleteEarly) override; - - private: - bool productResolved_() const final; - bool productWasDeleted_() const final { return realProduct_.productWasDeleted(); } - bool productWasFetchedAndIsValid_() const final { return realProduct_.productWasFetchedAndIsValid(); } - ProductDescription const& productDescription_() const final { - return *productData_.productDescription(); - ; - } - void resetProductDescription_(std::shared_ptr bd) final { - productData_.resetProductDescription(bd); - } - Provenance const* provenance_() const final { return &productData_.provenance(); } - std::string const& resolvedModuleLabel_() const final { return moduleLabel(); } - void setProductProvenanceRetriever_(ProductProvenanceRetriever const* provRetriever) final; - void setProductID_(ProductID const& pid) final; - ProductProvenance const* productProvenancePtr_() const final { return provenance()->productProvenance(); } - ProductData const& getProductData() const final { return productData_; } - bool singleProduct_() const final { return true; } - - // for "alias" view - DataManagingOrAliasProductResolver& realProduct_; - // for "product" view - ProductData productData_; - Worker* worker_ = nullptr; - CMS_THREAD_SAFE mutable WaitingTaskList waitingTasks_; - mutable std::atomic prefetchRequested_; - // for provenance - ParentageID parentageID_; - }; - - // For the case when SwitchProducer is on a Path - class SwitchProducerProductResolver : public SwitchBaseProductResolver, public ProductPutterBase { - public: - SwitchProducerProductResolver(std::shared_ptr bd, - DataManagingOrAliasProductResolver& realProduct); - - private: - Resolution resolveProduct_(Principal const& principal, - SharedResourcesAcquirer* sra, - ModuleCallingContext const* mcc) const final; - void prefetchAsync_(WaitingTaskHolder waitTask, - Principal const& principal, - ServiceToken const& token, - SharedResourcesAcquirer* sra, - ModuleCallingContext const* mcc) const noexcept final; - void putProduct(std::unique_ptr edp) const final; - bool unscheduledWasNotRun_() const final { return false; } - bool productUnavailable_() const final; - void resetProductData_(bool deleteEarly) final; - - constexpr static const ProductStatus defaultStatus_ = ProductStatus::NotPut; - - // for filter in a Path - // The variable is only modified or read at times where the - // framework has guaranteed synchronization between write and read - CMS_THREAD_SAFE mutable ProductStatus status_; - }; - - // For the case when SwitchProducer is not on any Path - class SwitchAliasProductResolver : public SwitchBaseProductResolver { - public: - SwitchAliasProductResolver(std::shared_ptr bd, - DataManagingOrAliasProductResolver& realProduct) - : SwitchBaseProductResolver(std::move(bd), realProduct) {} - - private: - Resolution resolveProduct_(Principal const& principal, - SharedResourcesAcquirer* sra, - ModuleCallingContext const* mcc) const final; - void prefetchAsync_(WaitingTaskHolder waitTask, - Principal const& principal, - ServiceToken const& token, - SharedResourcesAcquirer* sra, - ModuleCallingContext const* mcc) const noexcept final; - bool unscheduledWasNotRun_() const final { return realProduct().unscheduledWasNotRun(); } - bool productUnavailable_() const final { return realProduct().productUnavailable(); } - }; - } // namespace edm #endif diff --git a/FWCore/Framework/src/ProductResolversFactory.cc b/FWCore/Framework/src/ProductResolversFactory.cc index c290256a715d7..4d21c05a541db 100644 --- a/FWCore/Framework/src/ProductResolversFactory.cc +++ b/FWCore/Framework/src/ProductResolversFactory.cc @@ -40,27 +40,6 @@ namespace edm::productResolversFactory { return std::make_shared( std::move(bd), dynamic_cast(*iResolvers[index])); } - std::shared_ptr makeSwitchProducerProduct( - std::shared_ptr bd, - ProductRegistry const& iReg, - std::vector> const& iResolvers) { - ProductResolverIndex index = iReg.indexFrom(bd->switchAliasForBranchID()); - assert(index != ProductResolverIndexInvalid); - - return std::make_shared( - std::move(bd), dynamic_cast(*iResolvers[index])); - } - - std::shared_ptr makeSwitchAliasProduct( - std::shared_ptr bd, - ProductRegistry const& iReg, - std::vector> const& iResolvers) { - ProductResolverIndex index = iReg.indexFrom(bd->switchAliasForBranchID()); - assert(index != ProductResolverIndexInvalid); - - return std::make_shared( - std::move(bd), dynamic_cast(*iResolvers[index])); - } void addProductOrThrow(std::shared_ptr iResolver, std::vector>& oResolvers, @@ -121,14 +100,11 @@ namespace edm::productResolversFactory { // So, the non-alias product holders must be created first. // Therefore, on this first pass, skip current EDAliases. bool hasAliases = false; - bool hasSwitchAliases = false; for (auto const& prod : prodsList) { ProductDescription const& bd = prod.second; if (bd.branchType() == bt) { if (bd.isAlias()) { hasAliases = true; - } else if (bd.isSwitchAlias()) { - hasSwitchAliases = true; } else { addProductOrThrow(makeForPrimary(bd, iReg, *helper), productResolvers, iReg); } @@ -145,26 +121,6 @@ namespace edm::productResolversFactory { } } } - // Finally process any SwitchProducer aliases - if (hasSwitchAliases) { - for (auto const& prod : prodsList) { - ProductDescription const& bd = prod.second; - if (bd.isSwitchAlias() && bd.branchType() == bt) { - assert(bt == InEvent); - auto cbd = std::make_shared(bd); - // Need different implementation for SwitchProducers not - // in any Path (onDemand) and for those in a Path in order - // to prevent the switch-aliased-for EDProducers from - // being run when the SwitchProducer is in a Path after a - // failing EDFilter. - if (bd.onDemand()) { - addProductOrThrow(makeSwitchAliasProduct(cbd, iReg, productResolvers), productResolvers, iReg); - } else { - addProductOrThrow(makeSwitchProducerProduct(cbd, iReg, productResolvers), productResolvers, iReg); - } - } - } - } return productResolvers; } diff --git a/FWCore/Framework/src/ProductSelector.cc b/FWCore/Framework/src/ProductSelector.cc index 0e27441eaf1d2..68ff5eced5949 100644 --- a/FWCore/Framework/src/ProductSelector.cc +++ b/FWCore/Framework/src/ProductSelector.cc @@ -73,20 +73,15 @@ namespace edm { // Check if an equivalent branch has already been selected due to an EDAlias. // We only need the check for products produced in this process. if (desc.produced()) { - auto check = [&](BranchID const& branchID) { - auto iter = trueBranchIDToKeptBranchDesc.find(branchID); - if (iter != trueBranchIDToKeptBranchDesc.end()) { - throw edm::Exception(errors::Configuration, "Duplicate Output Selection") - << "Two (or more) equivalent branches have been selected for output.\n" - << "#1: " << BranchKey(desc) << "\n" - << "#2: " << BranchKey(*iter->second) << "\n" - << "Please drop at least one of them.\n"; - } - }; - // In case of SwitchProducer, we have to check the aliased-for - // BranchID for the case that the chosen case is an EDAlias - BranchID const& trueBranchID = desc.isSwitchAlias() ? desc.switchAliasForBranchID() : desc.originalBranchID(); - check(trueBranchID); + BranchID const& trueBranchID = desc.originalBranchID(); + auto iter = trueBranchIDToKeptBranchDesc.find(trueBranchID); + if (iter != trueBranchIDToKeptBranchDesc.end()) { + throw edm::Exception(errors::Configuration, "Duplicate Output Selection") + << "Two (or more) equivalent branches have been selected for output.\n" + << "#1: " << BranchKey(desc) << "\n" + << "#2: " << BranchKey(*iter->second) << "\n" + << "Please drop at least one of them.\n"; + } trueBranchIDToKeptBranchDesc.insert(std::make_pair(trueBranchID, &desc)); } } diff --git a/FWCore/Framework/src/Schedule.cc b/FWCore/Framework/src/Schedule.cc index 990667271444f..93fbcb9bcad64 100644 --- a/FWCore/Framework/src/Schedule.cc +++ b/FWCore/Framework/src/Schedule.cc @@ -69,175 +69,6 @@ namespace edm { typedef std::vector vstring; - void processSwitchProducers(ParameterSet const& proc_pset, - std::string const& processName, - SignallingProductRegistryFiller& preg) { - // Update Switch ProductDescriptions for the chosen case - struct BranchesCases { - BranchesCases(std::vector cases) : caseLabels{std::move(cases)} {} - std::vector chosenBranches; - std::vector caseLabels; - }; - std::map switchMap; - for (auto& prod : preg.productListUpdator()) { - if (prod.second.isSwitchAlias()) { - auto it = switchMap.find(prod.second.moduleLabel()); - if (it == switchMap.end()) { - auto const& switchPSet = proc_pset.getParameter(prod.second.moduleLabel()); - auto inserted = switchMap.emplace(prod.second.moduleLabel(), - switchPSet.getParameter>("@all_cases")); - assert(inserted.second); - it = inserted.first; - } - - bool found = false; - for (auto const& productIter : preg.registry().productList()) { - BranchKey const& branchKey = productIter.first; - // The alias-for product must be in the same process as - // the SwitchProducer (earlier processes - // may contain products with same type, module label, and - // instance name) - if (branchKey.processName() != processName) { - continue; - } - - ProductDescription const& desc = productIter.second; - if (desc.branchType() == prod.second.branchType() and - desc.unwrappedTypeID().typeInfo() == prod.second.unwrappedTypeID().typeInfo() and - branchKey.moduleLabel() == prod.second.switchAliasModuleLabel() and - branchKey.productInstanceName() == prod.second.productInstanceName()) { - prod.second.setSwitchAliasForBranch(desc); - if (!prod.second.transient()) { - it->second.chosenBranches.push_back(prod.first); // with moduleLabel of the Switch - } - found = true; - } - } - if (not found) { - Exception ex(errors::LogicError); - ex << "Trying to find a ProductDescription to be aliased-for by SwitchProducer with\n" - << " friendly class name = " << prod.second.friendlyClassName() << "\n" - << " module label = " << prod.second.moduleLabel() << "\n" - << " product instance name = " << prod.second.productInstanceName() << "\n" - << " process name = " << processName - << "\n\nbut did not find any. Please contact a framework developer."; - ex.addContext("Calling Schedule.cc:processSwitchProducers()"); - throw ex; - } - } - } - if (switchMap.empty()) - return; - - for (auto& elem : switchMap) { - std::sort(elem.second.chosenBranches.begin(), elem.second.chosenBranches.end()); - } - - auto addProductsToException = [&preg, &processName](auto const& caseLabels, edm::Exception& ex) { - std::map> caseBranches; - for (auto const& item : preg.registry().productList()) { - if (item.first.processName() != processName) - continue; - - if (auto found = std::find(caseLabels.begin(), caseLabels.end(), item.first.moduleLabel()); - found != caseLabels.end()) { - caseBranches[*found].push_back(item.first); - } - } - - for (auto const& caseLabel : caseLabels) { - ex << "Products for case " << caseLabel << " (friendly class name, product instance name):\n"; - auto& branches = caseBranches[caseLabel]; - std::sort(branches.begin(), branches.end()); - for (auto const& branch : branches) { - ex << " " << branch.friendlyClassName() << " " << branch.productInstanceName() << "\n"; - } - } - }; - - // Check that non-chosen cases declare exactly the same non-transient branches - // Also set the alias-for branches to transient - std::vector foundBranches; - for (auto const& switchItem : switchMap) { - auto const& switchLabel = switchItem.first; - auto const& chosenBranches = switchItem.second.chosenBranches; - auto const& caseLabels = switchItem.second.caseLabels; - foundBranches.resize(chosenBranches.size()); - for (auto const& caseLabel : caseLabels) { - std::fill(foundBranches.begin(), foundBranches.end(), false); - for (auto& nonConstItem : preg.productListUpdator()) { - auto const& item = nonConstItem; - if (item.first.moduleLabel() == caseLabel and item.first.processName() == processName) { - // Check that products which are not transient in the dictionary are consistent between - // all the cases of a SwitchProducer. - if (!item.second.transient()) { - auto range = std::equal_range(chosenBranches.begin(), - chosenBranches.end(), - BranchKey(item.first.friendlyClassName(), - switchLabel, - item.first.productInstanceName(), - item.first.processName())); - if (range.first == range.second) { - Exception ex(errors::Configuration); - ex << "SwitchProducer " << switchLabel << " has a case " << caseLabel << " with a product " - << item.first << " that is not produced by the chosen case " - << proc_pset.getParameter(switchLabel) - .getUntrackedParameter("@chosen_case") - << " and that product is not transient. " - << "If the intention is to produce only a subset of the non-transient products listed below, each " - "case with more non-transient products needs to be replaced with an EDAlias to only the " - "necessary products, and the EDProducer itself needs to be moved to a Task.\n\n"; - addProductsToException(caseLabels, ex); - throw ex; - } - assert(std::distance(range.first, range.second) == 1); - foundBranches[std::distance(chosenBranches.begin(), range.first)] = true; - } - - // Set the alias-for branch as transient so it gets fully ignored in output. - // I tried first to implicitly drop all branches with - // '@' in ProductSelector, but that gave problems on - // input (those branches would be implicitly dropped on - // input as well, leading to the SwitchProducer branches - // do be dropped as dependent ones, as the alias - // detection logic in RootFile says that the - // SwitchProducer branches are not alias branches) - nonConstItem.second.setTransient(true); - - // Check that there are no BranchAliases for any of the cases - auto const& bd = item.second; - if (not bd.branchAliases().empty()) { - auto ex = Exception(errors::UnimplementedFeature) - << "SwitchProducer does not support ROOT branch aliases. Got the following ROOT branch " - "aliases for SwitchProducer with label " - << switchLabel << " for case " << caseLabel << ":"; - for (auto const& branchAlias : bd.branchAliases()) { - ex << " " << branchAlias; - } - throw ex; - } - } - } - - for (size_t i = 0; i < chosenBranches.size(); i++) { - if (not foundBranches[i]) { - auto chosenLabel = proc_pset.getParameter(switchLabel) - .getUntrackedParameter("@chosen_case"); - Exception ex(errors::Configuration); - ex << "SwitchProducer " << switchLabel << " has a case " << caseLabel - << " that does not produce a product " << chosenBranches[i] << " that is produced by the chosen case " - << chosenLabel << " and that product is not transient. " - << "If the intention is to produce only a subset of the non-transient products listed below, each " - "case with more non-transient products needs to be replaced with an EDAlias to only the " - "necessary products, and the EDProducer itself needs to be moved to a Task.\n\n"; - addProductsToException(caseLabels, ex); - throw ex; - } - } - } - } - } - void reduceParameterSet(ParameterSet& proc_pset, vstring const& end_path_name_list, vstring& modulesInConfig, @@ -502,7 +333,6 @@ namespace edm { } } - processSwitchProducers(proc_pset, processConfiguration->processName(), preg); proc_pset.registerIt(); processConfiguration->setParameterSetID(proc_pset.id()); processConfiguration->setProcessConfigurationID(); diff --git a/FWCore/Framework/src/ScheduleBuilder.cc b/FWCore/Framework/src/ScheduleBuilder.cc index 9cbe0112ebd85..6eafb28538927 100644 --- a/FWCore/Framework/src/ScheduleBuilder.cc +++ b/FWCore/Framework/src/ScheduleBuilder.cc @@ -207,7 +207,6 @@ namespace edm { } fillAliasMap(ioProcessPSet, allConditionalMods); - processSwitchEDAliases(ioProcessPSet, ioProductRegistry, *iProcessConfiguration, allConditionalMods); //find branches created by the conditional modules for (auto const& prod : ioProductRegistry.registry().productList()) { @@ -261,31 +260,6 @@ namespace edm { } } - void processSwitchEDAliases(ParameterSet const& ioProcessPSet, - SignallingProductRegistryFiller& ioProductRegistry, - ProcessConfiguration const& iProcessConfiguration, - std::unordered_set const& iAllConditionalModules) { - auto const& all_modules = ioProcessPSet.getParameter>("@all_modules"); - std::vector switchEDAliases; - for (auto const& module : all_modules) { - auto const& mod_pset = ioProcessPSet.getParameter(module); - if (mod_pset.getParameter("@module_type") == "SwitchProducer") { - auto const& all_cases = mod_pset.getParameter>("@all_cases"); - for (auto const& case_label : all_cases) { - auto range = aliasMap_.equal_range(case_label); - if (range.first != range.second) { - switchEDAliases.push_back(case_label); - } - } - } - } - detail::processEDAliases(switchEDAliases, - iAllConditionalModules, - ioProcessPSet, - iProcessConfiguration.processName(), - ioProductRegistry); - } - std::unordered_multimap aliasMap_; std::unordered_multimap conditionalModsBranches_; }; @@ -702,4 +676,4 @@ namespace edm { //we want the unscheduled modules at the beginning of the allNeededModules list allNeededModules_.insert(allNeededModules_.begin(), unscheduledModules_.begin(), unscheduledModules_.end()); } -} // namespace edm \ No newline at end of file +} // namespace edm diff --git a/FWCore/Framework/src/processEDAliases.cc b/FWCore/Framework/src/processEDAliases.cc index 17629b26543a4..57ac48508ea7c 100644 --- a/FWCore/Framework/src/processEDAliases.cc +++ b/FWCore/Framework/src/processEDAliases.cc @@ -47,15 +47,11 @@ namespace edm { std::string const& theInstanceAlias(instanceAlias == star ? productInstanceName : instanceAlias); BranchKey aliasKey(friendlyClassName, alias, theInstanceAlias, processName); - if (auto it = preg.productList().find(aliasKey); it != preg.productList().end()) { - // We might have already inserted an alias that was a chosen case of a SwitchProducer - if (not it->second.isAlias()) { - throw Exception(errors::Configuration, "EDAlias conflicts with data\n") - << "A product of type '" << friendlyClassName << "'\n" - << "with module label '" << alias << "' and instance name '" << theInstanceAlias << "'\n" - << "already exists.\n"; - } - return; + if (preg.productList().find(aliasKey) != preg.productList().end()) { + throw Exception(errors::Configuration, "EDAlias conflicts with data\n") + << "A product of type '" << friendlyClassName << "'\n" + << "with module label '" << alias << "' and instance name '" << theInstanceAlias << "'\n" + << "already exists.\n"; } auto iter = aliasKeys.find(aliasKey); if (iter != aliasKeys.end()) { diff --git a/FWCore/Modules/src/SwitchProducer.cc b/FWCore/Modules/src/SwitchProducer.cc deleted file mode 100644 index fddd617b9a74e..0000000000000 --- a/FWCore/Modules/src/SwitchProducer.cc +++ /dev/null @@ -1,60 +0,0 @@ -#ifdef __clang__ -#pragma GCC diagnostic ignored "-Wc++20-extensions" -#endif - -#include "FWCore/Framework/interface/global/EDProducer.h" -#include "FWCore/Framework/interface/MakerMacros.h" -#include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h" - -namespace edm { - /** - * This class is the physical EDProducer part of the SwitchProducer - * infrastructure. It must be configured only with the - * SwitchProducer python construct. - * - * The purposes of this EDProducer are - * - Create the consumes() links to the chosen case to make the prefetching work correclty - * - Forward the produces() information to create proper ProductDescription objects - */ - class SwitchProducer : public global::EDProducer<> { - public: - explicit SwitchProducer(ParameterSet const& iConfig); - ~SwitchProducer() override = default; - static void fillDescriptions(ConfigurationDescriptions& descriptions); - void produce(StreamID, Event& e, EventSetup const& c) const final {} - }; - - SwitchProducer::SwitchProducer(ParameterSet const& iConfig) { - auto const& moduleLabel = iConfig.getParameter("@module_label"); - auto const& chosenLabel = iConfig.getUntrackedParameter("@chosen_case"); - auto const& processName = iConfig.getUntrackedParameter("@process_name"); - callWhenNewProductsRegistered([=, this](edm::ProductDescription const& iBranch) { - if (iBranch.moduleLabel() == chosenLabel and iBranch.processName() == processName) { - if (iBranch.branchType() != InEvent) { - throw Exception(errors::UnimplementedFeature) - << "SwitchProducer does not support non-event branches. Got " << iBranch.branchType() - << " for SwitchProducer with label " << moduleLabel << " whose chosen case is " << chosenLabel << "."; - } - - // With consumes, create the connection to the chosen case EDProducer for prefetching - this->consumes(edm::TypeToGet{iBranch.unwrappedTypeID(), PRODUCT_TYPE}, - edm::InputTag{iBranch.moduleLabel(), iBranch.productInstanceName(), iBranch.processName()}); - // With produces, create a producer-like ProductDescription - // early-enough for it to be flagged as non-OnDemand in case - // the SwithcProducer is on a Path - this->produces(iBranch.unwrappedTypeID(), iBranch.productInstanceName()).setSwitchAlias(iBranch.moduleLabel()); - } - }); - } - - void SwitchProducer::fillDescriptions(ConfigurationDescriptions& descriptions) { - ParameterSetDescription desc; - desc.add>("@all_cases"); - desc.addUntracked("@chosen_case"); - desc.addUntracked("@process_name"); - descriptions.addDefault(desc); - } -} // namespace edm - -using edm::SwitchProducer; -DEFINE_FWK_MODULE(SwitchProducer); diff --git a/FWCore/ParameterSet/python/Config.py b/FWCore/ParameterSet/python/Config.py index e8c7352d70d6c..59b35156781c9 100644 --- a/FWCore/ParameterSet/python/Config.py +++ b/FWCore/ParameterSet/python/Config.py @@ -122,7 +122,6 @@ def __init__(self,name: str, *Mods): raise RuntimeError("Error: The process name is an empty string or contains non-alphanumeric characters") self.__dict__['_Process__filters'] = {} self.__dict__['_Process__producers'] = {} - self.__dict__['_Process__switchproducers'] = {} self.__dict__['_Process__source'] = None self.__dict__['_Process__looper'] = None self.__dict__['_Process__schedule'] = None @@ -174,9 +173,6 @@ def setStrict(self, value: bool): def producerNames(self): """Returns a string containing all the EDProducer labels separated by a blank""" return ' '.join(self.producers_().keys()) - def switchProducerNames(self): - """Returns a string containing all the SwitchProducer labels separated by a blank""" - return ' '.join(self.switchProducers_().keys()) def analyzerNames(self): """Returns a string containing all the EDAnalyzer labels separated by a blank""" return ' '.join(self.analyzers_().keys()) @@ -219,10 +215,6 @@ def producers_(self): """returns a dict of the producers that have been added to the Process""" return DictTypes.FixedKeysDict(self.__producers) producers = property(producers_,doc="dictionary containing the producers for the process") - def switchProducers_(self): - """returns a dict of the SwitchProducers that have been added to the Process""" - return DictTypes.FixedKeysDict(self.__switchproducers) - switchProducers = property(switchProducers_,doc="dictionary containing the SwitchProducers for the process") def source_(self): """returns the source that has been added to the Process or None if none have been added""" return self.__source @@ -666,8 +658,6 @@ def _placeOutputModule(self,name:str,mod): self._place(name, mod, self.__outputmodules) def _placeProducer(self,name:str,mod): self._place(name, mod, self.__producers) - def _placeSwitchProducer(self,name:str,mod): - self._place(name, mod, self.__switchproducers) def _placeFilter(self,name:str,mod): self._place(name, mod, self.__filters) def _placeAnalyzer(self,name:str,mod): @@ -821,9 +811,6 @@ def dumpConfig(self, options:PrintOptions=PrintOptions()) -> str: config+=self._dumpConfigNamedList(self.producers_().items(), 'module', options) - config+=self._dumpConfigNamedList(self.switchProducers_().items(), - 'module', - options) config+=self._dumpConfigNamedList(self.filters_().items(), 'module', options) @@ -1025,7 +1012,6 @@ def dumpPython(self, options=PrintOptions()) -> str: result+=self._dumpPythonList(self.psets, options) result+=self._dumpPythonList(self.vpsets, options) result+=self._dumpPythonList(self.producers_(), options) - result+=self._dumpPythonList(self.switchProducers_(), options) result+=self._dumpPythonList(self.filters_() , options) result+=self._dumpPythonList(self.analyzers_(), options) result+=self._dumpPythonList(self.outputModules_(), options) @@ -1069,7 +1055,6 @@ def splitPython(self, options:PrintOptions = PrintOptions()) -> dict: parts.update(self._splitPythonList('psets', self.psets, options)) parts.update(self._splitPythonList('psets', self.vpsets, options)) parts.update(self._splitPythonList('modules', self.producers_(), options)) - parts.update(self._splitPythonList('modules', self.switchProducers_(), options)) parts.update(self._splitPythonList('modules', self.filters_() , options)) parts.update(self._splitPythonList('modules', self.analyzers_(), options)) parts.update(self._splitPythonList('modules', self.outputModules_(), options)) @@ -1171,17 +1156,6 @@ def _insertManyInto(self, parameterSet, label:str, itemDict, tracked:bool): # alphabetical order is easier to compare with old language l.sort() parameterSet.addVString(tracked, label, l) - def _insertSwitchProducersInto(self, parameterSet, labelModules, labelAliases, itemDict, tracked:bool): - modules = parameterSet.getVString(tracked, labelModules) - aliases = parameterSet.getVString(tracked, labelAliases) - accelerators = parameterSet.getVString(False, "@selected_accelerators") - for name,value in itemDict.items(): - value.appendToProcessDescLists_(modules, aliases, name) - value.insertInto(parameterSet, name, accelerators) - modules.sort() - aliases.sort() - parameterSet.addVString(tracked, labelModules, modules) - parameterSet.addVString(tracked, labelAliases, aliases) def _insertPaths(self, processPSet, nodeVisitor): scheduledPaths = [] triggerPaths = [] @@ -1293,7 +1267,6 @@ def prune(self,verbose=False,keepUnresolvedSequencePlaceholders:bool=False): temp = Schedule(*pths) usedModules=set(temp.moduleNames()) unneededModules = self._pruneModules(self.producers_(), usedModules) - unneededModules.update(self._pruneModules(self.switchProducers_(), usedModules)) unneededModules.update(self._pruneModules(self.filters_(), usedModules)) unneededModules.update(self._pruneModules(self.analyzers_(), usedModules)) #remove sequences and tasks that do not appear in remaining paths and endpaths @@ -1392,9 +1365,6 @@ def __extractPSet(self,pset): self._insertPaths(adaptor, nodeVisitor) all_modules_onTasksOrScheduled = { key:value for key, value in all_modules.items() if value in nodeVisitor.modules } self._insertManyInto(adaptor, "@all_modules", all_modules_onTasksOrScheduled, True) - all_switches = self.switchProducers_().copy() - all_switches_onTasksOrScheduled = {key:value for key, value in all_switches.items() if value in nodeVisitor.modules } - self._insertSwitchProducersInto(adaptor, "@all_modules", "@all_aliases", all_switches_onTasksOrScheduled, True) # Same as nodeVisitor except this one visits all the Tasks attached # to the process. processNodeVisitor = NodeVisitor() diff --git a/FWCore/ParameterSet/python/MassReplace.py b/FWCore/ParameterSet/python/MassReplace.py index 405c2f7f50508..071e0ce9298fe 100644 --- a/FWCore/ParameterSet/python/MassReplace.py +++ b/FWCore/ParameterSet/python/MassReplace.py @@ -16,8 +16,7 @@ def doIt(self,pset,base): # if I use pset.parameters_().items() I get copies of the parameter values # so I can't modify the nested pset value = getattr(pset,name) - if isinstance(value, cms.PSet) or isinstance(value, cms.EDProducer) or isinstance(value, cms.EDAlias): - # EDProducer and EDAlias to support SwitchProducer + if isinstance(value, cms.PSet): self.doIt(value,base+"."+name) elif value.isCompatibleCMSType(cms.VPSet): for (i,ps) in enumerate(value): self.doIt(ps, "%s.%s[%d]"%(base,name,i) ) @@ -112,11 +111,7 @@ def __init__(self,paramName,paramSearch,paramValue,verbose=False): self._paramSearch = paramSearch self._verbose = verbose def enter(self,visitee): - if isinstance(visitee, cms.SwitchProducer): - for modName in visitee.parameterNames_(): - self.doIt(getattr(visitee, modName), "%s.%s"%(str(visitee), modName)) - else: - self.doIt(visitee, str(visitee)) + self.doIt(visitee, str(visitee)) def doIt(self, mod, name): if (hasattr(mod,self._paramName)): if getattr(mod,self._paramName) == self._paramSearch: @@ -140,15 +135,6 @@ def massReplaceParameter(process,name="label",old="rawDataCollector",new="rawDat if __name__=="__main__": import unittest - class SwitchProducerTest(cms.SwitchProducer): - def __init__(self, **kargs): - super(SwitchProducerTest,self).__init__( - dict( - test1 = lambda: (True, -10), - test2 = lambda: (True, -9), - test3 = lambda: (True, -8), - test4 = lambda: (True, -7) - ), **kargs) class TestModuleCommand(unittest.TestCase): @@ -163,21 +149,13 @@ def testMassSearchReplaceAnyInputTag(self): vec = cms.VInputTag(cms.InputTag("a"), cms.InputTag("b"), cms.InputTag("c"), cms.InputTag("d")), uvec = cms.untracked.VInputTag(cms.untracked.InputTag("a"), cms.untracked.InputTag("b"), cms.untracked.InputTag("c"), cms.untracked.InputTag("d")), ) - p.sp = SwitchProducerTest( - test1 = cms.EDProducer("a", src = cms.InputTag("b"), - nested = cms.PSet(src = cms.InputTag("b"), src2 = cms.InputTag("c"), usrc = cms.untracked.InputTag("b")) - ), - test2 = cms.EDProducer("b", src = cms.InputTag("c"), - nested = cms.PSet(src = cms.InputTag("b"), src2 = cms.InputTag("c"), usrc = cms.untracked.InputTag("b")) - ), - ) p.op = cms.EDProducer("op", src = cms.optional.InputTag, unset = cms.optional.InputTag, vsrc = cms.optional.VInputTag, vunset = cms.optional.VInputTag) p.op2 = cms.EDProducer("op2", src = cms.optional.InputTag, unset = cms.optional.InputTag, vsrc = cms.optional.VInputTag, vunset = cms.optional.VInputTag) p.op.src="b" p.op.vsrc = ["b"] p.op2.src=cms.InputTag("b") p.op2.vsrc = cms.VInputTag("b") - p.s = cms.Sequence(p.a*p.b*p.c*p.sp*p.op*p.op2) + p.s = cms.Sequence(p.a*p.b*p.c*p.op*p.op2) massSearchReplaceAnyInputTag(p.s, cms.InputTag("b"), cms.InputTag("new")) self.assertNotEqual(cms.InputTag("new"), p.b.src) self.assertEqual(cms.InputTag("new"), p.c.src) @@ -202,14 +180,6 @@ def testMassSearchReplaceAnyInputTag(self): self.assertFalse(p.c.uvec[1].isTracked()) self.assertFalse(p.c.uvec[2].isTracked()) self.assertFalse(p.c.uvec[3].isTracked()) - self.assertEqual(cms.InputTag("new"), p.sp.test1.src) - self.assertEqual(cms.InputTag("new"), p.sp.test1.nested.src) - self.assertEqual(cms.InputTag("c"), p.sp.test1.nested.src2) - self.assertEqual(cms.untracked.InputTag("new"), p.sp.test1.nested.usrc) - self.assertEqual(cms.InputTag("c"), p.sp.test2.src) - self.assertEqual(cms.InputTag("new"), p.sp.test2.nested.src) - self.assertEqual(cms.InputTag("c"), p.sp.test2.nested.src2) - self.assertEqual(cms.untracked.InputTag("new"), p.sp.test2.nested.usrc) self.assertEqual(cms.InputTag("new"), p.op.src) self.assertEqual(cms.InputTag("new"), p.op.vsrc[0]) self.assertEqual(cms.InputTag("new"), p.op2.src) @@ -235,15 +205,7 @@ def testMassReplaceInputTag(self): p.g = cms.EDProducer("ab", src=cms.InputTag("a")) p.h = cms.EDProducer("ab", src=cms.InputTag("a")) p.i = cms.EDProducer("ab", src=cms.InputTag("a")) - p.sp = SwitchProducerTest( - test1 = cms.EDProducer("a", src = cms.InputTag("a"), - nested = cms.PSet(src = cms.InputTag("a"), src2 = cms.InputTag("c"), usrc = cms.untracked.InputTag("a")) - ), - test2 = cms.EDProducer("b", src = cms.InputTag("c"), - nested = cms.PSet(src = cms.InputTag("a"), src2 = cms.InputTag("c"), usrc = cms.untracked.InputTag("a")) - ), - ) - p.s1 = cms.Sequence(p.a*p.b*p.c*p.sp) + p.s1 = cms.Sequence(p.a*p.b*p.c) p.path1 = cms.Path(p.s1) p.s2 = cms.Sequence(p.d) p.path2 = cms.Path(p.e) @@ -274,14 +236,6 @@ def testMassReplaceInputTag(self): self.assertEqual(cms.InputTag("b"), p.g.src) self.assertEqual(cms.InputTag("b"), p.h.src) self.assertEqual(cms.InputTag("b"), p.i.src) - self.assertEqual(cms.InputTag("b"), p.sp.test1.src) - self.assertEqual(cms.InputTag("b"), p.sp.test1.nested.src) - self.assertEqual(cms.InputTag("c"), p.sp.test1.nested.src2) - self.assertEqual(cms.untracked.InputTag("b"), p.sp.test1.nested.usrc) - self.assertEqual(cms.InputTag("c"), p.sp.test2.src) - self.assertEqual(cms.InputTag("b"), p.sp.test2.nested.src) - self.assertEqual(cms.InputTag("c"), p.sp.test2.nested.src2) - self.assertEqual(cms.untracked.InputTag("b"), p.sp.test2.nested.usrc) def testMassSearchReplaceParam(self): p = cms.Process("test") @@ -293,13 +247,7 @@ def testMassSearchReplaceParam(self): p.d = cms.EDProducer("ac", src=cms.untracked.InputTag("b"), nested = cms.PSet(src = cms.InputTag("c"), src2 = cms.InputTag("b")) ) - p.sp = SwitchProducerTest( - test1 = cms.EDProducer("a", src = cms.InputTag("b"), - nested = cms.PSet(src = cms.InputTag("b")) - ), - test2 = cms.EDProducer("b", src = cms.InputTag("b")), - ) - p.s = cms.Sequence(p.a*p.b*p.c*p.d*p.sp) + p.s = cms.Sequence(p.a*p.b*p.c*p.d) massSearchReplaceParam(p.s,"src",cms.InputTag("b"),"a") self.assertEqual(cms.InputTag("a"),p.c.src) self.assertEqual(cms.InputTag("c"),p.c.nested.src) @@ -307,9 +255,6 @@ def testMassSearchReplaceParam(self): self.assertEqual(cms.untracked.InputTag("a"),p.d.src) self.assertEqual(cms.InputTag("c"),p.d.nested.src) self.assertEqual(cms.InputTag("b"),p.d.nested.src2) - self.assertEqual(cms.InputTag("a"),p.sp.test1.src) - self.assertEqual(cms.InputTag("b"),p.sp.test1.nested.src) - self.assertEqual(cms.InputTag("a"),p.sp.test2.src) def testMassReplaceParam(self): process1 = cms.Process("test") @@ -330,13 +275,7 @@ def testMassReplaceParam(self): p.h = cms.EDProducer("ab", src=cms.InputTag("a")) p.i = cms.EDProducer("ab", src=cms.InputTag("a")) p.j = cms.EDProducer("ab", src=cms.untracked.InputTag("a")) - p.sp = SwitchProducerTest( - test1 = cms.EDProducer("a", src = cms.InputTag("a"), - nested = cms.PSet(src = cms.InputTag("a")) - ), - test2 = cms.EDProducer("b", src = cms.InputTag("a")), - ) - p.s1 = cms.Sequence(p.a*p.b*p.c*p.sp) + p.s1 = cms.Sequence(p.a*p.b*p.c) p.path1 = cms.Path(p.s1) p.s2 = cms.Sequence(p.d) p.path2 = cms.Path(p.e) @@ -359,7 +298,4 @@ def testMassReplaceParam(self): self.assertEqual(cms.InputTag("b"), p.h.src) self.assertEqual(cms.InputTag("b"), p.i.src) self.assertEqual(cms.untracked.InputTag("b"), p.j.src) - self.assertEqual(cms.InputTag("b"),p.sp.test1.src) - self.assertEqual(cms.InputTag("a"),p.sp.test1.nested.src) - self.assertEqual(cms.InputTag("b"),p.sp.test2.src) unittest.main() diff --git a/FWCore/ParameterSet/python/Modules.py b/FWCore/ParameterSet/python/Modules.py index 9d9fc75b47889..5efaf4cb9e532 100644 --- a/FWCore/ParameterSet/python/Modules.py +++ b/FWCore/ParameterSet/python/Modules.py @@ -211,239 +211,6 @@ def nameInProcessDesc_(self, myname:str): return "@main_looper" -# Need to be a module-level function for the configuration with a -# SwitchProducer to be pickleable. -def _switch_cpu(accelerators): - return (True, 1) - -class SwitchProducer(EDProducer): - """This purpose class is to provide a switch of EDProducers for a single module/product label. - - The decision is done at the time when the python configuration is - translated to C++. This class is generic, and intended to be - inherited for concrete switches. Example: - - class SwitchProducerFoo(SwitchProducer): - def __init__(self, **kargs): - super(SwitchProducerFoo,self).__init__( - dict(case1 = case1Func, case2 = case2Func), - **kargs - ) - - foo = SwitchProducerFoo( - case1 = EDProducer("Producer1"), - case2 = EDProducer("Producer2") - ) - - Here case1Func and case2Func are functions that return a (bool, - int) tuple, where the bool tells whether that case is enabled or - not, and the int tells the priority of that case. The case with - the highest priority among those that are enabled will get chosen. - - The end result is that the product(s) labeled as "foo" will be - produced with one of the producers. It would be good if their - output product types and instance names would be the same (or very - close). - """ - def __init__(self, caseFunctionDict, **kargs): - super(SwitchProducer,self).__init__(None) - self._caseFunctionDict = copy.copy(caseFunctionDict) - self.__setParameters(kargs) - self._isModified = False - - def setLabel(self, label:str): - super().setLabel(label) - # SwitchProducer owns the contained modules, and therefore - # need to set / unset the label for them explicitly here - for case in self.parameterNames_(): - producer = self.__dict__[case] - producer.setLabel(self.caseLabel_(label, case) if label is not None else None) - - @staticmethod - def getCpu(): - """Returns a function that returns the priority for a CPU "computing device". Intended to be used by deriving classes.""" - return _switch_cpu - - def _chooseCase(self, accelerators): - """Returns the name of the chosen case.""" - cases = self.parameterNames_() - bestCase = None - for case in cases: - (enabled, priority) = self._caseFunctionDict[case](accelerators) - if enabled and (bestCase is None or bestCase[0] < priority): - bestCase = (priority, case) - if bestCase is None: - raise RuntimeError("All cases '%s' were disabled" % (str(cases))) - return bestCase[1] - - def _getProducer(self, accelerators): - """Returns the EDroducer of the chosen case""" - return self.__dict__[self._chooseCase(accelerators)] - - @staticmethod - def __typeIsValid(typ) -> bool: - return (isinstance(typ, EDProducer) and not isinstance(typ, SwitchProducer)) or isinstance(typ, EDAlias) - - def __addParameter(self, name:str, value): - if not self.__typeIsValid(value): - raise TypeError(name+" does not already exist, so it can only be set to a cms.EDProducer or cms.EDAlias") - if name not in self._caseFunctionDict: - raise ValueError("Case '%s' is not allowed (allowed ones are %s)" % (name, ",".join(self._caseFunctionDict.keys()))) - if name in self.__dict__: - message = "Duplicate insert of member " + name - message += "\nThe original parameters are:\n" - message += self.dumpPython() + '\n' - raise ValueError(message) - self.__dict__[name]=value - if self.hasLabel_(): - value.setLabel(self.caseLabel_(self.label_(), name)) - self._Parameterizable__parameterNames.append(name) - self._isModified = True - - def __setParameters(self, parameters): - for name, value in parameters.items(): - self.__addParameter(name, value) - - def __setattr__(self, name:str, value): - # Following snippet copied and customized from - # _Parameterizable in order to support Modifier.toModify - # - #since labels are not supposed to have underscores at the beginning - # I will assume that if we have such then we are setting an internal variable - if self.isFrozen() and not (name in ["_Labelable__label","_isFrozen"] or name.startswith('_')): - message = "Object already added to a process. It is read only now\n" - message += " %s = %s" %(name, value) - message += "\nThe original parameters are:\n" - message += self.dumpPython() + '\n' - raise ValueError(message) - # underscored names bypass checking for _ParameterTypeBase - if name[0]=='_': - super(SwitchProducer, self).__setattr__(name,value) - elif not name in self.__dict__: - self.__addParameter(name, value) - self._isModified = True - else: - if not self.__typeIsValid(value): - raise TypeError(name+" can only be set to a cms.EDProducer or cms.EDAlias") - # We should always receive an cms.EDProducer - self.__dict__[name] = value - if self.hasLabel_(): - value.setLabel(self.caseLabel_(self.label_(), name)) - self._isModified = True - - def clone(self, **params): - returnValue = SwitchProducer.__new__(type(self)) - - # Need special treatment as cms.EDProducer is not a valid parameter type (except in this case) - myparams = dict() - for name, value in params.items(): - if value is None: - continue - elif isinstance(value, dict): - myparams[name] = self.__dict__[name].clone(**value) - else: # value is an EDProducer - myparams[name] = value.clone() - - # Add the ones that were not customized - for name in self.parameterNames_(): - if name not in params: - myparams[name] = self.__dict__[name].clone() - returnValue.__init__(**myparams) - returnValue._isModified = False - returnValue._isFrozen = False - saveOrigin(returnValue, 1) - return returnValue - - def dumpPython(self, options:PrintOptions=PrintOptions()) -> str: - # Note that if anyone uses the generic SwitchProducer instead - # of a derived-one, the information on the functions for the - # producer decision is lost - specialImportRegistry.registerUse(self) - result = "%s(" % self.__class__.__name__ # not including cms. since the deriving classes are not in cms "namespace" - options.indent() - for resource in sorted(self.parameterNames_()): - result += "\n" + options.indentation() + resource + " = " + getattr(self, resource).dumpPython(options).rstrip() + "," - if result[-1] == ",": - result = result.rstrip(",") - options.unindent() - result += "\n)\n" - return result - - def directDependencies(self): - # XXX FIXME handle SwitchProducer dependencies - return [] - - def nameInProcessDesc_(self, myname:str): - return myname - def moduleLabel_(self, myname:str): - return myname - def caseLabel_(self, name:str, case:str): - return name+"@"+case - def cloneCaseModuleIfNeeded_(self, myname:str, case:str): - mod = self.__dict__[case] - if (self.caseLabel_(myname, case) != mod.label_()): - clne = mod.clone() - clne.setLabel(None) - clne.setLabel(self.caseLabel_(myname, case)) - self.__dict__[case] = clne - mod = clne - return mod - def modulesForConditionalTask_(self): - # Need the contained modules (not EDAliases) for ConditionalTask - ret = [] - for case in self.parameterNames_(): - caseobj = self.__dict__[case] - if not isinstance(caseobj, EDAlias): - ret.append(self.cloneCaseModuleIfNeeded_(self.label_(), case)) - return ret - def appendToProcessDescLists_(self, modules, aliases, myname:str): - # This way we can insert the chosen EDProducer to @all_modules - # so that we get easily a worker for it - modules.append(myname) - for case in self.parameterNames_(): - if isinstance(self.__dict__[case], EDAlias): - aliases.append(self.caseLabel_(myname, case)) - else: - modules.append(self.caseLabel_(myname, case)) - - def insertInto(self, parameterSet, myname:str, accelerators): - for case in self.parameterNames_(): - producer = self.__dict__[case] - if isinstance(producer, EDProducer): - producer = self.cloneCaseModuleIfNeeded_(myname, case) - producer.insertInto(parameterSet, self.caseLabel_(myname, case)) - newpset = parameterSet.newPSet() - newpset.addString(True, "@module_label", self.moduleLabel_(myname)) - newpset.addString(True, "@module_type", "SwitchProducer") - newpset.addString(True, "@module_edm_type", "EDProducer") - newpset.addVString(True, "@all_cases", [self.caseLabel_(myname, p) for p in self.parameterNames_()]) - newpset.addString(False, "@chosen_case", self.caseLabel_(myname, self._chooseCase(accelerators))) - parameterSet.addPSet(True, self.nameInProcessDesc_(myname), newpset) - - def _placeImpl(self,name:str,proc): - proc._placeSwitchProducer(name,self) -# for case in self.parameterNames_(): -# caseLabel = self.caseLabel_(name, case) -# caseObj = self.__dict__[case] -# -# if isinstance(caseObj, EDAlias): -# # EDAliases end up in @all_aliases automatically -# proc._placeAlias(caseLabel, caseObj) -# else: -# # Note that these don't end up in @all_modules -# # automatically because they're not part of any -# # Task/Sequence/Path -# proc._placeProducer(caseLabel, caseObj) - - def _clonesequence(self, lookuptable): - try: - return lookuptable[id(self)] - except: - raise ModuleCloneError(self._errorstr()) - def _errorstr(self): - return "SwitchProducer" - - if __name__ == "__main__": import unittest from .Types import * diff --git a/Validation/GlobalRecHits/src/GlobalRecHitsAnalyzer.cc b/Validation/GlobalRecHits/src/GlobalRecHitsAnalyzer.cc index 5c588afe63608..cf9fad09e9699 100644 --- a/Validation/GlobalRecHits/src/GlobalRecHitsAnalyzer.cc +++ b/Validation/GlobalRecHits/src/GlobalRecHitsAnalyzer.cc @@ -38,7 +38,7 @@ GlobalRecHitsAnalyzer::GlobalRecHitsAnalyzer(const edm::ParameterSet& iPSet) edm::ProcessMatch("*"), this); callWhenNewProductsRegistered([this](edm::ProductDescription const& bd) { // in case of EDAliases, consume only the aliased-for original products - if (bd.isAnyAlias()) + if (bd.isAlias()) return; this->HBHERecHitgetter_(bd); this->HFRecHitgetter_(bd); From da54c6dcb43d14ad2d25ac62f9db6712c0ef8371 Mon Sep 17 00:00:00 2001 From: Matti Kortelainen Date: Fri, 15 Aug 2025 00:26:17 +0200 Subject: [PATCH 4/5] Remove ConditionalTask --- FWCore/Framework/src/ScheduleBuilder.cc | 339 +------------------- FWCore/ParameterSet/python/Config.py | 46 +-- FWCore/ParameterSet/python/SequenceTypes.py | 111 +------ 3 files changed, 13 insertions(+), 483 deletions(-) diff --git a/FWCore/Framework/src/ScheduleBuilder.cc b/FWCore/Framework/src/ScheduleBuilder.cc index 6eafb28538927..f55c6857e566a 100644 --- a/FWCore/Framework/src/ScheduleBuilder.cc +++ b/FWCore/Framework/src/ScheduleBuilder.cc @@ -85,185 +85,6 @@ namespace edm { std::string originalModuleLabel; }; - // If ConditionalTask modules exist in the container of module - // names, returns the range (std::pair) for the modules. The range - // excludes the special markers '#' (right before the - // ConditionalTask modules) and '@' (last element). - // If the module name container does not contain ConditionalTask - // modules, returns std::pair of end iterators. - template - auto findConditionalTaskModulesRange(T const& modnames) { - auto beg = std::find(modnames.begin(), modnames.end(), "#"); - if (beg == modnames.end()) { - return std::pair(modnames.end(), modnames.end()); - } - return std::pair(beg + 1, std::prev(modnames.end())); - } - - std::optional findBestMatchingAlias( - std::unordered_multimap const& conditionalModuleBranches, - std::unordered_multimap const& aliasMap, - std::string const& productModuleLabel, - ModuleConsumesInfo const& consumesInfo) { - std::optional best; - int wildcardsInBest = std::numeric_limits::max(); - bool bestIsAmbiguous = false; - - auto updateBest = [&best, &wildcardsInBest, &bestIsAmbiguous]( - std::string const& label, bool instanceIsWildcard, bool typeIsWildcard) { - int const wildcards = static_cast(instanceIsWildcard) + static_cast(typeIsWildcard); - if (wildcards == 0) { - bestIsAmbiguous = false; - return true; - } - if (not best or wildcards < wildcardsInBest) { - best = label; - wildcardsInBest = wildcards; - bestIsAmbiguous = false; - } else if (best and *best != label and wildcardsInBest == wildcards) { - bestIsAmbiguous = true; - } - return false; - }; - - auto findAlias = aliasMap.equal_range(productModuleLabel); - for (auto it = findAlias.first; it != findAlias.second; ++it) { - std::string const& aliasInstanceLabel = - it->second.instanceLabel != "*" ? it->second.instanceLabel : it->second.originalInstanceLabel; - bool const instanceIsWildcard = (aliasInstanceLabel == "*"); - if (instanceIsWildcard or consumesInfo.instance() == aliasInstanceLabel) { - bool const typeIsWildcard = it->second.friendlyClassName == "*"; - if (typeIsWildcard or (consumesInfo.type().friendlyClassName() == it->second.friendlyClassName)) { - if (updateBest(it->second.originalModuleLabel, instanceIsWildcard, typeIsWildcard)) { - return it->second.originalModuleLabel; - } - } else if (consumesInfo.kindOfType() == ELEMENT_TYPE) { - //consume is a View so need to do more intrusive search - //find matching branches in module - auto branches = conditionalModuleBranches.equal_range(productModuleLabel); - for (auto itBranch = branches.first; itBranch != branches.second; ++it) { - if (typeIsWildcard or itBranch->second->productInstanceName() == it->second.originalInstanceLabel) { - if (productholderindexhelper::typeIsViewCompatible(consumesInfo.type(), - TypeID(itBranch->second->wrappedType().typeInfo()), - itBranch->second->className())) { - if (updateBest(it->second.originalModuleLabel, instanceIsWildcard, typeIsWildcard)) { - return it->second.originalModuleLabel; - } - } - } - } - } - } - } - if (bestIsAmbiguous) { - throw Exception(errors::UnimplementedFeature) - << "Encountered ambiguity when trying to find a best-matching alias for\n" - << " friendly class name " << consumesInfo.type().friendlyClassName() << "\n" - << " module label " << productModuleLabel << "\n" - << " product instance name " << consumesInfo.instance() << "\n" - << "when processing EDAliases for modules in ConditionalTasks. Two aliases have the same number of " - "wildcards (" - << wildcardsInBest << ")"; - } - return best; - } - - class ConditionalTaskHelper { - public: - ConditionalTaskHelper(ParameterSet& ioProcessPSet, - SignallingProductRegistryFiller& ioProductRegistry, - PreallocationConfiguration const* iPrealloc, - std::shared_ptr iProcessConfiguration, - ModuleRegistry& ioModuleRegistry, - ActivityRegistry& iActivityRegistry, - std::vector const& iTrigPathNames) { - std::unordered_set allConditionalMods; - for (auto const& pathName : iTrigPathNames) { - auto const modnames = ioProcessPSet.getParameter>(pathName); - - //Pull out ConditionalTask modules - auto condRange = findConditionalTaskModulesRange(modnames); - if (condRange.first == condRange.second) - continue; - - //the last entry should be ignored since it is required to be "@" - allConditionalMods.insert(condRange.first, condRange.second); - } - - for (auto const& cond : allConditionalMods) { - //force the creation of the conditional modules so alias check can work - // must be sure this is not added to the list of all workers else the system will hang in case the - // module is not used. - bool isTracked = false; - ParameterSet* modpset = ioProcessPSet.getPSetForUpdate(cond, isTracked); - assert(modpset != nullptr); - assert(isTracked); - - MakeModuleParams params(modpset, ioProductRegistry, iPrealloc, iProcessConfiguration); - (void)ioModuleRegistry.getModule(params, - cond, - iActivityRegistry.preModuleConstructionSignal_, - iActivityRegistry.postModuleConstructionSignal_); - } - - fillAliasMap(ioProcessPSet, allConditionalMods); - - //find branches created by the conditional modules - for (auto const& prod : ioProductRegistry.registry().productList()) { - if (allConditionalMods.find(prod.first.moduleLabel()) != allConditionalMods.end()) { - conditionalModsBranches_.emplace(prod.first.moduleLabel(), &prod.second); - } - } - } - - std::unordered_multimap const& aliasMap() const { return aliasMap_; } - - std::unordered_multimap conditionalModuleBranches( - std::unordered_set const& conditionalmods) const { - std::unordered_multimap ret; - for (auto const& mod : conditionalmods) { - auto range = conditionalModsBranches_.equal_range(mod); - ret.insert(range.first, range.second); - } - return ret; - } - - private: - void fillAliasMap(ParameterSet const& ioProcessPSet, - std::unordered_set const& iAllConditionalModules) { - auto aliases = ioProcessPSet.getParameter>("@all_aliases"); - std::string const star("*"); - for (auto const& alias : aliases) { - auto info = ioProcessPSet.getParameter(alias); - auto aliasedToModuleLabels = info.getParameterNames(); - for (auto const& mod : aliasedToModuleLabels) { - if (not mod.empty() and mod[0] != '@' and - iAllConditionalModules.find(mod) != iAllConditionalModules.end()) { - auto aliasVPSet = info.getParameter>(mod); - for (auto const& aliasPSet : aliasVPSet) { - std::string type = star; - std::string instance = star; - std::string originalInstance = star; - if (aliasPSet.exists("type")) { - type = aliasPSet.getParameter("type"); - } - if (aliasPSet.exists("toProductInstance")) { - instance = aliasPSet.getParameter("toProductInstance"); - } - if (aliasPSet.exists("fromProductInstance")) { - originalInstance = aliasPSet.getParameter("fromProductInstance"); - } - aliasMap_.emplace(alias, AliasInfo{type, instance, originalInstance, mod}); - } - } - } - } - } - - std::unordered_multimap aliasMap_; - std::unordered_multimap conditionalModsBranches_; - }; - std::shared_ptr getModule( ParameterSet& ioProcessPSet, std::string const& iModuleLabel, @@ -284,92 +105,6 @@ namespace edm { iActivityRegistry.postModuleConstructionSignal_); } - std::vector tryToPlaceConditionalModules( - maker::ModuleHolder const* iModule, - ModuleRegistry& iModuleRegistry, - std::unordered_set& ioConditionalModules, - std::unordered_multimap const& iConditionalModuleProducts, - std::unordered_multimap const& iAliasMap, - ParameterSet& ioProcessPSet, - SignallingProductRegistryFiller& ioProductRegistry, - ActivityRegistry& iActivityRegistry, - PreallocationConfiguration const* iPrealloc, - std::shared_ptr iProcessConfiguration) { - std::vector returnValue; - //auto const& consumesInfo = worker->moduleConsumesInfos(); - auto const& consumesInfo = iModule->moduleConsumesInfos(); - using namespace productholderindexhelper; - for (auto const& ci : consumesInfo) { - if (not ci.skipCurrentProcess() and - (ci.process().empty() or ci.process() == iProcessConfiguration->processName())) { - auto productModuleLabel = std::string(ci.label()); - bool productFromConditionalModule = false; - auto itFound = ioConditionalModules.find(productModuleLabel); - if (itFound == ioConditionalModules.end()) { - //Check to see if this was an alias - //note that aliasMap was previously filtered so only the conditional modules remain there - auto foundAlias = findBestMatchingAlias(iConditionalModuleProducts, iAliasMap, productModuleLabel, ci); - if (foundAlias) { - productModuleLabel = *foundAlias; - productFromConditionalModule = true; - itFound = ioConditionalModules.find(productModuleLabel); - //check that the alias-for conditional module has not been used - if (itFound == ioConditionalModules.end()) { - continue; - } - } - } else { - //need to check the rest of the data product info - auto findBranches = iConditionalModuleProducts.equal_range(productModuleLabel); - for (auto itBranch = findBranches.first; itBranch != findBranches.second; ++itBranch) { - if (itBranch->second->productInstanceName() == ci.instance()) { - if (ci.kindOfType() == PRODUCT_TYPE) { - if (ci.type() == itBranch->second->unwrappedTypeID()) { - productFromConditionalModule = true; - break; - } - } else { - //this is a view - if (typeIsViewCompatible(ci.type(), - TypeID(itBranch->second->wrappedType().typeInfo()), - itBranch->second->className())) { - productFromConditionalModule = true; - break; - } - } - } - } - } - if (productFromConditionalModule) { - auto condModule = getModule(ioProcessPSet, - productModuleLabel, - iModuleRegistry, - ioProductRegistry, - iActivityRegistry, - iPrealloc, - iProcessConfiguration); - assert(condModule); - - ioConditionalModules.erase(itFound); - - auto dependents = tryToPlaceConditionalModules(condModule.get(), - iModuleRegistry, - ioConditionalModules, - iConditionalModuleProducts, - iAliasMap, - ioProcessPSet, - ioProductRegistry, - iActivityRegistry, - iPrealloc, - iProcessConfiguration); - returnValue.insert(returnValue.end(), dependents.begin(), dependents.end()); - returnValue.emplace_back(&condModule->moduleDescription()); - } - } - } - return returnValue; - } - std::vector fillModulesInPath(ParameterSet& ioProcessPSet, ModuleRegistry& ioModuleRegistry, SignallingProductRegistryFiller& ioProductRegistry, @@ -378,35 +113,10 @@ namespace edm { std::shared_ptr iProcessConfiguration, std::string const& iPathName, bool iIgnoreFilters, - std::vector const& iEndPathNames, - ConditionalTaskHelper const& iConditionalTaskHelper, - std::unordered_set& oAllConditionalModules) { + std::vector const& iEndPathNames) { auto modnames = ioProcessPSet.getParameter>(iPathName); std::vector tmpworkers; - //Pull out ConditionalTask modules - auto condRange = findConditionalTaskModulesRange(modnames); - - std::unordered_set conditionalmods; - //An EDAlias may be redirecting to a module on a ConditionalTask - std::unordered_multimap conditionalModsBranches; - std::unordered_map conditionalModOrder; - if (condRange.first != condRange.second) { - for (auto it = condRange.first; it != condRange.second; ++it) { - // ordering needs to skip the # token in the path list - conditionalModOrder.emplace(*it, it - modnames.begin() - 1); - } - //the last entry should be ignored since it is required to be "@" - conditionalmods = std::unordered_set(std::make_move_iterator(condRange.first), - std::make_move_iterator(condRange.second)); - - conditionalModsBranches = iConditionalTaskHelper.conditionalModuleBranches(conditionalmods); - modnames.erase(std::prev(condRange.first), modnames.end()); - - // Make a union of all conditional modules from all Paths - oAllConditionalModules.insert(conditionalmods.begin(), conditionalmods.end()); - } - unsigned int placeInPath = 0; for (auto const& name : modnames) { //Modules except EDFilters are set to run concurrently by default @@ -468,20 +178,6 @@ namespace edm { runConcurrently = false; } - auto condModules = tryToPlaceConditionalModules(module.get(), - ioModuleRegistry, - conditionalmods, - conditionalModsBranches, - iConditionalTaskHelper.aliasMap(), - ioProcessPSet, - ioProductRegistry, - iActivityRegistry, - iPrealloc, - iProcessConfiguration); - for (auto condMod : condModules) { - tmpworkers.emplace_back(condMod, WorkerInPath::Ignore, conditionalModOrder[condMod->moduleLabel()], true); - } - tmpworkers.emplace_back(&module->moduleDescription(), filterAction, placeInPath, runConcurrently); ++placeInPath; } @@ -496,9 +192,7 @@ namespace edm { PreallocationConfiguration const* iPrealloc, std::shared_ptr iProcessConfiguration, std::string const& iName, - std::vector const& iEndPathNames, - ConditionalTaskHelper const& iConditionalTaskHelper, - std::unordered_set& oAllConditionalModules) { + std::vector const& iEndPathNames) { return fillModulesInPath(ioProcessPSet, ioModuleRegistry, ioProductRegistry, @@ -507,9 +201,7 @@ namespace edm { iProcessConfiguration, iName, false, - iEndPathNames, - iConditionalTaskHelper, - oAllConditionalModules); + iEndPathNames); } std::vector fillEndPath(ParameterSet& ioProcessPSet, @@ -519,9 +211,7 @@ namespace edm { PreallocationConfiguration const* iPrealloc, std::shared_ptr iProcessConfiguration, std::string const& iName, - std::vector const& iEndPathNames, - ConditionalTaskHelper const& iConditionalTaskHelper, - std::unordered_set& oAllConditionalModules) { + std::vector const& iEndPathNames) { return fillModulesInPath(ioProcessPSet, ioModuleRegistry, ioProductRegistry, @@ -530,9 +220,7 @@ namespace edm { iProcessConfiguration, iName, true, - iEndPathNames, - iConditionalTaskHelper, - oAllConditionalModules); + iEndPathNames); } const std::string kFilterType("EDFilter"); @@ -577,15 +265,6 @@ namespace edm { iModuleRegistry.forAllModuleHolders( [&](auto const* holder) { modulesInPaths.insert(holder->moduleDescription().moduleLabel()); }); - ConditionalTaskHelper conditionalTaskHelper(ioProcessPSet, - ioProductRegistry, - &iPrealloc, - iProcessConfiguration, - iModuleRegistry, - iActivityRegistry, - iPathNames); - std::unordered_set conditionalModules; - pathNameAndModules_.reserve(iPathNames.size()); for (auto const& trig_name : iPathNames) { pathNameAndModules_.emplace_back(trig_name, @@ -596,9 +275,7 @@ namespace edm { &iPrealloc, iProcessConfiguration, trig_name, - iEndPathNames, - conditionalTaskHelper, - conditionalModules)); + iEndPathNames)); for (auto const& path : pathNameAndModules_.back().second) { modulesInPaths.insert(path.description_->moduleLabel()); } @@ -615,9 +292,7 @@ namespace edm { &iPrealloc, iProcessConfiguration, end_path_name, - iEndPathNames, - conditionalTaskHelper, - conditionalModules)); + iEndPathNames)); for (auto const& path : endpathNameAndModules_.back().second) { modulesInPaths.insert(path.description_->moduleLabel()); } diff --git a/FWCore/ParameterSet/python/Config.py b/FWCore/ParameterSet/python/Config.py index 59b35156781c9..ec97ff80a315b 100644 --- a/FWCore/ParameterSet/python/Config.py +++ b/FWCore/ParameterSet/python/Config.py @@ -131,7 +131,6 @@ def __init__(self,name: str, *Mods): self.__dict__['_Process__endpaths'] = DictTypes.SortedKeysDict() # of definition self.__dict__['_Process__sequences'] = {} self.__dict__['_Process__tasks'] = {} - self.__dict__['_Process__conditionaltasks'] = {} self.__dict__['_Process__services'] = {} self.__dict__['_Process__essources'] = {} self.__dict__['_Process__esproducers'] = {} @@ -308,10 +307,6 @@ def tasks_(self): """returns a dict of the tasks that have been added to the Process""" return DictTypes.FixedKeysDict(self.__tasks) tasks = property(tasks_,doc="dictionary containing the tasks for the process") - def conditionaltasks_(self): - """returns a dict of the conditionaltasks that have been added to the Process""" - return DictTypes.FixedKeysDict(self.__conditionaltasks) - conditionaltasks = property(conditionaltasks_,doc="dictionary containing the conditionatasks for the process") def schedule_(self): """returns the schedule that has been added to the Process or None if none have been added""" return self.__schedule @@ -420,7 +415,6 @@ def __setattr__(self,name:str,value): if name == value.type_(): if hasattr(self,name) and (getattr(self,name)!=value): self._replaceInTasks(name, value) - self._replaceInConditionalTasks(name, value) # Only Services get handled here self.add_(value) return @@ -457,7 +451,6 @@ def __setattr__(self,name:str,value): if newValue._isTaskComponent(): if not self.__InExtendCall: self._replaceInTasks(name, newValue) - self._replaceInConditionalTasks(name, newValue) self._replaceInSchedule(name, newValue) else: if not isinstance(newValue, Task): @@ -476,10 +469,8 @@ def __setattr__(self,name:str,value): if s is not None: raise ValueError(msg1+s.label_()+msg2) - if isinstance(newValue, _Sequenceable) or newValue._isTaskComponent() or isinstance(newValue, ConditionalTask): + if isinstance(newValue, _Sequenceable) or newValue._isTaskComponent(): if not self.__InExtendCall: - if isinstance(newValue, ConditionalTask): - self._replaceInConditionalTasks(name, newValue) self._replaceInSequences(name, newValue) else: #should check to see if used in sequence before complaining @@ -578,7 +569,7 @@ def __delattr__(self,name:str): self._delHelper(name) obj = getattr(self,name) if not obj is None: - if not isinstance(obj, Sequence) and not isinstance(obj, Task) and not isinstance(obj,ConditionalTask): + if not isinstance(obj, Sequence) and not isinstance(obj, Task): # For modules, ES modules and services we can also remove # the deleted object from Sequences, Paths, EndPaths, and # Tasks. Note that for Sequences and Tasks that cannot be done @@ -590,7 +581,6 @@ def __delattr__(self,name:str): # has been checked that the deleted Sequence is not used). if obj._isTaskComponent(): self._replaceInTasks(name, None) - self._replaceInConditionalTasks(name, None) self._replaceInSchedule(name, None) if isinstance(obj, _Sequenceable) or obj._isTaskComponent(): self._replaceInSequences(name, None) @@ -688,9 +678,6 @@ def _placeESSource(self,name:str,mod): def _placeTask(self,name:str,task): self._validateTask(task, name) self._place(name, task, self.__tasks) - def _placeConditionalTask(self,name:str,task): - self._validateConditionalTask(task, name) - self._place(name, task, self.__conditionaltasks) def _placeAlias(self,name:str,mod): self._place(name, mod, self.__aliases) def _placePSet(self,name:str,mod): @@ -741,7 +728,7 @@ def extend(self,other,items=()): self.__setattr__(name,item) elif isinstance(item,_ModuleSequenceType): seqs[name]=item - elif isinstance(item,Task) or isinstance(item, ConditionalTask): + elif isinstance(item,Task): tasksToAttach[name] = item elif isinstance(item,_Labelable): self.__setattr__(name,item) @@ -913,14 +900,6 @@ def _validateTask(self, task, label:str): task.visit(visitor) except: raise RuntimeError("An entry in task " + label + ' has not been attached to the process') - def _validateConditionalTask(self, task, label:str): - # See if every module and service has been inserted into the process - try: - l = set() - visitor = NodeNameVisitor(l) - task.visit(visitor) - except: - raise RuntimeError("An entry in task " + label + ' has not been attached to the process') def _itemsInDependencyOrder(self, processDictionaryOfItems): # The items can be Sequences or Tasks and the input @@ -936,8 +915,6 @@ def _itemsInDependencyOrder(self, processDictionaryOfItems): containedItems = [] if isinstance(item, Task): v = TaskVisitor(containedItems) - elif isinstance(item, ConditionalTask): - v = ConditionalTaskVisitor(containedItems) else: v = SequenceVisitor(containedItems) try: @@ -946,9 +923,6 @@ def _itemsInDependencyOrder(self, processDictionaryOfItems): if isinstance(item, Task): raise RuntimeError("Failed in a Task visitor. Probably " \ "a circular dependency discovered in Task with label " + label) - elif isinstance(item, ConditionalTask): - raise RuntimeError("Failed in a ConditionalTask visitor. Probably " \ - "a circular dependency discovered in ConditionalTask with label " + label) else: raise RuntimeError("Failed in a Sequence visitor. Probably a " \ "circular dependency discovered in Sequence with label " + label) @@ -965,10 +939,6 @@ def _itemsInDependencyOrder(self, processDictionaryOfItems): raise RuntimeError("Task has a label, but using its label to get an attribute" \ " from the process yields a different object or None\n"+ "label = " + containedItem.label_()) - if isinstance(item, ConditionalTask): - raise RuntimeError("ConditionalTask has a label, but using its label to get an attribute" \ - " from the process yields a different object or None\n"+ - "label = " + containedItem.label_()) else: raise RuntimeError("Sequence has a label, but using its label to get an attribute" \ " from the process yields a different object or None\n"+ @@ -1021,7 +991,6 @@ def dumpPython(self, options=PrintOptions()) -> str: result+=self._dumpPythonList(self.es_sources_(), options) result+=self._dumpPython(self.es_prefers_(), options) result+=self._dumpPythonList(self._itemsInDependencyOrder(self.tasks), options) - result+=self._dumpPythonList(self._itemsInDependencyOrder(self.conditionaltasks), options) result+=self._dumpPythonList(self._itemsInDependencyOrder(self.sequences), options) result+=self._dumpPythonList(self.paths_(), options) result+=self._dumpPythonList(self.endpaths_(), options) @@ -1118,10 +1087,6 @@ def _replaceInTasks(self, label:str, new): old = getattr(self,label) for task in self.tasks.values(): task.replace(old, new) - def _replaceInConditionalTasks(self, label:str, new): - old = getattr(self,label) - for task in self.conditionaltasks.values(): - task.replace(old, new) def _replaceInSchedule(self, label:str, new): if self.schedule_() == None: return @@ -1194,8 +1159,7 @@ def _insertPaths(self, processPSet, nodeVisitor): decoratedList = [] lister = DecoratedNodeNameVisitor(decoratedList) condTaskModules = [] - condTaskVistor = ModuleNodeOnConditionalTaskVisitor(condTaskModules) - pathCompositeVisitor = CompositeVisitor(pathValidator, nodeVisitor, lister, condTaskVistor) + pathCompositeVisitor = CompositeVisitor(pathValidator, nodeVisitor, lister) endpathCompositeVisitor = CompositeVisitor(endpathValidator, nodeVisitor, lister) for triggername in triggerPaths: iPath = self.paths_()[triggername] @@ -1706,8 +1670,6 @@ def _toReplaceWith(toObj,fromObj): toObj._tasks = fromObj._tasks elif isinstance(fromObj,Task): toObj._collection = fromObj._collection - elif isinstance(fromObj,ConditionalTask): - toObj._collection = fromObj._collection elif isinstance(fromObj,_Parameterizable): #clear old items just incase fromObj is not a complete superset of toObj for p in toObj.parameterNames_(): diff --git a/FWCore/ParameterSet/python/SequenceTypes.py b/FWCore/ParameterSet/python/SequenceTypes.py index 1bf8c5d330704..a9dc10a8fbe61 100644 --- a/FWCore/ParameterSet/python/SequenceTypes.py +++ b/FWCore/ParameterSet/python/SequenceTypes.py @@ -242,14 +242,8 @@ def findDirectDependencies(element, collection,sortByType:bool=True): dependencies += item.directDependencies(sortByType) continue t = 'tasks' - # cms.ConditionalTask - elif isinstance(item, ConditionalTask): - if not item.hasLabel_(): - dependencies += item.directDependencies(sortByType) - continue - t = 'conditionaltasks' # SequencePlaceholder and TaskPlaceholder do not add an explicit dependency - elif isinstance(item, (SequencePlaceholder, TaskPlaceholder, ConditionalTaskPlaceholder)): + elif isinstance(item, (SequencePlaceholder, TaskPlaceholder)): continue # unsupported elements else: @@ -451,8 +445,6 @@ def replace(self, original, replacement): if (isinstance(original,Task) != isinstance(replacement,Task)): raise TypeError("replace only works if both arguments are Tasks or neither") - if (isinstance(original,ConditionalTask) != isinstance(replacement,ConditionalTask)): - raise TypeError("replace only works if both arguments are ConditionalTasks or neither") v = _CopyAndReplaceSequenceVisitor(original,replacement) self.visit(v) if v.didReplace(): @@ -856,18 +848,6 @@ def enter(self,visitee): def leave(self,visitee): pass -# Fills a list of all ConditionalTasks visited -# Can visit a ConditionalTask, Sequence, Path, or EndPath -class ConditionalTaskVisitor(object): - def __init__(self,d): - self.deps = d - def enter(self,visitee): - if isinstance(visitee,ConditionalTask): - self.deps.append(visitee) - pass - def leave(self,visitee): - pass - # Fills a list of all modules visited. # Can visit a Sequence, Path, EndPath, or Task # For purposes of this visitor, a module is considered @@ -908,29 +888,6 @@ def leave(self,visitee): if isinstance(visitee, Task): self._levelInTasks -= 1 -class ModuleNodeOnConditionalTaskVisitor(object): - def __init__(self,l): - self.l = l - self._levelInTasks = 0 - def enter(self,visitee): - if isinstance(visitee, ConditionalTask): - self._levelInTasks += 1 - # This block gets the modules contained by SwitchProducer. It - # needs to be before the "levelInTasks == 0" check because the - # contained modules need to be treated like in ConditionalTask - # also when the SwitchProducer itself is in the Path. - if hasattr(visitee, "modulesForConditionalTask_"): - self.l.extend(visitee.modulesForConditionalTask_()) - if self._levelInTasks == 0: - return - if visitee.isLeaf(): - self.l.append(visitee) - pass - def leave(self,visitee): - if self._levelInTasks > 0: - if isinstance(visitee, ConditionalTask): - self._levelInTasks -= 1 - # Should not be used on Tasks. # Similar to ModuleNodeVisitor with the following # differences. It only lists the modules that were @@ -1007,25 +964,16 @@ def __init__(self, type): self._type = type self.l = [] self.taskLeaves = [] - self.taskLeavesInConditionalTasks = [] self.presentTaskLeaves = self.taskLeaves self._levelInTasks = 0 - self.conditionaltaskLeaves = [] - self._levelInConditionalTasks = 0 def enter(self,visitee): if isinstance(visitee, Task): self._levelInTasks += 1 return - if isinstance(visitee, ConditionalTask): - self.presentTaskLeaves = self.taskLeavesInConditionalTasks - self._levelInConditionalTasks += 1 - return if visitee.isLeaf(): if self._levelInTasks > 0: self.presentTaskLeaves.append(visitee) - elif self._levelInConditionalTasks > 0: - self.conditionaltaskLeaves.append(visitee) else: self.l.append(visitee) def leave(self, visitee): @@ -1033,23 +981,12 @@ def leave(self, visitee): if isinstance(visitee, Task): self._levelInTasks -= 1 return - if self._levelInConditionalTasks > 0: - if isinstance(visitee, ConditionalTask): - self._levelInConditionalTasks -= 1 - if 0 == self._levelInConditionalTasks: - self.presentTaskLeaves = self.taskLeaves - return if isinstance(visitee,_UnarySequenceOperator): self.l[-1] = visitee def result(self): tsks = [] if self.taskLeaves: tsks.append(Task(*self.taskLeaves)) - if self.conditionaltaskLeaves: - ct = ConditionalTask(*self.conditionaltaskLeaves) - if self.taskLeavesInConditionalTasks: - ct.append(*self.taskLeavesInConditionalTasks) - tsks.append(ct) if len(self.l) > 0: # why doesn't (sum(self.l) work? seq = self.l[0] @@ -1713,7 +1650,7 @@ def dumpPython(self, options:PrintOptions=PrintOptions()) -> str: class Task(_TaskBase) : """Holds EDProducers, EDFilters, ESProducers, ESSources, Services, and Tasks. - A Task can be associated with Sequences, Paths, EndPaths, ConditionalTasks and the Schedule. + A Task can be associated with Sequences, Paths, EndPaths, and the Schedule. An EDProducer or EDFilter will be enabled to run unscheduled if it is on a task associated with the Schedule or any scheduled Path or EndPath (directly or indirectly through Sequences) and not be on any scheduled Path or EndPath. @@ -1755,50 +1692,6 @@ def _allowedInTask(obj) -> bool: def _taskClass(): return Task - -class ConditionalTask(_TaskBase) : - """Holds EDProducers, EDFilters, ESProducers, ESSources, Services, Tasks and ConditionalTasks. - A ConditionalTask can be associated with Sequences, Paths, and EndPaths. - An EDProducer or EDFilter will be added to a Path or EndPath based on which other - modules on the Path consumes its data products. If that ConditionalTask assigned module - is placed after an EDFilter, the module will only run if the EDFilter passes. If no module - on the Path needs the module's data products, the module will be treated as if it were on a Task. - """ - @staticmethod - def _taskType(): - return "ConditionalTask" - def _place(self, name:str, proc): - proc._placeConditionalTask(name,self) - def _isTaskComponent(self) -> bool: - return False - @staticmethod - def _makeInstance(*items): - return ConditionalTask(*items) - @staticmethod - def _allowedInTask(item) -> bool: - return isinstance(item, ConditionalTask) or isinstance(item, ConditionalTaskPlaceholder) or Task._allowedInTask(item) - @staticmethod - def _mustResolve(item) -> bool: - return Task._mustResolve(item) or isinstance(item, ConditionalTask) or isinstance(item, ConditionalTaskPlaceholder) - - -class ConditionalTaskPlaceholder(_TaskBasePlaceholder): - def _isTaskComponent(self) -> bool: - return False - @staticmethod - def _typeName() -> str: - return "ConditionalTaskPlaceholder" - @staticmethod - def _makeInstance(name): - return ConditionalTaskPlaceholder(name) - @staticmethod - def _allowedInTask(obj) -> bool: - return Task._allowedInTask(obj) or ConditionalTask._allowedInTask(obj) - @staticmethod - def _taskClass(): - return ConditionalTask - - if __name__=="__main__": import unittest class DummyModule(_Labelable, _SequenceLeaf, _ConfigureComponent): From 18495d8a654c471a3b3581c28fa71719742c0e54 Mon Sep 17 00:00:00 2001 From: Matti Kortelainen Date: Thu, 28 Aug 2025 22:44:53 +0200 Subject: [PATCH 5/5] Remove SwitchProducer remnant from HLT common.py --- HLTrigger/Configuration/python/common.py | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/HLTrigger/Configuration/python/common.py b/HLTrigger/Configuration/python/common.py index bdff4e02ec43a..2d6034f6d2a51 100644 --- a/HLTrigger/Configuration/python/common.py +++ b/HLTrigger/Configuration/python/common.py @@ -3,11 +3,7 @@ def producers_by_type(process, *types): "Find all EDProducers in the Process that are instances of the given C++ type." - switches = (module for module in (getattr(switchproducer, case) \ - for switchproducer in process._Process__switchproducers.values() \ - for case in switchproducer.parameterNames_()) \ - if isinstance(module, cms.EDProducer)) - return (module for module in itertools.chain(process._Process__producers.values(), switches) \ + return (module for module in process._Process__producers.values() \ if module._TypedParameterizable__type in types) def filters_by_type(process, *types): @@ -24,10 +20,7 @@ def esproducers_by_type(process, *types): def modules_by_type(process, *types): "Find all modiles or other components in the Process that are instances of the given C++ type." - switches = (module for module in (getattr(switchproducer, case) \ - for switchproducer in process._Process__switchproducers.values() \ - for case in switchproducer.parameterNames_())) - return (module for module in itertools.chain(process.__dict__.values(), switches) \ + return (module for module in process.__dict__.values() \ if hasattr(module, '_TypedParameterizable__type') and module._TypedParameterizable__type in types)