+ fixed a bug in the C++ interface
[qpalma.git] / QPalmaDP / qpalma_dp.cpp
index 4c33425..a81652d 100644 (file)
@@ -17,12 +17,18 @@ Alignment::Alignment() {
       id = 0;
       name = 0;
       use_svm = 0;
-}
 
-Alignment::~Alignment() {}
+      splice_align = 0;
+      est_align = 0;
+      mmatrix_param = 0;
+      alignmentscores = 0;
+      qualityMatrix = 0;
+}
 
 void Alignment::setQualityMatrix(double* qMat, int length){
-   qualityMatrix = new double[length];
+   if(qualityMatrix == 0)
+      qualityMatrix = new double[length];
+
    for(int i=0; i<length; i++)
       qualityMatrix[i] = qMat[i];
 }
@@ -37,7 +43,7 @@ void Alignment::myalign(int nr_paths_p, char* dna, int dna_len_p, char* est,
       double* donor, int d_len, double* acceptor, int a_len,
       bool remove_duplicate_scores, bool print_matrix) {
 
-   printf("Entering myalign...\n");
+   // printf("Entering myalign...\n");
 
    mlen = 6; // score matrix: length of 6 for "- A C G T N"
    dna_len =  dna_len_p + 1 ;
@@ -72,31 +78,34 @@ void Alignment::myalign(int nr_paths_p, char* dna, int dna_len_p, char* est,
       matrices[z] = new Pre_score[dna_len * est_len];
   }
   
-  printf("calling fill_matrix...\n");
+  // printf("calling fill_matrix...\n");
 
   fill_matrix(nr_paths, matrices, est_len, dna_len, est, dna, &h, matchmatrix, donor, acceptor, remove_duplicate_scores, nr_donor_sites, donor_sites, max_score_positions);
   
-  printf("after call to fill_matrix...\n");
+  // printf("after call to fill_matrix...\n");
   /***************************************************************************/ 
   // return arguments etc.
   /***************************************************************************/
   int result_length; //Eine Variable fuer alle Matrizen
 
-  printf("before init of splice_align and rest...\n");
+  // printf("before init of splice_align and rest...\n");
 
   splice_align = new int[(dna_len-1)*nr_paths];
   est_align = new int[(est_len-1)*nr_paths];
   mmatrix_param = new int[(mlen*mlen)*nr_paths];
   alignmentscores = new double[nr_paths]; //alignment score for each path/matrix
 
-  printf("before memset...\n");
+  // printf("before memset...\n");
 
   memset((char*)splice_align, -1, (dna_len-1)*nr_paths*sizeof(int)); // fills splice_align with zeros
   memset((char*)est_align, -1, (est_len-1)*nr_paths*sizeof(int)); // fills est_align with zeros
   memset((char*)mmatrix_param, 0, mlen*mlen*nr_paths*sizeof(int)); //fills mmatrix_param with zeros
   memset(alignmentscores, -1, nr_paths*sizeof(double)); //fills alignmentscores with zeros
   
-  printf("after memset...\n");
+  // printf("after memset...\n");
+    // dnaest
+   double *DNA_ARRAY = 0;
+   double *EST_ARRAY = 0;
 
   for (int z=0; z<nr_paths; z++) {      
     result_length = 0 ;
@@ -107,10 +116,14 @@ void Alignment::myalign(int nr_paths_p, char* dna, int dna_len_p, char* est,
     
     bool no_more_path = result_align(matrices, z, est_len, dna_len, &result_length, est, dna, s_align, e_align, mparam, alignmentscores, max_score_positions);
       
-    // dnaest
-    double *DNA = new double[result_length];
-    double *EST = new double[result_length];
-    
+      if(DNA_ARRAY != 0) {
+       delete[] DNA_ARRAY;
+       delete[] EST_ARRAY;
+    }
+
+   DNA_ARRAY = new double[result_length];
+   EST_ARRAY = new double[result_length];
+
     //backtracking
     int i = max_score_positions[2*z] ; //i (est)
     int j = max_score_positions[2*z +1] ; //j (dna)
@@ -120,21 +133,21 @@ void Alignment::myalign(int nr_paths_p, char* dna, int dna_len_p, char* est,
     
     for (int ii=result_length; ii>0; ii--) {
       if ((prev_i == (i-1)) && (prev_j == (j-1))) { // match or mismatch
-       DNA[ii-1] = check_char(dna[j-1]) ;
-       EST[ii-1] = check_char(est[i-1]) ;
+       DNA_ARRAY[ii-1] = check_char(dna[j-1]) ;
+       EST_ARRAY[ii-1] = check_char(est[i-1]) ;
       }
-      else if ((prev_i == (i)) && (prev_j == (j-1))) {// gap on EST
-       DNA[ii-1] = check_char(dna[j-1]) ;
-       EST[ii-1] = 0 ; //gap
+      else if ((prev_i == (i)) && (prev_j == (j-1))) {// gap on EST_ARRAY
+       DNA_ARRAY[ii-1] = check_char(dna[j-1]) ;
+       EST_ARRAY[ii-1] = 0 ; //gap
       }
-      else if ((prev_i == (i-1)) && (prev_j == (j))) { // gap on DNA
-       DNA[ii-1] = 0 ; //gap
-       EST[ii-1] = check_char(est[i-1]) ;
+      else if ((prev_i == (i-1)) && (prev_j == (j))) { // gap on DNA_ARRAY
+       DNA_ARRAY[ii-1] = 0 ; //gap
+       EST_ARRAY[ii-1] = check_char(est[i-1]) ;
       }
       else {// splice site
        for (j; j > prev_j; j--) {
-         DNA[ii-1] = check_char(dna[j-1]) ;
-         EST[ii-1] = 6 ; //intron
+         DNA_ARRAY[ii-1] = check_char(dna[j-1]) ;
+         EST_ARRAY[ii-1] = 6 ; //intron
          ii-- ;
        }
        ii++ ; // last ii-- too much (because done in for-loop) 
@@ -149,13 +162,21 @@ void Alignment::myalign(int nr_paths_p, char* dna, int dna_len_p, char* est,
     
   } //end of z
 
-  printf("Leaving myalign...\n");
+   if(DNA_ARRAY != 0) {
+    delete[] DNA_ARRAY;
+    delete[] EST_ARRAY;
+    }
+
+   for (int i=nr_paths-1;i>=0; i--)
+      delete[] matrices[i];
+
+   //printf("Leaving myalign...\n");
 }
 
 void Alignment::getAlignmentResults(int* s_align, int* e_align,
       int* mmatrix_p, double* alignscores) {
 
-   printf("Entering getAlignmentResults...\n");
+   // printf("Entering getAlignmentResults...\n");
    uint splice_align_size = (dna_len-1)*nr_paths;
    uint est_align_size = (est_len-1)*nr_paths;
    uint mmatrix_param_size = (mlen*mlen)*nr_paths;
@@ -173,6 +194,6 @@ void Alignment::getAlignmentResults(int* s_align, int* e_align,
    for(int idx=0; idx<alignmentscores_size; idx++)
       alignscores[idx] = alignmentscores[idx];
    
-   printf("Leaving getAlignmentResults...\n");
+   // printf("Leaving getAlignmentResults...\n");
 }