ATLAS Offline Software
Toggle main menu visibility
Loading...
Searching...
No Matches
DataQuality
DQUtils
python
oracle.py
Go to the documentation of this file.
1
#! /usr/bin/env python
2
3
# Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
4
5
from
sqlalchemy
import
(select, create_engine, MetaData, Table, Column, String,
6
Integer)
7
from
sqlalchemy.orm
import
sessionmaker
8
from
sqlalchemy.sql
import
and_
9
10
from
DQUtils.sugar
import
IOVSet
11
from
xml.dom.minidom
import
parse
12
from
os.path
import
exists
13
14
from
urllib.parse
import
urlparse
# noqa: E402
15
16
def
parse_auth_file
(file_name, connection):
17
18
dom =
parse
(file_name)
19
20
connections = dom.getElementsByTagName(
"connection"
)
21
desired_conn =
lambda
c: c.attributes.get(
"name"
).value == connection
22
23
connections = list(filter(desired_conn, connections))
24
25
if
len(connections) < 1:
26
return
None
27
28
info = {}
29
for
node
in
connections[0].childNodes:
30
if
node.nodeName ==
"parameter"
:
31
info[node.getAttribute(
"name"
)] = str(node.getAttribute(
"value"
))
32
33
authentication = info[
"user"
], info[
"password"
]
34
return
authentication
35
36
def
get_authentication
(connection="oracle://ATLAS_COOLPROD/ATLAS_COOLONL_GLOBAL
"):
37
"""
38
Retrieves authentication information from CORAL_AUTH_PATH authentication.xml
39
"""
40
41
from
os
import
environ
42
from
os.path
import
join
as
pjoin
43
assert
"CORAL_AUTH_PATH"
in
environ,
"CORAL_AUTH_PATH environment var not set"
44
45
auth_paths = environ[
"CORAL_AUTH_PATH"
].
split
(
":"
)
46
47
for
auth_path
in
auth_paths + [
"."
]:
48
file_name = pjoin(auth_path,
"authentication.xml"
)
49
if
exists
(file_name):
50
authentication =
parse_auth_file
(file_name, connection)
51
if
authentication:
52
return
authentication
53
54
raise
RuntimeError(
"Unable to locate credentials for %s."
55
% connection)
56
57
def
make_oracle_connection
(connection_string):
58
"oracle://ATLAS_COOLPROD/ATLAS_COOLONL_GLOBAL"
59
assert
connection_string.startswith(
"oracle://"
),
"Not a connection string"
60
host = urlparse (connection_string[len(
"oracle:"
):]).netloc
61
username, password =
get_authentication
(connection_string)
62
conn_str =
"oracle://%s:%s@%s"
% (username, password, host)
63
engine = create_engine(conn_str, pool_recycle=10*60)
64
metadata = MetaData()
65
metadata.reflect(engine)
66
return
engine, metadata
67
68
#conn_str = "oracle://%s:%s@ATLAS_COOLPROD" % get_authentication()
69
70
# Recycle the connection every 10 minutes
71
#engine = create_engine(conn_str, pool_recycle=10*60)
72
#metadata = MetaData(bind=engine)
73
74
engine, metadata =
make_oracle_connection
(
"oracle://ATLAS_COOLPROD"
75
"/ATLAS_COOLONL_GLOBAL"
)
76
Session = sessionmaker(engine)
77
78
run_table = Table(
"ATLAS_RUN_NUMBER.RUNNUMBER"
, metadata,
79
Column(
"NAME"
, String),
80
Column(
"RUNNUMBER"
, String),
81
Column(
"STARTAT"
, String),
82
Column(
"DURATION"
, Integer),
83
Column(
"CREATEDBY"
, String),
84
Column(
"HOST"
, String),
85
Column(
"PARTITIONNAME"
, String),
86
Column(
"CONFIGSCHEMA"
, Integer),
87
Column(
"CONFIGDATA"
, String),
88
Column(
"COMMENTS"
, String),
89
quote=
False
90
)
91
92
ONE_WEEK = 7*24*3600
93
94
def
fetch_recent_runs
(how_recent=ONE_WEEK, ascending=False):
95
"""
96
Retrieve a list of ATLAS runs from the database, since first_run
97
"""
98
from
time
import
time, strftime, gmtime
99
t = run_table
100
101
ordering = t.c.RUNNUMBER.asc()
if
ascending
else
t.c.RUNNUMBER.desc()
102
103
this_recent = strftime(
"%Y%m%dT%H%M%S"
, gmtime(time()-how_recent))
104
condition = and_(t.c.STARTAT >= this_recent, t.c.PARTITIONNAME ==
"ATLAS"
)
105
rows = select(run_table).where(condition).order_by(ordering)
106
with
Session
()
as
session:
107
return
session.execute(rows).fetchall()
108
109
def
fetch_runs_since
(first_run=140000, ascending=False):
110
"""
111
Retrieve a list of ATLAS runs from the database, since first_run
112
"""
113
t = run_table
114
115
ordering = t.c.RUNNUMBER.asc()
if
ascending
else
t.c.RUNNUMBER.desc()
116
117
condition = and_(t.c.RUNNUMBER > first_run, t.c.PARTITIONNAME ==
"ATLAS"
)
118
rows = select(run_table).where(condition).order_by(ordering)
119
with
Session
()
as
session:
120
return
session.execute(rows).fetchall()
121
122
def
make_atlas_partition_query
():
123
return
(select(run_table.c.RUNNUMBER)
124
.where(run_table.c.PARTITIONNAME ==
"ATLAS"
)
125
.order_by(run_table.c.RUNNUMBER))
126
127
def
fetch_last_n_atlas_runs
(n=10):
128
rows = (select(run_table.c.RUNNUMBER)
129
.where(run_table.c.PARTITIONNAME ==
"ATLAS"
)
130
.order_by(run_table.c.RUNNUMBER.desc()).limit(n))
131
132
with
Session
()
as
session:
133
return
[row.RUNNUMBER
for
row
in
reversed(session.execute(rows).fetchall())]
134
135
def
fetch_atlas_runs
():
136
rows =
make_atlas_partition_query
()
137
with
Session
()
as
session:
138
return
session.execute(rows).fetchall()
139
140
def
atlas_runs_set
():
141
return
set
(x.RUNNUMBER
for
x
in
fetch_atlas_runs
())
142
143
def
atlas_runs_between
(first, last):
144
145
rows =
make_atlas_partition_query
()
146
rows = rows.where(run_table.c.RUNNUMBER.between(first, last))
147
148
with
Session
()
as
session:
149
return
[row.RUNNUMBER
for
row
in
session.execute(rows).fetchall()]
150
151
def
filter_atlas_runs
(iovs):
152
153
iov_runs =
set
(iov.since.run
for
iov
in
iovs)
154
first, last =
min
(iov_runs),
max
(iov_runs)
155
156
rows =
make_atlas_partition_query
()
157
rows = rows.where(run_table.c.RUNNUMBER.between(first, last))
158
159
with
Session
()
as
session:
160
atlas_runs =
set
(row.RUNNUMBER
for
row
in
session.execute(rows).fetchall())
161
keep_runs = atlas_runs.intersection(iov_runs)
162
163
return
IOVSet(iov
for
iov
in
iovs
if
iov.since.run
in
keep_runs)
164
min
#define min(a, b)
Definition
cfImp.cxx:40
max
#define max(a, b)
Definition
cfImp.cxx:41
set
STL class.
exists
bool exists(const std::string &filename)
does a file exist
Definition
computils.cxx:256
parse
std::map< std::string, std::string, std::less<> > parse(const std::string &list)
Definition
egammaLayerRecalibTool.cxx:1180
split
std::vector< std::string > split(const std::string &s, const std::string &t=":")
Definition
hcg.cxx:179
python.oracle.fetch_last_n_atlas_runs
fetch_last_n_atlas_runs(n=10)
Definition
oracle.py:127
python.oracle.Session
Session
Definition
oracle.py:76
python.oracle.fetch_runs_since
fetch_runs_since(first_run=140000, ascending=False)
Definition
oracle.py:109
python.oracle.get_authentication
get_authentication(connection="oracle://ATLAS_COOLPROD/ATLAS_COOLONL_GLOBAL")
Definition
oracle.py:36
python.oracle.make_atlas_partition_query
make_atlas_partition_query()
Definition
oracle.py:122
python.oracle.atlas_runs_set
atlas_runs_set()
Definition
oracle.py:140
python.oracle.atlas_runs_between
atlas_runs_between(first, last)
Definition
oracle.py:143
python.oracle.fetch_atlas_runs
fetch_atlas_runs()
Definition
oracle.py:135
python.oracle.filter_atlas_runs
filter_atlas_runs(iovs)
Definition
oracle.py:151
python.oracle.fetch_recent_runs
fetch_recent_runs(how_recent=ONE_WEEK, ascending=False)
Definition
oracle.py:94
python.oracle.make_oracle_connection
make_oracle_connection(connection_string)
Definition
oracle.py:57
python.oracle.parse_auth_file
parse_auth_file(file_name, connection)
Definition
oracle.py:16
Generated on
for ATLAS Offline Software by
1.17.0