24 dbname="CONDBR2", folderPath="/LAR/NoiseOfl/CellNoise", mu=-1, dt=-1):
25 import ROOT
26 from PyCool import cool
27 from AthenaPython.PyAthena import StatusCode
28 from CaloCondBlobAlgs import CaloCondTools, CaloCondLogger
29
30 author = getpass.getuser()
31 comment = "Updated noise values"
32
33 log = CaloCondLogger.getLogger("CaloNoiseWriter")
34
35
36 dbSvc = cool.DatabaseSvcFactory.databaseService()
37 try:
38 db=dbSvc.openDatabase("sqlite://;schema="+filename+";dbname="+dbname, False)
39 except Exception:
40 db=dbSvc.createDatabase("sqlite://;schema="+filename+";dbname="+dbname)
41
42 try:
43
44 spec = cool.RecordSpecification()
45 spec.extend( 'CaloCondBlob16M', cool.StorageType.Blob16M )
46 fspec = cool.FolderSpecification(cool.FolderVersioning.MULTI_VERSION, spec)
47
48
49 folderTag = tag
50 log.info( "Filling COOL folder %s with tag %s", folderPath, folderTag )
51 desc = CaloCondTools.getAthenaFolderDescr()
52 try:
53 folder = db.getFolder(folderPath)
54 except Exception:
55 log.warning("Folder %s not found, creating it...", folderPath)
56
57 folder = db.createFolder(folderPath, fspec, desc, True)
58
59
60
61
62
63 gainDefVec = ROOT.std.vector('float')()
64 gainDefVec.push_back(0.)
65 gainDefVec.push_back(0.)
66
67
68 defVecLAr = ROOT.std.vector('std::vector<float>')()
69 defVecLAr.push_back(gainDefVec)
70 defVecLAr.push_back(gainDefVec)
71 defVecLAr.push_back(gainDefVec)
72
73
74 defVecTile = ROOT.std.vector('std::vector<float>')()
75 defVecTile.push_back(gainDefVec)
76 defVecTile.push_back(gainDefVec)
77 defVecTile.push_back(gainDefVec)
78 defVecTile.push_back(gainDefVec)
79
80
81 systemDict = { 0 : (31872, 0, defVecLAr , 'EMEC, z<0'),
82 1 : (54784, 31872, defVecLAr , 'EMB , z<0'),
83 2 : (54784, 86656, defVecLAr , 'EMB , z>0'),
84 3 : (31872, 141440, defVecLAr , 'EMEC, z>0'),
85 16 : ( 5632, 0, defVecLAr , 'HEC' ),
86 32 : ( 3524, 0, defVecLAr , 'FCAL' ),
87 48 : ( 5184, 0, defVecTile, 'TILE' )
88 }
89 fltDict = {}
90 for systemId, info in systemDict.items():
91 if (systemId<48) :
92 nChannel = info[0]
93 defVec = info[2]
94 sysName = info[3]
95 log.info("Creating BLOB for %s", sysName)
96 data = cool.Record( spec )
97 blob = data['CaloCondBlob16M']
98 flt = ROOT.CaloCondBlobFlt.getInstance(blob)
99 flt.init(defVec,nChannel,1,author,comment)
100 fltDict[systemId] = [data,flt]
101 mbSize = float(blob.size()) / 1024.
102 log.info("---> BLOB size is %4.1f kB", mbSize)
103
104
105 lines = open(inputFile,"r").readlines()
106 for line in lines:
107 fields = line.split()
108 if len(fields) < 5:
109 log.info("---> wrong line length %d entries ", len(fields))
110 continue
111 pass
112 systemId = int(fields[1])
113 hash = int(fields[2]) - systemDict[systemId][1]
114 gain = ROOT.CaloCondUtils.getDbCaloGain(int(fields[3]))
115 noiseA = float(fields[4])
116 noiseB = float(fields[5])
117 flt = fltDict[systemId][1]
118 if mu > 0 and dt > 0:
119
120 if dt > 25:
121 noiseB /= math.sqrt(mu/53.*10.)
122 else:
123 noiseB /= math.sqrt(mu/29.*10.)
124 pass
125 if mu == 0:
126 noiseB = 0
127 flt.setData(hash,gain,0,noiseA)
128 flt.setData(hash,gain,1,noiseB)
129
130
131 for systemId, dataList in fltDict.items():
132 if (systemId<48):
133 sysName = systemDict[systemId][3]
134 log.info("Committing BLOB for %s", sysName)
135 channelId = cool.ChannelId(systemId)
136 log.info("Cool channel ID %s", channelId)
137 data = dataList[0]
138 folder.storeObject(iovSince, iovUntil, data, channelId, folderTag)
139 sc = StatusCode.Success
140 except Exception as e:
141 log.fatal("Exception caught:")
142 print (e)
143 sc = StatusCode.Failure
144
145 db.closeDatabase()
146 return sc
147
148