121 lines
4.8 KiB
C++
121 lines
4.8 KiB
C++
#include <cstdio>
|
|
#include <cstdlib>
|
|
#include <cstring>
|
|
|
|
#include "bntseq.h"
|
|
#include "bwt.h"
|
|
#include "bwtaln.h"
|
|
#include "bwa_gateway.h"
|
|
#include "org_broadinstitute_sting_alignment_bwa_BWACAligner.h"
|
|
|
|
static jclass java_alignment_array_class = NULL;
|
|
static jclass java_alignment_class = NULL;
|
|
static jmethodID java_alignment_constructor = NULL;
|
|
|
|
JNIEXPORT jlong JNICALL Java_org_broadinstitute_sting_alignment_bwa_BWACAligner_create(JNIEnv* env,
|
|
jobject instance,
|
|
jstring java_ann,
|
|
jstring java_amb,
|
|
jstring java_pac,
|
|
jstring java_forward_bwt,
|
|
jstring java_forward_sa,
|
|
jstring java_reverse_bwt,
|
|
jstring java_reverse_sa)
|
|
{
|
|
const char* ann_filename = env->GetStringUTFChars(java_ann, JNI_FALSE);
|
|
const char* amb_filename = env->GetStringUTFChars(java_amb, JNI_FALSE);
|
|
const char* pac_filename = env->GetStringUTFChars(java_pac, JNI_FALSE);
|
|
const char* forward_bwt_filename = env->GetStringUTFChars(java_forward_bwt, JNI_FALSE);
|
|
const char* forward_sa_filename = env->GetStringUTFChars(java_forward_sa, JNI_FALSE);
|
|
const char* reverse_bwt_filename = env->GetStringUTFChars(java_reverse_bwt, JNI_FALSE);
|
|
const char* reverse_sa_filename = env->GetStringUTFChars(java_reverse_sa, JNI_FALSE);
|
|
|
|
BWA* bwa = new BWA(ann_filename,
|
|
amb_filename,
|
|
pac_filename,
|
|
forward_bwt_filename,
|
|
forward_sa_filename,
|
|
reverse_bwt_filename,
|
|
reverse_sa_filename);
|
|
|
|
env->ReleaseStringUTFChars(java_ann,ann_filename);
|
|
env->ReleaseStringUTFChars(java_amb,amb_filename);
|
|
env->ReleaseStringUTFChars(java_pac,pac_filename);
|
|
env->ReleaseStringUTFChars(java_forward_bwt,forward_bwt_filename);
|
|
env->ReleaseStringUTFChars(java_forward_sa,forward_sa_filename);
|
|
env->ReleaseStringUTFChars(java_reverse_bwt,reverse_bwt_filename);
|
|
env->ReleaseStringUTFChars(java_reverse_sa,reverse_sa_filename);
|
|
|
|
// Cache the class object for an array of alignments.
|
|
java_alignment_array_class = env->FindClass("[Lorg/broadinstitute/sting/alignment/Alignment;");
|
|
java_alignment_class = env->FindClass("org/broadinstitute/sting/alignment/Alignment");
|
|
java_alignment_constructor = env->GetMethodID(java_alignment_class, "<init>", "(IIZI[C[I)V");
|
|
|
|
return (jlong)bwa;
|
|
}
|
|
|
|
JNIEXPORT void JNICALL Java_org_broadinstitute_sting_alignment_bwa_BWACAligner_destroy(JNIEnv* env, jobject instance, jlong java_bwa)
|
|
{
|
|
BWA* bwa = (BWA*)java_bwa;
|
|
delete bwa;
|
|
}
|
|
|
|
JNIEXPORT jobjectArray JNICALL Java_org_broadinstitute_sting_alignment_bwa_BWACAligner_align(JNIEnv* env, jobject object, jlong java_bwa, jbyteArray java_bases) {
|
|
BWA* bwa = (BWA*)java_bwa;
|
|
|
|
const jsize read_length = env->GetArrayLength(java_bases);
|
|
jbyte *read_bases = env->GetByteArrayElements(java_bases,JNI_FALSE);
|
|
|
|
Alignment* alignments = NULL;
|
|
unsigned num_alignments = 1;
|
|
bwa->align((const char*)read_bases,read_length,alignments,num_alignments);
|
|
|
|
jobjectArray java_alignments = env->NewObjectArray(num_alignments, env->FindClass("org/broadinstitute/sting/alignment/Alignment"), NULL);
|
|
|
|
for(unsigned alignment_idx = 0; alignment_idx < (unsigned)num_alignments; alignment_idx++) {
|
|
Alignment& alignment = *(alignments + alignment_idx);
|
|
|
|
unsigned cigar_length;
|
|
if(alignment.type == BWA_TYPE_NO_MATCH) cigar_length = 0;
|
|
else if(!alignment.cigar) cigar_length = 1;
|
|
else cigar_length = alignment.n_cigar;
|
|
|
|
jcharArray java_cigar_operators = env->NewCharArray(cigar_length);
|
|
jintArray java_cigar_lengths = env->NewIntArray(cigar_length);
|
|
|
|
if(alignment.cigar) {
|
|
for(unsigned cigar_idx = 0; cigar_idx < (unsigned)alignment.n_cigar; ++cigar_idx) {
|
|
jchar cigar_operator = "MIDS"[alignment.cigar[cigar_idx]>>14];
|
|
jint cigar_length = alignment.cigar[cigar_idx]&0x3fff;
|
|
env->SetCharArrayRegion(java_cigar_operators,cigar_idx,1,&cigar_operator);
|
|
env->SetIntArrayRegion(java_cigar_lengths,cigar_idx,1,&cigar_length);
|
|
}
|
|
}
|
|
else {
|
|
if(alignment.type != BWA_TYPE_NO_MATCH) {
|
|
jchar cigar_operator = 'M';
|
|
env->SetCharArrayRegion(java_cigar_operators,0,1,&cigar_operator);
|
|
env->SetIntArrayRegion(java_cigar_lengths,0,1,&read_length);
|
|
}
|
|
}
|
|
|
|
jclass java_alignment_class = env->FindClass("org/broadinstitute/sting/alignment/Alignment");
|
|
jmethodID java_alignment_constructor = env->GetMethodID(java_alignment_class, "<init>", "(IIZI[C[I)V");
|
|
jobject java_alignment = env->NewObject(java_alignment_class,
|
|
java_alignment_constructor,
|
|
alignment.contig,
|
|
alignment.pos,
|
|
alignment.negative_strand,
|
|
alignment.mapQ,
|
|
java_cigar_operators,
|
|
java_cigar_lengths);
|
|
env->SetObjectArrayElement(java_alignments,alignment_idx,java_alignment);
|
|
}
|
|
|
|
delete[] alignments;
|
|
|
|
env->ReleaseByteArrayElements(java_bases,read_bases,0);
|
|
|
|
return java_alignments;
|
|
}
|