/*========================================================================= Program: Visualization Toolkit Module: vtkFileSeriesHelper.h Copyright (c) Kitware, Inc. All rights reserved. See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ /** * @class vtkFileSeriesHelper * @brief Helper class to process file series. * * vtkFileSeriesHelper is intended to be a helper class that processes file * series. File series encountered in ParaView are of two types: temporal or * spatial. This class encapsulates logic to determine which form it is in. * * Currently, this is used by vtkCGNSFileSeriesReader. Eventually, we should be * able to refactor vtkFileSeriesReader to use this class. */ #ifndef vtkFileSeriesHelper_h #define vtkFileSeriesHelper_h #include "vtkObject.h" #include "vtkSmartPointer.h" // for vtkSmartPointer. #include // for std::string #include // for std::pair #include // for std::vector class vtkAlgorithm; class vtkMultiProcessController; class vtkInformation; class vtkMultiProcessStream; class vtkFileSeriesHelper : public vtkObject { public: static vtkFileSeriesHelper* New(); vtkTypeMacro(vtkFileSeriesHelper, vtkObject); void PrintSelf(ostream& os, vtkIndent indent) override; typedef bool (*FileNameFunctorType)(vtkAlgorithm* reader, const std::string& filename); ///@{ /** * Specify the set of files that comprise the series. */ void RemoveAllFileNames(); void AddFileName(const char* fname); void SetFileNames(const std::vector& filenames); ///@} /** * Get the number of files in the series. */ unsigned int GetNumberOfFiles() const; /** * Setup file names in the series using a meta-file. The meta-file is simply * lists the names of the files in the series sequentially in an ASCII file. * All files in the file are relative to the location of the meta-file or * absolute paths. * * This will remove an preexisting files added to the helper irrespective of * whether reading of the meta-file succeeded or not. * * @returns false if failed to read the meta-file, true otherwise. */ virtual bool ReadMetaFile(const char* metafilename); ///@{ /** * Get/Set the parallel controller. By default * vtkMultiProcessController::GetGlobalController() will be used. */ void SetController(vtkMultiProcessController*); vtkGetObjectMacro(Controller, vtkMultiProcessController); ///@} ///@{ /** * In vtkFileSeriesHelper::UpdateInformation, * vtkFileSeriesHelper tries to determine time information from the reader by * making it read each of the files and then collecting the timesteps provided * by each. Sometimes, however, the time steps in the files in the fileseries * are invalid (or same) in which case one may want to to simply use the * time-step index as the time value. For that case, one should set * `IgnoreReaderTime` to `true` (default: `false`). */ vtkSetMacro(IgnoreReaderTime, bool); vtkGetMacro(IgnoreReaderTime, bool); vtkBooleanMacro(IgnoreReaderTime, bool); ///@} /** * vtkFileSeriesHelper needs to collect information about the nature of the * fileseries. This method should be called to collect this information. * * This method has any effect only when the filenames (or any ivar * that could affect the times e.g. IgnoreReaderTime) have changed, hence * calling this repeatedly is acceptable. * * When this method does any work, it updates `this->UpdateInformationTime`. * One can use `GetUpdateInformationTime` to check if the file series has * potentially been changed. * * @param[in] reader pointer to the single file reader to use. * @param[in] ftor callback to set the filename on the reader. * @returns false if no filenames are specified or failed to collect * meta-data. */ virtual bool UpdateInformation(vtkAlgorithm* reader, const FileNameFunctorType& ftor); /** * The time stamp for the most recent `UpdateInformation` call that did some * work to update the file series. */ vtkGetMacro(UpdateInformationTime, vtkMTimeType); /** * Returns the timesteps determined. This method will return valid values only * after a successful call to `UpdateInformation`. */ const std::vector& GetTimeSteps() const { return this->AggregatedTimeSteps; } /** * Returns the time range determined. */ const std::pair& GetTimeRange(bool* isvalid = NULL) const { if (isvalid != NULL) { *isvalid = this->AggregatedTimeRangeValid; } return this->AggregatedTimeRange; } /** * Fills up info with information about timesteps and timerange. */ void FillTimeInformation(vtkInformation* info) const; /** * Returns true if the file series is a series of partitions rather than a * series of timesteps. */ vtkGetMacro(PartitionedFiles, bool); /** * Returns the list of files to read on current rank to satisfy the request. * Requested time and piece information is obtained from `outInfo`. If * `outInfo` has not piece information, however, than `this->Controller` * is used. * * @param outInfo vtkInformation object with `UPDATE_*` keys that indicate the * requested time and piece information. */ std::vector GetActiveFiles(vtkInformation* outInfo) const; protected: vtkFileSeriesHelper(); ~vtkFileSeriesHelper() override; class vtkTimeInformation { public: vtkTimeInformation(vtkInformation* outInfo); vtkTimeInformation(double time); vtkTimeInformation(); bool operator==(const vtkTimeInformation& other) const; const std::pair& GetTimeRange() const { return this->TimeRange; } const std::vector& GetTimeSteps() const { return this->TimeSteps; } bool GetTimeStepsValid() const { return this->TimeStepsValid; } bool GetTimeRangeValid() const { return this->TimeRangeValid; } void Save(vtkMultiProcessStream& stream) const; void Load(vtkMultiProcessStream& stream); private: std::pair TimeRange; std::vector TimeSteps; bool TimeRangeValid; bool TimeStepsValid; }; vtkMultiProcessController* Controller; std::vector FileNames; bool IgnoreReaderTime; bool PartitionedFiles; std::vector Information; private: vtkFileSeriesHelper(const vtkFileSeriesHelper&) = delete; void operator=(const vtkFileSeriesHelper&) = delete; std::vector SplitFiles( const std::vector& files, int piece, int numPieces) const; void Broadcast(int srcRank); std::vector AggregatedTimeSteps; bool AggregatedTimeRangeValid; std::pair AggregatedTimeRange; vtkTimeStamp UpdateInformationTime; }; #endif