27 vtkUnstructuredGrid *treeArcs) {
28 auto treeNodeIdArray = treeNodes->GetPointData()->GetArray(
"TreeNodeId");
31 auto scalars = std::make_shared<Scalars>();
33 = treeNodes->GetPointData()->GetArray(
"Scalar");
34 scalars->size = nodesScalar->GetNumberOfTuples();
36 scalars->size = std::max(
37 (
ttk::SimplexId)treeNodeIdArray->GetRange()[1] + 1, scalars->size);
39 = std::make_shared<std::vector<dataType>>(scalars->size);
40 for(
int i = 0; i < nodesScalar->GetNumberOfTuples(); ++i) {
41 int const index = (treeNodeIdArray ? treeNodeIdArray->GetTuple1(i) : i);
42 (*scalarsValues)[index] = nodesScalar->GetTuple1(i);
44 scalars->values = (
void *)(scalarsValues->data());
47 auto params = std::make_shared<Params>();
52 for(vtkIdType i = 0; i < scalars->size; ++i) {
58 = treeArcs->GetCellData()->GetArray(
"upNodeId");
60 = treeArcs->GetCellData()->GetArray(
"downNodeId");
61 vtkIdType
const arcsNumTuples = arcsUp->GetNumberOfTuples();
63 = treeArcs->GetCellData()->GetArray(
"isDummyArc");
64 std::set<std::tuple<double, double>> added_arcs;
65 for(vtkIdType i = 0; i < arcsNumTuples; ++i) {
66 if(dummyArcArray !=
nullptr and dummyArcArray->GetTuple1(i) == 1)
68 double downId = arcsDown->GetTuple1(i);
69 double upId = arcsUp->GetTuple1(i);
71 downId = treeNodeIdArray->GetTuple1(downId);
72 upId = treeNodeIdArray->GetTuple1(upId);
74 auto it = added_arcs.find(std::make_tuple(downId, upId));
75 if(it == added_arcs.end()) {
77 added_arcs.insert(std::make_tuple(downId, upId));
111 bool useSecondPairsType =
true,
112 int diagramPairTypes = 0) {
119 auto criticalTypeArray = persistenceDiagram->GetPointData()->GetArray(
123 = persistenceDiagram->GetPointData()->GetArray(
"TreeNodeId");
124 auto treeNodeId2Array
125 = persistenceDiagram->GetPointData()->GetArray(
"TreeNodeIdOrigin");
126 bool const gotNodeArrays = (treeNodeIdArray and treeNodeId2Array);
128 auto noPairs = birthArray->GetNumberOfTuples();
129 int noNodes = noPairs * 2;
131 for(vtkIdType i = 0; i < treeNodeIdArray->GetNumberOfTuples(); ++i) {
132 int const val = std::max(treeNodeIdArray->GetTuple1(i),
133 treeNodeId2Array->GetTuple1(i))
135 noNodes = std::max(noNodes, val);
138 std::vector<dataType> scalarsVector(noNodes);
152 = (useSecondPairsType
153 and (diagramPairTypes == 0 or diagramPairTypes == 2)
155 : (not useSecondPairsType
156 and (diagramPairTypes == 0 or diagramPairTypes == 1)
161 int minMaxPairIndex = -1;
162 for(vtkIdType i = 0; i < noPairs; ++i) {
164 vtkIdType
const *pts;
165 persistenceDiagram->GetCellPoints(i, npts, pts);
166 auto ct1 = criticalTypeArray->GetTuple1(pts[0]);
167 auto ct2 = criticalTypeArray->GetTuple1(pts[1]);
168 if((ct1 == locMin and ct2 == locMax)
169 or (ct1 == locMax and ct2 == locMin))
174 for(vtkIdType i = 0; i < noNodes; ++i)
176 for(vtkIdType i = 0; i < noPairs; ++i) {
177 auto pairType = pairTypeArray->GetTuple1(i);
179 vtkIdType
const *pts;
180 persistenceDiagram->GetCellPoints(i, npts, pts);
181 auto ct1 = criticalTypeArray->GetTuple1(pts[0]);
182 auto ct2 = criticalTypeArray->GetTuple1(pts[1]);
184 or (pairsType == 2 and ct1 != locMax and ct2 != locMax)
186 and not((ct1 == locSad1 and ct2 == locSad2)
187 or (ct1 == locSad2 and ct2 == locSad1)))
188 or (pairsType == 0 and ct1 != locMin and ct2 != locMin))
189 and i != minMaxPairIndex)
192 = (gotNodeArrays ? treeNodeId2Array->GetTuple1(pts[0]) : i * 2);
194 = (gotNodeArrays ? treeNodeIdArray->GetTuple1(pts[0]) : i * 2 + 1);
197 scalarsVector[index1] = birthArray->GetTuple1(i);
198 scalarsVector[index2]
199 = birthArray->GetTuple1(i) + persArray->GetTuple1(i);
201 if(i != minMaxPairIndex) {
202 auto up = (gotNodeArrays ? treeNodeIdArray->GetTuple1(minMaxPairIndex)
203 : minMaxPairIndex * 2 + 1);
217 vtkMultiBlockDataSet *blocks) {
218 if(blocks !=
nullptr) {
219 if(blocks->GetBlock(0)->IsA(
"vtkMultiBlockDataSet"))
221 vtkMultiBlockDataSet::SafeDownCast(blocks->GetBlock(0))
222 ->GetNumberOfBlocks());
223 else if(blocks->GetBlock(0)->IsA(
"vtkUnstructuredGrid"))
224 inputTrees.resize(blocks->GetNumberOfBlocks());
225 for(
size_t i = 0; i < inputTrees.size(); ++i) {
226 if(blocks->GetBlock(0)->IsA(
"vtkMultiBlockDataSet")) {
229 vtkBlock->SetNumberOfBlocks(blocks->GetNumberOfBlocks());
230 for(
unsigned int j = 0; j < blocks->GetNumberOfBlocks(); ++j)
232 j, vtkMultiBlockDataSet::SafeDownCast(blocks->GetBlock(j))
234 inputTrees[i] = vtkBlock;
235 }
else if(blocks->GetBlock(0)->IsA(
"vtkUnstructuredGrid")) {
238 vtkBlock->SetNumberOfBlocks(1);
240 0, vtkUnstructuredGrid::SafeDownCast(blocks->GetBlock(i)));
241 inputTrees[i] = vtkBlock;
251 std::vector<vtkUnstructuredGrid *> &treesNodes,
252 std::vector<vtkUnstructuredGrid *> &treesArcs,
253 std::vector<vtkDataSet *> &treesSegmentation,
254 const std::vector<bool> &useSecondPairsTypeVec,
255 int diagramPairTypes = 0) {
256 bool isPersistenceDiagram =
false;
257 const int numInputs = inputTrees.size();
258 intermediateTrees.resize(numInputs);
259 treesNodes.resize(numInputs);
260 treesArcs.resize(numInputs);
261 treesSegmentation.resize(numInputs);
262 for(
int i = 0; i < numInputs; i++) {
263 if(inputTrees[i]->GetNumberOfBlocks() >= 2) {
265 = vtkUnstructuredGrid::SafeDownCast(inputTrees[i]->GetBlock(0));
267 = vtkUnstructuredGrid::SafeDownCast(inputTrees[i]->GetBlock(1));
268 if(inputTrees[i]->GetNumberOfBlocks() > 2)
270 = vtkDataSet::SafeDownCast(inputTrees[i]->GetBlock(2));
275 = vtkUnstructuredGrid::SafeDownCast(inputTrees[i]->GetBlock(0));
276 vtkUnstructuredGrid *persistenceDiagram
277 = vtkUnstructuredGrid::SafeDownCast(inputTrees[i]->GetBlock(0));
279 persistenceDiagram, useSecondPairsTypeVec[i], diagramPairTypes);
280 isPersistenceDiagram =
true;
283 return isPersistenceDiagram;
290 std::vector<vtkUnstructuredGrid *> &treesNodes,
291 std::vector<vtkUnstructuredGrid *> &treesArcs,
292 std::vector<vtkDataSet *> &treesSegmentation,
293 bool useSecondPairsType =
true,
294 int diagramPairTypes = 0) {
295 const std::vector<bool> useSecondPairsTypeVec(
296 inputTrees.size(), useSecondPairsType);
298 treesArcs, treesSegmentation, useSecondPairsTypeVec,
306 bool useSecondPairsType =
true,
307 int diagramPairTypes = 0) {
308 std::vector<vtkUnstructuredGrid *> treesNodes;
309 std::vector<vtkUnstructuredGrid *> treesArcs;
310 std::vector<vtkDataSet *> treesSegmentation;
312 treesArcs, treesSegmentation, useSecondPairsType,
bool constructTrees(std::vector< vtkSmartPointer< vtkMultiBlockDataSet > > &inputTrees, std::vector< MergeTree< dataType > > &intermediateTrees, std::vector< vtkUnstructuredGrid * > &treesNodes, std::vector< vtkUnstructuredGrid * > &treesArcs, std::vector< vtkDataSet * > &treesSegmentation, const std::vector< bool > &useSecondPairsTypeVec, int diagramPairTypes=0)
MergeTree< dataType > makeBDTreeFromPDGrid(vtkUnstructuredGrid *persistenceDiagram, bool useSecondPairsType=true, int diagramPairTypes=0)
Create a MergeTree (as a branch decomposition tree) object given a vtkUnstructuredGrid representing a...