DUNE-DAQ
DUNE Trigger and Data Acquisition software
Toggle main menu visibility
Loading...
Searching...
No Matches
dunedaq
sourcecode
daqconf
python
daqconf
consolidate.py
Go to the documentation of this file.
1
from
pathlib
import
Path
2
import
conffwk
3
import
sys
4
import
os
5
from
logging
import
getLogger
6
from
typing
import
Optional, Tuple
7
log = getLogger(
'daqconf.consolidate'
)
8
9
10
def
get_all_includes
(db: conffwk.Configuration, file: str) -> list[str]:
11
"""
12
Recursively get all includes from an OKS database
13
14
Args:
15
db (conffwk.Configuration): The OKS database to get includes from
16
file (str): The file to get includes from
17
18
Returns:
19
list(str): A list of all includes in the database
20
21
Raises:
22
None
23
"""
24
includes = db.get_includes(file)
25
for
include
in
includes:
26
if
"data.xml"
not
in
include:
27
continue
28
includes +=
get_all_includes
(db, include)
29
30
return
list(set(includes))
31
32
def
consolidate_db
(
33
oksfile: str, output_file: str, session_id: Optional[str] =
None
34
) ->
None
:
35
"""
36
Consolidates a session database files into a single file.
37
38
The consolidated file contains all the schema and data required to define the entire
39
session. If session_id is None, all sessions will be consolidated into the single
40
output file.
41
42
Args:
43
oksfile: OKS file(s) to consolidate
44
output_file: File to output consolidated database to
45
session_id: Name of session, defaults to None
46
47
Returns:
48
None
49
50
Raises:
51
None
52
"""
53
log.info(f
"Consolidating database into output database '{output_file}'. Input database: '{oksfile}'."
)
54
55
sys.setrecursionlimit(10000)
# for example
56
db, new_db =
create_copy_template
(oksfile, output_file)
57
58
if
session_id
is
None
:
59
log.debug(
"Consolidating all dals in %s into %s"
, oksfile, output_file)
60
consolidate_full
(db, new_db)
61
else
:
62
log.debug(
"Consolidating all dals in session %s from %s into %s"
, session_id, oksfile, output_file)
63
64
consolidate_session
(db, new_db, session_id)
65
66
67
def
create_copy_template
(oksfile: str, output_file: str)->Tuple[
conffwk.Configuration
,
conffwk.Configuration
]:
68
"""
69
Create a blank oks .data.xml template file with all the schema includes of oksfile.
70
71
Args:
72
oksfile: OKS file to copy includes from
73
output_file: OKS file to copy includes into
74
75
Returns:
76
Tuple of old_db, copied_db
77
"""
78
log.debug(
"Reading database"
)
79
db =
conffwk.Configuration
(
"oksconflibs:"
+ oksfile)
80
81
schemafiles = []
82
includes =
get_all_includes
(db,
None
)
83
schemafiles += [i
for
i
in
includes
if
"schema.xml"
in
i]
84
log.debug(f
"Included schemas: {schemafiles}"
)
85
86
log.debug(
"Creating new database"
)
87
new_db =
conffwk.Configuration
(
"oksconflibs"
)
88
new_db.create_db(output_file, schemafiles)
89
new_db.commit()
90
91
return
db, new_db
92
93
94
def
consolidate_full
(db: conffwk.Configuration, new_db:
conffwk.Configuration
)->
None
:
95
"""Consolidates ALL dal objects in db into new_db
96
97
:param db: A conffwk.Configuration containing objects you want to copy over
98
:param new_db: A conffwk.Configuration you want to copy objects into
99
"""
100
dal_list = list(db.get_all_dals().values())
101
copy_dals_to_cfg
(new_db, dal_list)
102
103
def
consolidate_session
(db: conffwk.Configuration, new_db:
conffwk.Configuration
, session_id: str)->
None
:
104
"""
105
Consolidates all objects related to the session with id 'session_id' into a single file
106
107
:param db: A conffwk.Configuration containing objects you want to copy over
108
:param new_db: A conffwk.Configuration you want to copy objects into
109
:param session_id: Name of session
110
"""
111
112
# Check session exists and load
113
try
:
114
dal_session = db.get_dal(
'Session'
, session_id)
115
except
Exception
as
e:
116
log.exception(e)
117
raise
e
118
119
dal_list =
get_relationships
(db, dal_session, [])
120
copy_dals_to_cfg
(new_db, dal_list)
121
122
def
get_relationships
(db: conffwk.Configuration, current_dal:
conffwk.Configuration
, dal_list: list[
conffwk.Configuration
]) -> list[
conffwk.Configuration
]:
123
'''
124
Recurssively get all objects related to current_dal
125
'''
126
dal_list.append(current_dal)
127
128
for
rel
in
db.relations(current_dal.className(), all=
True
):
129
rel_obj = getattr(current_dal, rel,
None
)
130
if
rel_obj
is
None
:
131
continue
132
133
if
not
isinstance(rel_obj, list):
134
rel_obj = [rel_obj]
135
136
for
rel_obj
in
rel_obj:
137
dal_list =
get_relationships
(db, rel_obj, dal_list)
138
139
return
dal_list
140
141
142
def
copy_dals_to_cfg
(new_db: conffwk.Configuration, dal_list: list[
conffwk.Configuration
]) ->
None
:
143
'''
144
Copy a list of dals into a configuration
145
'''
146
log.debug(
"Copying %d objects to new db"
, len(dal_list))
147
for
dal
in
dal_list:
148
new_db.add_dal(dal)
149
150
log.debug(
"Saving database"
)
151
new_db.commit()
152
153
154
def
copy_configuration
(dest_dir : Path, input_files: list[
conffwk.Configuration
]) -> list[
conffwk.Configuration
]:
155
if
len(input_files) == 0:
156
return
[]
157
158
log.info(f
"Copying configuration represented by databases: \'{input_files}\' to \'{dest_dir}\'"
)
159
dest_dir = dest_dir.resolve()
# Always include by absolute path when copying
160
sys.setrecursionlimit(10000)
# for example
161
162
output_dbs = []
163
164
for
input_file
in
input_files:
165
db =
conffwk.Configuration
(
"oksconflibs:"
+ input_file)
166
includes = db.get_includes(
None
)
167
schemas = [i
for
i
in
includes
if
"schema.xml"
in
i]
168
dbs = [i
for
i
in
includes
if
"data.xml"
in
i]
169
newdbs =
copy_configuration
(dest_dir, dbs)
170
171
output_file = dest_dir / os.path.basename(input_file)
172
173
new_db =
conffwk.Configuration
(
"oksconflibs"
)
174
new_db.create_db(str(output_file), schemas + newdbs)
175
new_db.commit()
176
177
dals = db.get_all_dals()
178
179
for
dal
in
dals:
180
db.get_dal(dals[dal].className(), dals[dal].id)
181
new_db.add_dal(dals[dal])
182
183
new_db.commit()
184
output_dbs.append(str(output_file))
185
log.debug(
"DONE"
)
186
187
return
output_dbs
188
189
190
def
consolidate_files
(oksfile: str, *input_files) ->
None
:
191
includes = []
192
dbs = []
193
str_in_files =
'\n'
.join(input_files)
194
log.info(f
"Consolidating {len(input_files)} databases into output database \'{oksfile}\'. Input databases: {str_in_files}"
)
195
sys.setrecursionlimit(10000)
# for example
196
197
for
input_file
in
input_files:
198
dbs.append(
conffwk.Configuration
(
"oksconflibs:"
+ input_file))
199
includes +=
get_all_includes
(dbs[len(dbs) - 1],
None
)
200
201
includes = list(set(includes))
202
includes = [i
for
i
in
includes
if
i
not
in
input_files]
203
log.debug(f
"Included files: {includes}"
)
204
205
new_db =
conffwk.Configuration
(
"oksconflibs"
)
206
new_db.create_db(oksfile, includes)
207
208
new_db.commit()
209
210
for
db
in
dbs:
211
log.debug(f
"Reading dal objects from old db {db}"
)
212
dals = db.get_all_dals()
213
214
log.debug(f
"Copying objects to new db {new_db}"
)
215
for
dal
in
dals:
216
217
try
:
218
new_db.get_dal(dals[dal].className(), dals[dal].id)
219
except
:
220
new_db.add_dal(dals[dal])
221
new_db.commit()
222
223
log.debug(f
"Saving database {new_db}"
)
224
new_db.commit()
conffwk.Configuration.Configuration
Definition
Configuration.py:29
consolidate.consolidate_db
None consolidate_db(str oksfile, str output_file, Optional[str] session_id=None)
Definition
consolidate.py:34
consolidate.consolidate_files
None consolidate_files(str oksfile, *input_files)
Definition
consolidate.py:190
consolidate.consolidate_session
None consolidate_session(conffwk.Configuration db, conffwk.Configuration new_db, str session_id)
Definition
consolidate.py:103
consolidate.create_copy_template
Tuple[conffwk.Configuration, conffwk.Configuration] create_copy_template(str oksfile, str output_file)
Definition
consolidate.py:67
consolidate.get_all_includes
list[str] get_all_includes(conffwk.Configuration db, str file)
Definition
consolidate.py:10
consolidate.copy_configuration
list[conffwk.Configuration] copy_configuration(Path dest_dir, list[conffwk.Configuration] input_files)
Definition
consolidate.py:154
consolidate.copy_dals_to_cfg
None copy_dals_to_cfg(conffwk.Configuration new_db, list[conffwk.Configuration] dal_list)
Definition
consolidate.py:142
consolidate.get_relationships
list[conffwk.Configuration] get_relationships(conffwk.Configuration db, conffwk.Configuration current_dal, list[conffwk.Configuration] dal_list)
Definition
consolidate.py:122
consolidate.consolidate_full
None consolidate_full(conffwk.Configuration db, conffwk.Configuration new_db)
Definition
consolidate.py:94
Generated on
for DUNE-DAQ by
1.17.0