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 
60 class DbManagerGain(DbManager):
61  def __init__(self, db, authFile=None):
62  DbManager.__init__(self, db, authFile)
63  self.GainO2OPartition = make_dbtype(GainO2OPartitionDef, self.schema)
64  self.GainO2OSkippedDevices = make_dbtype(GainO2OSkippedDevicesDef, self.schema)
65 
66  def _readPartitions(self, p):
67  self.o2o_partitions = []
68  partitionDict = {'PartTECM':'TEC-','PartTECP':'TEC+','PartTIBD':'TIB/TID','PartTOB':'TOB'}
69  o2otimestamp = datetime.datetime.utcnow()
70  for part in partitionDict:
71  psetPart = p.SiStripConfigDb.Partitions.getParameter(part)
72  if not psetPart: continue
73  entry = self.GainO2OPartition(
74  o2oid = self.o2oid,
75  iovstart = self.iovstart,
76  o2otimestamp = o2otimestamp,
77  subDetector = partitionDict[part],
78  partitionname = psetPart.getParameter('PartitionName').value(),
79  fecVersionMajorId = psetPart.getParameter('FecVersion')[0],
80  fecVersionMinorId = psetPart.getParameter('FecVersion')[1],
81  fedVersionMajorId = psetPart.getParameter('FedVersion')[0],
82  fedVersionMinorId = psetPart.getParameter('FedVersion')[1],
83  connectionVersionMajorId = psetPart.getParameter('CablingVersion')[0],
84  connectionVersionMinorId = psetPart.getParameter('CablingVersion')[1],
85  dcuInfoVersionMajorId = psetPart.getParameter('DcuDetIdsVersion')[0],
86  dcuInfoVersionMinorId = psetPart.getParameter('DcuDetIdsVersion')[1],
87  dcuPsuMapVersionMajorId = psetPart.getParameter('DcuPsuMapVersion')[0],
88  dcuPsuMapVersionMinorId = psetPart.getParameter('DcuPsuMapVersion')[1],
89  maskVersionMajorId = psetPart.getParameter('MaskVersion')[0],
90  maskVersionMinorId = psetPart.getParameter('MaskVersion')[1],
91  apvTimingVersionMajorId = psetPart.getParameter('ApvTimingVersion')[0],
92  apvTimingVersionMinorId = psetPart.getParameter('ApvTimingVersion')[1],
93  timingRunNumber = psetPart.getParameter('RunNumber').value()
94  )
95  self.o2o_partitions.append(entry)
96 
97  def _readSkippedDevices(self, p):
98  self.o2o_skipped = []
99  value = lambda p: None if p is None else p.value()
100  for itemid, pset in enumerate(p.SiStripCondObjBuilderFromDb.SkippedDevices):
101  entry = self.GainO2OSkippedDevices(
102  o2oid = self.o2oid,
103  itemid = itemid,
104  fecCrate = value(pset.getParameter('fecCrate')),
105  fecSlot = value(pset.getParameter('fecSlot')),
106  fecRing = value(pset.getParameter('fecRing')),
107  ccuAddr = value(pset.getParameter('ccuAddr')),
108  ccuChan = value(pset.getParameter('ccuChan')),
109  lldChan = value(pset.getParameter('lldChan')),
110  i2cAddr = value(pset.getParameter('i2cAddr')),
111  fedId = value(pset.getParameter('fedId')),
112  feUnit = value(pset.getParameter('feUnit')),
113  feChan = value(pset.getParameter('feChan')),
114  fedApv = value(pset.getParameter('fedApv')),
115  detid = value(pset.getParameter('detid'))
116  )
117  self.o2o_skipped.append(entry)
118 
119  def update_gain_logs(self, iov, cfgname):
120  """Insert bookkeeping info to the tables.
121  Args:
122  iov (int or str): IOV number
123  cfgname (str): name of the CMSSW cfg file.
124  The cfg file need to be placed in the current directory.
125  """
126 
127  self.iovstart = int(iov)
128  sys.path.append(os.getcwd())
129  if cfgname.endswith('.py'):
130  cfgname = cfgname.replace('.py', '')
131  cfg = import_module(cfgname)
132 
133  self.check_table(GainO2OPartitionDef, self.GainO2OPartition)
134  self.check_table(GainO2OSkippedDevicesDef, self.GainO2OSkippedDevices)
135  destSession = self.connect()
136  o2oid = destSession.query(self.GainO2OPartition.o2oid).order_by(self.GainO2OPartition.o2oid.desc()).first()
137  if o2oid:
138  self.o2oid = o2oid[0] + 1
139  else:
140  self.o2oid = 0
141 
142  self._readPartitions(cfg.process)
143  for entry in self.o2o_partitions:
144  destSession.add(entry)
145 
146  self._readSkippedDevices(cfg.process)
147  for entry in self.o2o_skipped:
148  destSession.add(entry)
149 
150  destSession.commit()
151  logging.info('Inserted Gain O2O info to DB!')
152 
153 
154 if __name__ == '__main__':
155  # for testing
156  dbmgr = DbManagerGain('private')
157  dbmgr.update_gain_logs(1, 'test')
def __init__(self, db, authFile=None)
Definition: o2o_db_gain.py:61
def _readPartitions(self, p)
Definition: o2o_db_gain.py:66
def update_gain_logs(self, iov, cfgname)
Definition: o2o_db_gain.py:119
def make_dbtype(backendName, schemaName, baseType)
Definition: conddblib.py:215
Definition: value.py:1
def _readSkippedDevices(self, p)
Definition: o2o_db_gain.py:97