Index: /branches/eam_branches/ipp-20100621/Ohana/src/libdvo/include/dvo.h
===================================================================
--- /branches/eam_branches/ipp-20100621/Ohana/src/libdvo/include/dvo.h	(revision 28987)
+++ /branches/eam_branches/ipp-20100621/Ohana/src/libdvo/include/dvo.h	(revision 28988)
@@ -329,4 +329,7 @@
 
 PhotCodeData *GetPhotcodeTable (void);
+void SetPhotcodeTable (PhotCodeData *);
+
+int *GetSecFiltMap(PhotCodeData *ouput, PhotCodeData* input);
 
 int LoadPhotcodes (char *catdir_file, char *master_file, int readwrite);
Index: /branches/eam_branches/ipp-20100621/Ohana/src/libdvo/src/LoadPhotcodesText.c
===================================================================
--- /branches/eam_branches/ipp-20100621/Ohana/src/libdvo/src/LoadPhotcodesText.c	(revision 28987)
+++ /branches/eam_branches/ipp-20100621/Ohana/src/libdvo/src/LoadPhotcodesText.c	(revision 28988)
@@ -109,4 +109,5 @@
 
     photcode[Ncode].type = 0;
+    memset(photcode[Ncode].dummy, 0, sizeof(photcode[Ncode].dummy));
     photcode[Ncode].code = code;
     memset (photcode[Ncode].name, 0, 32);
Index: /branches/eam_branches/ipp-20100621/Ohana/src/libdvo/src/coordops.c
===================================================================
--- /branches/eam_branches/ipp-20100621/Ohana/src/libdvo/src/coordops.c	(revision 28987)
+++ /branches/eam_branches/ipp-20100621/Ohana/src/libdvo/src/coordops.c	(revision 28988)
@@ -41,10 +41,11 @@
     *L += X2*coords[0].polyterms[0][0] + XY*coords[0].polyterms[1][0] + Y2*coords[0].polyterms[2][0];
     *M += X2*coords[0].polyterms[0][1] + XY*coords[0].polyterms[1][1] + Y2*coords[0].polyterms[2][1];
-  }
-  if (coords[0].Npolyterms > 2) {
-    X3 = X2*X;
-    Y3 = Y2*Y;
-    *L += X3*coords[0].polyterms[3][0] + X2*Y*coords[0].polyterms[4][0] + X*Y2*coords[0].polyterms[5][0] + Y3*coords[0].polyterms[6][0];
-    *M += X3*coords[0].polyterms[3][1] + X2*Y*coords[0].polyterms[4][1] + X*Y2*coords[0].polyterms[5][1] + Y3*coords[0].polyterms[6][1];
+
+    if (coords[0].Npolyterms > 2) {
+      X3 = X2*X;
+      Y3 = Y2*Y;
+      *L += X3*coords[0].polyterms[3][0] + X2*Y*coords[0].polyterms[4][0] + X*Y2*coords[0].polyterms[5][0] + Y3*coords[0].polyterms[6][0];
+      *M += X3*coords[0].polyterms[3][1] + X2*Y*coords[0].polyterms[4][1] + X*Y2*coords[0].polyterms[5][1] + Y3*coords[0].polyterms[6][1];
+    }
   }
 
Index: /branches/eam_branches/ipp-20100621/Ohana/src/libdvo/src/dvo_photcode_ops.c
===================================================================
--- /branches/eam_branches/ipp-20100621/Ohana/src/libdvo/src/dvo_photcode_ops.c	(revision 28987)
+++ /branches/eam_branches/ipp-20100621/Ohana/src/libdvo/src/dvo_photcode_ops.c	(revision 28988)
@@ -21,10 +21,16 @@
 PhotCodeData *GetPhotcodeTable () {
 
-  /* allocate space to photcode table, free existing data */
   if (photcodes == NULL) {
+    /* allocate space to photcode table */
     ALLOCATE (photcodes, PhotCodeData, 1);
     photcodes[0].code = NULL;
   }
   return photcodes;
+}
+
+// set the photcode table. This is used to switch between serveral previously
+// allocated tables
+void SetPhotcodeTable (PhotCodeData *new) {
+  photcodes = new;  
 }
 
@@ -531,4 +537,26 @@
 }
 
+// Create a map between the secfilt values from one photcode table to another
+int *GetSecFiltMap(PhotCodeData *output, PhotCodeData *input) {
+  int i;
+  int NsecfiltIn  = input[0].Nsecfilt;
+  int *map;
+  ALLOCATE(map, int, NsecfiltIn);
+
+  // loop over entries 
+  for (i = 0; i < NsecfiltIn; i++) {
+    int code  = input[0].codeNsec[i];
+    int entry = output[0].hashcode[code];
+    if (entry == -1) {
+      // entry is missing
+      free(map);
+      return(FALSE);
+    }
+    map[i] = entry;
+  }
+
+  return map;
+}
+
 /* photcode table should have the following format: 
 
