47def getFieldForRun(run,quiet=False,lumiblock=None):
48 "Get the magnetic field currents (MagFieldDCSInfo) for a given run"
49
50
51
52 runiov=(run << 32)+(lumiblock or 0)
53 if runiov in _fieldForLB:
54 return _fieldForLB[runiov]
55
56 newdb=(run>=236107)
57 if not quiet:
58 print ("Reading magnetic field for run %i, CONDBR2 %s" % (run,newdb))
59
60 if newdb:
61 dbname='CONDBR2'
62 sorfolder='/TDAQ/RunCtrl/SOR'
63 fntname='T0ProjectTag'
64 else:
65 dbname='COMP200'
66 sorfolder='/TDAQ/RunCtrl/SOR_Params'
67 fntname='FilenameTag'
68
69 tdaqDB=indirectOpen('COOLONL_TDAQ/%s' % dbname)
70 if (tdaqDB is None):
71 print ("MagFieldUtils.getFieldForRun ERROR: Cannot connect to COOLONL_TDAQ/%s" % dbname)
72 return None
73 sortime=0
74 try:
75 tdaqfolder=tdaqDB.getFolder(sorfolder)
76 runiov=run << 32
77 obj=tdaqfolder.findObject(runiov,0)
78 payload=obj.payload()
79 sortime=payload['SORTime']
80 fnt=payload[fntname]
81 except Exception as e:
82 print ("MagFieldUtils.getFieldForRun ERROR accessing folder %s" % sorfolder)
83 print (e)
84 tdaqDB.closeDatabase()
85
86
87 if lumiblock is not None:
88 if not quiet:
89 print ("Reading specific timestamp for lumiblock %i" % lumiblock)
90
91 lbtime=getTimeForLB(run,lumiblock)
92 if (lbtime==0 and lumiblock>1):
93
94 print ("MagFieldUtils.getFieldForRun WARNING: Cannot find LB %i, trying %i" % (lumiblock,lumiblock-1))
95 lbtime=getTimeForLB(run,lumiblock-1)
96 if (lbtime==0):
97 print ("MagFieldUtils.getFieldForRun WARNING: Cannot find LB %i, fall back on SOR time" % lumiblock)
98 if (lbtime>0):
99
100 if not quiet:
101 print ("Lumiblock starts %i seconds from start of run" % int((lbtime-sortime)/1.E9))
102 sortime=lbtime
103 else:
104 print ("MagFieldUtils.getFieldForRun ERROR accessing /TRIGGER/LUMI/LBLB")
105 print ("Fall back on SOR time from %s" % sorfolder)
106 lbtime=sortime
107
108
109 if (sortime==0): return None
110
111
112 dcsDB=indirectOpen('COOLOFL_DCS/%s' % dbname)
113 if (dcsDB is None):
114 print ("MagFieldUtils.getFieldForRun ERROR: Cannot connect to COOLOFL_DCS/%s" % dbname)
115 return None
116 data=None
117 try:
118
119
120
121 currentmap={'CentralSol_Current':0,'CentralSol_SCurrent':1,
122 'Toroids_Current':2,'Toroids_SCurrent':3}
123 dcsfolder=dcsDB.getFolder('/EXT/DCS/MAGNETS/SENSORDATA')
124 objs=dcsfolder.findObjects(sortime,cool.ChannelSelection.all())
125 data=[-1.,-1.,-1.,-1.]
126 for obj in objs:
127 chan=obj.channelId()
128 channame=dcsfolder.channelName(chan)
129 if channame in currentmap.keys():
130 data[currentmap[channame]]=obj.payload()['value']
131 except Exception as e:
132 print ("MagFieldUtils.getFieldForRun ERROR accessing /EXT/DCS/MAGNETS/SENSORDATA")
133 print (e)
134 dcsDB.closeDatabase()
135
136 if data is None:
137 return None
138
139 retval=MagFieldDCSInfo(data[0],data[1],data[2],data[3],fnt)
140 _fieldForLB[runiov]=retval
141 return retval
142