from __future__ import unicode_literals
import os
import string
import re
import hashlib
from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_delete
from django.dispatch import receiver
RNA_BASED_ASSAYS = (
'RNA-seq', 'short-RNA-seq','miRNA-seq', 'CAGE-seq', 'Bru-seq', 'PAS-seq',
'Ribo-seq', 'RIP-seq', 'PAR-Clip-seq', 'iCLIP-seq', 'GRO-seq', 'PAL-seq',
'3P-seq','SAPAS-seq')
# define pre-filled autocomplete tables
[docs]class statuses(models.Model):
name = models.CharField(max_length=200)
class Meta:
verbose_name_plural = "statuses"
def __unicode__(self):
return str(self.name)
[docs]class biosample_types(models.Model):
name = models.CharField(max_length=200)
class Meta:
verbose_name_plural = "biosample types"
def __unicode__(self):
return str(self.name)
[docs]class labs(models.Model):
lab_id = models.CharField(
max_length=200, verbose_name="Lab ID")
name = models.CharField(max_length=200, verbose_name="Lab Name")
lab_pi = models.CharField(max_length=200, verbose_name="Principal Investigator",
blank=True, null=True)
lab_institution = models.CharField(max_length=200, verbose_name="Institution",
blank=True, null=True)
lab_country = models.CharField(max_length=200, verbose_name="Country",
blank=True, null=True)
date_added = models.DateTimeField('Date Entered', auto_now_add=True)
class Meta:
verbose_name_plural = "labs"
def __unicode__(self):
if str(self.lab_institution).encode('utf-8') != "":
name = str(self.name) +\
", " + str(self.lab_institution).encode('utf-8')
else:
name = str(self.name)
return name
def save(self, *args, **kwargs):
# if the id has not been set yet then it is a new object
# and needs a new lab_id
if not self.id:
super(labs, self).save(*args, **kwargs)
self.lab_id = 'DCD' + \
str(self.id).zfill(3) + 'LB'
super(labs, self).save(*args, **kwargs)
def to_json(self):
return dict(
lab_id=self.lab_id,
name=string.replace(self.name, " ", "_"),
lab_pi=self.lab_pi,
lab_institution=self.lab_institution,
lab_country=self.lab_country,
)
[docs]class anatomical_terms(models.Model):
name = models.CharField(max_length=200)
class Meta:
verbose_name_plural = "anatomical terms"
def __unicode__(self):
return str(self.name)
[docs]class genetic_backgrounds(models.Model):
name = models.CharField(max_length=200)
class Meta:
verbose_name_plural = "genetic backgrounds"
def __unicode__(self):
return str(self.name)
[docs]class developmental_stages(models.Model):
name = models.CharField(max_length=200)
class Meta:
verbose_name_plural = "developmental stages"
def __unicode__(self):
return str(self.name)
[docs]class sexes(models.Model):
name = models.CharField(max_length=200)
class Meta:
verbose_name_plural = "sexes"
def __unicode__(self):
return str(self.name)
[docs]class assay_types(models.Model):
name = models.CharField(max_length=200)
class Meta:
verbose_name_plural = "assay types"
def __unicode__(self):
return str(self.name)
[docs]class instruments(models.Model):
name = models.CharField(max_length=200)
class Meta:
verbose_name_plural = "instruments"
def __unicode__(self):
return str(self.name)
[docs]class strand_modes(models.Model):
name = models.CharField(max_length=200)
class Meta:
verbose_name_plural = "strand modes"
def __unicode__(self):
return str(self.name)
[docs]class file_types(models.Model):
name = models.CharField(max_length=200)
class Meta:
verbose_name_plural = "file types"
def __unicode__(self):
return str(self.name)
[docs]class mapped_genomes(models.Model):
name = models.CharField(max_length=200)
class Meta:
verbose_name_plural = "mapped genomes"
def __unicode__(self):
return str(self.name)
[docs]class organisms(models.Model):
name = models.CharField(max_length=200, default='Danio rerio')
class Meta:
verbose_name_plural = "organisms"
def __unicode__(self):
return str(self.name)
[docs]class Versions(models.Model):
name = models.CharField(max_length=200)
class Meta:
verbose_name_plural = "versions"
def __unicode__(self):
return str(self.name)
# define series, biosample, assay, sequencing and data models
[docs]class Series(models.Model):
series_id = models.CharField(
max_length=200, verbose_name='Series ID')
title = models.CharField(max_length=1000, verbose_name='Title')
series_type = models.CharField(
max_length=100, verbose_name='Series Type')
is_public = models.BooleanField(
verbose_name='Is Public', default=True)
description = models.TextField(
max_length=10000, verbose_name='Series Description')
status = models.ForeignKey(
statuses, verbose_name='Status', default=0)
publication = models.CharField(
max_length=1000, verbose_name='Publication', blank=True)
sra_geo_id = models.CharField(
max_length=200, verbose_name='SRA/GEO Accession',
blank=True)
user = models.ForeignKey(User, verbose_name='Added by User')
date_added = models.DateTimeField('Date Entered', auto_now_add=True)
date_edited = models.DateTimeField('Date Entered', auto_now=True)
class Meta:
verbose_name_plural = "series"
def __unicode__(self):
return unicode(self.series_id) + ": " + \
unicode(self.series_type) + " titled " + \
unicode(self.title)
def save(self, *args, **kwargs):
# if the id has not been set yet then it is a new object
# and needs a new series_id
if not self.id:
super(Series, self).save(*args, **kwargs)
self.series_id = 'DCD' + \
str(self.id).zfill(6) + 'SR'
super(Series, self).save(*args, **kwargs)
@property
def short_desc(self):
words = self.description.split(' ')
return ' '.join(words[:9]) + ' ...' if len(words) > 10 else \
self.description
[docs]class Biosample(models.Model):
biosample_id = models.CharField(
max_length=200, verbose_name="Biosample ID")
series = models.ForeignKey(
Series, related_name='series_biosample', verbose_name="Series")
biosample_type = models.ForeignKey(
biosample_types, verbose_name='Biosample Type')
biosample_lab = models.ForeignKey(labs, verbose_name='Biosample Lab')
genetic_background = models.ForeignKey(
genetic_backgrounds, verbose_name='Genetic Background')
stage = models.ForeignKey(
developmental_stages, verbose_name='Stage',
blank=True, null=True)
controlled_by = models.ForeignKey(
'self', related_name='control_for',
verbose_name="Controlled by", blank=True, null=True)
anatomical_term = models.ForeignKey(
anatomical_terms, verbose_name='Anatomical Term',
blank=True, null=True)
organism = models.ForeignKey(organisms, default='1')
treatment = models.CharField(
max_length=1000, verbose_name='Treatment', blank=True)
post_fertilization = models.CharField(
max_length=100, verbose_name='Hours post Fertilization',
blank=True)
source = models.CharField(
max_length=200, verbose_name='Biosample Source', blank=True)
sex = models.ForeignKey(
sexes, verbose_name='Sex', blank=True, null=True)
mutation_description = models.CharField(
max_length=1000, verbose_name='Mutation Description', blank=True)
cell_line_type = models.CharField(
max_length=200, verbose_name='Cell Line Type', blank=True)
description = models.TextField(
max_length=1000, verbose_name='Biosample Description',
blank=True)
user = models.ForeignKey(User, verbose_name='Added by User')
date_added = models.DateTimeField('Date Entered', auto_now_add=True)
date_edited = models.DateTimeField('Date Entered', auto_now=True)
def __unicode__(self):
return str(self.biosample_id) + ": " + \
str(self.biosample_type) + " from " + str(self.biosample_lab) +" at stage "+ str(self.stage)
def save(self, *args, **kwargs):
# if the id has not been set yet then it is a new object
# and needs a new biosample_id
if not self.id:
super(Biosample, self).save(*args, **kwargs)
self.biosample_id = 'DCD' + \
str(self.id).zfill(6) + 'BS'
super(Biosample, self).save(*args, **kwargs)
@property
def short_desc(self):
words = self.description.split(' ')
return ' '.join(words[:9]) + ' ...' if len(words) > 10 else \
self.description
[docs]class BiosampleReplicate(models.Model):
biosamplereplicate_id = models.CharField(
max_length=200, verbose_name="Biosample Replicate ID")
biosample = models.ForeignKey(
Biosample, related_name='biosample_biorep')
user = models.ForeignKey(User, verbose_name='Added by User')
date_added = models.DateTimeField('Date Entered', auto_now_add=True)
date_edited = models.DateTimeField('Date Entered', auto_now=True)
def __unicode__(self):
return str(self.biosamplereplicate_id)
def save(self, *args, **kwargs):
if not self.id:
super(BiosampleReplicate, self).save(*args, **kwargs)
self.biosamplereplicate_id = 'DCD' + \
str(self.id).zfill(6) + 'BR'
super(BiosampleReplicate, self).save(*args, **kwargs)
[docs]class Assay(models.Model):
assay_id = models.CharField(
max_length=200, verbose_name="Assay ID")
assay_type = models.ForeignKey(
assay_types, verbose_name='Assay Type')
assay_lab = models.ForeignKey(labs, verbose_name='Assay Lab')
description = models.CharField(
max_length=2000, verbose_name='Assay Description')
target = models.CharField(
max_length=200, verbose_name='Target', blank=True)
library_prep = models.CharField(
max_length=200, verbose_name='RNA-library Preparation', blank=True,
null=True)
user = models.ForeignKey(User, verbose_name='Added by User')
date_added = models.DateTimeField('Date Entered', auto_now_add=True)
date_edited = models.DateTimeField('Date Entered', auto_now=True)
def __unicode__(self):
if str(self.assay_type) in RNA_BASED_ASSAYS:
return str(self.assay_id) + ' : ' + str(self.assay_type) + \
" from " + str(self.assay_lab) + " with "+ str(self.library_prep)
else:
return str(self.assay_id) + ' : ' + str(self.assay_type) + \
" from " + str(self.assay_lab)
def to_json(self):
return dict(
assay_id=self.assay_id,
assay_lab=self.assay_lab.name,
assay_type=self.assay_type.name,
description=self.description,
target=self.target,
)
# override save to give a unique formated ID
def save(self, *args, **kwargs):
if not self.id:
super(Assay, self).save(*args, **kwargs)
if self.target:
target = "_" + self.target
else:
target = ""
identifier = self.assay_type.name + "_" + \
string.replace(self.assay_lab.name, " ", "_") \
+ target
if self.target:
no = Assay.objects.filter(
assay_type=self.assay_type).filter(
assay_lab=self.assay_lab).filter(
target=self.target).count()
else:
no = Assay.objects.filter(
assay_type=self.assay_type).filter(
assay_lab=self.assay_lab).count()
self.assay_id = identifier + "_" + str(no).zfill(4) + 'AS'
super(Assay, self).save(*args, **kwargs)
@property
def short_desc(self):
words = self.description.split(' ')
return ' '.join(words[:9]) + ' ...' if len(words) > 10 else \
self.description
[docs]class AppliedAssay(models.Model):
appliedassay_id = models.CharField(
max_length=200, verbose_name="Applied Assay ID", null=True)
biosamplereplicate = models.ForeignKey(
BiosampleReplicate, related_name='biorep_appliedassay',
verbose_name="Biosample Replicate")
assay = models.ForeignKey(Assay, related_name='assay_appliedassay',
verbose_name="Assay")
controlled_by = models.ForeignKey(
'self', related_name='control_for',
verbose_name="Controlled By", blank=True, null=True)
user = models.ForeignKey(User, verbose_name='Added by User')
date_added = models.DateTimeField('Date Entered', auto_now_add=True)
date_edited = models.DateTimeField('Date Entered', auto_now=True)
def __unicode__(self):
return str(self.appliedassay_id)
def save(self, *args, **kwargs):
if not self.id:
super(AppliedAssay, self).save(*args, **kwargs)
self.appliedassay_id = 'DCD' + \
str(self.id).zfill(6) + 'AA'
super(AppliedAssay, self).save(*args, **kwargs)
[docs]class TechnicalReplicate(models.Model):
technicalreplicate_id = models.CharField(
max_length=200, verbose_name="Technical Replicate ID")
appliedassay = models.ForeignKey(AppliedAssay,
related_name='appliedassay_technicalreplicate')
user = models.ForeignKey(User, verbose_name='Added by User')
date_added = models.DateTimeField('Date Entered', auto_now_add=True)
date_edited = models.DateTimeField('Date Entered', auto_now=True)
def __unicode__(self):
return str(self.technicalreplicate_id)
def save(self, *args, **kwargs):
if not self.id:
super(TechnicalReplicate, self).save(*args, **kwargs)
self.technicalreplicate_id = 'DCD' + \
str(self.id).zfill(6) + 'TR'
super(TechnicalReplicate, self).save(*args, **kwargs)
[docs]class Sequencing(models.Model):
sequencing_id = models.CharField(
max_length=200, verbose_name="Sequencing ID")
technicalreplicate = models.ForeignKey(
TechnicalReplicate, verbose_name='Technical Replicate',
related_name='sequenced_by')
sequencing_lab = models.ForeignKey(
labs, verbose_name='Sequencing Lab')
platform = models.ForeignKey(platforms, verbose_name='Platform')
instrument = models.ForeignKey(
instruments, verbose_name='Instrument')
chemistry_version = models.CharField(
max_length=200, verbose_name='Chemistry Version', blank=True)
paired_end = models.BooleanField(
verbose_name='Paired End', default=False)
strand_mode = models.ForeignKey(
strand_modes, max_length=200, verbose_name='Strand',
blank=True, null=True)
max_read_length = models.IntegerField(
verbose_name='Maximum Read Length', blank=True, null=True)
sequencing_date = models.DateField(
'Sequencing Date', default="2000-01-01")
user = models.ForeignKey(User, verbose_name='Added by User')
date_added = models.DateTimeField('Date Entered', auto_now_add=True)
date_edited = models.DateTimeField('Date Entered', auto_now=True)
def __unicode__(self):
return str(self.sequencing_id) + ' : ' + str(self.platform) + \
str(self.instrument) + " from " + str(self.sequencing_lab)
# override save to give a unique formated ID
def save(self, *args, **kwargs):
if not self.id:
super(Sequencing, self).save(*args, **kwargs)
self.sequencing_id = 'DCD' + \
str(self.id).zfill(6) + 'SQ'
super(Sequencing, self).save(*args, **kwargs)
# get file name for Data instance reads (first and possibly second reads)
def get_data_fn(inst, read_number):
return os.path.join(
str(inst.sequencing.technicalreplicate.appliedassay.assay.assay_type),
str(inst.sequencing.technicalreplicate.appliedassay.biosamplereplicate.biosample.biosample_id),
'.'.join(map(str, (
inst.sequencing.technicalreplicate.appliedassay.assay.assay_id,
inst.sequencing.sequencing_id,
"USER" + str(inst.sequencing.user.username),
read_number, inst.file_type.name.lower(), 'gz')))
)
def get_file_path(inst, file_name):
return os.path.join(
str(inst.sequencing.technicalreplicate.appliedassay.assay.assay_type),
str(inst.sequencing.technicalreplicate.appliedassay.biosamplereplicate.biosample.biosample_id),
file_name)
def get_primary_data_fn(inst, filename):
if inst.file_type.name == 'FASTQ':
return get_data_fn(inst, 'R1')
else:
file_name = inst.primary_source.rsplit('|', 1)[0]
mapped_genome = unicode(inst.mapped_genome).split('/')[1]
if file_name.find(mapped_genome) == -1:
if re.match(r'.*\d*SQ\..*', file_name):
file_name = re.sub(r'(\d*SQ\.)', r'\1'+mapped_genome+'.', file_name)
else:
file_name = mapped_genome + '.' + file_name
return get_file_path(inst, file_name)
def get_secondary_data_fn(inst, filename):
if inst.file_type.name == 'FASTQ':
return get_data_fn(inst, 'R2')
else:
file_name = inst.secondary_source.rsplit('|', 1)[0]
mapped_genome = inst.mapped_genome.name.split('/')[1]
if file_name.find(mapped_genome) > -1:
file_name = re.sub(r'(\d*SQ\.)', r'\1'+mapped_genome+'.', file_name)
return get_file_path(inst, file_name)
def generate_sha(files):
sha = hashlib.sha1()
for file in files:
file.seek(0)
while True:
buf = file.read(104857600)
if not buf:
break
sha.update(buf)
sha1 = sha.hexdigest()
file.seek(0)
return sha1
[docs]class Data(models.Model):
data_id = models.CharField(
max_length=200, verbose_name="Data ID", null=True)
sequencing = models.ForeignKey(
Sequencing, verbose_name='Sequencing',
related_name='sequencing_data')
primary_file = models.FileField(
upload_to=get_primary_data_fn, verbose_name="Primary File", max_length=255)
secondary_file = models.FileField(
upload_to=get_secondary_data_fn, verbose_name="Secondary File",
null=True, max_length=255)
derived_from = models.ForeignKey(
AppliedAssay, related_name='source_of',
verbose_name="Derived from", blank=True, null=True)
derived_from_data = models.ManyToManyField(
'self', related_name='sources_of',
verbose_name="Derived from", blank=True)
# hard coded FASTQ as the first key in the json file so this
# should be stable since when the database is instantiated
# we can't have the filetypes pre-loaded
file_type = models.ForeignKey(
file_types, verbose_name="File Type", default=0)
command = models.CharField(
max_length=2000, verbose_name='Command', blank=True)
mapped_genome = models.ForeignKey(
mapped_genomes, verbose_name='Mapped Genome',
blank=True, null=True)
primary_source = models.CharField(
max_length=1000, verbose_name='Primary File Source', null=True )
secondary_source = models.CharField(
max_length=1000, verbose_name='Secondary File Source', null=True,
blank=True)
sha1 = models.CharField(
null=True,
# editable=False,
max_length=40)
version = models.ForeignKey(Versions, verbose_name='Version/Release', null=True,
blank=True)
user = models.ForeignKey(User, verbose_name='Added by User')
date_added = models.DateTimeField('Date Entered', auto_now_add=True)
date_edited = models.DateTimeField('Date Entered', auto_now=True)
def __unicode__(self):
return str(self.data_id) + ' : ' + str(self.file_type)
# override save to give a unique formated ID
def save(self, *args, **kwargs):
files = [self.primary_file]
if self.secondary_file and hasattr(self.secondary_file, 'name'):
files.append(self.secondary_file)
self.sha1 = generate_sha(files)
if not self.id:
super(Data, self).save(*args, **kwargs)
self.data_id = 'DCD' + \
str(self.id).zfill(6) + 'DT'
super(Data, self).save(*args, **kwargs)
@receiver(post_delete, sender=Data)
def submission_delete(sender, instance, **kwargs):
if instance.primary_file.name:
if os.path.isfile(instance.primary_file.path):
os.remove(instance.primary_file.path)
if instance.secondary_file.name:
if os.path.isfile(instance.secondary_file.path):
os.remove(instance.secondary_file.path)
# @receiver(models.signals.pre_save, sender=Data)
# def auto_delete_file_on_change(sender, instance, **kwargs):
# """
# Deletes old file from filesystem
# when corresponding `Data` object is updated
# with new file.
# """
# if not instance.pk:
# return False
#
# try:
# old_file = Data.objects.get(pk=instance.pk).primary_file.file
# except Data.DoesNotExist:
# return False
#
# new_file = instance.primary_file.file
# if not old_file == new_file:
# if os.path.isfile(old_file.path):
# os.remove(old_file.path)
#####end of alpha view #####
#####continue to batch upload#####
def get_batch_name(inst, filename):
return os.path.join('batch_upload_csv/', '.'.join((
str(inst.user), str(inst.isValid), filename, 'csv')))
[docs]class BatchUploads(models.Model):
csvFile = models.FileField(
upload_to=get_batch_name, verbose_name="CSV File",
max_length=1000)
user = models.ForeignKey(User, verbose_name='Added by User')
isValid = models.BooleanField()
committed = models.BooleanField()
[docs]class BatchUploadDetails(models.Model):
# batch upload fields
batchUpload = models.ForeignKey(BatchUploads)
errors = models.CharField(
max_length=10000, null=True, blank=True)
row_type = models.CharField(
max_length=50, null=True, blank=True)
# series fields
series00internal_id = models.CharField(
max_length=200, null=True, blank=True,
verbose_name='SR Internal ID')
series00series_id = models.CharField(
max_length=200, null=True, blank=True,
verbose_name='SR Series ID')
series00title = models.CharField(
max_length=1000, null=True, blank=True,
verbose_name='SR Title')
series00series_type = models.CharField(
max_length=100, null=True, blank=True,
verbose_name='SR Series Type')
series00is_public = models.CharField(
max_length=100, null=True, blank=True,
verbose_name='SR Is Public')
series00description = models.CharField(
max_length=10000, null=True, blank=True,
verbose_name='SR Description')
series00publication = models.CharField(
max_length=1000, null=True, blank=True,
verbose_name='SR Publication')
series00sra_geo_id = models.CharField(
max_length=200, null=True, blank=True,
verbose_name='SR SRA/GEO ID')
# biosample fields
biosample00internal_id = models.CharField(
max_length=200, null=True, blank=True,
verbose_name='BS Internal ID')
biosample00biosample_id = models.CharField(
max_length=200, null=True, blank=True,
verbose_name='BS Biosample ID')
biosample00biosample_type = models.CharField(
max_length=200, null=True, blank=True,
verbose_name='BS Biosample Type')
biosample00biosample_lab = models.CharField(
max_length=200, null=True, blank=True,
verbose_name='BS Lab')
biosample00genetic_background = models.CharField(
max_length=200, null=True, blank=True,
verbose_name='BS Genetic Background')
biosample00stage = models.CharField(
max_length=200, null=True, blank=True,
verbose_name='BS Stage')
biosample00controlled_by = models.CharField(
max_length=200, null=True, blank=True,
verbose_name='BS Controlled By')
biosample00anatomical_term = models.CharField(
max_length=200, null=True, blank=True,
verbose_name='BS Anatomical Term')
biosample00organism = models.CharField(
max_length=200, null=True, blank=True,
verbose_name='BS Organism')
biosample00treatment = models.CharField(
max_length=200, null=True, blank=True,
verbose_name='BS Treatment')
biosample00post_fertilization = models.CharField(
max_length=100, null=True, blank=True,
verbose_name='BS Hours Post Fertilization')
biosample00source = models.CharField(
max_length=200, null=True, blank=True,
verbose_name='BS Source')
biosample00sex = models.CharField(
max_length=200, null=True, blank=True,
verbose_name='BS Sex')
biosample00mutation_description = models.CharField(
max_length=1000, null=True, blank=True,
verbose_name='BS Mutation Description')
biosample00cell_line_type = models.CharField(
max_length=200, null=True, blank=True,
verbose_name='BS Cell Line Type')
biosample00description = models.CharField(
max_length=1000, null=True, blank=True,
verbose_name='BS Description')
# biosamplereplicate fields
biosamplereplicate00internal_id = models.CharField(
max_length=200, null=True, blank=True,
verbose_name='BR Internal ID')
biosamplereplicate00biosamplereplicate_id = models.CharField(
max_length=200, null=True, blank=True,
verbose_name='BR BiosampleReplicate ID')
# assay fields
assay00internal_id = models.CharField(
max_length=200, null=True, blank=True,
verbose_name='AS Internal ID')
assay00assay_id = models.CharField(
max_length=200, null=True, blank=True,
verbose_name='AS Assay ID')
assay00assay_type = models.CharField(
max_length=200, null=True, blank=True,
verbose_name='AS Assay Type')
assay00assay_lab = models.CharField(
max_length=200, null=True, blank=True,
verbose_name='AS Lab')
assay00description = models.CharField(
max_length=2000, null=True, blank=True,
verbose_name='AS Description')
assay00target = models.CharField(
max_length=200, null=True, blank=True,
verbose_name='AS Target')
assay00library_prep = models.CharField(
max_length=200, null=True, blank=True,
verbose_name='AS Library Preparation')
# appliedassay fields
appliedassay00internal_id = models.CharField(
max_length=200, null=True, blank=True,
verbose_name='AA Internal ID')
appliedassay00appliedassay_id = models.CharField(
max_length=200, null=True, blank=True,
verbose_name='AA Appliedassay ID')
appliedassay00controlled_by = models.CharField(
max_length=200, null=True, blank=True,
verbose_name='AA Controlled By')
# technicalreplicate fields
technicalreplicate00internal_id = models.CharField(
max_length=200, null=True, blank=True,
verbose_name='TR Internal ID')
technicalreplicate00technicalreplicate_id = models.CharField(
max_length=200, null=True, blank=True,
verbose_name='TR TechnicalReplicate ID')
# sequencing fields
sequencing00internal_id = models.CharField(
max_length=200, null=True, blank=True,
verbose_name='SQ Internal ID')
sequencing00sequencing_id = models.CharField(
max_length=200, null=True, blank=True,
verbose_name='SQ Sequencing ID')
sequencing00platform = models.CharField(
max_length=200, null=True, blank=True,
verbose_name='SQ Platform')
sequencing00sequencing_lab = models.CharField(
max_length=200, null=True, blank=True,
verbose_name='SQ Lab')
sequencing00instrument = models.CharField(
max_length=200, null=True, blank=True,
verbose_name='SQ Instrument')
sequencing00chemistry_version = models.CharField(
max_length=200, null=True, blank=True,
verbose_name='SQ Chemistry Version')
sequencing00paired_end = models.CharField(
max_length=200, null=True, blank=True,
verbose_name='SQ Paired End')
sequencing00strand_mode = models.CharField(
max_length=200, null=True, blank=True,
verbose_name='SQ Strand Mode')
sequencing00sequencing_date = models.CharField(
max_length=200, null=True, blank=True,
verbose_name = 'SQ Date')
sequencing00max_read_length = models.CharField(
max_length=200, null=True, blank=True,
verbose_name='SQ Max Read Length')
# data fields
data00url = models.CharField(
max_length=1000, null=True, blank=True,
verbose_name='DT URL')
data00local_path = models.CharField(
max_length=1000, null=True, blank=True,
verbose_name='DT Local Path')
data00secondary_url = models.CharField(
max_length=1000, null=True, blank=True,
verbose_name='DT 2nd URL')
data00secondary_local_path = models.CharField(
max_length=1000, null=True, blank=True,
verbose_name='DT 2nd Local Path')