def estimate(run_id, conf): """Estimate space needed in directories : hiseq, bcl and fastq if it has not enough space free send a warning mail Arguments: run_id: the run id conf: configuration dictionary """ # retrieve data from RunInfo.xml run_info = hiseq_run.get_run_info(run_id, conf) # retrieve count lane lane_count = run_info.getFlowCellLaneCount() # retrieve count cycle cycle_count = 0 for read in run_info.getReads(): cycle_count = cycle_count + read.getNumberCycles() # retrieve data from runParameters.xml run_param_path = common.get_run_parameters_path(run_id, conf) # # Estimate space needed +10% # # Set factor and ratio util run_factor = lane_count * cycle_count * 1.10 # bcl file : compressed or not, info in runParameters.xml ratio_bcl = ratio_bcl_compressed(run_param_path) # quality data for Q30 : compressed or not ratio_quality = compressed_quality_data(run_param_path) # for hiseq data check_space_needed_and_free(run_id, 'hiseq', run_factor, conf) # for bcl files check_space_needed_and_free(run_id, 'bcl', run_factor * ratio_bcl * ratio_quality, conf) # for fastq files check_space_needed_and_free(run_id, 'fastq', run_factor, conf)
def send_report(run_id, conf): """Send a mail with the first base report. Arguments: run_id: the run id conf: configuration dictionary """ # # Retrieve features the current run in RunInfos.xml file # run_info = hiseq_run.get_run_info(run_id, conf) if run_info is None: return False # TODO ?? add check sample-sheet if demux step enable # add warning in report if useful reads = run_info.getReads() error_cycles_per_read_not_indexes_count = 0 reads_indexed_count = 0 reads_not_indexed_count = 0 cycles_count = 0 cycles_per_read_not_indexed = 0 for read in reads: cycles_count += read.getNumberCycles() if read.isIndexedRead(): reads_indexed_count += 1 else: reads_not_indexed_count += 1 if cycles_per_read_not_indexed == 0: cycles_per_read_not_indexed = read.getNumberCycles() # Check same cycles count for each reads not indexed error_cycles_per_read_not_indexes_count = cycles_per_read_not_indexed != read.getNumberCycles() # Identification type run according to data in RunInfos.xml : SR or PE if reads_not_indexed_count == 1: type_run_estimated = "SR-" + str(cycles_per_read_not_indexed) + " with " + str( reads_indexed_count) + " index" if reads_indexed_count > 1: type_run_estimated += "es" elif reads_not_indexed_count == 2: type_run_estimated = "PE-" + str(cycles_per_read_not_indexed) + " with " + str( reads_indexed_count) + " index" if reads_indexed_count > 1: type_run_estimated += "es" else: type_run_estimated = "Undetermined run type (" + str(reads_not_indexed_count) + " reads with " + str( reads_indexed_count) + " index)" if reads_indexed_count > 1: type_run_estimated += "es" type_run_estimated += ")" description_run = "Informations about this run:\n" description_run += "\t- Sequencer: " + common.get_instrument_name(run_id, conf) + ".\n" description_run += "\t- " + str(run_info.getFlowCellLaneCount()) + " lanes with " + str( run_info.alignToPhix.size()) + " aligned to Phix.\n" description_run += "\t- " + str(reads_not_indexed_count) + " read" if reads_not_indexed_count > 1: description_run += "s" description_run += " and " + str(reads_indexed_count) + " index" if reads_indexed_count > 1: description_run += "es" description_run += ".\n" if error_cycles_per_read_not_indexes_count or cycles_per_read_not_indexed == 0: description_run += "\t- ERROR : cycles count per read different between reads (" + str( cycles_count) + " total cycles).\n" else: description_run += "\t- " + str(cycles_per_read_not_indexed) + " cycles per read (" + str( cycles_count) + " total cycles).\n" description_run += "\t- Estimated run type: " + type_run_estimated + ".\n" attachment_file = str(hiseq_run.find_hiseq_run_path(run_id, conf)) + '/' + run_id + '/' + common.FIRST_BASE_REPORT_FILE # If the First base report file exists, send it by email if common.is_file_readable(attachment_file): message = 'You will find attached to this message the first base report for the run ' + \ run_id + '.\n\n' + description_run common.send_msg_with_attachment('[Aozan] First base report for the run ' + type_run_estimated + ' ' + run_id + ' on ' + common.get_instrument_name(run_id, conf), message, attachment_file, False, conf) else: # With other no attachment file message = 'You will find below the parameters of the run ' + run_id + '.\n\n' + description_run common.send_msg('[Aozan] New run ' + type_run_estimated + ' ' + run_id + ' on ' + common.get_instrument_name(run_id, conf), message, False, conf) return True