1 from django.db import models
2 from django.db.models import Q
3 from django.core.exceptions import ObjectDoesNotExist
4 from datetime import datetime
5 from htsworkflow.frontend.samples.models import *
6 from htsworkflow.frontend.analysis.models import *
7 from htsworkflow.frontend.experiments.models import *
9 from htsworkflow.frontend.reports.utils import *
11 ##from p1 import LibInfo
12 from libinfopar import *
14 ## This is a table based REPORT generator. The goal is to display a Progress Report for all the ENCODE projects, based on Study Name (e.g. NRSF, FOXP2, Methy-Seq on .. etc).
16 class ProgressReport(models.Model):
17 st_sbj = models.ForeignKey(Project,limit_choices_to = Q(project_name__startswith='ENCODE '),related_name='project',db_index=True,verbose_name="Studied Subject")
18 interactome_complete = models.BooleanField(default=False)
21 str = self.st_sbj.__str__()
23 str += '<a title="open Project record" href="/admin/analys_track/project/'+self.st_sbj.id.__str__()+'/" target=_self style="font-size:85%">Edit Project</a>'
25 Study.allow_tags = True
27 def submit_to_DCC(self):
29 if self.note_about_DCC:
30 varText += '<br/><u>Note:</u><br/>'+self.note_about_DCC
31 return '%s<br/>%s' % (self.submitted_to_DCC,varText)
32 submit_to_DCC.allow_tags = True
34 def submit_to_NCBI(self):
36 if self.note_about_NCBI:
37 varText += '<br/><u>Note:</u><br/>'+self.note_about_NCBI
38 return '%s<br/>%s' % (self.submitted_to_NCBI,varText)
39 submit_to_NCBI.allow_tags = True
41 ## -- Utility functions <-- This method was transfered to untils.py
43 ## --- LIBARAY PREPARATION SECTION
45 ptasks = self.st_sbj.tasks.distinct()
48 if t.subject1 is not None:
49 arLibs.append(t.subject1.library_id)
50 if t.subject2 is not None:
51 arLibs.append(t.subject2.library_id)
52 arLibs = unique(arLibs)
53 return arLibs #.sort()
55 def getFCInfo(self,libid): ## This is the haviest function
57 ##Test return arFCLanes
58 # can't get this to work: FC_L1 = FlowCell.objects.filter(lane_5_library__exact=libid)
59 allFCs = FlowCell.objects.all()
64 # for i in range(1,9):
65 # if eval('f.lane_'+i.__str__()+'_library.library_id==libid'):
66 # lanes.append(i.__str__())
69 # maybe a bit faster this way:
70 if f.lane_1_library.library_id==libid:
73 if f.lane_2_library.library_id==libid:
76 if f.lane_3_library.library_id==libid:
79 if f.lane_4_library.library_id==libid:
82 if f.lane_5_library.library_id==libid:
85 if f.lane_6_library.library_id==libid:
88 if f.lane_7_library.library_id==libid:
91 if f.lane_8_library.library_id==libid:
98 rundate = re.sub(pattern="\s.*$",repl="",string=f.run_date.__str__())
99 entry = '<b>'+f.flowcell_id + '</b> Lanes No.: '+','.join(lanes)+' ('+rundate+')'
100 arFCLanes.append(entry)
101 if len(arFCLanes)==0:
102 arFCLanes.append('<font color=red>Flowcell not found.</font>')
106 ## To have the Company's lot number, apearing on the (source) tube, we need to add new Field in Library.
107 arlibs = self.getLibIds()
108 tstr = '<ul>' ##<u><b>Ab</b> from '+len(arlibs).__str__()+' libs</u>: '
112 rec = Library.objects.get(library_id=l,antibody__isnull=False)
113 arRows.append('<li>'+rec.antibody.antibodies+' for <b>'+rec.antibody.antigene+'</b> (src:'+rec.antibody.source+', cat:'+rec.antibody.catalog+')</li>')
114 except ObjectDoesNotExist:
116 tstr += "".join(unique(arRows))+'</ul>'
118 ab_batch.allow_tags = True
121 arlibs = self.getLibIds()
126 rec = Library.objects.get(library_id=l)
127 arRows.append('<li><b>'+rec.cell_line.cellline_name+'</b> ('+rec.condition.condition_name+')</li>')
128 except ObjectDoesNotExist:
130 tstr += "".join(unique(arRows))+'</ul>'
132 cell_line.allow_tags = True
134 def cell_harvest_batch(self): # <- data now displayed in "cell_line"
136 arlibs = self.getLibIds()
141 rec = Library.objects.get(library_id=l)
142 arRows.append('<li><b>'+rec.condition.condition_name+'</b></li>')
143 except ObjectDoesNotExist:
145 tstr += "".join(unique(arRows))+'</ul>'
147 cell_harvest_batch.allow_tags = True
154 ## Lib Id + Date + Person
156 tstr += 'function togit(eid){'
157 tstr += 'f=document.getElementById(eid);'
158 tstr += 'if(f.style.display==\'none\'){'
159 tstr += 'f.style.display=\'block\';'
161 tstr += 'f.style.display=\'none\';'
165 arlibs = self.getLibIds() ##.sort()
167 tstr +='<a href=# onClick="togit(\'libInfo'+self.st_sbj.project_name+'\')">view /hide</a>'
168 tstr += '<div id="libInfo'+self.st_sbj.project_name+'" style="display:block;border:solid #cccccc 1px;width:200px;height:300px;overflow:auto"><ul>'
172 rec = Library.objects.get(library_id=l)
173 arRows.append('<li><b>'+rec.library_id+'</b>: '+rec.library_name+'.<br/>Made By: '+rec.made_by+', On: '+ rec.creation_date.__str__()+'</li>')
174 except ObjectDoesNotExist:
176 tstr += "".join(unique(arRows))+'</ul></div>'
178 library.allow_tags = True
181 ## -- SEQUENCING SECTION
182 def sequencing(self):
183 ## FCId + Lane + Date
184 arlibs = self.getLibIds()
185 tstr ='<a href=# onClick="togit(\'seqInfo'+self.st_sbj.project_name+'\')">view /hide</a>'
186 tstr += '<div id="seqInfo'+self.st_sbj.project_name+'" style="display:block;border:solid #cccccc 1px;width:200px;height:300px;overflow:auto"><ul>'
188 tstr += '<li><b>'+l+'</b>:<br/>'+(' / '.join(self.getFCInfo(l)))+'</li>'
189 tstr += '</ul></div>'
191 sequencing.allow_tags = True
193 def aligned_reads(self):
195 arlibs = self.getLibIds()
196 tstr = '<a href=# onClick="togit(\'readsInfo'+self.st_sbj.project_name+'\')">view /hide</a>'
197 tstr += '<div id="readsInfo'+self.st_sbj.project_name+'" style="display:block;border:solid #cccccc 1px;width:200px;height:300px;overflow:auto">'
198 tstr += '<table><tr><td>Library Id</td><td>Total Lanes</td><td>M Reads</td></tr>'
199 LanesCnt, ReadsCnt = 0, 0
204 rc = "%1.2f" % (res[1]/1000000.0)
205 tstr += '<tr><td><b>'+l+'</b></td><td>'+res[0].__str__()+'</td></td><td>'+rc+'</td></tr>'
207 #tstr += '<a target=_blank href="'+settings.TASKS_PROJS_SERVER+'/projects/'+self.st_sbj.id.__str__()+'">Project results page</a>'
209 myNum = (ReadsCnt/1000000.0)
210 myNum = "%1.2f" % (myNum)
211 tstr += '<div>Total: <b>'+LanesCnt.__str__()+'</b> lanes and <b>'+myNum+'</b> M Reads</div>'
212 tstr += '<a target=_blank href="'+settings.TASKS_PROJS_SERVER+'/projects/'+self.st_sbj.id.__str__()+'">Project results page</a>'
214 aligned_reads.allow_tags = True
216 def peak_calling(self):
218 return 'coming up ..'
220 QPCR = models.CharField(max_length=500,blank=True,null=True)
221 submitted_to_DCC = models.DateTimeField(blank=True,null=True)
222 submitted_to_NCBI = models.DateTimeField(blank=True,null=True)
223 note_about_DCC = models.TextField(blank=True)
224 note_about_NCBI = models.TextField(blank=True)
227 return '"%s" - %s' % (self.st_sbj,self.interactome_complete)
230 #verbose_name_plural = "Reports"
234 list_display = ('Study','ab_batch','cell_line','library','sequencing','aligned_reads','QPCR','submit_to_DCC','submit_to_NCBI','interactome_complete')
235 ## list_filter = ('interactome_complete')
238 #############################################