geant events for multiple scattering
This commit is contained in:
108
src/Vtk/HEP/Geant/vtkGeantEvent.cpp
Normal file
108
src/Vtk/HEP/Geant/vtkGeantEvent.cpp
Normal file
@@ -0,0 +1,108 @@
|
||||
/*//////////////////////////////////////////////////////////////////////////////
|
||||
// CMT Cosmic Muon Tomography project //////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
Copyright (c) 2014, Universita' degli Studi di Padova, INFN sez. di Padova
|
||||
All rights reserved
|
||||
|
||||
Authors: Andrea Rigoni Garola < andrea.rigoni@pd.infn.it >
|
||||
|
||||
------------------------------------------------------------------
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 3.0 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library.
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////*/
|
||||
|
||||
#include "vtkGeantEvent.h"
|
||||
|
||||
#include <vtkPolyData.h>
|
||||
#include <vtkPoints.h>
|
||||
#include <vtkCellArray.h>
|
||||
#include <vtkPolyDataMapper.h>
|
||||
#include <vtkProperty.h>
|
||||
#include <vtkSmartPointer.h>
|
||||
|
||||
namespace uLib {
|
||||
namespace Vtk {
|
||||
|
||||
vtkGeantEvent::vtkGeantEvent(Content *content)
|
||||
: m_MuonPath(vtkActor::New()), m_Content(content) {
|
||||
this->InstallPipe();
|
||||
this->Update();
|
||||
}
|
||||
|
||||
vtkGeantEvent::~vtkGeantEvent() {
|
||||
m_MuonPath->Delete();
|
||||
}
|
||||
|
||||
vtkPolyData *vtkGeantEvent::GetPolyData() const {
|
||||
if (!m_MuonPath || !m_MuonPath->GetMapper())
|
||||
return NULL;
|
||||
return vtkPolyData::SafeDownCast(m_MuonPath->GetMapper()->GetInput());
|
||||
}
|
||||
|
||||
void vtkGeantEvent::Update() {
|
||||
if (!m_Content)
|
||||
return;
|
||||
|
||||
vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
|
||||
vtkSmartPointer<vtkCellArray> lines = vtkSmartPointer<vtkCellArray>::New();
|
||||
|
||||
const HLine3f &gen = m_Content->GenVector();
|
||||
const Vector<Geant::GeantEvent::Delta> &path = m_Content->Path();
|
||||
|
||||
// Start point from generation vector
|
||||
Vector3f currentPos(gen.origin(0), gen.origin(1), gen.origin(2));
|
||||
points->InsertNextPoint(currentPos(0), currentPos(1), currentPos(2));
|
||||
|
||||
for (size_t i = 0; i < path.size(); ++i) {
|
||||
const Geant::GeantEvent::Delta &delta = path[i];
|
||||
|
||||
// P_{i+1} = P_i + Length * Direction
|
||||
// Note: HVector3f is stored as (x,y,z,0) in HPoint3f template
|
||||
Vector3f dir(delta.Direction()(0), delta.Direction()(1), delta.Direction()(2));
|
||||
currentPos += delta.GetLength() * dir;
|
||||
|
||||
points->InsertNextPoint(currentPos(0), currentPos(1), currentPos(2));
|
||||
|
||||
vtkIdType line[2] = {static_cast<vtkIdType>(i),
|
||||
static_cast<vtkIdType>(i + 1)};
|
||||
lines->InsertNextCell(2, line);
|
||||
}
|
||||
|
||||
vtkPolyData *polyData = GetPolyData();
|
||||
if (polyData) {
|
||||
polyData->SetPoints(points);
|
||||
polyData->SetLines(lines);
|
||||
polyData->Modified();
|
||||
}
|
||||
}
|
||||
|
||||
void vtkGeantEvent::InstallPipe() {
|
||||
vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New();
|
||||
vtkSmartPointer<vtkPolyDataMapper> mapper =
|
||||
vtkSmartPointer<vtkPolyDataMapper>::New();
|
||||
mapper->SetInputData(polyData);
|
||||
|
||||
m_MuonPath->SetMapper(mapper);
|
||||
|
||||
// Set default look: Red line
|
||||
m_MuonPath->GetProperty()->SetColor(1.0, 0.0, 0.0);
|
||||
m_MuonPath->GetProperty()->SetLineWidth(2.0);
|
||||
m_MuonPath->GetProperty()->SetAmbient(1.0);
|
||||
|
||||
this->SetProp(m_MuonPath);
|
||||
}
|
||||
|
||||
} // namespace Vtk
|
||||
} // namespace uLib
|
||||
Reference in New Issue
Block a user