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