void DoOverSampleSplitSubRegion(OptionsCls &options, char *dirName) { // look through a directory, and crop each file into its four base experiments char destPath[4][2048]; DIR *d = opendir(options.expPath); struct dirent *entry; int osC[4] = {8,4,2,1}; int osS[4] = {1,2,4,8}; for(int i=0;i<4;i++) sprintf(destPath[i],"%s_%d/%s",options.destPath,osC[i],dirName); if(d) { while ((entry = readdir(d)) != NULL) { if ((entry->d_type != DT_DIR) && ((entry->d_name[0] == 'a') || entry->d_name[0] == 'b' || entry->d_name[0] == 'p')) { for(int i=0;i<4;i++) { // crop this file into its four sub-sampling files options.oneFile = entry->d_name; options.destPath = destPath[i]; options.OverSample_combine=osC[i]; options.OverSample_skip=osS[i]; options.skipCopy=1; DoCrop(options); } } } closedir(d); } }
void subWorker(int os, int skip, char *tmpExpPath, char *tmpDestPath) { OptionsCls LocalOptions; memcpy(&LocalOptions,&options,sizeof(LocalOptions)); LocalOptions.expPath=tmpExpPath; LocalOptions.destPath=tmpDestPath; LocalOptions.OverSample_combine = os; LocalOptions.OverSample_skip = skip; DoCrop(LocalOptions); }
int main ( int argc, char *argv[] ) { InitOptionsCls(options); // int dont_retry = 0; if ( argc == 1 ) { usage ( options.cropx, options.cropy, options.cropw, options.croph ); } int argcc = 1; while ( argcc < argc ) { switch ( argv[argcc][1] ) { case 'a': options.doAscii = 1; break; case 'x': argcc++; options.cropx = atoi ( argv[argcc] ); break; case 'y': argcc++; options.cropy = atoi ( argv[argcc] ); break; case 'w': argcc++; options.cropw = atoi ( argv[argcc] ); break; case 'h': argcc++; // don't segfault if called with -h (user expects help) if ( argcc >= argc ) { usage ( options.cropx, options.cropy, options.cropw, options.croph ); } options.croph = atoi ( argv[argcc] ); break; case 's': argcc++; options.expPath = argv[argcc]; break; case 'f': argcc++; options.oneFile = argv[argcc]; break; case 'z': options.dont_retry = 1; break; case 'p': options.pfc=1; options.cropx=0; options.cropy=0; options.cropw=0; options.croph=0; break; case 'c': options.vfc=1; options.cropx=0; options.cropy=0; options.cropw=0; options.croph=0; break; case 'b': options.OverSamplingSplit=1; options.cropx=0; options.cropy=0; options.cropw=0; options.croph=0; break; case 'n': options.vfc=0; break; case 'v': fprintf ( stdout, "%s", IonVersion::GetFullVersion ( "Crop" ).c_str() ); exit ( 0 ); break; case 'H': usage ( options.cropx, options.cropy, options.cropw, options.croph ); break; case 'd': argcc++; options.destPath = argv[argcc]; break; case 'r': options.regBasedAcq=1; break; case 'l': options.TimeBasedAcq=1; break; case 't': argcc++; options.separatorIn = argv[argcc]; break; case 'e': argcc++; options.t0In = argv[argcc]; options.useSeparatorT0File = false; break; case 'q': argcc++; strncpy(ImageTransformer::PCATest , argv[argcc], sizeof(ImageTransformer::PCATest)-1); break; case 'u': argcc++; options.PCAOpts=argv[argcc]; break; case 'g': argcc++; options.excludeMaskFile = argv[argcc]; options.excludeMask = 1; break; case 'i': argcc++; options.OverSample_combine = atoi(argv[argcc]); argcc++; options.OverSample_skip = atoi(argv[argcc]); break; case 'j': argcc++; numThreads = atoi(argv[argcc]); break; case 'C': options.doColumnCorrection=1; if(argv[argcc+1][0] != '-'){ argcc++; if(argc <= argcc || (argv[argcc][0] != '0' && argv[argcc][0] != '1')){ printf("Bad option on column noise correction\n"); exit(-1); } options.cncType = atoi(argv[argcc]); } break; case 'D': options.doColumnCorrectionTn=1; break; case 'E': options.T0Test=1; break; case 'F': argcc++; options.cmpFile = argv[argcc]; break; case 'G': options.subtractAverage=1; break; case 'I': if(argv[argcc+1][0] != '-'){ argcc++; options.chipType = argv[argcc]; } break; case 'J': options.applyRowCorrection = 1; break; case 'K': options.applyColCorrection = 1; break; case 'L': if(argv[argcc+1][0] != '-'){ argcc++; sscanf(argv[argcc],"%f",&options.applyXtalkCorrection1); } else options.applyXtalkCorrection1 = 0.2; break; case 'M': if(argv[argcc+1][0] != '-'){ argcc++; sscanf(argv[argcc],"%f",&options.applyXtalkCorrection2); } else options.applyXtalkCorrection2 = 0.2; break; default: fprintf ( stdout, "unknown option %s\n",argv[argcc] ); argcc++; break; } argcc++; } if(options.OverSamplingSplit) { // crop an entire directory many times DoOverSampleSplit(options); } else { DoCrop(options); } }
void CCropDialog::on_pushButtonCrop_clicked() { /* ************************* m_pCropThread = new CCropThread(this); m_pCropThread->start(); **************************** */ QString strTemplateFilename(tr("%1/%2") .arg(ui.lineEditSourceFolder->text()) .arg(sTEMPLATE_IMAGE_FILENAME)); if(QFile::exists(strTemplateFilename) != true) { QMessageBox::critical(this, tr("Missing the template image file"), tr("%1 is necessary to crop the image stacks.") .arg(sTEMPLATE_IMAGE_FILENAME)); return; } // make sub folders for cropped data QString strZoomOutFolder, strColumnFolder; QDir Dir; m_bStartCropping = true; ui.pushButtonCrop->setEnabled(false); ui.pushButtonPauseResume->setEnabled(true); ui.listWidgetOutput->clear(); m_bProcessFinished = true; m_bPause = false; //////////////////////////////// // ZO_1 is not a part of ZoomOutLevel, but needs to be made. for(quint32 i = 0, nZoomOutLevel = 1; i < m_TissueBlock.m_nNumZoomLevel+1; i++, nZoomOutLevel *= 2) { strZoomOutFolder = ui.lineEditDestFolder->text() + "/" + QString(sZOOM_OUT_DIR_PREFIX"%1") .arg(nZoomOutLevel); Dir.mkdir(strZoomOutFolder); PrintToOutput(strZoomOutFolder + " folder created."); for(quint32 j = 0; j < m_TissueBlock.m_nNumCol; j++) { strColumnFolder = strZoomOutFolder + "/" + QString("%1").arg(j); Dir.mkdir(strColumnFolder); PrintToOutput("\t" + strColumnFolder + " folder created."); } } // open list for source image files qint32 nOffset = (m_TissueBlock.m_nStartCol > m_TissueBlock.m_nEndCol) ? -1 : 1; //QString strSrcFile; QString strLine; quint32 nSrcStartCol = m_TissueBlock.m_nStartCol; ///////////////////// // specify a task that processes only one column quint32 nColsToCrop = m_TissueBlock.m_nNumCol; quint32 iCol = 0; //if(m_nSrcCropCol != -1) // an image stack number is specified if(ui.comboBoxColumn->currentText() != "All") { int nSrcCropCol = ui.comboBoxColumn->currentText().toInt(); iCol = qAbs((int)nSrcStartCol - nSrcCropCol);//(int)m_nSrcCropCol); nColsToCrop = iCol+1; // only one column nSrcStartCol = nSrcCropCol;//m_nSrcCropCol; } //for( i = 0; i < m_TissueBlock.m_nNumCol; i++, nSrcStartCol+=nOffset) for(; iCol < nColsToCrop; iCol++, nSrcStartCol+=nOffset) { #if 0 ////////////////////////////////////////////////////////////////////// // src image crop area QString strCropFile(tr("%1/%2_crop_point.txt") .arg(ui.lineEditSourceFolder->text()) .arg(nSrcStartCol)); QFile fileCrop(strCropFile); if(!(fileCrop.open(QFile::ReadOnly | QFile::Text))) { PrintToOutput(tr("No %1 exists.").arg(strCropFile)); continue; // ignore no folder exists //QMessageBox::critical(this, tr("File open error"), // tr("No %1 exists.").arg(strCropFile)); //return; } QTextStream txtstrmCrop(&fileCrop); while(!txtstrmCrop.atEnd()) { strLine = txtstrmCrop.readLine(); if(strLine.isNull()) break; m_TissueBlock.m_vCropStartX.append(strLine.toInt()); }; ////////////////////////////////////////////////////////////////////// // src image crop area index QString strChunkPosFile(tr("%1/%2_chunk_pos.txt") .arg(ui.lineEditSourceFolder->text()) .arg(nSrcStartCol)); QFile fileChunkPos(strChunkPosFile); if(!fileChunkPos.open(QFile::ReadOnly | QFile::Text)) { PrintToOutput(tr("No %1 exists.").arg(strChunkPosFile)); continue; // ignore no folder exists //QMessageBox::critical(this, tr("File open error"), // tr("No %1 exists.").arg(strChunkPosFile)); //return; } QTextStream txtstrmChunkPos(&fileChunkPos); while(!txtstrmChunkPos.atEnd()) { strLine = txtstrmChunkPos.readLine(); if(strLine.isNull()) break; m_TissueBlock.m_vChunkPos.append(strLine.toDouble()); } #endif QString strSubFolder(tr("%1/%2") .arg(ui.lineEditSourceFolder->text()) .arg(nSrcStartCol)); QDir dirDataFolder(strSubFolder); QStringList slstFilters; slstFilters << QString(tr("*%1").arg(m_Settings.m_strDestFileFormat)); dirDataFolder.setNameFilters(slstFilters); QStringList slstEntry = dirDataFolder.entryList(); PrintToOutput(tr("Files: %1").arg(slstEntry.count())); if(slstEntry.count() > 0) ui.progressBarImage->setRange(0, slstEntry.count()-1); QString strDestImage, strOptions, strSrcImage, strArgs; //QStrinList strlstLine; qreal rZ; quint32 nImage;//, nStartImage;//, nIndexChunk = 0; //bool bFirst = true; //while(!txtstrmSrc.atEnd()) for(int iImage = 0; iImage < slstEntry.count(); iImage++) { //QStringList slstImageFile = slstEntry.at(nImage).split("."); QString strImageFile = slstEntry.at(iImage); // src image filename //strLine = txtstrmSrc.readLine(); //if(strLine.isNull()) // break; // get z coordinate value int nPosZ = strImageFile.indexOf('z', 0);//strLine.indexOf('z', 0); if(nPosZ == -1) { QMessageBox::critical(this, tr("Invalid src image filename"), tr("%1 is an invalid src image filename.") .arg(strImageFile)); //.arg(strLine)); m_bStartCropping = false; ui.pushButtonCrop->setEnabled(true); ui.pushButtonPauseResume->setEnabled(false); return; } rZ = strImageFile.mid(nPosZ+1, 6).toDouble();//strLine.mid(nPosZ+1, 6).toDouble(); nImage = qRound((rZ - m_TissueBlock.m_rMinStartZ)\ /m_TissueBlock.m_rThickness); //if(bFirst) //{ // bFirst = false; // nStartImage = nImage; //} #if 0 //if((nImage - nStartImage) == m_TissueBlock.m_vChunkPos[nIndexChunk]) if(rZ == m_TissueBlock.m_vChunkPos[nIndexChunk]) nIndexChunk++; #endif // make src filename strSrcImage = QString(tr("%1/%2/%3") .arg(ui.lineEditSourceFolder->text()) .arg(nSrcStartCol) .arg(strImageFile));//.arg(strLine)); // make dest filename QString strZoomOutDir = m_Settings.m_strZoomOutDirPrefix + "1"; //strDestImage = QString(tr("%1/%2/%3/%4%5") // .arg(ui.lineEditDestFolder->text()) // .arg(strZoomOutDir) // .arg(i) // .arg(nImage) // .arg(m_Settings.m_strDestFileFormat)); strDestImage.sprintf("%s/%s/%d/%05d%s", ui.lineEditDestFolder->text().toStdString().c_str(), strZoomOutDir.toStdString().c_str(), iCol, // jrkwon: %05d nImage, m_Settings.m_strDestFileFormat.toStdString().c_str()); #if 0 strOptions = QString(tr("%1x%2+%3+%4") .arg(m_TissueBlock.m_nWidth) .arg(m_TissueBlock.m_nLength) .arg(m_TissueBlock.m_vCropStartX[nIndexChunk]) .arg(0)); strArgs = QString(tr("%1 -crop %2 %3") .arg(strSrcImage) .arg(strOptions) .arg(strDestImage)); PrintToOutput(strArgs); QStringList strlstArgs; strlstArgs << strSrcImage << tr("-crop") << strOptions << strDestImage; QString strImageMagickConvert; strImageMagickConvert = QString(tr("%1%2%3%4") .arg(m_Settings.m_strProjectDir) .arg(m_Settings.m_strToolkit) .arg(m_Settings.m_strImageMagick) .arg("/convert")); #endif ui.progressBarColumn->setValue(iCol); ui.progressBarImage->setValue(iImage); #if 0 while(m_bProcessFinished == false || m_bPause) { QCoreApplication::processEvents(); } m_Process.start(strImageMagickConvert, strlstArgs); m_bProcessFinished = false; //PrintToOutput(strImageMagickConvert); QCoreApplication::processEvents(); #endif // see if there already is a dest file, and do this only no dest file exists if(QFile::exists(strDestImage) == false) { quint32 nStartX; if(GetCropX(strSrcImage, nStartX)) { //DoCrop(m_TissueBlock.m_vCropStartX[nIndexChunk], 0, DoCrop(nStartX, 0, m_TissueBlock.m_nWidth, m_TissueBlock.m_nLength, strSrcImage, strDestImage); QString strMsg(tr("CropX: %1, Src: %2, Dest: %3") .arg(nStartX).arg(strSrcImage).arg(strDestImage)); PrintToOutput(strMsg); } } if(m_bStartCropping != true) { ui.pushButtonCrop->setEnabled(true); ui.pushButtonPauseResume->setEnabled(false); ui.progressBarColumn->setValue(0); ui.progressBarImage->setValue(0); return; } } } ui.pushButtonCrop->setEnabled(true); ui.pushButtonPauseResume->setEnabled(false); }