Beispiel #1
0
        private static void GetCurrentAnalysisRequest(ActionExecutingContext filterContext, GNEntityModelContainer db)
        {
            try
            {
                GNAnalysisRequest currentAnalysisRequest = null;
                string            analysisRequestId      = filterContext.HttpContext.Request["analysisRequestId"];

                if (!string.IsNullOrEmpty(analysisRequestId))
                {
                    currentAnalysisRequest = db.GNAnalysisRequests.Find(Guid.Parse(analysisRequestId));
                }

                if (currentAnalysisRequest != null)
                {
                    filterContext.Controller.ViewBag.CurrentAnalysisRequest = currentAnalysisRequest;
                }
                else
                {
                    filterContext.Controller.ViewBag.CurrentAnalysisRequest = null;
                }
            }
            catch (Exception e)
            {
                LogUtil.Error(logger, "Unable to retrieve Current AnalysisRequest!!", e);
            }
        }
Beispiel #2
0
        public override GNSample DetailsOnLoad(GNSample sample)
        {
            auditResult = audit.LogEvent(UserContact, sample.Id, this.ENTITY, this.Request.UserHostAddress, EVENT_LOAD_DETAILS_UI);

            sample.IsValidPairEnded   = ((SampleService)entityService).IsValidPairEnded(sample);
            sample.IsValidSingleEnded = ((SampleService)entityService).IsValidSingleEnded(sample);

            List <GNSampleRelationshipType> RelationshipTypes = db.GNSampleRelationshipTypes.OrderBy(a => a.MaxRelationships).ThenBy(a => a.Name).ToList();

            ViewBag.GNSampleRelationshipTypes = new SelectList(RelationshipTypes, "Id", "Name");

            if (Request["analysisRequestId"] != null)
            {
                Guid AnalysisRequestId            = Guid.Parse(Request["analysisRequestId"]);
                GNAnalysisRequest AnalysisRequest = db.GNAnalysisRequests.Where(a => a.Id.Equals(AnalysisRequestId)).FirstOrDefault();
                ViewBag.CurrentAnalysisRequest = AnalysisRequest;
                GNProject Project = db.GNProjects.Where(a => a.Id.Equals(AnalysisRequest.GNProjectId)).FirstOrDefault();
                ViewBag.CurrentProject = Project;
                Guid   TeamId = Project.Teams.FirstOrDefault().Id;
                GNTeam Team   = db.GNTeams.Where(a => a.Id.Equals(TeamId)).FirstOrDefault();
                ViewBag.CurrentTeam = Team;
            }

            return(base.DetailsOnLoad(sample));
        }
Beispiel #3
0
        private static void MarkAnalysisAsFailed(AnalysisRequestService analysisRequestService, GNAnalysisRequest analysisRequest)
        {
            if (MARK_ANALYSIS_IN_ERROR_FEATURE_ACTIVE)
            {
                try
                {
                    //get analysis request from db
                    GNAnalysisRequest ar = analysisRequestService.db.GNAnalysisRequests
                                           .Include(a => a.AnalysisType)
                                           .Include(a => a.AnalysisStatus)
                                           .Include(a => a.AnalysisResult)
                                           .Where(a => a.Id == analysisRequest.Id)
                                           .FirstOrDefault();

                    //mark analysis as failed
                    if (!ar.IsFailedRequest)
                    {
                        LogUtil.Info(logger, "Mark Analysis As Failed for AR ID [" + ar.Id + "]...");
                        System.Console.WriteLine("\nMark Analysis As Failed for AR ID [" + ar.Id + "]...");

                        analysisRequestService.MarkAnalysisAsFailed(analysisRequestService, ar);
                    }
                }
                catch (Exception e)
                {
                    LogUtil.Error(logger, "Unable to Process Failure of Analysis " + analysisRequest.Id + " : " + e.Message, e);
                }
            }
        }
Beispiel #4
0
        public bool Notify(GNAnalysisRequest analysisRequest)
        {
            LogUtil.LogMethod(logger, MethodBase.GetCurrentMethod());

            try
            {
                GNCloudFile GNCloudVCF = (from a in analysisRequest.AnalysisResult.ResultFiles
                                          where a.GNCloudFileCategoryId == 2
                                          select a).FirstOrDefault <GNCloudFile>();

                GNNewSampleBatch          batch   = analysisRequest.GNAnalysisRequestGNSamples.FirstOrDefault().GNSample.GNNewSampleBatchSample.GNNewSampleBatch;
                AnalysisCompletionMessage message = new AnalysisCompletionMessage
                {
                    analysisId   = analysisRequest.Id.ToString(),
                    batchId      = batch.BatchId,
                    project      = batch.Project,
                    repository   = batch.Repository,
                    bamViewerURL = "https://secure.genomenext.net/GNPortal-1.3/AnalysisRequests/BamViewer?analysisId=" + analysisRequest.Id.ToString(),
                    vcfFilename  = GNCloudVCF.FileURL.Replace("https://", "s3://").Replace(".s3.amazonaws.com", "")
                };

                System.Console.WriteLine("***\n ******  Sending message " + analysisRequest.CreateDateTime);
                this.SendMessage(message);
            }
            catch (Exception e1)
            {
                System.Console.WriteLine("***\n ******  Exception Sending message " + e1.InnerException + e1.Message + e1.StackTrace);
                Exception e2 = new Exception("Unable to send notification to queue.", e1);
                LogUtil.Warn(logger, e2.Message, e2);
                return(false);
            }

            return(true);
        }
Beispiel #5
0
        public async Task <bool> AutostartAnalysis(GNAnalysisRequest analysis)
        {
            AnalysisRequestService analysisService = new AnalysisRequestService(db);
            GNContact userContact = db.GNContacts.Find(Guid.Parse("0750f896-e7d6-48d4-a1b9-007059f62784"));
            await analysisService.StartAnalysis(userContact, analysis.Id);

            return(true);
        }
        public async Task <ActionResult> List()
        {
            PopulateSelectLists();
            EvalCanCreate();

            Dictionary <string, object> filters = new Dictionary <string, object>();

            List <GNTemplate> GNTemplates = new List <GNTemplate>();

            if (!string.IsNullOrEmpty(Request["analysisRequestId"]))
            {
                Guid guidAnalysisRequest          = Guid.Parse(Request["analysisRequestId"]);
                GNAnalysisRequest AnalysisRequest = db.GNAnalysisRequests.Where(a => a.Id.Equals(guidAnalysisRequest)).FirstOrDefault();
                ViewBag.AnalysisRequest   = AnalysisRequest;
                ViewBag.AnalysisName      = AnalysisRequest.Description;
                ViewBag.AnalysisRequestId = guidAnalysisRequest;
            }

            if (!string.IsNullOrEmpty(Request["addSampleRelationship"]))
            {
                int  sampleRel  = Int32.Parse(Request["GNSampleRelationshipTypeId"]);
                Guid thisSample = Guid.Parse(Request["GNLeftSampleId"]);

                int maxRelAllowed        = db.GNSampleRelationshipTypes.Where(a => a.Id == sampleRel).Select(b => b.MaxRelationships).FirstOrDefault();
                int thisSampleRelIdCount = db.GNSampleRelationships.Where(a => a.GNLeftSampleId.Equals(thisSample) && a.GNSampleRelationshipTypeId == sampleRel).Count();

                if (thisSampleRelIdCount < maxRelAllowed)
                {
                    //continue
                    filters.Add("Gender", db.GNSampleRelationshipTypes.Where(a => a.Id == sampleRel).Select(b => b.Gender).FirstOrDefault());
                    filters.Add("GNOrganizationId", Request["GNOrganizationId"]);
                    filters.Add("GNLeftSampleId", Request["GNLeftSampleId"]);
                    GNTemplates = await this.entityService.FindAll(UserContact, IndexStart(), IndexEnd(), filters);
                }
                else
                {
                    string sampleRelName = db.GNSampleRelationshipTypes.Where(a => a.Id == sampleRel).Select(b => b.Name).FirstOrDefault();

                    //return error and return to the Details page
                    string add_s = "";
                    if (thisSampleRelIdCount > 1)
                    {
                        add_s = "s";
                    }
                    ViewBag.PedigreeErrorMessage = "This Sample already has " + thisSampleRelIdCount + " " + sampleRelName.ToLower() + add_s + ", the maximum number allowed.";
                    GNSample sample = db.GNSamples.Where(a => a.Id.Equals(thisSample)).FirstOrDefault();
                }
            }

            GNTemplates = await this.entityService.FindAll(UserContact, IndexStart(), IndexEnd(), filters);

            return(View(GNTemplates));
        }
Beispiel #7
0
        private static void ReStartFailedAnalysis(AnalysisRequestService analysisRequestService, GNAnalysisRequest analysisRequest)
        {
            if (RESTART_ANALYSIS_FEATURE_ACTIVE)
            {
                try
                {
                    //get analysis request from db
                    GNAnalysisRequest ar = analysisRequestService.db.GNAnalysisRequests
                                           .Include(a => a.AnalysisType)
                                           .Include(a => a.GNAnalysisRequestGNSamples.Select(s => s.GNSample).Select(s => s.CloudFiles))
                                           .Include(a => a.AnalysisStatus)
                                           .Include(a => a.AnalysisResult)
                                           .Where(a => a.Id == analysisRequest.Id)
                                           .FirstOrDefault();

                    //determine if analysis re-start is allowed
                    ar = analysisRequestService.IsValidSampleSet(ar);
                    ar.CanReStartAnalysis = analysisRequestService.IsAnalysisRestartAllowed(ar, FORCE_RESTART_ANALYSIS);

                    //restart analysis
                    if (ar.CanReStartAnalysis && ar.IsFailedRequest)
                    {
                        LogUtil.Info(logger, "Restart Analysis for AR ID [" + ar.Id + "]...");
                        System.Console.WriteLine("\nRestart Analysis for AR ID [" + ar.Id + "]...");

                        var t = Task.Run(async delegate
                        {
                            var arService = new AnalysisRequestService(new GNEntityModelContainer(), new IdentityModelContainer());

                            //get user contact
                            GNContact userContact = arService.db.GNContacts.Find(ar.CreatedBy);

                            if (arService.analysisRequestPendingCloudMessageService == null || arService.cloudStorageService == null)
                            {
                                arService.InitCloudServices(userContact.GNOrganization.AWSConfigId);
                            }

                            await arService.StartAnalysis(userContact, ar.Id);
                        });
                    }
                    else
                    {
                        LogUtil.Info(logger, "UNABLE to Restart Analysis for AR ID [" + ar.Id + "]...");
                        System.Console.WriteLine("\nUNABLE to Restart Analysis for AR ID [" + ar.Id + "]...");
                    }
                }
                catch (Exception e)
                {
                    LogUtil.Error(logger, "Unable to Process Failure of Analysis " + analysisRequest.Id + " : " + e.Message, e);
                }
            }
        }
Beispiel #8
0
        public async Task <ActionResult> RemoveFromAnalysisRequest(Guid?id)
        {
            string analysisRequestId = Request["analysisRequestId"];
            bool   returnToAnalysis  = (string.IsNullOrEmpty(Request["returnToAnalysis"]) ? false : bool.Parse(Request["returnToAnalysis"]));

            if (id != null && !string.IsNullOrEmpty(analysisRequestId))
            {
                int result = await((SampleService)entityService).RemoveSampleFromAnalysisRequest(id, analysisRequestId);

                //tfrege 2016.03.21 Check if also a group Id was passed (in which case it's an RNA sample)
                if (!string.IsNullOrEmpty(Request["GroupId"]))
                {
                    int result2 = await((SampleService)entityService).RemoveSampleFromAnalysisRequestGroup(id, Guid.Parse(Request["GroupId"]));
                }

                if (returnToAnalysis)
                {
                    Guid GAnalysisRequestId           = Guid.Parse(analysisRequestId);
                    GNAnalysisRequest analysisRequest = db.GNAnalysisRequests.Where(a => a.Id.Equals(GAnalysisRequestId)).FirstOrDefault();
                    if (analysisRequest.GNAnalysisRequestTypeCode == "DNA")
                    {
                        return(RedirectToAction("Edit", "AnalysisRequests", new { id = analysisRequestId }));
                    }
                    else
                    {
                        return(RedirectToAction("Details", "AnalysisRequests", new { id = analysisRequestId }));
                    }
                }
                else
                {
                    Guid sampleId = Guid.Parse(id.ToString());

                    auditResult = audit.LogEvent(UserContact, sampleId, this.ENTITY, this.Request.UserHostAddress, "REMOVE_FROM_ANALYSIS " + analysisRequestId.ToString());

                    int addedSampleTypeId = db.GNSamples.Where(a => a.Id.Equals(sampleId)).FirstOrDefault().GNSampleTypeId;
                    //return RedirectToAction("List", "Samples", new { analysisRequestId = analysisRequestId, GNSampleTypeId = addedSampleTypeId });

                    if (!string.IsNullOrEmpty(Request["GroupId"]))
                    {
                        return(RedirectToAction("List", "Samples", new { analysisRequestId = analysisRequestId, GNSampleTypeId = addedSampleTypeId, GroupId = Request["GroupId"] }));
                    }
                    else
                    {
                        return(RedirectToAction("List", "Samples", new { analysisRequestId = analysisRequestId, GNSampleTypeId = addedSampleTypeId }));
                    }
                }
            }

            ViewBag.AnalysisRequestId = analysisRequestId;

            return(View());
        }
        public bool NotifyQCSystem(GNAnalysisRequest analysisRequest, string bucket, string key)
        {
            LogUtil.LogMethod(logger, MethodBase.GetCurrentMethod());

            string fileLocation = bucket + "/" + key;
            string vcfPaths     = "s3://" + bucket + "/" + key;
            string fileName     = key.Substring(key.LastIndexOf("/") + 1);

            fileLocation = fileLocation.Substring(0, (fileLocation.LastIndexOf("/")));

            try
            {
                StartVcfStatsReport startStatsReport = new StartVcfStatsReport
                {
                    entityId     = analysisRequest.Id.ToString(),
                    entityType   = "ANALYSIS",
                    fileLocation = fileLocation,
                    filename     = fileName,
                    vcfPaths     = vcfPaths
                };

                string filename = analysisRequest.Id.ToString() + ".txt";
                //string filename = "gn_sample_vcfqc.json";
                //System.Threading.Thread.Sleep(5000);

                System.Console.WriteLine("***\n ******  Sending message " + analysisRequest.CreateDateTime);
                this.SendMessage(startStatsReport);
                this.StoreMessage(startStatsReport, "telma.gn.com", filename);
            }
            catch (Exception e1)
            {
                System.Console.WriteLine("***\n ******  Exception Sending message " + e1.InnerException + e1.Message + e1.StackTrace);
                Exception e2 = new Exception("Unable to send notification to queue.", e1);
                LogUtil.Warn(logger, e2.Message, e2);
                return(false);
            }

            return(true);
        }
Beispiel #10
0
        private static void TerminateInstancesForAnalysis(GNAnalysisRequest analysisRequest)
        {
            List <Reservation> analysisMasterInstances = null;
            List <Reservation> analysisWorkerInstances = null;

            if (TERMINATE_INSTANCE_FEATURE_ACTIVE)
            {
                LogUtil.Info(logger, "Terminating Instances for AR ID [" + analysisRequest.Id + "]...");
                System.Console.WriteLine("\nTerminating Instances for AR ID [" + analysisRequest.Id + "]...");

                try
                {
                    //lookup analysis master instances
                    analysisMasterInstances = cloudComputeService.GetComputeInstances(
                        new Dictionary <string, List <string> >
                    {
                        { "Name", new List <string> {
                              "churchill_" + analysisRequest.Id + "_master"
                          } }
                    });

                    //lookup analysis worker instances
                    analysisWorkerInstances = cloudComputeService.GetComputeInstances(
                        new Dictionary <string, List <string> >
                    {
                        { "Name", new List <string> {
                              "churchill_" + analysisRequest.Id + "_worker"
                          } }
                    });

                    //send termination commands to stale AWS instances
                    try
                    {
                        List <string> instancesToTerminate = new List <string>();

                        //terminate master instances
                        if (analysisMasterInstances != null && analysisMasterInstances.Sum(r => r.Instances.Count) != 0)
                        {
                            instancesToTerminate.AddRange(
                                analysisMasterInstances.SelectMany(r => r.Instances).Select(i => i.InstanceId).ToList());
                        }

                        //terminate worker instances
                        if (analysisWorkerInstances != null && analysisWorkerInstances.Sum(r => r.Instances.Count) != 0)
                        {
                            instancesToTerminate.AddRange(
                                analysisWorkerInstances.SelectMany(r => r.Instances).Select(i => i.InstanceId).ToList());
                        }

                        //submit instance termination request to AWS
                        if (instancesToTerminate != null && instancesToTerminate.Count != 0)
                        {
                            var terminateResult = cloudComputeService.TerminateComputeInstances(instancesToTerminate);
                        }
                    }
                    catch (Exception e)
                    {
                        LogUtil.Error(logger, "Unable to Terminate Instances for stale Analysis " + analysisRequest.Id + " : " + e.Message, e);
                    }
                }
                catch (Exception e)
                {
                    LogUtil.Error(logger, "Unable to Lookup Instances for stale Analysis " + analysisRequest.Id + " : " + e.Message, e);
                }
            }
        }
        public async Task <bool> ProcessQCMessage(NewSampleBatchStatus newSampleMessageStatus)
        {
            System.Console.WriteLine("QCQCQC " + newSampleMessageStatus.name);

            try
            {
                GNCloudFileCategory fileCategory = db.GNCloudFileCategories.Where(a => a.Id == 1).FirstOrDefault();

                string sampleName1 = newSampleMessageStatus.name;
                string sampleName  = sampleName1.Substring(0, sampleName1.IndexOf("_"));
                //s3://sanford-fastq/151204_SN7001383_0164_AC7Y91ACXX/FASTQ/fastqc/AAA076960/AAA076960_S6_R2_001/

                GNSample sample = db.GNSamples.Where(a => a.Name.Equals(sampleName) && a.IsReady == false).FirstOrDefault();

                GNCloudStorageService st = new GNCloudStorageService();
                string volume            = "dev-gn-s3-01";

                Guid   fileId        = Guid.NewGuid();
                string folderPath    = "fastq/" + sample.Id + "/" + fileId + "/";
                string fastqFileName = folderPath + newSampleMessageStatus.name + ".fastq.gz";
                string fileURL       = "https://dev-gn-s3-01.s3.amazonaws.com/" + fastqFileName;

                string originBucket = newSampleMessageStatus.filesBucket;
                originBucket = originBucket.Replace("s3://", "");
                originBucket = originBucket.Substring(0, originBucket.IndexOf("/")); //"sanford-fastq";

                string QcOriginKey = newSampleMessageStatus.filesBucket;
                QcOriginKey = QcOriginKey.Replace("s3://", "");
                QcOriginKey = QcOriginKey.Substring(originBucket.Length + 1);

                string FileDescription = newSampleMessageStatus.name + ".fastq.gz";
                string fastqOriginKey  = QcOriginKey.Substring(0, QcOriginKey.IndexOf("FASTQ/") + 5);
                fastqOriginKey = fastqOriginKey + "/" + FileDescription;

                QcOriginKey = QcOriginKey + "fastqc_report.html";


                string destinationBucket = "dev-gn-s3-01/" + folderPath;
                destinationBucket = "dev-gn-s3-01";
                string QcFileName       = folderPath + "fastqc_report.html";
                string QcDestinationURL = "https://dev-gn-s3-01.s3.amazonaws.com/" + QcFileName;

                st.CopyS3Object(originBucket, fastqOriginKey, destinationBucket, fastqFileName);
                st.CopyS3Object(originBucket, QcOriginKey, destinationBucket, QcFileName);


                GNCloudFile cloudFile = new GNCloudFile
                {
                    Id = fileId,
                    GNCloudFileCategoryId = fileCategory.Id, //FASTQ
                    CloudFileCategory     = fileCategory,
                    FileName            = folderPath + fastqFileName,
                    FileURL             = fileURL,
                    FolderPath          = folderPath,
                    Volume              = volume,
                    Description         = fastqFileName,
                    FileSize            = st.GetObjectSize(originBucket, fastqOriginKey),
                    AWSRegionSystemName = db.AWSRegions.FirstOrDefault().AWSRegionSystemName,
                    CreateDateTime      = DateTime.Now,
                    CreatedBy           = Guid.Parse("0750f896-e7d6-48d4-a1b9-007059f62784"),
                    SampleId            = sample.Id.ToString(),
                    PassedQC            = (newSampleMessageStatus.isError.Equals("false")),
                    QcReportLocation    = QcDestinationURL
                };
                db.GNCloudFiles.Add(cloudFile);
                sample.CloudFiles.Add(cloudFile);

                if (sample.CloudFiles.Count() == 2 && sample.CloudFiles.Where(a => a.PassedQC == false).Count() == 0)
                {
                    sample.IsReady = true;

                    if (sample.GNNewSampleBatchSample.GNNewSampleBatch.AutoStartAnalysis)
                    {
                        GNAnalysisRequest      analysis        = sample.GNAnalysisRequestGNSamples.FirstOrDefault().GNAnalysisRequest;
                        AnalysisRequestService analysisService = new AnalysisRequestService(db);
                        GNContact userContact = db.GNContacts.Find(Guid.Parse("0750f896-e7d6-48d4-a1b9-007059f62784"));
                        await analysisService.StartAnalysis(userContact, analysis.Id);
                    }
                }

                db.SaveChanges();
            }
            catch (Exception e)
            {
                System.Console.WriteLine("***Unable to Update QC-COMPLETED status. " + e.Message + e.StackTrace + " **********************************");
                Exception e2 = new Exception("Unable to Update QC-COMPLETED status.", e);
                LogUtil.Warn(logger, e2.Message, e2);
                return(false);
            }


            return(true);
        }
        public override bool ProcessMessage(NewSampleBatch newSampleMessage, object queueMessage)
        {
            System.Console.WriteLine("***\n ****** Batch Id: " + newSampleMessage.batchId);
            System.Console.WriteLine("***\n ****** Sample type: " + newSampleMessage.type);
            System.Console.WriteLine("***\n ****** Sample repositoryId: " + newSampleMessage.repositoryId);

            SampleResponseService sampleResponseService = new SampleResponseService();

            GNOrganization Organization = db.GNOrganizations.Where(a => a.Repository.Equals(newSampleMessage.repositoryId)).FirstOrDefault();

            //Find sequencer job
            GNSequencerJob sequencerJob = db.GNSequencerJobs.Where(a => a.GNOrganizationId.Equals(Organization.Id) && a.Project.Equals(newSampleMessage.project)).FirstOrDefault();

            sequencerJob.Status = "PROCESSING SAMPLES";

            GNNewSampleBatch newSampleBatch = new GNNewSampleBatch {
                Id                      = Guid.NewGuid(),
                BatchId                 = newSampleMessage.batchId,
                GNSequencerJobId        = sequencerJob.Id,
                GNSequencerJob          = sequencerJob,
                Project                 = newSampleMessage.project,
                AutoStartAnalysis       = (newSampleMessage.autoStartAnalysis.Equals("true")),
                CreateAnalysisPerSample = (newSampleMessage.createAnalysisPerSample.Equals("true")),
                Qualifier               = newSampleMessage.qualifier,
                Type                    = newSampleMessage.type,
                RepositoryId            = newSampleMessage.repositoryId,
                Gender                  = newSampleMessage.gender,
                ReadType                = newSampleMessage.read,
                TotalSamples            = newSampleMessage.samples.Count(),
                TotalSamplesCompleted   = 0,
                CreateDateTime          = DateTime.Now
            };

            db.GNNewSampleBatches.Add(newSampleBatch);

            db.SaveChanges();

            bool success = false;

            try
            {
                GNSampleType type = db.GNSampleTypes.Where(a => a.Name.Equals(newSampleMessage.type.ToUpper())).FirstOrDefault();

                System.Console.WriteLine("***\n  type " + type.Name);

                System.Console.WriteLine("***\n  Organization " + Organization.Name);

                GNTeam         newTeam      = null;
                GNProject      newProject   = null;
                GNAnalysisType analysisType = null;
                String         AnalysisCode = newSampleMessage.qualifier;
                if (newSampleBatch.CreateAnalysisPerSample)
                {
                    /**
                     * 1. Create a Team
                     * 2. Create a Project
                     */
                    GNContact contact = db.GNContacts.Find(Organization.GNContactId);

                    newTeam = new GNTeam
                    {
                        Id             = Guid.NewGuid(),
                        CreateDateTime = DateTime.Now,
                        CreatedBy      = Guid.Parse("0750f896-e7d6-48d4-a1b9-007059f62784"),
                        Name           = "TeamBatch" + newSampleBatch.BatchId.Substring(0, 15),
                        GNContactId    = contact.Id,
                        Organization   = Organization,
                        OrganizationId = Organization.Id,
                        TeamLead       = contact
                    };
                    db.GNTeams.Add(newTeam);
                    db.SaveChanges();
                    System.Console.WriteLine("***\n  New newTeam Created: " + newTeam.Id);

                    newProject = new GNProject
                    {
                        Id             = Guid.NewGuid(),
                        CreateDateTime = DateTime.Now,
                        CreatedBy      = Guid.Parse("0750f896-e7d6-48d4-a1b9-007059f62784"),
                        ProjectLead    = contact,
                        ProjectLeadId  = contact.Id.ToString(),
                        Name           = "ProjectBatch-" + newSampleBatch.BatchId.Substring(0, 15),
                        TeamId         = newTeam.Id.ToString(),
                        StartDate      = DateTime.Now,
                        EndDate        = DateTime.Now.AddDays(30),
                        Description    = "Created automatically from the Sample Batch Process"
                    };

                    System.Console.WriteLine("***\n  New newProject Created: " + newProject.Id);

                    newTeam.Projects.Add(newProject);
                    newProject.Teams.Add(newTeam);
                    db.GNProjects.Add(newProject);

                    db.SaveChanges();

                    if (newSampleMessage.qualifier.Equals("TUMOR"))
                    {
                        AnalysisCode = "TUMORNORMAL";
                    }
                    analysisType = db.GNAnalysisTypes.Where(a => a.Name.Equals(newSampleMessage.type.ToUpper())).FirstOrDefault();
                }

                foreach (String sampleName in newSampleMessage.samples)
                {
                    String   newSampleName   = sampleName;
                    GNSample sampleExist     = db.GNSamples.Where(a => a.Name.Equals(sampleName) && a.GNOrganizationId.Equals(Organization.Id)).FirstOrDefault();
                    bool     createNewSample = false;
                    if (sampleExist != null)
                    {
                        if (sampleExist.IsReady)
                        {
                            //the sample is ready, let's create a new one with a suffix of (1)
                            newSampleName   = sampleName + " (1)";
                            createNewSample = true;
                        }
                        else
                        {
                            //the sample is in the middle of being created, so ignore the message
                            createNewSample = false;
                        }
                    }
                    else
                    {
                        createNewSample = true;
                    }

                    try
                    {
                        if (createNewSample)
                        {
                            GNSample newSample = new GNSample
                            {
                                Id = Guid.NewGuid(),
                                GNOrganizationId      = Organization.Id,
                                Name                  = newSampleName,
                                Gender                = newSampleMessage.gender,
                                GNSampleTypeId        = type.Id,
                                GNSampleQualifierCode = newSampleMessage.qualifier,
                                IsReady               = false,
                                IsPairEnded           = (newSampleMessage.read == "paired-end"),
                                CreateDateTime        = DateTime.Now,
                                CreatedBy             = Guid.Parse("0750f896-e7d6-48d4-a1b9-007059f62784")
                            };

                            db.GNSamples.Add(newSample);

                            db.SaveChanges();
                            System.Console.WriteLine("***\n  New Sample Created: " + newSample.Id);

                            GNNewSampleBatchSamples batchSample = new GNNewSampleBatchSamples {
                                Id                 = Guid.NewGuid(),
                                GNSample           = newSample,
                                CreateDateTime     = DateTime.Now,
                                GNNewSampleBatch   = newSampleBatch,
                                GNNewSampleBatchId = newSampleBatch.Id,
                                Name               = sampleName
                            };
                            db.GNNewSampleBatchSamples.Add(batchSample);

                            db.SaveChanges();
                            System.Console.WriteLine("***\n  New batchSample Created: " + batchSample.Id);

                            GNNewSampleBatchStatus batchStatus = new GNNewSampleBatchStatus {
                                Id                 = Guid.NewGuid(),
                                CreateDateTime     = DateTime.Now,
                                GNNewSampleBatch   = newSampleBatch,
                                GNNewSampleBatchId = newSampleBatch.Id,
                                IsError            = false,
                                PercentComplete    = 0,
                                Status             = "STARTING PROCESS",
                                RepositoryId       = newSampleMessage.repositoryId
                            };
                            db.GNNewSampleBatchStatus.Add(batchStatus);
                            db.SaveChanges();
                            System.Console.WriteLine("***\n  New batchStatus Created: " + batchStatus.Id);


                            if (newSampleBatch.CreateAnalysisPerSample)
                            {
                                GNAnalysisRequest newAnalysis = new GNAnalysisRequest {
                                    Id                        = Guid.NewGuid(),
                                    Project                   = newProject,
                                    GNProjectId               = newProject.Id,
                                    CreateDateTime            = DateTime.Now,
                                    CreatedBy                 = Guid.Parse("0750f896-e7d6-48d4-a1b9-007059f62784"),
                                    AnalysisType              = analysisType,
                                    RequestProgress           = 0, RequestDateTime = DateTime.Now,
                                    GNAnalysisRequestTypeCode = AnalysisCode,
                                    Description               = newSampleName,
                                    GNAnalysisAdaptorCode     = "NONE",
                                    AnalysisTypeId            = analysisType.Id.ToString(),
                                    AutoStart                 = newSampleBatch.AutoStartAnalysis,
                                    AWSRegionSystemName       = db.AWSRegions.FirstOrDefault().AWSRegionSystemName
                                };
                                db.GNAnalysisRequests.Add(newAnalysis);

                                db.SaveChanges();
                                System.Console.WriteLine("***\n  New newAnalysis Created: " + newAnalysis.Id);


                                GNAnalysisRequestGNSample newAnalysisSample = new GNAnalysisRequestGNSample {
                                    AffectedIndicator   = "N",
                                    TargetIndicator     = "N",
                                    GNAnalysisRequest   = newAnalysis,
                                    GNSample            = newSample,
                                    GNAnalysisRequestId = newAnalysis.Id,
                                    GNSampleId          = newSample.Id
                                };
                                db.GNAnalysisRequestGNSamples.Add(newAnalysisSample);
                            } //end of "if(newSampleBatch.CreateAnalysisPerSample)"

                            System.Console.WriteLine("***\n  Sample Name: " + sampleName);

                            //Notify BCL2FASTQ service
                            sampleResponseService.NotifyBcl2FastqSystem(newSample, newSampleBatch.RepositoryId);
                        }

                        db.SaveChanges();
                    }
                    catch (Exception e1)
                    {
                        System.Console.WriteLine("***\n  Exception: " + e1.Message + e1.InnerException);
                    }
                }

                System.Console.WriteLine("***\n  EVERYTHING WORKED!");

                //NOTIFY USER
                bool notifySuccess =
                    new GenomeNext.App.NotificationCloudMessageService().NotifyGNContact(
                        "SAMPLE_CREATION",
                        "*****@*****.**",
                        "Sample Creation",
                        new Dictionary <string, string>
                {
                    { "BatchId", newSampleMessage.batchId },
                    { "TotalSamples", newSampleBatch.TotalSamples.ToString() },
                    { "CreatorName", Organization.OrgMainContact.FullName },
                    { "CreateDateTime", DateTime.Now.ToString() }
                });
                success = true;
            }
            catch (Exception e1)
            {
                Exception e2 = new Exception("Unable to Create New Sample.", e1);
                LogUtil.Warn(logger, e2.Message, e2);
                success = false;
            }
            return(success);
        }
Beispiel #13
0
        /**
         * JSON Format
         */
        public void PrepareBamViewer(GNAnalysisRequest analysisRequest)
        {
            GNCloudFile GNCloudVCF = (from a in analysisRequest.AnalysisResult.ResultFiles
                                      where a.GNCloudFileCategoryId == 2
                                      select a).FirstOrDefault <GNCloudFile>();
            string vcfFilePath  = GNCloudVCF.FileURL.Substring(0, GNCloudVCF.Description.LastIndexOf('/'));
            string vcfFile      = GNCloudVCF.Description.Substring(GNCloudVCF.Description.LastIndexOf('/') + 1);
            string fileContents = "";
            //List<string>.Enumerator enumerator = samplesSelected.GetEnumerator();


            BamConfigFile bamRequest = new BamConfigFile();

            bamRequest.analysisId           = analysisRequest.Id.ToString();
            bamRequest.analysisDescription  = analysisRequest.Description;
            bamRequest.vcfFilename          = vcfFile;
            bamRequest.listOfSamples        = new List <AnalysisResultSample>();
            bamRequest.totalNumberOfSamples = analysisRequest.GNAnalysisRequestGNSamples.Count();

            try
            {
                int lineNum = 0;
                foreach (GNAnalysisRequestGNSample analysisSampleInput in analysisRequest.GNAnalysisRequestGNSamples)
                {
                    lineNum++;
                    GNSample sampleInput     = analysisSampleInput.GNSample;
                    string   sampleInputName = sampleInput.Name;
                    sampleInputName = sampleInputName.Replace(" ", "_").Replace("(", "_").Replace(")", "_").ToUpper();

                    string baiFile = analysisRequest.AnalysisResult.ResultFiles.Where(a => a.FileName.Contains(sampleInputName) && a.FileName.Contains("bai")).FirstOrDefault().FileName;
                    string bamFile = analysisRequest.AnalysisResult.ResultFiles.Where(a => a.FileName.Contains(sampleInputName) && a.FileName.Contains("bam") && !a.FileName.Contains("bai")).FirstOrDefault().FileName;
                    string item    = bamFile + " " + baiFile + " " + analysisRequest.Id.ToString() + " " + vcfFile + " " + sampleInput.Name + " " + lineNum + " " + analysisRequest.Description.Replace(" ", "_").Trim().ToUpper();

                    fileContents = fileContents + item + "\n";

                    //   await this.transactionService.CreateBillingTransactionsPerAnalysisSample(userContact, analysisRequest, analysisRequest.AnalysisType.Name, analysisRequest.Description, false, false, "REPORT_BAM_VIEWER", sampleInput);
                    bamRequest.listOfSamples.Add(new AnalysisResultSample
                    {
                        index       = lineNum,
                        sampleId    = sampleInput.Id.ToString(),
                        name        = sampleInputName,
                        baiFilename = baiFile,
                        bamFilename = bamFile
                    }
                                                 );
                }
            }
            catch (Exception e)
            {
                logger.Error("Error while launching BAM Viewer " + e.Message);
            }

            GNNewSampleBatch batch = analysisRequest.GNAnalysisRequestGNSamples.FirstOrDefault().GNSample.GNNewSampleBatchSample.GNNewSampleBatch;

            BamViewerRequest bamViewerRequest = new BamViewerRequest {
                bamViewerURL  = vcfFilePath,
                batchId       = batch.BatchId,
                organization  = batch.GNSequencerJob.GNOrganization.Name,
                project       = batch.GNSequencerJob.Project,
                repository    = batch.Repository,
                vcfFilepath   = vcfFilePath,
                bamConfigFile = bamRequest
            };

            try
            {
                System.Console.WriteLine("***\n ******  Sending message ");
                this.SendMessage(bamViewerRequest);
            }
            catch (Exception exception)
            {
                logger.Error(exception.Message);
                throw;
            }
        }
Beispiel #14
0
        /**
         * For this batch:
         *  - Add a status of 90%: Running quality control
         *  - Check that each sample:
         *      - Has at least one file
         *      - If the sample is pair-ended, it has an even number of files
         *      - If so, change to "is ready"
         *  If the batch has the "start analysis" in true, start analyses
         *  Log errors if apply
         *  Change status to 100% if no errors were found
         */
        public void QualityControl(GNNewSampleBatch Batch)
        {
            bool result = true;
            GNNewSampleBatchStatus batchStatus = new GNNewSampleBatchStatus
            {
                Id                 = Guid.NewGuid(),
                CreateDateTime     = DateTime.Now,
                GNNewSampleBatch   = Batch,
                GNNewSampleBatchId = Batch.Id,
                IsError            = false,
                PercentComplete    = 90,
                Status             = "RUNNING QUALITY CONTROL",
                Repository         = Batch.Repository,
                Message            = ""
            };

            db.GNNewSampleBatchStatus.Add(batchStatus);

            string errorMessage = "";

            foreach (GNNewSampleBatchSamples BatchSample in Batch.GNNewSampleBatchSamples)
            {
                GNSample sample = BatchSample.GNSample;
                if (sample.IsPairEnded && sample.CloudFiles.Count() > 0 && sample.CloudFiles.Count() % 2 == 0)
                {
                    sample.IsReady = true;
                }
                else if (!sample.IsPairEnded && sample.CloudFiles.Count() > 0 && sample.CloudFiles.Count() % 2 == 1)
                {
                    sample.IsReady = true;
                }
                else
                {
                    errorMessage += "Sample " + sample.Id.ToString() + "doesn't have the right number of files.\n";
                    result        = false;
                }
            }

            if (result && Batch.AutoStartAnalysis)
            {
                GNNewSampleBatchStatus batchStatus2 = new GNNewSampleBatchStatus
                {
                    Id                 = Guid.NewGuid(),
                    CreateDateTime     = DateTime.Now,
                    GNNewSampleBatch   = Batch,
                    GNNewSampleBatchId = Batch.Id,
                    IsError            = false,
                    PercentComplete    = 95,
                    Status             = "STARTING ANALYSIS",
                    Repository         = Batch.Repository,
                    Message            = ""
                };
                db.GNNewSampleBatchStatus.Add(batchStatus2);

                List <GNAnalysisRequest> analysisRequestsToStart = new List <GNAnalysisRequest>();
                foreach (GNNewSampleBatchSamples BatchSample in Batch.GNNewSampleBatchSamples)
                {
                    GNSample          sample   = BatchSample.GNSample;
                    GNAnalysisRequest analysis = sample.GNAnalysisRequestGNSamples.FirstOrDefault().GNAnalysisRequest;
                    if (!analysisRequestsToStart.Contains(analysis))
                    {
                        analysisRequestsToStart.Add(analysis);
                    }
                }

                foreach (GNAnalysisRequest analysis in analysisRequestsToStart)
                {
                    this.AutostartAnalysis(analysis);
                }

                GNNewSampleBatchStatus batchStatus3 = new GNNewSampleBatchStatus
                {
                    Id                 = Guid.NewGuid(),
                    CreateDateTime     = DateTime.Now,
                    GNNewSampleBatch   = Batch,
                    GNNewSampleBatchId = Batch.Id,
                    IsError            = false,
                    PercentComplete    = 100,
                    Status             = "COMPLETED",
                    Repository         = Batch.Repository,
                    Message            = ""
                };
                db.GNNewSampleBatchStatus.Add(batchStatus3);

                this.NotifyEndOfBatch(Batch);
            }

            if (!result)
            {
                GNNewSampleBatchStatus batchStatus4 = new GNNewSampleBatchStatus
                {
                    Id                 = Guid.NewGuid(),
                    CreateDateTime     = DateTime.Now,
                    GNNewSampleBatch   = Batch,
                    GNNewSampleBatchId = Batch.Id,
                    IsError            = true,
                    PercentComplete    = 92,
                    Status             = "ERRORS DETECTED",
                    Repository         = Batch.Repository,
                    Message            = ""
                };
                db.GNNewSampleBatchStatus.Add(batchStatus4);
                this.NotifyErrorAtEndOfBatch(Batch, errorMessage);
            }

            db.SaveChanges();
        }
Beispiel #15
0
        public override bool ProcessMessage(NewSampleBatch newSampleMessage, object queueMessage)
        {
            System.Console.WriteLine("***\n ****** Batch Id: " + newSampleMessage.batchId);
            System.Console.WriteLine("***\n ****** Sample type: " + newSampleMessage.type);
            System.Console.WriteLine("***\n ****** Sample repository: " + newSampleMessage.repository);

            SampleResponseService sampleResponseService = new SampleResponseService();

            List <GNSample> listOfSamples = new List <GNSample>();
            List <GNNewSampleBatchSamples> listOfBatchSamples = new List <GNNewSampleBatchSamples>();
            List <String> listOfAnalysisNames = new List <String>();

            GNOrganization Organization = db.GNOrganizations.Where(a => a.Repository.Equals(newSampleMessage.repository)).FirstOrDefault();

            System.Console.WriteLine("***\n  Organization " + Organization.Name);
            System.Console.WriteLine("***\n  Organization Id " + Organization.Id);
            System.Console.WriteLine("***\n  Project " + newSampleMessage.project);


            bool success = false;

            try
            {
                System.Console.WriteLine("***\n  Searching sequencerJob ");

                //Find sequencer job
                GNSequencerJob sequencerJob = db.GNSequencerJobs.Where(a => a.GNOrganizationId.Equals(Organization.Id) && a.Project.Equals(newSampleMessage.project)).FirstOrDefault();
                if (sequencerJob == null)
                {
                    throw new Exception("Unable to find Sequencer Job!");
                }

                sequencerJob.Status = "PROCESSING SAMPLES";

                System.Console.WriteLine("***\n  Starting.  sequencerJob project: " + sequencerJob.Project);

                GNProject newProject = sequencerJob.GNProject;
                GNTeam    newTeam    = newProject.Teams.FirstOrDefault();

                GNNewSampleBatch newSampleBatch = new GNNewSampleBatch
                {
                    Id                      = Guid.NewGuid(),
                    BatchId                 = newSampleMessage.batchId,
                    GNSequencerJobId        = sequencerJob.Id,
                    GNSequencerJob          = sequencerJob,
                    Project                 = newSampleMessage.project,
                    AutoStartAnalysis       = (newSampleMessage.autoStartAnalysis.ToLower().Equals("true")),
                    CreateAnalysisPerSample = (newSampleMessage.createAnalysisPerSample.ToLower().Equals("true")),
                    Qualifier               = newSampleMessage.qualifier,
                    Type                    = newSampleMessage.type,
                    Repository              = newSampleMessage.repository,
                    ReadType                = newSampleMessage.read,
                    TotalSamples            = newSampleMessage.samples.Count(),
                    TotalSamplesCompleted   = 0,
                    TotalNumberOfFastqFiles = 0,
                    CreateDateTime          = DateTime.Now
                };

                db.GNNewSampleBatches.Add(newSampleBatch);

                GNSampleType type = db.GNSampleTypes.Where(a => a.Name.Equals(newSampleMessage.type.ToUpper())).FirstOrDefault();
                System.Console.WriteLine("***\n  type " + type.Name);

                string datetimeString = DateTime.Now.ToString("MM-dd 0:HH:mm:ss");

                GNAnalysisType analysisType = null;
                String         AnalysisCode = newSampleMessage.qualifier;
                if (newSampleBatch.CreateAnalysisPerSample)
                {
                    /**
                     * 1. Create a Team
                     * 2. Create a Project
                     */
                    GNContact contact = db.GNContacts.Find(Organization.GNContactId);

                    if (newSampleMessage.qualifier.Equals("TUMOR"))
                    {
                        AnalysisCode = "TUMORNORMAL";
                    }
                    analysisType = db.GNAnalysisTypes.Where(a => a.Name.Equals(newSampleMessage.type.ToUpper())).FirstOrDefault();
                }

                int i = 0;
                GNAnalysisRequest newAnalysis = null;

                /**
                 * Loop samples
                 */

                GNNewSampleBatchStatus batchStatus = new GNNewSampleBatchStatus
                {
                    Id                 = Guid.NewGuid(),
                    CreateDateTime     = DateTime.Now,
                    GNNewSampleBatch   = newSampleBatch,
                    GNNewSampleBatchId = newSampleBatch.Id,
                    IsError            = false,
                    PercentComplete    = 0,
                    Status             = "STARTING PROCESS",
                    Repository         = newSampleMessage.repository
                };
                db.GNNewSampleBatchStatus.Add(batchStatus);
                System.Console.WriteLine("***\n  New batchStatus Created: " + batchStatus.Id);

                foreach (SampleBatch sampleBatch in newSampleMessage.samples)
                {
                    String newSampleName = sampleBatch.name;
                    //tfrege 2016.12.07 do not append family id to sample name anymore

                    /*
                     * if(sampleBatch.familyId != "")
                     * {
                     *  newSampleName = newSampleName + " (" + sampleBatch.familyId + ")";
                     *  System.Console.WriteLine("***\n ------------->  newSampleName: " + newSampleName);
                     * }
                     */

                    GNSample sampleExist     = db.GNSamples.Where(a => a.Name.Equals(sampleBatch.name) && a.GNOrganizationId.Equals(Organization.Id)).FirstOrDefault();
                    bool     createNewSample = false;


                    //Since BCL2FASTQ is not passing gender for now, figure it out based on the family relation
                    String sampleBatchgender = "U";
                    switch (sampleBatch.familyRelation)
                    {
                    case "F":
                    case "S":
                        sampleBatchgender = "M";
                        break;

                    case "M":
                    case "D":
                        sampleBatchgender = "F";
                        break;

                    default:
                        sampleBatchgender = "F";
                        break;
                    }

                    if (sampleExist != null)
                    {
                        if (sampleExist.IsReady)
                        {
                            //the sample is ready, let's create a new one with a suffix of (1)
                            newSampleName   = sampleBatch.name + " (1)";
                            createNewSample = true;
                        }
                        else
                        {
                            //the sample is in the middle of being created, so ignore the message
                            createNewSample = false;
                            //tfrege remove this control just for testing purposes, create new sample always
                            newSampleName   = sampleBatch.name + " (1)"; //remove this after validation is put back in
                            createNewSample = true;
                        }
                    }
                    else
                    {
                        createNewSample = true;
                    }

                    try
                    {
                        if (createNewSample)
                        {
                            GNReplicate replicate = db.GNReplicates.Where(a => a.Name.Equals("NO")).FirstOrDefault();

                            GNSample newSample = new GNSample
                            {
                                Id = Guid.NewGuid(),
                                GNOrganizationId      = Organization.Id,
                                Name                  = newSampleName,
                                Gender                = sampleBatchgender,
                                GNSampleTypeId        = type.Id,
                                GNSampleQualifierCode = newSampleMessage.qualifier,
                                IsReady               = false,
                                IsPairEnded           = (newSampleMessage.read == "paired-end"),
                                GNReplicateCode       = "0",
                                GNReplicate           = replicate,
                                CreateDateTime        = DateTime.Now,
                                CreatedBy             = CreatedBy
                            };

                            db.GNSamples.Add(newSample);
                            System.Console.WriteLine("***\n  New Sample Created: " + newSample.Id);


                            string analysisName = sampleBatch.name;
                            if (sampleBatch.familyId != null)
                            {
                                analysisName = sampleBatch.familyId;
                            }

                            GNNewSampleBatchSamples batchSample = new GNNewSampleBatchSamples {
                                Id                 = Guid.NewGuid(),
                                GNSample           = newSample,
                                CreateDateTime     = DateTime.Now,
                                GNNewSampleBatch   = newSampleBatch,
                                GNNewSampleBatchId = newSampleBatch.Id,
                                Name               = sampleBatch.name,
                                Affected           = sampleBatch.affected,
                                Proband            = sampleBatch.proband,
                                FamilyId           = sampleBatch.familyId,
                                RelationId         = sampleBatch.familyRelation,
                                Gender             = sampleBatchgender,
                                AnalysisName       = analysisName
                            };
                            db.GNNewSampleBatchSamples.Add(batchSample);
                            System.Console.WriteLine("***\n  New batchSample Created: " + batchSample.Id);
                            System.Console.WriteLine("***\n  ====>>>>> Adding to listOfAnalysisNames: " + analysisName);

                            if (!listOfAnalysisNames.Contains(analysisName))
                            {
                                listOfAnalysisNames.Add(analysisName);
                            }

                            db.SaveChanges();
                            System.Console.WriteLine("***\n  DB CHANGES SAVED.");

                            System.Console.WriteLine("***\n  Sample Name: " + sampleBatch.name);

                            //Build list to notify the BCL2FASTQ service later
                            listOfSamples.Add(newSample);
                            listOfBatchSamples.Add(batchSample);
                        }
                    }
                    catch (Exception e1)
                    {
                        System.Console.WriteLine("***\n  Exception: " + e1.Message + e1.StackTrace + e1.InnerException);
                    }
                    i++;
                }

                /**
                 * Update pedigrees, if applies
                 */
                int maxPedigreeId = db.GNSampleRelationships.Max(a => a.Id);
                System.Console.WriteLine("***\n  Updating pedigrees for families ");

                foreach (GNNewSampleBatchSamples pedigreeSample in listOfBatchSamples.Where(a => a.Gender != "U" && a.RelationId != ""))
                {
                    switch (pedigreeSample.RelationId)
                    {
                    case "F":
                    case "M":
                    {
                        GNSampleRelationshipType relationshipType = db.GNSampleRelationshipTypes.Where(a => a.Name.Equals("SON")).FirstOrDefault();

                        //find sons and daughters
                        List <GNNewSampleBatchSamples> sons = listOfBatchSamples.Where(a => a.FamilyId.Equals(pedigreeSample.FamilyId) && a.RelationId.Equals("S")).ToList();
                        foreach (GNNewSampleBatchSamples son in sons)
                        {
                            GNSampleRelationship sampleRelationship = new GNSampleRelationship
                            {
                                Id                         = maxPedigreeId++,
                                GNLeftSample               = pedigreeSample.GNSample,
                                GNLeftSampleId             = pedigreeSample.GNSample.Id,
                                GNRightSample              = son.GNSample,
                                GNRightSampleId            = son.GNSample.Id,
                                GNSampleRelationshipType   = relationshipType,
                                GNSampleRelationshipTypeId = relationshipType.Id,
                                CreateDateTime             = DateTime.Now,
                                CreatedBy                  = CreatedBy
                            };
                            db.GNSampleRelationships.Add(sampleRelationship);
                            System.Console.WriteLine("***\n  Added Son " + son.GNSample.Id + " to Parent Sample : " + pedigreeSample.GNSample.Id);
                        }

                        relationshipType = db.GNSampleRelationshipTypes.Where(a => a.Name.Equals("DAUGHTER")).FirstOrDefault();

                        //find sons and daughters
                        List <GNNewSampleBatchSamples> daughters = listOfBatchSamples.Where(a => a.FamilyId.Equals(pedigreeSample.FamilyId) && a.RelationId.Equals("D")).ToList();
                        foreach (GNNewSampleBatchSamples daughter in daughters)
                        {
                            GNSampleRelationship sampleRelationship = new GNSampleRelationship
                            {
                                Id                         = maxPedigreeId++,
                                GNLeftSample               = pedigreeSample.GNSample,
                                GNLeftSampleId             = pedigreeSample.GNSample.Id,
                                GNRightSample              = daughter.GNSample,
                                GNRightSampleId            = daughter.GNSample.Id,
                                GNSampleRelationshipType   = relationshipType,
                                GNSampleRelationshipTypeId = relationshipType.Id,
                                CreateDateTime             = DateTime.Now,
                                CreatedBy                  = CreatedBy
                            };
                            db.GNSampleRelationships.Add(sampleRelationship);
                            System.Console.WriteLine("***\n  Added Daughter " + daughter.GNSample.Id + " to Parent Sample : " + pedigreeSample.GNSample.Id);
                        }
                    } break;

                    case "S":
                    case "D":
                    {
                        GNSampleRelationshipType relationshipType = db.GNSampleRelationshipTypes.Where(a => a.Name.Equals("FATHER")).FirstOrDefault();

                        //find sons and daughters
                        List <GNNewSampleBatchSamples> fathers = listOfBatchSamples.Where(a => a.FamilyId.Equals(pedigreeSample.FamilyId) && a.RelationId.Equals("F")).ToList();
                        foreach (GNNewSampleBatchSamples dad in fathers)
                        {
                            GNSampleRelationship sampleRelationship = new GNSampleRelationship
                            {
                                Id                         = maxPedigreeId++,
                                GNLeftSample               = pedigreeSample.GNSample,
                                GNLeftSampleId             = pedigreeSample.GNSample.Id,
                                GNRightSample              = dad.GNSample,
                                GNRightSampleId            = dad.GNSample.Id,
                                GNSampleRelationshipType   = relationshipType,
                                GNSampleRelationshipTypeId = relationshipType.Id,
                                CreateDateTime             = DateTime.Now,
                                CreatedBy                  = CreatedBy
                            };
                            db.GNSampleRelationships.Add(sampleRelationship);
                            System.Console.WriteLine("***\n  Added Dad " + dad.GNSample.Id + " to Child Sample : " + pedigreeSample.GNSample.Id);
                        }

                        relationshipType = db.GNSampleRelationshipTypes.Where(a => a.Name.Equals("MOTHER")).FirstOrDefault();

                        //find sons and daughters
                        List <GNNewSampleBatchSamples> mothers = listOfBatchSamples.Where(a => a.FamilyId.Equals(pedigreeSample.FamilyId) && a.RelationId.Equals("M")).ToList();
                        foreach (GNNewSampleBatchSamples mom in mothers)
                        {
                            GNSampleRelationship sampleRelationship = new GNSampleRelationship
                            {
                                Id                         = maxPedigreeId++,
                                GNLeftSample               = pedigreeSample.GNSample,
                                GNLeftSampleId             = pedigreeSample.GNSample.Id,
                                GNRightSample              = mom.GNSample,
                                GNRightSampleId            = mom.GNSample.Id,
                                GNSampleRelationshipType   = relationshipType,
                                GNSampleRelationshipTypeId = relationshipType.Id,
                                CreateDateTime             = DateTime.Now,
                                CreatedBy                  = CreatedBy
                            };
                            db.GNSampleRelationships.Add(sampleRelationship);
                            System.Console.WriteLine("***\n  Added Mom " + mom.GNSample.Id + " to Child Sample : " + pedigreeSample.GNSample.Id);
                        }
                    } break;

                    case "U":
                    default:
                        //don't do a thing.
                        System.Console.WriteLine("***\n  Relation is undefined, do not add anything.");
                        break;
                    }
                }

                /******************************************************************************************************/
                //SAVE ALL CHANGES (new team, new project, new samples, new analyses, new batch records, new pedigrees)
                /******************************************************************************************************/

                try
                {
                    db.SaveChanges();
                }
                catch (Exception eRDS)
                {
                    System.Console.WriteLine("***EXCEPTION DB!!! " + eRDS.Message + " " + eRDS.StackTrace + " " + eRDS.InnerException);
                }


                try
                {
                    if (newSampleMessage.autoStartAnalysis.ToLower().Equals("true"))
                    {
                        System.Console.WriteLine("***\n  Elements: " + listOfAnalysisNames.Count());

                        foreach (String anName in listOfAnalysisNames)
                        {
                            List <GNNewSampleBatchSamples> samplesForAnalysis = new List <GNNewSampleBatchSamples>();

                            newAnalysis = new GNAnalysisRequest
                            {
                                Id                        = Guid.NewGuid(),
                                Project                   = newProject,
                                GNProjectId               = newProject.Id,
                                CreateDateTime            = DateTime.Now,
                                CreatedBy                 = CreatedBy,
                                AnalysisType              = analysisType,
                                RequestProgress           = 0,
                                RequestDateTime           = DateTime.Now,
                                GNAnalysisRequestTypeCode = AnalysisCode,
                                Description               = anName,
                                GNAnalysisAdaptorCode     = "NONE",
                                AnalysisTypeId            = analysisType.Id.ToString(),
                                AutoStart                 = (newSampleMessage.autoStartAnalysis.ToLower().Equals("true")),
                                AWSRegionSystemName       = db.AWSRegions.FirstOrDefault().AWSRegionSystemName
                            };
                            db.GNAnalysisRequests.Add(newAnalysis);
                            System.Console.WriteLine("***\n  ========================\n New newAnalysis Created: " + newAnalysis.Id);

                            samplesForAnalysis = db.GNNewSampleBatchSamples.Where(a => a.GNNewSampleBatchId.Equals(newSampleBatch.Id) && a.AnalysisName.Equals(anName)).ToList();
                            foreach (GNNewSampleBatchSamples sample in samplesForAnalysis)
                            {
                                GNAnalysisRequestGNSample newAnalysisSample = new GNAnalysisRequestGNSample
                                {
                                    AffectedIndicator   = sample.Affected,
                                    TargetIndicator     = sample.Proband,
                                    GNAnalysisRequest   = newAnalysis,
                                    GNSample            = sample.GNSample,
                                    GNAnalysisRequestId = newAnalysis.Id,
                                    GNSampleId          = sample.GNSample.Id
                                };
                                db.GNAnalysisRequestGNSamples.Add(newAnalysisSample);
                                System.Console.WriteLine("***\n  Sample Added to New newAnalysis: " + sample.GNSample.Name);
                            }
                        }
                    } //end of "if(newSampleBatch.CreateAnalysisPerSample)"
                }
                catch (Exception eAnalysis)
                {
                    System.Console.WriteLine("***\n  Exception: " + eAnalysis.Message + eAnalysis.StackTrace + eAnalysis.InnerException);
                }


                db.SaveChanges();

                //Notify BCL2FASTQ service
                sampleResponseService.NotifyBcl2FastqSystem(listOfBatchSamples);

                System.Console.WriteLine("***\n  EVERYTHING WORKED!");

                //NOTIFY USER
                bool notifySuccess =
                    new GenomeNext.App.NotificationCloudMessageService().NotifyGNContact(
                        "SAMPLE_CREATION",
                        Organization.OrgMainContact.Email,
                        "Sample Creation",
                        new Dictionary <string, string>
                {
                    { "BatchId", newSampleMessage.batchId },
                    { "TotalSamples", newSampleBatch.TotalSamples.ToString() },
                    { "CreatorName", Organization.OrgMainContact.FullName },
                    { "JobId", sequencerJob.Id.ToString() },
                    { "ProjectName", sequencerJob.Project },
                    { "CreateDateTime", DateTime.Now.ToString() }
                });
                success = true;
            }
            catch (Exception e1)
            {
                Exception e2 = new Exception("Unable to Create New Sample.", e1);
                LogUtil.Warn(logger, e2.Message, e2);
                success = false;
            }
            return(success);
        }
        public override bool ProcessMessage(QcReport qcReportSqsMessage, object queueMessage)
        {
            System.Console.WriteLine("***\n ****** Sample Name: " + qcReportSqsMessage.entityID);
            System.Console.WriteLine("***\n ****** Sample type: " + qcReportSqsMessage.entityType);
            System.Console.WriteLine("***\n ---->QC REPORT PROCESSING FOR ENTITY: " + qcReportSqsMessage.entityID + " (" + qcReportSqsMessage.entityType + ")");

            /**
             * Find Sample in NewSamplesBatch
             *
             */

            bool success = false;

            try
            {
                Guid entityId = Guid.Parse(qcReportSqsMessage.entityID);
                if (qcReportSqsMessage.entityType.ToUpper().Equals("SAMPLE"))
                {
                    GNSample sample = db.GNSamples.Find(entityId);

                    //Find Batch
                    //GNNewSampleBatch Batch = db.GNNewSampleBatchSamples.Where(a => a.GNSample.Id.Equals(sample.Id)).FirstOrDefault().GNNewSampleBatch;


                    System.Console.WriteLine("***\n ----> SAMPLE FOUND: " + sample.Name);
                    GNCloudFileCategory fileCategory = db.GNCloudFileCategories.Where(a => a.Id == 1).FirstOrDefault();

                    string description = qcReportSqsMessage.fileName;
                    string volume      = "dev-gn-s3-01";
                    string folderPath  = qcReportSqsMessage.fileLocation.Substring(qcReportSqsMessage.fileLocation.IndexOf("fastq/"));
                    string fileURL     = "https://dev-gn-s3-01.s3.amazonaws.com/" + folderPath + description;

                    System.Console.WriteLine("***\n ----> fileURL: " + fileURL);

                    //check first if file already exists
                    int cloudFileExists = db.GNCloudFiles.Where(a => a.FileURL.Equals(fileURL)).Count();

                    System.Console.WriteLine("\n\n\n ----> FILE EXISTS?: " + cloudFileExists + " - " + sample.Id + " - " + fileURL);

                    //if not, insert
                    if (cloudFileExists == 0)
                    {
                        GNCloudFile cloudFile = new GNCloudFile
                        {
                            Id = Guid.NewGuid(),
                            GNCloudFileCategoryId = fileCategory.Id, //FASTQ
                            CloudFileCategory     = fileCategory,
                            FileName              = folderPath + description,
                            FileURL               = fileURL,
                            FolderPath            = folderPath,
                            Volume                = volume,
                            Description           = description,
                            FileSize              = Int64.Parse(qcReportSqsMessage.fileSize) * 1024,
                            AWSRegionSystemName   = db.AWSRegions.FirstOrDefault().AWSRegionSystemName,
                            CreateDateTime        = DateTime.Now,
                            CreatedBy             = Guid.Parse("0750f896-e7d6-48d4-a1b9-007059f62784"),
                            SampleId              = sample.Id.ToString(),
                            QcStatsAvailable      = (qcReportSqsMessage.qcResult.Equals("true")),
                            QcStatsReportLocation = qcReportSqsMessage.qcReportLocation
                        };
                        db.GNCloudFiles.Add(cloudFile);
                        sample.CloudFiles.Add(cloudFile);
                        System.Console.WriteLine("***\n ----> FILE ADDED TO SAMPLE: " + cloudFile.Id);

                        /*
                         * Batch.TotalNumberOfFastqFilesCompleted = Batch.TotalNumberOfFastqFilesCompleted + 1;
                         *
                         * if (Batch.TotalNumberOfFastqFiles == Batch.TotalNumberOfFastqFilesCompleted)
                         * {
                         *  SampleBatchRequestService batchService = new SampleBatchRequestService();
                         *  batchService.QualityControl(Batch);
                         * }*/
                    }
                }
                else
                {
                    //Update VCF-QC for an existing VCF

                    System.Console.WriteLine("***\n ****** UPDATING ANALYSIS : " + qcReportSqsMessage.entityID);
                    System.Console.WriteLine("***\n ******  " + qcReportSqsMessage.entityType);

                    GNAnalysisRequest analysisRequest = db.GNAnalysisRequests.Find(entityId);
                    System.Console.WriteLine("***\n ******  CreateDateTime" + analysisRequest.CreateDateTime);

                    GNCloudFile vcfFile = analysisRequest.AnalysisResult.ResultFiles.Where(a => a.FileName.Contains(qcReportSqsMessage.fileName)).FirstOrDefault();
                    System.Console.WriteLine("***\n ******  File found " + vcfFile.FileURL);
                    vcfFile.QcStatsReportLocation = qcReportSqsMessage.qcReportLocation;
                    vcfFile.QcStatsAvailable      = true;
                    System.Console.WriteLine("***\n ----> Analysis Request: " + analysisRequest.Description);
                    System.Console.WriteLine("***\n ----> VCF File Found: " + vcfFile.Description);
                }

                db.SaveChanges();
                success = true;
            }
            catch (Exception e1)
            {
                Exception e2 = new Exception("Unable to process QCReport Message.", e1);
                LogUtil.Warn(logger, e2.Message, e2);
                success = false;
            }
            return(success);
        }