def get_branch_list_each_tree(self):
        PATH_included_root = read_file_name_root(self._infile)[2]
        DicTreeBranchNameList = {}

        f = TFile(PATH_included_root, "READ")
        dirlist = f.GetListOfKeys()
        ITER = dirlist.MakeIterator()
        key = ITER.Next()

        while key:
            BranchNameList = []
            tree = key.ReadObj()
            branchlist = tree.GetListOfBranches()
            if (branchlist.IsEmpty()):
                continue

            ITER_b = branchlist.MakeIterator()
            key_b = ITER_b.Next()
            while key_b:
                BranchNameList.append(key_b.GetName())
                key_b = ITER_b.Next()
            DicTreeBranchNameList[tree.GetName()] = BranchNameList
            key = ITER.Next()
        f.Close()
        return DicTreeBranchNameList
    def MakeHistoROOT_general(self, binNum=20, histoName=["Mjj", "lep1pt"]):
        tfile_list = self.Read_Data_n_MC()[0]
        Hist_list = []
        for i in range(len(tfile_list)):
            Tree = tfile_list[i].Get("tree")
            Entries = Tree.GetEntries()
            #print(Entries)
            Name = self.Read_Data_n_MC()[1][i]
            outfile = TFile(Name + "_hist.root", "RECREATE")
            Hist_list.append(read_file_name_root(Name + "_hist.root")[2])

            #BinMinMax_list = []
            for jj in range(Entries):
                Tree.GetEntry(jj)
                for kk, hName in enumerate(histoName):
                    BranchName = "Tree." + hName
                    if (jj == 0):
                        minval = eval(BranchName)
                        maxval = eval(BranchName)
                        temp_list = [minval, maxval]
                        BinMinMax_list.append(temp_list)
                    else:
                        if (eval(BranchName) < BinMinMax_list[kk][0]):
                            BinMinMax_list[kk][0] = eval(BranchName)
                        if (eval(BranchName) > BinMinMax_list[kk][1]):
                            BinMinMax_list[kk][1] = eval(BranchName)

            print("Bin Range of histograms :", BinMinMax_list)

            JHisto_list = []
            for num, hName2 in enumerate(histoName):
                RANGE = BinMinMax_list[num][1] - BinMinMax_list[num][0]
                temp_hist = TH1D(hName2, hName2, binNum,
                                 BinMinMax_list[num][0] - RANGE / 8,
                                 BinMinMax_list[num][1] + RANGE / 8)
                JHisto_list.append(temp_hist)
            del BinMinMax_list

            print "Filling ROOT Histogram :", Name
            for j in range(Entries):
                Tree.GetEntry(j)
                for kk, hName in enumerate(histoName):
                    BranchName = "Tree." + hName
                    JHisto_list[kk].Fill(eval(BranchName))
            outfile.Write()
            outfile.Close()
        del JHisto_list

        for i in range(len(tfile_list)):
            tfile_list[i].Close()
        Hist_tuple = tuple(Hist_list)
        del Hist_list
        return Hist_tuple
    def get_branch_list_all(self):
        PATH_included_root = read_file_name_root(self._infile)[2]
        SetBranchNameList = list()  # make a set of branchNameList
        f = TFile(PATH_included_root, "READ")
        dirlist = f.GetListOfKeys()
        ITER = dirlist.MakeIterator()
        key = ITER.Next()

        while key:
            tree = key.ReadObj()
            branchlist = tree.GetListOfBranches()
            if (branchlist.IsEmpty()):
                continue

            ITER_b = branchlist.MakeIterator()
            key_b = ITER_b.Next()
            while key_b:
                #SetBranchNameList.add(key_b.GetName())
                SetBranchNameList.append(key_b.GetName())
                key_b = ITER_b.Next()
            key = ITER.Next()
        f.Close()
        return SetBranchNameList
    def MakeHistoROOT(self, binNum=20, histoName=["Mjj", "lep1pt"]):
        tfile_list = self.Read_Data_n_MC()[0]
        #print(tfile_list)
        Hist_list = []

        BinMinMax_list = []
        for i in range(
                len(tfile_list)
        ):  # Specify Histogram bin-range, bin-num.. ROTATE on all files
            Tree = tfile_list[i].Get("tree")
            Entries = Tree.GetEntries()
            #print(Entries)
            #Name = self.Read_Data_n_MC()[1][i]
            #outfile = TFile(Name+"_hist.root","RECREATE")
            #Hist_list.append(read_file_name_root(Name+"_hist.root")[2])

            temp_BinMinMax_list = []
            for jj in range(Entries):
                Tree.GetEntry(jj)
                for kk, hName in enumerate(histoName):
                    BranchName = "Tree." + hName
                    if (jj == 0):
                        minval = eval(BranchName)
                        maxval = eval(BranchName)
                        temp_list = [minval, maxval]
                        temp_BinMinMax_list.append(temp_list)
                    else:
                        if (hName == "lep1pt"):  #ADDED  ##FIXME
                            temp_BinMinMax_list[kk][0] = 0
                            temp_BinMinMax_list[kk][1] = 400
                            continue  #ADDED  ##FIXME
                        if (hName == "jet1pt"):  #ADDED  ##FIXME
                            temp_BinMinMax_list[kk][0] = 0
                            temp_BinMinMax_list[kk][1] = 600
                            continue  #ADDED  ##FIXME
                        if (eval(BranchName) < temp_BinMinMax_list[kk][0]):
                            temp_BinMinMax_list[kk][0] = eval(BranchName)
                        if (eval(BranchName) > temp_BinMinMax_list[kk][1]):
                            temp_BinMinMax_list[kk][1] = eval(BranchName)
            print("Temp Bin Range of histograms :", temp_BinMinMax_list)
            if i == 0: BinMinMax_list = list(temp_BinMinMax_list)
            else:
                for num1 in range(len(BinMinMax_list)):
                    for num2 in range(len(BinMinMax_list[num1])):
                        if ((num2 == 0) & (BinMinMax_list[num1][num2] >
                                           temp_BinMinMax_list[num1][num2])):
                            BinMinMax_list[num1][num2] = temp_BinMinMax_list[
                                num1][num2]
                        elif ((num2 == 1) & (BinMinMax_list[num1][num2] <
                                             temp_BinMinMax_list[num1][num2])):
                            BinMinMax_list[num1][num2] = temp_BinMinMax_list[
                                num1][num2]
        print("Final Bin Range of histograms :", BinMinMax_list)
        del Tree

        ################################################### CREATE FILE ################################################
        for i in range(len(tfile_list)):
            JHisto_list = []
            Tree = tfile_list[i].Get("tree")
            Entries = Tree.GetEntries()
            #print(BinMinMax_list) ##
            Name = self.Read_Data_n_MC()[1][i]
            outfile = TFile(Name + "_hist.root", "RECREATE")
            Hist_list.append(read_file_name_root(Name + "_hist.root")[2])
            for num, hName2 in enumerate(histoName):
                #print(BinMinMax_list[num][1], BinMinMax_list[num][0])  ##
                RANGE = BinMinMax_list[num][1] - BinMinMax_list[num][0]
                temp_hist = TH1D(hName2, hName2, binNum,
                                 BinMinMax_list[num][0] - RANGE / 8,
                                 BinMinMax_list[num][1] + RANGE / 8)
                JHisto_list.append(temp_hist)
            #del BinMinMax_list

            print "Filling ROOT Histogram :", Name
            for j in range(Entries):
                Tree.GetEntry(j)
                Entries = Tree.GetEntries()
                for kk, hName in enumerate(histoName):
                    BranchName = "Tree." + hName
                    JHisto_list[kk].Fill(eval(BranchName))
                ### FIXME remove if just interate ROOT files
                #try:
                #    if((Tree.LL_Helicity)==1.0): JHisto_list[LastNum].Fill(0)
                #    elif((Tree.TL_Helicity)==1.0) : JHisto_list[LastNum].Fill(0.5)
                #    elif((Tree.TT_Helicity)==1.0) : JHisto_list[LastNum].Fill(1)
                #except Exception:
                #    JHisto_list[LastNum].Fill(-1)
                ###
            del JHisto_list
            outfile.Write()
            outfile.Close()

        #del JHisto_list
        del BinMinMax_list
        for i in range(len(tfile_list)):
            tfile_list[i].Close()
        Hist_tuple = tuple(Hist_list)
        del Hist_list
        return Hist_tuple
 def __init__(self, fileList):
     self.filelist = fileList
     self.namelist = [read_file_name_root(i)[0] for i in fileList]
    def MakeHistoROOT_ttZ(self, binNum=20, histoName=["Real", "Regressed"]):
        tfile_list = self.Read_Data_n_MC()[0]
        #print(tfile_list)
        Hist_list = []

        BinMinMax_list = []
        for i in range(
                len(tfile_list)
        ):  # Specify Histogram bin-range, bin-num.. ROTATE on all files
            Tree = tfile_list[i].Get("tree")
            Entries = Tree.GetEntries()
            #print(Entries)
            #Name = self.Read_Data_n_MC()[1][i]
            #outfile = TFile(Name+"_hist.root","RECREATE")
            #Hist_list.append(read_file_name_root(Name+"_hist.root")[2])

            temp_BinMinMax_list = []
            for jj in range(Entries):
                Tree.GetEntry(jj)
                for kk, hName in enumerate(histoName):
                    BranchName = "Tree." + hName
                    if (jj == 0):
                        minval = eval(BranchName)
                        maxval = eval(BranchName)
                        temp_list = [minval, maxval]
                        temp_BinMinMax_list.append(temp_list)
                    else:
                        if (eval(BranchName) < temp_BinMinMax_list[kk][0]):
                            temp_BinMinMax_list[kk][0] = eval(BranchName)
                        if (eval(BranchName) > temp_BinMinMax_list[kk][1]):
                            temp_BinMinMax_list[kk][1] = eval(BranchName)
            print("Temp Bin Range of histograms :", temp_BinMinMax_list)
            if i == 0: BinMinMax_list = list(temp_BinMinMax_list)
            else:
                for num1 in range(len(BinMinMax_list)):
                    for num2 in range(len(BinMinMax_list[num1])):
                        if ((num2 == 0) & (BinMinMax_list[num1][num2] >
                                           temp_BinMinMax_list[num1][num2])):
                            BinMinMax_list[num1][num2] = temp_BinMinMax_list[
                                num1][num2]
                        elif ((num2 == 1) & (BinMinMax_list[num1][num2] <
                                             temp_BinMinMax_list[num1][num2])):
                            BinMinMax_list[num1][num2] = temp_BinMinMax_list[
                                num1][num2]
        F_BinMinMax = []
        print("Final Bin Range of histograms :", BinMinMax_list)
        if BinMinMax_list[0][0] < BinMinMax_list[1][0]:
            F_BinMinMax.append(BinMinMax_list[0][0])
        else:
            F_BinMinMax.append(BinMinMax_list[1][0])
        if BinMinMax_list[0][1] > BinMinMax_list[1][1]:
            F_BinMinMax.append(BinMinMax_list[0][1])
        else:
            F_BinMinMax.append(BinMinMax_list[1][1])
        print("Merged Bin Range of Histogram :", F_BinMinMax)

        del Tree

        ################################################### CREATE FILE ################################################
        for i in range(len(tfile_list)):
            JHisto_list = []
            Tree = tfile_list[i].Get("tree")
            Entries = Tree.GetEntries()
            #print(BinMinMax_list) ##
            Name = self.Read_Data_n_MC()[1][i]
            outfile = TFile(Name + "_hist.root", "RECREATE")
            Hist_list.append(read_file_name_root(Name + "_hist.root")[2])
            for num, hName2 in enumerate(histoName):
                #print(BinMinMax_list[num][1], BinMinMax_list[num][0])  ##
                #RANGE = BinMinMax_list[num][1] - BinMinMax_list[num][0]
                RANGE = F_BinMinMax[1] - F_BinMinMax[0]
                #temp_hist = TH1D(hName2,hName2,binNum,BinMinMax_list[num][0]-RANGE/8,BinMinMax_list[num][1]+RANGE/8)
                temp_hist = TH1D(hName2, hName2, binNum,
                                 F_BinMinMax[0] - RANGE / 8,
                                 F_BinMinMax[1] + RANGE / 8)
                JHisto_list.append(temp_hist)
            print("HIST LISTs:", JHisto_list)
            #del BinMinMax_list

            print "Filling ROOT Histogram :", Name
            for j in range(Entries):
                Tree.GetEntry(j)
                Entries = Tree.GetEntries()
                for kk, hName in enumerate(histoName):
                    BranchName = "Tree." + hName
                    JHisto_list[kk].Fill(eval(BranchName))
            del JHisto_list
            outfile.Write()
            outfile.Close()

        del BinMinMax_list
        for i in range(len(tfile_list)):
            tfile_list[i].Close()
        Hist_tuple = tuple(Hist_list)
        del Hist_list
        return Hist_tuple
    def SplitTree(self):
        FileNameList = read_file_name_root(self._infile)
        BranchListAll = self.get_branch_list_all()
        BranchListEachTree = self.get_branch_list_each_tree()

        DicNumpyArray_branch = {}
        for numpyarray in BranchListAll:
            a = numpy.array([0], 'd')
            DicNumpyArray_branch[numpyarray] = a
        DicNumpyArray_branch = collections.OrderedDict(
            sorted(DicNumpyArray_branch.items()))
        print(DicNumpyArray_branch)

        DicNumpyArray_branch_w = {}
        for numpyarray_w in BranchListAll:
            a_w = numpy.array([0], 'd')
            DicNumpyArray_branch_w[numpyarray_w] = a_w
        DicNumpyArray_branch_w = collections.OrderedDict(
            sorted(DicNumpyArray_branch_w.items()))
        print(DicNumpyArray_branch_w)

        gBenchmark.Start("Regerating tree root")
        f = TFile(FileNameList[2], "READ")
        dirlist = f.GetListOfKeys()
        ITER = dirlist.MakeIterator()
        key = ITER.Next()

        outfileName = os.getcwd(
        ) + "/" + FileNameList[0] + "_cut_TTTL.root"  #FIXME
        print("CREATING... :", outfileName)
        outfile = TFile(outfileName, "RECREATE")

        ijk = 0
        break_flag = 0
        while key:
            if (break_flag == 1): break
            break_flag += 1
            tree = key.ReadObj()
            tree_f = TTree(tree.GetName() + "", tree.GetName() + "")
            ENTRY = tree.GetEntries()
            #print(ENTRY)
            for i in range(len(DicNumpyArray_branch)):
                if (list(DicNumpyArray_branch.keys())[i]
                        in BranchListEachTree[tree.GetName()]):
                    tree.SetBranchAddress(
                        list(DicNumpyArray_branch.keys())[i],
                        list(DicNumpyArray_branch.values())[i])
                    tree_f.Branch(
                        list(DicNumpyArray_branch_w.keys())[i],
                        list(DicNumpyArray_branch_w.values())[i],
                        list(DicNumpyArray_branch_w.keys())[i] + "/D")
                else:
                    continue

            print("for tree", tree.GetName())
            for j in range(ENTRY):
                tree.GetEntry(j)
                if (j % 5000 == 0):
                    print("now looping", j, "th Events, total of ", ENTRY,
                          "events")
                for k in range(len(DicNumpyArray_branch)):
                    if (list(DicNumpyArray_branch.keys())[k]
                            in BranchListEachTree[tree.GetName()]
                        ):  ### FIXED MAYBE not correct....
                        pass
                    else:
                        continue
                    list(DicNumpyArray_branch_w.values())[k][0] = list(
                        DicNumpyArray_branch.values())[k][0]
                if (True
                        #& (list(DicNumpyArray_branch.values())[0][0] == 1)  # LL  #FIXME
                        & (list(DicNumpyArray_branch.values())[0][0] == 0
                           )  # TTTL  #FIXME
                    ):
                    ijk = ijk + 1
                    tree_f.Fill()
                else:
                    continue
            print(" Event left after filtering : ", ijk, "!!!!!!!!!")
            print("\n")
            ijk = 0
            if (tree_f.GetEntries() == 0):
                print("!!!!!!! ", tree_f.GetName(),
                      " is Empty, would not be written !!!!!")
            else:
                tree_f.Write()

            key = ITER.Next()

        print("")
        print("////////////////////////////////////////////////")
        print("outputfile : ")
        print(outfileName)
        print("////////////////////////////////////////////////")
        print("")

        outfile.Close()
        f.Close()
        print(
            "*********************************************************************************************"
        )
        gBenchmark.Show("Regerating tree root")
        print(
            "*********************************************************************************************"
        )

        return outfileName