diff --git a/Control/DataModelTest/DataModelTestDataCommon/scripts/dmtest_condwriter.py b/Control/DataModelTest/DataModelTestDataCommon/scripts/dmtest_condwriter.py index c3bace485971def147dbc0c9dfabb60920d001c4..a36dd7a37fde57602bcc38f5e2b4c32ac4bdf8ba 100755 --- a/Control/DataModelTest/DataModelTestDataCommon/scripts/dmtest_condwriter.py +++ b/Control/DataModelTest/DataModelTestDataCommon/scripts/dmtest_condwriter.py @@ -1,13 +1,11 @@ #!/usr/bin/env python # -# Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration +# Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration # # Script to create an AthenaAttributeList with a single attribute "xint". # Usage example: dmtest_condwriter.py --rs=1 --ls=1 'sqlite://;schema=test.db;dbname=OFLP200' AttrList_noTag 42 # -from __future__ import print_function - import sys,os os.environ['CLING_STANDARD_PCH'] = 'none' #See bug ROOT-10789 from PyCool import cool @@ -19,22 +17,21 @@ class createTestDB(AtlCoolLib.coolTool): # set values of non-optional parameters self.tag=str(args[0]) self.xint=int(args[1]) - + self.folder=args[2] if len(args)>2 else '/DMTest/TestAttrList' + def usage(self): """ Define the additional syntax for options """ self._usage1() - print ('TAG xint') + print ('TAG xint [Folder]') self._usage2() def execute(self): - folder='/DMTest/TestAttrList' - # do update - setup folder specification and create if needed spec = cool.RecordSpecification() spec.extend("xint", cool.StorageType.Int32) - print (">== Store object in folder",folder) - cfolder = AtlCoolLib.ensureFolder(self.db, folder, spec, + print (">== Store object in folder", self.folder) + cfolder = AtlCoolLib.ensureFolder(self.db, self.folder, spec, AtlCoolLib.athenaDesc(self.runLumi, 'AthenaAttributeList'), cool.FolderVersioning.MULTI_VERSION) if (cfolder is None): sys.exit(1) @@ -56,6 +53,6 @@ class createTestDB(AtlCoolLib.coolTool): # print full content act = AtlCoolTool.AtlCoolTool(self.db) - print (act.more(folder)) + print (act.more(self.folder)) -mytool = createTestDB('dmtest_condwriter.py',False,3,3,[]) +mytool = createTestDB('dmtest_condwriter.py',False,3,4,[]) diff --git a/Trigger/TrigValidation/TrigP1Test/Testing/condStopStart.trans b/Trigger/TrigValidation/TrigP1Test/Testing/condStopStart.trans new file mode 100644 index 0000000000000000000000000000000000000000..03b81a58a529bf0c5d525f5fe52b28817cc865b9 --- /dev/null +++ b/Trigger/TrigValidation/TrigP1Test/Testing/condStopStart.trans @@ -0,0 +1,15 @@ +x os.system("rm -f cond.db") +x os.system("dmtest_condwriter.py --rs 360026 'sqlite://;schema=cond.db;dbname=CONDBR2' HEAD 10 /DMTest/TestAttrList") +x os.system("dmtest_condwriter.py --ts 0 'sqlite://;schema=cond.db;dbname=CONDBR2' HEAD 100 /DMTest/TestAttrListTime") +f +f +f +b +x os.system("dmtest_condwriter.py --rs 360027 'sqlite://;schema=cond.db;dbname=CONDBR2' HEAD 20 /DMTest/TestAttrList") +x os.system("dmtest_condwriter.py --ts 2000000000 'sqlite://;schema=cond.db;dbname=CONDBR2' HEAD 200 /DMTest/TestAttrListTime") +x os.remove('raw.data'); os.symlink('cond._0001.data','raw.data') +f +b +b +b +e diff --git a/Trigger/TrigValidation/TrigP1Test/share/testHLT_condStopStart.py b/Trigger/TrigValidation/TrigP1Test/share/testHLT_condStopStart.py new file mode 100644 index 0000000000000000000000000000000000000000..2f1c4471591cd6782247e07bebf06505f3a97a76 --- /dev/null +++ b/Trigger/TrigValidation/TrigP1Test/share/testHLT_condStopStart.py @@ -0,0 +1,44 @@ +# Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration +# +# Test stop/start for conditions that are updated during the run. +# + +from AthenaCommon.AlgSequence import AlgSequence, AthSequencer + +#-------------------------------------------------------------- +# Conditions setup. +#-------------------------------------------------------------- +from IOVDbSvc.CondDB import conddb +from AthenaCommon.GlobalFlags import globalflags +globalflags.DataSource = 'data' +globalflags.ConditionsTag = 'CONDBR2-HLTP-2018-01' +conddb.setGlobalTag(globalflags.ConditionsTag()) + +# These folders are filled in Testing/condStopStart.trans +conddb.addFolder ('cond.db', '/DMTest/TestAttrList <tag>HEAD</tag>', + className='AthenaAttributeList') +conddb.addFolder ('cond.db', '/DMTest/TestAttrListTime <tag>HEAD</tag>', + className='AthenaAttributeList') + +#-------------------------------------------------------------- +# Setup AlgSequence +#-------------------------------------------------------------- +from DataModelTestDataCommon.DataModelTestDataCommonConf import (DMTest__CondReaderAlg, + DMTest__CondAlg1) +topSequence = AlgSequence() +condSeq = AthSequencer("AthCondSeq") + +# Required by CondReaderAlg +topSequence.SGInputLoader.Load += [( 'xAOD::EventInfo' , 'StoreGateSvc+EventInfo' )] + +# Reader for run-based and time-based folders +topSequence += DMTest__CondReaderAlg( "CondReaderAlg1", + AttrListKey = "/DMTest/TestAttrList", + S2Key = "") + +topSequence += DMTest__CondReaderAlg( "CondReaderAlg2", + AttrListKey = "/DMTest/TestAttrListTime", + S2Key = "") + +# A dummy CondAlg +condSeq += DMTest__CondAlg1() diff --git a/Trigger/TrigValidation/TrigP1Test/share/test_trigP1_condStopStart.ref b/Trigger/TrigValidation/TrigP1Test/share/test_trigP1_condStopStart.ref new file mode 100644 index 0000000000000000000000000000000000000000..2b56f31c6ec72ec61de98b028da568394e385b48 --- /dev/null +++ b/Trigger/TrigValidation/TrigP1Test/share/test_trigP1_condStopStart.ref @@ -0,0 +1,20 @@ +CondReaderAlg1 1 0 INFO xint xint (int) : 10 +CondReaderAlg2 1 0 INFO xint xint (int) : 100 +CondReaderAlg1 2 0 INFO xint xint (int) : 10 +CondReaderAlg2 2 0 INFO xint xint (int) : 100 +CondReaderAlg1 3 0 INFO xint xint (int) : 10 +CondReaderAlg2 3 0 INFO xint xint (int) : 100 +CondReaderAlg1 4 0 INFO xint xint (int) : 10 +CondReaderAlg2 4 0 INFO xint xint (int) : 100 +CondReaderAlg1 5 0 INFO xint xint (int) : 10 +CondReaderAlg2 5 0 INFO xint xint (int) : 100 +CondReaderAlg1 1 0 INFO xint xint (int) : 20 +CondReaderAlg2 1 0 INFO xint xint (int) : 200 +CondReaderAlg1 2 0 INFO xint xint (int) : 20 +CondReaderAlg2 2 0 INFO xint xint (int) : 200 +CondReaderAlg1 3 0 INFO xint xint (int) : 20 +CondReaderAlg2 3 0 INFO xint xint (int) : 200 +CondReaderAlg1 4 0 INFO xint xint (int) : 20 +CondReaderAlg2 4 0 INFO xint xint (int) : 200 +CondReaderAlg1 5 0 INFO xint xint (int) : 20 +CondReaderAlg2 5 0 INFO xint xint (int) : 200 diff --git a/Trigger/TrigValidation/TrigP1Test/test/test_trigP1_condStopStart_build.py b/Trigger/TrigValidation/TrigP1Test/test/test_trigP1_condStopStart_build.py new file mode 100755 index 0000000000000000000000000000000000000000..66306311edd53b85c7e9fa39467ee09cfa739702 --- /dev/null +++ b/Trigger/TrigValidation/TrigP1Test/test/test_trigP1_condStopStart_build.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python +# Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration + +# art-description: test reloading of conditions during stop/start +# art-type: build +# art-include: master/Athena +# art-include: 22.0/Athena +# Skipping art-output which has no effect for build tests. +# If you create a grid version, check art-output in existing grid tests. + +# This test simulates conditions changes between runs, i.e. between stop/start +# transitions like it would happen at P1. In order to be able to increment the run +# number we employ a rather nasty trick: +# 1) the first run is done on the regular input file symlinked to raw.data +# 2) after stop, we switch the symlink to a copy of the file with the +# run number and timestamp increased +# +# The files are prepared here, and the symlinking and writing of conditions +# happens in Testing/condStopStart.trans. The expected outcome is: +# 1st run: xint = 10 (Run/LB IOV) and 100 (Timebased IOV) +# 2nd run: xint = 20 (Run/LB IOV) and 200 (Timebased IOV) +# + +from TrigValTools.TrigValSteering import Test, Step, ExecStep, CheckSteps +from TrigValTools.TrigValSteering.Input import get_input + +import os +import eformat + +# Create a symlink to the first input file +input_file = get_input('data').paths[0] +first_event = eformat.istream(input_file)[0] +run_no = first_event.run_no() + +try: + os.remove('raw.data') +except Exception: + pass +os.symlink(input_file, 'raw.data') + +# Delete any previous bytestream file +ex_rm = ExecStep.ExecStep('cleanup') +ex_rm.type = 'other' +ex_rm.input = '' +ex_rm.executable = 'rm' +ex_rm.args = '-f cond*.data' +ex_rm.auto_report_result = False # Do not set art-result for this step +ex_rm.output_stream = Step.Step.OutputStream.STDOUT_ONLY # Do not create a log file for this step + +# Make a copy of input BS file with increased run number and timestamp +t_future = 2000000000 # in the future, needs to match condStopStart.trans +ex_bs = ExecStep.ExecStep('create_bs') +ex_bs.type = 'other' +ex_bs.input = '' +ex_bs.executable = 'trigbs_modifyEvent.py' +ex_bs.args = f'-r {run_no+1} -t {t_future} -n 5 -o cond {input_file}' + +ex = ExecStep.ExecStep() +ex.type = 'athenaHLT' +ex.job_options = 'TrigP1Test/testHLT_condStopStart.py' +ex.input = '' +ex.max_events = 5 +ex.args = '-f raw.data -i -M -ul' +ex.perfmon = False + +# Pass the transitions file into athenaHLT -i +ex.cmd_suffix = ' < `find_data.py condStopStart.trans`' + +test = Test.Test() +test.art_type = 'build' +test.exec_steps = [ex_rm, ex_bs, ex] +test.check_steps = CheckSteps.default_check_steps(test) + +# Extra merging pattern for logs produced with -ul option +logmerge = test.get_step("LogMerge") +logmerge.extra_log_regex = 'athenaHLT-.*-.*(.out|.err)' + +# Compare to reference +refcomp = CheckSteps.RegTestStep('RegTest') +refcomp.regex = 'CondReaderAlg.*xint' +refcomp.reference = 'TrigP1Test/test_trigP1_condStopStart.ref' +refcomp.required = True # Final exit code depends on this step +test.check_steps.insert(-1, refcomp) # Add before the last (zip) step + +import sys +sys.exit(test.run())