Merge flowcell 'paired_end' flag from v0.1 branch
[htsworkflow.git] / htsworkflow / frontend / experiments / models.py
1 from django.db import models
2 from htsworkflow.frontend.samples.models import *
3 from django.core.exceptions import ObjectDoesNotExist
4
5 class FlowCell(models.Model):
6   
7   flowcell_id = models.CharField(max_length=20, unique=True, db_index=True)
8   run_date = models.DateTimeField()
9   advanced_run = models.BooleanField(default=False)
10   paired_end = models.BooleanField(default=False)
11   read_length = models.IntegerField(default=32) #Stanford is currenlty 25
12   
13   lane_1_library = models.ForeignKey(Library, related_name="lane_1_library")
14   lane_2_library = models.ForeignKey(Library, related_name="lane_2_library")
15   lane_3_library = models.ForeignKey(Library, related_name="lane_3_library")
16   lane_4_library = models.ForeignKey(Library, related_name="lane_4_library")
17   lane_5_library = models.ForeignKey(Library, related_name="lane_5_library")
18   lane_6_library = models.ForeignKey(Library, related_name="lane_6_library")
19   lane_7_library = models.ForeignKey(Library, related_name="lane_7_library")
20   lane_8_library = models.ForeignKey(Library, related_name="lane_8_library")
21
22   lane_1_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
23   lane_2_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
24   lane_3_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
25   lane_4_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
26   lane_5_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
27   lane_6_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
28   lane_7_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
29   lane_8_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
30   
31   lane_1_cluster_estimate = models.IntegerField(blank=True, null=True)
32   lane_2_cluster_estimate = models.IntegerField(blank=True, null=True)
33   lane_3_cluster_estimate = models.IntegerField(blank=True, null=True)
34   lane_4_cluster_estimate = models.IntegerField(blank=True, null=True)
35   lane_5_cluster_estimate = models.IntegerField(blank=True, null=True)
36   lane_6_cluster_estimate = models.IntegerField(blank=True, null=True)
37   lane_7_cluster_estimate = models.IntegerField(blank=True, null=True)
38   lane_8_cluster_estimate = models.IntegerField(blank=True, null=True)
39  
40   # lane_1_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_1_primer")
41   # lane_2_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_2_primer")
42   # lane_3_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_3_primer")
43   # lane_4_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_4_primer")
44   # lane_5_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_5_primer")
45   # lane_6_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_6_primer")
46   # lane_7_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_7_primer")
47   # lane_8_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_8_primer")
48
49   #Machine Names
50   CLUSTER_MAC = (
51       ('M304','Cardinal'),
52       ('R349','R349'),
53       ('Tinkerbell','Tinkerbell'),
54       ('BitBit','BitBit'),
55     )
56   
57   SEQ_MAC = (
58       ('EAS149','Stanford'),
59       ('EAS46','EAS46'),
60       ('EAS45','Paris'),
61       ('Britney','Britney'),
62     )
63   
64   cluster_mac_id = models.CharField(max_length=50, choices=CLUSTER_MAC, default='BitBit')
65   seq_mac_id = models.CharField(max_length=50, choices=SEQ_MAC, verbose_name = 'Sequencer', default='Britney')
66   
67   notes = models.TextField(blank=True)
68
69   def __unicode__(self):
70       return unicode(self.flowcell_id) 
71
72   def Create_LOG(self):
73     str = ''
74     str +='<a target=_balnk href="/experiments/'+self.flowcell_id+'" title="Create XLS like sheet for this Flowcell ..." ">Create LOG</a>'
75     try:
76       t = DataRun.objects.get(fcid=self.id)
77       str +='<br/><a target=_self href="/admin/experiments/datarun/?q='+self.flowcell_id+'" title="Check Data Runs ..." ">DataRun ..</a>'
78     except ObjectDoesNotExist:
79       str += '<br/><span style="color:red">not sequenced</span>'
80     return str
81   Create_LOG.allow_tags = True 
82
83   def Lanes(self):
84     return '<div><span style="margin-right:10px">1)%s</span><span style="margin-right:10px">2)%s</span><span style="margin-right:10px">3)%s</span><span style="margin-right:10px">4)%s</span><span style="margin-right:10px">5)%s</span><span style="margin-right:10px">6)%s</span><span style="margin-right:10px">7)%s</span><span style="margin-right:10px">8)%s</span></div>' % (self.lane_1_library,self.lane_2_library,self.lane_3_library,self.lane_4_library,self.lane_5_library,self.lane_6_library,self.lane_7_library,self.lane_8_library)
85   Lanes.allow_tags = True
86
87   class Meta:
88     ordering = ["-run_date"]
89   
90
91 ### -----------------------
92 class DataRun(models.Model):
93   ConfTemplate = "CONFIG PARAMS WILL BE GENERATED BY THE PIPELINE SCRIPT.\nYOU'LL BE ABLE TO EDIT AFTER IF NEEDED."
94   run_folder = models.CharField(max_length=50,unique=True, db_index=True)
95   fcid = models.ForeignKey(FlowCell,verbose_name="Flowcell Id")
96   config_params = models.TextField(default=ConfTemplate)
97   run_start_time = models.DateTimeField()
98   RUN_STATUS_CHOICES = (
99       (0, 'Sequencer running'), ##Solexa Data Pipeline Not Yet Started'),
100       (1, 'Data Pipeline Started'),
101       (2, 'Data Pipeline Interrupted'),
102       (3, 'Data Pipeline Finished'),
103       (4, 'CollectReads Started'),
104       (5, 'CollectReads Finished'),
105       (6, 'QC Finished'),
106       (7, 'DONE'),
107     )
108   run_status = models.IntegerField(choices=RUN_STATUS_CHOICES, default=0)
109   run_note = models.TextField(blank=True)
110
111
112   def main_status(self):
113     str = '<div'
114     if self.run_status >= 5:
115       str += ' style="color:green">'
116       str += '<b>'+self.RUN_STATUS_CHOICES[self.run_status][1]+'</b>'
117       str += '<br/><br/>' #<span style="color:red;font-size:80%;">New!</span>'
118       str +='<br/><a target=_balnk href="'+settings.TASKS_PROJS_SERVER+'/Flowcells/'+self.fcid.flowcell_id+'/'+self.fcid.flowcell_id+'_QC_Summary.html" title="View QC Summaries of this run ..." ">View QC Page</a>'
119     else:
120       str += '>'+self.RUN_STATUS_CHOICES[self.run_status][1]
121
122     str += '</div>'
123     return str
124   main_status.allow_tags = True
125
126   main_status.allow_tags = True
127   
128   def Flowcell_Info(self):
129     str = '<b>'+self.fcid.__str__()+'</b>'
130     str += '  (c: '+self.fcid.cluster_mac_id+',  s: '+self.fcid.seq_mac_id+')'
131     str += '<div style="margin-top:5px;">'    
132     str +='<a title="View Lane List here ..."  onClick="el = document.getElementById(\'LanesOf'+self.fcid.__str__()+'\');if(el) (el.style.display==\'none\'?el.style.display=\'block\':el.style.display=\'none\')" style="cursor:pointer;color: #5b80b2;">View/hide lanes</a>'
133     str += '<div id="LanesOf'+self.fcid.__str__()+'" style="display:block;border:solid #cccccc 1px;width:350px">'
134     LanesList = '1: '+self.fcid.lane_1_library.__str__()+' ('+self.fcid.lane_1_library.library_species.use_genome_build+')<br/>2: '+self.fcid.lane_2_library.__str__()+' ('+self.fcid.lane_2_library.library_species.use_genome_build+')<br/>3: '+self.fcid.lane_3_library.__str__()+' ('+self.fcid.lane_3_library.library_species.use_genome_build+')<br/>4: '+self.fcid.lane_4_library.__str__()+' ('+self.fcid.lane_4_library.library_species.use_genome_build+')<br/>5: '+self.fcid.lane_5_library.__str__()+' ('+self.fcid.lane_5_library.library_species.use_genome_build+')<br/>6: '+self.fcid.lane_6_library.__str__()+' ('+self.fcid.lane_6_library.library_species.use_genome_build+')<br/>7: '+self.fcid.lane_7_library.__str__()+' ('+self.fcid.lane_7_library.library_species.use_genome_build+')<br/>8: '+self.fcid.lane_8_library.__str__()+' ('+self.fcid.lane_8_library.library_species.use_genome_build+')'
135     str += LanesList ## self.fcid.Lanes()
136     str += '</div>'
137     str += '<div><a title="open Flowcell record" href="/admin/exp_track/flowcell/'+self.fcid.id.__str__()+'/" target=_self>Edit Flowcell record</a>'
138     #str += '<span style="color:red;font-size:80%;margin-left:15px;margin-right:3px">New!</span>'
139     str +='<a style="margin-left:15px;" target=_balnk href="/exp_track/'+self.fcid.flowcell_id+'" title="View XLS like sheet for this Flowcell LOG ..." ">GA LOG Page</a>'
140     str += '</div>'
141     str += '</div>'    
142     return str
143   Flowcell_Info.allow_tags = True