bool AbstractHdf5Converter<ELEMENT_DIM,SPACE_DIM>::MoveOntoNextDataset() { // If we are already at the end just return false. if (mDatasetNames.size() == mOpenDatasetIndex+1u) { return false; } // If we haven't read anything yet, start at the beginning, otherwise increment by one. if (mOpenDatasetIndex==UNSIGNED_UNSET) { mOpenDatasetIndex = 0u; } else { mOpenDatasetIndex++; } // Store directory, mesh and filenames and create the reader mpReader.reset(new Hdf5DataReader(mrH5Folder, mFileBaseName, mDatasetNames[mOpenDatasetIndex])); // Check the data file for basic validity std::vector<std::string> variable_names = mpReader->GetVariableNames(); mNumVariables = variable_names.size(); if (mpReader->GetNumberOfRows() != mpMesh->GetNumNodes()) { delete mpOutputFileHandler; EXCEPTION("Mesh and HDF5 file have a different number of nodes"); } WriteInfoFile(); return true; }
void MainWindow::MeasSequence( void ) { double Delta; bool a1, a2; if ( inMeasDark ) return; if ( AskingOverwrite ) return; if ( NoticingHaveNotMeasDark ) return; if ( MStabOk && MPSet.TuneAtEachStep && MMStab->isBusy() ) return; if ( MPSet.qXafsMode ) { ShowQXafsProgress(); } if ( ( a1 = isBusyMotorInMeas() ) || ( a2 = mMeasUnits.isBusy() ) ) return; if ( MovingToNewSamplePosition ) { if ( Changers[ ChangerSelect->currentIndex() ]->unit1()->isBusy() || Changers[ ChangerSelect->currentIndex() ]->unit2()->isBusy() ) return; MovingToNewSamplePosition = false; } NowTimeDisp->setText( QDateTime::currentDateTime().toString("yy.MM.dd hh:mm:ss") ); if ( MPSet.qXafsMode ) { QXafsMeasSequence(); return; } switch( MeasStage ) { /* 0: 測定開始 Repeat = 0 1: Block = 0 2: Step = 0, setDwellTime 3: Goto a Position with a Block and a Step 4: Prepare to trigger Sensors (only for cnt08) 5: Trigger Sensors (for all) 6: Read out Sensors 10: Draw (Resume point from 99:) Step++; if ( Step < MaxStep ) goto 3 Block++; if ( Block < MaxBlock ) goto 2 Repeat++; if ( Repeat < MaxRepeat ) toto 1 when reach here, finish. 99: pause の時用のステージ */ case 0: if ( AutoModeFirst ) TouchDelegateFile(); if ( AutoModeButton->isChecked() ) { CurrentRpt->setText( QString( "%1 - %2" ).arg( 1 ).arg( MeasA+1 ) ); } else { CurrentRpt->setText( QString::number( 1 ) ); } CurrentPnt->setText( QString::number( 1 ) ); WriteInfoFile(); mMeasUnits.clearStage(); MeasView->SetWindow0( u->any2keV( SBLKUnit, SBlockStartAsDisp[0] ), 0, u->any2keV( SBLKUnit, SBlockStartAsDisp[ SBlocks ] ), 0 ); statusbar->showMessage( tr( "Start Measurement!" ) ); MeasStage = 1; break; case 1: // init() == true :: initializing if ( mMeasUnits.init() ) break; MeasR = 0; // Measurement Repeat count mMeasUnits.clearStage(); MeasStage = 2; break; case 2: if ( MeasBlockB->isChecked() ) break; MeasB = 0; // Measurement Block count MeasP = 0; // Measurement point count statusbar->showMessage( tr( "Writing Header." ), 2000 ); WriteHeader( MeasR ); MeasStage = 3; // break; MeasStage == 2 の動作はレスポンスを待つ必要なし case 3: MeasS = 0; // Measurement Step count in each block mMeasUnits.setDwellTimes( NowDwell = SBlockDwell[ MeasB ] ); mMeasUnits.setDwellTime(); MeasStage = 4; // break; MeasStage == 3 もレスポンスを待つ必要なし // (ここで操作したのはセンサーで, Stage == 4 でセンサーを操作しないから) case 4: if ( !FixedPositionMode ) { if ( SMeasInDeg ) { Delta = SBlockStartInDeg[MeasB+1] - SBlockStartInDeg[MeasB]; GoToKeV = u->deg2keV( Delta/SBlockPoints[MeasB]*MeasS + SBlockStartInDeg[MeasB] ); } else { Delta = SBlockStartAsDisp[MeasB+1] - SBlockStartAsDisp[MeasB]; GoToKeV = u->any2keV( SBLKUnit, Delta / SBlockPoints[MeasB] * MeasS + SBlockStartAsDisp[MeasB] ); } MoveCurThPosKeV( GoToKeV ); // 軸の移動 } mMeasUnits.clearStage(); if ( MStabOk && MPSet.TuneAtEachStep ) { MeasStage = 41; } else { if ( mMeasUnits.isParent() ) MeasStage = 5; else MeasStage = 6; } break; case 41: if ( MMStab != NULL ) { qDebug() << "Tune Abs " << MPSet.TuneESAbs << "Tune Quick " << MPSet.TuneESQuick; if ( MPSet.TuneESAbs ) { if ( MPSet.TuneESQuick ) { qDebug() << "Abs Quick"; MMStab->GoMaxAbsQ( MPSet.TuneESStart, MPSet.TuneESEnd, MPSet.TuneESSteps, MPSet.TuneESQuickTime ); } else { qDebug() << "Abs Normal"; MMStab->GoMaxAbs( MPSet.TuneESStart, MPSet.TuneESEnd, MPSet.TuneESSteps ); } } else { if ( MPSet.TuneESQuick ) { qDebug() << "Rel Quick"; MMStab->GoMaxRelQ( MPSet.TuneESStart, MPSet.TuneESSteps, MPSet.TuneESQuickTime ); } else { qDebug() << "Rel Normal"; MMStab->GoMaxRel( MPSet.TuneESStart, MPSet.TuneESSteps ); } } } if ( mMeasUnits.isParent() ) MeasStage = 5; else MeasStage = 6; break; case 5: if ( mMeasUnits.getValue0() == false ) { // only for counters mMeasUnits.clearStage(); MeasStage = 6; } break; case 6: if ( mMeasUnits.getValue() == false ) { // true :: Getting mMeasUnits.clearStage(); MeasStage = 7; } break; case 7: mMeasUnits.readValue( MeasVals, MeasCPSs, true ); // true : correct dark DispMeasDatas(); if ( ! conds->I0ShouldBeChecked() || ( MeasCPSs[0] >= conds->I0Threshold() ) ) { RecordData(); MeasP++; } CurrentPnt->setText( QString::number( MeasP + 1 ) ); MeasStage = 10; if ( inPause ) { MeasStage = 99; // PauseStage } // don't break case 10: // This label is resume point from pausing MeasView->update(); if ( conds->I0ShouldBeChecked() && ( MeasCPSs[0] < conds->I0Threshold() ) ) MeasS--; MeasS++; if ( !inPause ) { if ( MeasS < SBlockPoints[ MeasB ] ) { MeasStage = 4; } else if ( MeasB < SBlocks-1 ) { MeasB++; MeasStage = 3; } else if ( MeasR < SelRPT->value()-1 ) { NewLogMsg( QString( tr( "Meas: Repeat %1" ) ).arg( MeasR + 1 ) ); WriteHeader2( MeasR ); SaveI0inMPSet(); ClearXViewScreenForMeas( MeasView ); PlayGoOnSound(); WriteInfoFile2(); MeasR++; if ( AutoModeButton->isChecked() ) { CurrentRpt->setText( QString( "%1 - %2" ).arg( MeasR + 1 ).arg( MeasA+1 ) ); } else { CurrentRpt->setText( QString::number( MeasR + 1 ) ); } if ( MPSet.isSFluo ) if ( ! MCACanSaveAllOnMem ) // 全部セーブできない時は、1スキャン終わったら // 次のスキャンに備えてメモリクリア (直近の1スキャン分だけ覚えておく) XafsMCAMap.New( MPSet.totalPoints, 1, SFluo->length(), SFluo->chs() ); // SelRPT->value() --> 1 MeasStage = 2; } else { // 終了 clearUUnits(); CheckNewMeasFileName(); statusbar->showMessage( tr( "The Measurement has Finished" ), 4000 ); NewLogMsg( QString( tr( "Meas: Finished" ) ) ); WriteHeader2( MeasR ); SaveI0inMPSet(); PlayEndingSound(); WriteInfoFile2(); MeasTimer->stop(); inMeas = false; MPSet.normallyFinished = true; MeasStart->setText( tr( "Start" ) ); MeasStart->setStyleSheet( NormalEXECB ); MeasPause->setEnabled( false ); MeasPause->setHidden( true ); SignalToStars( XAFS_M_END ); onMeasFinishWorks(); } } break; case 99: if ( !inPause ) MeasStage = 10; break; } }