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=int(start) self.stop=int(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,strand): self.id=id self.type=type # position on the original genome self.chr=chr self.start=int(start) self.stop=int(stop) self.strand=strand self.size=int(stop)-int(start)+1 self.pos_start=0 # position on the first segment self.pos_stop=0 # position on the last segment self.annot=annot self.childs=childs # liste of child features (exons, cds, etc) self.parent=parent self.segments_list=seg # list of oriented segments on which the feature is (>s1/<s1, depending on the path of the gene in the graph) self.note="" self.sequence="" def __str__(self): if self.parent=="": return f"id={self.id}, type={self.type}, segments={self.segments_list}, 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}, position on the original genome={self.chr}:{self.start}-{self.stop}, parent={self.parent}, childs={self.childs}, annotation={self.annot}"