Reading and visualizing vtk file

Hello all,
I am trying to read a DTIbrain file in .vtk format. The image has eigenvectors and eigenvalues attached to its voxels and I want to read and visualize the principal eigenvectors.

For this, I am using vtkStructuredPointsReader as a reader and tried using vtkXMLPolyDataReader which doesn’t work.

I am using Glyph3D to depict all the vectors as an arrow. I have tried the following codes and generated the image below:


the blueish section in the middle is where the brain is.

Now I want to get rid of the red arrows outside the brain and just to visualize the brain volume.
How do I do that?

Codes:

#include <vtkSmartPointer.h>
#include <vtkXMLPolyDataReader.h>
#include <vtkNrrdReader.h>
#include <vtkPolyData.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkStructuredPointsReader.h>
#include <vtkArrowSource.h>
#include <vtkGlyph3D.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkPolyDataReader.h>
#include <vtkProperty.h>
#include <vtkImageDataGeometryFilter.h>
#include <vtkPolyDataNormals.h>
#include <vtkQuadricDecimation.h>

int main(int argc, char* argv[])
{
	vtkSmartPointer<vtkStructuredPointsReader> reader = vtkSmartPointer<vtkStructuredPointsReader>::New();
	//vtkSmartPointer<vtkXMLPolyDataReader> reader = vtkSmartPointer<vtkXMLPolyDataReader>::New();
	//reader->SetFileName("../../PEoutput.vtk");
	reader->SetFileName(argv[1]);
	reader->Update();

	vtkSmartPointer<vtkImageDataGeometryFilter>geometryFilter = vtkSmartPointer<vtkImageDataGeometryFilter>::New();
	geometryFilter->SetInputConnection(reader->GetOutputPort());
	geometryFilter->Update();

	vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
	mapper->SetInputConnection(geometryFilter->GetOutputPort()); //geometryFilter

	vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
	actor->SetMapper(mapper);
	actor->GetProperty()->SetColor(0, 0, 0);

	// Compute & Visualize Normal Vectors
	/*
	vtkSmartPointer<vtkPolyDataNormals> normalsFilter = vtkSmartPointer<vtkPolyDataNormals>::New();
	normalsFilter->SetInputData(geometryFilter->GetOutput());
	normalsFilter->ComputePointNormalsOn();
	normalsFilter->Update();
	*/
	vtkSmartPointer<vtkArrowSource>oneArrow = vtkSmartPointer<vtkArrowSource>::New();
	oneArrow->Update();
	
	vtkSmartPointer<vtkGlyph3D> lotsOfArrows = vtkSmartPointer<vtkGlyph3D>::New();
	lotsOfArrows->SetSourceData(oneArrow->GetOutput());
	lotsOfArrows->SetInputData(geometryFilter->GetOutput()); //gerometryFilter
	lotsOfArrows->OrientOn();
	lotsOfArrows->SetScaleFactor(1);
	lotsOfArrows->SetColorModeToColorByVector();
	lotsOfArrows->Update();
	
	vtkSmartPointer < vtkPolyDataMapper > arrowMapper = vtkSmartPointer < vtkPolyDataMapper > ::New();
	arrowMapper->SetInputData(lotsOfArrows->GetOutput());

	vtkSmartPointer<vtkActor> arrowActor = vtkSmartPointer<vtkActor>::New();
	arrowActor->SetMapper(arrowMapper);
	arrowActor->GetProperty()->SetColor(1, 0, 0); //

	vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
	vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
	renderWindow->AddRenderer(renderer);
	vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
	interactor->SetRenderWindow(renderWindow);
	renderer->AddActor(arrowActor); //arrowActor //actor

	renderer->SetBackground(1, 1, 1);
	renderWindow->Render();
	renderWindow->SetSize(300, 300);

	interactor->Start();

	return 0;
}

I also tried reading the number of points and their attributes to threshold out outside arrows…but vtkStructuredPointsReader seems to have no functions as GetNumberOfPoints or GetAttributes

Please see the error image below:

I have done it by the following codes:

    int main(int argc, char* argv[])
{
	vtkSmartPointer<vtkStructuredPointsReader> reader = vtkSmartPointer<vtkStructuredPointsReader>::New();
	//vtkSmartPointer<vtkXMLPolyDataReader> reader2 = vtkSmartPointer<vtkXMLPolyDataReader>::New();
	//reader->SetFileName("../../PEoutput.vtk");
	reader->SetFileName(argv[1]);
	reader->Update();
	//std::cout << reader->GetOutput()->GetNumberOfPoints() << std::endl; //1762560

	//clean up codes:
	
	vtkSmartPointer<vtkFloatArray> brain = vtkSmartPointer<vtkFloatArray>::New();
	brain->SetNumberOfValues(reader->GetOutput()->GetNumberOfPoints());

	for (vtkIdType idx = 0; idx < reader->GetOutput()->GetNumberOfPoints(); idx++)
	{
		double* v = reader->GetOutput()->GetAttributes(vtkDataSet::POINT)->GetVectors()->GetTuple3(idx);
		if (v[0] * v[1] * v[2] > 0) 
		{
			brain->SetValue(idx, 1);
		}
		else 
		{
			brain->SetValue(idx, 0);
		}
	}
	
	reader->GetOutput()->GetPointData()->SetScalars(brain);

	vtkSmartPointer<vtkThresholdPoints> thresh = vtkSmartPointer<vtkThresholdPoints>::New();
	thresh->ThresholdByUpper(0.5);
	thresh->SetInputData(reader->GetOutput());
	thresh->Update();