From 8af5af2c1298f06a1d79a7d146a4e7ee6bb29b8b Mon Sep 17 00:00:00 2001
From: Eduardo Rodrigues <eduardo.rodrigues@cern.ch>
Date: Tue, 28 Nov 2017 12:54:25 +0000
Subject: [PATCH] Merge branch 'apearce-validate-turbo-configuration' into
 'master'

Validate DaVinci configuration for Turbo data

See merge request lhcb/DaVinci!116

(cherry picked from commit b715c5a0db6b9da16c8110630a563ee16cd5822d)

59a7a745 Validate DaVinci configuration for Turbo data.
a86fdeb8 Fix typo.
---
 DaVinciTests/tests/options/DV_Turbo_Error.py  |  9 +++++++++
 .../tests/options/DV_Turbo_Implicit.py        | 14 +++++++++++++
 DaVinciTests/tests/options/DV_Turbo_OK.py     |  8 ++++++++
 .../davinci.qms/davinci_turbo_error.qmt       | 19 ++++++++++++++++++
 .../davinci.qms/davinci_turbo_implicit.qmt    | 20 +++++++++++++++++++
 .../qmtest/davinci.qms/davinci_turbo_ok.qmt   | 13 ++++++++++++
 Phys/DaVinci/python/DaVinci/Configuration.py  | 12 +++++++++++
 7 files changed, 95 insertions(+)
 create mode 100644 DaVinciTests/tests/options/DV_Turbo_Error.py
 create mode 100755 DaVinciTests/tests/options/DV_Turbo_Implicit.py
 create mode 100755 DaVinciTests/tests/options/DV_Turbo_OK.py
 create mode 100644 DaVinciTests/tests/qmtest/davinci.qms/davinci_turbo_error.qmt
 create mode 100644 DaVinciTests/tests/qmtest/davinci.qms/davinci_turbo_implicit.qmt
 create mode 100644 DaVinciTests/tests/qmtest/davinci.qms/davinci_turbo_ok.qmt

diff --git a/DaVinciTests/tests/options/DV_Turbo_Error.py b/DaVinciTests/tests/options/DV_Turbo_Error.py
new file mode 100644
index 000000000..34172814c
--- /dev/null
+++ b/DaVinciTests/tests/options/DV_Turbo_Error.py
@@ -0,0 +1,9 @@
+"""Invalid configuration for running over Turbo data."""
+from Configurables import DaVinci
+
+dv = DaVinci()
+dv.DataType = '2016'
+dv.InputType = 'MDST'
+dv.Turbo = True
+# The absence of this setting should cause DaVinci to throw an exception
+# dv.RootInTES = '/Event/Turbo'
diff --git a/DaVinciTests/tests/options/DV_Turbo_Implicit.py b/DaVinciTests/tests/options/DV_Turbo_Implicit.py
new file mode 100755
index 000000000..ab3a21c41
--- /dev/null
+++ b/DaVinciTests/tests/options/DV_Turbo_Implicit.py
@@ -0,0 +1,14 @@
+"""Valid configuration for running over Turbo data.
+
+We don't set InputType to MDST explicitly, but this should be done by the
+DaVinci configuration.
+"""
+from Configurables import DaVinci
+
+dv = DaVinci()
+dv.DataType = '2016'
+# This value should be set automatically as Turbo = True (although it's better
+# to set it explicitly anyway)
+# dv.InputType = 'MDST'
+dv.Turbo = True
+dv.RootInTES = '/Event/Turbo'
diff --git a/DaVinciTests/tests/options/DV_Turbo_OK.py b/DaVinciTests/tests/options/DV_Turbo_OK.py
new file mode 100755
index 000000000..ed4b14212
--- /dev/null
+++ b/DaVinciTests/tests/options/DV_Turbo_OK.py
@@ -0,0 +1,8 @@
+"""Valid configuration for running over Turbo data."""
+from Configurables import DaVinci
+
+dv = DaVinci()
+dv.DataType = '2016'
+dv.InputType = 'MDST'
+dv.Turbo = True
+dv.RootInTES = '/Event/Turbo'
diff --git a/DaVinciTests/tests/qmtest/davinci.qms/davinci_turbo_error.qmt b/DaVinciTests/tests/qmtest/davinci.qms/davinci_turbo_error.qmt
new file mode 100644
index 000000000..c4f1130da
--- /dev/null
+++ b/DaVinciTests/tests/qmtest/davinci.qms/davinci_turbo_error.qmt
@@ -0,0 +1,19 @@
+<?xml version="1.0" ?>
+<!DOCTYPE extension  PUBLIC '-//QM/2.3/Extension//EN'  'http://www.codesourcery.com/qm/dtds/2.3/-//qm/2.3/extension//en.dtd'>
+<extension class="GaudiTest.GaudiExeTest" kind="test">
+  <argument name="program">
+    <text>gaudirun.py</text>
+  </argument>
+  <argument name="args"><set>
+      <text>../options/DV_Turbo_Error.py</text>
+  </set></argument>
+  <argument name="validator"><text>
+expected = &quot;DaVinci.Configuration.DaVinciConfigurationError: You must set DaVinci().RootInTES when DaVinci().Turbo is `True`&quot;
+if stderr.find(expected) == -1:
+    causes.append('missing string in stderr')
+    result['GaudiTest.expected_string'] = result.Quote(expected)
+  </text></argument>
+  <argument name="exit_code">
+    <integer>1</integer>
+  </argument>
+</extension>
diff --git a/DaVinciTests/tests/qmtest/davinci.qms/davinci_turbo_implicit.qmt b/DaVinciTests/tests/qmtest/davinci.qms/davinci_turbo_implicit.qmt
new file mode 100644
index 000000000..3bef3a9d9
--- /dev/null
+++ b/DaVinciTests/tests/qmtest/davinci.qms/davinci_turbo_implicit.qmt
@@ -0,0 +1,20 @@
+<?xml version="1.0" ?>
+<!DOCTYPE extension  PUBLIC '-//QM/2.3/Extension//EN'  'http://www.codesourcery.com/qm/dtds/2.3/-//qm/2.3/extension//en.dtd'>
+<extension class="GaudiTest.GaudiExeTest" kind="test">
+  <argument name="program">
+    <text>gaudirun.py</text>
+  </argument>
+  <argument name="args"><set>
+    <text>../options/DV_Turbo_Implicit.py</text>
+  </set></argument>
+  <argument name="validator">
+    <text>
+findReferenceBlock("""
+# |-InputType            = 'MDST'  (default: 'DST')
+""")
+    </text>
+  </argument>
+  <argument name="exit_code">
+    <integer>0</integer>
+  </argument>
+</extension>
diff --git a/DaVinciTests/tests/qmtest/davinci.qms/davinci_turbo_ok.qmt b/DaVinciTests/tests/qmtest/davinci.qms/davinci_turbo_ok.qmt
new file mode 100644
index 000000000..cbb56aa96
--- /dev/null
+++ b/DaVinciTests/tests/qmtest/davinci.qms/davinci_turbo_ok.qmt
@@ -0,0 +1,13 @@
+<?xml version="1.0" ?>
+<!DOCTYPE extension  PUBLIC '-//QM/2.3/Extension//EN'  'http://www.codesourcery.com/qm/dtds/2.3/-//qm/2.3/extension//en.dtd'>
+<extension class="GaudiTest.GaudiExeTest" kind="test">
+  <argument name="program">
+    <text>gaudirun.py</text>
+  </argument>
+  <argument name="args"><set>
+    <text>../options/DV_Turbo_OK.py</text>
+  </set></argument>
+  <argument name="exit_code">
+    <integer>0</integer>
+  </argument>
+</extension>
diff --git a/Phys/DaVinci/python/DaVinci/Configuration.py b/Phys/DaVinci/python/DaVinci/Configuration.py
index ec894754a..bf2aca34a 100644
--- a/Phys/DaVinci/python/DaVinci/Configuration.py
+++ b/Phys/DaVinci/python/DaVinci/Configuration.py
@@ -18,6 +18,12 @@ import GaudiKernel.ProcessJobOptions
 from AnalysisPython.Logger import getLogger
 log = getLogger ( 'DaVinci' )
 
+
+class DaVinciConfigurationError(Exception):
+    """Exception type raised when DaVinci is not configured consistently."""
+    pass
+
+
 class DaVinci(LHCbConfigurableUser) :
     
     __slots__ = {
@@ -400,6 +406,12 @@ class DaVinci(LHCbConfigurableUser) :
                 DstConf().setProp("SimType","Full")
 
         if self.getProp("Turbo"):
+            log.debug("Forcing `InputType` to `'MDST'` as `Turbo` is `True`")
+            self.setProp("InputType", "MDST")
+            if not self.getProp("RootInTES"):
+                raise DaVinciConfigurationError((
+                    "You must set DaVinci().RootInTES when DaVinci().Turbo is `True`"
+                ))
             if self.getProp("DataType") == "2016":
                 # Enable the decoding of the persisted reconstruction objects
                 TurboConf().RunPackedDataDecoder = True
-- 
GitLab