Parse qp.py

From The Yambo Project
Jump to navigation Jump to search

Save the following text into a file called parse_qp.py

#! /usr/bin/env python3
import sys

def parse_report(file_qp):
   #
   outl=[]
   outd={}
   fl=open(file_qp,"r")
   #
   for line in fl:
     #
     if "#  X G`s" in line:
        outd["X_gvect"]=int(line.split()[-1])
     if "#  X bands" in line:
        outd["X_bands"]=int(line.split()[-1])
     if "#  Sc/G bands" in line:
        outd["G_bands"]=int(line.split()[-1])
     if "#" in line: continue
     if len(line) == 0: continue
     s=line.split()
     if len(s) != 5 : continue

     data=[float(s[0]),float(s[1]),float(s[2]),float(s[3])]
     outl.append(data)
     outd["qp_list"]=outl

   fl.close()
   return outd

def formatter(val,maxfield=12):
    sval=str(val)
    return " "*(maxfield-len(sval))+sval


def print_qp_data(outd=None,val=None):
    if outd == None:
       strout =  formatter("# Xo_gvect")
       strout += formatter("Xo_nbnd")
       strout += formatter("G_nbnd")
       strout += formatter("Egap [eV]")
       print(strout)
       return

    outl=outd["qp_list"]
    #
    # determine top of the valence
    if val==None:
      for dat in outl:
         if dat[2] == 0.0:
            val=int(dat[1])
            break

    # valence top was not found
    if val == None: sys.exit(2)

    # compute the gap
    homo=-10000
    lumo=+10000
    for dat in outl:
       tmp=(dat[2]+dat[3])
       if (dat[1]==val+1):
         if (tmp<lumo): lumo=tmp
       if (dat[1]==val):
         if (tmp>homo): homo=tmp
    #
    egap=lumo-homo
    egap_str=str("%10.6f" % egap)
    #
    stdout  = formatter(outd["X_gvect"])
    stdout += formatter(outd["X_bands"])
    stdout += formatter(outd["G_bands"])
    stdout += formatter(egap_str)
    print(stdout)

def main(argv):
   #
   usage_str='''
  Usage parse_qp.py  [-h,--help] file_qp1 file_qp2...
'''
   #
   if len(argv) == 1:
     print(usage_str)
     sys.exit(1)
   if argv[1]=="-h" or argv[1]=="--help":
     print(usage_str)
     sys.exit(0)
   #
   print_qp_data()
   flist=argv
   for f in flist[1:]:
     #
     outd=parse_report(f)
     print_qp_data(outd)



if __name__ == "__main__":
   main(sys.argv)