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)