Beispiel #1
0
 def loadGFF_UTR(self,fields,line,transcriptBeginEnd,GFF,
                        transcripts,readOrder,genes):
     exonBegin=int(fields[3])-1
     exonEnd=int(fields[4])
     exonScore=fields[5]
     strand=fields[6]
     frame=fields[7]
     transcriptId=None
     rex=Rex()
     if(rex.find('transgrp[:=]\s*(\S+)',line)): transcriptId=rex[1]
     elif(rex.find('transcript_id[:=]?\s*"?([^\s";]+)"?',line)):
         transcriptId=rex[1]
     elif(rex.find('Parent=([^;,\s]+)',line)): transcriptId=rex[1]
     geneId=None
     if(rex.find('genegrp=(\S+)',line)): geneId=rex[1]
     elif(rex.find('gene_id[:=]?\s*"?([^\s\;"]+)"?',line)): geneId=rex[1]
     if(transcriptId is None): transcriptId=geneId
     if(geneId is None): geneId=transcriptId
     if(transcriptId is None): 
         raise Exception(line+" : no transcript ID found")        
     if(rex.find("(\S+);$",transcriptId)): transcriptId=rex[1]
     if(rex.find("(\S+);$",geneId)): geneId=rex[1]
     extra=""
     for i in range(8,len(fields)): extra+=fields[i]+" "
     if(exonBegin>exonEnd): (exonBegin,exonEnd)=(exonEnd,exonBegin)
     transcript=transcripts.get(transcriptId,None)
     if(not transcript):
         transcripts[transcriptId]=transcript= \
             Transcript(transcriptId,strand)
         transcript.setStopCodons(self.stopCodons)
         transcript.readOrder=readOrder
         readOrder+=1
         transcript.substrate=fields[0]
         transcript.source=fields[1]
         if(transcriptBeginEnd.get(transcriptId,None) is not None):
             (begin,end)=transcriptBeginEnd[transcriptId]
             transcript.setBegin(begin)
             transcript.setEnd(end)
         else:
             transcript.setBegin(exonBegin)
             transcript.setEnd(exonEnd)
     transcript.geneId=geneId
     gene=genes.get(geneId,None)
     if(gene is None):
         genes[geneId]=gene=Gene(); gene.setId(geneId)
     transcript.setGene(gene)
     exon=Exon(exonBegin,exonEnd,transcript)
     exon.extraFields=extra
     if(transcript.rawExons is not None): 
         exon.frame=frame
         exon.score=exonScore
         exon.type=fields[2]
         transcript.rawExons.append(exon)
     elif(not transcript.exonOverlapsExon(exon)):
         exon.frame=frame
         exon.score=exonScore
         exon.type=fields[2]
         transcript.UTR.append(exon) # OK -- we sort later
     gene.addTranscript(transcript)
Beispiel #2
0
 def __init__(self,
              model_arch,
              model_weight,
              model_priori_proba_file,
              fst_folder,
              acoustic_model_labels_file,
              words_lexicon_file=Config.RECOGNITION_DIR +
              "ForcedAlignmnet/words_lexicon.txt",
              phones_lexicon_file=Config.RECOGNITION_DIR +
              "ForcedAlignmnet/phones_lexicon.txt",
              grammerFileName=""):
     if fst_folder and fst_folder[-1] != '/': fst_folder += "/"
     self.decoder = Decoder(fst_folder, acoustic_model_labels_file,
                            grammerFileName)
     self.classifier = Classifier(model_arch, model_weight,
                                  model_priori_proba_file)
     self.trans = Transcript(words_lexicon_file, phones_lexicon_file)
Beispiel #3
0
class ASR:
    def __init__(self,
                 model_arch,
                 model_weight,
                 model_priori_proba_file,
                 fst_folder,
                 acoustic_model_labels_file,
                 words_lexicon_file=Config.RECOGNITION_DIR +
                 "ForcedAlignmnet/words_lexicon.txt",
                 phones_lexicon_file=Config.RECOGNITION_DIR +
                 "ForcedAlignmnet/phones_lexicon.txt",
                 grammerFileName=""):
        if fst_folder and fst_folder[-1] != '/': fst_folder += "/"
        self.decoder = Decoder(fst_folder, acoustic_model_labels_file,
                               grammerFileName)
        self.classifier = Classifier(model_arch, model_weight,
                                     model_priori_proba_file)
        self.trans = Transcript(words_lexicon_file, phones_lexicon_file)

    def speech_to_text(self,
                       wav_file,
                       max_active_tokens,
                       beam_width,
                       acoustic_model_weigh,
                       latticeBeam=1,
                       include_alignment=False):
        features = np.transpose(np.array(self._get_features(wav_file)))
        states_seq = self._decode(features, max_active_tokens, beam_width,
                                  acoustic_model_weigh, latticeBeam)
        if (not include_alignment):
            states_seq = self._remove_selfloops(states_seq)
            return ' '.join(self._get_words_from_states_seq(states_seq))
        else:
            frames_count = len(features)
            return self.trans.get_transcript(states_seq, frames_count)

    def _decode(self, features, max_active_tokens, beam_width,
                acoustic_model_weight, latticeBeam):
        activations = self.classifier.eval(features)
        return self.decoder.decode(activations, max_active_tokens, beam_width,
                                   1 / acoustic_model_weight, latticeBeam)

    def _remove_selfloops(self, states_seq):
        return [
            state for i, state in enumerate(states_seq)
            if not i or states_seq[i][-1] != states_seq[i - 1][-1]
        ]  # remove self loops

    def _get_words_from_states_seq(self, states_seq):
        return [
            outlabel for _, outlabel, _ in states_seq
            if not self.decoder.is_special_sym(outlabel)
        ]

    def _get_features(self, wav_file):
        return wav_to_feat(wav_file)
Beispiel #4
0
    def post(self):
        """
            This method handles a post request to audit a transcript
        """
        args = parser.parse_args()

        data = ast.literal_eval(args['transcript'])

        transcript = Transcript(data['major'], data['courses'])

        degree = degree_catalog.get_degree(data['major'])

        result = {}

        audit = transcript.audit_transcript(degree)

        result['audit'] = audit

        reccommendations = transcript.reccommend(degree_catalog)

        result['reccommendations'] = reccommendations

        return result, 201
Beispiel #5
0
    def loadGFF_transcript(self,fields,line,transcriptBeginEnd,GFF,
                           transcripts,readOrder,genes):
        begin=int(fields[3])-1
        end=int(fields[4])
        rex=Rex()
        if(rex.find('transcript_id[:=]?\s*"?([^\s";]+)"?',line)):
            transcriptId=rex[1]
            transcriptBeginEnd[transcriptId]=[begin,end]
            strand=fields[6]
            score=fields[5]
            transcriptExtraFields=""
            for i in range(8,len(fields)):
                transcriptExtraFields+=fields[i]+" "
            transcript=transcripts.get(transcriptId,None)
            if(transcript is None):
                transcripts[transcriptId]=transcript= \
	                                   Transcript(transcriptId,strand)
                transcript.setStopCodons(self.stopCodons)
                transcript.readOrder=readOrder;
                readOrder+=1
                transcript.substrate=fields[0]
                transcript.source=fields[1]
                transcript.setBegin(begin)
                transcript.setEnd(end)
            if(transcript.score is None and
               score!="."): transcript.score=float(score)
            geneId=None
            if(rex.find("genegrp=(\S+)",line)): geneId=rex[1]
            elif(rex.find('gene_id[:=]?\s*\"?([^\s\;"]+)\"?',line)):
                geneId=rex[1]
            if(not geneId): raise Exception("can't parse GTF: "+line)
            transcript.geneId=geneId
            gene=genes.get(geneId,None)
            if(not gene): genes[geneId]=gene=Gene(); gene.setId(geneId)
            transcript.setGene(gene)
            gene.addTranscript(transcript)
            transcript.extraFields=transcriptExtraFields
    return None

#============================= main() =================================
parser=EssexParser(infile)
while(True):
    report=parser.nextElem()
    if(not report): break
    statusNode=report.findChild("status");
    if(not statusNode): continue
    siteType="donor"
    brokenNode=statusNode.findChild("broken-donor")
    if(not brokenNode):
        siteType="acceptor"
        brokenNode=statusNode.findChild("broken-acceptor")
    if(not brokenNode): continue
    sitePos=int(brokenNode.getIthElem(0))
    geneID=report.getAttribute("gene-ID")
    transID=report.getAttribute("transcript-ID")
    mappedNode=report.findChild("mapped-transcript")
    strand=mappedNode.getAttribute("strand")
    mappedTranscript=Transcript(mappedNode)
    mappedExons=mappedTranscript.getRawExons()
    mappedExons.sort(key=lambda exon: exon.begin)
    interval=getInterval(sitePos,mappedExons)
    #if(interval is None): print(mappedTranscript.toGff())
    if(interval is None): continue
    print(indiv,hap,geneID,transID,strand,interval.exon,siteType,
          interval.begin,sitePos,interval.end,sep="\t",flush=True)


Beispiel #7
0
    def assembleTranscriptome(self):
        """
        Loop over uniqueGeneSet, in which the ENSG-IDs are saved,
        and assemble all the transcripts and exons for this gene and save it as a Gene object.
        This gene obeject ist then added to the geneList of this Genome object
        """
        # transcriptsByType = defaultdict(list)

        # construct Genes
        for uniqGene in self.uniqGeneSet:
            geneId, chromosome, strand = uniqGene

            geneNames = list(self.uniqGene_to_names[uniqGene])
            geneType = self.uniqGene_to_source[uniqGene]
            geneExons = set()
            geneCds = set()

            # get exons from all transcripts
            for transcriptId in self.uniqGene_to_transcriptIds[uniqGene]:
                geneExons |= self.transcriptId_to_exons[
                    transcriptId]  # add new exon tuples to geneExons set
                geneCds |= self.transcriptId_to_cds[transcriptId]

            # usually gtf Files are sorted, but this can't be assumed
            geneExons = sorted(geneExons, reverse=not strand)
            geneCds = sorted(geneCds, reverse=not strand)

            gene = Gene(geneId, chromosome, strand, geneType, geneNames,
                        geneExons, geneCds)

            geneExons = dict(zip(geneExons, xrange(1000000)))
            geneCds = dict(zip(geneCds, xrange(1000000)))

            self.geneList.append(gene)

            # construct transcripts
            for transcriptId in self.uniqGene_to_transcriptIds[uniqGene]:
                transcriptNames = self.transcriptId_to_names[transcriptId]

                protId = self.transcriptId_to_protId[
                    transcriptId] if transcriptId in self.transcriptId_to_protId else None
                exons = sorted(self.transcriptId_to_exons[transcriptId])
                codingExons = sorted(self.transcriptId_to_cds[transcriptId])
                exonIndices = array('H', [geneExons[e] for e in exons])
                codingExonIndices = array('H',
                                          [geneCds[e] for e in codingExons])
                codingFrames = array('H', [
                    int(frame) for exonNumber, frame in sorted(
                        self.transcriptId_to_codingFrames[transcriptId])
                ])
                startCodon = tuple([
                    interval for exonNumber, interval in sorted(
                        self.transcriptId_to_startCodons[transcriptId])
                ])
                stopCodon = tuple([
                    interval for exonNumber, interval in sorted(
                        self.transcriptId_to_stopCodons[transcriptId])
                ])

                if len(codingExons) != len(codingFrames):
                    raise Exception(
                        "Number of coding Exons and Frames differ for %s %s" %
                        geneId, transcriptId)

                transcript = Transcript(gene, transcriptId,
                                        list(transcriptNames), protId,
                                        exonIndices, codingExonIndices,
                                        codingFrames, startCodon, stopCodon)

                gene.addTranscript(transcript)
Beispiel #8
0
class ByuSession:

	def __init__(self, username, password):
			
			# Check to make sure all information is present
			if not username or not password:
				raise ByuSessionError("Please enter a username and password to continue.")
			
			self.username = username.lower().strip()
			self.password = password
			self.transcript = []
			self.parsed_transcript = None
			self.session = None
			self.semesters = []

	def signIn(self):
	
		sys.stdout.write("Logging in... ")
	
		session_requests = requests.session()
		
		login_url = "https://cas.byu.edu/cas/login?service=https://my.byu.edu/uPortal/Login"
		result = session_requests.get(login_url)
		
		# Must return a HTTP 200 code
		if str(result.status_code)[0] is not "2":
			raise ByuSessionError("Could not gather CAS login page. HTTP error Code: " + str(result.status_code))
		
		tree = html.fromstring(result.text)
		execution = list(set(tree.xpath("//input[@name='execution']/@value")))[0]
		lt = list(set(tree.xpath("//input[@name='lt']/@value")))[0]

		# Prepare http post data
		payload = {
			"username": self.username, 
			"password": self.password,
			"execution": execution,
			"lt": lt,
			"_eventId": "submit"
		}
		
		# Post the credentials
		result = session_requests.post(
			login_url, 
			data = payload, 
			headers = dict(referer=login_url)
		)
		
		# Must return a HTTP 200 code
		if str(result.status_code)[0] is not "2":
			raise ByuSessionError("Login failed. Please check your username and password. HTTP error Code: " + str(result.status_code))
		
		if "Unable to sign in:" in result.text:
			raise ByuSessionError("Login failed. Please check your username and password.")
		
		self.session = session_requests
		
		sys.stdout.flush()
		sys.stdout.write("Done.\n")
		
	def getTranscript(self):	
	
		sys.stdout.write("Retreiving transcript... ")
	
		if self.session is None:
			raise ByuSessionError("Please sign in first.")
			return
	
		url = 'https://y.byu.edu/ry/ae/prod/records/cgi/stdCourseWork.cgi'
		result = self.session.get(
			url, 
			headers = dict(referer = url)
		)
		
		# Must return a HTTP 200 code
		if str(result.status_code)[0] is not "2":
			raise ByuSessionError("The transcript page returned with errors. HTTP error Code: " + str(result.status_code))
		
		tree = html.fromstring(result.content)
		elem = tree.xpath("//pre/descendant-or-self::text()")
		
		for x in elem:
			self.transcript.append(x.replace("\\n", "\n"))
			
		if not self.transcript:
			raise ByuSessionError("The transcript could not be collected.\n***Please check your username and password.***")
			
		sys.stdout.flush()
		sys.stdout.write("Done.\n")
	
	def getAndParseTranscript(self):
	
		# If the transcript has not been collected yet, get it
		if not self.transcript:
			self.signIn()
			self.getTranscript()
		
		# Patterns to look for in the transcript
		semester_start_pattern = re.compile("((?:Fall|Winter|Spring|Summer)\s(?:Semester|Term)\s[0-9]{4}).*")
		current_semester_signifier = re.compile("(?:CURRENT ENROLLMENT).*")
		transfer_credits_start = re.compile("(?:YRTRM).*")
		end_pattern = re.compile("(?:SEM|TRN|--------------------------------------------------------------).*")
		past_class_pattern = re.compile("[\s\S]{6}(?:[0-9]{3}|[0-9]{3}[A-Z])\s+[0-9]{3}[\s\S]{42}[0-9]\.[0-9]{2}.*[A-P|W][+-]?")
		current_class_pattern = re.compile("[\s\S]{6}(?:[0-9]{3}|[0-9]{3}[A-Z])\s+[0-9]{3}[\s\S]{42}[0-9]\.[0-9]{2}")
		
		start_semester = False
		start_current_semester = False
		transfer_semester = False
		
		semesters = []
		recording_semester = ""
		
		# Otherwise, only get the current semester
		for line in self.transcript:
			# End of semester, current semester, and transfer credits
			if end_pattern.match(line.strip()) and start_semester:
				start_semester = False
				semesters.append(recording_semester)
			# Current semester sigifier
			elif current_semester_signifier.match(line):
				start_current_semester = True
			# Start of any semester
			elif semester_start_pattern.match(line):
				start_semester = True
				semester_name = line.split() # [name] Semester [year]
				recording_semester = Semester(semester_name[0], semester_name[2], start_current_semester)
			# Append class to semester
			elif start_semester:
				line = line.strip()
				if not start_current_semester:
					recording_semester.addClass(self.parsePastClass(line))
				else:
					if past_class_pattern.match(line):
						recording_semester.addClass(self.parsePastClass(line))
					else:
						recording_semester.addClass(self.parseCurrentClass(line))
			elif transfer_credits_start.match(line.strip()): # Transfer credits
				print "Transfer Credits Started!: ", line
				transfer_semester = True
				recording_semester = Semester("Transfer", "N/A", False)
			elif end_pattern.match(line.strip()) and transfer_semester: # Transfer credits ended
				print "Transfer Credits Ended: ", line
				transfer_semester = False
				semesters.append(recording_semester)
			elif transfer_semester: # Record transfer semester
				print "Transfer Line: ", line
				recording_semester.addClass(self.parseTransferClass(line))
					
		if not semesters:
			raise ByuSessionError("There are no classes listed for the selected semester.\nIf you are receiving this message in error, please try again.")
					
		self.parsed_transcript = Transcript(semesters)
		return self.parsed_transcript
		
	def getTargetSemester(self, semester_name, year):
	
		semester_name = semester_name.lower().capitalize()
		if semester_name == "Semester" or (semester_name != "All" and not year):
			raise ByuSessionError("Please enter a valid semester and year to continue.")
	
		if not self.transcript:
			self.getAndParseTranscript()
		
		# If all semesters are selected, print entire thing
		if semester_name == "All":	
			return self.parsed_transcript
		else:
			return self.parsed_transcript.getSemester(semester_name, year)
			
	def parsePastClass(self, aClass):
	
		aClass_list = self.parseClass(aClass, 2)
			
		department = aClass_list[0]
		number = aClass_list[1]
		section = aClass_list[2]
		name = aClass_list[3]
		points_total = aClass_list[4]
		grade = aClass_list[5]
			
		# Combine classes
		return Class(department, number, int(section), name, float(points_total), grade)
		
	def parseCurrentClass(self, aClass):
			
		aClass_list = self.parseClass(aClass, 1)
			
		department = aClass_list[0]
		number = aClass_list[1]
		section = aClass_list[2]
		name = aClass_list[3]
		points_total = aClass_list[4]
			
		# Combine classes
		return Class(department, number, int(section), name, float(points_total))
		
	def parseClass(self, aClass, parse_offset):
		aClass_list = aClass.split()
		
		# Check for department name in first indexes
		if not aClass_list[1][0].isdigit():
			aClass_list[0:2] = [" ".join(aClass_list[0:2])]
			
		# Merge class description
		aClass_list[3:(len(aClass_list) - parse_offset)] = [" ".join(aClass_list[3:(len(aClass_list) - parse_offset)])]
			
		return aClass_list
		
	def parseTransferClass(self, aClass):
		credits_pattern = re.compile("[0-9][.][0-9]{2}")
		grades_pattern = re.compile("\s[A-F][\-|\+]?\s")
		aClass_list = aClass.split()
		
		department = aClass_list[1]
		number = aClass_list[2]
		section = 000
		
		name = ""
		finished = False
		for item in aClass_list[3:]:
			if not finished:
				for letter in item:
					if letter.isdigit():
						finished = True
						break
				if not finished:
					name = name + " " + item
				
		credit_hours = float(credits_pattern.search(aClass).group(0))
		letter_grade = grades_pattern.search(aClass).group(0).strip()
		
		print "Credit Hours: ", str(credit_hours), "\nLetter Grade: ", str(letter_grade)
		
		return Class(department, number, section, name, credit_hours, letter_grade)
Beispiel #9
0
	def getAndParseTranscript(self):
	
		# If the transcript has not been collected yet, get it
		if not self.transcript:
			self.signIn()
			self.getTranscript()
		
		# Patterns to look for in the transcript
		semester_start_pattern = re.compile("((?:Fall|Winter|Spring|Summer)\s(?:Semester|Term)\s[0-9]{4}).*")
		current_semester_signifier = re.compile("(?:CURRENT ENROLLMENT).*")
		transfer_credits_start = re.compile("(?:YRTRM).*")
		end_pattern = re.compile("(?:SEM|TRN|--------------------------------------------------------------).*")
		past_class_pattern = re.compile("[\s\S]{6}(?:[0-9]{3}|[0-9]{3}[A-Z])\s+[0-9]{3}[\s\S]{42}[0-9]\.[0-9]{2}.*[A-P|W][+-]?")
		current_class_pattern = re.compile("[\s\S]{6}(?:[0-9]{3}|[0-9]{3}[A-Z])\s+[0-9]{3}[\s\S]{42}[0-9]\.[0-9]{2}")
		
		start_semester = False
		start_current_semester = False
		transfer_semester = False
		
		semesters = []
		recording_semester = ""
		
		# Otherwise, only get the current semester
		for line in self.transcript:
			# End of semester, current semester, and transfer credits
			if end_pattern.match(line.strip()) and start_semester:
				start_semester = False
				semesters.append(recording_semester)
			# Current semester sigifier
			elif current_semester_signifier.match(line):
				start_current_semester = True
			# Start of any semester
			elif semester_start_pattern.match(line):
				start_semester = True
				semester_name = line.split() # [name] Semester [year]
				recording_semester = Semester(semester_name[0], semester_name[2], start_current_semester)
			# Append class to semester
			elif start_semester:
				line = line.strip()
				if not start_current_semester:
					recording_semester.addClass(self.parsePastClass(line))
				else:
					if past_class_pattern.match(line):
						recording_semester.addClass(self.parsePastClass(line))
					else:
						recording_semester.addClass(self.parseCurrentClass(line))
			elif transfer_credits_start.match(line.strip()): # Transfer credits
				print "Transfer Credits Started!: ", line
				transfer_semester = True
				recording_semester = Semester("Transfer", "N/A", False)
			elif end_pattern.match(line.strip()) and transfer_semester: # Transfer credits ended
				print "Transfer Credits Ended: ", line
				transfer_semester = False
				semesters.append(recording_semester)
			elif transfer_semester: # Record transfer semester
				print "Transfer Line: ", line
				recording_semester.addClass(self.parseTransferClass(line))
					
		if not semesters:
			raise ByuSessionError("There are no classes listed for the selected semester.\nIf you are receiving this message in error, please try again.")
					
		self.parsed_transcript = Transcript(semesters)
		return self.parsed_transcript
Beispiel #10
0
 def makeTranscript(self,root):
     id=root["extra"]["ID"]
     strand=root["strand"]
     transcript=Transcript(id,strand)
     root["object"]=transcript
     transcript.substrate=root["substrate"]
     transcript.source=root["source"]
     transcript.begin=int(root["begin"])
     transcript.end=int(root["end"])
     children=root.get("children",None)
     if(children is None): return transcript
     for child in children:
         obj=self.labelStructure(child)
         if(obj is None): continue
         if(type(obj)==Exon):
             childType=child["type"]
             if(childType=="CDS" or
                re.search("-exon",childType)): transcript.addExon(obj)
             elif(childType=="exon"): transcript.addRawExon(obj)
             elif(re.search("UTR",childType)): transcript.addUTR(obj)
             obj.transcript=transcript
     transcript.parseRawExons()
     transcript.setExonTypes()
     transcript.setUTRtypes()
     transcript.sortExons()
     transcript.adjustOrders()
     extra=root["extra"]
     transcript.extraFields=""
     for key in extra:
         transcript.extraFields+=key+"="+extra[key]+";"
     return transcript
Beispiel #11
0
def get_transcripts_list(paths):
    # Get list of sorted Transcript files
    transcripts = []
    for path in sorted_paths(paths):
        transcripts.append(Transcript(path))
    return transcripts
Beispiel #12
0
import ast

app = Flask(__name__)
cors = CORS(app)
api = Api(app)

parser = reqparse.RequestParser()
parser.add_argument('transcript')

course_catalog = CourseCatalog()
course_catalog.load_courses('coursecatalog.csv')

degree_catalog = DegreeCatalog()
degree_catalog.load_degrees('degrees.json')

test_transcript = Transcript('ComputerScienceBA')
test_transcript.load_transcript('transcriptExample.json')

test_degree = degree_catalog.get_degree('ComputerScienceBA')

test_transcript.reccommend(degree_catalog)

#print(test_transcript.audit_transcript(degree_catalog.get_degree('Manangement Information System Major')))


#print(res)
class HelloWorld(Resource):
    """
        Test REST Endpoint
    """
    def get(self):
Beispiel #13
0
class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.transcript = Transcript()
        self.student_info = StudentInfo()

        self.selected_department = ""
        self.selectable_courses = {}
        self.current_season = ""

        self.resize(510, 700)
        self.setFixedWidth(510)
        self.setWindowFlags(QtCore.Qt.WindowCloseButtonHint
                            | QtCore.Qt.WindowMinimizeButtonHint)

        self.menu_bar = QtWidgets.QMenuBar()

        self.file_menu = QtWidgets.QMenu("Dosya")
        self.open = self.file_menu.addAction("Aç")
        self.save = self.file_menu.addAction("Kaydet")
        self.save_as = self.file_menu.addAction("Farklı Kaydet")

        self.menu_bar.addMenu(self.file_menu)
        self.setMenuBar(self.menu_bar)

        user_name_label = QtWidgets.QLabel("Kullanıcı adı:")
        self.user_name_show_label = QtWidgets.QLabel("")
        self.user_select_button = QtWidgets.QPushButton("Transcript Yükle")

        user_layout = QtWidgets.QHBoxLayout()
        user_layout.addWidget(user_name_label, 0)
        user_layout.addWidget(self.user_name_show_label, 1)
        user_layout.addWidget(self.user_select_button, 2)

        code_select_label = QtWidgets.QLabel("Bölüm Kodu Seç")
        code_select_label.setMaximumSize(110, 25)
        education_year_label = QtWidgets.QLabel("Eğitim Yılını Seç")
        education_season_label = QtWidgets.QLabel("Eğitim Dönemini Seç")
        education_season_label.setMaximumSize(150, 25)
        self.code_select_cbox = QtWidgets.QComboBox()
        self.code_select_cbox.addItem("Seç")
        self.code_select_cbox.setFixedSize(100, 25)
        self.education_season_cbox = QtWidgets.QComboBox()
        self.education_year_cbox = QtWidgets.QComboBox()
        self.season_select = QtWidgets.QPushButton("Seç")
        hor_spacer = QtWidgets.QSpacerItem(40, 20,
                                           QtWidgets.QSizePolicy.Expanding)

        top_grid_layout = QtWidgets.QGridLayout()
        top_grid_layout.addWidget(code_select_label, 0, 0)
        top_grid_layout.addWidget(self.code_select_cbox, 0, 1)
        top_grid_layout.addItem(hor_spacer, 0, 2)
        top_grid_layout.addWidget(education_year_label, 0, 3)
        top_grid_layout.addWidget(self.education_year_cbox, 0, 4)
        top_grid_layout.addWidget(education_season_label, 1, 3)
        top_grid_layout.addWidget(self.education_season_cbox, 1, 4)
        top_grid_layout.addWidget(self.season_select, 2, 4)

        self.course_table = QtWidgets.QTableWidget()
        self.course_table.setColumnCount(8)
        self.course_table.setFixedWidth(438)

        self.course_table.setColumnHidden(4, True)
        self.course_table.setColumnHidden(5, True)
        self.course_table.setColumnHidden(6, True)
        self.course_table.setColumnHidden(7, True)

        course_code_label = QtWidgets.QLabel("Ders Kodu")
        course_num_label = QtWidgets.QLabel("Ders Numarası")
        not_label = QtWidgets.QLabel("Not")
        gen_not_ort_label = QtWidgets.QLabel("Genel Not Ortalaması:")
        self.gpa_show_label = QtWidgets.QLabel()
        self.course_code_cbox = QtWidgets.QComboBox()
        self.course_code_cbox.addItem("Seç")
        self.course_num_cbox = QtWidgets.QComboBox()
        self.course_num_cbox.addItem("Seç")
        self.grade_cbox = QtWidgets.QComboBox()
        self.grade_cbox.addItem("Seç")
        self.gpa_show_label = QtWidgets.QLabel()
        self.remove_course_button = QtWidgets.QPushButton(
            "Seçilen Dersi Çıkar")

        bottom_grid_layout = QtWidgets.QGridLayout()
        bottom_grid_layout.addWidget(course_code_label, 0, 0)
        bottom_grid_layout.addWidget(self.course_code_cbox, 0, 1)
        bottom_grid_layout.addWidget(self.remove_course_button, 0, 3)
        bottom_grid_layout.addWidget(course_num_label, 1, 0)
        bottom_grid_layout.addWidget(self.course_num_cbox, 1, 1)
        bottom_grid_layout.addWidget(gen_not_ort_label, 1, 2)
        bottom_grid_layout.addWidget(self.gpa_show_label, 1, 3)
        bottom_grid_layout.addWidget(not_label, 2, 0)
        bottom_grid_layout.addWidget(self.grade_cbox, 2, 1)

        self.add = QtWidgets.QPushButton("Ders Ekle")

        bottom_hor_layout = QtWidgets.QHBoxLayout()
        bottom_hor_layout.addWidget(self.add)

        main_layout = QtWidgets.QVBoxLayout()
        main_layout.addLayout(user_layout, 0)
        main_layout.addLayout(top_grid_layout, 1)
        main_layout.addWidget(self.course_table, 2)
        main_layout.addLayout(bottom_grid_layout, 3)
        main_layout.addLayout(bottom_hor_layout, 4)

        self.central_widget = QtWidgets.QWidget()
        self.central_widget.setLayout(main_layout)
        self.setCentralWidget(self.central_widget)
        self.setWindowTitle("İTÜ Ortalama Hesaplayıcı")

        QtCore.QObject.connect(self.code_select_cbox,
                               QtCore.SIGNAL("currentIndexChanged(QString)"),
                               self.read_selected_department)
        QtCore.QObject.connect(self.course_code_cbox,
                               QtCore.SIGNAL("currentIndexChanged(QString)"),
                               self.set_course_num_cbox)
        QtCore.QObject.connect(self.education_year_cbox,
                               QtCore.SIGNAL("currentIndexChanged(QString)"),
                               self.set_education_season_cbox)
        QtCore.QObject.connect(self.season_select, QtCore.SIGNAL("clicked()"),
                               self.add_season)
        QtCore.QObject.connect(self.add, QtCore.SIGNAL("clicked()"),
                               self.add_course)
        QtCore.QObject.connect(self.remove_course_button,
                               QtCore.SIGNAL("clicked()"), self.remove_row)

        if self.get_transcript_data():
            self.write_transcript_table()
            self.set_education_year_cbox()
            self.set_gpa_show_label()
            self.set_code_select_cbox(save_data.read_verify_departments_code())
            self.set_grade_cbox()
            self.set_user_name_label()

    def set_code_select_cbox(self, departments: dict):
        for code in sorted(list(departments.values())):
            self.code_select_cbox.addItem(code)

    def set_course_code_cbox(self):
        self.course_code_cbox.clear()
        self.course_code_cbox.addItem("Seç")
        for code in sorted(self.selectable_courses.keys()):
            self.course_code_cbox.addItem(code)

    def set_course_num_cbox(self):
        department_code = self.course_code_cbox.currentText()
        self.course_num_cbox.clear()
        self.course_num_cbox.addItem("Seç")
        if department_code not in ["", "Seç"]:
            for code in sorted(set(self.selectable_courses[department_code])):
                self.course_num_cbox.addItem(code)

    def set_grade_cbox(self):
        for grades in ["AA", "BA", "BB", "CB", "CC", "DC", "DD", "FF", "VF"]:
            self.grade_cbox.addItem(grades)

    def set_education_year_cbox(self):
        years = self.calculate_years()

        for year in years:
            self.education_year_cbox.addItem(year)

    def set_education_season_cbox(self):
        self.education_season_cbox.clear()
        seasons = ["Güz", "Bahar", "Yaz Öğretimi"]
        education_year = self.education_year_cbox.currentText()
        last_season = self.transcript.get_last_season()
        last_year = last_season[:9]

        if education_year == last_year:
            for i in range(seasons.index(last_season[12:]) + 1, 3):
                self.education_season_cbox.addItem(seasons[i])
        else:
            for season in seasons:
                self.education_season_cbox.addItem(season)

    def set_gpa_show_label(self):
        self.gpa_show_label.setText(str(round(self.transcript.get_gpa(), 2)))

    def set_rows_header(self):
        course_counter = 1
        for i in range(self.course_table.rowCount()):
            item = QtWidgets.QTableWidgetItem()
            if self.course_table.item(i, 5).text() == "Course":
                item.setText(str(course_counter))
                course_counter += 1
            else:
                item.setBackgroundColor(QtGui.QColor(QtCore.Qt.gray))
                item.setText("")
            self.course_table.setVerticalHeaderItem(i, item)

    def set_user_name_label(self):
        self.user_name_show_label.setText(self.transcript.user_name)

    def calculate_years(self):
        last_season = self.transcript.get_last_season()

        years = []
        if last_season[12:] != "Yaz Öğretimi":
            first_ind = 0
        else:
            first_ind = 1

        for i in range(first_ind, 5):
            years.append(
                str(int(last_season[:4]) + i) + "-" +
                str(int(last_season[5:9]) + i))
        return years

    def read_selected_department(self):
        self.selected_department = self.code_select_cbox.currentText()
        self.selectable_courses = curriculums.parse_courses_code(
            self.selected_department)
        self.set_course_code_cbox()

    def read_course_code_cbox(self):
        return self.course_code_cbox.currentText()

    def read_course_num_cbox(self):
        return self.course_num_cbox.currentText()

    def read_grade_cbox(self):
        return self.grade_cbox.currentText()

    def add_row(self, row_data, row_number=None):
        if not row_number:
            row_number = self.course_table.rowCount()

        if row_data[5] == "Course":
            self.add_course_row(row_data, row_number)
        elif row_data[5] == "Season":
            self.add_season_row(row_data, row_number)

    def add_season_row(self, row_data, row_number):
        self.course_table.insertRow(row_number)

        for i, data in enumerate(row_data):
            item = QtWidgets.QTableWidgetItem(str(data))
            item.setFlags(QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable)
            item.setBackgroundColor(QtGui.QColor(QtCore.Qt.gray))
            self.course_table.setItem(row_number, i, item)

    def add_course_row(self, row_data, row_number):
        self.course_table.insertRow(row_number)

        for i, data in enumerate(row_data):
            if row_data[4] and i == 3:
                grade_cbox = QtWidgets.QComboBox()
                if row_data[7]:
                    grade_cbox.setEnabled(False)
                    grade_cbox.addItem(data)
                else:
                    if int(row_data[2]):
                        for grades in [
                                "AA", "BA", "BB", "CB", "CC", "DC", "DD", "FF",
                                "VF"
                        ]:
                            grade_cbox.addItem(grades)
                    else:
                        for grades in ["BZ", "BL"]:
                            grade_cbox.addItem(grades)
                    grade_cbox.setCurrentText(data.strip())
                self.course_table.setCellWidget(row_number, i, grade_cbox)

                QtCore.QObject.connect(
                    self.course_table.cellWidget(row_number, i),
                    QtCore.SIGNAL("currentIndexChanged(QString)"),
                    self.update_course_data)

            else:
                item = QtWidgets.QTableWidgetItem(str(data))
                item.setFlags(QtCore.Qt.ItemIsEnabled
                              | QtCore.Qt.ItemIsSelectable)
                self.course_table.setItem(row_number, i, item)

    def add_season(self):
        education_year = self.education_year_cbox.currentText()
        education_season = self.education_season_cbox.currentText()
        season = education_year + " / " + education_season
        self.current_season = season

        try:
            self.transcript.add_season(season)
            self.write_transcript_table()
        except IntegrityError:
            pass

    def add_course(self):
        if not self.current_season:
            QtWidgets.QMessageBox.information(self, "Hata",
                                              "Önce Dönem Seçin!",
                                              QtWidgets.QMessageBox.Ok)
        else:
            course_code = self.read_course_code_cbox()
            if course_code == "Seç":
                QtWidgets.QMessageBox.information(self, "Hata",
                                                  "Ders Kodu Seçin",
                                                  QtWidgets.QMessageBox.Ok)
                return False

            course_num = self.read_course_num_cbox()
            if course_num == "Seç":
                QtWidgets.QMessageBox.information(self, "Hata",
                                                  "Ders No Seçin",
                                                  QtWidgets.QMessageBox.Ok)
                return False

            course_grade = self.read_grade_cbox()
            if course_grade == "Seç":
                QtWidgets.QMessageBox.information(self, "Hata",
                                                  "Ders Notu Seçin",
                                                  QtWidgets.QMessageBox.Ok)
                return False

            course_data = self.find_course_data(course_code + " " + course_num)
            data = [
                course_data["Ders Kodu"], course_data["Ders Adı"],
                course_data["Kredi"], course_grade, 0, self.current_season
            ]

            try:
                self.transcript.check_course_before_added(data[0])
                self.transcript.add_course(data)
                self.write_transcript_table()
                self.set_gpa_show_label()
            except IntegrityError:
                QtWidgets.QMessageBox.information(
                    self, "Hata", "Bir Döneme Aynı Dersten İki Tane Eklenemez",
                    QtWidgets.QMessageBox.Ok)

    def write_transcript_table(self):
        self.course_table.clear()
        self.course_table.setRowCount(0)
        transcript_data = self.transcript.get_transcript_data()

        for row in transcript_data:
            self.add_row(row)

        self.set_rows_header()

        self.course_table.setHorizontalHeaderItem(
            0, QtWidgets.QTableWidgetItem("Ders Kodu"))
        self.course_table.setHorizontalHeaderItem(
            1, QtWidgets.QTableWidgetItem("Ders İsmi"))
        self.course_table.setHorizontalHeaderItem(
            2, QtWidgets.QTableWidgetItem("Kredi"))
        self.course_table.setHorizontalHeaderItem(
            3, QtWidgets.QTableWidgetItem("Not"))
        self.course_table.setHorizontalHeaderItem(
            4, QtWidgets.QTableWidgetItem("Editable"))
        self.course_table.setHorizontalHeaderItem(
            5, QtWidgets.QTableWidgetItem("Tag"))
        self.course_table.setHorizontalHeaderItem(
            6, QtWidgets.QTableWidgetItem("Season Name"))
        self.course_table.setHorizontalHeaderItem(
            7, QtWidgets.QTableWidgetItem("Passive"))

    def find_course_data(self, course_code):
        department_code = self.code_select_cbox.currentText()

        courses = save_data.read_elective_courses(
            department_code) + save_data.read_departments_curriculum(
                department_code)

        for item in courses:
            key = item["Ders Kodu"]
            if course_code == key or course_code[:
                                                 -1] == key or course_code == key[:
                                                                                  -1]:
                item["Ders Kodu"] = course_code
                return item
        return {}

    def update_course_data(self):
        table_data = []
        for row in reversed(range(self.course_table.rowCount())):
            if self.course_table.item(row, 4).text() == '0':
                break
            elif self.course_table.item(row, 5).text() == "Season":
                continue
            table_data.append([
                self.course_table.cellWidget(row, 3).currentText(),
                self.course_table.item(row, 6).text()
            ])

        db_data = self.transcript.get_editable_data()

        for i, course in enumerate(reversed(db_data)):
            if table_data[i][0] != course[1].strip():
                self.transcript.update_course(table_data[i][1], course[0],
                                              table_data[i][0])
                self.transcript.update_season_gpa(table_data[i][1])
                self.update_season_gpa(table_data[i][1])
                break

        self.set_gpa_show_label()

    def update_season_gpa(self, season_name):
        gpa = self.transcript.get_season_gpa(season_name)

        for row in reversed(range(self.course_table.rowCount())):
            if self.course_table.item(row, 5).text() == "Season" \
               and self.course_table.item(row, 0).text() == season_name[:9] \
               and self.course_table.item(row, 1).text() == season_name[12:]:
                item = self.course_table.takeItem(row, 3)
                item.setText(str(gpa))
                self.course_table.setItem(row, 3, item)

    def remove_row(self):
        current_row = self.course_table.currentRow()
        if self.course_table.item(current_row, 4).text() == "0":
            QtWidgets.QMessageBox.information(self, "Hata",
                                              "Bu Satırı Silemezsiniz.",
                                              QtWidgets.QMessageBox.Ok)
            return

        if self.course_table.item(current_row, 5).text() == "Course":
            self.transcript.delete_course(
                self.course_table.item(current_row, 6).text(),
                self.course_table.item(current_row, 0).text())
            self.transcript.update_season_gpa(
                self.course_table.item(current_row, 6).text())
            self.transcript.update_season_credit(
                self.course_table.item(current_row, 6).text())
            self.write_transcript_table()
            self.set_gpa_show_label()
        else:
            self.transcript.delete_season(
                self.course_table.item(current_row, 6).text())
            self.write_transcript_table()
            self.set_gpa_show_label()

    def get_transcript_data(self):
        self.student_info.reset_student_info()
        self.student_info.show()

        if self.student_info.exec_() == QtWidgets.QDialog.Accepted:
            self.transcript.set_user_name(self.student_info.user_name)
            self.transcript.set_path(self.student_info.path)
            self.user_name_show_label.setText(self.transcript.user_name)
            return 1
        else:
            return 0
Beispiel #14
0
    def __init__(self):
        super(MainWindow, self).__init__()

        self.transcript = Transcript()
        self.student_info = StudentInfo()

        self.selected_department = ""
        self.selectable_courses = {}
        self.current_season = ""

        self.resize(510, 700)
        self.setFixedWidth(510)
        self.setWindowFlags(QtCore.Qt.WindowCloseButtonHint
                            | QtCore.Qt.WindowMinimizeButtonHint)

        self.menu_bar = QtWidgets.QMenuBar()

        self.file_menu = QtWidgets.QMenu("Dosya")
        self.open = self.file_menu.addAction("Aç")
        self.save = self.file_menu.addAction("Kaydet")
        self.save_as = self.file_menu.addAction("Farklı Kaydet")

        self.menu_bar.addMenu(self.file_menu)
        self.setMenuBar(self.menu_bar)

        user_name_label = QtWidgets.QLabel("Kullanıcı adı:")
        self.user_name_show_label = QtWidgets.QLabel("")
        self.user_select_button = QtWidgets.QPushButton("Transcript Yükle")

        user_layout = QtWidgets.QHBoxLayout()
        user_layout.addWidget(user_name_label, 0)
        user_layout.addWidget(self.user_name_show_label, 1)
        user_layout.addWidget(self.user_select_button, 2)

        code_select_label = QtWidgets.QLabel("Bölüm Kodu Seç")
        code_select_label.setMaximumSize(110, 25)
        education_year_label = QtWidgets.QLabel("Eğitim Yılını Seç")
        education_season_label = QtWidgets.QLabel("Eğitim Dönemini Seç")
        education_season_label.setMaximumSize(150, 25)
        self.code_select_cbox = QtWidgets.QComboBox()
        self.code_select_cbox.addItem("Seç")
        self.code_select_cbox.setFixedSize(100, 25)
        self.education_season_cbox = QtWidgets.QComboBox()
        self.education_year_cbox = QtWidgets.QComboBox()
        self.season_select = QtWidgets.QPushButton("Seç")
        hor_spacer = QtWidgets.QSpacerItem(40, 20,
                                           QtWidgets.QSizePolicy.Expanding)

        top_grid_layout = QtWidgets.QGridLayout()
        top_grid_layout.addWidget(code_select_label, 0, 0)
        top_grid_layout.addWidget(self.code_select_cbox, 0, 1)
        top_grid_layout.addItem(hor_spacer, 0, 2)
        top_grid_layout.addWidget(education_year_label, 0, 3)
        top_grid_layout.addWidget(self.education_year_cbox, 0, 4)
        top_grid_layout.addWidget(education_season_label, 1, 3)
        top_grid_layout.addWidget(self.education_season_cbox, 1, 4)
        top_grid_layout.addWidget(self.season_select, 2, 4)

        self.course_table = QtWidgets.QTableWidget()
        self.course_table.setColumnCount(8)
        self.course_table.setFixedWidth(438)

        self.course_table.setColumnHidden(4, True)
        self.course_table.setColumnHidden(5, True)
        self.course_table.setColumnHidden(6, True)
        self.course_table.setColumnHidden(7, True)

        course_code_label = QtWidgets.QLabel("Ders Kodu")
        course_num_label = QtWidgets.QLabel("Ders Numarası")
        not_label = QtWidgets.QLabel("Not")
        gen_not_ort_label = QtWidgets.QLabel("Genel Not Ortalaması:")
        self.gpa_show_label = QtWidgets.QLabel()
        self.course_code_cbox = QtWidgets.QComboBox()
        self.course_code_cbox.addItem("Seç")
        self.course_num_cbox = QtWidgets.QComboBox()
        self.course_num_cbox.addItem("Seç")
        self.grade_cbox = QtWidgets.QComboBox()
        self.grade_cbox.addItem("Seç")
        self.gpa_show_label = QtWidgets.QLabel()
        self.remove_course_button = QtWidgets.QPushButton(
            "Seçilen Dersi Çıkar")

        bottom_grid_layout = QtWidgets.QGridLayout()
        bottom_grid_layout.addWidget(course_code_label, 0, 0)
        bottom_grid_layout.addWidget(self.course_code_cbox, 0, 1)
        bottom_grid_layout.addWidget(self.remove_course_button, 0, 3)
        bottom_grid_layout.addWidget(course_num_label, 1, 0)
        bottom_grid_layout.addWidget(self.course_num_cbox, 1, 1)
        bottom_grid_layout.addWidget(gen_not_ort_label, 1, 2)
        bottom_grid_layout.addWidget(self.gpa_show_label, 1, 3)
        bottom_grid_layout.addWidget(not_label, 2, 0)
        bottom_grid_layout.addWidget(self.grade_cbox, 2, 1)

        self.add = QtWidgets.QPushButton("Ders Ekle")

        bottom_hor_layout = QtWidgets.QHBoxLayout()
        bottom_hor_layout.addWidget(self.add)

        main_layout = QtWidgets.QVBoxLayout()
        main_layout.addLayout(user_layout, 0)
        main_layout.addLayout(top_grid_layout, 1)
        main_layout.addWidget(self.course_table, 2)
        main_layout.addLayout(bottom_grid_layout, 3)
        main_layout.addLayout(bottom_hor_layout, 4)

        self.central_widget = QtWidgets.QWidget()
        self.central_widget.setLayout(main_layout)
        self.setCentralWidget(self.central_widget)
        self.setWindowTitle("İTÜ Ortalama Hesaplayıcı")

        QtCore.QObject.connect(self.code_select_cbox,
                               QtCore.SIGNAL("currentIndexChanged(QString)"),
                               self.read_selected_department)
        QtCore.QObject.connect(self.course_code_cbox,
                               QtCore.SIGNAL("currentIndexChanged(QString)"),
                               self.set_course_num_cbox)
        QtCore.QObject.connect(self.education_year_cbox,
                               QtCore.SIGNAL("currentIndexChanged(QString)"),
                               self.set_education_season_cbox)
        QtCore.QObject.connect(self.season_select, QtCore.SIGNAL("clicked()"),
                               self.add_season)
        QtCore.QObject.connect(self.add, QtCore.SIGNAL("clicked()"),
                               self.add_course)
        QtCore.QObject.connect(self.remove_course_button,
                               QtCore.SIGNAL("clicked()"), self.remove_row)

        if self.get_transcript_data():
            self.write_transcript_table()
            self.set_education_year_cbox()
            self.set_gpa_show_label()
            self.set_code_select_cbox(save_data.read_verify_departments_code())
            self.set_grade_cbox()
            self.set_user_name_label()
Beispiel #15
0
 def makeTranscript(self, root):
     id = root["extra"]["ID"]
     strand = root["strand"]
     transcript = Transcript(id, strand)
     root["object"] = transcript
     transcript.substrate = root["substrate"]
     transcript.source = root["source"]
     transcript.begin = int(root["begin"])
     transcript.end = int(root["end"])
     children = root.get("children", None)
     if (children is None): return transcript
     for child in children:
         obj = self.labelStructure(child)
         if (obj is None): continue
         if (type(obj) == Exon):
             childType = child["type"]
             if (childType == "CDS" or re.search("-exon", childType)):
                 transcript.addExon(obj)
             elif (childType == "exon"):
                 transcript.addRawExon(obj)
             elif (re.search("UTR", childType)):
                 transcript.addUTR(obj)
             obj.transcript = transcript
     transcript.parseRawExons()
     transcript.setExonTypes()
     transcript.setUTRtypes()
     transcript.sortExons()
     transcript.adjustOrders()
     extra = root["extra"]
     transcript.extraFields = ""
     for key in extra:
         transcript.extraFields += key + "=" + extra[key] + ";"
     return transcript