class Segment: def __init__(self,id,feature,chr,start,stop): self.id=id self.features=feature # list of the features on this segment. if the feature is on the + strand, it will be named '+feature_id', else '-feature_id' # position on the original genome self.chr=chr self.start=start self.stop=stop self.size=self.stop-self.start+1 def __str__(self): return f"id={self.id}, position on the original genome={self.chr}:{self.start}-{self.stop}, size={self.size}, features={self.features}" class Feature: def __init__(self,id,type,chr,start,stop,annot,childs,parent,seg_list,strand,complete): self.id=id self.type=type # position on the original genome self.chr=chr self.start=start self.stop=stop self.strand=strand self.size=stop-start+1 self.pos_start=0 # position on the first segment, setup later self.pos_stop=0 # position on the last segment, setup later self.annot=annot self.childs=childs # liste of child features (exons, cds, etc) self.parent=parent self.segments_list_source=seg_list # list of oriented segments on which the feature is (>s1/<s1, depending on the path of the gene in the graph) self.segments_list_target=[] self.note="" self.sequence="" self.complete=complete # boolean, is the feature initialised with all the info or not def __str__(self): if self.parent=="": return f"id={self.id}, type={self.type}, segments={self.segments_list_source}, position on the original genome={self.chr}:{self.start}-{self.stop}, childs={self.childs}, annotation={self.annot}" else: return f"id={self.id}, type={self.type}, segments={self.segments_list_source}, position on the original genome={self.chr}:{self.start}-{self.stop}, parent={self.parent}, childs={self.childs}, annotation={self.annot}"