Пример #1
0
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;
}
Пример #2
0
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;
  }
}