CMS 3D CMS Logo

o2o_db_gain.py
Go to the documentation of this file.
1 '''
2 Update the bookkeeping tables for G1 O2O.
3 
4 @author: hqu
5 '''
6 
7 from CondTools.SiStrip.o2o_db_manager import make_dbtype, DbManager
8 import os
9 import sys
10 import datetime
11 import logging
12 from importlib import import_module
13 import sqlalchemy
14 from sqlalchemy.ext.declarative import declared_attr
15 
17  __tablename__ = 'STRIP_GAIN_O2O_PARTITION'
18  o2oid = sqlalchemy.Column(sqlalchemy.BigInteger, primary_key=True)
19  iovstart = sqlalchemy.Column(sqlalchemy.BigInteger, nullable=False)
20  o2otimestamp = sqlalchemy.Column(sqlalchemy.TIMESTAMP, nullable=False)
21  subDetector = sqlalchemy.Column(sqlalchemy.String(256), primary_key=True)
22  partitionname = sqlalchemy.Column(sqlalchemy.String(256), nullable=False)
23  fecVersionMajorId = sqlalchemy.Column(sqlalchemy.Integer, nullable=False)
24  fecVersionMinorId = sqlalchemy.Column(sqlalchemy.Integer, nullable=False)
25  fedVersionMajorId = sqlalchemy.Column(sqlalchemy.Integer, nullable=False)
26  fedVersionMinorId = sqlalchemy.Column(sqlalchemy.Integer, nullable=False)
27  connectionVersionMajorId = sqlalchemy.Column(sqlalchemy.Integer, nullable=False)
28  connectionVersionMinorId = sqlalchemy.Column(sqlalchemy.Integer, nullable=False)
29  dcuInfoVersionMajorId = sqlalchemy.Column(sqlalchemy.Integer, nullable=False)
30  dcuInfoVersionMinorId = sqlalchemy.Column(sqlalchemy.Integer, nullable=False)
31  dcuPsuMapVersionMajorId = sqlalchemy.Column(sqlalchemy.Integer, nullable=False)
32  dcuPsuMapVersionMinorId = sqlalchemy.Column(sqlalchemy.Integer, nullable=False)
33  maskVersionMajorId = sqlalchemy.Column(sqlalchemy.Integer, nullable=False)
34  maskVersionMinorId = sqlalchemy.Column(sqlalchemy.Integer, nullable=False)
35  apvTimingVersionMajorId = sqlalchemy.Column(sqlalchemy.Integer, nullable=False)
36  apvTimingVersionMinorId = sqlalchemy.Column(sqlalchemy.Integer, nullable=False)
37  timingRunNumber = sqlalchemy.Column(sqlalchemy.BigInteger, nullable=False)
38 
40  __tablename__ = 'STRIP_GAIN_O2O_SKIPPED'
41  # o2o identifier
42  o2oid = sqlalchemy.Column(sqlalchemy.BigInteger, primary_key=True)
43  itemid = sqlalchemy.Column(sqlalchemy.BigInteger, primary_key=True)
44  # FEC coordinates
45  fecCrate = sqlalchemy.Column(sqlalchemy.Integer, nullable=True)
46  fecSlot = sqlalchemy.Column(sqlalchemy.Integer, nullable=True)
47  fecRing = sqlalchemy.Column(sqlalchemy.Integer, nullable=True)
48  ccuAddr = sqlalchemy.Column(sqlalchemy.Integer, nullable=True)
49  ccuChan = sqlalchemy.Column(sqlalchemy.Integer, nullable=True)
50  lldChan = sqlalchemy.Column(sqlalchemy.Integer, nullable=True)
51  i2cAddr = sqlalchemy.Column(sqlalchemy.Integer, nullable=True)
52  # FED coordinates
53  fedId = sqlalchemy.Column(sqlalchemy.Integer, nullable=True)
54  feUnit = sqlalchemy.Column(sqlalchemy.Integer, nullable=True)
55  feChan = sqlalchemy.Column(sqlalchemy.Integer, nullable=True)
56  fedApv = sqlalchemy.Column(sqlalchemy.Integer, nullable=True)
57  # detid
58  detid = sqlalchemy.Column(sqlalchemy.BigInteger, nullable=True)
59 
61  __tablename__ = 'STRIP_GAIN_O2O_WHITELISTED'
62 
63 
64 class DbManagerGain(DbManager):
65  def __init__(self, db, authFile=None):
66  DbManager.__init__(self, db, authFile)
67  self.GainO2OPartition = make_dbtype(GainO2OPartitionDef, self.schema)
68  self.GainO2OSkippedDevices = make_dbtype(GainO2OSkippedDevicesDef, self.schema)
69  self.GainO2OWhitelistedDevices = make_dbtype(GainO2OWhitelistedDevicesDef, self.schema)
70 
71  def _readPartitions(self, p):
72  self.o2o_partitions = []
73  partitionDict = {'PartTECM':'TEC-','PartTECP':'TEC+','PartTIBD':'TIB/TID','PartTOB':'TOB'}
74  o2otimestamp = datetime.datetime.utcnow()
75  for part in partitionDict:
76  psetPart = p.SiStripConfigDb.Partitions.getParameter(part)
77  if not psetPart: continue
78  entry = self.GainO2OPartition(
79  o2oid = self.o2oid,
80  iovstart = self.iovstart,
81  o2otimestamp = o2otimestamp,
82  subDetector = partitionDict[part],
83  partitionname = psetPart.getParameter('PartitionName').value(),
84  fecVersionMajorId = psetPart.getParameter('FecVersion')[0],
85  fecVersionMinorId = psetPart.getParameter('FecVersion')[1],
86  fedVersionMajorId = psetPart.getParameter('FedVersion')[0],
87  fedVersionMinorId = psetPart.getParameter('FedVersion')[1],
88  connectionVersionMajorId = psetPart.getParameter('CablingVersion')[0],
89  connectionVersionMinorId = psetPart.getParameter('CablingVersion')[1],
90  dcuInfoVersionMajorId = psetPart.getParameter('DcuDetIdsVersion')[0],
91  dcuInfoVersionMinorId = psetPart.getParameter('DcuDetIdsVersion')[1],
92  dcuPsuMapVersionMajorId = psetPart.getParameter('DcuPsuMapVersion')[0],
93  dcuPsuMapVersionMinorId = psetPart.getParameter('DcuPsuMapVersion')[1],
94  maskVersionMajorId = psetPart.getParameter('MaskVersion')[0],
95  maskVersionMinorId = psetPart.getParameter('MaskVersion')[1],
96  apvTimingVersionMajorId = psetPart.getParameter('ApvTimingVersion')[0],
97  apvTimingVersionMinorId = psetPart.getParameter('ApvTimingVersion')[1],
98  timingRunNumber = psetPart.getParameter('RunNumber').value()
99  )
100  self.o2o_partitions.append(entry)
101 
102  def _readSkippedDevices(self, p, whitelist=False):
103  dev_type = self.GainO2OSkippedDevices
104  attr_name = 'SkippedDevices'
105  if whitelist:
106  dev_type = self.GainO2OWhitelistedDevices
107  attr_name = 'WhitelistedDevices'
108 
109  dev_list = []
110  value = lambda p: None if p is None else p.value()
111  for itemid, pset in enumerate(getattr(p.SiStripCondObjBuilderFromDb, attr_name)):
112  entry = dev_type(
113  o2oid = self.o2oid,
114  itemid = itemid,
115  fecCrate = value(pset.getParameter('fecCrate')),
116  fecSlot = value(pset.getParameter('fecSlot')),
117  fecRing = value(pset.getParameter('fecRing')),
118  ccuAddr = value(pset.getParameter('ccuAddr')),
119  ccuChan = value(pset.getParameter('ccuChan')),
120  lldChan = value(pset.getParameter('lldChan')),
121  i2cAddr = value(pset.getParameter('i2cAddr')),
122  fedId = value(pset.getParameter('fedId')),
123  feUnit = value(pset.getParameter('feUnit')),
124  feChan = value(pset.getParameter('feChan')),
125  fedApv = value(pset.getParameter('fedApv')),
126  detid = value(pset.getParameter('detid'))
127  )
128  dev_list.append(entry)
129 
130  return dev_list
131 
132  def update_gain_logs(self, iov, cfgname):
133  """Insert bookkeeping info to the tables.
134  Args:
135  iov (int or str): IOV number
136  cfgname (str): name of the CMSSW cfg file.
137  The cfg file need to be placed in the current directory.
138  """
139 
140  self.iovstart = int(iov)
141  sys.path.append(os.getcwd())
142  if cfgname.endswith('.py'):
143  cfgname = cfgname.replace('.py', '')
144  cfg = import_module(cfgname)
145 
146  self.check_table(GainO2OPartitionDef, self.GainO2OPartition)
147  self.check_table(GainO2OSkippedDevicesDef, self.GainO2OSkippedDevices)
148  self.check_table(GainO2OWhitelistedDevicesDef, self.GainO2OWhitelistedDevices)
149  destSession = self.connect()
150  o2oid = destSession.query(self.GainO2OPartition.o2oid).order_by(self.GainO2OPartition.o2oid.desc()).first()
151  if o2oid:
152  self.o2oid = o2oid[0] + 1
153  else:
154  self.o2oid = 0
155 
156  self._readPartitions(cfg.process)
157  for entry in self.o2o_partitions:
158  destSession.add(entry)
159 
160  o2o_skipped = self._readSkippedDevices(cfg.process)
161  for entry in o2o_skipped:
162  destSession.add(entry)
163 
164  o2o_whitelisted = self._readSkippedDevices(cfg.process, whitelist=True)
165  for entry in o2o_whitelisted:
166  destSession.add(entry)
167 
168  destSession.commit()
169  logging.info('Inserted Gain O2O info to DB!')
170 
171 
172 if __name__ == '__main__':
173  # for testing
174  dbmgr = DbManagerGain('private')
175  dbmgr.update_gain_logs(1, 'test')
def __init__(self, db, authFile=None)
Definition: o2o_db_gain.py:65
def _readPartitions(self, p)
Definition: o2o_db_gain.py:71
def update_gain_logs(self, iov, cfgname)
Definition: o2o_db_gain.py:132
def make_dbtype(backendName, schemaName, baseType)
Definition: conddblib.py:182
Definition: value.py:1
def _readSkippedDevices(self, p, whitelist=False)
Definition: o2o_db_gain.py:102