10 from CoolLumiUtilities.CoolBCIDData
import LumiBCIDData
12 from ROOT
import TFile, TTree, gROOT, AddressOf
13 from array
import array
29 self.
algDict[101] =
'lucidEvtAND'
30 self.
algDict[102] =
'lucidEvtOR'
31 self.
algDict[103] =
'lucidHitOR'
32 self.
algDict[104] =
'lucidHitAND'
36 self.
algDict[111] =
'lucBiEvtAND'
37 self.
algDict[112] =
'lucBiEvtOR'
38 self.
algDict[113] =
'lucBiHitOR'
42 self.
algDict[121] =
'lucModEvtAND'
43 self.
algDict[122] =
'lucModEvtOR'
44 self.
algDict[123] =
'lucModHitOR'
45 self.
algDict[124] =
'lucModHitAND'
46 self.
algDict[125] =
'lucModEvtA'
47 self.
algDict[126] =
'lucModEvtC'
49 self.
algDict[131] =
'lucBiPMTA1'
50 self.
algDict[132] =
'lucBiPMTA5'
51 self.
algDict[133] =
'lucBiPMTA9'
52 self.
algDict[134] =
'lucBiPMTA13'
53 self.
algDict[135] =
'lucBiPMTC1'
54 self.
algDict[136] =
'lucBiPMTC5'
55 self.
algDict[137] =
'lucBiPMTC9'
56 self.
algDict[138] =
'lucBiPMTC13'
66 self.
algDict[202] =
'bcmHEvtAND'
71 self.
algDict[212] =
'bcmVEvtAND'
76 self.
algDict[222] =
'bcmTEvtAND'
80 self.
algDict[231] =
'bcmHEarlyOR'
81 self.
algDict[235] =
'bcmHEarlyA'
82 self.
algDict[236] =
'bcmHEarlyC'
84 self.
algDict[241] =
'bcmVEarlyOR'
85 self.
algDict[245] =
'bcmVEarlyA'
86 self.
algDict[246] =
'bcmVEarlyC'
89 self.
algDict[302] =
'mbtsEvtAND'
157 print(
'ScanNtupleHandler.open() called')
163 print(
'ScanNtupleHandler.init() called')
183 print(
'ScanNtupleHandler.fill() called')
187 for obj
in data.scanData.data:
221 print(
'ScanNtupleHandler.fill() - filled', nfilled,
'entries')
224 print(
'ScanNtupleHandler.close() called')
234 structStr =
"struct ScanDataStruct {\
235 ULong64_t fStartTime;\
239 Float_t fStepProgress;\
240 Float_t fScanningIP;\
241 Float_t fAcquisitionFlag;\
242 Float_t fMovingBeam;\
243 Float_t fNominalSeparation;\
244 Float_t fScanInPlane;\
248 gROOT.ProcessLine(structStr)
249 from ROOT
import ScanDataStruct
253 self.
tree.Branch(
'SCANDATA', self.
scanDataStruct,
'StartTime/l:EndTime/l:ScanRun/i:ScanLB/i:StepProgress/F:ScanningIP/F:AcquisitionFlag/F:MovingBeam/F:NominalSeparation/F:ScanInPlane/F')
263 self.
scanDataStruct.fAcquisitionFlag = obj.payload()[
'AcquisitionFlag']
265 self.
scanDataStruct.fNominalSeparation = obj.payload()[
'NominalSeparation']
272 gROOT.ProcessLine(
"struct BeamPositionStruct {\
273 Float_t fB1PositionH;\
274 Float_t fB1PositionV;\
275 Float_t fB2PositionH;\
276 Float_t fB2PositionV;\
282 from ROOT
import BeamPositionStruct
285 self.
tree.Branch(
'BEAMPOSITION', self.
beamPositionStruct,
'B1PositionH/F:B1PositionV/F:B2PositionH/F:B2PositionV/F:B1AngleH/F:B1AngleV/F:B2AngleH/F:B2AngleV/F')
293 if timeobj.since() != obj.since():
continue
307 print(
"scanNtupleHandler.fillBeamPosition - Didn't find beam position data to match scan data!")
322 gROOT.ProcessLine(
"struct FillParamsStruct {\
324 Int_t fB1BCIDs[3564];\
326 Int_t fB2BCIDs[3564];\
327 Int_t fLuminousBunches;\
328 Int_t fLuminousBCIDs[3564];\
330 from ROOT
import FillParamsStruct
340 self.
tree.Branch(
'FILLPARAMSB1', AddressOf(self.
fillParamsStruct,
'fB1Bunches'),
'B1Bunches/I:B1BCIDs[B1Bunches]/I')
341 self.
tree.Branch(
'FILLPARAMSB2', AddressOf(self.
fillParamsStruct,
'fB2Bunches'),
'B2Bunches/I:B2BCIDs[B2Bunches]/I')
342 self.
tree.Branch(
'FILLPARAMS', AddressOf(self.
fillParamsStruct,
'fLuminousBunches'),
'LuminousBunches/I:LuminousBCIDs[LuminousBunches]/I')
344 print(
'Defined FillParams data type')
355 if timeobj.since() < obj.since():
continue
356 if timeobj.since() >= obj.until():
continue
364 self.
bcidData.fillMask(obj.payload())
387 print(
"scanNtupleHandler.fillFillParams - Didn't find FILLPARAMS data to match scan data!")
392 for i
in range(3564):
401 gROOT.ProcessLine(
"struct LbdataStruct {\
402 Float_t fB1IntensityBPTX;\
403 Float_t fB2IntensityBPTX;\
404 Float_t fB1IntensityAllBPTX;\
405 Float_t fB2IntensityAllBPTX;\
406 Float_t fB1IntensityBCT;\
407 Float_t fB2IntensityBCT;\
408 Float_t fB1IntensityAllBCT;\
409 Float_t fB2IntensityAllBCT;\
410 Float_t fB1IntensityAllDCCT;\
411 Float_t fB2IntensityAllDCCT;\
413 from ROOT
import LbdataStruct
416 self.
tree.Branch(
'BPTX_LBDATA', AddressOf(self.
lbdataStruct,
'fB1IntensityBPTX'),
'BPTX_B1Intensity/F:BPTX_B2Intensity/F:BPTX_B1IntensityAll/F:BPTX_B2IntensityAll/F')
417 self.
tree.Branch(
'BCT_LBDATA', AddressOf(self.
lbdataStruct,
'fB1IntensityBCT'),
'BCT_B1Intensity/F:BCT_B2Intensity/F:BCT_B1IntensityAll/F:BCT_B2IntensityAll/F')
418 self.
tree.Branch(
'DCCT_LBDATA', AddressOf(self.
lbdataStruct,
'fB1IntensityAllDCCT'),
'DCCT_B1IntensityAll/F:DCCT_B2IntensityAll/F')
429 if timeobj.since() != obj.since():
continue
431 if obj.channelId() == 0:
434 self.
lbdataStruct.fB1IntensityBPTX = obj.payload()[
'Beam1Intensity']
435 self.
lbdataStruct.fB2IntensityBPTX = obj.payload()[
'Beam2Intensity']
436 self.
lbdataStruct.fB1IntensityAllBPTX = obj.payload()[
'Beam1IntensityAll']
437 self.
lbdataStruct.fB2IntensityAllBPTX = obj.payload()[
'Beam2IntensityAll']
439 elif obj.channelId() == 1:
442 self.
lbdataStruct.fB1IntensityBCT = obj.payload()[
'Beam1Intensity']
443 self.
lbdataStruct.fB2IntensityBCT = obj.payload()[
'Beam2Intensity']
444 self.
lbdataStruct.fB1IntensityAllBCT = obj.payload()[
'Beam1IntensityAll']
445 self.
lbdataStruct.fB2IntensityAllBCT = obj.payload()[
'Beam2IntensityAll']
447 elif obj.channelId() == 2:
450 self.
lbdataStruct.fB1IntensityAllDCCT = obj.payload()[
'Beam1IntensityAll']
451 self.
lbdataStruct.fB2IntensityAllDCCT = obj.payload()[
'Beam2IntensityAll']
454 print(
'scanNtupleHandler.fillLbdata - Found unknown channel', obj.channelId(),
'!')
456 if foundBCT
and foundBPTX
and foundDCCT :
break
459 if (
not foundBPTX)
and (
not foundBCT)
and (
not foundDCCT):
460 print(
"scanNtupleHandler.fillLBdata - Couldn't find LBDATA!")
462 print(
"scanNtupleHandler.fillLBdata - Couldn't find BCT data in LBDATA!")
464 print(
"scanNtupleHandler.fillLBdata - Couldn't find BPTX data in LBDATA!")
466 print(
"scanNtupleHandler.fillLBdata - Couldn't find DCCT data in LBDATA!")
488 gROOT.ProcessLine(
"struct BunchDataStruct {\
490 Float_t fB1BunchAverageBPTX;\
491 Float_t fB2BunchAverageBPTX;\
492 Int_t fB1BunchesBPTX;\
493 Int_t fB2BunchesBPTX;\
494 Float_t fB1BunchIntensitiesBPTX[3564];\
495 Int_t fB1BCIDsBPTX[3564];\
496 Float_t fB2BunchIntensitiesBPTX[3564];\
497 Int_t fB2BCIDsBPTX[3564];\
499 Float_t fB1BunchAverageBCT;\
500 Float_t fB2BunchAverageBCT;\
501 Int_t fB1BunchesBCT;\
502 Int_t fB2BunchesBCT;\
503 Int_t fB1BCIDsBCT[3564];\
504 Float_t fB1BunchIntensitiesBCT[3564];\
505 Int_t fB2BCIDsBCT[3564];\
506 Float_t fB2BunchIntensitiesBCT[3564];\
508 from ROOT
import BunchDataStruct
517 self.
tree.Branch(
'BCT_BUNCHDATA', AddressOf(self.
bunchDataStruct,
'fValidBCT'),
'BCT_Valid/i:BCT_B1BunchAverage/F:BCT_B2BunchAverage/F:BCT_B1Bunches/I:BCT_B2Bunches/I')
518 self.
tree.Branch(
'BCT_B1BCID', AddressOf(self.
bunchDataStruct,
'fB1BCIDsBCT'),
'BCT_B1BCID[BCT_B1Bunches]/I')
519 self.
tree.Branch(
'BCT_B2BCID', AddressOf(self.
bunchDataStruct,
'fB2BCIDsBCT'),
'BCT_B2BCID[BCT_B2Bunches]/I')
520 self.
tree.Branch(
'BCT_B1BunchIntensity', AddressOf(self.
bunchDataStruct,
'fB1BunchIntensitiesBCT'),
'BCT_B1BunchIntensity[BCT_B1Bunches]/F')
521 self.
tree.Branch(
'BCT_B2BunchIntensity', AddressOf(self.
bunchDataStruct,
'fB2BunchIntensitiesBCT'),
'BCT_B2BunchIntensity[BCT_B2Bunches]/F')
523 self.
tree.Branch(
'BPTX_BUNCHDATA', AddressOf(self.
bunchDataStruct,
'fValidBPTX'),
'BPTX_Valid/i:BPTX_B1BunchAverage/F:BPTX_B2BunchAverage/F:BPTX_B1Bunches/I:BPTX_B2Bunches/I')
524 self.
tree.Branch(
'BPTX_B1BCID', AddressOf(self.
bunchDataStruct,
'fB1BCIDsBPTX'),
'BPTX_B1BCID[BPTX_B1Bunches]/I')
525 self.
tree.Branch(
'BPTX_B2BCID', AddressOf(self.
bunchDataStruct,
'fB2BCIDsBPTX'),
'BPTX_B2BCID[BPTX_B2Bunches]/I')
526 self.
tree.Branch(
'BPTX_B1BunchIntensity', AddressOf(self.
bunchDataStruct,
'fB1BunchIntensitiesBPTX'),
'BPTX_B1BunchIntensity[BPTX_B1Bunches]/F')
527 self.
tree.Branch(
'BPTX_B2BunchIntensity', AddressOf(self.
bunchDataStruct,
'fB2BunchIntensitiesBPTX'),
'BPTX_B2BunchIntensity[BPTX_B2Bunches]/F')
538 if timeobj.since() != obj.since():
continue
541 self.
bcidData.fillCurrents(obj.payload())
543 if obj.channelId() == 0:
546 self.
bunchDataStruct.fB1BunchAverageBPTX = obj.payload()[
'B1BunchAverage']
547 self.
bunchDataStruct.fB2BunchAverageBPTX = obj.payload()[
'B2BunchAverage']
557 for (bcid, val)
in self.
bcidData.b1Curr.iteritems():
567 for (bcid, val)
in self.
bcidData.b2Curr.iteritems():
572 elif obj.channelId() == 1:
575 self.
bunchDataStruct.fB1BunchAverageBCT = obj.payload()[
'B1BunchAverage']
576 self.
bunchDataStruct.fB2BunchAverageBCT = obj.payload()[
'B2BunchAverage']
584 for (bcid, val)
in self.
bcidData.b1Curr.iteritems():
594 for (bcid, val)
in self.
bcidData.b2Curr.iteritems():
600 print(
'scanNtupleHandler.fillLbdata - Found unknown channel', obj.channelId(),
'!')
602 if foundBCT
and foundBPTX:
break
605 if (
not foundBPTX)
and (
not foundBCT):
606 print(
"scanNtupleHandler.fillBunchData - Couldn't find BUNCHDATA!")
608 print(
"scanNtupleHandler.fillBunchData - Couldn't find BCT data in BUNCHDATA!")
610 print(
"scanNtupleHandler.fillBunchData - Couldn't find BPTX data in BUNCHDATA!")
634 gROOT.ProcessLine(
"struct BunchLumiStruct {\
637 Float_t fAverageRawInstLum;\
638 Int_t fLuminousBunches;\
639 Int_t fLuminousBCIDs[3564];\
640 Float_t fBunchRawInstLum[3564];\
642 from ROOT
import BunchLumiStruct
649 print(
'scanNtupleHandler.initLumiData - initializing', algstr,
'as channel', chId)
656 branchString1 =
'ALG_Channel/i:ALG_Valid/i:ALG_AverageRawInstLum/F:ALG_LuminousBunches/I'
657 branchString2 =
'ALG_LuminousBCIDs[ALG_LuminousBunches]/I'
658 branchString3 =
'ALG_BunchRawInstLum[ALG_LuminousBunches]/F'
660 self.
tree.Branch(algstr+
'_BUNCHDATA', self.
bunchLumiStruct[chId], branchString1.replace(
'ALG', algstr))
663 self.
tree.Branch(algstr+
'_BCID', self.
fLuminousBCIDs[chId], branchString2.replace(
'ALG', algstr))
664 self.
tree.Branch(algstr+
'_BunchRawInstLum', self.
fBunchRawInstLum[chId], branchString3.replace(
'ALG', algstr))
677 if timeobj.since() != obj.since():
continue
680 chId = obj.channelId()
682 print(
'scanNtupleHandler.fillBunchLumi - Unknown lumi channel', chId,
'!')
688 self.
bcidData.fillRawLumi(obj.payload())
693 self.
bunchLumiStruct[chId].fAverageRawInstLum = obj.payload()[
'AverageRawInstLum']
702 bcidList = self.
bcidData.rawLumi.keys()
703 for bcid
in sorted(bcidList):
713 print(
'scanNtupleHandler.fillBunchLumi - Found no BUNCHLUMIS data to match IOV!')
718 print(
'scanNtupleHandler.fillBunchLumi - Found no BUNCHLUMIS data for', algstr,
'!')
728 print(
'scanNtupleHandler.initLumiData() called')
733 gROOT.ProcessLine(
"struct LumiDataStruct {\
735 Float_t fLBAvInstLumPhys;\
736 Float_t fLBAvEvtsPerBXPhys;\
737 Float_t fLBAvRawInstLumPhys;\
738 Float_t fLBAvInstLumAll;\
739 Float_t fLBAvRawInstLumAll;\
740 Float_t fLBAvEvtsPerBXAll;\
741 Float_t fLBAvOLCInstLum;\
742 Float_t fLBAvOLCRawInstLum;\
743 Float_t fLBAvOLCEvtsPerBX;\
747 UInt_t fDetectorState;\
750 from ROOT
import LumiDataStruct
754 print(
'scanNtupleHandler.initLumiData - initializing', algstr,
'as channel', chId)
756 branchString =
'ALG_LumiChannel/i:ALG_LBAvInstLumPhys/F:ALG_LBAvEvtsPerBXPhys/F:ALG_LBAvRawInstLumPhys/F:ALG_LBAvInstLumAll/F:ALG_LBAvRawInstLumAll/F:ALG_LBAvEvtsPerBXAll/F:ALG_LBAvOLCInstLum/F:ALG_LBAvOLCRawInstLum/F:ALG_LBAvOLCEvtsPerBX/F:ALG_NOrbPhys/i:ALG_NOrbAll/i:ALG_NOrbOLC/i:ALG_DetectorState/i:ALG_LumiValid/i'
758 self.
tree.Branch(algstr+
'_LUMI', self.
lumiStruct[chId], branchString.replace(
'ALG', algstr))
773 if timeobj.since() != obj.since():
continue
776 chId = obj.channelId()
780 elif chId >= 50
and chId <=70:
781 liveDict[chId] = obj.payload()[
'LBAvOLCInstLum']
785 print(
'scanNtupleHandler.fillLumiData - Unknown lumi channel', chId,
'!')
792 self.
lumiStruct[chId].fChannel = obj.channelId()
793 self.
lumiStruct[chId].fLBAvInstLumPhys = obj.payload()[
'LBAvInstLumPhys']
794 self.
lumiStruct[chId].fLBAvEvtsPerBXPhys = obj.payload()[
'LBAvEvtsPerBXPhys']
795 self.
lumiStruct[chId].fLBAvRawInstLumPhys = obj.payload()[
'LBAvRawInstLumPhys']
796 self.
lumiStruct[chId].fLBAvInstLumAll = obj.payload()[
'LBAvInstLumAll']
797 self.
lumiStruct[chId].fLBAvEvtsPerBXAll = obj.payload()[
'LBAvEvtsPerBXAll']
798 self.
lumiStruct[chId].fLBAvRawInstLumAll = obj.payload()[
'LBAvRawInstLumAll']
799 self.
lumiStruct[chId].fLBAvOLCInstLum = obj.payload()[
'LBAvOLCInstLum']
800 self.
lumiStruct[chId].fLBAvOLCEvtsPerBX = obj.payload()[
'LBAvOLCEvtsPerBX']
801 self.
lumiStruct[chId].fLBAvOLCRawInstLum = obj.payload()[
'LBAvOLCRawInstLum']
802 self.
lumiStruct[chId].fDetectorState = obj.payload()[
'DetectorState']
804 self.
lumiStruct[chId].fNOrbPhys = obj.payload()[
'NOrbPhys']
805 self.
lumiStruct[chId].fNOrbAll = obj.payload()[
'NOrbAll']
806 self.
lumiStruct[chId].fNOrbOLC = obj.payload()[
'NOrbOLC']
807 except Exception
as e:
813 self.
lumiStruct[chId].fValid = obj.payload()[
'Valid']
816 print(
'scanNtupleHandler.fillLumiData - Found no LUMINOSITY data to match IOV!')
821 print(
'scanNtupleHandler.fillLumiData - Found no LUMINOSITY data for', algstr,
'!')
828 self.
lumiStruct[chId].fLBAvRawInstLumPhys = 0.
852 def fillLive(self, liveDict, denchan, numchan, dest):
853 num = liveDict.get(numchan, 0.)
854 den = liveDict.get(denchan, 0.)
867 gROOT.ProcessLine(
"struct LiveDataStruct {\
868 Float_t fRD0_Filled;\
873 Float_t fMBTS_1_BGRP9;\
874 Float_t fMBTS_2_BGRP9;\
876 from ROOT
import LiveDataStruct
879 self.
tree.Branch(
'LiveFractions', AddressOf(self.
liveDataStruct,
'fRD0_Filled'),
'RD0_Filled/f,MBTS_1_1/f,MBTS_2/f,EM12/f,RD0_BGRP9/f,MBTS_1_BGRP9/f,MBTS_2_BGRP9/f')