Added Flowcell table here from FcTracker.
[htsworkflow.git] / gaworkflow / frontend / exp_track / models.py
1 from django.db import models
2 from gaworkflow.frontend.fctracker.models import Library
3
4 class FlowCell(models.Model):
5   
6   flowcell_id = models.CharField(max_length=20, unique=True, db_index=True, core=True)
7   run_date = models.DateTimeField(core=True)
8   advanced_run = models.BooleanField(default=False)
9   read_length = models.IntegerField(default=32) #Stanford is currenlty 25
10   
11   lane_1_library = models.ForeignKey(Library, related_name="lane_1_library")
12   lane_2_library = models.ForeignKey(Library, related_name="lane_2_library")
13   lane_3_library = models.ForeignKey(Library, related_name="lane_3_library")
14   lane_4_library = models.ForeignKey(Library, related_name="lane_4_library")
15   lane_5_library = models.ForeignKey(Library, related_name="lane_5_library")
16   lane_6_library = models.ForeignKey(Library, related_name="lane_6_library")
17   lane_7_library = models.ForeignKey(Library, related_name="lane_7_library")
18   lane_8_library = models.ForeignKey(Library, related_name="lane_8_library")
19
20   lane_1_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
21   lane_2_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
22   lane_3_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
23   lane_4_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
24   lane_5_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
25   lane_6_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
26   lane_7_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
27   lane_8_pM = models.DecimalField(max_digits=5, decimal_places=2,blank=False, null=False,default=2.5)
28   
29   lane_1_cluster_estimate = models.IntegerField(blank=True, null=True)
30   lane_2_cluster_estimate = models.IntegerField(blank=True, null=True)
31   lane_3_cluster_estimate = models.IntegerField(blank=True, null=True)
32   lane_4_cluster_estimate = models.IntegerField(blank=True, null=True)
33   lane_5_cluster_estimate = models.IntegerField(blank=True, null=True)
34   lane_6_cluster_estimate = models.IntegerField(blank=True, null=True)
35   lane_7_cluster_estimate = models.IntegerField(blank=True, null=True)
36   lane_8_cluster_estimate = models.IntegerField(blank=True, null=True)
37  
38   # lane_1_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_1_primer")
39   # lane_2_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_2_primer")
40   # lane_3_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_3_primer")
41   # lane_4_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_4_primer")
42   # lane_5_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_5_primer")
43   # lane_6_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_6_primer")
44   # lane_7_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_7_primer")
45   # lane_8_primer = models.ForeignKey(Primer,blank=True,null=True,related_name="lane_8_primer")
46
47   #Machine Names
48   CLUSTER_MAC = (
49       ('M304','M304'),
50       ('R349','R349'),
51       ('Tinkerbell','Tinkerbell'),
52       ('BitBit','BitBit'),
53     )
54   
55   SEQ_MAC = (
56       ('EAS149','EAS149'),
57       ('EAS46','EAS46'),
58       ('EAS45','Paris'),
59       ('Britney','Britney'),
60     )
61   
62   cluster_mac_id = models.CharField(max_length=50, choices=CLUSTER_MAC, default='BitBit')
63   seq_mac_id = models.CharField(max_length=50, choices=SEQ_MAC, verbose_name = 'Sequencer', default='Britney')
64   
65   notes = models.TextField(blank=True)
66
67   def __str__(self):
68     #return '%s (%s)' % (self.flowcell_id, self.run_date) 
69     return '%s' % (self.flowcell_id) 
70
71
72   def Lanes(self):
73     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)
74   Lanes.allow_tags = True
75  
76   class Meta:
77     ordering = ["-run_date"]
78   
79   class Admin:
80     save_on_top = True
81     date_hierarchy = "run_date"
82     save_on_top = True
83     search_fields = ['flowcell_id','seq_mac_id','cluster_mac_id','=lane_1_library__library_id','=lane_2_library__library_id','=lane_3_library__library_id','=lane_4_library__library_id','=lane_5_library__library_id','=lane_6_library__library_id','=lane_7_library__library_id','=lane_8_library__library_id']
84     list_display = ('flowcell_id','seq_mac_id','run_date', 'Lanes')
85     list_filter = ('seq_mac_id','cluster_mac_id')
86     fields = (
87         (None, {
88             'fields': ('run_date', ('flowcell_id','cluster_mac_id','seq_mac_id'), ('read_length'),)
89         }),
90         ('Lanes:', {
91             ##'fields' : (('lane_1_library', 'lane_1_pM', 'lane_1_cluster_estimate', 'lane_1_primer'), ('lane_2_library', 'lane_2_pM', 'lane_2_cluster_estimate', 'lane_2_primer'), ('lane_3_library', 'lane_3_pM', 'lane_3_cluster_estimate', 'lane_3_primer'), ('lane_4_library', 'lane_4_pM', 'lane_4_cluster_estimate', 'lane_4_primer'), ('lane_5_library', 'lane_5_pM', 'lane_5_cluster_estimate', 'lane_5_primer'), ('lane_6_library', 'lane_6_pM', 'lane_6_cluster_estimate', 'lane_6_primer'), ('lane_7_library', 'lane_7_pM', 'lane_7_cluster_estimate', 'lane_7_primer'), ('lane_8_library', 'lane_8_pM', 'lane_8_cluster_estimate', 'lane_8_primer'),)
92            'fields' : (('lane_1_library', 'lane_1_pM', 'lane_1_cluster_estimate'), ('lane_2_library', 'lane_2_pM', 'lane_2_cluster_estimate'), ('lane_3_library', 'lane_3_pM', 'lane_3_cluster_estimate'), ('lane_4_library', 'lane_4_pM', 'lane_4_cluster_estimate'), ('lane_5_library', 'lane_5_pM', 'lane_5_cluster_estimate'), ('lane_6_library', 'lane_6_pM', 'lane_6_cluster_estimate'), ('lane_7_library', 'lane_7_pM', 'lane_7_cluster_estimate'), ('lane_8_library', 'lane_8_pM', 'lane_8_cluster_estimate'),)
93         }),
94         (None, {
95             'fields' : ('notes',)
96         }),
97     )
98
99
100 ### -----------------------
101 class DataRun(models.Model):
102   ConfTemplate = "CONFIG PARAMS WILL BE GENERATED BY THE PIPELINE SCRIPT.\nYOU'LL BE ABLE TO EDIT AFTER IF NEEDED."
103   run_folder = models.CharField(max_length=50,unique=True, db_index=True)
104   fcid = models.ForeignKey(FlowCell,verbose_name="Flowcell Id")
105   config_params = models.TextField(default=ConfTemplate)
106   run_start_time = models.DateTimeField(core=True)
107   RUN_STATUS_CHOICES = (
108       (0, 'Sequencer running'), ##Solexa Data Pipeline Not Yet Started'),
109       (1, 'Data Pipeline Started'),
110       (2, 'Data Pipeline Interrupted'),
111       (3, 'Data Pipeline Finished'),
112       (4, 'CollectReads Started'),
113       (5, 'CollectReads Finished'),
114     )
115   run_status = models.IntegerField(choices=RUN_STATUS_CHOICES, default=0)
116   run_note = models.TextField(blank=True)
117   
118   def Flowcell_Info(self):
119     str = '<b>'+self.fcid.__str__()+'</b>'
120     str += '<div style="margin-top:5px;">'    
121     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 Lanes</a>'
122     str += '<div id="LanesOf'+self.fcid.__str__()+'" style="display:none;border:solid #cccccc 1px;width:300px">'
123     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+')<br/>'
124     str += LanesList ## self.fcid.Lanes()
125     str += '<br/><a title="open Flowcell record" href="/admin/exp_track/flowcell/'+self.fcid.id.__str__()+'/" target=_self>Edit Flowcell record</a>'
126     str += '</div></div>'    
127     return str
128   Flowcell_Info.allow_tags = True
129
130   class Admin:
131     search_fields = ['run_folder','run_note','config_params','=fcid__lane_1_library__library_id','=fcid__lane_2_library__library_id','=fcid__lane_3_library__library_id','=fcid__lane_4_library__library_id','=fcid__lane_5_library__library_id','=fcid__lane_6_library__library_id','=fcid__lane_7_library__library_id','=fcid__lane_8_library__library_id']
132
133     list_display = ('run_folder','Flowcell_Info','run_start_time','run_status','run_note')
134     list_filter = ('run_status','run_start_time')