OSDN Git Service

Please enter the commit message for your changes. Lines starting
[eos/base.git] / src / Tools / filter / mrc2hdf / src / mrc2hdf.c
index d02bb68..439748a 100755 (executable)
 typedef struct lmrc2hdfInfo {
        int   numFile;
     int   nResolution;
+    int flagIn;
+    mrcImage* in;
+    float inColor[4];
+    int flagIn2;
+    mrcImage* in2;
+    float in2Color[4];
 } lmrc2hdfInfo;
 
 typedef enum lmrc2hdfMode {
@@ -41,7 +47,6 @@ main(int argc, char* argv[])
 {
        mrc2hdfInfo info;
     lmrc2hdfInfo linfo;
-    mrcImage* in;
 
     hid_t   out;
     herr_t  status;
@@ -55,13 +60,37 @@ main(int argc, char* argv[])
        DEBUGPRINT("Program Start\n");
     if(info.flagIn) {
         linfo.numFile = 1;
-        in = (mrcImage*)memoryAllocate(sizeof(mrcImage), "in main");
-        mrcFileRead(in, info.In, "in main", 0);
+        linfo.in = (mrcImage*)memoryAllocate(sizeof(mrcImage), "in main");
+        mrcFileRead(linfo.in, info.In, "in main", 0);
+        linfo.flagIn = 1;
+        linfo.flagIn2 = 0;
     } else if(info.flagInList) {
         linfo.numFile = info.flagInList;
-        in = (mrcImage*)memoryAllocate(sizeof(mrcImage)*linfo.numFile, "in main");
+        linfo.flagIn = info.flagInList;
+        linfo.in = (mrcImage*)memoryAllocate(sizeof(mrcImage)*linfo.numFile, "in main");
         for(i=0; i<linfo.numFile; i++) {
-            mrcFileRead(&(in[i]), info.InList[i], "in main", 0);
+            mrcFileRead(&(linfo.in[i]), info.InList[i], "in main", 0);
+        }
+        linfo.inColor[0] = info.IR;
+        linfo.inColor[1] = info.IG;
+        linfo.inColor[2] = info.IB;
+        linfo.inColor[3] = info.IA;
+        if(info.flagInList2) {
+            if(linfo.numFile != info.flagInList2) {
+                fprintf(stderr, "Different Number between -I and -I2: %ld %ld\n", info.flagInList, info.flagInList2);
+                exit(EXIT_FAILURE);
+            }
+            linfo.flagIn2 = info.flagInList2;
+            linfo.in2 = (mrcImage*)memoryAllocate(sizeof(mrcImage)*linfo.numFile, "in main");
+            for(i=0; i<linfo.numFile; i++) {
+                mrcFileRead(&(linfo.in2[i]), info.InList2[i], "in main", 0);
+            }
+            linfo.in2Color[0] = info.I2R;
+            linfo.in2Color[1] = info.I2G;
+            linfo.in2Color[2] = info.I2B;
+            linfo.in2Color[3] = info.I2A;
+        } else {
+            linfo.flagIn2 = 0;
         }
     } else {
         fprintf(stderr, "-i or -I is necessary\n");
@@ -77,11 +106,11 @@ main(int argc, char* argv[])
 
     switch(info.hdf5mode) {
         case 0: { 
-            lmrc2hdf(&out, in, &linfo, info.mode);
+            lmrc2hdf(&out, linfo.in, &linfo, info.mode);
             break;
         }
         case 1: {
-            lmrc2hdfimaris(&out, in, &linfo, info.mode);
+            lmrc2hdfimaris(&out, linfo.in, &linfo, info.mode);
             break;
         }
         default: {
@@ -235,6 +264,7 @@ lmrc2hdfimaris(hid_t* out, mrcImage* in, lmrc2hdfInfo* linfo, int mode)
     unsigned char* thumbImage;
     double sum, min, max, mean;
     mrcImage tmpImage;
+    mrcImage* tmpIn; 
     lmrcImageProjectionInfo lpro;
 
     DEBUGPRINT("Start lmrc2hdfimaris\n");
@@ -283,7 +313,21 @@ lmrc2hdfimaris(hid_t* out, mrcImage* in, lmrc2hdfInfo* linfo, int mode)
     // DataSet 
     nres = linfo->nResolution;
     ntime = linfo->numFile;
-    nchannel = 1;
+    if(0<linfo->flagIn) {
+        nchannel = 1;
+    }
+    if(0<linfo->flagIn2) {
+        nchannel = 2;
+        if(in[0].HeaderN.x != linfo->in2[0].HeaderN.x
+         ||in[0].HeaderN.y != linfo->in2[0].HeaderN.y
+         ||in[0].HeaderN.z != linfo->in2[0].HeaderN.z) {
+            fprintf(stderr, "Different Size : In (%d %d %d) and I2 (%d, %d, %d)\n", 
+                linfo->in[0].HeaderN.x,  linfo->in[0].HeaderN.y,  linfo->in[0].HeaderN.z, 
+                linfo->in2[0].HeaderN.x, linfo->in2[0].HeaderN.y, linfo->in2[0].HeaderN.z);
+            exit(EXIT_FAILURE);
+        }
+    }
+
     // ResolutionLevel
     for(ires=0; ires<nres; ires++) {
         sprintf(tmp, "%s/%s %d", groupName[0], "ResolutionLevel", ires);
@@ -294,6 +338,18 @@ lmrc2hdfimaris(hid_t* out, mrcImage* in, lmrc2hdfInfo* linfo, int mode)
         gIDTime = H5Gcreate2(gIDRes, tmp, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
         DEBUGPRINT1("%s\n", tmp);
     for(ichannel=0; ichannel<nchannel; ichannel++) {
+        switch(ichannel) {
+            case 0: 
+                tmpIn = linfo->in;
+                break;
+            case 1:
+                tmpIn = linfo->in2; 
+                break;
+            default:
+                fprintf(stderr, "Not supported ichannel: %d\n", ichannel);
+                exit(EXIT_FAILURE);
+                break;
+        }
         sprintf(tmp, "%s/%s %d/%s %d/%s %d", groupName[0], "ResolutionLevel", ires, "TimePoint", itime, "Channel", ichannel);
         gIDChannel = H5Gcreate2(gIDTime, tmp, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
         DEBUGPRINT1("%s\n", tmp);
@@ -306,17 +362,17 @@ lmrc2hdfimaris(hid_t* out, mrcImage* in, lmrc2hdfInfo* linfo, int mode)
         dspaceID = H5Screate_simple(3, dims, NULL);
         sprintf(tmp, "%s/%s %d/%s %d/%s %d/%s", groupName[0], "ResolutionLevel", ires, "TimePoint", itime, "Channel", ichannel, "Data");
         DEBUGPRINT1("%s\n", tmp);
-        DEBUGPRINT1("mode: %d\n", in[ichannel].HeaderMode);
+        DEBUGPRINT1("mode: %d\n", tmpIn[0].HeaderMode);
         image = (float*)memoryAllocate(sizeof(float)*dims[0]*dims[1]*dims[2], "in lmrc2hdfimars");
 
         for(i=0; i<256; i++) hist[i] = 0;
         for(i=0; i<1024; i++) hist1024[i] = 0;
         // image
         DEBUGPRINT("image\n");
-        if(in[itime].HeaderAMax<=in[itime].HeaderAMin) {
+        if(tmpIn[itime].HeaderAMax<=tmpIn[itime].HeaderAMin) {
             fprintf(stderr, "Image data is flat\n");
             for(i=0; i<dims[0]*dims[1]*dims[2]; i++) {
-                image[i] = in[itime].HeaderAMin;
+                image[i] = tmpIn[itime].HeaderAMin;
                 hist[0]++;
                 hist1024[0]++;
             }
@@ -340,7 +396,7 @@ lmrc2hdfimaris(hid_t* out, mrcImage* in, lmrc2hdfInfo* linfo, int mode)
                 for(yorg=y*irange;yorg<(y+1)*irange; yorg++) { 
                 for(xorg=x*irange;xorg<(x+1)*irange; xorg++) { 
                     numrange++;
-                    mrcPixelDataGet(&(in[itime]), xorg, yorg, zorg, &data, mrcPixelRePart, mrcPixelHowNearest);
+                    mrcPixelDataGet(&(tmpIn[itime]), xorg, yorg, zorg, &data, mrcPixelRePart, mrcPixelHowNearest);
                     sum+=data;
                 } 
                 }