public ActionResult Index(string[] accessions, bool importGenes)
{
return Action(() =>
{
var matterNames = new string[accessions.Length];
var savedMatterNames = new string[accessions.Length];
var results = new string[accessions.Length];
var statuses = new string[accessions.Length];
using (var db = new LibiadaWebEntities())
{
var existingAccessions = db.DnaSequence.Select(d => d.RemoteId).Distinct().ToArray();
var dnaSequenceRepository = new DnaSequenceRepository(db);
var bioSequences = NcbiHelper.GetGenBankSequences(accessions);
for (int i = 0; i < accessions.Length; i++)
{
string accession = accessions[i];
matterNames[i] = accession;
if (existingAccessions.Contains(accession) || existingAccessions.Contains(accession + ".1"))
{
results[i] = "Sequence already exists";
statuses[i] = "Exist";
continue;
}
try
{
var metadata = NcbiHelper.GetMetadata(bioSequences[i]);
if (existingAccessions.Contains(metadata.Version.CompoundAccession))
{
results[i] = "Sequence already exists";
statuses[i] = "Exist";
continue;
}
savedMatterNames[i] = NcbiHelper.ExtractSequenceName(metadata) + " | " + metadata.Version.CompoundAccession;
matterNames[i] = "Common name=" + metadata.Source.CommonName +
", Species=" + metadata.Source.Organism.Species +
", Definition=" + metadata.Definition +
", Saved matter name=" + savedMatterNames[i];
var matter = new Matter
{
Name = savedMatterNames[i],
Nature = Nature.Genetic,
Group = GroupRepository.ExtractSequenceGroup(savedMatterNames[i]),
SequenceType = SequenceTypeRepsitory.ExtractSequenceGroup(savedMatterNames[i])
};
var sequence = new CommonSequence
{
Matter = matter,
NotationId = Aliases.Notation.Nucleotide,
RemoteDbId = Aliases.RemoteDb.RemoteDbNcbi,
RemoteId = metadata.Version.CompoundAccession
};
dnaSequenceRepository.Create(sequence, bioSequences[i], metadata.Definition.ToLower().Contains("partial"));
if (importGenes)
{
try
{
using (var subsequenceImporter = new SubsequenceImporter(metadata.Features.All, sequence.Id))
{
subsequenceImporter.CreateSubsequences();
}
var nonCodingCount = db.Subsequence.Count(s => s.SequenceId == sequence.Id && s.FeatureId == Aliases.Feature.NonCodingSequence);
var featuresCount = db.Subsequence.Count(s => s.SequenceId == sequence.Id && s.FeatureId != Aliases.Feature.NonCodingSequence);
statuses[i] = "Success";
results[i] = "Successfully imported sequence and " + featuresCount + " features and " + nonCodingCount + " non coding subsequences";
}
catch (Exception exception)
{
results[i] = "successfully imported sequence but failed to import genes: " + exception.Message;
statuses[i] = "Error";
if (exception.InnerException != null)
{
results[i] += " " + exception.InnerException.Message;
}
}
}
else
{
results[i] = "successfully imported sequence";
statuses[i] = "Success";
}
}
catch (Exception exception)
{
results[i] = "Error:" + exception.Message + (exception.InnerException == null ? string.Empty : exception.InnerException.Message);
statuses[i] = "Error";
}
}
// removing matters for whitch adding of sequence failed
var orphanMatters = db.Matter.Include(m => m.Sequence).Where(m => savedMatterNames.Contains(m.Name) && m.Sequence.Count == 0).ToArray();
if (orphanMatters.Length > 0)
{
db.Matter.RemoveRange(orphanMatters);
db.SaveChanges();
}
}
return new Dictionary<string, object>
{
{ "matterNames", matterNames },
{ "results", results },
{ "status", statuses }
};
});
}