Beispiel #1
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);
        }
        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);
        }
Beispiel #3
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;
            }
        }
        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);
        }