def cutTree(oldfilename, treenames, **kwargs): """Extract tree from file and save in new one.""" start_here = time.time() # TREENAME treename = "" if isinstance(treenames, str): treenames = [treenames] if len(treenames) == 1: treename = "_%s" % treenames[0] print ">>>\n>>> extracting tree(s) from file" N = kwargs.get('N', -1) # CUTS cuts = kwargs.get('cuts', "channel>0") if isinstance(cuts, str): cuts = [cuts] * len(treenames) if len(treenames) != len(cuts): print ">>> Warning! len(treenames)!=len(cuts)" # FILE OPTIONS newfilename = kwargs.get('newfilename', False) update = kwargs.get('update', False) if not newfilename: if update: newfilename = oldfilename else: newfilename = oldfilename.replace(".root", "%s_string.root" % (treename)) copycontents = kwargs.get('copycontents', False) and oldfilename != newfilename option = 'read' if copycontents else ('update' if update else 'recreate') option = kwargs.get('option', option) label = kwargs.get('label', "_cut" if (oldfilename == newfilename) else "") # FILE oldfile = TFile(oldfilename) if copycontents: succes = oldfile.Cp(newfilename, True) newfile = TFile(newfilename, 'update') # PRINT print ">>> file in: \"%s\"" % (oldfilename) print ">>> file out: \"%s\"" % (newfilename) print ">>> tree label: \"%s\"" % (label) print ">>> settings: update=%s, option=\"%s\", copycontents=%s" % ( update, option, copycontents) for treename, cut in zip(treenames, cuts): oldtree = oldfile.Get(treename) newtreename = treename + label print ">>> copying tree \"%s\" into \"%s\" with cuts" % (treename, newtreename) print ">>> \"%s\"" % (cut) newtree = None maxmessage = "" if N > 0: newtree = oldtree.CopyTree(cut, "", N) maxmessage = " (max %i)" % N else: newtree = oldtree.CopyTree(cut) #newtree.SetName(newtreename) newtree.Write(newtreename, TObject.kOverwrite) print ">>> extraction done: %i%s of %i entries copied" % ( newtree.GetEntries(), maxmessage, oldtree.GetEntries()) print ">>> writing and closing new file: %s" % (newfilename) #newfile.Write(TObject.kOverwrite) newfile.Close() oldfile.Close() print ">>> took %.2f seconds." % (time.time() - start_here)