Пример #1
0
static void
pr_append_new_chunk(pr_append_str *x,
                    const char *s)
{
  if (pr_append_new_chunk_external(x, s))
    out_of_memory_error();
}
Пример #2
0
void
print_format_output(FILE *f,
                    const int *io_version,
                    const p3_global_settings *pa,
                    const seq_args *sa,
                    const p3retval *retval,
                    const char *pr_release,
                    int   explain_flag)
{  
  
  /* A place to put a string containing all error messages */
  pr_append_str *combined_retval_err = NULL;

  combined_retval_err = create_pr_append_str();
  if (NULL == combined_retval_err) exit(-2); /* Out of memory */

  if (pr_append_new_chunk_external(combined_retval_err, 
                                   retval->glob_err.data))
    exit(-2);

  if (pr_append_new_chunk_external(combined_retval_err, 
                                   retval->per_sequence_err.data)) 
    exit(-2);

  /* Print as primer pairs */
  if (retval->output_type == primer_pairs) {
    format_pairs(f, pa, sa, retval, &retval->best_pairs, 
                 pr_release, combined_retval_err, explain_flag);
    
    /* Print as primer list */
  } else {
    format_oligos(stdout, pa, sa, retval, pr_release,
                  combined_retval_err, explain_flag);
  }

  destroy_pr_append_str(combined_retval_err);
}
Пример #3
0
int 
main (int argc, const char *argv[]) 
{
	unsigned int idx;
	char *end;
	int debug = 0;
	
	/* sequence file name specified by the user, otherwise STDIN will be used */
	const char *sequence_file_name = NULL;
	const char *lists_file_name = NULL;
	
	/* data structure for all k-mer lists used for masking */
	unsigned int nlists = 0;
	unsigned int nlist_parameters = 0;
	unsigned int npos = 0;
	unsigned int list_pos[MAX_VARIABLES], list_components[MAX_VARIABLES];
	
	masker_parameters mp = {};
	parameters_builder pbuilder = {};
	input_sequence *input_seq = NULL;
	
	pr_append_str parse_err;
	pr_append_str warnings;
	
	init_pr_append_str (&parse_err);
	init_pr_append_str (&warnings);

	/* fill mp with default parameters */
	mp.mdir = DEFAULT_MASKING_DIRECTION;
	mp.failure_rate = DEFAULT_FAILURE_RATE;
	mp.abs_cutoff = DEFAULT_ABS_CUTOFF;
	mp.nucl_masked_in_5p_direction = DEFAULT_M5P;
	mp.nucl_masked_in_3p_direction = DEFAULT_M3P;
	mp.print_sequence = PRINT_SEQUENCE;
	mp.do_soft_masking = HARD_MASKING;
	mp.masking_char = DEFAULT_MASK_CHAR;
	mp.list_prefix = DEFAULT_LIST_FILE_PREFIX;
	
	
	/* parsing and checking the commandline arguments */
	for (idx = 1; (int)idx < argc; idx++) {
		
  		if (!strcmp (argv[idx], "-h") || !strcmp (argv[idx], "--help") || !strcmp (argv[idx], "-?")) {
			print_help (0);
		
		} else if ((int)idx == argc - 1 && argv[idx][0] != '-') {
			sequence_file_name = argv[idx];
			
		} else if (!strcmp (argv[idx], "-lf") || !strcmp (argv[idx], "--lists_file")) {
			/* lists specified from the file */
			if (!argv[idx + 1] || argv[idx + 1][0] == '-') {
				pr_append_new_chunk_external (&warnings, "No lists file specified.");
				idx += 1;
				continue;
			}
			lists_file_name = argv[idx + 1];
			idx += 1;
			
		} else if (!strcmp (argv[idx], "-l") || !strcmp (argv[idx], "--list")) {
			/* lists specified from the commandline */
			if (nlist_parameters == MAX_VARIABLES) {
				pr_append_new_chunk_external (&parse_err, "Maximum number of list variables reached.");
				break;
			}
			
			if (!argv[idx + 1]) {
				pr_append_new_chunk_external (&warnings, "No list name specified with -l parameter!.");
				continue;
			}
			
			/* get the positions of list files */
			list_pos[nlist_parameters] = idx;
			while (argv[idx + 1]) {
				if (argv[idx + 1][0] == '-') {
					if (!argv[idx + 1][1]) break;
					strtod (argv[idx + 1] + 1, &end);
					if (*end != 0) break;
				} else if (idx + 1 != list_pos[nlist_parameters] + 1 && idx + 1 != list_pos[nlist_parameters] + 4) {
					strtod (argv[idx + 1], &end);
					if (*end != 0) break;
				} else if (idx + 1 == list_pos[nlist_parameters] + 4 && strcmp (argv[idx + 1], "sq")) {
					break;
				}
				idx += 1;
			}
			list_components[nlist_parameters] = idx - list_pos[nlist_parameters];
			nlist_parameters += 1;
			npos += 1;
			
		} else if (!strcmp (argv[idx], "-lp") || !strcmp (argv[idx], "--list_prefix")) {
			/* lists specified by the prefix */
			if (!argv[idx + 1] || argv[idx + 1][0] == '-') {
				pr_append_new_chunk_external (&warnings, "No list prefix specified! Using the default value.");
				idx += 1;
				continue;
			}
			mp.list_prefix = (char *)argv[idx + 1];
			idx += 1;			
			
		} else if (!strcmp (argv[idx], "-p") || !strcmp (argv[idx], "--probability_cutoff")) {
			if (!argv[idx + 1]) {
				pr_append_new_chunk_external (&warnings, "No cutoff value specified! Using the default value.");
				idx += 1;
				continue;
			}
			mp.failure_rate = strtod (argv[idx + 1], &end);
			mp.abs_cutoff = 0;
			if (*end != 0 || mp.failure_rate < 0 || mp.failure_rate > 1) {
				pr_append_new_chunk_external (&parse_err, "Invalid cutoff value: ");
				pr_append_external (&parse_err, argv[idx + 1]);
				break;
			}
			idx += 1;
			
		} else if (!strcmp (argv[idx], "-a") || !strcmp (argv[idx], "--absolute_value_cutoff")) {
			if (!argv[idx + 1]) {
				pr_append_new_chunk_external (&warnings, "No absolute cutoff value specified! Using the default value.");
				idx += 1;
				continue;
			}
			mp.abs_cutoff = strtod (argv[idx + 1], &end);
			mp.failure_rate = 0.0;
			if (*end != 0 || mp.abs_cutoff < 0) {
				pr_append_new_chunk_external (&parse_err, "Invalid absolute cutoff value: ");
				pr_append_external (&parse_err, argv[idx + 1]);
				break;
			}
			idx += 1;
			
		} else if (!strcmp (argv[idx], "-m5") || !strcmp (argv[idx], "--mask_5p")) {
			if (!argv[idx + 1]) {
				pr_append_new_chunk_external (&warnings, "Number of nucleotides masked in 5' direction not specified! Using the default value.");
				idx += 1;
				continue;
			}
			mp.nucl_masked_in_5p_direction = strtod (argv[idx + 1], &end);
			if (*end != 0) {
				pr_append_new_chunk_external (&parse_err, "Invalid number of nucleotides masked in 5' direction: ");
				pr_append_external (&parse_err, argv[idx + 1]);
				break;
			}
			idx += 1;
			
		} else if (!strcmp (argv[idx], "-m3") || !strcmp (argv[idx], "--mask_3p")) {
			if (!argv[idx + 1]) {
				pr_append_new_chunk_external (&warnings, "Number of nucleotides masked in 3' direction not specified! Using the default value.");
				idx += 1;
				continue;
			}
			mp.nucl_masked_in_3p_direction = strtod (argv[idx + 1], &end);
			if (*end != 0) {
				pr_append_new_chunk_external (&parse_err, "Invalid number of nucleotides masked in 3' direction: ");
				pr_append_external (&parse_err, argv[idx + 1]);
				break;
			}
			idx += 1;
			
		} else if (!strcmp (argv[idx], "-c") || !strcmp (argv[idx], "--masking_char")) {
			if (!argv[idx + 1 || argv[idx + 1][0] == '-']) {
				pr_append_new_chunk_external (&warnings, "Character for masking not specified! Using the default value.");
				idx += 1;
				continue;
			}
			mp.masking_char = argv[idx + 1][0];
			if (strlen(argv[idx + 1]) > 1 || mp.masking_char < 33 || mp.masking_char > 126) {
				pr_append_new_chunk_external (&parse_err, "Invalid character for masking: ");
				pr_append_external (&parse_err, argv[idx + 1]);
				break;
			}
			idx += 1;
			
		} else if (!strcmp (argv[idx], "-d") || !strcmp (argv[idx], "--masking_direction")) {
			if (!argv[idx + 1] || argv[idx + 1][0] == '-') {
				pr_append_new_chunk_external (&warnings, "Masking direction not specified! Masking both strands by default.");
			} else if (!strcmp (argv[idx + 1], "both")) {
				mp.mdir = both_on_same;
			} else if (!strcmp (argv[idx + 1], "fwd")) {
				mp.mdir = fwd;
			} else if (!strcmp (argv[idx + 1], "rev")) {
				mp.mdir = rev;
			} else {
				pr_append_new_chunk_external (&warnings, "Unknown masking direction: ");
				pr_append_external (&warnings, argv[idx + 1]);
				pr_append_external (&warnings, ". Masking both strands by default.");
			}
			idx += 1;
			
		} else if (!strcmp (argv[idx], "-s") || !strcmp (argv[idx], "--soft_mask")) {
			mp.do_soft_masking = SOFT_MASKING;

		} else if (!strcmp (argv[idx], "-D")) {
			debug += 1;
			
		} else {
			pr_append_new_chunk_external (&parse_err, "Unknown parameter: ");
			pr_append_external (&parse_err, argv[idx]);
			break;
		}
	}

	input_seq = create_input_sequence_from_file_name (sequence_file_name, &parse_err);

	if (parse_err.data != NULL) {
		fprintf(stderr, "%s -> parsing commandline: ERROR: %s\n", pr_programme_name, parse_err.data);
		exit(-1);
	}
	if (warnings.data != NULL) {
		fprintf(stderr, "%s -> parsing commandline: WARNING: %s\n", pr_programme_name, warnings.data);
	}
	
	if (lists_file_name) {
		/* if lists are given in a text file */
		mp.fp = read_formula_parameters_from_file (lists_file_name, &nlist_parameters, &pbuilder, &mp.formula_intercept, &parse_err);
		nlists = pbuilder.nfp;
	} 
	
	if (npos != 0) {
		/* if lists are given by commandline arguments (can be added to the ones given in a file) */
		pbuilder.fp_array = mp.fp;

		for (idx = 0; idx < npos; idx++) {
			unsigned int pos = list_pos[idx] + 1;
			char *values[4];
			unsigned int nvalues = list_components[idx];
			char *end;
			memcpy (&values, &argv[pos], nvalues * sizeof(*argv));
			
			if (nvalues == 1) {
				double ic;
				double neg = 1.0;
				if (values[0][0] == '-') {
					values[0] += 1;
					neg = -1.0;
				}
				ic = strtod (values[0], &end);
				if (*end == 0) {
					mp.formula_intercept = ic * neg;
					continue;
				}
			}
			add_variable_to_formula_parameters (values, nvalues, &pbuilder, &parse_err);
		}		
		nlists = pbuilder.nfp;
		mp.fp = pbuilder.fp_array;

	} else if (nlists == 0 && !lists_file_name) {
		/* if there are no lists specified use the default formula */
		mp.fp = create_default_formula_parameters (mp.list_prefix, &parse_err);
		mp.formula_intercept = DEFAULT_INTERCEPT;
		nlists = DEFAULT_NLISTS;
		nlist_parameters = DEFAULT_NLIST_PARAMETERS;
	} 

	mp.nlists = nlists;
	
	if (mp.abs_cutoff > 0 && nlist_parameters != 1) {
		fprintf (stderr, "Error: Absolute value cutoff works with one list and one k-mer frequency parameter only. Currently you are using %u lists and %u parameters.\n", nlists, nlist_parameters);
		print_help(1);
	}

	if (parse_err.data != NULL) {
		fprintf(stderr, "%s -> building formula: ERROR: %s\n", pr_programme_name, parse_err.data);
		delete_input_sequence (input_seq);
		exit(-1);
	}
	
	if (debug > 0) print_parameters (&mp);
	
	read_and_mask_sequence (input_seq, NULL, &mp, &parse_err, debug);

	if (parse_err.data != NULL) {
		fprintf(stderr, "%s -> masking sequence: ERROR: %s\n", pr_programme_name, parse_err.data);
		delete_input_sequence (input_seq);
		delete_formula_parameters (mp.fp, nlists);
		exit(-1);
	}
	
	destroy_pr_append_str_data (&warnings);
	destroy_pr_append_str_data (&parse_err);
	delete_input_sequence (input_seq);
	delete_formula_parameters (mp.fp, nlists);
	
	if (debug > 0) fprintf (stderr, "Done!\n");
	return 0;
}
Пример #4
0
/* Print the data for chosen primer pairs to stdout in "boulderio" format. */
void
print_boulder(int io_version,
              const p3_global_settings *pa,
              const seq_args *sa,
              const p3retval *retval,
              int   explain_flag) {
  /* The pointers to warning tag */
  char *warning;

  /* A place to put a string containing all error messages */
  pr_append_str *combined_retval_err = NULL;

  /* A small spacer; WARNING this is a fixed size
     buffer, but plenty bigger than
     log(2^64, 10), the longest character
     string that is needed for a 64 bit integer. */
  char suffix [100];

  /* Pointers for the primer set just printing */
  primer_rec *fwd, *rev, *intl;
 
  /* Variables only used for Primer Lists */
  int num_fwd, num_rev, num_int, num_pair, num_print;
  int print_fwd = 0;
  int print_rev = 0;
  int print_int = 0;
    
  /* Switches for printing this primer */
  int go_fwd = 0;
  int go_rev = 0;
  int go_int = 0;
    
  /* The number of loop cycles */
  int loop_max;
    
  /* That links to the included region */
  int i, incl_s = sa->incl_s;
    
  /* This deals with the renaming of the internal oligo */
  const char *new_oligo_name = "INTERNAL";
  const char *old_oligo_name = "INTERNAL_OLIGO";
  char *int_oligo = (char*) new_oligo_name;

  /* Check: are all pointers linked to something*/
  PR_ASSERT(NULL != pa);
  PR_ASSERT(NULL != sa);
    
  if (io_version == 3) {
    int_oligo = (char*) old_oligo_name;
  }
        
  /* Check if there are warnings and print them */
  if ((warning = p3_get_rv_and_gs_warnings(retval, pa)) != NULL) { 
    printf("PRIMER_WARNING=%s\n", warning);
    free(warning);
  }

  /* Check if a settings file was read an print its id 
   * Not needed anymore, we do this when we read the setting file. */
  /*
  if (pa->settings_file_id != NULL) { 
    printf("P3_FILE_ID=%s\n", pa->settings_file_id);
    free(warning);
  }
  */

  combined_retval_err = create_pr_append_str();
  if (NULL == combined_retval_err) exit(-2); /* Out of memory */

  if (pr_append_new_chunk_external(combined_retval_err, 
                                   retval->glob_err.data))
    exit(-2);

  if (pr_append_new_chunk_external(combined_retval_err, 
                                   retval->per_sequence_err.data)) 
    exit(-2);

  /* Check if there are errors, print and return */
  if (!pr_is_empty(combined_retval_err)) {
    print_boulder_error(pr_append_str_chars(combined_retval_err));
    destroy_pr_append_str(combined_retval_err);
    return;
  }
  destroy_pr_append_str(combined_retval_err);

  /* Get how many primers are in the array */
  num_fwd = retval->fwd.num_elem;
  num_rev = retval->rev.num_elem;
  num_int = retval->intl.num_elem;
  num_pair = retval->best_pairs.num_pairs;

  /* Prints out statistics about the primers */
  if (explain_flag) print_all_explain(pa, sa, retval, io_version);
    
  /* Print out the stop codon if a reading frame was specified */
  if (!PR_START_CODON_POS_IS_NULL(sa))
    printf("PRIMER_STOP_CODON_POSITION=%d\n", retval->stop_codon_pos);
    
  /* How often has the loop to be done? */
  if (retval->output_type == primer_list) {
    /* For Primer Lists: Figure out how many primers are in
     * the array that can be printed. If more than needed,
     * set it to the number requested. */

    /* Get how may primers should be printed */
    num_print = pa->num_return;
    /* Set how many primers will be printed */
    print_fwd = (num_print < num_fwd) ? num_print : num_fwd;
    print_rev = (num_print < num_rev) ? num_print : num_rev;
    print_int = (num_print < num_int) ? num_print : num_int;
    /* Get which list has to print most primers */
    loop_max = 0;
    if (loop_max < print_fwd) {
      loop_max = print_fwd;
    }
    if (loop_max < print_rev) {
      loop_max = print_rev;
    }
    if (loop_max < print_int) {
      loop_max = print_int;
    }
    /* Now the vars are there how often we have to go
     * through the loop and how many of each primer can
     * be printed. */
    num_pair = 0;
  } else {
    loop_max = num_pair;
    /* Set how many primers will be printed */
    print_fwd = num_pair;
    print_rev = num_pair;
    if (num_int != 0) {
      print_int = num_pair;
    }
  }

  if (io_version == 4) {
    printf("PRIMER_LEFT_NUM_RETURNED=%d\n", print_fwd);
    printf("PRIMER_RIGHT_NUM_RETURNED=%d\n",  print_rev);
    printf("PRIMER_%s_NUM_RETURNED=%d\n", int_oligo, print_int);
    printf("PRIMER_PAIR_NUM_RETURNED=%d\n", num_pair);
  }
  
  /* --------------------------------------- */
  /* Start of the loop printing all pairs or primers or oligos */
  for(i=0; i<loop_max; i++) {
    /* What needs to be printed */
    /* The conditions for primer lists */

    if (retval->output_type == primer_list) {
      /* Attach the selected primers to the pointers */
      fwd = &retval->fwd.oligo[i];
      rev = &retval->rev.oligo[i];
      intl = &retval->intl.oligo[i];
      /* Do fwd oligos have to be printed? */
      if ((pa->pick_left_primer) && (i < print_fwd)) {
        go_fwd = 1;
      } else {
        go_fwd = 0;
      }
      /* Do rev oligos have to be printed? */
      if ((pa->pick_right_primer) && (i < print_rev)) {
        go_rev = 1;
      } else {
        go_rev = 0;
      }
      /* Do int oligos have to be printed? */
      if ((pa->pick_internal_oligo) && (i < print_int)) {
        go_int = 1;
      } else {
        go_int = 0;
      }
    }  else {
      /* We will print primer pairs or pairs plus internal oligos */
      /* Get pointers to the primer_rec's that we will print */
      fwd  = retval->best_pairs.pairs[i].left;
      rev  = retval->best_pairs.pairs[i].right;
      intl = retval->best_pairs.pairs[i].intl;
      /* Pairs must have fwd and rev primers */
      go_fwd = 1;
      go_rev = 1;
      /* Do hyb oligos have to be printed? */
      if (pa->pick_internal_oligo == 1) {
        go_int = 1;
      } else {
        go_int = 0;
      }
    }
      
    /* Get the number for pimer counting in suffix[0] */
    if ((i == 0) && (io_version == 3) ){
      suffix[0] = '\0';
    } else { 
      sprintf(suffix, "_%d", i);
    }

    /* Print out the Pair Penalties */
    if (retval->output_type == primer_pairs) {
      if (io_version == 3) {
        printf("PRIMER_PAIR_PENALTY%s=%.4f\n", suffix,
               retval->best_pairs.pairs[i].pair_quality);
      } else {
        printf("PRIMER_PAIR%s_PENALTY=%f\n", suffix,
               retval->best_pairs.pairs[i].pair_quality);
      }
    }

    /* Print single primer penalty */
    if (go_fwd == 1)
      printf("PRIMER_LEFT%s_PENALTY=%f\n", suffix, fwd->quality);
    if (go_rev == 1)
      printf("PRIMER_RIGHT%s_PENALTY=%f\n", suffix, rev->quality);
    if (go_int == 1)
      printf("PRIMER_%s%s_PENALTY=%f\n", int_oligo, suffix, intl->quality);

    /* Print the oligo_problems */
    if (io_version == 4) {
      if (go_fwd == 1 && p3_ol_has_any_problem(fwd))
        printf("PRIMER_LEFT%s_PROBLEMS=%s\n", suffix, p3_get_ol_problem_string(fwd));
      if (go_rev == 1 && p3_ol_has_any_problem(rev))
        printf("PRIMER_RIGHT%s_PROBLEMS=%s\n", suffix, p3_get_ol_problem_string(rev));
      if (go_int == 1 && p3_ol_has_any_problem(intl))
        printf("PRIMER_%s%s_PROBLEMS=%s\n", int_oligo, suffix, p3_get_ol_problem_string(intl));
    }

    /* Print primer sequences. */
    if (go_fwd == 1)
      printf("PRIMER_LEFT%s_SEQUENCE=%s\n", suffix,
             pr_oligo_sequence(sa, fwd));
    if (go_rev == 1)
      printf("PRIMER_RIGHT%s_SEQUENCE=%s\n", suffix,
             pr_oligo_rev_c_sequence(sa, rev));
    if(go_int == 1)
      printf("PRIMER_%s%s_SEQUENCE=%s\n", int_oligo, suffix,
             pr_oligo_sequence(sa,intl));
        
    /* Print primer start and length */
    if (go_fwd == 1)
      printf("PRIMER_LEFT%s=%d,%d\n", suffix,
             fwd->start + incl_s + pa->first_base_index,
             fwd->length);
    if (go_rev == 1)
      printf("PRIMER_RIGHT%s=%d,%d\n", suffix,
             rev->start + incl_s + pa->first_base_index,
             rev->length);
    if (go_int == 1)
      printf("PRIMER_%s%s=%d,%d\n", int_oligo, suffix,
             intl->start + incl_s + pa->first_base_index,
             intl->length);

    /* Print primer Tm */
    if (go_fwd == 1)
      printf("PRIMER_LEFT%s_TM=%.3f\n", suffix, fwd->temp);
    if (go_rev == 1)
      printf("PRIMER_RIGHT%s_TM=%.3f\n", suffix, rev->temp);
    if (go_int == 1)
      printf("PRIMER_%s%s_TM=%.3f\n", int_oligo, suffix, intl->temp);

    /* Print primer GC content */
    if (go_fwd == 1)
      printf("PRIMER_LEFT%s_GC_PERCENT=%.3f\n", suffix, fwd->gc_content);
    if (go_rev == 1)
      printf("PRIMER_RIGHT%s_GC_PERCENT=%.3f\n", suffix, rev->gc_content);
    if (go_int == 1)
      printf("PRIMER_%s%s_GC_PERCENT=%.3f\n", int_oligo, suffix,
             intl->gc_content);

    /* Print primer self_any */
    if (go_fwd == 1 && pa->thermodynamic_alignment==0)
      printf("PRIMER_LEFT%s_SELF_ANY=%.2f\n", suffix,
             fwd->self_any);
    if (go_rev == 1 && pa->thermodynamic_alignment==0)
      printf("PRIMER_RIGHT%s_SELF_ANY=%.2f\n", suffix,
             rev->self_any);
    if (go_int == 1 && pa->thermodynamic_alignment==0)
      printf("PRIMER_%s%s_SELF_ANY=%.2f\n", int_oligo, suffix,
             intl->self_any);
     if (go_int == 1 && pa->thermodynamic_alignment==1)
       printf("PRIMER_%s%s_SELF_ANY_TH=%.2f\n", int_oligo, suffix,
	      intl->self_any);
    /* Print primer self_any thermodynamical approach */
     if (go_fwd == 1 && pa->thermodynamic_alignment==1)
       printf("PRIMER_LEFT%s_SELF_ANY_TH=%.2f\n", suffix,
	      fwd->self_any);
     if (go_rev == 1 && pa->thermodynamic_alignment==1)
       printf("PRIMER_RIGHT%s_SELF_ANY_TH=%.2f\n", suffix,
	      rev->self_any);
    /* Print primer self_end*/
    if (go_fwd == 1 && pa->thermodynamic_alignment==0)
      printf("PRIMER_LEFT%s_SELF_END=%.2f\n", suffix,
             fwd->self_end);
    if (go_rev == 1 && pa->thermodynamic_alignment==0)
      printf("PRIMER_RIGHT%s_SELF_END=%.2f\n", suffix,
             rev->self_end);
    if (go_int == 1 && pa->thermodynamic_alignment==0)
      printf("PRIMER_%s%s_SELF_END=%.2f\n", int_oligo, suffix,
             intl->self_end);
     if (go_int == 1 && pa->thermodynamic_alignment==1)
       printf("PRIMER_%s%s_SELF_END_TH=%.2f\n", int_oligo, suffix,
	      intl->self_end);
     /* Print primer self_end thermodynamical approach */
     if (go_fwd == 1 && pa->thermodynamic_alignment==1)
       printf("PRIMER_LEFT%s_SELF_END_TH=%.2f\n", suffix,
	      fwd->self_end);
     if (go_rev == 1 && pa->thermodynamic_alignment==1)
       printf("PRIMER_RIGHT%s_SELF_END_TH=%.2f\n", suffix,
	      rev->self_end);
     /* Print primer hairpin */
     if (go_fwd == 1 && pa->thermodynamic_alignment==1)
       printf("PRIMER_LEFT%s_HAIRPIN_TH=%.2f\n", suffix,
	      fwd->hairpin_th);
     if (go_rev == 1 && pa->thermodynamic_alignment==1)
       printf("PRIMER_RIGHT%s_HAIRPIN_TH=%.2f\n", suffix,
	      rev->hairpin_th);
     if (go_int == 1 && pa->thermodynamic_alignment==1)
       printf("PRIMER_%s%s_HAIRPIN_TH=%.2f\n", int_oligo, suffix,
	      intl->hairpin_th);
     /*Print out primer mispriming scores */
    if (io_version == 3) {
		if (seq_lib_num_seq(pa->p_args.repeat_lib) > 0) {
		  if (go_fwd == 1)
		    printf("PRIMER_LEFT%s_MISPRIMING_SCORE=%.2f, %s\n", suffix,
		           fwd->repeat_sim.score[fwd->repeat_sim.max],
		           fwd->repeat_sim.name);
		  if (go_rev == 1)
		    printf("PRIMER_RIGHT%s_MISPRIMING_SCORE=%.2f, %s\n", suffix,
		           rev->repeat_sim.score[rev->repeat_sim.max],
		           rev->repeat_sim.name);
		  if (retval->output_type == primer_pairs)
		    printf("PRIMER_PAIR%s_MISPRIMING_SCORE=%.2f, %s\n", suffix,
		           retval->best_pairs.pairs[i].repeat_sim,
		           retval->best_pairs.pairs[i].rep_name);
		}
    
		/* Print out internal oligo mispriming scores */
		if (go_int == 1 && seq_lib_num_seq(pa->o_args.repeat_lib) > 0)
		  printf("PRIMER_%s%s_MISHYB_SCORE=%.2f, %s\n", int_oligo, suffix,
		         intl->repeat_sim.score[intl->repeat_sim.max],
		         intl->repeat_sim.name);
    } else {
		if (seq_lib_num_seq(pa->p_args.repeat_lib) > 0) {
		  if (go_fwd == 1)
		    printf("PRIMER_LEFT%s_LIBRARY_MISPRIMING=%.2f, %s\n", suffix,
		           fwd->repeat_sim.score[fwd->repeat_sim.max],
		           fwd->repeat_sim.name);
		  if (go_rev == 1)
		    printf("PRIMER_RIGHT%s_LIBRARY_MISPRIMING=%.2f, %s\n", suffix,
		           rev->repeat_sim.score[rev->repeat_sim.max],
		           rev->repeat_sim.name);
		  if (retval->output_type == primer_pairs)
		    printf("PRIMER_PAIR%s_LIBRARY_MISPRIMING=%.2f, %s\n", suffix,
		           retval->best_pairs.pairs[i].repeat_sim,
		           retval->best_pairs.pairs[i].rep_name);
		}
		
		/* Print out internal oligo mispriming scores */
		if (go_int == 1 && seq_lib_num_seq(pa->o_args.repeat_lib) > 0)
		  printf("PRIMER_%s%s_LIBRARY_MISHYB=%.2f, %s\n", int_oligo, suffix,
		         intl->repeat_sim.score[intl->repeat_sim.max],
		         intl->repeat_sim.name);
    }

    /* If a sequence quality was provided, print it*/
    if (NULL != sa->quality){
      if (go_fwd == 1)
        printf("PRIMER_LEFT%s_MIN_SEQ_QUALITY=%d\n", suffix,
               fwd->seq_quality);
      if (go_rev == 1) 
        printf("PRIMER_RIGHT%s_MIN_SEQ_QUALITY=%d\n", suffix,
               rev->seq_quality);
      if (go_int == 1 && (retval->output_type == primer_list)) 
        printf("PRIMER_%s%s_MIN_SEQ_QUALITY=%d\n", int_oligo, suffix,
               intl->seq_quality);
      /* Has to be here and in primer pairs for backward compatibility */
    }
        
    /* Print position penalty, this is for backward compatibility */
    if (!_PR_DEFAULT_POSITION_PENALTIES(pa)
        || !PR_START_CODON_POS_IS_NULL(sa)){
      printf("PRIMER_LEFT%s_POSITION_PENALTY=%f\n", suffix,
             fwd->position_penalty);
      printf("PRIMER_RIGHT%s_POSITION_PENALTY=%f\n", suffix,
             rev->position_penalty);
    }
        
    /* Print primer end stability */
    if (go_fwd == 1)
      printf("PRIMER_LEFT%s_END_STABILITY=%.4f\n",
             suffix, fwd->end_stability);
    if (go_rev == 1)
      printf("PRIMER_RIGHT%s_END_STABILITY=%.4f\n",
             suffix, rev->end_stability);

    /* Print primer template mispriming */
    if ( (pa->thermodynamic_alignment == 0) && (go_fwd == 1) && 
         (oligo_max_template_mispriming(fwd) != ALIGN_SCORE_UNDEF))
      printf("PRIMER_LEFT%s_TEMPLATE_MISPRIMING=%.4f\n", suffix,
             oligo_max_template_mispriming(fwd));
    if ( (pa->thermodynamic_alignment == 0) && (go_rev == 1) && 
         (oligo_max_template_mispriming(rev) != ALIGN_SCORE_UNDEF))
      printf("PRIMER_RIGHT%s_TEMPLATE_MISPRIMING=%.4f\n", suffix,
             oligo_max_template_mispriming(rev));
     /* Print primer template mispriming thermodynamical approach*/
     if ( (pa->thermodynamic_alignment == 1) && (go_fwd == 1) &&
	  (oligo_max_template_mispriming_thermod(fwd) != ALIGN_SCORE_UNDEF))
       printf("PRIMER_LEFT%s_TEMPLATE_MISPRIMING_TH=%.4f\n", suffix,
	      oligo_max_template_mispriming_thermod(fwd));
     if ( (pa->thermodynamic_alignment == 1) && (go_rev == 1) &&
	  (oligo_max_template_mispriming_thermod(rev) != ALIGN_SCORE_UNDEF))
       printf("PRIMER_RIGHT%s_TEMPLATE_MISPRIMING_TH=%.4f\n", suffix,
	      oligo_max_template_mispriming_thermod(rev));
     /************************************************************************************/
     /* Print the pair parameters*/
    if (retval->output_type == primer_pairs) {
      if (go_int == 1 && NULL != sa->quality) /* FIX ME - Uptate the tests */
        printf("PRIMER_%s%s_MIN_SEQ_QUALITY=%d\n", int_oligo,
               suffix, intl->seq_quality);
      /* Print pair comp_any */
       if(pa->thermodynamic_alignment==0)
	 printf("PRIMER_PAIR%s_COMPL_ANY=%.2f\n", suffix,
		retval->best_pairs.pairs[i].compl_any);
       if(pa->thermodynamic_alignment==1)
	 printf("PRIMER_PAIR%s_COMPL_ANY_TH=%.2f\n", suffix,
		retval->best_pairs.pairs[i].compl_any);
       /* Print pair comp_end */
       if(pa->thermodynamic_alignment==0)
	 printf("PRIMER_PAIR%s_COMPL_END=%.2f\n", suffix,
		retval->best_pairs.pairs[i].compl_end);
       if(pa->thermodynamic_alignment==1)
	 printf("PRIMER_PAIR%s_COMPL_END_TH=%.2f\n", suffix,
		retval->best_pairs.pairs[i].compl_end);
       if (io_version == 3) {
	  /* Print product size */
	  printf("PRIMER_PRODUCT_SIZE%s=%d\n", suffix,
		 retval->best_pairs.pairs[i].product_size);
        /* Print the product Tm if a Tm range is defined */
        if (pa->product_max_tm != PR_DEFAULT_PRODUCT_MAX_TM ||
            pa->product_min_tm != PR_DEFAULT_PRODUCT_MIN_TM) {
          printf("PRIMER_PRODUCT_TM%s=%.4f\n", suffix,
                 retval->best_pairs.pairs[i].product_tm);
                    
          printf("PRIMER_PRODUCT_TM_OLIGO_TM_DIFF%s=%.4f\n", suffix,
                 retval->best_pairs.pairs[i].product_tm_oligo_tm_diff);
                
          printf("PRIMER_PAIR%s_T_OPT_A=%.4f\n", suffix,
                 retval->best_pairs.pairs[i].t_opt_a);
        }
      } else {
        /* Print product size */
        printf("PRIMER_PAIR%s_PRODUCT_SIZE=%d\n", suffix,
               retval->best_pairs.pairs[i].product_size);
        /* Print the product Tm if a Tm range is defined */
        if (pa->product_max_tm != PR_DEFAULT_PRODUCT_MAX_TM ||
            pa->product_min_tm != PR_DEFAULT_PRODUCT_MIN_TM) {
          printf("PRIMER_PAIR%s_PRODUCT_TM=%.4f\n", suffix,
                 retval->best_pairs.pairs[i].product_tm);
                    
          printf("PRIMER_PAIR%s_PRODUCT_TM_OLIGO_TM_DIFF=%.4f\n", suffix,
                 retval->best_pairs.pairs[i].product_tm_oligo_tm_diff);
                
          printf("PRIMER_PAIR%s_T_OPT_A=%.4f\n", suffix,
                 retval->best_pairs.pairs[i].t_opt_a);
        }
      }
      
      /* Print the primer pair temlate mispriming */
      if ((pa->thermodynamic_alignment == 0) && (retval->best_pairs.pairs[i].template_mispriming != ALIGN_SCORE_UNDEF))
        printf("PRIMER_PAIR%s_TEMPLATE_MISPRIMING=%.2f\n", suffix,
               retval->best_pairs.pairs[i].template_mispriming);
       /* Print the primer pair temlate mispriming. Thermodynamic approach.  */
       if ((pa->thermodynamic_alignment == 1) && (retval->best_pairs.pairs[i].template_mispriming != ALIGN_SCORE_UNDEF))
	 printf("PRIMER_PAIR%s_TEMPLATE_MISPRIMING_TH=%.2f\n", suffix,
		retval->best_pairs.pairs[i].template_mispriming);

    } /* End of print parameters of primer pairs */
        
  } /* End of the big loop printing all data */
    
    /* End the print with newline and flush all buffers */
  printf("=\n");
  if (fflush(stdout) == EOF) {
    perror("fflush(stdout) failed");
    exit(-1);
  }
}
Пример #5
0
static void
p3sl_append_new_chunk(pr_append_str *x, const char *s)
{
  int r = pr_append_new_chunk_external(x, s);
  if (r) longjmp(_jmp_buf, 1);
}