Пример #1
0
def file_less_suffix(FBTS):
    qd = QDir(FBTS.folderpath())
    qd.setFilter(QDir.Files | QDir.Readable)
    if qd.exists(FBTS.basename()):
        a_file = QFile(qd.absoluteFilePath(FBTS.basename()))
        return _qfile_to_stream(a_file, FBTS.open_mode())
    return None
Пример #2
0
def file_less_suffix(FBTS):
    qd = QDir( FBTS.folderpath() )
    qd.setFilter(QDir.Files | QDir.Readable)
    if qd.exists(FBTS.basename()):
        a_file = QFile( qd.absoluteFilePath(FBTS.basename()) )
        return _qfile_to_stream(a_file, FBTS.open_mode())
    return None
Пример #3
0
    def show_heatmap(self):
        # print("a")
        directory = QDir(os.getcwd())
        directory.setFilter(QDir.Files | QDir.NoDotDot | QDir.NoDotAndDotDot)
        directory.setSorting(QDir.Time)
        set_filter = ["*.jpg"]
        directory.setNameFilters(set_filter)
        # print("b")
        for show in directory.entryInfoList():
            print("%s %s" % (show.size(), show.fileName()))
            if "heatmap" in show.fileName():
                out = show.fileName()
                break
        # print("c")
        w = self.heatmapLabel.width()
        h = self.heatmapLabel.height()
        # print("d")
        # print("%r", self.zone_cutted)
        if self.zone_cutted:
            x1, y1, x2, y2 = get_zone_position()

            imageObject = Image.open(out)
            cropped = imageObject.crop((x1, y1, x2, y2))
            name_of_file = QFileInfo(out).baseName() + "_zone.jpg"
            cropped.save(name_of_file)

            pixmap = QPixmap(name_of_file)
        else:
            pixmap = QPixmap(out)
        # print("e")
        pixmap = pixmap.scaled(w, h, QtCore.Qt.KeepAspectRatio)
        self.heatmapLabel.setPixmap(pixmap)
Пример #4
0
    def show_video(self):
        directory = QDir(os.getcwd())
        directory.setFilter(QDir.Files | QDir.NoDotDot | QDir.NoDotAndDotDot)
        directory.setSorting(QDir.Time)
        set_filter = ["*.avi"]
        directory.setNameFilters(set_filter)

        for show in directory.entryInfoList():
            print("%s %s" % (show.size(), show.fileName()))
            out = show.fileName()
            break
        # print(1)
        if self.zone_cutted:
            # print(2)
            x1, y1, x2, y2 = get_zone_position()

            clip = VideoFileClip(out)
            cut_video = crop(clip, x1, y1, x2, y2)

            name_of_file = QFileInfo(out).baseName() + "_zone.avi"
            cut_video.write_videofile(name_of_file, codec='mpeg4', audio=False)

        else:
            # print(3)
            name_of_file = out
        # print(4)
        self.mediaPlayer.setMedia(
            QMediaContent(QUrl.fromLocalFile(os.getcwd() + "\\" + name_of_file))
        )
        # print(5)
        # self.mediaPlayer.setPlaybackRate()
        self.play()
Пример #5
0
def related_file(FBTS, filename, encoding=None):
    qd = QDir( FBTS.folderpath() )
    qd.setFilter(QDir.Files | QDir.Readable)
    qd.setSorting(QDir.Type | QDir.Reversed)
    qd.setNameFilters( [filename] ) # literal name or 'foo*.*'
    names = qd.entryList()
    if names : # list is not empty, open the first
        a_file = QFile( qd.absoluteFilePath(names[0]) )
        return _qfile_to_stream(a_file, QIODevice.ReadOnly, encoding)
    return None
Пример #6
0
def related_file(FBTS, filename, encoding=None):
    qd = QDir(FBTS.folderpath())
    qd.setFilter(QDir.Files | QDir.Readable)
    qd.setSorting(QDir.Type | QDir.Reversed)
    qd.setNameFilters([filename])  # literal name or 'foo*.*'
    names = qd.entryList()
    if names:  # list is not empty, open the first
        a_file = QFile(qd.absoluteFilePath(names[0]))
        return _qfile_to_stream(a_file, QIODevice.ReadOnly, encoding)
    return None
Пример #7
0
    def scanDir(self, path: str):
        """
        Scan the image's directory.
        """

        # Stores all files inside the directory.
        imageDir = QDir(path)
        imageDir.setFilter(QDir.Files | QDir.NoSymLinks | QDir.Readable)

        # Add files' absolute path to list.
        self.dirImages = [
            file.absoluteFilePath() for file in imageDir.entryInfoList()
            if file.suffix() in SUPPORTED_EXTENSIONS
        ]
Пример #8
0
 def run(self):
     #   Lists ISO files in local directory
     root=QDir(self.destination)
     root.setFilter(QDir.AllDirs|QDir.NoDot|QDir.NoDotDot)
     dirs=root.entryList()
     for dir in dirs:
         sub=QDir(self.destination+'/'+dir)
         sub.setNameFilters(["*.iso"])
         sub.setFilter(QDir.Files)
         local=sub.entryList()
         if len(local)!=0:
             for iso in local:
                 isoSize=QFileInfo(sub.absolutePath()+'/' +iso).size()
                 self.localList.append([dir,iso,isoSize])
     #   List the remote directory
     commande = ['rsync', '-avHP', '--list-only',str(self.path)]
     try:
         if self.password != "":
             envir = os.environ.copy()
             envir['RSYNC_PASSWORD']=str(self.password)
             process = Popen(commande, shell=False, stdout=PIPE, stderr=PIPE, env=envir)
         else:
             process = Popen(commande, shell=False, stdout=PIPE, stderr=PIPE)
     except OSError as e:
         self.lvM.emit(self.tr("Command rsync not found: ")+str(e))
         self.endSignal.emit(1)
         return
     except ValueError as e:
         self.lvM.emit(self.tr("Error in rsync parameters: ")+str(e))
         self.endSignal.emit(2)
         return
     except Exception as e:
         # Unknown error in rsync
         self.lvM.emit(self.tr("Error in rsync: ")+str(e))
         self.endSignal.emit(3)
         return
     process.poll()
     while True :
         item=process.stdout.readline().rstrip().decode('unicode_escape')
         self.lvM.emit(item)
         if str(item.lower()).endswith('.iso') :
             words=item.split()
             self.list.append(words[-1])
         process.poll()
         if process.returncode != None:
             break
     self.endSignal.emit(0)
Пример #9
0
    def recursive(self, path, search_string, paths):
        directory = QDir(path)
        directory.setFilter(QDir.Files | QDir.Dirs | QDir.NoDotAndDotDot)
        directory.setSorting(QDir.DirsLast)

        for entry in directory.entryInfoList():
            entry_path = entry.absoluteFilePath()
            ignored = self.is_ignored(entry_path)
            if not ignored and entry.isFile() and entry_path.endswith('php'):
                current_path = entry_path[len(self.root) + 1:]

                if self.is_fuzzy(current_path, search_string):
                    paths.append(current_path)
            elif not ignored and entry.isDir():
                paths = self.recursive(entry_path, search_string, paths)

        return paths
Пример #10
0
    def show_counting(self):
        directory = QDir(os.getcwd())
        directory.setFilter(QDir.Files | QDir.NoDotDot | QDir.NoDotAndDotDot)
        directory.setSorting(QDir.Time)
        set_filter = ["*.jpg"]
        directory.setNameFilters(set_filter)

        for show in directory.entryInfoList():
            print("%s %s" % (show.size(), show.fileName()))
            if "graph" in show.fileName():
                out = show.fileName()
                break

        w = self.countingLabel.width()
        h = self.countingLabel.height()

        pixmap = QPixmap(out)
        pixmap = pixmap.scaled(w, h, QtCore.Qt.KeepAspectRatio)
        self.countingLabel.setPixmap(pixmap)
Пример #11
0
 def initUI(self):
     self.setWindowTitle("userFirefox - userChrome tweak manager")
     self.setGeometry(300, 300, 640, 640)
     self.layoutBox = LayoutBox()
     self.setLayout(self.layoutBox)
     currentDir = QDir().current()
     logging.info("Current application dir: %s", currentDir.path())
     currentDir.setFilter(
         QDir.Filters(24577)
     )  #filter only dirs 0x001 and no dots 0x2000 and 0x4000 results to 0d24577
     tweakCats = currentDir.entryList()
     tweaksAvail = {}
     tweaksTree = {}
     logging.debug("List of tweak categoriess: %s", tweakCats)
     for tCat in tweakCats:
         categoryDir = QDir()
         categoryDir.setPath(currentDir.path())
         categoryDir.cd(tCat)
         categoryDir.setFilter(
             QDir.Filters(2))  #filter files 0x002 results to 0d2
         logging.debug("Tweaks in category %s are %s", tCat,
                       categoryDir.entryList())
         tweaksAvail[tCat] = categoryDir.entryList()
     logging.info("Dictionary of all available tweaks: %s", tweaksAvail)
     for tCat in tweaksAvail:
         logging.debug(tCat)
         tweaksTree["_uFFTree"] = {}
         tweaksTree[tCat] = QTreeWidgetItem(
             self.layoutBox.filesBox.availableTweaks)
         tweaksTree[tCat].setText(0, tCat)
         for tName in tweaksAvail[tCat]:
             tweaksTree["_uFFTree"][tName] = QTreeWidgetItem(
                 tweaksTree[tCat])
             tweaksTree["_uFFTree"][tName].setText(0, tName)
     #qtreetop = QTreeWidgetItem(self.layoutBox.filesBox.availableTweaks)
     #qtreetop.setText(0, "baf")
     self.show()
Пример #12
0
def listfiles(path):
    # print (QDir.currentPath()+path)
    dir = QDir(path)
    dir.setFilter(QDir.Files | QDir.NoDotAndDotDot)
    print (dir.entryList())
    return dir.entryList()
Пример #13
0
 def listEntries(self, dir: QDir) -> [str]:
     dir.setFilter(QDir.Dirs | QDir.NoDotAndDotDot)
     folderNames = []
     for fileInfo in dir.entryInfoList():
         folderNames.append(fileInfo.fileName())
     return folderNames
Пример #14
0
class gmIdGUIWindow(QtWidgets.QMainWindow):
    # intialize, define all the signals and constants
    def __init__(self):
        # change pyqtgraph setting
        pg.setConfigOption('background', 'w')
        # Create UI Interface
        super(gmIdGUIWindow, self).__init__()
        self.ui = Ui_GmIdMainWindow()
        self.ui.setupUi(self)
        # Initialize the Data
        self.configDataLib()
        # Connect buttons and checkBoxes
        self.configBondKeys()
        # Set the plot
        self.configPlot()

    def configBondKeys(self):
        ''' connect GUI elements to corresponding functions'''
        #checkBox.stateChanged.connect()
        self.ui.checkBoxCornerTT.stateChanged.connect(self.PlotCornerTT)
        self.ui.checkBoxCornerFF.stateChanged.connect(self.PlotCornerFF)
        self.ui.checkBoxCornerSS.stateChanged.connect(self.PlotCornerSS)
        self.ui.checkBoxCornerFS.stateChanged.connect(self.PlotCornerFS)
        self.ui.checkBoxCornerSF.stateChanged.connect(self.PlotCornerSF)
        self.ui.checkBoxRef.stateChanged.connect(self.PlotRef)
        #pushButton.clicked.connect()
        self.ui.pushButtonMosDirSel.clicked.connect(self.DirSel)
        self.ui.pushButtonMosMatSet.clicked.connect(self.MosMatSet)
        self.ui.pushButtonGateLSet.clicked.connect(self.GateLSet)
        self.ui.pushButtonGateLRef.clicked.connect(self.GateLRef)
        self.ui.pushButtonPlot.clicked.connect(self.PlotUpdate)
        self.ui.pushButtonSynGmId.clicked.connect(self.SynGmId)
        self.ui.pushButtonSynVstar.clicked.connect(self.SynVstar)
        self.ui.pushButtonFuEst.clicked.connect(self.FuEst)
        self.ui.pushButtonExtCheck.clicked.connect(self.ExtCheck)
        self.ui.pushButtonCal.clicked.connect(self.CalMos)
        #comboBox.currentIndexChanged.connect()
        self.ui.comboBoxDesignCorner.currentIndexChanged.connect(
            self.changeCorner)

    def configPlot(self):
        # vstar as x axis
        self.ui.topPlotVstar.plotItem.showGrid(True, True, 0.7)
        self.ui.topPlotVstar.plotItem.setTitle('Fig.1 Id vs Vstar')
        self.ui.topPlotVstar.plotItem.setLabel('bottom', 'Vstar', units='V')
        self.ui.topPlotVstar.plotItem.setLabel('left', 'Id', units='A')
        self.ui.topPlotVstar.plotItem.setLogMode(False, True)
        self.ui.midPlotVstar.plotItem.showGrid(True, True, 0.7)
        self.ui.midPlotVstar.plotItem.setLabel('bottom', 'Vstar', units='V')
        self.ui.midPlotVstar.plotItem.setTitle('Fig.2 Avo vs Vstar')
        self.ui.midPlotVstar.plotItem.setLabel('left', 'Avo')
        self.ui.botPlotVstar.plotItem.showGrid(True, True, 0.7)
        self.ui.botPlotVstar.plotItem.setLabel('bottom', 'Vstar', units='V')
        self.ui.botPlotVstar.plotItem.setTitle('Fig.3 Ft vs Vstar')
        self.ui.botPlotVstar.plotItem.setLabel('left', 'Ft', units='Hz')
        # id as x axis
        self.ui.topPlotId.plotItem.showGrid(True, True, 0.7)
        self.ui.topPlotId.plotItem.setTitle('Fig.1 Gm/Id vs Id')
        self.ui.topPlotId.plotItem.setLabel('bottom', 'Id', units='A')
        self.ui.topPlotId.plotItem.setLabel('left', 'Gm/Id', units='S/A')
        self.ui.midPlotId.plotItem.showGrid(True, True, 0.7)
        self.ui.midPlotId.plotItem.setLabel('bottom', 'Id', units='A')
        self.ui.midPlotId.plotItem.setTitle('Fig.2 Avo vs Id')
        self.ui.midPlotId.plotItem.setLabel('left', 'Avo')
        self.ui.botPlotId.plotItem.showGrid(True, True, 0.7)
        self.ui.botPlotId.plotItem.setLabel('bottom', 'Id', units='A')
        self.ui.botPlotId.plotItem.setTitle('Fig.3 Ft*Gm/Id vs Id')
        self.ui.botPlotId.plotItem.setLabel('left', 'Ft*Gm/Id', units='Hz/V')
        # gmId as x axis
        self.ui.topPlotGmId.plotItem.showGrid(True, True, 0.7)
        self.ui.topPlotGmId.plotItem.setTitle('Fig.1 Id vs GmId')
        self.ui.topPlotGmId.plotItem.setLabel('bottom', 'GmId', units='V')
        self.ui.topPlotGmId.plotItem.setLabel('left', 'Id', units='A')
        self.ui.midPlotGmId.plotItem.showGrid(True, True, 0.7)
        self.ui.midPlotGmId.plotItem.setLabel('bottom', 'GmId', units='V')
        self.ui.midPlotGmId.plotItem.setTitle('Fig.2 Avo vs GmId')
        self.ui.midPlotGmId.plotItem.setLabel('left', 'Avo')
        self.ui.botPlotGmId.plotItem.showGrid(True, True, 0.7)
        self.ui.botPlotGmId.plotItem.setLabel('bottom', 'GmId', units='V')
        self.ui.botPlotGmId.plotItem.setTitle('Fig.3 Ft vs GmId')
        self.ui.botPlotGmId.plotItem.setLabel('left', 'Ft', units='Hz')
        # L as x axis
        self.ui.topLPlotL.plotItem.showGrid(True, True, 0.7)
        self.ui.topLPlotL.plotItem.setTitle('Fig.1 Vth vs L')
        self.ui.topLPlotL.plotItem.setLabel('bottom', 'L', units='um')
        self.ui.topLPlotL.plotItem.setLabel('left', 'Vth', units='V')
        # Pen & Line
        self.redLinePen = pg.mkPen('r', width=1.5, style=QtCore.Qt.DashLine)
        self.yellowLinePen = pg.mkPen('y', width=1.5, style=QtCore.Qt.DashLine)
        self.blueLinePen = pg.mkPen('b', width=1.5, style=QtCore.Qt.DashLine)
        self.dashPen = pg.mkPen('r', width=1.5, style=QtCore.Qt.DashLine)
        self.topVLineVstar = pg.InfiniteLine(angle=90,
                                             pen=self.redLinePen,
                                             movable=False)
        self.midVLineVstar = pg.InfiniteLine(angle=90,
                                             pen=self.redLinePen,
                                             movable=False)
        self.botVLineVstar = pg.InfiniteLine(angle=90,
                                             pen=self.redLinePen,
                                             movable=False)
        self.topVLineId = pg.InfiniteLine(angle=90,
                                          pen=self.yellowLinePen,
                                          movable=False)
        self.midVLineId = pg.InfiniteLine(angle=90,
                                          pen=self.yellowLinePen,
                                          movable=False)
        self.botVLineId = pg.InfiniteLine(angle=90,
                                          pen=self.yellowLinePen,
                                          movable=False)
        self.topVLineGmId = pg.InfiniteLine(angle=90,
                                            pen=self.blueLinePen,
                                            movable=False)
        self.midVLineGmId = pg.InfiniteLine(angle=90,
                                            pen=self.blueLinePen,
                                            movable=False)
        self.botVLineGmId = pg.InfiniteLine(angle=90,
                                            pen=self.blueLinePen,
                                            movable=False)
        self.topHLineVstar = pg.InfiniteLine(angle=0,
                                             pen=self.redLinePen,
                                             movable=False)
        self.topHLineGmId = pg.InfiniteLine(angle=0,
                                            pen=self.blueLinePen,
                                            movable=False)
        self.ui.topPlotVstar.addItem(self.topVLineVstar, ignoreBounds=True)
        self.ui.midPlotVstar.addItem(self.midVLineVstar, ignoreBounds=True)
        self.ui.botPlotVstar.addItem(self.botVLineVstar, ignoreBounds=True)
        self.ui.topPlotVstar.addItem(self.topHLineVstar, ignoreBounds=True)
        self.ui.topPlotGmId.addItem(self.topVLineGmId, ignoreBounds=True)
        self.ui.midPlotGmId.addItem(self.midVLineGmId, ignoreBounds=True)
        self.ui.botPlotGmId.addItem(self.botVLineGmId, ignoreBounds=True)
        self.ui.topPlotGmId.addItem(self.topHLineGmId, ignoreBounds=True)
        #self.arrowFt = pg.ArrowItem(angle=90, tipAngle=30, baseAngle=20, headLen=20, tailLen=None, pen={'color': 'w', 'width': 3})
        #self.arrowAvo = pg.ArrowItem(angle=90, tipAngle=30, baseAngle=20, headLen=20, tailLen=None, pen={'color': 'w', 'width': 3})
        #self.arrowFt.setPos(0,0)
        #self.arrowAvo.setPos(0,0)
        #self.ui.botPlotVstar.addItem(self.arrowFt)
        #self.ui.midPlotVstar.addItem(self.arrowAvo)
        self.ui.topPlotVstar.scene().sigMouseMoved.connect(
            self.topMouseMovedVstar)
        self.ui.topPlotGmId.scene().sigMouseMoved.connect(
            self.topMouseMovedGmId)

    def configDataLib(self):
        # MOS Transistor
        self.L = 0.18
        self.Lref = 0.18
        # MOS Transistor
        self.W = 10.0
        self.GmId = 10.0
        self.Gm = 10.0
        self.Id = 1.0
        self.VDS = 0.9
        self.VSB = 0.1
        # Calculation MOS Transistor
        self.synW = 10.0
        self.synVGS = 0.9
        self.synGmId = 5.0
        self.synGm = 5.0
        self.synId = 1.0
        # Calculation MOS Transistor
        self.calW = 10.0
        self.calGmId = 5.0
        self.calId = 1.0
        self.calVGS = 0.9
        # Process
        self.tgtCorner = 0
        #avaiable corner: TT, FF, SS, FS, SF
        self.listCorner = ["tt", "ff", "ss", "fs", "sf"]
        self.avaCorner = [0, 0, 0, 0, 0]
        self.mosCorner = [None, None, None, None, None]
        self.mosDat = None
        # Data
        self.listL = []
        self.listId = []
        self.listGmId = []
        self.listVstar = []
        self.listFt = []
        self.listFOM = []
        self.listAvo = []
        self.listVth = []
        self.pltId = None
        self.pltGmId = None
        self.pltVstar = None
        self.pltFt = None
        self.pltFOM = None
        self.pltAvo = None
        self.pltIdG = None
        self.pltFtG = None
        self.pltAvoG = None
        self.EnFom = 0
        # Range of vstar, gmid
        self.minVstar = 0.08
        self.maxVstar = 1.0
        self.minGmId = 2.0
        self.maxGmId = 25.0
        # Curve for L
        self.curveIdFit = None
        self.curveFtFit = None
        self.curveAvoFit = None
        self.curveIdCorner = [None, None, None, None, None]
        self.curveFtCorner = [None, None, None, None, None]
        self.curveAvoCorner = [None, None, None, None, None]
        self.curveIdFitG = None
        self.curveFtFitG = None
        self.curveAvoFitG = None
        self.curveIdCornerG = [None, None, None, None, None]
        self.curveFtCornerG = [None, None, None, None, None]
        self.curveAvoCornerG = [None, None, None, None, None]
        self.curveGmFitI = None
        self.curveFomFitI = None
        self.curveAvoFitI = None
        self.curveGmCornerI = [None, None, None, None, None]
        self.curveFomCornerI = [None, None, None, None, None]
        self.curveAvoCornerI = [None, None, None, None, None]
        # Curve for Lref
        self.curveIdFitRef = None
        self.curveFtFitRef = None
        self.curveAvoFitRef = None
        self.curveIdCornerRef = [None, None, None, None, None]
        self.curveFtCornerRef = [None, None, None, None, None]
        self.curveAvoCornerRef = [None, None, None, None, None]
        self.curveIdFitGRef = None
        self.curveFtFitGRef = None
        self.curveAvoFitGRef = None
        self.curveIdCornerGRef = [None, None, None, None, None]
        self.curveFtCornerGRef = [None, None, None, None, None]
        self.curveAvoCornerGRef = [None, None, None, None, None]
        self.curveGmFitIRef = None
        self.curveFomFitIRef = None
        self.curveAvoFitIRef = None
        self.curveGmCornerIRef = [None, None, None, None, None]
        self.curveFomCornerIRef = [None, None, None, None, None]
        self.curveAvoCornerIRef = [None, None, None, None, None]
        # Curve as function of L
        self.curveVth = None
        self.curveVthCorner = [None, None, None, None, None]
        # Pen Style for Pyqtgraph
        self.plotColor = pg.hsvColor(time.time() / 5 % 1, alpha=.5)
        self.cornerPen = [None, None, None, None, None]
        self.cornerPen[0] = pg.mkPen(color=(119, 172, 48),
                                     width=1.5,
                                     style=QtCore.Qt.DotLine)
        self.cornerPen[1] = pg.mkPen(color=(0, 114, 189),
                                     width=1.5,
                                     style=QtCore.Qt.DotLine)
        self.cornerPen[2] = pg.mkPen(color=(126, 47, 142),
                                     width=1.5,
                                     style=QtCore.Qt.DotLine)
        self.cornerPen[3] = pg.mkPen(color=(217, 83, 25),
                                     width=1.5,
                                     style=QtCore.Qt.DotLine)
        self.cornerPen[4] = pg.mkPen(color=(237, 177, 32),
                                     width=1.5,
                                     style=QtCore.Qt.DotLine)
        self.linePen = [None, None, None, None, None]
        self.linePen[0] = pg.mkPen(color=(119, 172, 48), width=2)
        self.linePen[1] = pg.mkPen(color=(0, 114, 189), width=2)
        self.linePen[2] = pg.mkPen(color=(126, 47, 142), width=2)
        self.linePen[3] = pg.mkPen(color=(217, 83, 25), width=2)
        self.linePen[4] = pg.mkPen(color=(237, 177, 32), width=2)
        self.dotPen = pg.mkPen(self.plotColor,
                               width=2,
                               style=QtCore.Qt.DotLine)
        self.symbolStyle = 'o'
        # Flag for State
        self.arrowPos = 0
        self.curveReady = 0
        self.desLSet = 0
        self.refLSet = 0

    # checkBox Functions
    def PlotCornerTT(self, state):
        if self.avaCorner[0] == 1:
            if state == Qt.Checked:
                self.visibleCurve(0, True)
            else:
                self.visibleCurve(0, False)
        else:
            self.ui.labelLog.setText('No Data Available')

    def PlotCornerFF(self, state):
        if self.avaCorner[1] == 1:
            if state == Qt.Checked:
                self.visibleCurve(1, True)
            else:
                self.visibleCurve(1, False)
        else:
            self.ui.labelLog.setText('No Data Available')

    def PlotCornerSS(self, state):
        if self.avaCorner[2] == 1:
            if state == Qt.Checked:
                self.visibleCurve(2, True)
            else:
                self.visibleCurve(2, False)
        else:
            self.ui.labelLog.setText('No Data Available')

    def PlotCornerFS(self, state):
        if self.avaCorner[3] == 1:
            if state == Qt.Checked:
                self.visibleCurve(3, True)
            else:
                self.visibleCurve(3, False)
        else:
            self.ui.labelLog.setText('No Data Available')

    def PlotCornerSF(self, state):
        if self.avaCorner[4] == 1:
            if state == Qt.Checked:
                self.visibleCurve(4, True)
            else:
                self.visibleCurve(4, False)
        else:
            self.ui.labelLog.setText('No Data Available')

    def PlotRef(self, state):
        if self.refLSet == 1:
            if state == Qt.Checked:
                self.visibleRef(True)
            else:
                self.visibleRef(False)
        else:
            self.ui.labelLog.setText('No Ref Curve')

    # pushButton Functions
    def DirSel(self):
        '''Select the Directory for the Data'''
        self.matDirPath = QFileDialog.getExistingDirectory()
        self.matDir = QDir(self.matDirPath)
        self.matDir.setFilter(QtCore.QDir.Files)
        self.matFileList = self.matDir.entryList()
        self.ui.listWidgetMat.clear()
        for i in range(len(self.matFileList)):
            if self.matFileList[i][0] == '.':
                continue
            self.ui.listWidgetMat.addItem(self.matFileList[i])

    def MosMatSet(self):
        self.matItem = self.ui.listWidgetMat.currentItem()
        if self.matItem == None:
            self.ui.labelLog.setText('No MOS Data Set')
        else:
            self.matFilePath = self.matDirPath + '/' + self.matItem.text()
            self.matFileName = self.matItem.text().split('.')[0]
            self.matFileInfo = self.matFileName.split('_')
            self.ui.titleMosCharData.setText(self.matFileName)
            self.loadMat()

    def GateLSet(self):
        self.gateLItem = self.ui.listWidgetL.currentItem()
        if self.gateLItem == None:
            self.ui.labelLog.setText('No Gate Length Set')
        else:
            self.L = float(self.gateLItem.text())
            self.ui.labelGateL.setText(self.gateLItem.text())
            self.desLSet = 1

    def GateLRef(self):
        self.gateLRefItem = self.ui.listWidgetLRef.currentItem()
        if self.gateLRefItem == None:
            self.ui.labelLog.setText('No Ref Gate Length')
        else:
            self.Lref = float(self.gateLRefItem.text())
            self.ui.labelGateLRef.setText(self.gateLRefItem.text())
            self.refLSet = 1

    def PlotUpdate(self):
        if self.desLSet == 0:
            self.ui.labelLog.setText('No Des Gate Length')
        elif self.refLSet == 0:
            self.ui.labelLog.setText('No Ref Gate Length')
        else:
            self.cornerMat()

    def PlotOff(self):
        if self.avaCorner[0] == 1:
            self.ui.checkBoxCornerTT.setCheckState(2)
            self.ui.checkBoxCornerTT.setCheckState(0)
        if self.avaCorner[1] == 1:
            self.ui.checkBoxCornerFF.setCheckState(2)
            self.ui.checkBoxCornerFF.setCheckState(0)
        if self.avaCorner[2] == 1:
            self.ui.checkBoxCornerSS.setCheckState(2)
            self.ui.checkBoxCornerSS.setCheckState(0)
        if self.avaCorner[3] == 1:
            self.ui.checkBoxCornerFS.setCheckState(2)
            self.ui.checkBoxCornerFS.setCheckState(0)
        if self.avaCorner[4] == 1:
            self.ui.checkBoxCornerSF.setCheckState(2)
            self.ui.checkBoxCornerSF.setCheckState(0)
        if self.refLSet == 1:
            self.ui.checkBoxRef.setCheckState(2)
            self.ui.checkBoxRef.setCheckState(0)

    def SynGmId(self):
        self.synGmId = float(self.ui.lineEditSynGmId.text())
        self.SynMos()

    def SynVstar(self):
        self.synGmId = 2 / float(self.ui.lineEditSynVstar.text())
        self.SynMos()

    def CalMos(self):
        self.UpdateBias()
        self.calVGS = float(self.ui.lineEditCalVgs.text())
        self.calGmId = lp.lookupfz(self.mosDat,
                                   'nch',
                                   'GMOVERID',
                                   VDS=self.VDS,
                                   VSB=self.VSB,
                                   L=self.L,
                                   VGS=self.calVGS)
        self.calId = lp.lookupfz(self.mosDat,
                                 'nch',
                                 'ID',
                                 VDS=self.VDS,
                                 VSB=self.VSB,
                                 L=self.L,
                                 VGS=self.calVGS) * self.calW / self.W
        self.ui.labelCalGmId.setText('%2.2f' % self.calGmId)
        self.ui.labelCalId.setText('%2.2f' % self.calId)

    def FuEst(self):
        pass

    def ExtCheck(self):
        pass

    # Background functions
    def UpdateBias(self):
        self.VDS = float(self.ui.spinBoxBiasVds.value()) * 0.001
        self.VSB = -float(self.ui.spinBoxBiasVbs.value()) * 0.001

    def SynMos(self):
        '''Syn MOS from Gm'''
        self.UpdateBias()
        self.synGm = float(self.ui.lineEditSynGm.text())
        self.synId = self.synGm / self.synGmId
        self.synW = lp.lookupfz(self.mosDat,
                                'nch',
                                'ID',
                                VDS=self.VDS,
                                VSB=self.VSB,
                                L=self.L,
                                VGS=self.synVGS) * self.W / self.synId
        print('Width : %1.2f' % self.synW)

    def SearchVGS(self):
        vgsStart = 0
        vgsEnd = 1.8
        gmIdSeq = None
        vgsStep = [0.1, 0.01, 0.001]
        vgsLeft = 0
        for i in range(3):
            vgsSeq = np.arange(vgsStart, vgsEnd, vgsStep[i])
            gmIdSeq = lp.lookupfz(self.mosDat,
                                  'nch',
                                  'GMOVERID',
                                  VDS=self.VDS,
                                  VSB=self.VSB,
                                  L=self.L,
                                  VGS=vgsSeq)
            vgsLeft = np.searchsorted(gmIdSeq, self.synGmId, 'left')
            self.synVGS = vgsSeq[vgsLeft]
            vgsStart = vgsSeq[vgsLeft - 1]
            vgsEnd = vgsSeq[vgsLeft]

    def loadMat(self):
        print('Load Mat File')
        self.mosDat = h5py.File(self.matFilePath, 'r')
        print("Loading complete!")
        self.ui.listWidgetL.clear()
        self.listL = np.array(self.mosDat['L']).flatten()
        for i in range(len(self.listL)):
            self.ui.listWidgetL.addItem(str(self.listL[i]))
            self.ui.listWidgetLRef.addItem(str(self.listL[i]))
        lp.info(self.mosDat)
        self.W = self.mosDat['W'][0][0] * self.mosDat['NFING'][0][0]
        print('Mos Default Width : %2.2f' % self.W)

    def cornerMat(self):
        '''Search & Load all the corner Matlib Data'''
        # Set Corner
        self.tgtCorner = self.listCorner.index(self.matFileInfo[2])
        print('Corner Set to : %s' % self.listCorner[self.tgtCorner])
        # Search Corner
        for i in range(len(self.listCorner)):
            cornerFileName = self.matFileInfo[0] + '_' + self.matFileInfo[
                1] + '_' + self.listCorner[i] + '.mat'
            if cornerFileName in self.matFileList:
                print('%s corner Found' % self.listCorner[i])
                self.avaCorner[i] = 1
                cornerFilePath = self.matDirPath + '/' + cornerFileName
                self.mosCorner[i] = h5py.File(cornerFilePath, 'r')
            else:
                print('%s corner None' % self.listCorner[i])
                self.avaCorner[i] = 0
                self.mosCorner[i] = None
        # Update Plots
        ## Clear the plots and then add back the indicator
        self.ui.topPlotVstar.clear()
        self.ui.midPlotVstar.clear()
        self.ui.botPlotVstar.clear()
        self.ui.topPlotGmId.clear()
        self.ui.midPlotGmId.clear()
        self.ui.botPlotGmId.clear()
        self.ui.topPlotVstar.addItem(self.topHLineVstar, ignoreBounds=True)
        self.ui.topPlotVstar.addItem(self.topVLineVstar, ignoreBounds=True)
        self.ui.midPlotVstar.addItem(self.midVLineVstar, ignoreBounds=True)
        self.ui.botPlotVstar.addItem(self.botVLineVstar, ignoreBounds=True)
        self.ui.topPlotGmId.addItem(self.topHLineGmId, ignoreBounds=True)
        self.ui.topPlotGmId.addItem(self.topVLineGmId, ignoreBounds=True)
        self.ui.midPlotGmId.addItem(self.midVLineGmId, ignoreBounds=True)
        self.ui.botPlotGmId.addItem(self.botVLineGmId, ignoreBounds=True)
        ## Generate the Curve
        self.GenCurve()
        self.ui.comboBoxDesignCorner.setCurrentIndex(self.tgtCorner)
        self.changeCorner()
        # Update CheckBox Text
        if self.avaCorner[0] == 0:
            self.ui.checkBoxCornerTT.setText("--")
        else:
            self.ui.checkBoxCornerTT.setText("TT")
            self.ui.checkBoxCornerTT.setCheckState(2)
            self.ui.checkBoxCornerTT.setCheckState(0)
        if self.avaCorner[1] == 0:
            self.ui.checkBoxCornerFF.setText("--")
        else:
            self.ui.checkBoxCornerFF.setText("FF")
            self.ui.checkBoxCornerFF.setCheckState(2)
            self.ui.checkBoxCornerFF.setCheckState(0)
        if self.avaCorner[2] == 0:
            self.ui.checkBoxCornerSS.setText("--")
        else:
            self.ui.checkBoxCornerSS.setText("SS")
            self.ui.checkBoxCornerSS.setCheckState(2)
            self.ui.checkBoxCornerSS.setCheckState(0)
        if self.avaCorner[3] == 0:
            self.ui.checkBoxCornerFS.setText("--")
        else:
            self.ui.checkBoxCornerFS.setText("FS")
            self.ui.checkBoxCornerFS.setCheckState(2)
            self.ui.checkBoxCornerFS.setCheckState(0)
        if self.avaCorner[4] == 0:
            self.ui.checkBoxCornerSF.setText("--")
        else:
            self.ui.checkBoxCornerSF.setText("SF")
            self.ui.checkBoxCornerSF.setCheckState(2)
            self.ui.checkBoxCornerSF.setCheckState(0)

    def changeCorner(self):
        '''Change the Temp Corner'''
        newTgtCorner = self.ui.comboBoxDesignCorner.currentIndex()
        if self.avaCorner[newTgtCorner] == 1:
            self.curveIdCorner[self.tgtCorner].setPen(
                self.cornerPen[self.tgtCorner])
            self.curveFtCorner[self.tgtCorner].setPen(
                self.cornerPen[self.tgtCorner])
            if (self.refLSet == 1):
                self.curveIdCornerRef[self.tgtCorner].setVisible(False)
            self.tgtCorner = newTgtCorner
            self.ui.labelLog.setText("Corner Set")
            self.pen = self.linePen[self.tgtCorner]
            self.curveIdCorner[self.tgtCorner].setPen(
                self.linePen[self.tgtCorner])
            self.curveFtCorner[self.tgtCorner].setPen(
                self.linePen[self.tgtCorner])
            self.mosDat = self.mosCorner[self.tgtCorner]
            self.UpdatePlot()
            self.PlotOff()
            if (self.refLSet == 1):
                self.curveIdCornerRef[self.tgtCorner].setVisible(True)
        else:
            self.ui.labelLog.setText("Corner Not Found")

    def GenCurve(self):
        '''Generate all the curve'''
        for i in range(len(self.listCorner)):
            if self.avaCorner[i] == 1:
                self.vstarCurve(self.mosCorner[i], i)
                self.ui.topPlotVstar.addItem(self.curveIdCorner[i])
                self.ui.botPlotVstar.addItem(self.curveFtCorner[i])
                self.ui.midPlotVstar.addItem(self.curveAvoCorner[i])
                self.gmIdCurve(self.mosCorner[i], i)
                self.ui.topPlotGmId.addItem(self.curveIdCornerG[i])
                self.ui.botPlotGmId.addItem(self.curveFtCornerG[i])
                self.ui.midPlotGmId.addItem(self.curveAvoCornerG[i])
                self.vthCurve(self.mosCorner[i], i)
                self.ui.topLPlotL.addItem(self.curveVthCorner[i])
                if self.refLSet == 1:
                    self.ui.topPlotVstar.addItem(self.curveIdCornerRef[i])
            else:
                self.curveIdCorner[i] = None
                self.curveFtCorner[i] = None
                self.curveAvoCorner[i] = None
                self.curveIdCornerG[i] = None
                self.curveFtCornerG[i] = None
                self.curveAvoCornerG[i] = None
                self.curveVthCorner[i] = None
                # Ref
                self.curveIdCornerRef[i] = None
                self.curveFtCornerRef[i] = None
                self.curveAvoCornerRef[i] = None
                self.curveIdCornerGRef[i] = None
                self.curveFtCornerGRef[i] = None
                self.curveAvoCornerGRef[i] = None

    def UpdatePlot(self):
        '''Update the Plot for GmId'''
        # Update the MainCurve
        if self.curveIdFit != None:
            self.ui.topPlotVstar.removeItem(self.curveIdFit)
            self.ui.midPlotVstar.removeItem(self.curveAvoFit)
            self.ui.botPlotVstar.removeItem(self.curveFtFit)
            self.ui.topPlotGmId.removeItem(self.curveIdFitG)
            self.ui.midPlotGmId.removeItem(self.curveAvoFitG)
            self.ui.botPlotGmId.removeItem(self.curveFtFitG)
            self.ui.topLPlotL.removeItem(self.curveVth)
        VGS = np.arange(0, 1.8, 0.01)
        self.listId = lp.lookupfz(self.mosDat,
                                  'nch',
                                  'ID',
                                  VDS=0.9,
                                  VSB=0,
                                  L=self.L,
                                  VGS=VGS)
        self.listAvo = lp.lookupfz(self.mosDat,
                                   'nch',
                                   'SELF_GAIN',
                                   VDS=0.9,
                                   VSB=0,
                                   L=self.L,
                                   VGS=VGS)
        self.listGmId = lp.lookupfz(self.mosDat,
                                    'nch',
                                    'GMOVERID',
                                    VDS=0.9,
                                    VSB=0,
                                    L=self.L,
                                    VGS=VGS)
        self.listFt = lp.lookupfz(self.mosDat,
                                  'nch',
                                  'FUG',
                                  VDS=0.9,
                                  VSB=0,
                                  L=self.L,
                                  VGS=VGS)
        self.listVth = lp.lookupfz(self.mosDat,
                                   'nch',
                                   'VT',
                                   VDS=0.9,
                                   VSB=0,
                                   L=self.listL,
                                   VGS=0.9)
        # Fig Line
        self.listVstar = 2 * np.reciprocal(self.listGmId)
        self.csId = CubicSpline(self.listVstar, self.listId)
        self.csFt = CubicSpline(self.listVstar, self.listFt)
        self.csAvo = CubicSpline(self.listVstar, self.listAvo)
        self.listGmIdG = np.flip(self.listGmId, 0)
        self.listIdG = np.flip(self.listId, 0)
        self.listFtG = np.flip(self.listFt, 0)
        self.listAvoG = np.flip(self.listAvo, 0)
        self.csIdG = CubicSpline(self.listGmIdG, self.listIdG)
        self.csFtG = CubicSpline(self.listGmIdG, self.listFtG)
        self.csAvoG = CubicSpline(self.listGmIdG, self.listAvoG)
        # Vstar Figure
        #self.pltVstar = np.arange( self.listVstar.min(), self.listVstar.max(), 0.001)
        self.pltVstar = np.arange(self.minVstar, self.maxVstar, 0.0005)
        self.pltId = self.csId(self.pltVstar)
        self.pltFt = self.csFt(self.pltVstar)
        self.pltAvo = self.csAvo(self.pltVstar)
        self.curveIdFit = pg.PlotDataItem(self.pltVstar,
                                          self.pltId,
                                          pen=self.pen,
                                          clear=True)
        self.curveFtFit = pg.PlotDataItem(self.pltVstar,
                                          self.pltFt,
                                          pen=self.pen,
                                          clear=True)
        self.curveAvoFit = pg.PlotDataItem(self.pltVstar,
                                           self.pltAvo,
                                           pen=self.pen,
                                           clear=True)
        self.ui.topPlotVstar.addItem(self.curveIdFit)
        self.ui.midPlotVstar.addItem(self.curveAvoFit)
        self.ui.botPlotVstar.addItem(self.curveFtFit)
        # GmId Figure
        #self.pltGmId = np.arange( self.listGmId.min(), self.listGmId.max(), 0.001)
        self.pltGmId = np.arange(self.minGmId, self.maxGmId, 0.01)
        self.pltIdG = self.csIdG(self.pltGmId)
        self.pltFtG = self.csFtG(self.pltGmId)
        self.pltAvoG = self.csAvoG(self.pltGmId)
        self.curveIdFitG = pg.PlotDataItem(self.pltGmId,
                                           self.pltIdG,
                                           pen=self.pen,
                                           clear=True)
        self.curveFtFitG = pg.PlotDataItem(self.pltGmId,
                                           self.pltFtG,
                                           pen=self.pen,
                                           clear=True)
        self.curveAvoFitG = pg.PlotDataItem(self.pltGmId,
                                            self.pltAvoG,
                                            pen=self.pen,
                                            clear=True)
        self.ui.topPlotGmId.addItem(self.curveIdFitG)
        self.ui.midPlotGmId.addItem(self.curveAvoFitG)
        self.ui.botPlotGmId.addItem(self.curveFtFitG)
        # Id Figure
        self.pltIdI = np.log10(self.pltIdG)
        self.curveGmFitI = pg.PlotDataItem(self.pltIdI,
                                           self.pltGmId,
                                           pen=self.pen,
                                           clear=True)
        self.curveFomFitI = pg.PlotDataItem(self.pltIdI,
                                            self.pltFtG * self.pltGmId,
                                            pen=self.pen,
                                            clear=True)
        self.curveAvoFitI = pg.PlotDataItem(self.pltIdI,
                                            self.pltAvoG,
                                            pen=self.pen,
                                            clear=True)
        self.ui.topPlotId.addItem(self.curveGmFitI)
        self.ui.midPlotId.addItem(self.curveAvoFitI)
        self.ui.botPlotId.addItem(self.curveFomFitI)
        # Vth Figure
        self.curveVth = pg.PlotDataItem(self.listL,
                                        self.listVth,
                                        pen=self.pen,
                                        symbolBrush=(255, 0, 0),
                                        symbolPen='w',
                                        clear=True)
        self.ui.topLPlotL.addItem(self.curveVth)
        # Set Flag
        self.curveReady = 1

    def vthCurve(self, mosDat, cornerIndex):
        '''Generate the Vth as a function of L'''
        listVth = lp.lookupfz(mosDat,
                              'nch',
                              'VT',
                              VDS=0.9,
                              VSB=0,
                              L=self.listL,
                              VGS=0.9)
        self.curveVthCorner[cornerIndex] = pg.PlotDataItem(
            self.listL, listVth, pen=self.cornerPen[cornerIndex], clear=True)

    def gmIdCurve(self, mosDat, cornerIndex):
        VGS = np.arange(0, 1.8, 0.01)
        listId = lp.lookupfz(mosDat,
                             'nch',
                             'ID',
                             VDS=0.9,
                             VSB=0,
                             L=self.L,
                             VGS=VGS)
        listGmOverId = lp.lookupfz(mosDat,
                                   'nch',
                                   'GMOVERID',
                                   VDS=0.9,
                                   VSB=0,
                                   L=self.L,
                                   VGS=VGS)
        listFt = lp.lookupfz(mosDat,
                             'nch',
                             'FUG',
                             VDS=0.9,
                             VSB=0,
                             L=self.L,
                             VGS=VGS)
        listAvo = lp.lookupfz(mosDat,
                              'nch',
                              'SELF_GAIN',
                              VDS=0.9,
                              VSB=0,
                              L=self.L,
                              VGS=VGS)
        listGmId = np.flip(listGmOverId, 0)
        listIdG = np.flip(listId, 0)
        listFtG = np.flip(listFt, 0)
        listAvoG = np.flip(listAvo, 0)
        csId = CubicSpline(listGmId, listIdG)
        csFt = CubicSpline(listGmId, listFtG)
        csAvo = CubicSpline(listGmId, listAvoG)
        pltGmId = np.arange(self.minGmId, self.maxGmId, 0.01)
        pltId = csId(pltGmId)
        pltFt = csFt(pltGmId)
        pltAvo = csAvo(pltGmId)
        self.curveIdCornerG[cornerIndex] = pg.PlotDataItem(
            pltGmId, pltId, pen=self.cornerPen[cornerIndex], clear=True)
        self.curveFtCornerG[cornerIndex] = pg.PlotDataItem(
            pltGmId, pltFt, pen=self.cornerPen[cornerIndex], clear=True)
        self.curveAvoCornerG[cornerIndex] = pg.PlotDataItem(
            pltGmId, pltAvo, pen=self.cornerPen[cornerIndex], clear=True)

    def vstarCurve(self, mosDat, cornerIndex):
        VGS = np.arange(0, 1.8, 0.01)
        # For L
        listId = lp.lookupfz(mosDat,
                             'nch',
                             'ID',
                             VDS=0.9,
                             VSB=0,
                             L=self.L,
                             VGS=VGS)
        listGmOverId = lp.lookupfz(mosDat,
                                   'nch',
                                   'GMOVERID',
                                   VDS=0.9,
                                   VSB=0,
                                   L=self.L,
                                   VGS=VGS)
        listFt = lp.lookupfz(mosDat,
                             'nch',
                             'FUG',
                             VDS=0.9,
                             VSB=0,
                             L=self.L,
                             VGS=VGS)
        listAvo = lp.lookupfz(mosDat,
                              'nch',
                              'SELF_GAIN',
                              VDS=0.9,
                              VSB=0,
                              L=self.L,
                              VGS=VGS)
        listVstar = 2 * np.reciprocal(listGmOverId)
        csId = CubicSpline(listVstar, listId)
        csFt = CubicSpline(listVstar, listFt)
        csAvo = CubicSpline(listVstar, listAvo)
        #pltVstar = np.arange( listVstar.min(), listVstar.max(), 0.001)
        pltVstar = np.arange(self.minVstar, self.maxVstar, 0.0005)
        pltId = csId(pltVstar)
        pltFt = csFt(pltVstar)
        pltAvo = csAvo(pltVstar)
        self.curveIdCorner[cornerIndex] = pg.PlotDataItem(
            pltVstar, pltId, pen=self.cornerPen[cornerIndex], clear=True)
        self.curveFtCorner[cornerIndex] = pg.PlotDataItem(
            pltVstar, pltFt, pen=self.cornerPen[cornerIndex], clear=True)
        self.curveAvoCorner[cornerIndex] = pg.PlotDataItem(
            pltVstar, pltAvo, pen=self.cornerPen[cornerIndex], clear=True)
        # For LRef
        if (self.refLSet == 1):
            listId = lp.lookupfz(mosDat,
                                 'nch',
                                 'ID',
                                 VDS=0.9,
                                 VSB=0,
                                 L=self.Lref,
                                 VGS=VGS)
            listGmOverId = lp.lookupfz(mosDat,
                                       'nch',
                                       'GMOVERID',
                                       VDS=0.9,
                                       VSB=0,
                                       L=self.Lref,
                                       VGS=VGS)
            listFt = lp.lookupfz(mosDat,
                                 'nch',
                                 'FUG',
                                 VDS=0.9,
                                 VSB=0,
                                 L=self.Lref,
                                 VGS=VGS)
            listAvo = lp.lookupfz(mosDat,
                                  'nch',
                                  'SELF_GAIN',
                                  VDS=0.9,
                                  VSB=0,
                                  L=self.Lref,
                                  VGS=VGS)
            listVstar = 2 * np.reciprocal(listGmOverId)
            csId = CubicSpline(listVstar, listId)
            csFt = CubicSpline(listVstar, listFt)
            csAvo = CubicSpline(listVstar, listAvo)
            pltId = csId(pltVstar)
            pltFt = csFt(pltVstar)
            pltAvo = csAvo(pltVstar)
            self.curveIdCornerRef[cornerIndex] = pg.PlotDataItem(
                pltVstar, pltId, pen=self.cornerPen[cornerIndex], clear=True)
            self.curveFtCornerRef[cornerIndex] = pg.PlotDataItem(
                pltVstar, pltFt, pen=self.cornerPen[cornerIndex], clear=True)
            self.curveAvoCornerRef[cornerIndex] = pg.PlotDataItem(
                pltVstar, pltAvo, pen=self.cornerPen[cornerIndex], clear=True)

    def visibleRef(self, curveStae):
        print("TODO")

    def visibleCurve(self, curveIndex, curveState):
        self.curveIdCorner[curveIndex].setVisible(curveState)
        self.curveFtCorner[curveIndex].setVisible(curveState)
        self.curveAvoCorner[curveIndex].setVisible(curveState)
        self.curveIdCornerG[curveIndex].setVisible(curveState)
        self.curveFtCornerG[curveIndex].setVisible(curveState)
        self.curveAvoCornerG[curveIndex].setVisible(curveState)
        self.curveVthCorner[curveIndex].setVisible(curveState)

    def topMouseMovedVstar(self, evt):
        '''Read out the number at the point'''
        mousePoint = self.ui.topPlotVstar.plotItem.vb.mapSceneToView(evt)
        self.topVLineVstar.setPos(mousePoint.x())
        self.midVLineVstar.setPos(mousePoint.x())
        self.botVLineVstar.setPos(mousePoint.x())
        if (self.curveReady == 1):
            index = np.searchsorted(self.pltVstar, mousePoint.x(), side="left")
            if index > 0 and index < len(self.pltVstar):
                self.topHLineVstar.setPos(self.pltId[index])
                self.ui.topPlotVstar.addItem(self.topHLineVstar,
                                             ignoreBounds=True)
                self.ui.labelId.setText(self.sciPrint(self.pltId[index], 'A'))
                self.ui.labelVstar.setText(
                    self.sciPrint(self.pltVstar[index], 'V'))
                self.ui.labelGmId.setText(
                    self.sciPrint((2.0 / self.pltVstar[index]), '1/V'))
                self.ui.labelFt.setText(self.sciPrint(self.pltFt[index], 'Hz'))
                self.ui.labelGain.setText(
                    self.sciPrint(self.pltAvo[index], 'V/V'))
                self.ui.labelFOM.setText(
                    self.sciPrint(
                        (2.0 * self.pltFt[index] / self.pltVstar[index]),
                        'Hz/V'))
                self.arrowPos = index
            else:
                if index <= 0:
                    self.arrowPos = 0
                else:
                    self.arrowPos = len(self.pltVstar) - 1
                self.ui.topPlotVstar.removeItem(self.topHLineVstar)
                self.ui.labelId.setText('---')
                self.ui.labelGmId.setText('---')
                self.ui.labelFt.setText('---')
                self.ui.labelFOM.setText('---')
                self.ui.labelVstar.setText('---')
            #self.arrowFt.setPos(self.pltVstar[self.arrowPos], self.pltFt[self.arrowPos])
            #self.arrowAvo.setPos(self.pltVstar[self.arrowPos], self.pltAvo[self.arrowPos])
            #self.ui.botPlotVstar.addItem(self.arrowFt)
            #self.ui.midPlotVstar.addItem(self.arrowAvo)

    def topMouseMovedGmId(self, evt):
        '''Read out the number at the point'''
        mousePointG = self.ui.topPlotGmId.plotItem.vb.mapSceneToView(evt)
        self.topVLineGmId.setPos(mousePointG.x())
        self.botVLineGmId.setPos(mousePointG.x())
        self.midVLineGmId.setPos(mousePointG.x())
        if (self.curveReady == 1):
            index = np.searchsorted(self.pltGmId, mousePointG.x(), side="left")
            if index > 0 and index < len(self.pltGmId):
                self.topHLineGmId.setPos(self.pltIdG[index])
                self.ui.topPlotGmId.addItem(self.topHLineGmId,
                                            ignoreBounds=True)
                self.ui.labelId.setText(self.sciPrint(self.pltIdG[index], 'A'))
                self.ui.labelVstar.setText(
                    self.sciPrint((2.0 / self.pltGmId[index]), 'V'))
                self.ui.labelGmId.setText(
                    self.sciPrint(self.pltGmId[index], '1/V'))
                self.ui.labelFt.setText(self.sciPrint(self.pltFtG[index],
                                                      'Hz'))
                self.ui.labelGain.setText(
                    self.sciPrint(self.pltAvoG[index], 'V/V'))
                self.ui.labelFOM.setText(
                    self.sciPrint((self.pltFtG[index] * self.pltGmId[index]),
                                  'Hz/V'))
            else:
                self.ui.topPlotGmId.removeItem(self.topHLineGmId)
                self.ui.labelId.setText('---')
                self.ui.labelGmId.setText('---')
                self.ui.labelFt.setText('---')
                self.ui.labelFOM.setText('---')
                self.ui.labelVstar.setText('---')

    def sciPrint(self, rawNum, unit):
        '''Print the rawNum with autoscale'''
        shiftNum = (decimal.Decimal(str(rawNum)) *
                    decimal.Decimal('1E24')).normalize()
        preNum, scaleNum = shiftNum.to_eng_string().split('E')
        quanNum = decimal.Decimal(preNum).quantize(decimal.Decimal('.001'))
        scaleChar = const.UNIT_PREFIX[int(scaleNum) // 3]
        return str(quanNum) + " " + scaleChar + unit

    def closeEvent(self, event):
        event.accept()