source: XIOS/trunk/src/filter/file_writer_filter.cpp @ 1704

Last change on this file since 1704 was 1704, checked in by yushan, 5 years ago

Introducing the new graph functionality. Attribute build_workflow_graph=.TRUE. is used in the field definition section in the xml file to enable the workflow graph of the field and other fields referecing to it. A more detailed document will be available soon on the graph fuctionality.

File size: 2.8 KB
Line 
1#include "file_writer_filter.hpp"
2#include "exception.hpp"
3#include "field.hpp"
4#include "utils.hpp"
5#include "workflow_graph.hpp"
6#include "graphviz.hpp"
7
8namespace xios
9{
10  CFileWriterFilter::CFileWriterFilter(CGarbageCollector& gc, CField* field)
11    : CInputPin(gc, 1)
12    , field(field)
13  {
14    if (!field)
15      ERROR("CFileWriterFilter::CFileWriterFilter(CField* field)",
16            "The field cannot be null.");
17  }
18
19  void CFileWriterFilter::buildGraph(std::vector<CDataPacketPtr> data)
20  {
21    bool building_graph = this->tag ? data[0]->timestamp >= this->start_graph && data[0]->timestamp <= this->end_graph: false;
22   
23    if(building_graph)
24    {
25      this->filterID = InvalidableObject::filterIdGenerator++;
26      int edgeID = InvalidableObject::edgeIdGenerator++;
27
28      CWorkflowGraph::allocNodeEdge();
29      StdString namestring = to_string(this->field->name);
30      namestring.erase(0, 6);
31      namestring.erase(namestring.length()-1, 1);
32
33      CWorkflowGraph::addNode(this->filterID, namestring + "\\n("+this->field->file->getId()+".nc)", 6, 0, 1, data[0]);
34
35      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].attributes = this->field->record4graphXiosAttributes();
36      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].attributes += "</br>file attributes : </br>" +this->field->file->record4graphXiosAttributes();
37      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].clusterID =1;
38      (*CWorkflowGraph::mapFilters_ptr_with_info)[this->filterID].distance = data[0]->distance+1;
39
40      if(CXios::isClient && CWorkflowGraph::build_begin) 
41      {
42
43        CWorkflowGraph::addEdge(edgeID, this->filterID, data[0]);
44
45        (*CWorkflowGraph::mapFilters_ptr_with_info)[data[0]->src_filterID].filter_filled = 0 ;
46      }
47      else CWorkflowGraph::build_begin=true;
48    }
49  }
50
51  void CFileWriterFilter::onInputReady(std::vector<CDataPacketPtr> data)
52  {
53    buildGraph(data);
54   
55    const bool detectMissingValue = ( !field->default_value.isEmpty() &&
56                               ( (!field->detect_missing_value.isEmpty() || field->detect_missing_value == true)
57                                 || field->hasGridMask()) );
58
59    CArray<double, 1> dataArray = (detectMissingValue) ? data[0]->data.copy() : data[0]->data;
60
61    if (detectMissingValue)
62    {
63      const double missingValue = field->default_value;
64      const size_t nbData = dataArray.numElements();
65      for (size_t idx = 0; idx < nbData; ++idx)
66      {
67        if (NumTraits<double>::isNan(dataArray(idx)))
68          dataArray(idx) = missingValue;
69      }
70    }
71
72    field->sendUpdateData(dataArray);
73  }
74
75  bool CFileWriterFilter::mustAutoTrigger() const
76  {
77    return true;
78  }
79
80  bool CFileWriterFilter::isDataExpected(const CDate& date) const
81  {
82    return true;
83  }
84} // namespace xios
Note: See TracBrowser for help on using the repository browser.