diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/ITrigHLTJetHypoTool.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/ITrigHLTJetHypoTool.h
index c9b692283403485da21dc342de63984b5761a042..b12c42a11d9f26d3a0876a8ec4467a5e36d3cd03 100755
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/ITrigHLTJetHypoTool.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/ITrigHLTJetHypoTool.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef TRIGHLTJETHYPO_ITRIGHLTJETHYPOTOOL_H
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/ITrigJetHypoTool.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/ITrigJetHypoTool.h
index 39927ef7470f83c821045bb57d542a333098a83b..2df735689083060bb13e95f85b690ae25f6f1bd3 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/ITrigJetHypoTool.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/ITrigJetHypoTool.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef TRIGHLTJETHYPO_ITRIGJETHYPOTOOL_H
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigEFDPhiMetJetAllTE.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigEFDPhiMetJetAllTE.h
index e83cfe5be1474befb884f9b8d64df20c0d284b74..0c7397fe6cce09f88dda5cc294571fe061749f9c 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigEFDPhiMetJetAllTE.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigEFDPhiMetJetAllTE.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 // ********************************************************************
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigEFRazorAllTE.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigEFRazorAllTE.h
index 1281f3c32f15c0eb40b85fa4f4ab301d1734fe48..96a881d549600ebe069df6c5e4e0266f837d69f2 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigEFRazorAllTE.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigEFRazorAllTE.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 /********************************************************************
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypo2.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypo2.h
index 98ebef72ecfe92ec5a2daf8e264a8b8810ac3b6d..b6ac26f6c03e5b71a8f8e3831d3562b30e07882a 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypo2.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypo2.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef TRIGHLTJETHYPO_TRIGHLTJETHYPO2_H
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoBase.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoBase.h
index e4737e6ad77cc060ee0b98cac25792485fdfb714..bde0538d865e72af87bda4f5d887b305428db1af 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoBase.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoBase.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef TRIGHLTJETHYPO_TRIGHLTJETHYPOBASE_H
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AllJetsGrouper.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AllJetsGrouper.h
index b319dace8111a49733a20ca3b4fc1a19687e46e4..734ebdc64c5a80604dfdbdab44d92eb644194f16 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AllJetsGrouper.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AllJetsGrouper.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef TRIGHLTJETHYPO_ALLJETSGROUPER_H
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AntiBasicCleaner.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AntiBasicCleaner.h
index 50e9038960fe1f45a63b32f48f6e7f8de0cf0bf8..c66a4611e51556d0503e97e1d47b245ca30f3fbf 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AntiBasicCleaner.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AntiBasicCleaner.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef TRIGHLTJETHYPO_ANTIBASICCLEANER_H
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AntiLlpCleaner.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AntiLlpCleaner.h
index eeeea3736cecf1d3d7be9626a3423ddc4c068562..ee8e2d62759a036bec7d708c5ac4879a64f3cf65 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AntiLlpCleaner.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AntiLlpCleaner.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef TRIGHLTJETHYPO_ANTILLPCLEANER_H
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AntiLooseCleaner.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AntiLooseCleaner.h
index ecc9f59d90af97ac47fa004a5d60c99fd3a64fd2..13785181d35b31e385d777499a868df3f1000bcc 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AntiLooseCleaner.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AntiLooseCleaner.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef TRIGHLTJETHYPO_ANTILOOSECLEANER_H
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AntiTightCleaner.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AntiTightCleaner.h
index 95c5b322d7c97cd49c61343c55453ea936377104..6493eb0283bf29d68216490d642bfae69f5984f3 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AntiTightCleaner.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/AntiTightCleaner.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef TRIGHLTJETHYPO_ANTITIGHTCLEANER_H
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/BasicCleaner.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/BasicCleaner.h
index db3bbb765e2b15d1bc2d3cf45547f27716da036e..c1ed78d04b4cb8fe3898c9a0fa2998e466db5359 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/BasicCleaner.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/BasicCleaner.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef TRIGHLTJETHYPO_BASICCLEANER_H
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerBridge.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerBridge.h
index 8b5672cb94c989f845e922ed8e95c5b8df199c02..89bbaf2e8d4529f10cb51c91b8e0a62398c5745d 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerBridge.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerBridge.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef TRIGHLTJETHYPO_CLEANERBRIDGE_H
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerFactory.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerFactory.h
index ffd4b7a8e95124ae40cb7594814a253d1821fb8e..86aa45d9abcd2e7cec238807d847549c02680527 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerFactory.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerFactory.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef TRIGHLTJETHYPO_CLEANERFACTORY_H
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerWrapper.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerWrapper.h
index 8dcd84af7da95312f284123f9961f845ac10a812..e535373ad972e72fd0732d7bc447b753643843db 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerWrapper.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerWrapper.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef TRIGHLTJETHYPO_CLEANERWRAPPER_H
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CombinationsGen.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CombinationsGen.h
index 558ff7176ba044c8eb9f37f02d5a58e8c6d12ab0..d3febb8cc7d8602acac64b985ebb20777077b3c4 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CombinationsGen.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CombinationsGen.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef TRIGHLTHETHYPO_COMBINATIONSGEN_H
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CombinationsGrouper.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CombinationsGrouper.h
index 822af0d39a85533211fa85a46c821503ef69d10e..c3ee42ca53e4567cbc5f261100cfcea00216b265 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CombinationsGrouper.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/CombinationsGrouper.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef TRIGHLTJETHYPO_COMBINATIONSGROUPER_H
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionBridge.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionBridge.h
index 18112dcfb564d1c984b3fbd530beb7e84638e424..8f0154b546f56ab5a34dad2177b5a30dc9747acb 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionBridge.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionBridge.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef TRIGHLTJETHYPO_CONDITIONBRIDGE_H
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsDefs.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsDefs.h
index beee0988619ee22fec022157ea571fce6e186f92..a799e55401d5dab7e29b1034f708d2dd27a6b350 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsDefs.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsDefs.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef TRIGHLTJETHYPO_CONDITIONSDEFS_H
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsSorter.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsSorter.h
index 4f02ba07914a3843c5424f89268356634456fcfb..b6e90762b451bc1c0a4644b64cb9bfa52922516f 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsSorter.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsSorter.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef TRIGHLTJETHYPO_CONDITIONSSORTER_H
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DescendingEt.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DescendingEt.h
index 73779762500151dc3183d2ddb07d6d7a73c6ea2c..6a88c24eb365f8b154b66b0c6de40fda0a0b1251 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DescendingEt.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DescendingEt.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef TRIGHLTJETHYPO_DESCENDINGET_H
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetCondition.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetCondition.h
index 5ff7487c70f89a6cb599f9155b615435f45c4443..fd9095041c2f645b371dcc25143ee20020b8151b 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetCondition.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetCondition.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef TRIGHLTJETHYPO_DIJETCONDITION_H
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetDEtaMassCondition.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetDEtaMassCondition.h
index c98416bfbd46c8a3727082ea917eaf862e03634e..b763ffa1f72b2bb36714aa3aa0ceda9b5080d91f 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetDEtaMassCondition.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetDEtaMassCondition.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef TRIGHLTJETHYPO_DIJETDETAMASSCONDITION_H
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetDPhiCondition.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetDPhiCondition.h
index 984d5b2eb74655ac43f3973f8207d025999628e4..be3afbea26e78a642f636c207d06e9d9d11b756f 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetDPhiCondition.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetDPhiCondition.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef TRIGHLTJETHYPO_DIJETDPHICONDITION_H
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetMTCondition.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetMTCondition.h
new file mode 100644
index 0000000000000000000000000000000000000000..6a10fd8dae1b48698baf08b111aedaa2cf47d6ff
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetMTCondition.h
@@ -0,0 +1,61 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef TRIGHLTJETHYPO_DIJETMTCONDITION_H
+#define TRIGHLTJETHYPO_DIJETMTCONDITION_H
+
+/********************************************************************
+ *
+ * NAME:     DijetMTCondition.h
+ * PACKAGE:  Trigger/TrigHypothesis/TrigHLTJetHypo
+ *
+ * Cuts on paris of jets makling up a dijet
+ *
+ * AUTHOR:   P. Sherwood
+ * CREATED:  February 21, 2019
+ *           
+ *********************************************************************/
+
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/IJet.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ICondition.h"
+
+
+class DijetMTCondition: public ICondition{
+ public:
+  DijetMTCondition(
+                   double massMin,
+                   double massMax,
+                   double detaMin,
+                   double detaMax,
+                   double dphiMin,
+                   double dphiMax
+                 );
+
+  ~DijetMTCondition() override {}
+
+  bool isSatisfied(const HypoJetVector&) const override;
+  
+  double orderingParameter() const noexcept override;
+  
+  std::string toString() const noexcept override;
+
+ private:
+
+  bool passJetCuts(pHypoJet, pHypoJet) const;
+  bool passDijetCuts(pHypoJet, pHypoJet) const;
+
+  // cuts on sum of jets
+  double m_massMin;
+  double m_massMax;
+
+  // cuts on the two jets
+  double m_detaMin;
+  double m_detaMax;
+  
+  double m_dphiMin;
+  double m_dphiMax;
+
+};
+
+#endif
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/EtaECondition.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/EtaECondition.h
index a50bcd543e489b13034837ca1f69d21a21a83636..c4e55680b442a050f967c8530eb868bbad966069 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/EtaECondition.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/EtaECondition.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef TRIGHLTJETHYPO_ETAECONDITION_H
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/conditionsFactory2.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/conditionsFactory2.h
index 92078f82269f0328f5fc45aa584dc8f0a15a4d51..034926817227974f8615036f6f2b726d1156088e 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/conditionsFactory2.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/TrigHLTJetHypo/TrigHLTJetHypoUtils/conditionsFactory2.h
@@ -44,6 +44,14 @@ Conditions conditionsFactoryDijet(const std::vector<double>& etThresholds1,
                                   const std::vector<double>& dphiMins,
                                   const std::vector<double>& dphiMaxs);
 
+Conditions conditionsFactoryDijetMT(const std::vector<double>& massMins,
+                                    const std::vector<double>& massMaxs,
+                                    const std::vector<double>& detaMins,
+                                    const std::vector<double>& detaMaxs,
+                                    const std::vector<double>& dphiMins,
+                                    const std::vector<double>& dphiMaxs);
+
+
 
 // for conditionsFactory2
 Conditions conditionsFactoryDijetEtaMass(const std::vector<double>& etasMin,
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/ChainLabelParser.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/ChainLabelParser.py
new file mode 100644
index 0000000000000000000000000000000000000000..8738af9af25f984a2ef474661276970fc31aa465
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/ChainLabelParser.py
@@ -0,0 +1,391 @@
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+from node import Node
+from constants import (lchars,
+                       digits,
+                       delims)
+
+
+
+def get_char(s):
+    """character generator"""
+
+    while s:
+        c = s[0]
+        s = s[1:]
+        yield c
+
+def _check_parens(s, pars):
+    pl = pars[0]
+    pr = pars[1]
+    np = 0
+    for c in s:
+        if c == pl: np += 1
+        if c == pr: np -= 1
+        if np < 0:
+            raise RuntimeError('Paren mismatch for parens %s, %s' % (pars, s))
+
+def check_parens(s):
+    _check_parens(s, '()')
+    _check_parens(s, '[]')
+    
+            
+
+def preprocess(s):
+    llines  = s.split('\n')
+
+    lines  = [l.split('#')[0].strip() for l in llines]
+    s = ''.join(lines)
+    ss = ''
+    reject = ' \n'
+    for c in s:
+        # keep white space whn within square brackets, reject otherwise
+        if c not in reject:
+            ss += c
+    s = ss      
+
+    check_parens(s)
+    print s
+    from constants import alphabet
+    for c in s:
+        if not c in alphabet:
+            raise RuntimeError('bad character %s in string %s' % (c, s))
+    print 'end of preprocess: ', s
+    return s
+
+
+class ChainLabelParser(object):
+    def __init__(self, label, debug=False):
+        self.label = label
+        self.state = 'start'
+        pp = preprocess(label)
+        print 'preprocessd string', pp, 'length', len(pp)
+        self.gc = get_char(pp)
+        self.state_history = []
+        self.states = {
+            'start': self.start,
+            'scenario': self.scen,
+            'start_params_0': self.start_params_0,
+            'start_params_1': self.start_params_1,
+            'params': self.params,
+            'end_params_0': self.end_params_0,
+            'end_params': self.end_params,
+            'end_scenario': self.end_scenario,
+            'error': self.error,
+        }
+        self.debug = debug
+
+    def paramAppend(self, c):
+        self.parameters += c
+        if self.debug:
+            print 'parameters', self.parameters
+
+    def scenAppend(self, c):
+        self.scenario += c
+        if self.debug:
+            print 'scenario', self.scenario
+            
+    def start(self):
+        "initialise"
+
+        self.state = 'scenario'
+        self.scenario = ''
+        self.parameters = ''
+        self.tree = [Node('dummy')]
+        self.msg = ''
+        
+
+    def scen(self):
+        """accumulate scenario name string into self.scenario"""
+        
+        c = self.gc.next()
+    
+        if c in lchars: 
+            self.scenAppend(c)
+            return
+    
+        if c == '(':
+            self.state = 'start_params_0'
+
+            return
+    
+        self.msg = 'state %s, bad character %s in string %s' % (self.state,
+                                                                c,
+                                                                self.label)
+        self.state = 'error'
+
+    def start_params_0(self):
+        """accumulate parameter string into self.parameter"""
+
+        self.tree.append(Node(self.scenario))
+        self.scenario = ''
+
+        c = self.gc.next()
+    
+        if c == '[':
+            self.state = 'start_params_1'
+            return
+
+        self.msg = 'state %s, bad character %s in string %s' % (self.state,
+                                                                c,
+                                                                self.label)
+        self.state = 'error'
+
+    def start_params_1(self):
+        """accumulate parameter string into self.parameter"""
+        
+        c = self.gc.next()
+    
+        if c == '(':
+            self.paramAppend(c)
+            self.state = 'params'
+            return
+
+        if c == ']':
+            self.state = 'end_params'
+            return
+
+
+        self.msg = 'state %s, bad character %s in string %s' % (self.state,
+                                                                c,
+                                                                self.label)
+        self.state = 'error'
+
+    def params(self):
+        """accumulate parameter string into self.parameter"""
+        
+        c = self.gc.next()
+    
+        if c in lchars or c in digits or c ==',':
+            self.paramAppend(c)
+            return
+
+        if c == ')':
+            self.paramAppend(c)
+            self.state = 'end_params_0'
+            return
+
+
+        self.msg = 'state %s, bad character %s in string %s' % (self.state,
+                                                                c,
+                                                                self.label)
+        self.state = 'error'
+    
+
+    def end_params_0(self):
+        """Check whether there are more prameters to accumulate"""
+
+        c = self.gc.next()
+
+        # more parameters
+        if c == '(':
+            self.paramAppend(c)
+            self.state = 'params'
+            return
+
+        # end of paramter lists
+        if c == ']':
+            self.tree[-1].parameters = self.parameters.strip()
+            self.parameters = ''
+            self.state = 'end_params'
+            return
+
+        self.msg = 'state %s, bad character %s in string %s' % (self.state,
+                                                                c,
+                                                                self.label)
+        self.state = 'error'
+    
+
+    def end_params(self):
+        """after accumulating params, drop white space, then add node to tree
+        or process next scenario"""
+        
+        c = self.gc.next()
+        
+        if c == ')':
+            self.state = 'end_scenario'
+            return
+        
+        if c in lchars:
+            self.scenAppend(c)
+            self.state = 'scenario'
+            return
+        
+        self.msg = 'state %s, bad character %s in string %s' % (self.state,
+                                                                c,
+                                                                self.label)
+        self.state = 'error'
+        
+    def end_scenario(self):
+        """Add current node to its parent"""
+        
+        n = self.tree.pop()
+        self.tree[-1].add_child(n)
+
+        while True:
+            c = self.gc.next()
+            if c == ')':
+                n = self.tree.pop()
+                self.tree[-1].add_child(n)
+            else:
+
+                # more input means a new scenario is starting
+                self.scenario = c
+                self.parameters = ''
+                self.msg = ''
+                self.state = 'scenario'
+        
+                return    
+
+        
+    def error(self):
+        """From error state, dump error report and raise exception"""
+        
+        print '---error state report ---'
+        print ' state', self.state
+        print ' scenario', self.scenario
+        print ' parameters', self.parameters
+        print ' msg', self.msg
+        print 'state history', self.state_history
+        print ' tree dump:'
+        print self.tree[0].dump()
+        print '--end error state report---'
+        raise RuntimeError('error state')
+    
+    def get_state(self):
+        self.state_history.append(self.state)
+        return self.states[self.state]
+    
+
+    
+    def parse(self):
+        "parse a chain label"
+        
+        error = False
+        terminated = False
+
+        self.start()  # re-initialise
+        
+        try:   # parsing ends with an exception
+            while True:   # continue until exception
+
+                # print 'current state', self.state
+                # print 'current scenario', self.scenario
+                # print 'current parameters', self.parameters
+                
+                # self.states[self.state]()  # process the current state
+                self.get_state()()
+                
+        except StopIteration:  # generator has reached the end of the string
+            print 'parse terminated'
+            terminated = True
+        except AssertionError, e:
+            print 'assertion err'
+            print e
+            error = True
+        except RuntimeError, e:
+            print e
+            error = True
+            
+    
+        if not terminated:
+            s = ''
+            try:
+                while True:
+                    s += self.gc.next()
+            except StopIteration:
+                if s:
+                    print 'error: remaining characters:', s
+     
+        if len(self.tree) != 1:
+            error = True
+            print 'error, stack size', len(self.tree), 'expected 2'
+            print self.state_history
+            
+        if len(self.tree[0].children) != 1:
+            error = True
+            print 'error, top node has %d cdildren, expected 1' % (
+                len(self.tree[0].children))
+
+        final_state = 'end_scenario'
+        if self.state != final_state:
+            error = True
+            print 'error: final state is %s, expected %s' % (self.state,
+                                                             final_state)
+        # print 'tree dump:'
+        # print self.tree[0].dump()
+        print 'parse',
+        if not error:
+            print 'succeeded'
+        else:
+            print 'state: %s scenario: %s parameters: %s stack len %d' % (
+                self.state, self.scenario, self.parameters, len(self.tree))
+            print 'failed'
+
+        # Kludge: mark the tops of the trees. The visitor which
+        # creates Tool instances with give the Tool for this node
+        # the name of the chain
+    
+        for c in self.tree[0].children:
+            c.tree_top = True
+
+        # for now (02/01/2019), no reco. First tree is only tree is hypo
+        return self.tree[0].children[0]
+
+def _test(s):
+    from ChainLabelParser import ChainLabelParser
+    parser = ChainLabelParser(s, debug=True)
+    tree = parser.parse()
+    print tree.dump()
+
+
+def test(index):
+    from test_cases import test_strings
+    c = sys.argv[1]
+    index = -1
+    try:
+        index = int(c)
+    except:
+        print 'expected int in [1,%d] ]on comand line, got %s' % (
+            len(test_strins), c)
+        sys.exit()
+
+    print 'index', index
+    print '========== Test %d ==============' % index
+    s = test_strings[index]
+    print s
+    _test(s)
+
+
+def usage(options):
+    print 'usage: ChainLabelPaers -[%s]' % options
+
+  
+if __name__ == '__main__':
+
+    import getopt, sys
+    from test_cases import test_strings
+    ncases = len(test_strings)
+    try:
+        options = "1234567"
+        opts, args = getopt.getopt(sys.argv[1:], options, [])
+    except getopt.GetoptError as err:
+        # print help information and exit:
+        print str(err) # will print something like "option -a not recognized"
+        usage(options)
+        sys.exit(2)
+
+    assert len(args) == 1
+    o = args[0]
+    try:
+        index = int(o)
+    except:
+        print 'Supply an test case integer index  on the command line '
+        sys.exit(0)
+    
+    if index < 0 or index >= ncases:
+        print 'no such test case ind %d, expect val in [0, %d]'  %(index,
+                                                                   ncases-1)
+        sys.exit(0)
+
+    test(int(o))
+    
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/JetCleanMonitoring.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/JetCleanMonitoring.py
index 8c3975a10cf884f0607143a745c5391eaf7458e4..d4c0a643a61ffe7c4445cbc1e352dfa877a7291a 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/JetCleanMonitoring.py
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/JetCleanMonitoring.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 
 JetChainsToKeepMonitoring={
 #Adding in 2018 for monitoring GSC and large-R
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/ToolSetter.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/ToolSetter.py
new file mode 100644
index 0000000000000000000000000000000000000000..a8ebc14baad803d74f8d04b5e35bd9585d33d7bb
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/ToolSetter.py
@@ -0,0 +1,141 @@
+"""Instantiates AlgTools from paramters stored in a node instance"""
+
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+
+
+
+
+from TrigHLTJetHypo.TrigHLTJetHypoConf import (TrigJetHypoToolConfig_simple,
+                                               TrigJetHypoToolConfig_dijet,
+                                               TrigJetNotToolMT,
+                                               TrigJetAndToolMT,
+                                               TrigJetOrToolMT,
+                                               TrigJetHypoToolMT)
+
+
+class ToolSetter(object):
+    """Visitor to set instantiated AlgTools to a jet hypo tree"""
+    
+    def __init__(self, name, dump_jets=True):
+
+        self.chain_name = name
+        self.dump_jets = dump_jets
+        
+        self.tool_factories = {
+            'simple': [TrigJetHypoToolConfig_simple, 0],
+            'not': [TrigJetNotToolMT, 0],
+            'and': [TrigJetAndToolMT, 0],
+            'or': [TrigJetOrToolMT, 0],
+            'dijet': [TrigJetHypoToolConfig_dijet, 0],
+            }
+
+        self.mod_router = {
+            'not': self.mod_logical_unary,
+            'and': self.mod_logical_binary,
+            'or': self.mod_logical_binary,
+            # 'not': self.mod_logical_unary,
+        }
+
+    def mod_logical_binary(self, node):
+        """Set the HypoConfigTool instance the 'and' and 'or' scenarios
+        these take two predicates"""
+        
+        scen = node.scenario
+        klass = self.tool_factories[scen][0]
+        sn = self.tool_factories[scen][1]
+        name = '%s_%d' % (scen, sn)
+        self.tool_factories[scen][1] += 1
+
+        # kludgy. The name of the tool seen by the trigger must be
+        # the trigger name, so have to figure  out if this is the top
+        # level node (actually first daughter, as the start node is the top)
+        # note that the name can only be set once so have to know
+        # if we are the top of the tree while traversing it. kludgy...
+        # also - will break when using a forest...
+
+        print 'Toolsetter, node.tree_top', node.tree_top
+        if node.tree_top:
+            tool = klass(name=self.chain_name)
+        else:
+            tool = klass(name=name)
+
+        print 'ToolSetter, setting lhs ', node.children[0].tool
+        tool.lhs = node.children[0].tool
+        tool.rhs = node.children[1].tool
+        node.tool = tool
+
+
+    def mod_logical_unary(self, node):
+        """Set the HypoConfigTool instance for the 'not' scenario
+        this takes a single predicate"""
+        
+        scen = node.scenario
+        klass = self.tool_factories[scen][0]
+        sn = self.tool_factories[scen][1]
+        name = '%s_%d' % (scen, sn)
+        self.tool_factories[scen][1] += 1
+
+        # kludgy. The name of the tool seen by the trigger must be
+        # the trigger name, so have to figure  out if this is the top
+        # level node (actually first daughter, as the start node is the top)
+        # note that the name can only be set once so have to know
+        # if we are the top of the tree while traversing it. kludgy...
+        # also - will break when using a forest...
+
+        print 'Toolsetter, node.tree_top', node.tree_top
+        if node.tree_top:
+            tool = klass(name=self.chain_name)
+        else:
+            tool = klass(name=name)
+
+        print 'ToolSetter, setting lhs ', node.children[0].tool
+        tool.hypoTool = node.children[0].tool
+        node.tool = tool
+                               
+
+                               
+    def mod_simple(self, node):
+        """Set the HypoConfigTool instance in a hypo tree node"""
+
+        scen = node.scenario
+        klass = self.tool_factories[scen][0]
+        sn = self.tool_factories[scen][1]
+        name = '%s_%d' % (scen, sn)
+        
+        self.tool_factories[scen][1] += 1
+
+        config_tool = klass(name=name+'_config')
+        [setattr(config_tool, k, v) for k, v in node.conf_attrs.items()]
+        
+        # kludgy. The name of the tool seen by the trigger must be
+        # the trigger name, so have to figure  out if this is the top
+        # level node (actually first daughter, as the start node is the top)
+        # note that the name can only be set once so have to know
+        # if we are the top of the tree while traversing it. kludgy...
+        # also - will break when using a forest...
+        print 'Toolsetter, node.tree_top', node.tree_top
+        if node.tree_top:
+            tool = TrigJetHypoToolMT(name=self.chain_name)
+        else:
+            tool = TrigJetHypoToolMT(name=name)
+            
+        tool.HypoConfigurer = config_tool
+        tool.dumpJets  = self.dump_jets
+        node.tool = tool
+                               
+    def mod(self, node):
+        """Set the HypoConfigTool instance according to the scenario.
+        Note: node.accept must perform depth first navigation to ensure
+        child tools are set."""
+        
+        self.mod_router.get(node.scenario, self.mod_simple)(node)
+
+    def report(self):
+        wid = max(len(k) for k in self.tool_factories.keys())
+        rep = '\n%s: ' % self.__class__.__name__
+
+        rep += '\n'.join(
+            ['%s: %d' % (k.ljust(wid), v[1])
+             for k, v in self.tool_factories.items()])
+
+        return rep
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigEFDPhiMetJetAllTEConfig.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigEFDPhiMetJetAllTEConfig.py
index 139d3a1f6932f798fdb81a020397a5391b3a8b51..4a26b827f7ceee6f34f2a133fb5ead3059f4696a 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigEFDPhiMetJetAllTEConfig.py
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigEFDPhiMetJetAllTEConfig.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 
 from TrigHLTJetHypo.TrigHLTJetHypoConf import TrigEFDPhiMetJetAllTE
 from TrigHLTJetHypo.TrigEFDPhiMetJetAllTEMonitoring import (
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigEFDPhiMetJetAllTEMonitoring.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigEFDPhiMetJetAllTEMonitoring.py
index 6fce97bf28e3f500ff5036fa5696c0e4bee23da2..22a6fdac69e4561bfa6e7e4368ff7e1440319c69 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigEFDPhiMetJetAllTEMonitoring.py
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigEFDPhiMetJetAllTEMonitoring.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 
 from TrigMonitorBase.TrigGenericMonitoringToolConfig import defineHistogram, TrigGenericMonitoringToolConfig
 
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigEFRazorAllTEConfig.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigEFRazorAllTEConfig.py
index c78a4697f879c0e712af3355863672e7e9b66032..da8d3fc9aff68966a6bd7047467a0986acec6e84 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigEFRazorAllTEConfig.py
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigEFRazorAllTEConfig.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 
 from TrigHLTJetHypo.TrigHLTJetHypoConf import TrigEFRazorAllTE
 from TrigHLTJetHypo.TrigEFRazorAllTEMonitoring import (
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigEFRazorAllTEMonitoring.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigEFRazorAllTEMonitoring.py
index a23572ddd8b233874c9331371507c6f36e741562..eb38b3a0e6b4fd6e8901f0111e4633cf0e814932 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigEFRazorAllTEMonitoring.py
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigEFRazorAllTEMonitoring.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 
 from TrigMonitorBase.TrigGenericMonitoringToolConfig import defineHistogram, TrigGenericMonitoringToolConfig 
         
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigHLTJetHypo2Monitoring.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigHLTJetHypo2Monitoring.py
index 80436837178eff92c9bb2abd6ab6c4da31f8d5a0..b1b383a1cc007312c8d1993903e8fc853f8eaa3d 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigHLTJetHypo2Monitoring.py
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigHLTJetHypo2Monitoring.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 
 from TrigMonitorBase.TrigGenericMonitoringToolConfig import defineHistogram, TrigGenericMonitoringToolConfig
 
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigHLTJetHypoConfig.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigHLTJetHypoConfig.py
index 3e7b3e407a860eeda46ade409bd4bae5593226de..1d974624f301a91b0bbd46c8984a901e059d5721 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigHLTJetHypoConfig.py
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigHLTJetHypoConfig.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 
 # from TrigHLTJetHypo.TrigHLTJetHypoConf import TrigHLTJetHypo
 import  TrigHLTJetHypoConf
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigJetHypoToolConfig.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigJetHypoToolConfig.py
index 538ed52e796f81595f6603c76ec0bd958d7eb434..11b29338d4a137240069d7f2b30bfac4aca68f59 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigJetHypoToolConfig.py
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/TrigJetHypoToolConfig.py
@@ -1,67 +1,75 @@
-from TrigHLTJetHypo.TrigHLTJetHypoConf import TrigJetHypoToolMT, TrigJetHypoToolConfig_EtaEt
-import re
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 
-re_EtEta0 = re.compile(
-    r'^HLT_j(?P<thresh>\d+)(_(?P<etalo>\d{3})eta(?P<etahi>\d{3}))?$')
-# re_EtEta1 = re.compile(r'^HLT_j\d+(_\d{1-3}eta\d{3})?_L1')
-# re_EtEta2 = re.compile(r'^HLT_j\d+(_\d{3}eta\d{3})?_(jes|nojcalib|lcw)*$')
+from TrigHLTJetHypo.TrigHLTJetHypoConf import (TrigJetHypoToolMT,
+                                               TrigJetHypoToolConfig_EtaEt)
 
+from  TrigHLTJetHypo.ToolSetter import ToolSetter
+from  TrigHLTJetHypo.treeVisitors import TreeParameterExpander
+from  TrigHLTJetHypo.chainDict2jetLabel import (make_simple_label,
+                                                make_vbenf_label)
+from  TrigHLTJetHypo.ChainLabelParser import ChainLabelParser
 
-def decodeEtEta(match, chain):
-    """Create a hypo tool for the Et - Eta scenario"""
-    default = {'etalo': '0', 'etahi': '320'}
-    conf_dict = match.groupdict()
-    for k, v in default.items():
-        if k not in conf_dict: conf_dict[k] = v
-        if conf_dict[k] is None: conf_dict[k] = v
+from GaudiKernel.Constants import (VERBOSE,
+                                   DEBUG,
+                                   INFO,
+                                   WARNING,
+                                   ERROR,
+                                   FATAL,)
 
-    conf_tool = TrigJetHypoToolConfig_EtaEt(name=chain+"config")
-    conf_tool.EtThresholds = [float(conf_dict['thresh'])]
-    conf_tool.eta_mins = [float(conf_dict['etalo'])]
-    conf_tool.eta_maxs = [float(conf_dict['etahi'])]
-    conf_tool.asymmetricEtas = [0]
-    conf_tool.OutputLevel = 0
-    return conf_tool
 
+def  trigJetHypoToolFromDict(chain_dict):
+    """Produce  a jet trigger hypo tool from a chainDict"""
 
-def  trigJetHypoToolFromDict(chainDict):
-    return trigJetHypoToolFromName( chainDict['chainName'], chainDict['chainName'])
+    print 'trigJetHypoToolFromDict starts'
+    chain_label = ''    
+    if 'vbenf' in chain_dict['chainParts'][0]['hypoScenario']:
+        assert len(chain_dict['chainParts']) == 1
+        chain_label = make_vbenf_label(chain_dict)
+    else:
+        chain_label = make_simple_label(chain_dict)
+    parser = ChainLabelParser(chain_label)
+    tree = parser.parse()
 
-def  trigJetHypoToolFromName(name, jetconfig):
-    """Configure a jet hypo tool from chain name.
+    #expand strings of cuts to a cut dictionary
+    visitor = TreeParameterExpander()
+    tree.accept(visitor)
+    visitor.report()
 
-    Delegate to functions according to the hypo scenartio."""
-    scenario_dict = {re_EtEta0: decodeEtEta}
+    # create - possibly nested - tools
 
-    chain = jetconfig
-    for k, v in scenario_dict.items():
-        match = k.match(chain)
-        if match:
-            hypo_tool = TrigJetHypoToolMT(chain)
-            hypo_tool.HypoConfigurer = v(match, chain)
-            return hypo_tool
+    # chain name in run 2 dicts were missing the 'HLT_' prefix
+    # but it seems it is necessary to run the hypos in AthenaMT ?...?
+    
+    chain_name = chain_dict['chainName']
+    if not chain_name.startswith('HLT_'):
+        chain_name = 'HLT_' + chain_name
 
-    msg = 'trigJetHypoToolFromName(%s) - decode error' % chain
-    raise NotImplementedError(msg)
+    print 'trigJetHypoToolFromDict chain_name', chain_name
+    visitor = ToolSetter(chain_name)
+    tree.accept(visitor)
+    visitor.report()
+
+    print 'Dumping jet config for', chain_name
+    print tree.dump()
+    tool = tree.tool
+    tool.OutputLevel = DEBUG
+    return tool
 
 
 import unittest
 class TestStringMethods(unittest.TestCase):
     def testValidConfigs(self):
-        # EtaEt hypos
-        # from MC_pp_v7 import  TriggerFlags.JetSlice.signatures
-        # exception or any other issue will make the ctest for this package fail
-        chains = ('HLT_j85', 'HLT_j35_320eta490')
-        wid = max(len(c) for c in chains)
-        for c in chains:
-            tool = trigJetHypoToolFromName(c, c)
-            self.assertIsNotNone( tool ) 
-            print '%s' % c.rjust(wid), tool
-
-    def testInvalidConfig(self):
-        with self.assertRaises(NotImplementedError):
-            tool = trigJetHypoToolFromName('HLT_nonsense', 'HLT_nonsense')
+        from TriggerMenuMT.HLTMenuConfig.Menu import DictFromChainName
 
+        chainNameDecoder = DictFromChainName.DictFromChainName()
+        # chain_names = ('HLT_j85', 'HLT_j35_0eta320')
+        chain_names = ('HLT_j0hs_vbenf',)
+        wid = max(len(c) for c in chain_names)
+        for chain_name in chain_names:
+            chain_dict = chainNameDecoder.getChainDict(chain_name)
+            tool = trigJetHypoToolFromDict(chain_dict)
+            self.assertIsNotNone(tool) 
+            print '%s' % chain_name.rjust(wid), tool
 
 if __name__ == '__main__':
     unittest.main()
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/__init__.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/__init__.py
index 74583d364ec2ca794156596c7254d9b234a940c6..bbfc91ea870d6a91a2669d68ce4efee4c35c727d 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/__init__.py
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/__init__.py
@@ -1,2 +1,2 @@
-# Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/chainDict2jetLabel.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/chainDict2jetLabel.py
new file mode 100644
index 0000000000000000000000000000000000000000..8b51539d39e0934b2918b7e32d4319f635996f41
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/chainDict2jetLabel.py
@@ -0,0 +1,108 @@
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+
+import re
+
+# substrings that cannot occur in any chainPartName for simple chains.
+reject_substr = (
+    'gsc',
+    'ion',
+    'dphi',
+    'deta',
+    'invm',
+    '0i1',
+    '1i2',
+    'dphi',
+    'ht\d',)
+
+reject_substr_res = re.compile(r'%s' % '|'.join(reject_substr))
+
+
+def select_simple_chains(cd):
+    """Select chains for which to make an simple chain label.
+
+    Chains selected by reuiring that the signature os 'Jet'. Chains are
+    vetoed if specific substrings occur in any of the chainPartNames"""
+
+
+    # print cd
+    # assert False
+    chain_parts = [c for c in cd['chainParts'] if c['signature'] == 'Jet']
+    chain_name = cd['chainName']
+                       
+    for cp in chain_parts:
+        if  reject_substr_res.search(cp['chainPartName']):
+            return []
+
+    return chain_parts
+
+
+def make_simple_label(chain_dict):
+    """Marshal information deom the selected chainParts to create a
+    'simple' label.
+    """
+    
+    cps = select_simple_chains(chain_dict)
+    if not cps:
+        raise NotImplementedError(
+            'chain fails substring selection: not "simple": %s' % (
+                chain_dict['chainName']))
+    
+    label = 'simple(['
+    for cp in cps:
+        smcstr =  str(cp['smc'])
+        if smcstr == 'nosmc':
+            smcstr = ''
+        for i in range(int(cp['multiplicity'])):
+            # condition_str = '(%set,%s,%s)' % (str(cp['threshold']),
+            #                                  str(cp['etaRange']),
+            #                                  smcstr,)
+            condition_str = '(%set,%s' % (str(cp['threshold']),
+                                              str(cp['etaRange']),)
+            if smcstr:
+                condition_str += ',%s)'
+            else:
+                condition_str += ')'
+            label += condition_str
+    label += '])'
+    return label
+
+
+def select_vbenf_chains(cd):
+    """Select chains for which to make a vbenf chain label.
+    Chains selected by reuiring that the signature os 'Jet'. Chains are
+    vetoed if specific substrings occur in any of the chainPartNames"""
+
+
+    # print cd
+    # assert False
+    chain_parts = [c for c in cd['chainParts'] if c['signature'] == 'Jet']
+    return any(['vbenf' in cp['chainPartName'] for cp in chain_parts])
+
+def make_vbenf_label(chain_dict):
+    """Marshal information from the selected chainParts to create a
+    vbenf label.
+    """
+
+    # toy label for developement: run simple and dijet independently.
+    # simple makes Et cuts on two jets. Independently (sharing possible)
+    # of jets choosean by simple,  the dijet
+    # scenario requires a dijet of mass > 900, and opening angle in phi > 2.6
+               
+    return 'and([] simple([(50et)(70et)])dijet([(900mass, 26dphi)]))'
+
+if __name__ == '__main__':
+    """Read chainDicts from files, cread simple label if possible"""
+    from chainDictSource import chainDictSource
+
+    for cd in chainDictSource():
+        f = cd['chainName']
+        print '\n---------'
+        print f
+        try:
+            label = make_simple_label(cd)
+        except Exception, e:
+            print e
+            continue
+        
+        print 'chain label', label
+        print '-----------\n'
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/chainDictDumper.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/chainDictDumper.py
new file mode 100644
index 0000000000000000000000000000000000000000..f4702a0b48ad766f07ffab44bfc1493a37666457
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/chainDictDumper.py
@@ -0,0 +1,24 @@
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+
+from TriggerMenuMT.HLTMenuConfig.Menu import DictFromChainName
+from TriggerMenuMT.HLTMenuConfig.Menu.SignatureDicts import JetChainParts
+import sys
+
+from pprint import PrettyPrinter
+
+pp = PrettyPrinter(indent=4)
+pp.pprint(JetChainParts)
+
+decodeChainName = DictFromChainName.DictFromChainName()
+
+def do_it():
+    print '\n------------------\n'
+    chain_dict = decodeChainName.getChainDict(chain_name)
+    pp.pprint(chain_dict)
+
+if __name__ == '__main__':
+    chain_name = sys.argv[1]
+    do_it()
+    # chain_names = ('HLT_j85', 'j85', 'HLT_j55_0eta320_2j20_0eta320',)
+    # for chain_name in chain_names:
+    #      do_it()
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/constants.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/constants.py
new file mode 100644
index 0000000000000000000000000000000000000000..10b599fea3161ccc3a1c21390ea541c3874a40cf
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/constants.py
@@ -0,0 +1,8 @@
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+
+lchars = 'abcdefghijklmnopqrstuvwxyz'
+digits = '0123456789'
+delims = '()[],'
+logicals = ('and', 'or', 'not')
+alphabet = lchars + digits + delims
+
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/node.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/node.py
new file mode 100644
index 0000000000000000000000000000000000000000..0bf89908673067c2adc6b16468c3e986eac5ae0a
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/node.py
@@ -0,0 +1,71 @@
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+
+from constants import logicals
+    
+class Node(object):
+    
+    def __init__(self, scenario):
+        self.scenario = scenario
+        self.parameters = ''
+        self.children = []
+        self.conf_attrs = {}
+        self.tool = None
+
+        # self.tree_top kludge carensure top level tools get chain name
+        # as Tool name
+        self.tree_top = False
+
+    def add_child(self, c):
+        self.children.append(c)
+        
+    def accept(self, modifier):
+        "call self before children"
+
+        modifier.mod(self)
+        for c in self.children:
+            c.accept(modifier)
+
+    def accept_cf(self, modifier):
+        "call children before self"
+        
+        for c in self.children:
+            c.accept_cf(modifier)
+        modifier.mod(self)
+
+    def makeTool(self):
+        if self.scenario not in logicals:
+            self.tool = DummyTool(self.toolName)
+            
+    def buildTree(self, treeVisitor):
+        if self.children:
+            if self.scenario in logicals:
+                treeVisitor.add(self.scenario + '(')
+            else: 
+                treeVisitor.add(self.tool.name() + '(')
+                
+            for c in self.children:
+                c.buildTree(treeVisitor)
+            treeVisitor.add(') ')
+
+        else:
+            treeVisitor.add(self.tool.name() + ' ')
+            
+
+    
+        return s
+        
+    def dump(self, n_in=0):
+        indent = ' '*n_in
+        s = '\n'
+        s =  indent + 'Node. scenario: %s \n' % self.scenario
+        s +=  indent + 'is tree top? %s \n' % self.tree_top
+        s += indent + 'parameters: %s\n' % str(self.parameters)
+        s += indent + 'conf_attrs: %s\n' % str(self.conf_attrs)
+        s += indent + 'AlgTool: %s\n' % str(self.tool)
+        # s += indent + 'AlgTool dict: %s\n' % str(self.tool.__dict__)
+        s += indent + 'No of children: %d\n\n' % len(self.children)
+        for c in self.children:
+            s += c.dump(n_in+5)
+
+        return s
+        
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/test_cases.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/test_cases.py
new file mode 100644
index 0000000000000000000000000000000000000000..b928116d28da22f14a28bd3e9f84785895ede577
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/test_cases.py
@@ -0,0 +1,72 @@
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+
+test_strings = [
+    'ijet([(10et, 0eta320)])',
+     'ijet([(10et, 0eta320)(20et, 0eta320)])',
+    # 'or([] ijet([10et]) and([] ijet([20et]) ijet([30et])))',
+    'or([] ijet([(10et)]) ijet([(20et)(40et)]))',
+    'and([] ijet([(10et)]) ijet([(20et)]))',
+    'not([] ijet([(10et)]) )',
+    'not([] and([] ijet([(40et, 0eta320)]) ijet([(100et, 0eta320)])))',
+    'or([] not([] ijet([(40et, 0eta320)])) not([] ijet([(100et, 0eta320)])))',
+    'or([] and([] ijet([(40et, 0eta320)]) ijet([(40et, 0eta320)])) not([] ijet([(100et, 0eta320)])))',
+
+
+
+"""
+partition     
+(
+  [(4,2)]   # partition 6 input jets to 4, 2 
+  splitter  # send the 4s to first 2 children, 2 to third.
+    assert len(o) == 1
+  (
+    [(1,1)(2)]
+    sum # mass cut on sum of input jets (ord.=4)
+    (
+      [(800m900)]
+    )
+    partition        #  partition 4 jets into non-overlapping
+                     #  sets ord 2, 2
+    (
+      [(2,2)]
+      pair           # sum inputs, apply deta cut to the 2 sums
+      (
+        [(40deta)]
+        sum          # child gets two lists, applys mass cuts
+        ( 
+          [(75m85)(80m90)]
+          partition  # passes on 2 sum to regroup to single jets
+          (
+            [() (1)]
+            ijet     # apply aoverlapping mod, et cuts
+            (
+              [(30width50, 30et) (35width45, 40et)]
+            )
+          )
+        )
+      )
+    )
+  )
+               
+  ijet([(p320etap500, 100et) (n500etan320)]),
+)""",
+
+
+#     """cascade(
+#    [800m900]             # conditions for cascade (only one here)
+#      dijet(              # first daughter scenario
+#        [ 80m90]          # condition(s) for first daughter scenario
+#         ijet([10et])     # grandaughter scenario 1 for first daugh scen.
+#         ijet([20et])     # grandaughter scenario 2 for first daugh scen.
+#           )              # end of first dijet scenario 
+#      dijet(              # second daughter scenario
+#        [85m95]
+#          ijet([30et]) 
+#          ijet([40et])
+#            )             # end of second dijet scenario
+#    )                     # end of cascade scenario
+#    """
+
+    'and([] ijet([(50et)(70et)]) dijet([(900mass, 26dphi)]))',
+    'and([]simple([(50et)(70et)])dijet([(900m,26dphi)]))',
+]
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/python/treeVisitors.py b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/treeVisitors.py
new file mode 100644
index 0000000000000000000000000000000000000000..d1d5757e5812bee635e17d93e2a625d8c11152c1
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/python/treeVisitors.py
@@ -0,0 +1,394 @@
+# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+
+from constants import lchars
+
+import re
+import math
+
+from ToolSetter import ToolSetter
+class Checker(object):
+    def __init__(self):
+        self.known = {
+            'simple': ('Et'),
+            'cascade': ('m')
+        }
+
+        self.msgs = []
+        self.nchecked = 0
+
+    def mod(self, node):
+        self.nchecked += 1
+        if node.scenario not in self.known:
+            self.msgs.append('unknown scenario %s' % node.scenario)
+    
+    def report(self):
+        s = ['Checker: %d nodes checked' % self.nchecked]
+        s.extend(self.msgs)
+        return '\n'.join(s)
+
+
+class TreeBuilder(object):
+    def __init__(self):
+        self.tree = '('
+        
+    def add(self, s):
+        self.tree += s
+
+    def report(self):
+        return self.tree
+
+
+class TreeToBooleanExpression(object):
+    """visit a hypo tree. If boolean scenarios are present, build a
+    boolean expression string."""
+    
+    def __init__(self):
+        self.stack = []
+
+    def mod(self, node):
+        if node.scenario == 'not':
+            self.stack.append(' ! ')
+            return
+
+        if node.scenario == 'and':
+            self.stack.append(' x ')
+            return
+
+        if node.scenario == 'or':
+            self.stack.append(' + ')
+            return
+
+        self.stack.append(' %s ' %node.tool.name())
+
+    def report(self):
+        s = '%s: ' % self.__class__.__name__
+        while self.stack: s += self.stack.pop()
+        return s.strip()
+
+
+class TreeParameterExpander_simple(object):
+    """Convert parameter string into duction holding low, high window
+    cut vals. Specialistaion for the 'simple' scenario
+
+    parameter strings look like '40et, 0eta320, nosmc'
+    """
+    
+    window_re = re.compile(
+        r'^(?P<lo>\d*)(?P<attr>[%s]+)(?P<hi>\d*)' % lchars)
+
+    defaults = {'etalo': 0.0,
+                'etahi': 3.2,
+    }
+
+    scale_factors = {'eta': 0.01,
+                     'et': 1000.,
+                     'smc': 1000.,
+    }
+
+    def __init__(self):
+        self.msgs = []
+
+    def mod(self, node):
+
+        def get_conditions(params):
+            """Split conditions string into list of condition strings
+            Condition string looks like
+            '(10et,0eta320)(20et,0eta320)(40et,0eta320)'
+            returned is ['10et,0eta320', '20et,0eta320', '40et,0eta320']
+            """
+
+            alphabet = 'abcdefghijklmnopqrstuvwxyz0123456789,'
+            pat = re.compile(r'(^\([%s]+\))'% alphabet )
+            s = params
+            m = True
+            conditions = []
+            while m:
+                m = pat.match(s)
+                if m is not None:
+                    conditions.append(m.group(0))
+                    s = s[len(conditions[-1]):]
+            assert params == ''.join(conditions)
+            conditions = [c[1:-1] for c in conditions]  # strip parens
+            return conditions
+
+
+        conditions = get_conditions(node.parameters)
+
+        
+        node.conf_attrs['EtThresholds'] = []
+        node.conf_attrs['eta_mins'] = []
+        node.conf_attrs['eta_maxs'] = []
+        node.conf_attrs['asymmetricEtas'] = []
+
+        for c in conditions:
+            toks = c.split(',')
+            toks = [t.strip() for t in toks]
+
+
+            for t in toks:
+                m = self.window_re.match(t)
+                if m is None:
+                    self.msgs.append('match failed for parameter %s' % t)
+                    return
+                group_dict = m.groupdict()
+                attr = group_dict['attr']
+                lo = group_dict['lo']
+                hi = group_dict['hi']
+                if lo == '':
+                    lo = self.defaults.get(attr+'lo', '')
+                if hi == '':
+                    hi = self.defaults.get(attr+'hi', '')
+
+                sf = self.scale_factors[attr]
+                if lo:
+                    if attr == 'eta':
+                        node.conf_attrs['eta_mins'].append(sf * float(lo))
+                    elif attr == 'et':
+                        node.conf_attrs['EtThresholds'].append(sf * float(lo))
+                if hi:
+                    if attr == 'eta':
+                        node.conf_attrs['eta_maxs'].append(sf * float(hi))
+                
+        #01/01/2019 PS  KLUDGE !! FIX ME!!!  asymmetric eta hardwired to 0.
+
+        [node.conf_attrs['asymmetricEtas'].append(0) for i in range(
+                len(conditions))]
+        self.msgs = ['All OK']
+
+        
+    def report(self):
+        return '%s: ' % self.__class__.__name__ + '\n'.join(self.msgs) 
+
+    
+
+
+class TreeParameterExpander_dijet(object):
+    """Convert parameter string into duction holding low, high window
+    cut vals. Specialistaion for the dijet scenario
+
+    parameter strings look like '40m,100deta200, 50dphi300'
+    """
+    
+    window_re = re.compile(
+        r'^(?P<lo>\d*)(?P<attr>[%s]+)(?P<hi>\d*)' % lchars)
+
+    defaults = {'mass_mins': 0.0,
+                'mass_maxs': 100000.,
+                'deta_mins': 0.,
+                'deta_maxs': 20.,
+                'dphi_mins': 0.,
+                'dphi_maxs': math.pi,
+    }
+
+    scale_factors = {'deta': 0.01,
+                     'mass': 1000.,
+                     'dphi': 0.01,
+    }
+
+    def __init__(self):
+        self.msgs = []
+
+    def mod(self, node):
+
+        def get_conditions(params):
+            """Split conditions string into list of condition strings
+            Condition string looks like
+            '(75m85,100dEta200, 50dphi200)(80m90, 110dEta210)'
+            returned is ['10et,0eta320', '20et,0eta320', '40et,0eta320']
+            """
+
+            alphabet = 'abcdefghijklmnopqrstuvwxyz0123456789,'
+            pat = re.compile(r'(^\([%s]+\))'% alphabet )
+            s = params
+            m = True
+            conditions = []
+            while m:
+                m = pat.match(s)
+                if m is not None:
+                    conditions.append(m.group(0))
+                    s = s[len(conditions[-1]):]
+            assert params == ''.join(conditions)
+            conditions = [c[1:-1] for c in conditions]  # strip parens
+            return conditions
+
+        ok = True # status flag
+        conditions = get_conditions(node.parameters)
+
+        bare_attrs = ['mass', 'deta', 'dphi']
+        all_attrs = []
+        for attr in bare_attrs:
+            all_attrs.extend([attr+'_mins', attr+'_maxs'])
+
+        for attr in all_attrs:
+            node.conf_attrs[attr] = []
+
+        for c in conditions:
+            toks = c.split(',')
+            toks = [t.strip() for t in toks]
+
+
+            processed_attrs = []
+            for t in toks:
+                m = self.window_re.match(t)
+                if m is None:
+                    self.msgs.append('match failed for parameter %s' % t)
+                    return
+                group_dict = m.groupdict()
+                attr = group_dict['attr']
+                lo = group_dict['lo']
+                hi = group_dict['hi']
+                if lo == '':
+                    lo = self.defaults.get(attr+'_min', '')
+                if hi == '':
+                    hi = self.defaults.get(attr+'_max', '')
+
+                sf = self.scale_factors[attr]
+                if lo:
+                    if attr == 'mass':
+                        node.conf_attrs['mass_mins'].append(sf * float(lo))
+                    elif attr == 'deta':
+                        node.conf_attrs['deta_mins'].append(sf * float(lo))
+                    elif attr == 'dphi':
+                        node.conf_attrs['dphi_mins'].append(sf * float(lo))
+
+                    processed_attrs.append(attr+'_mins')
+                if hi:
+                    if attr == 'mass':
+                        node.conf_attrs['mass_maxs'].append(sf * float(lo))
+                    elif attr == 'deta':
+                        node.conf_attrs['deta_maxs'].append(sf * float(lo))
+                    elif attr == 'dphi':
+                        node.conf_attrs['dphi_maxs'].append(sf * float(lo))
+
+                    processed_attrs.append(attr+'_maxs')
+
+
+
+            for a in all_attrs:
+                if a not in processed_attrs:
+                    node.conf_attrs[a].append(self.defaults[a])
+
+            for a in processed_attrs:
+                if a not in all_attrs:
+                    self.msgs.append('Unknown attribute: %s' % a)
+                    ok = False
+
+        if ok:
+            self.msgs = ['All OK']
+        else:
+            self.msgs.append('Error')
+
+        
+    def report(self):
+        return '%s: ' % self.__class__.__name__ + '\n'.join(self.msgs) 
+
+    
+class TreeParameterExpander_null(object):
+    """Does nothing except check the parameter string is empty"""
+
+    def __init__(self):
+        self.msgs = ['Do nothing paramter expander']
+
+    def mod(self, node):
+        assert node.parameters == ''
+        
+    def report(self):
+        return '%s: ' % self.__class__.__name__ + '\n'.join(self.msgs) 
+    
+
+
+class TreeParameterExpander(object):
+    """Class to exapnder node.paramters string. Delegates to
+    specialised exanders."""
+    
+    router = {
+        'simple': TreeParameterExpander_simple,
+        'dijet': TreeParameterExpander_dijet,
+        'not': TreeParameterExpander_null,
+        'and': TreeParameterExpander_null,
+        'or': TreeParameterExpander_null,
+    }
+
+    def __init__(self):
+        self.expander = None
+
+    def mod(self, node):
+        self.expander = self.router[node.scenario]()
+        self.expander.mod(node)
+        print self.expander.report()
+    def report(self):
+        return self.expander.report()
+        
+
+
+class TreeToCascade(object):
+    def __init__(self):
+        self.stack = []
+
+    def mod(self, node):
+        
+        self.stack.append(
+            '(%s < (%s))' %(node.tool.name(), 
+                            ' '.join([c.tool.name  for c in node.children])))
+
+    def report(self):
+        s = ''
+        while self.stack:
+            s += self.stack.pop()
+        return s.strip()
+
+
+def _test(s):
+
+    from ChainLabelParser import ChainLabelParser
+    parser = ChainLabelParser(s)
+    tree = parser.parse()
+    print tree.dump()
+    # exapnd the window cuts (strings) obtained from the chain label
+    # to attributes and floating point numbers, set defaults
+    # for unspecified vallues
+    visitor = TreeParameterExpander()
+    tree.accept(visitor)
+    print visitor.report()
+    print tree.dump()
+
+
+    # set the node attribute node.tool to be the hypo  Al\gTool.
+    print 'sending in the ToolSetter visitor'
+    ts_visitor = ToolSetter(s)
+    tree.accept_cf(ts_visitor)
+    print ts_visitor.report()
+
+
+    print tree.dump()
+
+
+def test(index):
+    from test_cases import test_strings
+    import sys
+    c = sys.argv[1]
+    index = -1
+    try:
+        index = int(c)
+    except:
+        print 'expected int in [1,%d] ]on comand line, got %s' % (
+            len(test_strings), c)
+        sys.exit()
+
+    print 'index', index
+    print '========== Test %d ==============' % index
+    s = test_strings[index]
+    print s
+    _test(s)
+
+
+if __name__ == '__main__':
+    import sys
+    c = sys.argv[1]
+    ic = -1
+    try:
+        ic = int(c)
+    except:
+        print 'expected int on command line, got ',c
+        sys.exit()
+    test(ic)
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/ITrigJetHypoToolConfig.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/ITrigJetHypoToolConfig.h
index 4a0a65fb6ec97383c1c1f64d9bbda301904ebef6..d49d5758f3d431d47cc22e250e09deea356513bf 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/ITrigJetHypoToolConfig.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/ITrigJetHypoToolConfig.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 #ifndef TRIGHLTJETHYPO_ITRIGJETHYPOTOOLCONFIG_H
 #define TRIGHLTJETHYPO_ITRIGJETHYPOTOOLCONFIG_H
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/ITrigJetHypoToolMT.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/ITrigJetHypoToolMT.h
index b0f4844ef05ae3bd36579e837d882d09a9f589ad..72d438ef5f5afba641e03b6c147a66fb20ef6c7b 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/ITrigJetHypoToolMT.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/ITrigJetHypoToolMT.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef TRIGHLTJETHYPO_ITRIGJETHYPOTOOLMT_H
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigEFDPhiMetJetAllTE.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigEFDPhiMetJetAllTE.cxx
index a7c547ca2ee7cb58c1652d82376e5d68599cae74..e027e7ba83a85cc17453f7c6a9e4ee95e9951d5b 100755
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigEFDPhiMetJetAllTE.cxx
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigEFDPhiMetJetAllTE.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 // ********************************************************************
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigEFRazorAllTEHypo.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigEFRazorAllTEHypo.cxx
index 85e06ce328c3790ec35c1e42624496c5e67d74bb..552911a8e0ba677ec3acae93d7e5ad3051b7321f 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigEFRazorAllTEHypo.cxx
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigEFRazorAllTEHypo.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 // ********************************************************************
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoBase.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoBase.cxx
index 4300b37cbba9e7f5631ef169efb910afc5befdf2..90966c1bec3f3691c1ffd67e40306d69c121017b 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoBase.cxx
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoBase.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 // ********************************************************************
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/DijetCondition.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/DijetCondition.cxx
index 35928de193f6a74b720f05e1bcd4c84035131101..e7c8cec34a7af936cf4a02eda261263e03a046e9 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/DijetCondition.cxx
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/DijetCondition.cxx
@@ -7,6 +7,8 @@
 #include <stdexcept>
 #include <TLorentzVector.h>
 #include <limits>
+#include "GaudiKernel/SystemOfUnits.h"
+
 // #include <iostream>
 DijetCondition::DijetCondition(
                                double etThreshold0,
@@ -56,8 +58,10 @@ bool DijetCondition::isSatisfied(const HypoJetVector& ips) const{
 
 bool DijetCondition::passJetCuts(pHypoJet j0, pHypoJet j1) const {
 
-  auto et0 = 0.001 * j0->et();
-  auto et1 = 0.001 * j1->et();
+  constexpr double invGeV = 1./Gaudi::Units::GeV;
+
+  auto et0 = j0->et() * invGeV;
+  auto et1 = j1->et() * invGeV;
 
   auto eta0 =  j0->eta();
   auto eta1 =  j1->eta();
@@ -78,9 +82,9 @@ bool DijetCondition::passJetCuts(pHypoJet j0, pHypoJet j1) const {
 
 bool DijetCondition::passDijetCuts(pHypoJet j0, pHypoJet j1) const {
 
-
-  auto rj0 = 0.001 * (j0 -> p4());
-  auto rj1 = 0.001 * (j1 -> p4());
+  constexpr double invGeV = 1./Gaudi::Units::GeV;
+  auto rj0 = (j0 -> p4()) * invGeV;
+  auto rj1 = (j1 -> p4()) * invGeV;
 
   auto mass = (rj0 + rj1).M();
   if (m_massMin > mass or mass >= m_massMax){return false;}
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/DijetMTCondition.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/DijetMTCondition.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..6bfcae17c877a37e2bfc268258460ec880a67f0b
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/DijetMTCondition.cxx
@@ -0,0 +1,87 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetMTCondition.h"
+#include <sstream>
+#include <stdexcept>
+#include <TLorentzVector.h>
+#include <limits>
+// #include <iostream>
+DijetMTCondition::DijetMTCondition(double massMin,
+                                   double massMax,
+                                   double detaMin,
+                                   double detaMax,
+                                   double dphiMin,
+                                   double dphiMax
+                                   ){
+  m_massMin = massMin;
+  m_massMax = massMax;
+  m_detaMin = detaMin;
+  m_detaMax = detaMax;
+  m_dphiMin = dphiMin;
+  m_dphiMax = dphiMax;
+}
+
+
+bool DijetMTCondition::isSatisfied(const HypoJetVector& ips) const{
+  if(ips.size() != 2){
+    std::stringstream ss;
+    ss << "DijetMT::isSatisfied must see exactly 2 particles, but received "
+       << ips.size()
+       << '\n';
+    
+    throw std::runtime_error(ss.str());
+  }
+
+  auto j0 = ips[0];
+  auto j1 = ips[1];
+
+  auto rj0 = 0.001 * (j0 -> p4());
+  auto rj1 = 0.001 * (j1 -> p4());
+
+  auto mass = (rj0 + rj1).M();
+  if (m_massMin > mass or mass >= m_massMax){return false;}
+
+  
+  auto eta0 =  j0->eta();
+  auto eta1 =  j1->eta();
+  auto adeta = std::abs(eta0 -eta1);
+  if (m_detaMin > adeta or adeta >= m_detaMax){return false;}
+
+
+  auto dphi = std::abs(rj0.DeltaPhi(rj1));
+  if (m_dphiMin > dphi or dphi >= m_dphiMax){return false;}
+
+  return true;
+
+}
+
+std::string DijetMTCondition::toString() const noexcept {
+  std::stringstream ss;
+  ss << "DijetMTCondition: "
+
+     << " mass min: " 
+     << m_massMin
+     << " mass max: " 
+     << m_massMax
+
+     << " dEta min: " 
+     << m_detaMin
+     << " dEta max: " 
+     << m_detaMax
+
+     << " dPhi min: " 
+     << m_dphiMin
+     << " dPhi max: " 
+     << m_dphiMax
+
+     <<'\n';
+
+  return ss.str();
+}
+
+
+double DijetMTCondition::orderingParameter() const noexcept {
+  return m_massMin;
+}
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/conditionsFactory2.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/conditionsFactory2.cxx
index 20299f147eed95deb91560997067108c5b3dea34..ce9babaa9a7aac66132be59a7658593bb7f1cb1d 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/conditionsFactory2.cxx
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypoUtils/conditionsFactory2.cxx
@@ -19,6 +19,7 @@
 #include "TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetDEtaMassCondition.h"
 #include "TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetDPhiCondition.h"
 #include "TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetCondition.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/DijetMTCondition.h"
 #include "TrigHLTJetHypo/TrigHLTJetHypoUtils/HTCondition.h"
 #include "TrigHLTJetHypo/TrigHLTJetHypoUtils/TLACondition.h"
 #include "TrigHLTJetHypo/TrigHLTJetHypoUtils/conditionsFactory2.h"
@@ -104,6 +105,30 @@ Conditions conditionsFactoryDijet(const std::vector<double>& etThresholds1,
   return conditions;
 }
 
+
+Conditions conditionsFactoryDijetMT(const std::vector<double>& massMins,
+                                    const std::vector<double>& massMaxs,
+                                    const std::vector<double>& detaMins,
+                                    const std::vector<double>& detaMaxs,
+                                    const std::vector<double>& dphiMins,
+                                    const std::vector<double>& dphiMaxs){  
+  Conditions conditions;
+  
+  for(std::size_t i = 0; i < massMins.size(); ++i){
+    std::shared_ptr<ICondition>
+      pCondition(new DijetMTCondition(massMins[i],
+                                      massMaxs[i],
+                                      detaMins[i],
+                                      detaMaxs[i],
+                                      dphiMins[i],
+                                      dphiMaxs[i]));
+    
+    conditions.push_back(ConditionBridge(pCondition));
+  }
+  return conditions;
+}
+
+
 Conditions conditionsFactoryDijetEtaMass(const std::vector<double>& etaMins,
                                          const std::vector<double>& etaMaxs,
                                          const std::vector<double>& etMins,
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_Dijet.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_Dijet.cxx
index 439e78489a37b0a913b8a31307713a08118e990f..ba1079b2f1310e475f5848c95a99ec68bc03ad54 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_Dijet.cxx
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_Dijet.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 // ********************************************************************
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_DijetMassDEta.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_DijetMassDEta.cxx
index 06ae5f3324e3dd27abc3c352698979f8a624962f..86142dcc61970d528acbf0bac4e212aaecea6a66 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_DijetMassDEta.cxx
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_DijetMassDEta.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 // ********************************************************************
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_DijetMassDEtaDPhi.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_DijetMassDEtaDPhi.cxx
index 2a6cef0352173ae97a56cd7e4b8e94d26dbcfdd5..243b98ab9a3d838041bed742fabc717b2ba31872 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_DijetMassDEtaDPhi.cxx
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_DijetMassDEtaDPhi.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 // ********************************************************************
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_EtaEt.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_EtaEt.cxx
index 93dacee0008c21f7825adb93d0ea2095d22149c5..f7e85ee43160d99f750450bbfe74e8f2cd619670 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_EtaEt.cxx
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_EtaEt.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 // ********************************************************************
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_HT.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_HT.cxx
index cb2c8d9ae4407063f5d79114e400bf4ac9eea658..ba73e14d39957006761f1f90a34dd33f1203ba58 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_HT.cxx
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_HT.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 // ********************************************************************
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_SMC.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_SMC.cxx
index 938c20723db574831c7adc8990bba79936484792..1354f8dbe0de8dcd140c5a8561e89cb1be1b2cbe 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_SMC.cxx
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_SMC.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 // ********************************************************************
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_TLA.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_TLA.cxx
index 195d0a41d6b0927806fab23d854fb82335cf7d88..1efbece2a227f16b83854baebeb564a87ee814f9 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_TLA.cxx
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigHLTJetHypo_TLA.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 // ********************************************************************
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetAndToolMT.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetAndToolMT.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..4b169a56a5f0b1af348342a11cf281f2b42a1bf1
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetAndToolMT.cxx
@@ -0,0 +1,62 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+// ********************************************************************
+//
+// NAME:     TrigJetAndToolMT.cxx
+// PACKAGE:  Trigger/TrigHypothesis/TrigHLTJetHypo
+//
+//
+// ********************************************************************
+
+#include "TrigJetAndToolMT.h"
+
+#include "GaudiKernel/StatusCode.h"
+
+#include "DecisionHandling/HLTIdentifier.h"
+#include "DecisionHandling/TrigCompositeUtils.h"
+
+using TrigCompositeUtils::DecisionID;
+using TrigCompositeUtils::Decision;
+using TrigCompositeUtils::DecisionContainer;
+
+TrigJetAndToolMT::TrigJetAndToolMT(const std::string& type,
+                                 const std::string& name,
+                                 const IInterface* parent) :
+  base_class(type, name, parent),
+  m_decisionId(HLT::Identifier::fromToolName(name)) {
+}
+
+
+TrigJetAndToolMT::~TrigJetAndToolMT(){
+}
+
+StatusCode TrigJetAndToolMT::initialize(){
+  return StatusCode::SUCCESS;
+}
+
+StatusCode TrigJetAndToolMT::finalize(){
+  return StatusCode::SUCCESS;
+}
+
+StatusCode TrigJetAndToolMT::decide(const xAOD::JetContainer* jets,
+                                           bool& pass) const {
+
+  m_lhs->decide(jets, pass);
+  if (pass){
+    ATH_MSG_DEBUG("LHS passed");
+    m_rhs->decide(jets, pass);
+    ATH_MSG_DEBUG("RHS " <<std::boolalpha << pass);
+  } else {
+    ATH_MSG_DEBUG("LHS failed");
+  }    
+
+
+  return StatusCode::SUCCESS;
+}
+
+
+const HLT::Identifier& TrigJetAndToolMT::getId() const{
+  return m_decisionId;
+} 
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetAndToolMT.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetAndToolMT.h
new file mode 100644
index 0000000000000000000000000000000000000000..1536f08fb460ece5c1f8a3e8d8ea0bd1461f445d
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetAndToolMT.h
@@ -0,0 +1,58 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef TRIGJETANDTOOLMT_H
+#define TRIGJETANDTOOLMT_H
+/********************************************************************
+ *
+ * NAME:     TrigJetAndToolMT.h
+ * PACKAGE:  Trigger/TrigHypothesis/TrigHLTJetHypo
+ *
+ *
+ *********************************************************************/
+
+
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsDefs.h"
+#include "DecisionHandling/HLTIdentifier.h"
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "DecisionHandling/TrigCompositeUtils.h"
+#include "AthenaMonitoring/GenericMonitoringTool.h"
+
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsDefs.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ICleaner.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/IJetGrouper.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerBridge.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsDefs.h"
+
+#include "ITrigJetHypoToolMT.h"
+#include "ITrigJetHypoToolConfig.h"
+
+class TrigJetAndToolMT: public extends<AthAlgTool, ITrigJetHypoToolMT> {
+
+ public:
+  
+  TrigJetAndToolMT(const std::string& type,
+                    const std::string& name,
+                    const IInterface* parent);
+  virtual ~TrigJetAndToolMT();
+  virtual StatusCode initialize() override;
+  virtual StatusCode finalize() override;
+
+  // ITrigJetHypoToolMT interface
+  virtual StatusCode
+    decide(const xAOD::JetContainer*, bool& pass) const override;
+  virtual const HLT::Identifier& getId() const override; 
+ private:
+
+  // Identifier is used to keep track of which tool made which decision.
+  // The information is stored in the event store.
+  HLT::Identifier m_decisionId;  
+  
+  ToolHandle<ITrigJetHypoToolMT> m_lhs {
+    this, "lhs", {}, "LHS boolean binary expression"}; 
+  ToolHandle<ITrigJetHypoToolMT> m_rhs {
+    this, "rhs", {}, "RHS boolean binary expression"}; 
+
+};
+#endif
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoAlgMT.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoAlgMT.cxx
index a6ca525b17c73f7a5ee5d09954665b24dd72fdce..45fd41423c3a5c9f304f8cb62c872c5c6f376e7b 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoAlgMT.cxx
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoAlgMT.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #include "GaudiKernel/Property.h"
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoAlgMT.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoAlgMT.h
index d4413eb184e538ed3e8714bd6a22e9ae32f5cd13..3157bf40f2a40ff4429ff4ab2230c06b1fdf62b8 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoAlgMT.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoAlgMT.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 #ifndef TrigHLTJetHypo_TrigJetHypoAlgMT_H
 #define TrigHLTJetHypo_TrigJetHypoAlgMT_H
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_EtaEt.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_EtaEt.cxx
index fc26f284bb1d91e25bf88b154c9bb4e49361b2d9..bf74c882428d9d9418a80fa90c0c9cf9d9199e0c 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_EtaEt.cxx
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_EtaEt.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 // ********************************************************************
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_EtaEt.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_EtaEt.h
index 2d07e666129fcb79abe61490c6430ce4e5a506d6..356310c44271b5dbd1dfc4a42fc81dca03632f98 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_EtaEt.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_EtaEt.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef TRIGJETHYPOTOOLConfig_ETAET_H
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_dijet.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_dijet.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..a3d7a5f9a805e351880992e9a66eaa6b271d4f32
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_dijet.cxx
@@ -0,0 +1,94 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+/*
+  Instatniation of JetHypo components for  the DiMass scenario
+ */
+#include "TrigJetHypoToolConfig_dijet.h"
+
+#include "GaudiKernel/StatusCode.h"
+
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/conditionsFactory2.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsSorter.h"
+
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/CombinationsGrouper.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/xAODJetAsIJetFactory.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/groupsMatcherFactory.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerFactory.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/TrigHLTJetHypoHelper2.h"
+
+#include "DecisionHandling/TrigCompositeUtils.h"
+
+using TrigCompositeUtils::DecisionID;
+using TrigCompositeUtils::Decision;
+using TrigCompositeUtils::DecisionContainer;
+
+TrigJetHypoToolConfig_dijet::TrigJetHypoToolConfig_dijet(const std::string& type,
+                                                 const std::string& name,
+                                                 const IInterface* parent) :
+  base_class(type, name, parent){
+
+}
+
+
+TrigJetHypoToolConfig_dijet::~TrigJetHypoToolConfig_dijet(){
+}
+
+StatusCode TrigJetHypoToolConfig_dijet::initialize() {
+  CHECK(checkVals());
+  return StatusCode::SUCCESS;
+}
+
+
+
+
+Conditions TrigJetHypoToolConfig_dijet::getConditions() const {
+  auto conditions = conditionsFactoryDijetMT(m_massMins,
+                                             m_massMaxs,
+                                             m_dEtaMins,
+                                             m_dEtaMaxs,
+                                             m_dPhiMins,
+                                             m_dPhiMaxs);
+ 
+  std::sort(conditions.begin(), conditions.end(), ConditionsSorter());
+  
+  return conditions;
+}
+
+ 
+std::unique_ptr<IJetGrouper> TrigJetHypoToolConfig_dijet::getJetGrouper() const {
+  return std::make_unique<CombinationsGrouper>(2);
+}
+
+StatusCode TrigJetHypoToolConfig_dijet::checkVals() const {
+  // check cionsistent sizes
+
+  auto sz = m_massMins.size();
+  if (sz != m_massMaxs.size() or
+      sz != m_dEtaMins.size() or
+      sz != m_dEtaMaxs.size() or
+      sz != m_dPhiMins.size() or
+      sz != m_dPhiMaxs.size()){
+    ATH_MSG_ERROR(name()
+                  << ": mismatch between number of thresholds "
+                  << "and min, max fro mass, dEta, dPhi "
+                  << m_massMins.size() << " "
+                  << m_massMaxs.size() << " "
+                  << m_dEtaMins.size() << " "
+                  << m_dEtaMaxs.size() << " "
+                  << m_dPhiMins.size() << " "
+                  << m_dPhiMaxs.size() << " ");
+    
+    return StatusCode::FAILURE;
+  }
+  return StatusCode::SUCCESS;
+}
+
+std::vector<std::shared_ptr<ICleaner>> 
+TrigJetHypoToolConfig_dijet::getCleaners() const {
+  std::vector<std::shared_ptr<ICleaner>> v;
+  return v;
+}
+
+
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_dijet.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_dijet.h
new file mode 100644
index 0000000000000000000000000000000000000000..2386b28e42819ca3653bc16cc92d3ef2c91e69db
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_dijet.h
@@ -0,0 +1,67 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef TRIGJETHYPOTOOLConfig_DIJET_H
+#define TRIGJETHYPOTOOLConfig_DIJET_H
+/********************************************************************
+ *
+ * NAME:     TrigJetHypoToolConfig_dijetTool.h
+ * PACKAGE:  Trigger/TrigHypothesis/TrigHLTJetHypo
+ *
+ *
+ *********************************************************************/
+
+
+#include "ITrigJetHypoToolConfig.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsDefs.h"
+#include "DecisionHandling/HLTIdentifier.h"
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "DecisionHandling/TrigCompositeUtils.h"
+#include "AthenaMonitoring/GenericMonitoringTool.h"
+
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsDefs.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ICleaner.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/IJetGrouper.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerBridge.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsDefs.h"
+
+class TrigJetHypoToolConfig_dijet:
+public extends<AthAlgTool, ITrigJetHypoToolConfig> {
+
+ public:
+  
+  TrigJetHypoToolConfig_dijet(const std::string& type,
+                          const std::string& name,
+                          const IInterface* parent);
+  virtual ~TrigJetHypoToolConfig_dijet();
+
+  virtual StatusCode initialize() override;
+  virtual std::vector<std::shared_ptr<ICleaner>> getCleaners() const override;
+  virtual std::unique_ptr<IJetGrouper> getJetGrouper() const override;
+  virtual Conditions getConditions() const override;
+
+ private:
+
+  Gaudi::Property<std::vector<double>>
+    m_massMins{this, "mass_mins", {}, "min mass for each dijet"};
+
+  Gaudi::Property<std::vector<double>>
+    m_massMaxs{this, "mass_maxs", {}, "max mass for each dijet"};
+
+  Gaudi::Property<std::vector<double>>
+    m_dEtaMins{this, "deta_mins", {}, "min dEta for jets in each dijet"};
+
+  Gaudi::Property<std::vector<double>>
+    m_dEtaMaxs{this, "deta_maxs", {}, "max dEta for jets in each dijet"};
+
+  Gaudi::Property<std::vector<double>>
+    m_dPhiMins{this, "dphi_mins", {}, "min dPhi for jets in each dijet"};
+
+  Gaudi::Property<std::vector<double>>
+    m_dPhiMaxs{this, "dphi_maxs", {}, "max dPhi for jets in each dijet"};
+
+  virtual StatusCode checkVals()  const override;
+
+};
+#endif
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_simple.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_simple.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..7a6362a3078874a181bdd47e027f50c0cbf42b91
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_simple.cxx
@@ -0,0 +1,92 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+// ********************************************************************
+//
+// NAME:     TrigJetHypoToolMT_simple.cxx
+// PACKAGE:  Trigger/TrigHypothesis/TrigHLTJetHypo
+//
+//
+// ********************************************************************
+
+#include "TrigJetHypoToolConfig_simple.h"
+
+#include "GaudiKernel/StatusCode.h"
+
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/conditionsFactory2.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsSorter.h"
+
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/SingleJetGrouper.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/xAODJetAsIJetFactory.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/groupsMatcherFactory.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerFactory.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/TrigHLTJetHypoHelper2.h"
+
+#include "DecisionHandling/TrigCompositeUtils.h"
+
+using TrigCompositeUtils::DecisionID;
+using TrigCompositeUtils::Decision;
+using TrigCompositeUtils::DecisionContainer;
+
+TrigJetHypoToolConfig_simple::TrigJetHypoToolConfig_simple(const std::string& type,
+                                                 const std::string& name,
+                                                 const IInterface* parent) :
+  base_class(type, name, parent){
+
+}
+
+
+TrigJetHypoToolConfig_simple::~TrigJetHypoToolConfig_simple(){
+}
+
+StatusCode TrigJetHypoToolConfig_simple::initialize() {
+  CHECK(checkVals());
+  return StatusCode::SUCCESS;
+}
+
+
+
+
+Conditions TrigJetHypoToolConfig_simple::getConditions() const {
+  auto conditions = conditionsFactoryEtaEt(m_etaMins,
+                                           m_etaMaxs,
+                                           m_EtThresholds,
+                                           m_asymmetricEtas);
+  std::sort(conditions.begin(), conditions.end(), ConditionsSorter());
+  
+  return conditions;
+}
+
+ 
+std::unique_ptr<IJetGrouper>
+TrigJetHypoToolConfig_simple::getJetGrouper() const {
+  return std::make_unique<SingleJetGrouper>();
+}
+
+StatusCode TrigJetHypoToolConfig_simple::checkVals() const {
+  if (m_EtThresholds.size() != m_etaMins.size() or
+      m_EtThresholds.size() != m_etaMaxs.size() or
+      m_asymmetricEtas.size() != m_etaMaxs.size()){
+    
+    ATH_MSG_ERROR(name()
+                  << ": mismatch between number of thresholds "
+                  << "and eta min, max boundaries or asymmetric eta flags: "
+                  << m_EtThresholds.size() << " "
+                  << m_etaMins.size() << " "
+                  << m_etaMaxs.size() << " "
+                  << m_asymmetricEtas.size() << " "
+                  );
+    
+    return StatusCode::FAILURE;
+  }
+  return StatusCode::SUCCESS;
+}
+
+std::vector<std::shared_ptr<ICleaner>> 
+TrigJetHypoToolConfig_simple::getCleaners() const {
+  std::vector<std::shared_ptr<ICleaner>> v;
+  return v;
+}
+
+
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_simple.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_simple.h
new file mode 100644
index 0000000000000000000000000000000000000000..0ee3bd73202f93031af8bd523a310a82be54740e
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolConfig_simple.h
@@ -0,0 +1,62 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef TRIGJETHYPOTOOLConfig_SIMPLE_H
+#define TRIGJETHYPOTOOLConfig_SIMPLE_H
+/********************************************************************
+ *
+ * NAME:     TrigJetHypoToolConfig_simple.h
+ * PACKAGE:  Trigger/TrigHypothesis/TrigHLTJetHypo
+ *
+ *
+ *********************************************************************/
+
+
+#include "ITrigJetHypoToolConfig.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsDefs.h"
+#include "DecisionHandling/HLTIdentifier.h"
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "DecisionHandling/TrigCompositeUtils.h"
+#include "AthenaMonitoring/GenericMonitoringTool.h"
+
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsDefs.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ICleaner.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/IJetGrouper.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerBridge.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsDefs.h"
+
+class TrigJetHypoToolConfig_simple:
+public extends<AthAlgTool, ITrigJetHypoToolConfig> {
+
+ public:
+  
+  TrigJetHypoToolConfig_simple(const std::string& type,
+                          const std::string& name,
+                          const IInterface* parent);
+  virtual ~TrigJetHypoToolConfig_simple();
+
+  virtual StatusCode initialize() override;
+  virtual std::vector<std::shared_ptr<ICleaner>> getCleaners() const override;
+  virtual std::unique_ptr<IJetGrouper> getJetGrouper() const override;
+  virtual Conditions getConditions() const override;
+
+ private:
+  
+  Gaudi::Property<std::vector<double>>
+    m_EtThresholds{this, "EtThresholds", {}, "Etthresholds by eta region"};
+  
+  Gaudi::Property<std::vector<double>>
+    m_etaMins{this, "eta_mins", {}, "Eta min for eta regions"};
+  
+  Gaudi::Property<std::vector<double>>
+    m_etaMaxs{this, "eta_maxs", {}, "Eta max for eta regions"};
+
+  Gaudi::Property<std::vector<int>>
+    m_asymmetricEtas{this, "asymmetricEtas", {}, "Apply asym. eta cuts"};
+
+
+  virtual StatusCode checkVals()  const override;
+
+};
+#endif
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolMT.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolMT.cxx
index 4faa51b87fba9376947fb64aa326574c1596e864..9c52d1334d823b6812601eaa55b736a640285d5a 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolMT.cxx
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolMT.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 // ********************************************************************
@@ -71,7 +71,7 @@ StatusCode TrigJetHypoToolMT::decide(const xAOD::JetContainer* jets,
                                       std::move(matcher));
 
   /* apply cleaning and hypothesis alg */
-  ATH_MSG_DEBUG("hypo helper start... " << m_chainName
+  ATH_MSG_DEBUG("hypo helper start... "
                 << " no of jets ... " 
                 << jets->size() 
                 << "...");
@@ -88,7 +88,7 @@ StatusCode TrigJetHypoToolMT::decide(const xAOD::JetContainer* jets,
 
   // accumulateTime(steady_clock::now() - t);
   
-  ATH_MSG_DEBUG("hypo testing done chain  " << m_chainName
+  ATH_MSG_DEBUG("hypo testing done chain  "
                 << " no of input jets " << jets->size()
                 << " pass " << pass );
   
@@ -144,12 +144,12 @@ void TrigJetHypoToolMT::writeDebug(bool pass,
                                        const HypoJetVector& passedJets,
                                        const HypoJetVector& failedJets
                                        ) const{
-  ATH_MSG_INFO("Writing debug start" << m_chainName << "...");
+  ATH_MSG_INFO("Writing debug start...");
   
   if(pass){
-    ATH_MSG_DEBUG(m_chainName<< " event passed");
+    ATH_MSG_DEBUG(" event passed");
   } else {
-    ATH_MSG_DEBUG(m_chainName<< " event failed");
+    ATH_MSG_DEBUG(" event failed");
   }
 
   for (auto j :  passedJets) {
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolMT.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolMT.h
index 0b9fac33e1ee61fd516b4b234fd359c9692744b3..7e431a512783588bf92d607f2b655d36577b71a3 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolMT.h
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetHypoToolMT.h
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 
 #ifndef TRIGJETHYPOTOOLMT_H
@@ -53,7 +53,7 @@ class TrigJetHypoToolMT: public extends<AthAlgTool, ITrigJetHypoToolMT> {
   // Paraphanalia needed for the Jet Hypo Helper class:
   Conditions m_conditions;
 
-  bool m_dumpJets{false};
+  Gaudi::Property<bool> m_dumpJets{this, "dumpJets", {}, "verbose jet dump flag"};
   
   void setCleaners();
  
@@ -152,9 +152,6 @@ class TrigJetHypoToolMT: public extends<AthAlgTool, ITrigJetHypoToolMT> {
  Gaudi::Property<float>
    m_avLarQFLlpThreshold{this, "AverageLArQFLlpThreshold", 0.8*65535, ""};
 
- Gaudi::Property<std::string>
-   m_chainName{this, "chain_name", {}, "chain name (dbg)"};
-  
  Gaudi::Property<bool>
    m_acceptAll{this, "AcceptAll", false, "flag to turn of hypo"};
  
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetNotToolMT.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetNotToolMT.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..2ec75ba2f8c83a8fd7a4af063b19fc2839940593
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetNotToolMT.cxx
@@ -0,0 +1,63 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+// ********************************************************************
+//
+// NAME:     TrigJetNotToolMT.cxx
+// PACKAGE:  Trigger/TrigHypothesis/TrigHLTJetHypo
+//
+//
+// ********************************************************************
+
+#include "TrigJetNotToolMT.h"
+
+#include "GaudiKernel/StatusCode.h"
+
+#include "DecisionHandling/HLTIdentifier.h"
+#include "DecisionHandling/TrigCompositeUtils.h"
+
+using TrigCompositeUtils::DecisionID;
+using TrigCompositeUtils::Decision;
+using TrigCompositeUtils::DecisionContainer;
+
+TrigJetNotToolMT::TrigJetNotToolMT(const std::string& type,
+                                 const std::string& name,
+                                 const IInterface* parent) :
+  base_class(type, name, parent),
+  m_decisionId(HLT::Identifier::fromToolName(name)) {
+}
+
+
+TrigJetNotToolMT::~TrigJetNotToolMT(){
+}
+
+StatusCode TrigJetNotToolMT::initialize(){
+  return StatusCode::SUCCESS;
+}
+
+StatusCode TrigJetNotToolMT::finalize(){
+  return StatusCode::SUCCESS;
+}
+
+StatusCode TrigJetNotToolMT::decide(const xAOD::JetContainer* jets,
+                                           bool& pass) const {
+
+  m_hypoTool->decide(jets, pass);
+
+  if(pass){
+    ATH_MSG_DEBUG("hypoTool passed");
+  } else {
+    ATH_MSG_DEBUG("hypoTool failed");
+  }
+
+  pass = !pass;
+
+  return StatusCode::SUCCESS;
+}
+
+
+const HLT::Identifier& TrigJetNotToolMT::getId() const{
+  return m_decisionId;
+} 
+ 
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetNotToolMT.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetNotToolMT.h
new file mode 100644
index 0000000000000000000000000000000000000000..9c51b7361396f51e22062c81ef2c7466b38f2237
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetNotToolMT.h
@@ -0,0 +1,57 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collabnotation
+*/
+
+#ifndef TRIGJETNOTTOOLMT_H
+#define TRIGJETNOTTOOLMT_H
+/********************************************************************
+ *
+ * NAME:     TrigJetNotToolMT.h
+ * PACKAGE:  Trigger/TrigHypothesis/TrigHLTJetHypo
+ *
+ *
+ *********************************************************************/
+
+
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsDefs.h"
+#include "DecisionHandling/HLTIdentifier.h"
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "DecisionHandling/TrigCompositeUtils.h"
+#include "AthenaMonitoring/GenericMonitoringTool.h"
+
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsDefs.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ICleaner.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/IJetGrouper.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerBridge.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsDefs.h"
+
+#include "ITrigJetHypoToolMT.h"
+#include "ITrigJetHypoToolConfig.h"
+
+class TrigJetNotToolMT: public extends<AthAlgTool, ITrigJetHypoToolMT> {
+
+ public:
+  
+  TrigJetNotToolMT(const std::string& type,
+                    const std::string& name,
+                    const IInterface* parent);
+  virtual ~TrigJetNotToolMT();
+  virtual StatusCode initialize() override;
+  virtual StatusCode finalize() override;
+
+  // ITrigJetHypoToolMT interface
+  virtual StatusCode
+    decide(const xAOD::JetContainer*, bool& pass) const override;
+  virtual const HLT::Identifier& getId() const override; 
+ private:
+
+  // Identifier is used to keep track of which tool made which decision.
+  // The information is stored in the event store.
+  HLT::Identifier m_decisionId;  
+  
+  ToolHandle<ITrigJetHypoToolMT> m_hypoTool {
+    this, "hypoTool", {}, "predicate to be inverted"};
+
+
+};
+#endif
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetOrToolMT.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetOrToolMT.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..80846e55aeabf7fd464632eb925790392511d383
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetOrToolMT.cxx
@@ -0,0 +1,60 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+// ********************************************************************
+//
+// NAME:     TrigJetOrToolMT.cxx
+// PACKAGE:  Trigger/TrigHypothesis/TrigHLTJetHypo
+//
+//
+// ********************************************************************
+
+#include "TrigJetOrToolMT.h"
+
+#include "GaudiKernel/StatusCode.h"
+
+#include "DecisionHandling/HLTIdentifier.h"
+#include "DecisionHandling/TrigCompositeUtils.h"
+
+using TrigCompositeUtils::DecisionID;
+using TrigCompositeUtils::Decision;
+using TrigCompositeUtils::DecisionContainer;
+
+TrigJetOrToolMT::TrigJetOrToolMT(const std::string& type,
+                                 const std::string& name,
+                                 const IInterface* parent) :
+  base_class(type, name, parent),
+  m_decisionId(HLT::Identifier::fromToolName(name)) {
+}
+
+
+TrigJetOrToolMT::~TrigJetOrToolMT(){
+}
+
+StatusCode TrigJetOrToolMT::initialize(){
+  return StatusCode::SUCCESS;
+}
+
+StatusCode TrigJetOrToolMT::finalize(){
+  return StatusCode::SUCCESS;
+}
+
+StatusCode TrigJetOrToolMT::decide(const xAOD::JetContainer* jets,
+                                           bool& pass) const {
+
+  m_lhs->decide(jets, pass);
+  if (not pass){
+    m_rhs->decide(jets, pass);
+    ATH_MSG_DEBUG("LHS failed " << " RHS " <<std::boolalpha << pass);
+  } else {
+    ATH_MSG_DEBUG("LHS passed");
+  }
+
+  return StatusCode::SUCCESS;
+}
+
+
+const HLT::Identifier& TrigJetOrToolMT::getId() const{
+  return m_decisionId;
+} 
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetOrToolMT.h b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetOrToolMT.h
new file mode 100644
index 0000000000000000000000000000000000000000..db9a8d1cc62fdeb8c66de436c569225ede967a06
--- /dev/null
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/TrigJetOrToolMT.h
@@ -0,0 +1,58 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
+#ifndef TRIGJETORTOOLMT_H
+#define TRIGJETORTOOLMT_H
+/********************************************************************
+ *
+ * NAME:     TrigJetOrToolMT.h
+ * PACKAGE:  Trigger/TrigHypothesis/TrigHLTJetHypo
+ *
+ *
+ *********************************************************************/
+
+
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsDefs.h"
+#include "DecisionHandling/HLTIdentifier.h"
+#include "AthenaBaseComps/AthAlgTool.h"
+#include "DecisionHandling/TrigCompositeUtils.h"
+#include "AthenaMonitoring/GenericMonitoringTool.h"
+
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsDefs.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ICleaner.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/IJetGrouper.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/CleanerBridge.h"
+#include "TrigHLTJetHypo/TrigHLTJetHypoUtils/ConditionsDefs.h"
+
+#include "ITrigJetHypoToolMT.h"
+#include "ITrigJetHypoToolConfig.h"
+
+class TrigJetOrToolMT: public extends<AthAlgTool, ITrigJetHypoToolMT> {
+
+ public:
+  
+  TrigJetOrToolMT(const std::string& type,
+                    const std::string& name,
+                    const IInterface* parent);
+  virtual ~TrigJetOrToolMT();
+  virtual StatusCode initialize() override;
+  virtual StatusCode finalize() override;
+
+  // ITrigJetOrToolMT interface
+  virtual StatusCode
+    decide(const xAOD::JetContainer*, bool& pass) const override;
+  virtual const HLT::Identifier& getId() const override; 
+ private:
+
+  // Identifier is used to keep track of which tool made which decision.
+  // The information is stored in the event store.
+  HLT::Identifier m_decisionId;  
+  
+  ToolHandle<ITrigJetHypoToolMT> m_lhs {
+    this, "lhs", {}, "LHS boolean binary expression"}; 
+  ToolHandle<ITrigJetHypoToolMT> m_rhs {
+    this, "rhs", {}, "RHS boolean binary expression"}; 
+
+};
+#endif
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/components/TrigHLTJetHypo_entries.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/components/TrigHLTJetHypo_entries.cxx
index 816a71dafc2630d18e11cdf3486b5434cd268873..b8363a2069cc09b0ab11301f9532b7569f527b6e 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/components/TrigHLTJetHypo_entries.cxx
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/components/TrigHLTJetHypo_entries.cxx
@@ -1,3 +1,7 @@
+/*
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
+*/
+
 #include "TrigHLTJetHypo/TrigHLTJetHypo2.h"
 #include "TrigHLTJetHypo/TrigEFRazorAllTE.h"
 #include "TrigHLTJetHypo/TrigEFDPhiMetJetAllTE.h"
@@ -10,6 +14,11 @@
 #include "TrigHLTJetHypo/TrigHLTJetHypo_SMC.h"
 #include "../TrigJetHypoAlgMT.h"
 #include "../TrigJetHypoToolConfig_EtaEt.h"
+#include "../TrigJetHypoToolConfig_simple.h"
+#include "../TrigJetHypoToolConfig_dijet.h"
+#include "../TrigJetNotToolMT.h"
+#include "../TrigJetAndToolMT.h"
+#include "../TrigJetOrToolMT.h"
 #include "../TrigJetHypoToolMT.h"
 
 DECLARE_COMPONENT( TrigHLTJetHypo2 )
@@ -20,6 +29,11 @@ DECLARE_COMPONENT( TrigHLTJetHypo_Dijet )
 DECLARE_COMPONENT( TrigHLTJetHypo_DijetMassDEta )
 DECLARE_COMPONENT( TrigHLTJetHypo_DijetMassDEtaDPhi )
 DECLARE_COMPONENT( TrigHLTJetHypo_EtaEt )
+DECLARE_COMPONENT( TrigJetHypoToolConfig_simple )
+DECLARE_COMPONENT( TrigJetHypoToolConfig_dijet )
+DECLARE_COMPONENT( TrigJetNotToolMT)
+DECLARE_COMPONENT( TrigJetAndToolMT)
+DECLARE_COMPONENT( TrigJetOrToolMT)
 DECLARE_COMPONENT( TrigHLTJetHypo_SMC )
 DECLARE_COMPONENT( TrigHLTJetHypo_HT )
 DECLARE_COMPONENT( TrigHLTJetHypo_TLA )
diff --git a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/xAODJetAsIJetFactory.cxx b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/xAODJetAsIJetFactory.cxx
index 3a79530f272977f62af0b21a689b3d48041e72ce..ab7261bdc2a1c00bbfb7b2dc96baca1f7023b027 100644
--- a/Trigger/TrigHypothesis/TrigHLTJetHypo/src/xAODJetAsIJetFactory.cxx
+++ b/Trigger/TrigHypothesis/TrigHLTJetHypo/src/xAODJetAsIJetFactory.cxx
@@ -1,5 +1,5 @@
 /*
-  Copyright (C) 2002-2018 CERN for the benefit of the ATLAS collaboration
+  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
 */
 #include "TrigHLTJetHypo/TrigHLTJetHypoUtils/xAODJetAsIJetFactory.h"
 
diff --git a/Trigger/TrigValidation/TrigUpgradeTest/python/jetDefs.py b/Trigger/TrigValidation/TrigUpgradeTest/python/jetDefs.py
index 9393ed844a811eeda32a9d7e9dbc11f3b16f6aed..934c2ca704f11574b3c2be88514b348a19c894bb 100644
--- a/Trigger/TrigValidation/TrigUpgradeTest/python/jetDefs.py
+++ b/Trigger/TrigValidation/TrigUpgradeTest/python/jetDefs.py
@@ -7,8 +7,6 @@ from AthenaCommon.AppMgr import ServiceMgr as svcMgr
 from AthenaCommon.Constants import VERBOSE,DEBUG,INFO
 from AthenaCommon.CFElements import parOR, seqAND, seqOR, stepSeq
 
-
-
 ## def jetFSInputMaker( ):
 ##   """ Creates the jet inputMaker for FS"""
 ##   RoIs = jetCollections.L1RoIs
diff --git a/Trigger/TrigValidation/TrigUpgradeTest/share/fullMenu.py b/Trigger/TrigValidation/TrigUpgradeTest/share/fullMenu.py
index bc04c269bbee0c9527a5e58a938845bc33422523..1e43e23888da7c39767fbafc0fce35807278f898 100644
--- a/Trigger/TrigValidation/TrigUpgradeTest/share/fullMenu.py
+++ b/Trigger/TrigValidation/TrigUpgradeTest/share/fullMenu.py
@@ -119,7 +119,7 @@ if (doJet):
     
     jetChains  = [
         Chain(name='HLT_j85',  Seed="L1_J20",  ChainSteps=[jetstep1]  ),
-        Chain(name='HLT_j100', Seed="L1_J20",  ChainSteps=[jetstep1]  )
+        Chain(name='HLT_j45', Seed="L1_J20",  ChainSteps=[jetstep1] )  
         ]
     testChains += jetChains
 
diff --git a/Trigger/TrigValidation/TrigUpgradeTest/share/fullMenu.ref b/Trigger/TrigValidation/TrigUpgradeTest/share/fullMenu.ref
index 3038ae267ade58a248390d2a42e8711dbf7cd61e..5aef1caca6756b6fea42452b6a5d0d2d394c59e2 100644
--- a/Trigger/TrigValidation/TrigUpgradeTest/share/fullMenu.ref
+++ b/Trigger/TrigValidation/TrigUpgradeTest/share/fullMenu.ref
@@ -1,23 +1,20 @@
 TriggerSummaryStep1                     0   0     DEBUG  +++ HLT_xe30_L1XE10 ID#347649004
 TriggerSummaryStep1                     0   0     DEBUG  +++ HLT_e5_etcut ID#607406625
-TriggerSummaryStep1                     0   0     DEBUG  +++ HLT_j100 ID#625306965
 TriggerSummaryStep1                     0   0     DEBUG  +++ HLT_g5_etcut ID#1407390618
 TriggerSummaryStep1                     0   0     DEBUG  +++ HLT_e3_etcut1step ID#1509456583
 TriggerSummaryStep1                     0   0     DEBUG  +++ HLT_e7_etcut ID#2430733989
 TriggerSummaryStep1                     0   0     DEBUG  +++ HLT_e3_etcut ID#2711808158
-TriggerSummaryStep1                     0   0     DEBUG  +++ HLT_j85 ID#3478728990
 TriggerSummaryStep2                     0   0     DEBUG  +++ HLT_e5_etcut ID#607406625
 TriggerSummaryStep2                     0   0     DEBUG  +++ HLT_g5_etcut ID#1407390618
 TriggerSummaryStep2                     0   0     DEBUG  +++ HLT_e7_etcut ID#2430733989
 TriggerSummaryStep2                     0   0     DEBUG  +++ HLT_e3_etcut ID#2711808158
 TriggerSummaryStep1                     1   0     DEBUG  +++ HLT_xe30_L1XE10 ID#347649004
 TriggerSummaryStep1                     1   0     DEBUG  +++ HLT_e5_etcut ID#607406625
-TriggerSummaryStep1                     1   0     DEBUG  +++ HLT_j100 ID#625306965
 TriggerSummaryStep1                     1   0     DEBUG  +++ HLT_g5_etcut ID#1407390618
 TriggerSummaryStep1                     1   0     DEBUG  +++ HLT_e3_etcut1step ID#1509456583
 TriggerSummaryStep1                     1   0     DEBUG  +++ HLT_e7_etcut ID#2430733989
 TriggerSummaryStep1                     1   0     DEBUG  +++ HLT_e3_etcut ID#2711808158
-TriggerSummaryStep1                     1   0     DEBUG  +++ HLT_j85 ID#3478728990
+TriggerSummaryStep1                     1   0     DEBUG  +++ HLT_j45 ID#3664574289
 TriggerSummaryStep2                     1   0     DEBUG  +++ HLT_e5_etcut ID#607406625
 TriggerSummaryStep2                     1   0     DEBUG  +++ HLT_g5_etcut ID#1407390618
 TriggerSummaryStep2                     1   0     DEBUG  +++ HLT_e7_etcut ID#2430733989
@@ -33,12 +30,11 @@ TriggerSummaryStep2                     2   0     DEBUG  +++ HLT_e7_etcut ID#243
 TriggerSummaryStep2                     2   0     DEBUG  +++ HLT_e3_etcut ID#2711808158
 TriggerSummaryStep1                     3   0     DEBUG  +++ HLT_xe30_L1XE10 ID#347649004
 TriggerSummaryStep1                     3   0     DEBUG  +++ HLT_e5_etcut ID#607406625
-TriggerSummaryStep1                     3   0     DEBUG  +++ HLT_j100 ID#625306965
 TriggerSummaryStep1                     3   0     DEBUG  +++ HLT_g5_etcut ID#1407390618
 TriggerSummaryStep1                     3   0     DEBUG  +++ HLT_e3_etcut1step ID#1509456583
 TriggerSummaryStep1                     3   0     DEBUG  +++ HLT_e7_etcut ID#2430733989
 TriggerSummaryStep1                     3   0     DEBUG  +++ HLT_e3_etcut ID#2711808158
-TriggerSummaryStep1                     3   0     DEBUG  +++ HLT_j85 ID#3478728990
+TriggerSummaryStep1                     3   0     DEBUG  +++ HLT_j45 ID#3664574289
 TriggerSummaryStep2                     3   0     DEBUG  +++ HLT_e5_etcut ID#607406625
 TriggerSummaryStep2                     3   0     DEBUG  +++ HLT_g5_etcut ID#1407390618
 TriggerSummaryStep2                     3   0     DEBUG  +++ HLT_e7_etcut ID#2430733989
@@ -100,12 +96,11 @@ TriggerSummaryStep2                     8   0     DEBUG  +++ HLT_e7_etcut ID#243
 TriggerSummaryStep2                     8   0     DEBUG  +++ HLT_e3_etcut ID#2711808158
 TriggerSummaryStep1                     9   0     DEBUG  +++ HLT_xe30_L1XE10 ID#347649004
 TriggerSummaryStep1                     10  0     DEBUG  +++ HLT_e5_etcut ID#607406625
-TriggerSummaryStep1                     10  0     DEBUG  +++ HLT_j100 ID#625306965
 TriggerSummaryStep1                     10  0     DEBUG  +++ HLT_g5_etcut ID#1407390618
 TriggerSummaryStep1                     10  0     DEBUG  +++ HLT_e3_etcut1step ID#1509456583
 TriggerSummaryStep1                     10  0     DEBUG  +++ HLT_e7_etcut ID#2430733989
 TriggerSummaryStep1                     10  0     DEBUG  +++ HLT_e3_etcut ID#2711808158
-TriggerSummaryStep1                     10  0     DEBUG  +++ HLT_j85 ID#3478728990
+TriggerSummaryStep1                     10  0     DEBUG  +++ HLT_j45 ID#3664574289
 TriggerSummaryStep2                     10  0     DEBUG  +++ HLT_e5_etcut ID#607406625
 TriggerSummaryStep2                     10  0     DEBUG  +++ HLT_g5_etcut ID#1407390618
 TriggerSummaryStep2                     10  0     DEBUG  +++ HLT_e7_etcut ID#2430733989
@@ -129,12 +124,10 @@ TriggerSummaryStep2                     12  0     DEBUG  +++ HLT_g5_etcut ID#140
 TriggerSummaryStep2                     12  0     DEBUG  +++ HLT_e7_etcut ID#2430733989
 TriggerSummaryStep2                     12  0     DEBUG  +++ HLT_e3_etcut ID#2711808158
 TriggerSummaryStep1                     13  0     DEBUG  +++ HLT_e5_etcut ID#607406625
-TriggerSummaryStep1                     13  0     DEBUG  +++ HLT_j100 ID#625306965
 TriggerSummaryStep1                     13  0     DEBUG  +++ HLT_g5_etcut ID#1407390618
 TriggerSummaryStep1                     13  0     DEBUG  +++ HLT_e3_etcut1step ID#1509456583
 TriggerSummaryStep1                     13  0     DEBUG  +++ HLT_e7_etcut ID#2430733989
 TriggerSummaryStep1                     13  0     DEBUG  +++ HLT_e3_etcut ID#2711808158
-TriggerSummaryStep1                     13  0     DEBUG  +++ HLT_j85 ID#3478728990
 TriggerSummaryStep2                     13  0     DEBUG  +++ HLT_e5_etcut ID#607406625
 TriggerSummaryStep2                     13  0     DEBUG  +++ HLT_g5_etcut ID#1407390618
 TriggerSummaryStep2                     13  0     DEBUG  +++ HLT_e7_etcut ID#2430733989
@@ -173,12 +166,11 @@ TriggerSummaryStep1                     18  0     DEBUG  +++ HLT_e3_etcut ID#271
 TriggerSummaryStep2                     18  0     DEBUG  +++ HLT_g5_etcut ID#1407390618
 TriggerSummaryStep1                     19  0     DEBUG  +++ HLT_xe30_L1XE10 ID#347649004
 TriggerSummaryStep1                     19  0     DEBUG  +++ HLT_e5_etcut ID#607406625
-TriggerSummaryStep1                     19  0     DEBUG  +++ HLT_j100 ID#625306965
 TriggerSummaryStep1                     19  0     DEBUG  +++ HLT_g5_etcut ID#1407390618
 TriggerSummaryStep1                     19  0     DEBUG  +++ HLT_e3_etcut1step ID#1509456583
 TriggerSummaryStep1                     19  0     DEBUG  +++ HLT_e7_etcut ID#2430733989
 TriggerSummaryStep1                     19  0     DEBUG  +++ HLT_e3_etcut ID#2711808158
-TriggerSummaryStep1                     19  0     DEBUG  +++ HLT_j85 ID#3478728990
+TriggerSummaryStep1                     19  0     DEBUG  +++ HLT_j45 ID#3664574289
 TriggerSummaryStep2                     19  0     DEBUG  +++ HLT_e5_etcut ID#607406625
 TriggerSummaryStep2                     19  0     DEBUG  +++ HLT_g5_etcut ID#1407390618
 TriggerSummaryStep2                     19  0     DEBUG  +++ HLT_e7_etcut ID#2430733989
@@ -199,10 +191,10 @@ TrigSignatureMoniMT                                INFO HLT_e7_etcut
 TrigSignatureMoniMT                                INFO HLT_e7_etcut decisions                            36        265       
 TrigSignatureMoniMT                                INFO HLT_g5_etcut                  20        20        17        17        17        
 TrigSignatureMoniMT                                INFO HLT_g5_etcut decisions                            50        50        
-TrigSignatureMoniMT                                INFO HLT_j100                      20        20        6         0         6         
-TrigSignatureMoniMT                                INFO HLT_j100 decisions                                6         0         
-TrigSignatureMoniMT                                INFO HLT_j85                       20        20        6         0         6         
-TrigSignatureMoniMT                                INFO HLT_j85 decisions                                 6         0         
+TrigSignatureMoniMT                                INFO HLT_j45                       20        20        4         0         4         
+TrigSignatureMoniMT                                INFO HLT_j45 decisions                                 4         0         
+TrigSignatureMoniMT                                INFO HLT_j85                       20        20        0         0         0         
+TrigSignatureMoniMT                                INFO HLT_j85 decisions                                 0         0         
 TrigSignatureMoniMT                                INFO HLT_mu6                       20        20        3         0         3         
 TrigSignatureMoniMT                                INFO HLT_mu6 decisions                                 3         0         
 TrigSignatureMoniMT                                INFO HLT_mu6Comb                   20        20        3         2         2         
diff --git a/Trigger/TrigValidation/TrigUpgradeTest/share/jet.menu.py b/Trigger/TrigValidation/TrigUpgradeTest/share/jet.menu.py
index 936f01378a6de8f723a34842d336ae93847cd74f..668f87183b709b486e5ca0635b830c854539e5e9 100644
--- a/Trigger/TrigValidation/TrigUpgradeTest/share/jet.menu.py
+++ b/Trigger/TrigValidation/TrigUpgradeTest/share/jet.menu.py
@@ -16,7 +16,7 @@ step1=ChainStep("Step1_jet", [jetSeq1])
 
 testChains  = [
     Chain(name='HLT_j85',  Seed="L1_J20",  ChainSteps=[step1]  ),
-    Chain(name='HLT_j100', Seed="L1_J20",  ChainSteps=[step1]  )
+    Chain(name='HLT_j45', Seed="L1_J20",  ChainSteps=[step1]  )
     ]
     
 
diff --git a/Trigger/TrigValidation/TrigUpgradeTest/share/jetMenu.ref b/Trigger/TrigValidation/TrigUpgradeTest/share/jetMenu.ref
index ce932a38433d86b87083b601253f6cf2815216be..c52fd3b9d84dbcd05aa0932704343ca70dedc770 100644
--- a/Trigger/TrigValidation/TrigUpgradeTest/share/jetMenu.ref
+++ b/Trigger/TrigValidation/TrigUpgradeTest/share/jetMenu.ref
@@ -1,16 +1,8 @@
-TriggerSummaryStep1                     0   0     DEBUG  +++ HLT_j100 ID#625306965
-TriggerSummaryStep1                     0   0     DEBUG  +++ HLT_j85 ID#3478728990
-TriggerSummaryStep1                     1   0     DEBUG  +++ HLT_j100 ID#625306965
-TriggerSummaryStep1                     1   0     DEBUG  +++ HLT_j85 ID#3478728990
-TriggerSummaryStep1                     3   0     DEBUG  +++ HLT_j100 ID#625306965
-TriggerSummaryStep1                     3   0     DEBUG  +++ HLT_j85 ID#3478728990
-TriggerSummaryStep1                     10  0     DEBUG  +++ HLT_j100 ID#625306965
-TriggerSummaryStep1                     10  0     DEBUG  +++ HLT_j85 ID#3478728990
-TriggerSummaryStep1                     13  0     DEBUG  +++ HLT_j100 ID#625306965
-TriggerSummaryStep1                     13  0     DEBUG  +++ HLT_j85 ID#3478728990
-TriggerSummaryStep1                     19  0     DEBUG  +++ HLT_j100 ID#625306965
-TriggerSummaryStep1                     19  0     DEBUG  +++ HLT_j85 ID#3478728990
-TrigSignatureMoniMT                                INFO HLT_j100                      20        20        6         6         
-TrigSignatureMoniMT                                INFO HLT_j100 decisions                                6         
-TrigSignatureMoniMT                                INFO HLT_j85                       20        20        6         6         
-TrigSignatureMoniMT                                INFO HLT_j85 decisions                                 6         
+TriggerSummaryStep1                     1   0     DEBUG  +++ HLT_j45 ID#3664574289
+TriggerSummaryStep1                     3   0     DEBUG  +++ HLT_j45 ID#3664574289
+TriggerSummaryStep1                     10  0     DEBUG  +++ HLT_j45 ID#3664574289
+TriggerSummaryStep1                     19  0     DEBUG  +++ HLT_j45 ID#3664574289
+TrigSignatureMoniMT                                INFO HLT_j45                       20        20        4         4         
+TrigSignatureMoniMT                                INFO HLT_j45 decisions                                 4         
+TrigSignatureMoniMT                                INFO HLT_j85                       20        20        0         0         
+TrigSignatureMoniMT                                INFO HLT_j85 decisions                                 0         
diff --git a/Trigger/TrigValidation/TrigUpgradeTest/share/simpleJetJob.py b/Trigger/TrigValidation/TrigUpgradeTest/share/simpleJetJob.py
index e5fb55effd1252ee26ad63eba5d0ab4c092e8288..b4702163378974077116cbe585cc52e09956250b 100644
--- a/Trigger/TrigValidation/TrigUpgradeTest/share/simpleJetJob.py
+++ b/Trigger/TrigValidation/TrigUpgradeTest/share/simpleJetJob.py
@@ -27,7 +27,10 @@ if TriggerFlags.doCalo:
 
 
     # menu items
-     CTPToChainMapping = {"HLT_j85":       "L1_J20"  , "HLT_j100" : "L1_J20" }
+     CTPToChainMapping = {
+       "HLT_j85":       "L1_J20"  ,
+       "HLT_j45" : "L1_J20"
+     }
      testChains =[x for x, y in CTPToChainMapping.items()]
      topSequence.L1DecoderTest.ChainToCTPMapping = CTPToChainMapping
      print testChains
@@ -67,13 +70,20 @@ if TriggerFlags.doCalo:
      (recoSequence, sequenceOut) = jetRecoSequence(inputRoIs)
 
      from TrigHLTJetHypo.TrigHLTJetHypoConf import TrigJetHypoAlgMT
-     from TrigHLTJetHypo.TrigJetHypoToolConfig import trigJetHypoToolFromName
+     from TrigHLTJetHypo.TrigJetHypoToolConfig import trigJetHypoToolFromDict
      hypo = TrigJetHypoAlgMT("jethypo")
      hypo.OutputLevel = DEBUG
      hypo.Jets = sequenceOut
      hypo.HypoInputDecisions = hypoDecisions
      hypo.HypoOutputDecisions = "jetDecisions"
-     hypo.HypoTools = [ trigJetHypoToolFromName( c, c ) for c in testChains ] 
+     
+     def make_dict(chain_name):
+       from TriggerMenuMT.HLTMenuConfig.Menu import DictFromChainName
+       chainNameDecoder = DictFromChainName.DictFromChainName()
+       return chainNameDecoder.getChainDict(chain_name)
+       
+     hypo.HypoTools = [trigJetHypoToolFromDict(make_dict(c))
+                       for c in testChains] 
      print hypo
      for tool in hypo.HypoTools:
          print tool
diff --git a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/SignatureDicts.py b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/SignatureDicts.py
index 1901479088dad8e19e8f0fcfc53cc999f6e932dd..baaa2778a2ef0d17584d7f328bd041d1cdd0eee9 100644
--- a/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/SignatureDicts.py
+++ b/Trigger/TriggerCommon/TriggerMenuMT/python/HLTMenuConfig/Menu/SignatureDicts.py
@@ -126,7 +126,9 @@ JetChainParts = {
     'bTracking'    : [],
     'bConfig'      : ['split',],
     'bMatching'    : ['antimatchdr05mu'],
-    'trkopt'       : []
+    'trkopt'       : [],
+    'hypoScenario' : ['simple', 'vbenf'],
+    'smc'          : ['30smcINF', '35smcINF', '40smcINF', '50smcINF', '60smcINF', 'nosmc'],
 }
 
 # ---- Jet Dictinary of default Values ----
@@ -153,6 +155,8 @@ JetChainParts_Default = {
     'bMatching'    : [],
     'dataScouting' : '',
     'trkopt'       : 'notrk',
+    'hypoScenario' : 'simple',
+    'smc'          : 'nosmc',
     }
 
 #==========================================================