def makeDendrogram(numfactors=1, corandata="coran/corandata", dataext=".spi"):

        rundir = "cluster"
        apParam.createDirectory(rundir)
        ### make list of factors
        factorstr = ""
        for fact in range(1,numfactors+1):
                factorstr += str(fact)+","
        factorstr = factorstr[:-1]

        ### do hierarchical clustering
        mySpider = spyder.SpiderSession(dataext=dataext, logo=False, log=True)
        mySpider.toSpider(
                "CL HC",
                corandata+"_IMC", # path to coran data
                factorstr, # factor string
        )

        ## weight for each factor
        for fact in range(numfactors):
                mySpider.toSpiderQuiet("1.0")
        mySpider.toSpider(
                "5",         #use Ward's method
                "T", "5.1", rundir+"/dendrogram.ps",  #dendrogram image file
                "Y", rundir+"/dendrogramdoc", #dendrogram doc file
        )
        mySpider.close()

        apImage.convertPostscriptToPng("cluster/dendrogram.ps", "dendrogram.png")
def makeDendrogram(numfactors=1, corandata="coran/corandata", dataext=".spi"):

    rundir = "cluster"
    apParam.createDirectory(rundir)
    ### make list of factors
    factorstr = ""
    for fact in range(1, numfactors + 1):
        factorstr += str(fact) + ","
    factorstr = factorstr[:-1]

    ### do hierarchical clustering
    mySpider = spyder.SpiderSession(dataext=dataext, logo=False, log=True)
    mySpider.toSpider(
        "CL HC",
        corandata + "_IMC",  # path to coran data
        factorstr,  # factor string
    )

    ## weight for each factor
    for fact in range(numfactors):
        mySpider.toSpiderQuiet("1.0")
    mySpider.toSpider(
        "5",  #use Ward's method
        "T",
        "5.1",
        rundir + "/dendrogram.ps",  #dendrogram image file
        "Y",
        rundir + "/dendrogramdoc",  #dendrogram doc file
    )
    mySpider.close()

    apImage.convertPostscriptToPng("cluster/dendrogram.ps", "dendrogram.png")
def createFactorMap(f1, f2, rundir, dataext):
    ### 3. factor plot
    apParam.createDirectory(rundir + "/factors", warning=False)
    mySpider = spyder.SpiderSession(dataext=dataext, logo=False, log=False)
    factorfile = rundir + "/factors/factorps" + ("%02d-%02d" % (f1, f2))
    mySpider.toSpiderQuiet(
        "CA SM",
        "I",
        rundir + "/corandata",  #coran prefix
        "0",
        str(f1) + "," + str(f2),  #factors to plot
        "S",
        "+",
        "Y",
        "5",
        "0",
        factorfile,
        "\n\n\n\n",
        "\n\n\n\n",
        "\n",  #9 extra steps, use defaults
    )
    time.sleep(2)
    mySpider.close()
    # hack to get postscript converted to png, require ImageMagick
    apImage.convertPostscriptToPng(factorfile + ".ps",
                                   factorfile + ".png",
                                   size=200)
    apFile.removeFile(factorfile + ".ps")

    ### 4. factor plot visualization
    """
        ### this is broken in SPIDER 13.0
        mySpider = spyder.SpiderSession(dataext=dataext, logo=False)
        mySpider.toSpider(
                "SD C", #create coordinate file
                rundir+"/corandata", #coran prefix
                str(f1)+","+str(f2), #factors to plot
                rundir+"/sdcdoc"+("%02d%02d" % (f1,f2)),
        )
        visimg = rundir+"/visimg"+("%02d%02d" % (f1,f2))
        mySpider.toSpider(
                "CA VIS", #visualization
                "(1024,1024)",
                rundir+"/sdcdoc"+("%02d%02d" % (f1,f2)), #input doc from 'sd c'
                rundir+"/visdoc"+("%02d%02d" % (f1,f2)), #output doc
                "alignedstack@00001", # image in series ???
                "(12,12)", #num of rows, cols
                "5.0",       #stdev range
                "(5.0,5.0)",   #upper, lower thresh
                visimg, #output image
                "1,"+str(numpart),
                "1,2",
        )
        mySpider.close()
        emancmd = ("proc2d "+visimg+dataext+" "+visimg+".png ")
        apEMAN.executeEmanCmd(emancmd, verbose=False, showcmd=False)
        """
    return
def hierarchClusterProcess(numpart=None,
                           factorlist=range(1, 5),
                           corandata="coran/corandata",
                           rundir=".",
                           dataext=".spi"):
    """
        inputs:
                coran data
                number of particles
                factor list
                output directory
        output:
                dendrogram doc file
                factorkey
        """
    #apFile.removeFile(rundir+"/dendrogramdoc"+dataext)

    factorstr, factorkey = operations.intListToString(factorlist)

    dendrogramfile = rundir + "/dendrogramdoc" + factorkey + dataext
    if os.path.isfile(dendrogramfile):
        apDisplay.printMsg(
            "Dendrogram file already exists, skipping processing " +
            dendrogramfile)
        return dendrogramfile

    apDisplay.printMsg("Creating dendrogram file: " + dendrogramfile)
    ### do hierarchical clustering
    mySpider = spyder.SpiderSession(dataext=dataext, logo=False, log=True)
    mySpider.toSpider(
        "CL HC",
        spyder.fileFilter(corandata) + "_IMC",  # path to coran data
        factorstr,  # factor string
    )
    ## weight for each factor
    for fact in factorlist:
        mySpider.toSpiderQuiet("1.0")
    minclasssize = "%.4f" % (numpart * 0.0001 + 2.0)
    mySpider.toSpider(
        "5",  #use Ward's method
        "T",
        minclasssize,
        rundir + "/dendrogram.ps",  #dendrogram image file
        "Y",
        spyder.fileFilter(dendrogramfile),  #dendrogram doc file
    )
    mySpider.close()

    if not os.path.isfile(dendrogramfile):
        apDisplay.printError(
            "SPIDER dendrogram creation (CL HC) failed, too many particles??")
    apImage.convertPostscriptToPng("cluster/dendrogram.ps", "dendrogram.png")

    return dendrogramfile
def createFactorMap(f1, f2, rundir, dataext):
        ### 3. factor plot
        apParam.createDirectory(rundir+"/factors", warning=False)
        mySpider = spyder.SpiderSession(dataext=dataext, logo=False, log=False)
        factorfile = rundir+"/factors/factorps"+("%02d-%02d" % (f1,f2))
        mySpider.toSpiderQuiet(
                "CA SM", "I",
                rundir+"/corandata", #coran prefix
                "0",
                str(f1)+","+str(f2), #factors to plot
                "S", "+", "Y",
                "5", "0",
                factorfile,
                "\n\n\n\n","\n\n\n\n","\n", #9 extra steps, use defaults
        )
        time.sleep(2)
        mySpider.close()
        # hack to get postscript converted to png, require ImageMagick
        apImage.convertPostscriptToPng(factorfile+".ps", factorfile+".png", size=200)
        apFile.removeFile(factorfile+".ps")

        ### 4. factor plot visualization
        """
        ### this is broken in SPIDER 13.0
        mySpider = spyder.SpiderSession(dataext=dataext, logo=False)
        mySpider.toSpider(
                "SD C", #create coordinate file
                rundir+"/corandata", #coran prefix
                str(f1)+","+str(f2), #factors to plot
                rundir+"/sdcdoc"+("%02d%02d" % (f1,f2)),
        )
        visimg = rundir+"/visimg"+("%02d%02d" % (f1,f2))
        mySpider.toSpider(
                "CA VIS", #visualization
                "(1024,1024)",
                rundir+"/sdcdoc"+("%02d%02d" % (f1,f2)), #input doc from 'sd c'
                rundir+"/visdoc"+("%02d%02d" % (f1,f2)), #output doc
                "alignedstack@00001", # image in series ???
                "(12,12)", #num of rows, cols
                "5.0",       #stdev range
                "(5.0,5.0)",   #upper, lower thresh
                visimg, #output image
                "1,"+str(numpart),
                "1,2",
        )
        mySpider.close()
        emancmd = ("proc2d "+visimg+dataext+" "+visimg+".png ")
        apEMAN.executeEmanCmd(emancmd, verbose=False, showcmd=False)
        """
        return
def hierarchClusterProcess(numpart=None, factorlist=range(1,5),
                corandata="coran/corandata", rundir=".", dataext=".spi"):
        """
        inputs:
                coran data
                number of particles
                factor list
                output directory
        output:
                dendrogram doc file
                factorkey
        """
        #apFile.removeFile(rundir+"/dendrogramdoc"+dataext)

        factorstr, factorkey = operations.intListToString(factorlist)

        dendrogramfile = rundir+"/dendrogramdoc"+factorkey+dataext
        if os.path.isfile(dendrogramfile):
                apDisplay.printMsg("Dendrogram file already exists, skipping processing "+dendrogramfile)
                return dendrogramfile

        apDisplay.printMsg("Creating dendrogram file: "+dendrogramfile)
        ### do hierarchical clustering
        mySpider = spyder.SpiderSession(dataext=dataext, logo=False, log=True)
        mySpider.toSpider(
                "CL HC",
                spyder.fileFilter(corandata)+"_IMC", # path to coran data
                factorstr, # factor string
        )
        ## weight for each factor
        for fact in factorlist:
                mySpider.toSpiderQuiet("1.0")
        minclasssize = "%.4f" % (numpart*0.0001+2.0)
        mySpider.toSpider(
                "5",         #use Ward's method
                "T", minclasssize, rundir+"/dendrogram.ps", #dendrogram image file
                "Y", spyder.fileFilter(dendrogramfile), #dendrogram doc file
        )
        mySpider.close()

        if not os.path.isfile(dendrogramfile):
                apDisplay.printError("SPIDER dendrogram creation (CL HC) failed, too many particles??")
        apImage.convertPostscriptToPng("cluster/dendrogram.ps", "dendrogram.png")

        return dendrogramfile