ATLAS Offline Software
folders.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
2 
3 from logging import getLogger; log = getLogger("DQDefects.folders")
4 
5 from DQUtils import Databases
6 
7 from DQDefects import (DEFECTS_FOLDER, DEFECT_FOLDER_DESC, DEFECT_LOGIC_FOLDER,
8  DEFECT_LOGIC_FOLDER_DESC, PARENT_FOLDERSET)
9 
10 from PyCool import cool
11 
12 from typing import Tuple
13 
14 ST = cool.StorageType
15 FV = cool.FolderVersioning
16 
18  """
19  This mixin contains code for managing the defect folders
20  """
21 
22  def __init__(self) -> None:
23  self._defects_folder = None
25  self._parent_folderset = None
26  self._connections = []
27  super(DefectsDBFoldersMixin, self).__init__()
28 
29  def _clear_connections(self) -> None:
30  log.debug("DefectsDB connections cleared")
31  for connection in self._connections:
32  connection.closeDatabase()
33  self._connections = []
34 
35  @property
36  def parent_folderset(self) -> cool.IFolderSet:
37  """
38  Lazy-loads parent folderset (useful for heirarchical tag manipulation)
39  """
40  if self._parent_folderset is None:
41  db = Databases.get_instance(self.connection_string,
42  read_only=self._read_only)
43  self._parent_folderset = db.getFolderSet(PARENT_FOLDERSET)
44  return self._parent_folderset
45 
46  def _load_folder(self, folder, create_function) -> Tuple[cool.IFolder, cool.Record]:
47  """
48  Internal function used to load a COOL folder
49  """
50  db_folder_string = "%s::%s" % (self.connection_string, folder)
51 
52  if not self._create:
53  create_function = None
54 
55  db, folder = Databases.get_folder(db_folder_string,
56  read_only=self._read_only,
57  create_function=create_function,
58  also_db=True)
59 
60  self._connections.append(db)
61 
62  payload = cool.Record(folder.payloadSpecification())
63 
64  return folder, payload
65 
66  @property
67  def defects_folder(self) -> cool.IFolder:
68  """
69  Returns the folder containing the defects, loading it if necessary
70  """
71  if self._defects_folder is None: self._load_defects_folder()
72  return self._defects_folder
73 
74  def _load_defects_folder(self) -> None:
75  """
76  Internal function for populating the self._defects_folder variable
77  """
78  log.debug("Loading defects folder")
79  res = self._load_folder(DEFECTS_FOLDER, self._create_defects_folder)
81 
82  def _create_defects_folder(self, db: cool.IDatabase) -> cool.IFolder:
83  """
84  Creates the COOL database/folder for defects, if they don't exist.
85  Internal - use create=True in the constructor to create the COOL folder.
86  """
87  log.info("Creating defects folder")
88 
89  record_spec = cool.RecordSpecification()
90  record_spec.extend("present", ST.Bool)
91  record_spec.extend("recoverable", ST.Bool)
92  record_spec.extend("user", ST.String255)
93  record_spec.extend("comment", ST.String255)
94 
95  folder_spec = cool.FolderSpecification(FV.MULTI_VERSION, record_spec)
96  return db.createFolder(DEFECTS_FOLDER, folder_spec,
97  DEFECT_FOLDER_DESC, True)
98 
99  @property
100  def defect_logic_folder(self) -> cool.IFolder:
101  """
102  Returns the folder containing the virtual defect logic, loading it if necessary
103  """
104  if self._defect_logic_folder is None: self._load_defect_logic_folder()
105  return self._defect_logic_folder
106 
107  def _load_defect_logic_folder(self) -> None:
108  """
109  Internal function for populating the self._defect_logic_folder variable
110  """
111  res = self._load_folder(DEFECT_LOGIC_FOLDER,
114 
115  def _create_defect_logic_folder(self, db: cool.IDatabase) -> cool.IFolder:
116  """
117  Creates the COOL database/folder for virtual defect logic, if they don't exist.
118  Internal - use create=True in the constructor to create the COOL folder.
119  """
120  log.info("Creating defect logic folder")
121 
122  record_spec = cool.RecordSpecification()
123  record_spec.extend("clauses", ST.String4k)
124 
125  folder_spec = cool.FolderSpecification(FV.MULTI_VERSION, record_spec)
126  return db.createFolder(DEFECT_LOGIC_FOLDER, folder_spec,
127  DEFECT_LOGIC_FOLDER_DESC, True)
python.folders.DefectsDBFoldersMixin._clear_connections
None _clear_connections(self)
Definition: folders.py:29
python.folders.DefectsDBFoldersMixin._parent_folderset
_parent_folderset
Definition: folders.py:25
python.folders.DefectsDBFoldersMixin._defect_payload
_defect_payload
Definition: folders.py:80
dumpHVPathFromNtuple.append
bool append
Definition: dumpHVPathFromNtuple.py:91
python.folders.DefectsDBFoldersMixin._load_defect_logic_folder
None _load_defect_logic_folder(self)
Definition: folders.py:107
python.folders.DefectsDBFoldersMixin._defect_logic_payload
_defect_logic_payload
Definition: folders.py:113
python.folders.DefectsDBFoldersMixin._defect_logic_folder
_defect_logic_folder
Definition: folders.py:24
python.folders.DefectsDBFoldersMixin._create_defects_folder
cool.IFolder _create_defects_folder(self, cool.IDatabase db)
Definition: folders.py:82
python.folders.DefectsDBFoldersMixin._load_folder
Tuple[cool.IFolder, cool.Record] _load_folder(self, folder, create_function)
Definition: folders.py:46
python.folders.DefectsDBFoldersMixin.parent_folderset
cool.IFolderSet parent_folderset(self)
Definition: folders.py:36
python.folders.DefectsDBFoldersMixin._defects_folder
_defects_folder
Definition: folders.py:23
python.folders.DefectsDBFoldersMixin
Definition: folders.py:17
python.folders.DefectsDBFoldersMixin.__init__
None __init__(self)
Definition: folders.py:22
python.folders.DefectsDBFoldersMixin.defect_logic_folder
cool.IFolder defect_logic_folder(self)
Definition: folders.py:100
python.folders.DefectsDBFoldersMixin._load_defects_folder
None _load_defects_folder(self)
Definition: folders.py:74
python.folders.DefectsDBFoldersMixin._connections
_connections
Definition: folders.py:26
pickleTool.object
object
Definition: pickleTool.py:30
python.folders.DefectsDBFoldersMixin.defects_folder
cool.IFolder defects_folder(self)
Definition: folders.py:67
python.CaloCondLogger.getLogger
def getLogger(name="CaloCond")
Definition: CaloCondLogger.py:16
python.folders.DefectsDBFoldersMixin._create_defect_logic_folder
cool.IFolder _create_defect_logic_folder(self, cool.IDatabase db)
Definition: folders.py:115