233 vtkInformationVector *outputVector,
239 auto output_barycenter = vtkMultiBlockDataSet::GetData(outputVector, 0);
240 auto output_coef = vtkTable::GetData(outputVector, 1);
241 auto output_geodVector = vtkTable::GetData(outputVector, 2);
242 auto output_corrMatrix = vtkTable::GetData(outputVector, 3);
251 output_barycenter->SetNumberOfBlocks(noBlockBary);
257 int const noBlock = (inputTrees2.size() == 0 ? 1 : 2);
258 vtkBlockNodes->SetNumberOfBlocks(noBlock);
259 vtkBlockArcs->SetNumberOfBlocks(noBlock);
260 output_barycenter->SetBlock(0, vtkBlockNodes);
261 output_barycenter->SetBlock(1, vtkBlockArcs);
265 mergeTreeDoubleToTemplate(
barycenter_, barycenterT);
266 makeBarycenterOutput<dataType>(barycenterT, 0, output_barycenter);
268 if(inputTrees2.size() != 0
273 makeBarycenterOutput<dataType>(barycenter2T, 1, output_barycenter);
281 vtkNew<vtkIntArray> treeIDArray{};
282 treeIDArray->SetName(
"TreeID");
283 treeIDArray->SetNumberOfTuples(inputTrees.size());
284 for(
unsigned int i = 0; i < inputTrees.size(); ++i) {
285 treeIDArray->SetTuple1(i, i);
287 output_coef->AddColumn(treeIDArray);
289 for(
unsigned int t = 0; t < 2; ++t) {
290 for(
unsigned int i = 0; i < (*allTs[t]).size(); ++i) {
291 vtkNew<vtkDoubleArray> tArray{};
292 auto size = (*allTs[t]).size();
295 tArray->SetName(name.c_str());
296 tArray->SetNumberOfTuples(inputTrees.size());
297 for(
unsigned int j = 0; j < (*allTs[t])[i].size(); ++j)
298 tArray->SetTuple1(j, (*allTs[t])[i][j]);
299 output_coef->AddColumn(tArray);
305 for(
unsigned int b = 0; b < inputTrees[0]->GetNumberOfBlocks(); ++b) {
306 vtkNew<vtkFieldData> fd{};
307 fd->CopyStructure(inputTrees[0]->GetBlock(b)->GetFieldData());
308 fd->SetNumberOfTuples(inputTrees.size());
309 for(
size_t i = 0; i < inputTrees.size(); ++i) {
310 fd->SetTuple(i, 0, inputTrees[i]->GetBlock(b)->GetFieldData());
314 for(
int i = 0; i < fd->GetNumberOfArrays(); ++i) {
315 auto array = fd->GetAbstractArray(i);
316 array->SetName(array->GetName());
317 output_coef->AddColumn(array);
322 std::vector<std::string> paramNames;
324 for(
auto paramName : paramNames) {
325 vtkNew<vtkDoubleArray> array{};
326 array->SetName(paramName.c_str());
328 output_coef->GetFieldData()->AddArray(array);
334 std::vector<std::vector<std::vector<std::vector<double>>> *> vectors{
336 unsigned int maxSize =
vS_[0].size();
337 if(inputTrees2.size() != 0
343 for(
unsigned int v = 0; v < vectors.size(); ++v) {
344 auto vector = vectors[v];
345 for(
unsigned int i = 0; i < (*vector).size(); ++i)
346 for(
unsigned int k = 0; k < 2; ++k) {
347 vtkNew<vtkDoubleArray> vectorArray{};
348 bool const isSecondInput = (v >= 2);
349 std::string
const name
351 vectorArray->SetName(name.c_str());
352 vectorArray->SetNumberOfTuples(maxSize);
353 for(
unsigned int j = 0; j < (*vector)[i].size(); ++j)
354 vectorArray->SetTuple1(j, (*vector)[i][j][k]);
355 for(
unsigned int j = (*vector)[i].size(); j < maxSize; ++j)
356 vectorArray->SetTuple1(j, std::nan(
""));
357 output_geodVector->AddColumn(vectorArray);
368 for(
unsigned int j = 0; j < noCols; ++j) {
369 vtkNew<vtkDoubleArray> corrArray{}, persArray{};
371 corrArray->SetName(name.c_str());
372 corrArray->SetNumberOfTuples(noRows);
374 persArray->SetName(name2.c_str());
375 persArray->SetNumberOfTuples(noRows);
376 for(
unsigned int i = 0; i < noRows; ++i) {
380 output_corrMatrix->AddColumn(corrArray);
381 output_corrMatrix->AddColumn(persArray);
385 std::vector<std::vector<ttk::ftm::idNode>> matchingMatrix;
389 for(
unsigned int j = 0; j < inputTrees.size(); ++j)
392 = intermediateDTrees[j]
393 .tree.getNode(intermediateDTrees[j].tree.getRoot())
395 for(
unsigned int j = 0; j < inputTrees.size(); ++j) {
396 vtkNew<vtkIntArray> corrArray{};
398 corrArray->SetName(name.c_str());
399 corrArray->SetNumberOfTuples(noRows);
400 for(
unsigned int i = 0; i < noRows; ++i)
401 corrArray->SetTuple1(i, (
int)matchingMatrix[i][j]);
402 output_corrMatrix->AddColumn(corrArray);
406 vtkNew<vtkIntArray> baryNodeId{};
407 baryNodeId->SetName(
"BaryNodeId");
408 baryNodeId->SetNumberOfTuples(noRows);
409 for(
unsigned int i = 0; i < noRows; ++i)
410 baryNodeId->SetTuple1(i, i);
411 output_corrMatrix->AddColumn(baryNodeId);
414 vtkNew<vtkIntArray> baryNodeIsLeaf{};
415 baryNodeIsLeaf->SetName(
"BaryNodeIsLeaf");
416 baryNodeIsLeaf->SetNumberOfTuples(noRows);
417 for(
unsigned int i = 0; i < noRows; ++i)
419 output_corrMatrix->AddColumn(baryNodeIsLeaf);
422 vtkNew<vtkDoubleArray> baryNodePers{};
423 baryNodePers->SetName(
"BaryNodePers");
424 baryNodePers->SetNumberOfTuples(noRows);
425 for(
unsigned int i = 0; i < noRows; ++i) {
426 auto nodePers =
barycenter_.
tree.template getNodePersistence<double>(i);
427 baryNodePers->SetTuple1(i, nodePers);
429 output_corrMatrix->AddColumn(baryNodePers);
432 std::vector<std::vector<int>> treesOrder(intermediateDTrees.size());
433 for(
unsigned int i = 0; i < intermediateDTrees.size(); ++i) {
434 treesOrder[i].resize(intermediateDTrees[i].tree.getNumberOfNodes());
435 std::vector<std::tuple<ttk::ftm::idNode, ttk::ftm::idNode, double>> pairs;
436 intermediateDTrees[i].tree.template getPersistencePairsFromTree<double>(
438 for(
unsigned int j = 0; j < pairs.size(); ++j) {
439 int const index = pairs.size() - 1 - j;
440 treesOrder[i][std::get<0>(pairs[j])] = index;
441 treesOrder[i][std::get<1>(pairs[j])] = index;
445 vtkNew<vtkDoubleArray> treesPersOrder{};
446 treesPersOrder->SetName(
"TreesPersOrder");
447 treesPersOrder->SetNumberOfTuples(noRows);
448 for(
unsigned int i = 0; i < noRows; ++i) {
449 int minIndex = std::numeric_limits<int>::max();
450 for(
unsigned int j = 0; j < intermediateDTrees.size(); ++j) {
451 if(
int(matchingMatrix[i][j]) != -1)
452 minIndex = std::min(minIndex, treesOrder[j][matchingMatrix[i][j]]);
454 treesPersOrder->SetTuple1(i, minIndex);
456 output_corrMatrix->AddColumn(treesPersOrder);