234 vtkInformationVector *outputVector,
240 auto output_barycenter = vtkMultiBlockDataSet::GetData(outputVector, 0);
241 auto output_coef = vtkTable::GetData(outputVector, 1);
242 auto output_geodVector = vtkTable::GetData(outputVector, 2);
243 auto output_corrMatrix = vtkTable::GetData(outputVector, 3);
252 output_barycenter->SetNumberOfBlocks(noBlockBary);
258 int const noBlock = (inputTrees2.size() == 0 ? 1 : 2);
259 vtkBlockNodes->SetNumberOfBlocks(noBlock);
260 vtkBlockArcs->SetNumberOfBlocks(noBlock);
261 output_barycenter->SetBlock(0, vtkBlockNodes);
262 output_barycenter->SetBlock(1, vtkBlockArcs);
266 mergeTreeDoubleToTemplate(
barycenter_, barycenterT);
269 if(inputTrees2.size() != 0
282 vtkNew<vtkIntArray> treeIDArray{};
283 treeIDArray->SetName(
"TreeID");
284 treeIDArray->SetNumberOfTuples(inputTrees.size());
285 for(
unsigned int i = 0; i < inputTrees.size(); ++i) {
286 treeIDArray->SetTuple1(i, i);
288 output_coef->AddColumn(treeIDArray);
290 for(
unsigned int t = 0; t < 2; ++t) {
291 for(
unsigned int i = 0; i < (*allTs[t]).size(); ++i) {
292 vtkNew<vtkDoubleArray> tArray{};
293 auto size = (*allTs[t]).size();
294 std::string
const name
297 tArray->SetName(name.c_str());
298 tArray->SetNumberOfTuples(inputTrees.size());
299 for(
unsigned int j = 0; j < (*allTs[t])[i].size(); ++j)
300 tArray->SetTuple1(j, (*allTs[t])[i][j]);
301 output_coef->AddColumn(tArray);
307 for(
unsigned int b = 0; b < inputTrees[0]->GetNumberOfBlocks(); ++b) {
308 vtkNew<vtkFieldData> fd{};
309 fd->CopyStructure(inputTrees[0]->GetBlock(b)->GetFieldData());
310 fd->SetNumberOfTuples(inputTrees.size());
311 for(
size_t i = 0; i < inputTrees.size(); ++i) {
312 fd->SetTuple(i, 0, inputTrees[i]->GetBlock(b)->GetFieldData());
316 for(
int i = 0; i < fd->GetNumberOfArrays(); ++i) {
317 auto array = fd->GetAbstractArray(i);
318 array->SetName(array->GetName());
319 output_coef->AddColumn(array);
324 std::vector<std::string> paramNames;
326 for(
auto paramName : paramNames) {
327 vtkNew<vtkDoubleArray> array{};
328 array->SetName(paramName.c_str());
330 output_coef->GetFieldData()->AddArray(array);
332 vtkNew<vtkIntArray> diagramPairTypesArray{};
333 diagramPairTypesArray->SetName(
"DiagramPairTypes");
334 diagramPairTypesArray->InsertNextTuple1(DiagramPairTypes);
335 output_coef->GetFieldData()->AddArray(diagramPairTypesArray);
340 std::vector<std::vector<std::vector<std::vector<double>>> *> vectors{
342 unsigned int maxSize =
vS_[0].size();
343 if(inputTrees2.size() != 0
349 for(
unsigned int v = 0; v < vectors.size(); ++v) {
350 auto vector = vectors[v];
351 for(
unsigned int i = 0; i < (*vector).size(); ++i)
352 for(
unsigned int k = 0; k < 2; ++k) {
353 vtkNew<vtkDoubleArray> vectorArray{};
354 bool const isSecondInput = (v >= 2);
356 (*vector).size(), i, v % 2, k, isSecondInput);
357 vectorArray->SetName(name.c_str());
358 vectorArray->SetNumberOfTuples(maxSize);
359 for(
unsigned int j = 0; j < (*vector)[i].size(); ++j)
360 vectorArray->SetTuple1(j, (*vector)[i][j][k]);
361 for(
unsigned int j = (*vector)[i].size(); j < maxSize; ++j)
362 vectorArray->SetTuple1(j, std::nan(
""));
363 output_geodVector->AddColumn(vectorArray);
374 for(
unsigned int j = 0; j < noCols; ++j) {
375 vtkNew<vtkDoubleArray> corrArray{}, persArray{};
377 corrArray->SetName(name.c_str());
378 corrArray->SetNumberOfTuples(noRows);
380 persArray->SetName(name2.c_str());
381 persArray->SetNumberOfTuples(noRows);
382 for(
unsigned int i = 0; i < noRows; ++i) {
386 output_corrMatrix->AddColumn(corrArray);
387 output_corrMatrix->AddColumn(persArray);
391 std::vector<std::vector<ttk::ftm::idNode>> matchingMatrix;
395 for(
unsigned int j = 0; j < inputTrees.size(); ++j)
398 = intermediateDTrees[j]
399 .tree.getNode(intermediateDTrees[j].tree.getRoot())
401 for(
unsigned int j = 0; j < inputTrees.size(); ++j) {
402 vtkNew<vtkIntArray> corrArray{};
404 corrArray->SetName(name.c_str());
405 corrArray->SetNumberOfTuples(noRows);
406 for(
unsigned int i = 0; i < noRows; ++i)
407 corrArray->SetTuple1(i, (
int)matchingMatrix[i][j]);
408 output_corrMatrix->AddColumn(corrArray);
412 vtkNew<vtkIntArray> baryNodeId{};
413 baryNodeId->SetName(
"BaryNodeId");
414 baryNodeId->SetNumberOfTuples(noRows);
415 for(
unsigned int i = 0; i < noRows; ++i)
416 baryNodeId->SetTuple1(i, i);
417 output_corrMatrix->AddColumn(baryNodeId);
420 vtkNew<vtkIntArray> baryNodeIsLeaf{};
421 baryNodeIsLeaf->SetName(
"BaryNodeIsLeaf");
422 baryNodeIsLeaf->SetNumberOfTuples(noRows);
423 for(
unsigned int i = 0; i < noRows; ++i)
424 baryNodeIsLeaf->SetTuple1(i,
barycenter_.tree.isLeaf(i));
425 output_corrMatrix->AddColumn(baryNodeIsLeaf);
428 vtkNew<vtkDoubleArray> baryNodePers{};
429 baryNodePers->SetName(
"BaryNodePers");
430 baryNodePers->SetNumberOfTuples(noRows);
431 for(
unsigned int i = 0; i < noRows; ++i) {
432 auto nodePers =
barycenter_.tree.template getNodePersistence<double>(i);
433 baryNodePers->SetTuple1(i, nodePers);
435 output_corrMatrix->AddColumn(baryNodePers);
438 std::vector<std::vector<int>> treesOrder(intermediateDTrees.size());
439 for(
unsigned int i = 0; i < intermediateDTrees.size(); ++i) {
440 treesOrder[i].resize(intermediateDTrees[i].tree.getNumberOfNodes());
441 std::vector<std::tuple<ttk::ftm::idNode, ttk::ftm::idNode, double>> pairs;
442 intermediateDTrees[i].tree.template getPersistencePairsFromTree<double>(
444 for(
unsigned int j = 0; j < pairs.size(); ++j) {
445 int const index = pairs.size() - 1 - j;
446 treesOrder[i][std::get<0>(pairs[j])] = index;
447 treesOrder[i][std::get<1>(pairs[j])] = index;
451 vtkNew<vtkDoubleArray> treesPersOrder{};
452 treesPersOrder->SetName(
"TreesPersOrder");
453 treesPersOrder->SetNumberOfTuples(noRows);
454 for(
unsigned int i = 0; i < noRows; ++i) {
455 int minIndex = std::numeric_limits<int>::max();
456 for(
unsigned int j = 0; j < intermediateDTrees.size(); ++j) {
457 if(
int(matchingMatrix[i][j]) != -1)
458 minIndex = std::min(minIndex, treesOrder[j][matchingMatrix[i][j]]);
460 treesPersOrder->SetTuple1(i, minIndex);
462 output_corrMatrix->AddColumn(treesPersOrder);