def build_mixed_model(signal_file, xsec_file, mu, mr_min, rsq_min, outfile): mr_min = mr_min*1000 signal_name = signal_file.split("/")[-1] msq = signal_name.split("_")[1] mgl = signal_name.split("_")[2] (xsec,xsec_plus,xsec_minus) = get_xsec(xsec_file, msq, mgl) signal = rt.TFile(signal_file) signal_tree = signal.Get("HggOutput") eff = signal_tree.GetEntries("PFMR > %f & PFR^2 > %f" % (mr_min, rsq_min)) / 10000. #calculate the number of signal events expected n_events = int(eff * (xsec * 1000) * 20 * mu) n_events_plus = int(eff * ((xsec+xsec_plus) * 1000) * 20 * mu) n_events_minus = int(eff * ((xsec-xsec_minus) * 1000) * 20 * mu) #make the iteration list for signal signal_tree.Draw(">>iterlist","","entrylist") itlist = rt.gDirectory.Get("iterlist") signal_mr_rsq = [] #make a list of all the values for that file for event in range(signal_tree.GetEntries()): if event % 5000 == 0: print "scanning signal point....", event entry = itlist.Next() signal_tree.GetEntry(entry) if signal_tree.PFMR > 0: signal_mr_rsq.append((signal_tree.PFMR,signal_tree.PFR)) #randomize the entries random.shuffle(signal_mr_rsq) #output variables rt.gROOT.ProcessLine("struct myStruct{\ Float_t PFMR;\ Float_t PFR;\ };") outfile = rt.TFile(outfile,"RECREATE") s = rt.myStruct() #generate the output tree outTree = rt.TTree("HggOutput","HggOutput") outTree.Branch("PFMR",rt.AddressOf(s,"PFMR"),"PFMR/F") outTree.Branch("PFR",rt.AddressOf(s,"PFR"),"PFR/F") print "Filling result signal..." #fill the tree for ii in signal_mr_rsq[:n_events]: print ii[0],ii[1]*ii[1] s.PFMR = float(ii[0])/ 1000. s.PFR = float(ii[1]) outTree.Fill() outTree.Write() outfile.Close() return (eff,n_events, n_events_plus, n_events_minus)