1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
|
// an example programme that uses slow5lib to append to an existing SLOW5 file
// gcc -Wall examples/append.c -I include/ lib/libslow5.a -lm -lz -O2 -g
/* In this example, the following slow5 record will be appended to the file generated throgh write.c example:
#char* uint32_t double double double double uint64_t int16_t* char* double int32_t uint8_t uint64_t
#read_id read_group digitisation offset range sampling_rate len_raw_signal raw_signal channel_number median_before read_number start_mux start_time
read_1 0 4096 4 12 4000 12 0,1,2,3,4,5,6,7,8,9,10,11 1 0.2 11 2 200
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <slow5/slow5.h>
#define FILE_PATH "test.blow5"
int main(){
//open the SLOW5 file for appending
slow5_file_t *sp = slow5_open(FILE_PATH, "a");
if(sp==NULL){
fprintf(stderr,"Error opening file!\n");
exit(EXIT_FAILURE);
}
/******************* A SLOW5 record ************************/
slow5_rec_t *slow5_record = slow5_rec_init();
if(slow5_record == NULL){
fprintf(stderr,"Could not allocate space for a slow5 record.");
exit(EXIT_FAILURE);
}
//primary fields
slow5_record -> read_id = strdup("read_1");
if(slow5_record->read_id == NULL){
fprintf(stderr,"Could not allocate space for strdup.");
exit(EXIT_FAILURE);
}
slow5_record -> read_id_len = strlen(slow5_record -> read_id);
slow5_record -> read_group = 0;
slow5_record -> digitisation = 4096.0;
slow5_record -> offset = 4.0;
slow5_record -> range = 12.0;
slow5_record -> sampling_rate = 4000.0;
slow5_record -> len_raw_signal = 12;
slow5_record -> raw_signal = malloc(sizeof(int16_t) * slow5_record -> len_raw_signal);
if(slow5_record->raw_signal == NULL){
fprintf(stderr,"Could not allocate space for raw signal.");
exit(EXIT_FAILURE);
}
for(int i=0; i<slow5_record->len_raw_signal; i++){
slow5_record->raw_signal[i] = i;
}
//auxiliary fileds
char *channel_number = "1";
double median_before = 0.2;
int32_t read_number = 11;
uint8_t start_mux = 2;
uint64_t start_time = 200;
if(slow5_aux_set_string(slow5_record, "channel_number", channel_number, sp->header) < 0){
fprintf(stderr,"Error setting channel_number auxilliary field\n");
exit(EXIT_FAILURE);
}
if(slow5_aux_set(slow5_record, "median_before", &median_before, sp->header) < 0){
fprintf(stderr,"Error setting median_before auxilliary field\n");
exit(EXIT_FAILURE);
}
if(slow5_aux_set(slow5_record, "read_number", &read_number, sp->header) < 0){
fprintf(stderr,"Error setting read_number auxilliary field\n");
exit(EXIT_FAILURE);
}
if(slow5_aux_set(slow5_record, "start_mux", &start_mux, sp->header) < 0){
fprintf(stderr,"Error setting start_mux auxilliary field\n");
exit(EXIT_FAILURE);
}
if(slow5_aux_set(slow5_record, "start_time", &start_time, sp->header) < 0){
fprintf(stderr,"Error setting start_time auxilliary field\n");
exit(EXIT_FAILURE);
}
//append the record to the file
if(slow5_write(slow5_record, sp) < 0){
fprintf(stderr,"Error writing record to file\n");
exit(EXIT_FAILURE);
}
//free the slow5 record
slow5_rec_free(slow5_record);
//close the SLOW5 file
slow5_close(sp);
return 0;
}
|