File indexing completed on 2023-03-17 10:56:41
0001
0002
0003 from __future__ import print_function
0004 import sys
0005 from ROOT import *
0006 from array import array
0007 from copy import deepcopy
0008
0009 gROOT.SetBatch()
0010
0011
0012
0013 def getFileInPath(rfile):
0014 import os
0015 for dir in os.environ['CMSSW_SEARCH_PATH'].split(":"):
0016 if os.path.exists(os.path.join(dir,rfile)): return os.path.join(dir,rfile)
0017 return None
0018
0019
0020 inputFileName = "DQM.root"
0021 outputFileName = "DQMTree.root"
0022
0023 detIDsFileName = getFileInPath('DQM/SiStripMonitorClient/data/detids.dat')
0024
0025 class ModuleLvlValuesReader:
0026
0027
0028
0029 def __TraverseDirTree(self, dir):
0030
0031 currPath = (dir.GetPath().split(":/"))[1]
0032
0033 for obj in dir.GetListOfKeys():
0034 if not obj.IsFolder():
0035 if obj.ReadObjectAny(TClass.GetClass("TH2")):
0036 th2 = deepcopy(obj.ReadObj())
0037 name = th2.GetName()
0038 if 6 < th2.GetNbinsX() < 10 and name.find("per") != -1 and name.find("Lumisection") == -1:
0039 print(''.join([dir.GetPath(), '/', name]))
0040
0041
0042 prefix = ""
0043 for i in self.dirs:
0044 if currPath.startswith(i):
0045 prefix = self.dirsAliases[i]
0046 break
0047
0048 th2.SetName(prefix + th2.GetName())
0049 self.listOfNumHistograms.append(th2)
0050 else:
0051 self.__TraverseDirTree(obj.ReadObj())
0052
0053 def __GetPartStr(self, isXlowerThanZero, isYlowerThanZero):
0054 if isXlowerThanZero and isYlowerThanZero:
0055 return "mO"
0056 if isXlowerThanZero and isYlowerThanZero == False:
0057 return "mI"
0058 if isXlowerThanZero == False and isYlowerThanZero:
0059 return "pO"
0060 if isXlowerThanZero == False and isYlowerThanZero == False:
0061 return "pI"
0062
0063 def __GetBarrelSector(self, layer, signedLadder, signedModule):
0064 theLadder = abs(signedLadder)
0065 theModule = abs(signedModule)
0066
0067 sector = 0
0068
0069 if layer == 1:
0070
0071 if theLadder == 1:
0072 if theModule >= 2:
0073 return 1
0074 else:
0075 return 2
0076 if theLadder == 2:
0077 if theModule >= 3:
0078 return 2
0079 else:
0080 return 3
0081 if theLadder == 3:
0082 if theModule >= 4:
0083 return 3
0084 else:
0085 return 4
0086 if theLadder == 4:
0087 if theModule >= 2:
0088 return 5
0089 else:
0090 return 6
0091 if theLadder == 5:
0092 if theModule >= 3:
0093 return 6
0094 else:
0095 return 7
0096 if theLadder == 6:
0097 if theModule >= 4:
0098 return 7
0099 else:
0100 return 8
0101
0102 elif layer == 2:
0103 i = theLadder // 5
0104 sector = i * 3
0105 shortLadder = theLadder - 5 * i
0106 for i in range(0, shortLadder, 2):
0107 sector = sector + 1
0108 return sector
0109 elif layer == 3:
0110 sector = 1
0111 for i in range(2, theLadder, 3):
0112 if (i + 1) % 3 == 0:
0113 sector = sector + 1
0114 return sector
0115 elif layer == 4:
0116 sector = (theLadder + 3) // 4
0117 return sector
0118
0119 def __BuildOnlineBarrelName(self, signedModule, signedLadder, layer):
0120 thePart = self.__GetPartStr(signedModule < 0, signedLadder < 0)
0121 theSector = str(self.__GetBarrelSector(layer, signedLadder, signedModule))
0122 return "BPix_B" + thePart + "_SEC" + theSector + "_LYR" + str(layer) + "_LDR" + str(abs(signedLadder)) + "F_MOD" + str(abs(signedModule))
0123
0124 def __BuildOnlineDiskName(self, signedDisk, signedBlade, panel, ring):
0125 thePart = self.__GetPartStr(signedDisk < 0, signedBlade < 0)
0126 return "FPix_B" + thePart + "_D" + str(abs(signedDisk)) + "_BLD" + str(abs(signedBlade)) + "_PNL" + str(panel) + "_RNG" + str(ring)
0127
0128 def __GroupHistograms(self):
0129 currentGroupName = ""
0130 groupOfHists = []
0131 self.groupedHistograms = []
0132
0133
0134 for obj in self.listOfNumHistograms:
0135 objName = obj.GetName()
0136 objNameSplit = objName.split("_")
0137 objNameCollected = ''.join(objNameSplit[0:-1])
0138 if objNameCollected != currentGroupName:
0139 if len(groupOfHists):
0140 self.groupedHistograms.append(groupOfHists)
0141 groupOfHists = []
0142
0143 currentGroupName = objNameCollected
0144 groupOfHists.append(obj)
0145 self.groupedHistograms.append(groupOfHists)
0146
0147 def __CreateDummyStructAsStr(self, dicData):
0148 str = "struct MyStruct{"
0149 str = str + "Int_t key;"
0150 leafStr = "key/I"
0151 for k in dicData:
0152 str = str + "Float_t " + k + ";"
0153 leafStr = leafStr + ":" + k + "/F"
0154 str = str + "};"
0155 return str, leafStr
0156
0157
0158
0159 def __init__(self, inputDQMName, outputDQMName, modDicName):
0160 self.inputFileName = inputDQMName
0161 self.outputFileName = outputDQMName
0162 self.detIDsFileName = modDicName
0163
0164 index = self.inputFileName.find('R000')
0165 runNumber = self.inputFileName[index+4:index+10]
0166
0167 self.dirs = ['DQMData/Run %s/PixelPhase1/Run summary/Phase1_MechanicalView' % (runNumber),
0168 'DQMData/Run %s/PixelPhase1/Run summary/Tracks' % (runNumber)]
0169 self.dirsAliases = {self.dirs[0]:"", self.dirs[1]: "T"}
0170
0171 self.inputFile = TFile(self.inputFileName)
0172 self.listOfNumHistograms = []
0173 self.availableNames = []
0174
0175 self.maxLadderToLayer = {6:1, 14:2, 22:3, 32:4}
0176 self.maxBladeToRing = {11:1, 17:2}
0177
0178 self.internalData = {}
0179
0180 if self.inputFile.IsOpen():
0181 print("%s opened successfully!" % (self.inputFileName))
0182
0183 for dir in self.dirs:
0184 self.__TraverseDirTree(self.inputFile.Get(dir))
0185 print("Histograms to read %d" % (len(self.listOfNumHistograms)))
0186
0187 self.detDict = {}
0188
0189 with open(self.detIDsFileName, "r") as detIDs:
0190 for entry in detIDs:
0191 items = entry.replace("\n", " ").split(" ")
0192 self.detDict.update({items[1] : int(items[0])})
0193
0194 self.internalData.update({int(items[0]) : {}})
0195
0196 self.__GroupHistograms()
0197
0198 else:
0199 print("Unable to open file %s" % (self.inputFileName))
0200
0201 def ReadHistograms(self):
0202 if self.inputFile.IsOpen():
0203 for group in self.groupedHistograms:
0204
0205 name = ''.join(group[0].GetName().split("_per_")[0])
0206 self.availableNames.append(name)
0207
0208 for obj in group:
0209 nbinsX = obj.GetNbinsX()
0210 nbinsY = obj.GetNbinsY()
0211
0212 if nbinsX == 9:
0213 maxX = nbinsX // 2
0214 maxY = nbinsY // 2
0215
0216 for x in range(-maxX, maxX + 1):
0217 if x == 0:
0218 continue
0219 for y in range(-maxY, maxY + 1, 1):
0220 if y == 0:
0221 continue
0222 onlineName = self.__BuildOnlineBarrelName(x, y, self.maxLadderToLayer[maxY])
0223 self.internalData[self.detDict[onlineName]].update({name : obj.GetBinContent(x + maxX + 1, y + maxY + 1)})
0224
0225 elif nbinsX == 7:
0226 maxX = nbinsX // 2
0227 maxY = nbinsY // 4
0228
0229 for x in range(-maxX, maxX + 1):
0230 if x == 0:
0231 continue
0232 for y in range(-maxY, maxY + 1):
0233 if int(y) == 0:
0234 continue
0235 for panel in range(1, 3):
0236 onlineName = self.__BuildOnlineDiskName(x, y, panel, self.maxBladeToRing[maxY])
0237 self.internalData[self.detDict[onlineName]].update({name : obj.GetBinContent(x + maxX + 1, (y + maxY) * 2 + panel)})
0238 else:
0239 print("Unrecognized plot")
0240 else:
0241 print("Histograms saved to internal data structure")
0242 def CreateTree(self):
0243 if len(self.internalData):
0244
0245
0246
0247 leafStr = ""
0248 for key in self.internalData:
0249 s, leafStr = self.__CreateDummyStructAsStr(self.internalData[key])
0250 print(s)
0251 print(leafStr)
0252 gROOT.ProcessLine(s)
0253 break
0254
0255 from ROOT import MyStruct
0256 ms = MyStruct()
0257
0258
0259 self.outputFile = TFile(self.outputFileName, "recreate")
0260 tree = TTree("tree", "readData")
0261 tree.Branch("b", ms, leafStr)
0262
0263 tree.SetBranchAddress("b", tree)
0264
0265 for key in self.internalData:
0266 setattr(ms, "key", key)
0267 for d in self.internalData[key]:
0268 setattr(ms, d, (self.internalData[key])[d])
0269 tree.Fill()
0270
0271
0272 tree.Write()
0273 self.outputFile.Close()
0274
0275 print("Data saved as TTree object")
0276
0277 def CreateTree2(self):
0278 if len(self.internalData):
0279
0280 self.outputFile = TFile(self.outputFileName, "recreate")
0281 tree = TTree("tree", "readData")
0282
0283 key = array("i", [0])
0284 tree.Branch("detid", key, "detid/i")
0285
0286 dat = {}
0287 for k in self.internalData:
0288 for d in self.internalData[k]:
0289 dat.update({d : array("f", [0])})
0290 tree.Branch(d, dat[d], d + "/F")
0291 break
0292
0293 for k in self.internalData:
0294 key[0] = k
0295 for d in self.internalData[k]:
0296 (dat[d])[0] = (self.internalData[k])[d]
0297 tree.Fill()
0298
0299 tree.Write()
0300 self.outputFile.Close()
0301
0302 print("Data saved as TTree object")
0303
0304 def DumpData(self):
0305 for key in self.internalData:
0306 print("#"*20)
0307 print(key)
0308 module = self.internalData[key]
0309 for d in module:
0310 print((d, module[d]))
0311
0312 for i in self.availableNames:
0313 print(i)
0314 print(len(self.availableNames))
0315
0316 def __del__(self):
0317 if self.inputFile:
0318 if self.inputFile.IsOpen():
0319 self.inputFile.Close()
0320
0321
0322 for i in range(1, len(sys.argv), 1):
0323 if i == 1:
0324 inputFileName = sys.argv[i]
0325 elif i == 2:
0326
0327
0328 outputFileName = sys.argv[i]
0329
0330
0331 readerObj = ModuleLvlValuesReader(inputFileName, outputFileName, detIDsFileName)
0332 readerObj.ReadHistograms()
0333 readerObj.CreateTree2()
0334