From a2a3f68a8fa21935a1dd86274aa008baaad26502 Mon Sep 17 00:00:00 2001 From: Javier Galan Date: Wed, 19 Jul 2023 12:58:12 +0200 Subject: [PATCH 01/32] Adding TRestDetectorHitsRotateProcess --- inc/TRestDetectorHitsRotateProcess.h | 71 +++++++++++++++++ src/TRestDetectorHitsRotateProcess.cxx | 104 +++++++++++++++++++++++++ 2 files changed, 175 insertions(+) create mode 100644 inc/TRestDetectorHitsRotateProcess.h create mode 100644 src/TRestDetectorHitsRotateProcess.cxx diff --git a/inc/TRestDetectorHitsRotateProcess.h b/inc/TRestDetectorHitsRotateProcess.h new file mode 100644 index 00000000..e8cb4799 --- /dev/null +++ b/inc/TRestDetectorHitsRotateProcess.h @@ -0,0 +1,71 @@ +/************************************************************************* + * This file is part of the REST software framework. * + * * + * Copyright (C) 2016 GIFNA/TREX (University of Zaragoza) * + * For more information see http://gifna.unizar.es/trex * + * * + * REST is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * REST 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 General Public License for more details. * + * * + * You should have a copy of the GNU General Public License along with * + * REST in $REST_PATH/LICENSE. * + * If not, see http://www.gnu.org/licenses/. * + * For the list of contributors see $REST_PATH/CREDITS. * + *************************************************************************/ + +#ifndef RestCore_TRestDetectorHitsRotateProcess +#define RestCore_TRestDetectorHitsRotateProcess + +#include +#include + +/// A process to rotate hits from a given center and axis +class TRestDetectorHitsRotateProcess : public TRestEventProcess { + private: + /// A pointer to the process input event + TRestDetectorHitsEvent* fInputHitsEvent; //! + + /// A pointer to the process output event + TRestDetectorHitsEvent* fOutputHitsEvent; //! + + void InitFromConfigFile() override; + void Initialize() override; + + protected: + /// Angle of rotation respect to the given axis + Double_t fAngle = 0; //< + + /// Center of rotation + TVector3 fCenter = {0, 0, 0}; //< + + /// Axis of rotation + TVector3 fAxis = {0, 0, 1}; //< + + public: + any GetInputEvent() const override { return fInputHitsEvent; } + any GetOutputEvent() const override { return fOutputHitsEvent; } + + TRestEvent* ProcessEvent(TRestEvent* inputEvent) override; + + void PrintMetadata() override; + + const char* GetProcessName() const override { return "rotateProcess"; } + + inline Double_t GetAngle() const { return fAngle; } + inline TVector3 GetAxis() const { return fAxis; } + inline TVector3 GetCenter() const { return fCenter; } + + TRestDetectorHitsRotateProcess(); + TRestDetectorHitsRotateProcess(const char* configFilename); + ~TRestDetectorHitsRotateProcess(); + + ClassDefOverride(TRestDetectorHitsRotateProcess, 1); +}; +#endif diff --git a/src/TRestDetectorHitsRotateProcess.cxx b/src/TRestDetectorHitsRotateProcess.cxx new file mode 100644 index 00000000..040bb8a6 --- /dev/null +++ b/src/TRestDetectorHitsRotateProcess.cxx @@ -0,0 +1,104 @@ +/************************************************************************* + * This file is part of the REST software framework. * + * * + * Copyright (C) 2016 GIFNA/TREX (University of Zaragoza) * + * For more information see http://gifna.unizar.es/trex * + * * + * REST is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * REST 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 General Public License for more details. * + * * + * You should have a copy of the GNU General Public License along with * + * REST in $REST_PATH/LICENSE. * + * If not, see http://www.gnu.org/licenses/. * + * For the list of contributors see $REST_PATH/CREDITS. * + *************************************************************************/ + +////////////////////////////////////////////////////////////////////////// +/// TRestDetectorHitsRotateProcess will add a rotation of the x,y,z hits +/// in the space. The rotation will be done respect to a center and an +/// axis provided by the user. +/// +/// \code +/// +/// +/// +/// +/// +/// \endcode +/// +///-------------------------------------------------------------------------- +/// +/// RESTsoft - Software for Rare Event Searches with TPCs +/// +/// History of developments: +/// +/// 2023-July: First implementation of TRestDetectorHitsRotateProcess +/// \author Javier Galan +/// +/// \class TRestDetectorHitsRotateProcess +/// +///
+/// +#include "TRestDetectorHitsRotateProcess.h" + +using namespace std; + +#include + +ClassImp(TRestDetectorHitsRotateProcess); + +TRestDetectorHitsRotateProcess::TRestDetectorHitsRotateProcess() { Initialize(); } + +TRestDetectorHitsRotateProcess::~TRestDetectorHitsRotateProcess() {} + +void TRestDetectorHitsRotateProcess::Initialize() { + SetSectionName(this->ClassName()); + SetLibraryVersion(LIBRARY_VERSION); + + fInputEvent = nullptr; + fOutputEvent = new TRestDetectorHitsEvent(); +} + +TRestEvent* TRestDetectorHitsRotateProcess::ProcessEvent(TRestEvent* inputEvent) { + fInputEvent = (TRestDetectorHitsEvent*)inputEvent; + fOutputEvent->SetEventInfo(fInputEvent); + + for (unsigned int hit = 0; hit < fInputEvent->GetNumberOfHits(); hit++) { + TVector3 position(fInputEvent->GetX(hit), fInputEvent->GetY(hit), fInputEvent->GetZ(hit)); + + position -= fCenter; + position.Rotate(position, fAxis); + position += fCenter; + + fOutputEvent->AddHit(position.X(), position.Y(), position.Z(), fInputEvent->GetEnergy(hit), + fInputEvent->GetTime(hit), fInputEvent->GetType(hit)); + } + return fOutputEvent; +} + +void TRestDetectorHitsRotateProcess::InitFromConfigFile() { + TRestEventProcess::InitFromConfigFile(); + + fAxis = Get3DVectorParameterWithUnits("axis", {0, 0, 1}); + fCenter = Get3DVectorParameterWithUnits("center", {0, 0, 1}); +} + +void TRestDetectorHitsRotateProcess::PrintMetadata() { + BeginPrintProcess(); + + RESTMetadata << " - Rotation center : ( " << fCenter.X() << ", " << fCenter.Y() << ", " << fCenter.Z() + << ") mm" << RESTendl; + RESTMetadata << " - Rotation axis : ( " << fAxis.X() << ", " << fAxis.Y() << ", " << fAxis.Z() << ")" + << RESTendl; + RESTMetadata << " - Rotation angle : " << fAngle * units("degrees") << " degrees" << RESTendl; + + EndPrintProcess(); +} From 0efef6940a033bd7eee45ed4ef06c3305a727ab9 Mon Sep 17 00:00:00 2001 From: Javier Galan Date: Wed, 19 Jul 2023 13:20:12 +0200 Subject: [PATCH 02/32] Renaming rotation process to TRestDetectorHitsRotationProcess --- ...s.h => TRestDetectorHitsRotationProcess.h} | 14 +++++------ ...x => TRestDetectorHitsRotationProcess.cxx} | 24 +++++++++---------- 2 files changed, 19 insertions(+), 19 deletions(-) rename inc/{TRestDetectorHitsRotateProcess.h => TRestDetectorHitsRotationProcess.h} (87%) rename src/{TRestDetectorHitsRotateProcess.cxx => TRestDetectorHitsRotationProcess.cxx} (82%) diff --git a/inc/TRestDetectorHitsRotateProcess.h b/inc/TRestDetectorHitsRotationProcess.h similarity index 87% rename from inc/TRestDetectorHitsRotateProcess.h rename to inc/TRestDetectorHitsRotationProcess.h index e8cb4799..a46a57b3 100644 --- a/inc/TRestDetectorHitsRotateProcess.h +++ b/inc/TRestDetectorHitsRotationProcess.h @@ -20,14 +20,14 @@ * For the list of contributors see $REST_PATH/CREDITS. * *************************************************************************/ -#ifndef RestCore_TRestDetectorHitsRotateProcess -#define RestCore_TRestDetectorHitsRotateProcess +#ifndef RestCore_TRestDetectorHitsRotationProcess +#define RestCore_TRestDetectorHitsRotationProcess #include #include /// A process to rotate hits from a given center and axis -class TRestDetectorHitsRotateProcess : public TRestEventProcess { +class TRestDetectorHitsRotationProcess : public TRestEventProcess { private: /// A pointer to the process input event TRestDetectorHitsEvent* fInputHitsEvent; //! @@ -62,10 +62,10 @@ class TRestDetectorHitsRotateProcess : public TRestEventProcess { inline TVector3 GetAxis() const { return fAxis; } inline TVector3 GetCenter() const { return fCenter; } - TRestDetectorHitsRotateProcess(); - TRestDetectorHitsRotateProcess(const char* configFilename); - ~TRestDetectorHitsRotateProcess(); + TRestDetectorHitsRotationProcess(); + TRestDetectorHitsRotationProcess(const char* configFilename); + ~TRestDetectorHitsRotationProcess(); - ClassDefOverride(TRestDetectorHitsRotateProcess, 1); + ClassDefOverride(TRestDetectorHitsRotationProcess, 1); }; #endif diff --git a/src/TRestDetectorHitsRotateProcess.cxx b/src/TRestDetectorHitsRotationProcess.cxx similarity index 82% rename from src/TRestDetectorHitsRotateProcess.cxx rename to src/TRestDetectorHitsRotationProcess.cxx index 040bb8a6..64ae322f 100644 --- a/src/TRestDetectorHitsRotateProcess.cxx +++ b/src/TRestDetectorHitsRotationProcess.cxx @@ -21,12 +21,12 @@ *************************************************************************/ ////////////////////////////////////////////////////////////////////////// -/// TRestDetectorHitsRotateProcess will add a rotation of the x,y,z hits +/// TRestDetectorHitsRotationProcess will add a rotation of the x,y,z hits /// in the space. The rotation will be done respect to a center and an /// axis provided by the user. /// /// \code -/// /// /// @@ -40,26 +40,26 @@ /// /// History of developments: /// -/// 2023-July: First implementation of TRestDetectorHitsRotateProcess +/// 2023-July: First implementation of TRestDetectorHitsRotationProcess /// \author Javier Galan /// -/// \class TRestDetectorHitsRotateProcess +/// \class TRestDetectorHitsRotationProcess /// ///
/// -#include "TRestDetectorHitsRotateProcess.h" +#include "TRestDetectorHitsRotationProcess.h" using namespace std; #include -ClassImp(TRestDetectorHitsRotateProcess); +ClassImp(TRestDetectorHitsRotationProcess); -TRestDetectorHitsRotateProcess::TRestDetectorHitsRotateProcess() { Initialize(); } +TRestDetectorHitsRotationProcess::TRestDetectorHitsRotationProcess() { Initialize(); } -TRestDetectorHitsRotateProcess::~TRestDetectorHitsRotateProcess() {} +TRestDetectorHitsRotationProcess::~TRestDetectorHitsRotationProcess() {} -void TRestDetectorHitsRotateProcess::Initialize() { +void TRestDetectorHitsRotationProcess::Initialize() { SetSectionName(this->ClassName()); SetLibraryVersion(LIBRARY_VERSION); @@ -67,7 +67,7 @@ void TRestDetectorHitsRotateProcess::Initialize() { fOutputEvent = new TRestDetectorHitsEvent(); } -TRestEvent* TRestDetectorHitsRotateProcess::ProcessEvent(TRestEvent* inputEvent) { +TRestEvent* TRestDetectorHitsRotationProcess::ProcessEvent(TRestEvent* inputEvent) { fInputEvent = (TRestDetectorHitsEvent*)inputEvent; fOutputEvent->SetEventInfo(fInputEvent); @@ -84,14 +84,14 @@ TRestEvent* TRestDetectorHitsRotateProcess::ProcessEvent(TRestEvent* inputEvent) return fOutputEvent; } -void TRestDetectorHitsRotateProcess::InitFromConfigFile() { +void TRestDetectorHitsRotationProcess::InitFromConfigFile() { TRestEventProcess::InitFromConfigFile(); fAxis = Get3DVectorParameterWithUnits("axis", {0, 0, 1}); fCenter = Get3DVectorParameterWithUnits("center", {0, 0, 1}); } -void TRestDetectorHitsRotateProcess::PrintMetadata() { +void TRestDetectorHitsRotationProcess::PrintMetadata() { BeginPrintProcess(); RESTMetadata << " - Rotation center : ( " << fCenter.X() << ", " << fCenter.Y() << ", " << fCenter.Z() From d7271f31e6ce0566ec0ef80944f23a691a2b3246 Mon Sep 17 00:00:00 2001 From: Javier Galan Date: Wed, 19 Jul 2023 13:31:20 +0200 Subject: [PATCH 03/32] Adding TRestDetectorHitsTranslationProcess --- inc/TRestDetectorHitsRotationProcess.h | 2 +- inc/TRestDetectorHitsTranslationProcess.h | 63 ++++++++++++++ src/TRestDetectorHitsTranslationProcess.cxx | 93 +++++++++++++++++++++ 3 files changed, 157 insertions(+), 1 deletion(-) create mode 100644 inc/TRestDetectorHitsTranslationProcess.h create mode 100644 src/TRestDetectorHitsTranslationProcess.cxx diff --git a/inc/TRestDetectorHitsRotationProcess.h b/inc/TRestDetectorHitsRotationProcess.h index a46a57b3..66bb7516 100644 --- a/inc/TRestDetectorHitsRotationProcess.h +++ b/inc/TRestDetectorHitsRotationProcess.h @@ -56,7 +56,7 @@ class TRestDetectorHitsRotationProcess : public TRestEventProcess { void PrintMetadata() override; - const char* GetProcessName() const override { return "rotateProcess"; } + const char* GetProcessName() const override { return "rotationProcess"; } inline Double_t GetAngle() const { return fAngle; } inline TVector3 GetAxis() const { return fAxis; } diff --git a/inc/TRestDetectorHitsTranslationProcess.h b/inc/TRestDetectorHitsTranslationProcess.h new file mode 100644 index 00000000..7dfd24d1 --- /dev/null +++ b/inc/TRestDetectorHitsTranslationProcess.h @@ -0,0 +1,63 @@ +/************************************************************************* + * This file is part of the REST software framework. * + * * + * Copyright (C) 2016 GIFNA/TREX (University of Zaragoza) * + * For more information see http://gifna.unizar.es/trex * + * * + * REST is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * REST 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 General Public License for more details. * + * * + * You should have a copy of the GNU General Public License along with * + * REST in $REST_PATH/LICENSE. * + * If not, see http://www.gnu.org/licenses/. * + * For the list of contributors see $REST_PATH/CREDITS. * + *************************************************************************/ + +#ifndef RestCore_TRestDetectorHitsTranslationProcess +#define RestCore_TRestDetectorHitsTranslationProcess + +#include +#include + +/// A process to translate hits by a given user amount +class TRestDetectorHitsTranslationProcess : public TRestEventProcess { + private: + /// A pointer to the process input event + TRestDetectorHitsEvent* fInputHitsEvent; //! + + /// A pointer to the process output event + TRestDetectorHitsEvent* fOutputHitsEvent; //! + + void InitFromConfigFile() override; + void Initialize() override; + + protected: + /// The amount to be translated every hit + TVector3 fTranslation = {0, 0, 0}; //< + + public: + any GetInputEvent() const override { return fInputHitsEvent; } + any GetOutputEvent() const override { return fOutputHitsEvent; } + + TRestEvent* ProcessEvent(TRestEvent* inputEvent) override; + + void PrintMetadata() override; + + const char* GetProcessName() const override { return "translationProcess"; } + + inline TVector3 GetTranslation() const { return fTranslation; } + + TRestDetectorHitsTranslationProcess(); + TRestDetectorHitsTranslationProcess(const char* configFilename); + ~TRestDetectorHitsTranslationProcess(); + + ClassDefOverride(TRestDetectorHitsTranslationProcess, 1); +}; +#endif diff --git a/src/TRestDetectorHitsTranslationProcess.cxx b/src/TRestDetectorHitsTranslationProcess.cxx new file mode 100644 index 00000000..ff07c1ed --- /dev/null +++ b/src/TRestDetectorHitsTranslationProcess.cxx @@ -0,0 +1,93 @@ +/************************************************************************* + * This file is part of the REST software framework. * + * * + * Copyright (C) 2016 GIFNA/TREX (University of Zaragoza) * + * For more information see http://gifna.unizar.es/trex * + * * + * REST is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * REST 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 General Public License for more details. * + * * + * You should have a copy of the GNU General Public License along with * + * REST in $REST_PATH/LICENSE. * + * If not, see http://www.gnu.org/licenses/. * + * For the list of contributors see $REST_PATH/CREDITS. * + *************************************************************************/ + +////////////////////////////////////////////////////////////////////////// +/// TRestDetectorHitsTranslationProcess will move every hit inside a +/// TRestDetectorHitsEvent by an amount given at the `translation` vector. +/// +/// \code +/// +/// \endcode +/// +///-------------------------------------------------------------------------- +/// +/// RESTsoft - Software for Rare Event Searches with TPCs +/// +/// History of developments: +/// +/// 2023-July: First implementation of TRestDetectorHitsTranslationProcess +/// \author Javier Galan +/// +/// \class TRestDetectorHitsTranslationProcess +/// +///
+/// +#include "TRestDetectorHitsTranslationProcess.h" + +using namespace std; + +#include + +ClassImp(TRestDetectorHitsTranslationProcess); + +TRestDetectorHitsTranslationProcess::TRestDetectorHitsTranslationProcess() { Initialize(); } + +TRestDetectorHitsTranslationProcess::~TRestDetectorHitsTranslationProcess() {} + +void TRestDetectorHitsTranslationProcess::Initialize() { + SetSectionName(this->ClassName()); + SetLibraryVersion(LIBRARY_VERSION); + + fInputEvent = nullptr; + fOutputEvent = new TRestDetectorHitsEvent(); +} + +TRestEvent* TRestDetectorHitsTranslationProcess::ProcessEvent(TRestEvent* inputEvent) { + fInputEvent = (TRestDetectorHitsEvent*)inputEvent; + fOutputEvent->SetEventInfo(fInputEvent); + + for (unsigned int hit = 0; hit < fInputEvent->GetNumberOfHits(); hit++) { + TVector3 position(fInputEvent->GetX(hit), fInputEvent->GetY(hit), fInputEvent->GetZ(hit)); + + position += fTranslation; + + fOutputEvent->AddHit(position.X(), position.Y(), position.Z(), fInputEvent->GetEnergy(hit), + fInputEvent->GetTime(hit), fInputEvent->GetType(hit)); + } + return fOutputEvent; +} + +void TRestDetectorHitsTranslationProcess::InitFromConfigFile() { + TRestEventProcess::InitFromConfigFile(); + + fTranslation = Get3DVectorParameterWithUnits("translation", {0, 0, 1}); +} + +void TRestDetectorHitsTranslationProcess::PrintMetadata() { + BeginPrintProcess(); + + RESTMetadata << " - Translation vector : ( " << fTranslation.X() << ", " << fTranslation.Y() << ", " + << fTranslation.Z() << ") mm" << RESTendl; + + EndPrintProcess(); +} From 334971fd77e6b338735848c618b8c1ba82c59ec4 Mon Sep 17 00:00:00 2001 From: Javier Galan Date: Wed, 19 Jul 2023 14:36:21 +0200 Subject: [PATCH 04/32] TRestDetectorHitsSpecularProcess added --- inc/TRestDetectorHitsSpecularProcess.h | 67 +++++++++++++++ src/TRestDetectorHitsRotationProcess.cxx | 1 + src/TRestDetectorHitsSpecularProcess.cxx | 105 +++++++++++++++++++++++ 3 files changed, 173 insertions(+) create mode 100644 inc/TRestDetectorHitsSpecularProcess.h create mode 100644 src/TRestDetectorHitsSpecularProcess.cxx diff --git a/inc/TRestDetectorHitsSpecularProcess.h b/inc/TRestDetectorHitsSpecularProcess.h new file mode 100644 index 00000000..4ecb464e --- /dev/null +++ b/inc/TRestDetectorHitsSpecularProcess.h @@ -0,0 +1,67 @@ +/************************************************************************* + * This file is part of the REST software framework. * + * * + * Copyright (C) 2016 GIFNA/TREX (University of Zaragoza) * + * For more information see http://gifna.unizar.es/trex * + * * + * REST is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * REST 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 General Public License for more details. * + * * + * You should have a copy of the GNU General Public License along with * + * REST in $REST_PATH/LICENSE. * + * If not, see http://www.gnu.org/licenses/. * + * For the list of contributors see $REST_PATH/CREDITS. * + *************************************************************************/ + +#ifndef RestCore_TRestDetectorHitsSpecularProcess +#define RestCore_TRestDetectorHitsSpecularProcess + +#include +#include + +/// A process to rotate hits from a given center and axis +class TRestDetectorHitsSpecularProcess : public TRestEventProcess { + private: + /// A pointer to the process input event + TRestDetectorHitsEvent* fInputHitsEvent; //! + + /// A pointer to the process output event + TRestDetectorHitsEvent* fOutputHitsEvent; //! + + void InitFromConfigFile() override; + void Initialize() override; + + protected: + /// Defines the position of the plane. A point inside the plane. + TVector3 fPosition = {0, 0, 0}; //< + + /// Defines the normal to the plane we use to generate the specular image + TVector3 fNormal = {0, 0, 1}; //< + + public: + any GetInputEvent() const override { return fInputHitsEvent; } + any GetOutputEvent() const override { return fOutputHitsEvent; } + + TRestEvent* ProcessEvent(TRestEvent* inputEvent) override; + + void PrintMetadata() override; + + const char* GetProcessName() const override { return "specularProcess"; } + + inline TVector3 GetNormal() const { return fNormal; } + inline TVector3 GetPosition() const { return fPosition; } + + TRestDetectorHitsSpecularProcess(); + TRestDetectorHitsSpecularProcess(const char* configFilename); + ~TRestDetectorHitsSpecularProcess(); + + ClassDefOverride(TRestDetectorHitsSpecularProcess, 1); +}; +#endif diff --git a/src/TRestDetectorHitsRotationProcess.cxx b/src/TRestDetectorHitsRotationProcess.cxx index 64ae322f..b6caf598 100644 --- a/src/TRestDetectorHitsRotationProcess.cxx +++ b/src/TRestDetectorHitsRotationProcess.cxx @@ -88,6 +88,7 @@ void TRestDetectorHitsRotationProcess::InitFromConfigFile() { TRestEventProcess::InitFromConfigFile(); fAxis = Get3DVectorParameterWithUnits("axis", {0, 0, 1}); + fAxis.Unit(); fCenter = Get3DVectorParameterWithUnits("center", {0, 0, 1}); } diff --git a/src/TRestDetectorHitsSpecularProcess.cxx b/src/TRestDetectorHitsSpecularProcess.cxx new file mode 100644 index 00000000..4bf2e866 --- /dev/null +++ b/src/TRestDetectorHitsSpecularProcess.cxx @@ -0,0 +1,105 @@ +/************************************************************************* + * This file is part of the REST software framework. * + * * + * Copyright (C) 2016 GIFNA/TREX (University of Zaragoza) * + * For more information see http://gifna.unizar.es/trex * + * * + * REST is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * REST 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 General Public License for more details. * + * * + * You should have a copy of the GNU General Public License along with * + * REST in $REST_PATH/LICENSE. * + * If not, see http://www.gnu.org/licenses/. * + * For the list of contributors see $REST_PATH/CREDITS. * + *************************************************************************/ + +////////////////////////////////////////////////////////////////////////// +/// TRestDetectorHitsSpecularProcess will update the hits position using +/// a specular image respect to a plane defined using its `normal` and +/// a `position` that is contained in the plane. +/// +/// \code +/// +/// +/// +/// +/// \endcode +/// +///-------------------------------------------------------------------------- +/// +/// RESTsoft - Software for Rare Event Searches with TPCs +/// +/// History of developments: +/// +/// 2023-July: First implementation of TRestDetectorHitsSpecularProcess +/// \author Javier Galan +/// +/// \class TRestDetectorHitsSpecularProcess +/// +///
+/// +#include "TRestDetectorHitsSpecularProcess.h" + +using namespace std; + +#include + +ClassImp(TRestDetectorHitsSpecularProcess); + +TRestDetectorHitsSpecularProcess::TRestDetectorHitsSpecularProcess() { Initialize(); } + +TRestDetectorHitsSpecularProcess::~TRestDetectorHitsSpecularProcess() {} + +void TRestDetectorHitsSpecularProcess::Initialize() { + SetSectionName(this->ClassName()); + SetLibraryVersion(LIBRARY_VERSION); + + fInputEvent = nullptr; + fOutputEvent = new TRestDetectorHitsEvent(); +} + +TRestEvent* TRestDetectorHitsSpecularProcess::ProcessEvent(TRestEvent* inputEvent) { + fInputEvent = (TRestDetectorHitsEvent*)inputEvent; + fOutputEvent->SetEventInfo(fInputEvent); + + for (unsigned int hit = 0; hit < fInputEvent->GetNumberOfHits(); hit++) { + TVector3 position(fInputEvent->GetX(hit), fInputEvent->GetY(hit), fInputEvent->GetZ(hit)); + + TVector3 V = position - fPosition; + Double_t vByN = V.Dot(fNormal); + TVector3 reflectionVector = V - 2 * vByN * fNormal; + + position = fPosition + reflectionVector; + + fOutputEvent->AddHit(position.X(), position.Y(), position.Z(), fInputEvent->GetEnergy(hit), + fInputEvent->GetTime(hit), fInputEvent->GetType(hit)); + } + return fOutputEvent; +} + +void TRestDetectorHitsSpecularProcess::InitFromConfigFile() { + TRestEventProcess::InitFromConfigFile(); + + fNormal = Get3DVectorParameterWithUnits("normal", {0, 0, 1}); + fNormal.Unit(); + fPosition = Get3DVectorParameterWithUnits("position", {0, 0, 1}); +} + +void TRestDetectorHitsSpecularProcess::PrintMetadata() { + BeginPrintProcess(); + + RESTMetadata << " - Plane normal : ( " << fNormal.X() << ", " << fNormal.Y() << ", " << fNormal.Z() + << ") mm" << RESTendl; + RESTMetadata << " - Plane position : ( " << fPosition.X() << ", " << fPosition.Y() << ", " + << fPosition.Z() << ")" << RESTendl; + + EndPrintProcess(); +} From 64903f641b3fdf248ec71f78f447a46cf38d8322 Mon Sep 17 00:00:00 2001 From: Javier Galan Date: Wed, 19 Jul 2023 15:20:12 +0200 Subject: [PATCH 05/32] Fixing compilation errors --- inc/TRestDetectorHitsRotationProcess.h | 8 ++++---- inc/TRestDetectorHitsSpecularProcess.h | 8 ++++---- inc/TRestDetectorHitsTranslationProcess.h | 8 ++++---- src/TRestDetectorHitsRotationProcess.cxx | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/inc/TRestDetectorHitsRotationProcess.h b/inc/TRestDetectorHitsRotationProcess.h index 66bb7516..9d2195d5 100644 --- a/inc/TRestDetectorHitsRotationProcess.h +++ b/inc/TRestDetectorHitsRotationProcess.h @@ -30,10 +30,10 @@ class TRestDetectorHitsRotationProcess : public TRestEventProcess { private: /// A pointer to the process input event - TRestDetectorHitsEvent* fInputHitsEvent; //! + TRestDetectorHitsEvent* fInputEvent; //! /// A pointer to the process output event - TRestDetectorHitsEvent* fOutputHitsEvent; //! + TRestDetectorHitsEvent* fOutputEvent; //! void InitFromConfigFile() override; void Initialize() override; @@ -49,8 +49,8 @@ class TRestDetectorHitsRotationProcess : public TRestEventProcess { TVector3 fAxis = {0, 0, 1}; //< public: - any GetInputEvent() const override { return fInputHitsEvent; } - any GetOutputEvent() const override { return fOutputHitsEvent; } + any GetInputEvent() const override { return fInputEvent; } + any GetOutputEvent() const override { return fOutputEvent; } TRestEvent* ProcessEvent(TRestEvent* inputEvent) override; diff --git a/inc/TRestDetectorHitsSpecularProcess.h b/inc/TRestDetectorHitsSpecularProcess.h index 4ecb464e..9a060190 100644 --- a/inc/TRestDetectorHitsSpecularProcess.h +++ b/inc/TRestDetectorHitsSpecularProcess.h @@ -30,10 +30,10 @@ class TRestDetectorHitsSpecularProcess : public TRestEventProcess { private: /// A pointer to the process input event - TRestDetectorHitsEvent* fInputHitsEvent; //! + TRestDetectorHitsEvent* fInputEvent; //! /// A pointer to the process output event - TRestDetectorHitsEvent* fOutputHitsEvent; //! + TRestDetectorHitsEvent* fOutputEvent; //! void InitFromConfigFile() override; void Initialize() override; @@ -46,8 +46,8 @@ class TRestDetectorHitsSpecularProcess : public TRestEventProcess { TVector3 fNormal = {0, 0, 1}; //< public: - any GetInputEvent() const override { return fInputHitsEvent; } - any GetOutputEvent() const override { return fOutputHitsEvent; } + any GetInputEvent() const override { return fInputEvent; } + any GetOutputEvent() const override { return fOutputEvent; } TRestEvent* ProcessEvent(TRestEvent* inputEvent) override; diff --git a/inc/TRestDetectorHitsTranslationProcess.h b/inc/TRestDetectorHitsTranslationProcess.h index 7dfd24d1..d3c89776 100644 --- a/inc/TRestDetectorHitsTranslationProcess.h +++ b/inc/TRestDetectorHitsTranslationProcess.h @@ -30,10 +30,10 @@ class TRestDetectorHitsTranslationProcess : public TRestEventProcess { private: /// A pointer to the process input event - TRestDetectorHitsEvent* fInputHitsEvent; //! + TRestDetectorHitsEvent* fInputEvent; //! /// A pointer to the process output event - TRestDetectorHitsEvent* fOutputHitsEvent; //! + TRestDetectorHitsEvent* fOutputEvent; //! void InitFromConfigFile() override; void Initialize() override; @@ -43,8 +43,8 @@ class TRestDetectorHitsTranslationProcess : public TRestEventProcess { TVector3 fTranslation = {0, 0, 0}; //< public: - any GetInputEvent() const override { return fInputHitsEvent; } - any GetOutputEvent() const override { return fOutputHitsEvent; } + any GetInputEvent() const override { return fInputEvent; } + any GetOutputEvent() const override { return fOutputEvent; } TRestEvent* ProcessEvent(TRestEvent* inputEvent) override; diff --git a/src/TRestDetectorHitsRotationProcess.cxx b/src/TRestDetectorHitsRotationProcess.cxx index b6caf598..4cfcc838 100644 --- a/src/TRestDetectorHitsRotationProcess.cxx +++ b/src/TRestDetectorHitsRotationProcess.cxx @@ -75,7 +75,7 @@ TRestEvent* TRestDetectorHitsRotationProcess::ProcessEvent(TRestEvent* inputEven TVector3 position(fInputEvent->GetX(hit), fInputEvent->GetY(hit), fInputEvent->GetZ(hit)); position -= fCenter; - position.Rotate(position, fAxis); + position.Rotate(fAngle, fAxis); position += fCenter; fOutputEvent->AddHit(position.X(), position.Y(), position.Z(), fInputEvent->GetEnergy(hit), From a3a5257d29fca1fe5dfd98b57307c90519e46315 Mon Sep 17 00:00:00 2001 From: Javier Galan Date: Wed, 19 Jul 2023 17:31:00 +0200 Subject: [PATCH 06/32] Adding specular.png image used in the documentation --- images/specular.png | Bin 0 -> 150326 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/specular.png diff --git a/images/specular.png b/images/specular.png new file mode 100644 index 0000000000000000000000000000000000000000..cf0b6b4dc2e4ad892771555129886fbecb90de9b GIT binary patch literal 150326 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 XG=rUfb@28);A4H*_E6rzvp4<=YEQ%# literal 0 HcmV?d00001 From 89f3a566c64c77018a6bfb59cef56b53924c53d9 Mon Sep 17 00:00:00 2001 From: Javier Galan Date: Wed, 19 Jul 2023 17:31:48 +0200 Subject: [PATCH 07/32] Adding specular process example at the pipeline directory --- pipeline/hits/specular/specular.C | 67 +++++++++++++++++++++++++ pipeline/hits/specular/specularXY.rml | 7 +++ pipeline/hits/specular/specularY.rml | 7 +++ pipeline/hits/specular/specularYoff.rml | 7 +++ 4 files changed, 88 insertions(+) create mode 100644 pipeline/hits/specular/specular.C create mode 100644 pipeline/hits/specular/specularXY.rml create mode 100644 pipeline/hits/specular/specularY.rml create mode 100644 pipeline/hits/specular/specularYoff.rml diff --git a/pipeline/hits/specular/specular.C b/pipeline/hits/specular/specular.C new file mode 100644 index 00000000..317a6ea9 --- /dev/null +++ b/pipeline/hits/specular/specular.C @@ -0,0 +1,67 @@ + +Int_t specular(Bool_t draw = false) { + TRestDetectorHitsEvent* ev = new TRestDetectorHitsEvent(); + + Double_t xCenter = 5; + Double_t yCenter = 10; + + TRandom3* random = new TRandom3(137); + for (int n = 0; n < 10000; n++) { + Double_t x = random->Gaus(xCenter, 3); + Double_t y = random->Gaus(yCenter, 3); + + ev->AddHit(x, y, 0, 1); + } + + // Initializing processes + string cfgFile1 = "specularXY.rml"; + TRestDetectorHitsSpecularProcess* specular1 = + new TRestDetectorHitsSpecularProcess((char*)cfgFile1.c_str()); + specular1->PrintMetadata(); + + cfgFile1 = "specularY.rml"; + TRestDetectorHitsSpecularProcess* specular2 = + new TRestDetectorHitsSpecularProcess((char*)cfgFile1.c_str()); + specular2->PrintMetadata(); + + cfgFile1 = "specularYoff.rml"; + TRestDetectorHitsSpecularProcess* specular3 = + new TRestDetectorHitsSpecularProcess((char*)cfgFile1.c_str()); + specular3->PrintMetadata(); + + TRestDetectorHitsEvent* specEvent1 = (TRestDetectorHitsEvent*)specular1->ProcessEvent(ev); + TRestDetectorHitsEvent* specEvent2 = (TRestDetectorHitsEvent*)specular2->ProcessEvent(ev); + TRestDetectorHitsEvent* specEvent3 = (TRestDetectorHitsEvent*)specular3->ProcessEvent(ev); + + /* Used to generate a combined plot */ + if (draw) { + TCanvas* c = new TCanvas("c0", "", 800, 600); + c->SetBorderSize(0.1); + // TPad *pad = new TPad("pad","The pad with the function", 0.05,0.50,0.95,0.95,21); + // pad->SetLeftMargin(0.15); + std::vector ranges{50, -25, 25, 50, -25, 25}; + TH2F* h = ev->GetXYHistogram(ranges); + h->Draw("col"); + h->Draw("cont3 same"); + c->Print("original.png"); + + h = specEvent1->GetXYHistogram(ranges); + // pad->cd(); + h->Draw("col"); + h->Draw("cont3 same"); + c->Print("specular1.png"); + + h = specEvent2->GetXYHistogram(ranges); + h->Draw("col"); + h->Draw("cont3 same"); + c->Print("specular2.png"); + + h = specEvent3->GetXYHistogram(ranges); + h->Draw("col"); + h->Draw("cont3 same"); + c->Print("specular3.png"); + } + + cout << "[\033[92m OK \x1b[0m]" << endl; + return 0; +} diff --git a/pipeline/hits/specular/specularXY.rml b/pipeline/hits/specular/specularXY.rml new file mode 100644 index 00000000..0e0d7351 --- /dev/null +++ b/pipeline/hits/specular/specularXY.rml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/pipeline/hits/specular/specularY.rml b/pipeline/hits/specular/specularY.rml new file mode 100644 index 00000000..ce00b57e --- /dev/null +++ b/pipeline/hits/specular/specularY.rml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/pipeline/hits/specular/specularYoff.rml b/pipeline/hits/specular/specularYoff.rml new file mode 100644 index 00000000..457b45a9 --- /dev/null +++ b/pipeline/hits/specular/specularYoff.rml @@ -0,0 +1,7 @@ + + + + + + + From d4ccc1fb533f08fc1dfa938ef508dd52a2dcb630 Mon Sep 17 00:00:00 2001 From: Javier Galan Date: Wed, 19 Jul 2023 17:46:21 +0200 Subject: [PATCH 08/32] TRestDetectorHitsEvent::GetXYHistogram methods added --- inc/TRestDetectorHitsEvent.h | 4 + src/TRestDetectorHitsEvent.cxx | 273 ++++++++++++++++++++++++++++++++- 2 files changed, 271 insertions(+), 6 deletions(-) diff --git a/inc/TRestDetectorHitsEvent.h b/inc/TRestDetectorHitsEvent.h index 6b5c5c7d..15f171d7 100644 --- a/inc/TRestDetectorHitsEvent.h +++ b/inc/TRestDetectorHitsEvent.h @@ -161,6 +161,10 @@ class TRestDetectorHitsEvent : public TRestEvent { TPad* DrawEvent(const TString& option = ""); + TH2F* GetXYHistogram(std::vector ranges, Double_t pitch = 3, Double_t border = 5); + TH2F* GetXZHistogram(std::vector ranges, Double_t pitch = 3, Double_t border = 5); + TH2F* GetYZHistogram(std::vector ranges, Double_t pitch = 3, Double_t border = 5); + void DrawHistograms(Int_t& column, const TString& histOption = "", double pitch = 0); void DrawGraphs(Int_t& column); diff --git a/src/TRestDetectorHitsEvent.cxx b/src/TRestDetectorHitsEvent.cxx index 0367c099..f417b148 100644 --- a/src/TRestDetectorHitsEvent.cxx +++ b/src/TRestDetectorHitsEvent.cxx @@ -876,7 +876,7 @@ void TRestDetectorHitsEvent::DrawHistograms(Int_t& column, const TString& histOp fXZHisto->GetXaxis()->SetTitleSize(1.4 * fXZHisto->GetXaxis()->GetTitleSize()); fXZHisto->GetYaxis()->SetLabelSize(1.25 * fXZHisto->GetYaxis()->GetLabelSize()); fXZHisto->GetXaxis()->SetLabelSize(1.25 * fXZHisto->GetXaxis()->GetLabelSize()); - fXZHisto->GetYaxis()->SetTitleOffset(1.75); + fXZHisto->GetYaxis()->SetTitleOffset(1); } if (nYZ > 0) { @@ -888,7 +888,7 @@ void TRestDetectorHitsEvent::DrawHistograms(Int_t& column, const TString& histOp fYZHisto->GetXaxis()->SetTitleSize(1.4 * fYZHisto->GetXaxis()->GetTitleSize()); fYZHisto->GetYaxis()->SetLabelSize(1.25 * fYZHisto->GetYaxis()->GetLabelSize()); fYZHisto->GetXaxis()->SetLabelSize(1.25 * fYZHisto->GetXaxis()->GetLabelSize()); - fYZHisto->GetYaxis()->SetTitleOffset(1.75); + fYZHisto->GetYaxis()->SetTitleOffset(1); } if (nXY > 0) { @@ -900,7 +900,7 @@ void TRestDetectorHitsEvent::DrawHistograms(Int_t& column, const TString& histOp fXYHisto->GetXaxis()->SetTitleSize(1.4 * fXYHisto->GetXaxis()->GetTitleSize()); fXYHisto->GetYaxis()->SetLabelSize(1.25 * fXYHisto->GetYaxis()->GetLabelSize()); fXYHisto->GetXaxis()->SetLabelSize(1.25 * fXYHisto->GetXaxis()->GetLabelSize()); - fXYHisto->GetYaxis()->SetTitleOffset(1.75); + fXYHisto->GetYaxis()->SetTitleOffset(1); } column++; @@ -914,7 +914,7 @@ void TRestDetectorHitsEvent::DrawHistograms(Int_t& column, const TString& histOp fXHisto->GetXaxis()->SetTitleSize(1.4 * fXHisto->GetXaxis()->GetTitleSize()); fXHisto->GetYaxis()->SetLabelSize(1.25 * fXHisto->GetYaxis()->GetLabelSize()); fXHisto->GetXaxis()->SetLabelSize(1.25 * fXHisto->GetXaxis()->GetLabelSize()); - fXHisto->GetYaxis()->SetTitleOffset(1.75); + fXHisto->GetYaxis()->SetTitleOffset(1); } if (nY > 0) { @@ -926,7 +926,7 @@ void TRestDetectorHitsEvent::DrawHistograms(Int_t& column, const TString& histOp fYHisto->GetXaxis()->SetTitleSize(1.4 * fYHisto->GetXaxis()->GetTitleSize()); fYHisto->GetYaxis()->SetLabelSize(1.25 * fYHisto->GetYaxis()->GetLabelSize()); fYHisto->GetXaxis()->SetLabelSize(1.25 * fYHisto->GetXaxis()->GetLabelSize()); - fYHisto->GetYaxis()->SetTitleOffset(1.75); + fYHisto->GetYaxis()->SetTitleOffset(1); } if (nZ > 0) { @@ -938,7 +938,7 @@ void TRestDetectorHitsEvent::DrawHistograms(Int_t& column, const TString& histOp fZHisto->GetXaxis()->SetTitleSize(1.4 * fYHisto->GetXaxis()->GetTitleSize()); fZHisto->GetYaxis()->SetLabelSize(1.25 * fYHisto->GetYaxis()->GetLabelSize()); fZHisto->GetXaxis()->SetLabelSize(1.25 * fYHisto->GetXaxis()->GetLabelSize()); - fZHisto->GetYaxis()->SetTitleOffset(1.75); + fZHisto->GetYaxis()->SetTitleOffset(1); } column++; @@ -958,3 +958,264 @@ void TRestDetectorHitsEvent::PrintEvent(Int_t nHits) const { fHits->PrintHits(nHits); } + +/////////////////////////////////////////////// +/// \brief This method draws the hits found on XY as a TH2F and it returns the +/// generated histogram. +/// +/// The first argument allows to define the ranges in the format: +/// {binsX, minX, maxX, binsY, minY, maxY}. +/// +/// The pitch allows to adjust the binning in automatic mode (when ranges vector is empty). +/// +/// The border gives an additional margin to the automatic minX, maxX, minY, maxY found. +/// +TH2F* TRestDetectorHitsEvent::GetXYHistogram(std::vector ranges, Double_t pitch, Double_t border) { + double maxX, minX, maxY, minY; + int nBinsX, nBinsY; + + if (ranges.size() == 6) { + nBinsX = ranges[0]; + minX = ranges[1]; + maxX = ranges[2]; + + nBinsY = ranges[3]; + minY = ranges[4]; + maxY = ranges[5]; + } else { + std::vector x, y, en; + + for (unsigned int i = 0; i < GetNumberOfHits(); i++) { + if (GetType(i) % X == 0) x.emplace_back(GetX(i)); + if (GetType(i) % Y == 0) y.emplace_back(GetY(i)); + } + + if (x.empty() && y.empty()) { + std::cout << "TRestDetectorHitsEvent::GetXYHistogram. Empty histogram!" << std::endl; + return nullptr; + } + + TRestHits::GetBoundaries(x, maxX, minX, nBinsX); + TRestHits::GetBoundaries(y, maxY, minY, nBinsY); + + maxX += border; + minX -= border; + + maxY += border; + minY -= border; + + if (pitch > 0) { + nBinsX = std::round((maxX - minX) / pitch); + nBinsY = std::round((maxY - minY) / pitch); + } + } + + delete fXYHisto; + fXYHisto = new TH2F("XY", "", nBinsX, minX, maxX, nBinsY, minY, maxY); + fXYHisto->SetStats(false); + + Int_t nXY = 0; + + for (unsigned int nhit = 0; nhit < this->GetNumberOfHits(); nhit++) { + Double_t x = fHits->GetX(nhit); + Double_t y = fHits->GetY(nhit); + Double_t en = fHits->GetEnergy(nhit); + int type = fHits->GetType(nhit); + + if (type % XY == 0 || type % XYZ == 0) { + fXYHisto->Fill(x, y, en); + nXY++; + } + } + + TStyle style; + style.SetPalette(1); + + if (nXY > 0) { + fXYHisto->Draw("col"); + fXYHisto->Draw("cont3 same"); + fXYHisto->GetXaxis()->SetTitle("X-axis (mm)"); + fXYHisto->GetYaxis()->SetTitle("Y-axis (mm)"); + fXYHisto->GetYaxis()->SetTitleSize(1.4 * fXYHisto->GetYaxis()->GetTitleSize()); + fXYHisto->GetXaxis()->SetTitleSize(1.4 * fXYHisto->GetXaxis()->GetTitleSize()); + fXYHisto->GetYaxis()->SetLabelSize(1.25 * fXYHisto->GetYaxis()->GetLabelSize()); + fXYHisto->GetXaxis()->SetLabelSize(1.25 * fXYHisto->GetXaxis()->GetLabelSize()); + fXYHisto->GetYaxis()->SetTitleOffset(1); + } + + return fXYHisto; +} + +/////////////////////////////////////////////// +/// \brief This method draws the hits found on XY as a TH2F and it returns the +/// generated histogram. +/// +/// The first argument allows to define the ranges in the format: +/// {binsX, minX, maxX, binsZ, minZ, maxZ}. +/// +/// The pitch allows to adjust the binning in automatic mode (when ranges vector is empty). +/// +/// The border gives an additional margin to the automatic minX, maxX, minZ, maxZ found. +/// +TH2F* TRestDetectorHitsEvent::GetYZHistogram(std::vector ranges, Double_t pitch, Double_t border) { + double maxX, minX, maxX, minZ; + int nBinsX, nBinsZ; + + if (ranges.size() == 6) { + nBinsX = ranges[0]; + minX = ranges[1]; + maxX = ranges[2]; + + nBinsZ = ranges[3]; + minZ = ranges[4]; + maxZ = ranges[5]; + } else { + std::vector x, z; + + for (unsigned int i = 0; i < GetNumberOfHits(); i++) { + if (GetType(i) % X == 0) x.emplace_back(GetX(i)); + if (GetType(i) % Z == 0) z.emplace_back(GetZ(i)); + } + + if (x.empty() || z.empty()) { + std::cout << "TRestDetectorHitsEvent::GetXZHistogram. Empty histogram!" << std::endl; + return nullptr; + } + + TRestHits::GetBoundaries(x, maxX, minX, nBinsX); + TRestHits::GetBoundaries(z, maxZ, minZ, nBinsZ); + + maxX += border; + minX -= border; + + maxZ += border; + minZ -= border; + + if (pitch > 0) { + nBinsX = std::round((maxX - minX) / pitch); + nBinsZ = std::round((maxZ - minZ) / pitch); + } + } + + delete fXZHisto; + fXZHisto = new TH2F("XZ", "", nBinsX, minX, maxX, nBinsZ, minZ, maxZ); + fXZHisto->SetStats(false); + + Int_t nXZ = 0; + + for (unsigned int nhit = 0; nhit < this->GetNumberOfHits(); nhit++) { + Double_t x = fHits->GetX(nhit); + Double_t z = fHits->GetZ(nhit); + Double_t en = fHits->GetEnergy(nhit); + int type = fHits->GetType(nhit); + + if (type % XZ == 0 || type % XYZ == 0) { + fXZHisto->Fill(x, z, en); + nXZ++; + } + } + + TStyle style; + style.SetPalette(1); + + if (nXZ > 0) { + fXZHisto->Draw("col"); + fXZHisto->Draw("cont3 same"); + fXZHisto->GetXaxis()->SetTitle("X-axis (mm)"); + fXZHisto->GetYaxis()->SetTitle("Z-axis (mm)"); + fXZHisto->GetYaxis()->SetTitleSize(1.4 * fXZHisto->GetYaxis()->GetTitleSize()); + fXZHisto->GetXaxis()->SetTitleSize(1.4 * fXYHisto->GetXaxis()->GetTitleSize()); + fXZHisto->GetYaxis()->SetLabelSize(1.25 * fXYHisto->GetYaxis()->GetLabelSize()); + fXZHisto->GetXaxis()->SetLabelSize(1.25 * fXYHisto->GetXaxis()->GetLabelSize()); + fXZHisto->GetYaxis()->SetTitleOffset(1); + } + + return fXZHisto; +} + +/////////////////////////////////////////////// +/// \brief This method draws the hits found on YZ as a TH2F and it returns the +/// generated histogram. +/// +/// The first argument allows to define the ranges in the format: +/// {binsY, minY, maxY, binsZ, minZ, maxZ}. +/// +/// The pitch allows to adjust the binning in automatic mode (when ranges vector is empty). +/// +/// The border gives an additional margin to the automatic minY, maxY, minZ, maxZ found. +/// +TH2F* TRestDetectorHitsEvent::GetYZHistogram(std::vector ranges, Double_t pitch, Double_t border) { + double maxY, minY, maxZ, minZ; + int nBinsY, nBinsZ; + + if (ranges.size() == 6) { + nBinsY = ranges[0]; + minY = ranges[1]; + maxY = ranges[2]; + + nBinsZ = ranges[3]; + minZ = ranges[4]; + maxZ = ranges[5]; + } else { + std::vector y, z, en; + + for (unsigned int i = 0; i < GetNumberOfHits(); i++) { + if (GetType(i) % Y == 0) y.emplace_back(GetY(i)); + if (GetType(i) % Z == 0) z.emplace_back(GetZ(i)); + } + + if (y.empty() || z.empty()) { + std::cout << "TRestDetectorHitsEvent::GetYZHistogram. Empty histogram!" << std::endl; + return nullptr; + } + + TRestHits::GetBoundaries(y, maxY, minY, nBinsY); + TRestHits::GetBoundaries(z, maxZ, minZ, nBinsZ); + + maxY += border; + minY -= border; + + maxZ += border; + minZ -= border; + + if (pitch > 0) { + nBinsY = std::round((maxY - minZ) / pitch); + nBinsZ = std::round((maxZ - minZ) / pitch); + } + } + + delete fYZHisto; + fYZHisto = new TH2F("YZ", "", nBinsY, minY, maxY, nBinsZ, minZ, maxZ); + fYZHisto->SetStats(false); + + Int_t nYZ = 0; + + for (unsigned int nhit = 0; nhit < this->GetNumberOfHits(); nhit++) { + Double_t y = fHits->GetY(nhit); + Double_t z = fHits->GetZ(nhit); + Double_t en = fHits->GetEnergy(nhit); + int type = fHits->GetType(nhit); + + if (type % YZ == 0 || type % XYZ == 0) { + fYZHisto->Fill(y, z, en); + nYZ++; + } + } + + TStyle style; + style.SetPalette(1); + + if (nYZ > 0) { + fYZHisto->Draw("col"); + fYZHisto->Draw("cont3 same"); + fYZHisto->GetXaxis()->SetTitle("Y-axis (mm)"); + fYZHisto->GetYaxis()->SetTitle("Z-axis (mm)"); + fYZHisto->GetYaxis()->SetTitleSize(1.4 * fYZHisto->GetYaxis()->GetTitleSize()); + fYZHisto->GetXaxis()->SetTitleSize(1.4 * fYZHisto->GetXaxis()->GetTitleSize()); + fYZHisto->GetYaxis()->SetLabelSize(1.25 * fYZHisto->GetYaxis()->GetLabelSize()); + fYZHisto->GetXaxis()->SetLabelSize(1.25 * fYZHisto->GetXaxis()->GetLabelSize()); + fYZHisto->GetYaxis()->SetTitleOffset(1); + } + + return fYZHisto; +} From abb09660a981ae1d7373b50b72e703612b23781e Mon Sep 17 00:00:00 2001 From: Javier Galan Date: Wed, 19 Jul 2023 17:46:56 +0200 Subject: [PATCH 09/32] TRestDetectorHitsSpecularProces adding documentation --- inc/TRestDetectorHitsSpecularProcess.h | 4 +++ src/TRestDetectorHitsSpecularProcess.cxx | 31 +++++++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/inc/TRestDetectorHitsSpecularProcess.h b/inc/TRestDetectorHitsSpecularProcess.h index 9a060190..1ecdb9cc 100644 --- a/inc/TRestDetectorHitsSpecularProcess.h +++ b/inc/TRestDetectorHitsSpecularProcess.h @@ -53,9 +53,13 @@ class TRestDetectorHitsSpecularProcess : public TRestEventProcess { void PrintMetadata() override; + /// It returns the given process name const char* GetProcessName() const override { return "specularProcess"; } + /// It returns the plane normal inline TVector3 GetNormal() const { return fNormal; } + + /// It returns the position of the point contained in the plane inline TVector3 GetPosition() const { return fPosition; } TRestDetectorHitsSpecularProcess(); diff --git a/src/TRestDetectorHitsSpecularProcess.cxx b/src/TRestDetectorHitsSpecularProcess.cxx index 4bf2e866..f37b7a62 100644 --- a/src/TRestDetectorHitsSpecularProcess.cxx +++ b/src/TRestDetectorHitsSpecularProcess.cxx @@ -33,6 +33,18 @@ ///
/// \endcode /// +/// The following figure has been produced using the `specular.C` defined +/// under `detector/pipeline/hits/specular/`. On the left-top corner we +/// have the original hits event distribution. On the right-top the hits +/// using a specular plane vector defined as (1,1,0) (or y=-x). On the +/// left-bottom a specular image respect to the X-axis, using the normal +/// plane vector (0,1,0). On the right-bottom image the same axis is used +/// but the plane position has been shifted by 5mm to the bottom. Black +/// lines identify the specular planes. +/// +/// \htmlonly \endhtmlonly +/// ![The effect of different specular processes](specular.png) +/// ///-------------------------------------------------------------------------- /// /// RESTsoft - Software for Rare Event Searches with TPCs @@ -56,6 +68,23 @@ ClassImp(TRestDetectorHitsSpecularProcess); TRestDetectorHitsSpecularProcess::TRestDetectorHitsSpecularProcess() { Initialize(); } +/////////////////////////////////////////////// +/// \brief Constructor loading data from a config file +/// +/// If no configuration path is defined using TRestMetadata::SetConfigFilePath +/// the path to the config file must be specified using full path, absolute or +/// relative. +/// +/// The default behaviour is that the config file must be specified with +/// full path, absolute or relative. +/// +/// \param configFilename A const char* giving the path to an RML file. +/// +TRestDetectorHitsSpecularProcess::TRestDetectorHitsSpecularProcess(const char* configFilename) { + Initialize(); + LoadConfigFromFile(configFilename); +} + TRestDetectorHitsSpecularProcess::~TRestDetectorHitsSpecularProcess() {} void TRestDetectorHitsSpecularProcess::Initialize() { @@ -89,7 +118,7 @@ void TRestDetectorHitsSpecularProcess::InitFromConfigFile() { TRestEventProcess::InitFromConfigFile(); fNormal = Get3DVectorParameterWithUnits("normal", {0, 0, 1}); - fNormal.Unit(); + fNormal = fNormal.Unit(); fPosition = Get3DVectorParameterWithUnits("position", {0, 0, 1}); } From 8dbdef64dccfe8583c2c07f5fd5a768c3d610f51 Mon Sep 17 00:00:00 2001 From: Javier Galan Date: Wed, 19 Jul 2023 17:48:42 +0200 Subject: [PATCH 10/32] TRestDetectorHitsSpecularProcess. Correcting documentation --- inc/TRestDetectorHitsSpecularProcess.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/TRestDetectorHitsSpecularProcess.h b/inc/TRestDetectorHitsSpecularProcess.h index 1ecdb9cc..3964b00d 100644 --- a/inc/TRestDetectorHitsSpecularProcess.h +++ b/inc/TRestDetectorHitsSpecularProcess.h @@ -26,7 +26,7 @@ #include #include -/// A process to rotate hits from a given center and axis +/// A process to create specular hit images using a plane definition class TRestDetectorHitsSpecularProcess : public TRestEventProcess { private: /// A pointer to the process input event From 29e8db3e737e9b2086a01003b8e111b34e58ff40 Mon Sep 17 00:00:00 2001 From: Javier Galan Date: Wed, 19 Jul 2023 20:03:24 +0200 Subject: [PATCH 11/32] Update src/TRestDetectorHitsEvent.cxx Co-authored-by: Cristina Margalejo <77193103+cmargalejo@users.noreply.github.com> --- src/TRestDetectorHitsEvent.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/TRestDetectorHitsEvent.cxx b/src/TRestDetectorHitsEvent.cxx index f417b148..2bb4df36 100644 --- a/src/TRestDetectorHitsEvent.cxx +++ b/src/TRestDetectorHitsEvent.cxx @@ -1058,7 +1058,7 @@ TH2F* TRestDetectorHitsEvent::GetXYHistogram(std::vector ranges, Double_t /// The border gives an additional margin to the automatic minX, maxX, minZ, maxZ found. /// TH2F* TRestDetectorHitsEvent::GetYZHistogram(std::vector ranges, Double_t pitch, Double_t border) { - double maxX, minX, maxX, minZ; + double maxX, minX, maxZ, minZ; int nBinsX, nBinsZ; if (ranges.size() == 6) { From 7a9aa237adfee0d4afc967cc7e85935aba89567b Mon Sep 17 00:00:00 2001 From: Javier Galan Date: Wed, 19 Jul 2023 20:04:20 +0200 Subject: [PATCH 12/32] Update src/TRestDetectorHitsEvent.cxx Co-authored-by: Cristina Margalejo <77193103+cmargalejo@users.noreply.github.com> --- src/TRestDetectorHitsEvent.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/TRestDetectorHitsEvent.cxx b/src/TRestDetectorHitsEvent.cxx index 2bb4df36..d8612e42 100644 --- a/src/TRestDetectorHitsEvent.cxx +++ b/src/TRestDetectorHitsEvent.cxx @@ -1057,7 +1057,7 @@ TH2F* TRestDetectorHitsEvent::GetXYHistogram(std::vector ranges, Double_t /// /// The border gives an additional margin to the automatic minX, maxX, minZ, maxZ found. /// -TH2F* TRestDetectorHitsEvent::GetYZHistogram(std::vector ranges, Double_t pitch, Double_t border) { +TH2F* TRestDetectorHitsEvent::GetXZHistogram(std::vector ranges, Double_t pitch, Double_t border) { double maxX, minX, maxZ, minZ; int nBinsX, nBinsZ; From b674e2c06e975f8ae0ad4437b082da7849b84b6c Mon Sep 17 00:00:00 2001 From: Javier Galan Date: Wed, 19 Jul 2023 20:36:32 +0200 Subject: [PATCH 13/32] TRestDetectorHitsRotationProcess. Added config file constructor --- src/TRestDetectorHitsRotationProcess.cxx | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/TRestDetectorHitsRotationProcess.cxx b/src/TRestDetectorHitsRotationProcess.cxx index 4cfcc838..4d6f5536 100644 --- a/src/TRestDetectorHitsRotationProcess.cxx +++ b/src/TRestDetectorHitsRotationProcess.cxx @@ -57,6 +57,23 @@ ClassImp(TRestDetectorHitsRotationProcess); TRestDetectorHitsRotationProcess::TRestDetectorHitsRotationProcess() { Initialize(); } +/////////////////////////////////////////////// +/// \brief Constructor loading data from a config file +/// +/// If no configuration path is defined using TRestMetadata::SetConfigFilePath +/// the path to the config file must be specified using full path, absolute or +/// relative. +/// +/// The default behaviour is that the config file must be specified with +/// full path, absolute or relative. +/// +/// \param configFilename A const char* giving the path to an RML file. +/// +TRestDetectorHitsRotationProcess::TRestDetectorHitsRotationProcess(const char* configFilename) { + Initialize(); + LoadConfigFromFile(configFilename); +} + TRestDetectorHitsRotationProcess::~TRestDetectorHitsRotationProcess() {} void TRestDetectorHitsRotationProcess::Initialize() { From 670761d234aa9cf8aeaae66d02e144a2b23deb18 Mon Sep 17 00:00:00 2001 From: Javier Galan Date: Wed, 19 Jul 2023 20:50:08 +0200 Subject: [PATCH 14/32] TRestDetectorHitsRotationProcess. Added documentation image --- images/rotation.png | Bin 0 -> 86826 bytes pipeline/hits/rotation/rotation.C | 53 +++++++++++++++++++++++ pipeline/hits/rotation/rotation45off.rml | 8 ++++ pipeline/hits/rotation/rotation90.rml | 8 ++++ pipeline/hits/rotation/specularXY.rml | 7 +++ src/TRestDetectorHitsRotationProcess.cxx | 10 +++++ 6 files changed, 86 insertions(+) create mode 100644 images/rotation.png create mode 100644 pipeline/hits/rotation/rotation.C create mode 100644 pipeline/hits/rotation/rotation45off.rml create mode 100644 pipeline/hits/rotation/rotation90.rml create mode 100644 pipeline/hits/rotation/specularXY.rml diff --git a/images/rotation.png b/images/rotation.png new file mode 100644 index 0000000000000000000000000000000000000000..af69855f96c7b3bdbe9cc22ce2441885ddc9f485 GIT binary patch literal 86826 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 Axc~qF literal 0 HcmV?d00001 diff --git a/pipeline/hits/rotation/rotation.C b/pipeline/hits/rotation/rotation.C new file mode 100644 index 00000000..02ec3573 --- /dev/null +++ b/pipeline/hits/rotation/rotation.C @@ -0,0 +1,53 @@ + +Int_t rotation(Bool_t draw = false) { + TRestDetectorHitsEvent* ev = new TRestDetectorHitsEvent(); + + Double_t xCenter = 5; + Double_t yCenter = 10; + + TRandom3* random = new TRandom3(137); + for (int n = 0; n < 10000; n++) { + Double_t x = random->Gaus(xCenter, 3); + Double_t y = random->Gaus(yCenter, 3); + + ev->AddHit(x, y, 0, 1); + } + + // Initializing processes + string cfgFile1 = "rotation90.rml"; + TRestDetectorHitsRotationProcess* rotation1 = + new TRestDetectorHitsRotationProcess((char*)cfgFile1.c_str()); + rotation1->PrintMetadata(); + + cfgFile1 = "rotation45off.rml"; + TRestDetectorHitsRotationProcess* rotation2 = + new TRestDetectorHitsRotationProcess((char*)cfgFile1.c_str()); + rotation2->PrintMetadata(); + + TRestDetectorHitsEvent* rotEvent1 = (TRestDetectorHitsEvent*)rotation1->ProcessEvent(ev); + TRestDetectorHitsEvent* rotEvent2 = (TRestDetectorHitsEvent*)rotation2->ProcessEvent(ev); + + /* Used to generate a combined plot */ + if (draw) { + TCanvas* c = new TCanvas("c0", "", 800, 600); + std::vector ranges{50, -25, 25, 50, -25, 25}; + TH2F* h = ev->GetXYHistogram(ranges); + h->Draw("col"); + h->Draw("cont3 same"); + c->Print("original.png"); + + h = rotEvent1->GetXYHistogram(ranges); + // pad->cd(); + h->Draw("col"); + h->Draw("cont3 same"); + c->Print("rotation1.png"); + + h = rotEvent2->GetXYHistogram(ranges); + h->Draw("col"); + h->Draw("cont3 same"); + c->Print("rotation2.png"); + } + + cout << "[\033[92m OK \x1b[0m]" << endl; + return 0; +} diff --git a/pipeline/hits/rotation/rotation45off.rml b/pipeline/hits/rotation/rotation45off.rml new file mode 100644 index 00000000..f24072ed --- /dev/null +++ b/pipeline/hits/rotation/rotation45off.rml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/pipeline/hits/rotation/rotation90.rml b/pipeline/hits/rotation/rotation90.rml new file mode 100644 index 00000000..193e0072 --- /dev/null +++ b/pipeline/hits/rotation/rotation90.rml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/pipeline/hits/rotation/specularXY.rml b/pipeline/hits/rotation/specularXY.rml new file mode 100644 index 00000000..0e0d7351 --- /dev/null +++ b/pipeline/hits/rotation/specularXY.rml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/TRestDetectorHitsRotationProcess.cxx b/src/TRestDetectorHitsRotationProcess.cxx index 4d6f5536..50bd6660 100644 --- a/src/TRestDetectorHitsRotationProcess.cxx +++ b/src/TRestDetectorHitsRotationProcess.cxx @@ -34,6 +34,16 @@ ///
/// \endcode /// +/// The following figure has been produced using the `rotation.C` defined +/// under `detector/pipeline/hits/rotation/`. On the left we have the +/// original hits event distribution. On the middle the hits +/// with a 90 degrees clock-wise rotation with center at (0,0,0). On the +/// right the original hits after a clock-wise rotation of 45 degrees with +/// center at (-25,25,0). The axis for both rotations is along the Z-axis. +/// +/// \htmlonly \endhtmlonly +/// ![The effect of different rotation processes](rotation.png) +/// ///-------------------------------------------------------------------------- /// /// RESTsoft - Software for Rare Event Searches with TPCs From 77bf91963b889ab0af4f6bc8e48e7c2000bb794f Mon Sep 17 00:00:00 2001 From: Javier Galan Date: Wed, 19 Jul 2023 21:36:16 +0200 Subject: [PATCH 15/32] TRestDetectorHitsTranslationProcess adding documentation image --- images/translation.png | Bin 0 -> 57198 bytes .../hits/translation/.rotation45off.rml.swp | Bin 0 -> 12288 bytes pipeline/hits/translation/specularXY.rml | 7 +++ pipeline/hits/translation/translation.C | 42 ++++++++++++++++++ pipeline/hits/translation/translation.rml | 4 ++ src/TRestDetectorHitsRotationProcess.cxx | 2 +- src/TRestDetectorHitsSpecularProcess.cxx | 2 +- src/TRestDetectorHitsTranslationProcess.cxx | 25 +++++++++++ 8 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 images/translation.png create mode 100644 pipeline/hits/translation/.rotation45off.rml.swp create mode 100644 pipeline/hits/translation/specularXY.rml create mode 100644 pipeline/hits/translation/translation.C create mode 100644 pipeline/hits/translation/translation.rml diff --git a/images/translation.png b/images/translation.png new file mode 100644 index 0000000000000000000000000000000000000000..40d77130095ac6045f56a1079e0e50ee046106cd GIT binary patch literal 57198 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

-2~Fj`UO9OTCW4GgFv_436a12IbH7dzc+9QRj!L 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

LP!3RdOHv9_Gw?MP;sCdp@- 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 M5AVtN?ey>e1NpS&egFUf literal 0 HcmV?d00001 diff --git a/pipeline/hits/translation/.rotation45off.rml.swp b/pipeline/hits/translation/.rotation45off.rml.swp new file mode 100644 index 0000000000000000000000000000000000000000..98a3beea5ebf63d0c8ce3639ae2d0d4116036dbe GIT binary patch literal 12288 zcmeI&y-ve05C?FViG>fr!WhB=sIAjNC5F&03@{*21uU?b)F}ZsiEQ^{f|-%G;Q`DBm0TI;U?+oKynpbYM~=(cuQIt*hKR*N~MZo$*&@7 zxK6CFQ4)_A+qEPN%etecJQuei0D(+kj%`&dUbb3uSDodh(`<==00bZa0SG_<0uX=z z1pbMDO$+Rf-gPE_-`RXF{Fw7oOb~zo1Rwwb2tWV=5P$##AOHaf{6PWHV(fmNv1c0D z|Nmd#|8EP7z0!D~aZY2C#s}rR&0CQmWR9ba>+`f7 + + + + + + diff --git a/pipeline/hits/translation/translation.C b/pipeline/hits/translation/translation.C new file mode 100644 index 00000000..cb2d1554 --- /dev/null +++ b/pipeline/hits/translation/translation.C @@ -0,0 +1,42 @@ + +Int_t translation(Bool_t draw = false) { + TRestDetectorHitsEvent* ev = new TRestDetectorHitsEvent(); + + Double_t xCenter = 5; + Double_t yCenter = 10; + + TRandom3* random = new TRandom3(137); + for (int n = 0; n < 10000; n++) { + Double_t x = random->Gaus(xCenter, 3); + Double_t y = random->Gaus(yCenter, 3); + + ev->AddHit(x, y, 0, 1); + } + + // Initializing processes + string cfgFile1 = "translation.rml"; + TRestDetectorHitsTranslationProcess* translation = + new TRestDetectorHitsTranslationProcess((char*)cfgFile1.c_str()); + translation->PrintMetadata(); + + TRestDetectorHitsEvent* trEvent = (TRestDetectorHitsEvent*)translation->ProcessEvent(ev); + + /* Used to generate a combined plot */ + if (draw) { + TCanvas* c = new TCanvas("c0", "", 800, 600); + std::vector ranges{50, -25, 25, 50, -25, 25}; + TH2F* h = ev->GetXYHistogram(ranges); + h->Draw("col"); + h->Draw("cont3 same"); + c->Print("original.png"); + + h = trEvent->GetXYHistogram(ranges); + // pad->cd(); + h->Draw("col"); + h->Draw("cont3 same"); + c->Print("translation.png"); + } + + cout << "[\033[92m OK \x1b[0m]" << endl; + return 0; +} diff --git a/pipeline/hits/translation/translation.rml b/pipeline/hits/translation/translation.rml new file mode 100644 index 00000000..05f7d332 --- /dev/null +++ b/pipeline/hits/translation/translation.rml @@ -0,0 +1,4 @@ + + + + diff --git a/src/TRestDetectorHitsRotationProcess.cxx b/src/TRestDetectorHitsRotationProcess.cxx index 50bd6660..b0ff9e21 100644 --- a/src/TRestDetectorHitsRotationProcess.cxx +++ b/src/TRestDetectorHitsRotationProcess.cxx @@ -41,7 +41,7 @@ /// right the original hits after a clock-wise rotation of 45 degrees with /// center at (-25,25,0). The axis for both rotations is along the Z-axis. /// -/// \htmlonly \endhtmlonly +/// \htmlonly \endhtmlonly /// ![The effect of different rotation processes](rotation.png) /// ///-------------------------------------------------------------------------- diff --git a/src/TRestDetectorHitsSpecularProcess.cxx b/src/TRestDetectorHitsSpecularProcess.cxx index f37b7a62..a7782314 100644 --- a/src/TRestDetectorHitsSpecularProcess.cxx +++ b/src/TRestDetectorHitsSpecularProcess.cxx @@ -42,7 +42,7 @@ /// but the plane position has been shifted by 5mm to the bottom. Black /// lines identify the specular planes. /// -/// \htmlonly \endhtmlonly +/// \htmlonly \endhtmlonly /// ![The effect of different specular processes](specular.png) /// ///-------------------------------------------------------------------------- diff --git a/src/TRestDetectorHitsTranslationProcess.cxx b/src/TRestDetectorHitsTranslationProcess.cxx index ff07c1ed..43d75c9c 100644 --- a/src/TRestDetectorHitsTranslationProcess.cxx +++ b/src/TRestDetectorHitsTranslationProcess.cxx @@ -29,6 +29,14 @@ /// translation="(5,5,0)mm" /> /// \endcode /// +/// The following figure has been produced using the `translation.C` +/// defined under `detector/pipeline/hits/translation/`. On the left we +/// have the original hits event distribution. On the right the hits +/// distribution after a translation by a vector of (-1.5,0.5,0)cm. +/// +/// \htmlonly \endhtmlonly +/// ![The effect of translation process](translation.png) +/// ///-------------------------------------------------------------------------- /// /// RESTsoft - Software for Rare Event Searches with TPCs @@ -52,6 +60,23 @@ ClassImp(TRestDetectorHitsTranslationProcess); TRestDetectorHitsTranslationProcess::TRestDetectorHitsTranslationProcess() { Initialize(); } +/////////////////////////////////////////////// +/// \brief Constructor loading data from a config file +/// +/// If no configuration path is defined using TRestMetadata::SetConfigFilePath +/// the path to the config file must be specified using full path, absolute or +/// relative. +/// +/// The default behaviour is that the config file must be specified with +/// full path, absolute or relative. +/// +/// \param configFilename A const char* giving the path to an RML file. +/// +TRestDetectorHitsTranslationProcess::TRestDetectorHitsTranslationProcess(const char* configFilename) { + Initialize(); + LoadConfigFromFile(configFilename); +} + TRestDetectorHitsTranslationProcess::~TRestDetectorHitsTranslationProcess() {} void TRestDetectorHitsTranslationProcess::Initialize() { From 7d1c4c80d7afee0f363af73e524183a85d6599ba Mon Sep 17 00:00:00 2001 From: Javier Galan Date: Thu, 20 Jul 2023 10:29:59 +0200 Subject: [PATCH 16/32] Removing temporary file --- .../hits/translation/.rotation45off.rml.swp | Bin 12288 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 pipeline/hits/translation/.rotation45off.rml.swp diff --git a/pipeline/hits/translation/.rotation45off.rml.swp b/pipeline/hits/translation/.rotation45off.rml.swp deleted file mode 100644 index 98a3beea5ebf63d0c8ce3639ae2d0d4116036dbe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI&y-ve05C?FViG>fr!WhB=sIAjNC5F&03@{*21uU?b)F}ZsiEQ^{f|-%G;Q`DBm0TI;U?+oKynpbYM~=(cuQIt*hKR*N~MZo$*&@7 zxK6CFQ4)_A+qEPN%etecJQuei0D(+kj%`&dUbb3uSDodh(`<==00bZa0SG_<0uX=z z1pbMDO$+Rf-gPE_-`RXF{Fw7oOb~zo1Rwwb2tWV=5P$##AOHaf{6PWHV(fmNv1c0D z|Nmd#|8EP7z0!D~aZY2C#s}rR&0CQmWR9ba>+`f7 Date: Thu, 20 Jul 2023 16:14:56 +0200 Subject: [PATCH 17/32] TRestDetectorHitsRotate/Translate/Specular now adds an error if the hits are not XYZ --- src/TRestDetectorHitsEvent.cxx | 1 + src/TRestDetectorHitsRotationProcess.cxx | 11 ++++++++--- src/TRestDetectorHitsSpecularProcess.cxx | 17 +++++++++++++---- src/TRestDetectorHitsTranslationProcess.cxx | 7 ++++++- 4 files changed, 28 insertions(+), 8 deletions(-) diff --git a/src/TRestDetectorHitsEvent.cxx b/src/TRestDetectorHitsEvent.cxx index d8612e42..08f1340a 100644 --- a/src/TRestDetectorHitsEvent.cxx +++ b/src/TRestDetectorHitsEvent.cxx @@ -202,6 +202,7 @@ TRestHits* TRestDetectorHitsEvent::GetYZHits() { /// A XYZ hit compatible are those hits that have valid X, Y and Z coordinates. /// /// \return It returns back a TRestHits structure with the hits fulfilling the XYZ condition. +/// TRestHits* TRestDetectorHitsEvent::GetXYZHits() { fXYZHits->RemoveHits(); diff --git a/src/TRestDetectorHitsRotationProcess.cxx b/src/TRestDetectorHitsRotationProcess.cxx index b0ff9e21..5936557b 100644 --- a/src/TRestDetectorHitsRotationProcess.cxx +++ b/src/TRestDetectorHitsRotationProcess.cxx @@ -98,12 +98,17 @@ TRestEvent* TRestDetectorHitsRotationProcess::ProcessEvent(TRestEvent* inputEven fInputEvent = (TRestDetectorHitsEvent*)inputEvent; fOutputEvent->SetEventInfo(fInputEvent); + Bool_t xyzEvent = fInputEvent->GetXYZHits()->GetNumberOfHits() == 0 ? false : true; for (unsigned int hit = 0; hit < fInputEvent->GetNumberOfHits(); hit++) { TVector3 position(fInputEvent->GetX(hit), fInputEvent->GetY(hit), fInputEvent->GetZ(hit)); - position -= fCenter; - position.Rotate(fAngle, fAxis); - position += fCenter; + if (xyzEvent) { + position -= fCenter; + position.Rotate(fAngle, fAxis); + position += fCenter; + } else { + this->SetError("TRestDetectorHitsRotationProcess. Only XYZ hits can be transformed"); + } fOutputEvent->AddHit(position.X(), position.Y(), position.Z(), fInputEvent->GetEnergy(hit), fInputEvent->GetTime(hit), fInputEvent->GetType(hit)); diff --git a/src/TRestDetectorHitsSpecularProcess.cxx b/src/TRestDetectorHitsSpecularProcess.cxx index a7782314..4ce05cc3 100644 --- a/src/TRestDetectorHitsSpecularProcess.cxx +++ b/src/TRestDetectorHitsSpecularProcess.cxx @@ -25,6 +25,10 @@ /// a specular image respect to a plane defined using its `normal` and /// a `position` that is contained in the plane. /// +/// \warning This process will only be valid for those detector hits +/// of type XYZ, where the (x,y,z) coordinates take simultaneously physical +/// values. When the hits contain a non-valid (undetermined) coordinate +/// /// \code /// @@ -99,14 +103,19 @@ TRestEvent* TRestDetectorHitsSpecularProcess::ProcessEvent(TRestEvent* inputEven fInputEvent = (TRestDetectorHitsEvent*)inputEvent; fOutputEvent->SetEventInfo(fInputEvent); + Bool_t xyzEvent = fInputEvent->GetXYZHits()->GetNumberOfHits() == 0 ? false : true; for (unsigned int hit = 0; hit < fInputEvent->GetNumberOfHits(); hit++) { TVector3 position(fInputEvent->GetX(hit), fInputEvent->GetY(hit), fInputEvent->GetZ(hit)); - TVector3 V = position - fPosition; - Double_t vByN = V.Dot(fNormal); - TVector3 reflectionVector = V - 2 * vByN * fNormal; + if (xyzEvent) { + TVector3 V = position - fPosition; + Double_t vByN = V.Dot(fNormal); + TVector3 reflectionVector = V - 2 * vByN * fNormal; - position = fPosition + reflectionVector; + position = fPosition + reflectionVector; + } else { + this->SetError("TRestDetectorHitsSpecularProcess. Only XYZ hits can be transformed"); + } fOutputEvent->AddHit(position.X(), position.Y(), position.Z(), fInputEvent->GetEnergy(hit), fInputEvent->GetTime(hit), fInputEvent->GetType(hit)); diff --git a/src/TRestDetectorHitsTranslationProcess.cxx b/src/TRestDetectorHitsTranslationProcess.cxx index 43d75c9c..ab1daa10 100644 --- a/src/TRestDetectorHitsTranslationProcess.cxx +++ b/src/TRestDetectorHitsTranslationProcess.cxx @@ -91,10 +91,15 @@ TRestEvent* TRestDetectorHitsTranslationProcess::ProcessEvent(TRestEvent* inputE fInputEvent = (TRestDetectorHitsEvent*)inputEvent; fOutputEvent->SetEventInfo(fInputEvent); + Bool_t xyzEvent = fInputEvent->GetXYZHits()->GetNumberOfHits() == 0 ? false : true; for (unsigned int hit = 0; hit < fInputEvent->GetNumberOfHits(); hit++) { TVector3 position(fInputEvent->GetX(hit), fInputEvent->GetY(hit), fInputEvent->GetZ(hit)); - position += fTranslation; + if (xyzEvent) { + position += fTranslation; + } else { + this->SetError("TRestDetectorHitsTranslationProcess. Only XYZ hits can be transformed"); + } fOutputEvent->AddHit(position.X(), position.Y(), position.Z(), fInputEvent->GetEnergy(hit), fInputEvent->GetTime(hit), fInputEvent->GetType(hit)); From 4b71a6d063b1b75141017c3fa7b30080735db9cf Mon Sep 17 00:00:00 2001 From: Javier Galan Date: Thu, 20 Jul 2023 16:19:53 +0200 Subject: [PATCH 18/32] Adding warning to specular/rotation/translation processes --- src/TRestDetectorHitsRotationProcess.cxx | 6 ++++++ src/TRestDetectorHitsSpecularProcess.cxx | 10 ++++++---- src/TRestDetectorHitsTranslationProcess.cxx | 6 ++++++ 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/TRestDetectorHitsRotationProcess.cxx b/src/TRestDetectorHitsRotationProcess.cxx index 5936557b..066fa999 100644 --- a/src/TRestDetectorHitsRotationProcess.cxx +++ b/src/TRestDetectorHitsRotationProcess.cxx @@ -34,6 +34,12 @@ /// /// \endcode /// +/// \warning This process will only be valid for those detector hits +/// of type XYZ, where the (x,y,z) coordinates take simultaneously physical +/// values. When the hits contain a non-valid (undetermined) coordinate +/// component this transformation will have non-sense and this process +/// will do nothing. +/// /// The following figure has been produced using the `rotation.C` defined /// under `detector/pipeline/hits/rotation/`. On the left we have the /// original hits event distribution. On the middle the hits diff --git a/src/TRestDetectorHitsSpecularProcess.cxx b/src/TRestDetectorHitsSpecularProcess.cxx index 4ce05cc3..ad6cb8a1 100644 --- a/src/TRestDetectorHitsSpecularProcess.cxx +++ b/src/TRestDetectorHitsSpecularProcess.cxx @@ -25,10 +25,6 @@ /// a specular image respect to a plane defined using its `normal` and /// a `position` that is contained in the plane. /// -/// \warning This process will only be valid for those detector hits -/// of type XYZ, where the (x,y,z) coordinates take simultaneously physical -/// values. When the hits contain a non-valid (undetermined) coordinate -/// /// \code /// @@ -37,6 +33,12 @@ /// /// \endcode /// +/// \warning This process will only be valid for those detector hits +/// of type XYZ, where the (x,y,z) coordinates take simultaneously physical +/// values. When the hits contain a non-valid (undetermined) coordinate +/// component this transformation will have non-sense and this process +/// will do nothing. +/// /// The following figure has been produced using the `specular.C` defined /// under `detector/pipeline/hits/specular/`. On the left-top corner we /// have the original hits event distribution. On the right-top the hits diff --git a/src/TRestDetectorHitsTranslationProcess.cxx b/src/TRestDetectorHitsTranslationProcess.cxx index ab1daa10..2db0faea 100644 --- a/src/TRestDetectorHitsTranslationProcess.cxx +++ b/src/TRestDetectorHitsTranslationProcess.cxx @@ -29,6 +29,12 @@ /// translation="(5,5,0)mm" /> /// \endcode /// +/// \warning This process will only be valid for those detector hits +/// of type XYZ, where the (x,y,z) coordinates take simultaneously physical +/// values. When the hits contain a non-valid (undetermined) coordinate +/// component this transformation will have non-sense and this process +/// will do nothing. +/// /// The following figure has been produced using the `translation.C` /// defined under `detector/pipeline/hits/translation/`. On the left we /// have the original hits event distribution. On the right the hits From 2883f23181fb9cd1a856b8baab19c0dfe995fa45 Mon Sep 17 00:00:00 2001 From: Javier Galan Date: Thu, 20 Jul 2023 16:20:35 +0200 Subject: [PATCH 19/32] Removing TRestDetectorHitsRotateAndTranslateProcess which will be moved to legacy library --- ...estDetectorHitsRotateAndTranslateProcess.h | 87 ------------ ...tDetectorHitsRotateAndTranslateProcess.cxx | 128 ------------------ 2 files changed, 215 deletions(-) delete mode 100644 inc/TRestDetectorHitsRotateAndTranslateProcess.h delete mode 100644 src/TRestDetectorHitsRotateAndTranslateProcess.cxx diff --git a/inc/TRestDetectorHitsRotateAndTranslateProcess.h b/inc/TRestDetectorHitsRotateAndTranslateProcess.h deleted file mode 100644 index bc32fbcf..00000000 --- a/inc/TRestDetectorHitsRotateAndTranslateProcess.h +++ /dev/null @@ -1,87 +0,0 @@ -///______________________________________________________________________________ -///______________________________________________________________________________ -///______________________________________________________________________________ -/// -/// -/// RESTSoft : Software for Rare Event Searches with TPCs -/// -/// TRestDetectorHitsRotateAndTranslateProcess.h -/// -/// march 2016: First concept -/// Created as part of the conceptualization of existing REST -/// software. -/// Javier G. Garza -///_______________________________________________________________________________ - -#ifndef RestCore_TRestDetectorHitsRotateAndTranslateProcess -#define RestCore_TRestDetectorHitsRotateAndTranslateProcess - -#include - -#include "TRestDetectorGas.h" -#include "TRestDetectorHitsEvent.h" - -class TRestDetectorHitsRotateAndTranslateProcess : public TRestEventProcess { - private: - TRestDetectorHitsEvent* fInputHitsEvent; //! - TRestDetectorHitsEvent* fOutputHitsEvent; //! - - Double_t fDeltaX; ///< shift in X-axis - Double_t fDeltaY; ///< shift in X-axis - Double_t fDeltaZ; ///< shift in X-axis - - Double_t fAlpha; ///< rotation angle around z-axis - Double_t fBeta; ///< rotation angle around y-axis - Double_t fGamma; ///< rotation angle around x-axis - - void InitFromConfigFile() override; - void Initialize() override; - void LoadDefaultConfig(); - - protected: - // add here the members of your event process - - public: - any GetInputEvent() const override { return fInputHitsEvent; } - any GetOutputEvent() const override { return fOutputHitsEvent; } - - void InitProcess() override; - TRestEvent* ProcessEvent(TRestEvent* inputEvent) override; - void EndProcess() override; - - void LoadConfig(std::string configFilename); - - void PrintMetadata() override { - BeginPrintProcess(); - - RESTMetadata << " delta x : " << fDeltaX << RESTendl; - RESTMetadata << " delta y : " << fDeltaY << RESTendl; - RESTMetadata << " delta z : " << fDeltaZ << RESTendl; - RESTMetadata << " alpha : " << fAlpha << RESTendl; - RESTMetadata << " beta : " << fBeta << RESTendl; - RESTMetadata << " gamma : " << fGamma << RESTendl; - - EndPrintProcess(); - } - - const char* GetProcessName() const override { return "rotateAndTraslate"; } - - inline Double_t GetDeltaX() const { return fDeltaX; } - inline Double_t GetDeltaY() const { return fDeltaY; } - inline Double_t GetDeltaZ() const { return fDeltaZ; } - - inline Double_t GetAlpha() const { return fAlpha; } - inline Double_t GetBeta() const { return fBeta; } - inline Double_t GetGamma() const { return fGamma; } - - // Constructor - TRestDetectorHitsRotateAndTranslateProcess(); - TRestDetectorHitsRotateAndTranslateProcess(const char* configFilename); - // Destructor - ~TRestDetectorHitsRotateAndTranslateProcess(); - - ClassDefOverride(TRestDetectorHitsRotateAndTranslateProcess, - 1); // Template for a REST "event process" class inherited from - // TRestEventProcess -}; -#endif diff --git a/src/TRestDetectorHitsRotateAndTranslateProcess.cxx b/src/TRestDetectorHitsRotateAndTranslateProcess.cxx deleted file mode 100644 index e9432568..00000000 --- a/src/TRestDetectorHitsRotateAndTranslateProcess.cxx +++ /dev/null @@ -1,128 +0,0 @@ -///______________________________________________________________________________ -///______________________________________________________________________________ -///______________________________________________________________________________ -/// -/// -/// RESTSoft : Software for Rare Event Searches with TPCs -/// -/// TRestDetectorHitsRotateAndTranslateProcess.cxx -/// -/// Template to use to design "event process" classes inherited from -/// TRestDetectorHitsRotateAndTranslateProcess -/// How to use: replace TRestDetectorHitsRotateAndTranslateProcess by your -/// name, fill the required functions following instructions and add -/// all needed additional members and funcionality -/// -/// march 2016: First concept -/// Created as part of the conceptualization of existing REST -/// software. -/// Javier G. Garza -///_______________________________________________________________________________ - -#include "TRestDetectorHitsRotateAndTranslateProcess.h" - -using namespace std; - -#include - -ClassImp(TRestDetectorHitsRotateAndTranslateProcess); - -TRestDetectorHitsRotateAndTranslateProcess::TRestDetectorHitsRotateAndTranslateProcess() { Initialize(); } - -TRestDetectorHitsRotateAndTranslateProcess::TRestDetectorHitsRotateAndTranslateProcess( - const char* configFilename) { - Initialize(); - - if (LoadConfigFromFile(configFilename)) { - LoadDefaultConfig(); - } - - PrintMetadata(); -} - -TRestDetectorHitsRotateAndTranslateProcess::~TRestDetectorHitsRotateAndTranslateProcess() { - // TRestDetectorHitsRotateAndTranslateProcess destructor -} - -void TRestDetectorHitsRotateAndTranslateProcess::LoadDefaultConfig() { - SetTitle("Default config"); - - fDeltaX = 1.0; - fDeltaY = 1.0; - fDeltaZ = 1.0; - fAlpha = 0.; - fBeta = 0.; - fGamma = 0.; -} - -void TRestDetectorHitsRotateAndTranslateProcess::Initialize() { - SetSectionName(this->ClassName()); - SetLibraryVersion(LIBRARY_VERSION); - - fDeltaX = 1.0; - fDeltaY = 1.0; - fDeltaZ = 1.0; - fAlpha = 0.; - fBeta = 0.; - fGamma = 0.; - - fInputHitsEvent = nullptr; - fOutputHitsEvent = nullptr; -} - -void TRestDetectorHitsRotateAndTranslateProcess::LoadConfig(string configFilename) { - if (LoadConfigFromFile(configFilename)) LoadDefaultConfig(); - - PrintMetadata(); -} - -void TRestDetectorHitsRotateAndTranslateProcess::InitProcess() { - // Function to be executed once at the beginning of process - // (before starting the process of the events) - - // Start by calling the InitProcess function of the abstract class. - // Comment this if you don't want it. - // TRestEventProcess::InitProcess(); -} - -TRestEvent* TRestDetectorHitsRotateAndTranslateProcess::ProcessEvent(TRestEvent* inputEvent) { - fInputHitsEvent = (TRestDetectorHitsEvent*)inputEvent; - - fOutputHitsEvent = fInputHitsEvent; - // fInputHitsEvent->CloneTo(fOutputHitsEvent); - - TVector3 meanPosition = fOutputHitsEvent->GetMeanPosition(); - for (unsigned int hit = 0; hit < fOutputHitsEvent->GetNumberOfHits(); hit++) { - fOutputHitsEvent->GetHits()->RotateIn3D(hit, fAlpha, fBeta, fGamma, meanPosition); - fOutputHitsEvent->GetHits()->Translate(hit, fDeltaX, fDeltaY, fDeltaZ); - } - - if (fOutputHitsEvent->GetNumberOfHits() == 0) return nullptr; - - RESTDebug << "Number of hits rotated: " << fInputHitsEvent->GetNumberOfHits() << RESTendl; - return fOutputHitsEvent; -} - -void TRestDetectorHitsRotateAndTranslateProcess::EndProcess() { - // Function to be executed once at the end of the process - // (after all events have been processed) - - // Start by calling the EndProcess function of the abstract class. - // Comment this if you don't want it. - // TRestEventProcess::EndProcess(); -} - -void TRestDetectorHitsRotateAndTranslateProcess::InitFromConfigFile() { - fDeltaX = GetDblParameterWithUnits("deltaX"); - fDeltaY = GetDblParameterWithUnits("deltaY"); - fDeltaZ = GetDblParameterWithUnits("deltaZ"); - - fAlpha = StringToDouble(GetParameter("alpha")); // rotation angle around Z - fBeta = StringToDouble(GetParameter("beta")); // rotation angle around Y - fGamma = StringToDouble(GetParameter("gamma")); // rotation angle around X - - // Conversion to radians - fAlpha = fAlpha * TMath::Pi() / 180.; - fBeta = fBeta * TMath::Pi() / 180.; - fGamma = fGamma * TMath::Pi() / 180.; -} From d254d38c64a90b132e5e62a2eb43b9d0db2390a5 Mon Sep 17 00:00:00 2001 From: Javier Galan Date: Thu, 20 Jul 2023 20:02:28 +0200 Subject: [PATCH 20/32] Adding TRestDetectorHitmapTransformationProcess --- ...TRestDetectorHitmapTransformationProcess.h | 88 +++++ ...estDetectorHitmapTransformationProcess.cxx | 353 ++++++++++++++++++ 2 files changed, 441 insertions(+) create mode 100644 inc/TRestDetectorHitmapTransformationProcess.h create mode 100644 src/TRestDetectorHitmapTransformationProcess.cxx diff --git a/inc/TRestDetectorHitmapTransformationProcess.h b/inc/TRestDetectorHitmapTransformationProcess.h new file mode 100644 index 00000000..434f11c6 --- /dev/null +++ b/inc/TRestDetectorHitmapTransformationProcess.h @@ -0,0 +1,88 @@ +/************************************************************************* + * This file is part of the REST software framework. * + * * + * Copyright (C) 2016 GIFNA/TREX (University of Zaragoza) * + * For more information see http://gifna.unizar.es/trex * + * * + * REST is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * REST 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 General Public License for more details. * + * * + * You should have a copy of the GNU General Public License along with * + * REST in $REST_PATH/LICENSE. * + * If not, see http://www.gnu.org/licenses/. * + * For the list of contributors see $REST_PATH/CREDITS. * + *************************************************************************/ + +#ifndef RestCore_TRestDetectorHitmapTransformationProcess +#define RestCore_TRestDetectorHitmapTransformationProcess + +#include + +#include "TRestEventProcess.h" + +/// A structure to define a given hit transformation +struct HitTransformation { + /// The center of rotation or a point contained in the specular plane + TVector3 position = {0, 0, 0}; + + /// The translation vector, the axis of rotation or the specular plane normal + TVector3 vector = {0, 0, 1}; + + /// The angle of rotation + Double_t angle = 0; + + /// The type of transformation (specular/rotation/translation) + std::string type = ""; + + /// A given name that allows to place an order to the transformations + std::string name = ""; +}; + +//! An analysis process to apply rotation/translation/specular to mean hit positions +class TRestDetectorHitmapTransformationProcess : public TRestEventProcess { + private: + /// A pointer to the specific TRestDetectorHitsEvent input + TRestDetectorHitsEvent* fHitsEvent; //! + + void InitFromConfigFile() override; + + void Initialize() override; + + protected: + /// A list of transformations that can be applied to the mean positions + std::vector fTransDefinitions; + + /// An ordered list with the names of transformations that will be applied + std::vector fTransformations; + + /// It returns the transformation with a given name + HitTransformation GetTransformation(const std::string& name); + + TVector3 Specular(const TVector3& pos, const HitTransformation& tr); + TVector3 Rotation(const TVector3& pos, const HitTransformation& tr); + TVector3 Translation(const TVector3& pos, const HitTransformation& tr); + + public: + any GetInputEvent() const override { return fHitsEvent; } + any GetOutputEvent() const override { return fHitsEvent; } + + TRestEvent* ProcessEvent(TRestEvent* inputEvent) override; + + void PrintMetadata() override; + + const char* GetProcessName() const override { return "hitsTransformation"; } + + TRestDetectorHitmapTransformationProcess(); + TRestDetectorHitmapTransformationProcess(const char* configFilename); + ~TRestDetectorHitmapTransformationProcess(); + + ClassDefOverride(TRestDetectorHitmapTransformationProcess, 1); +}; +#endif diff --git a/src/TRestDetectorHitmapTransformationProcess.cxx b/src/TRestDetectorHitmapTransformationProcess.cxx new file mode 100644 index 00000000..3cf5b158 --- /dev/null +++ b/src/TRestDetectorHitmapTransformationProcess.cxx @@ -0,0 +1,353 @@ +/************************************************************************* + * This file is part of the REST software framework. * + * * + * Copyright (C) 2016 GIFNA/TREX (University of Zaragoza) * + * For more information see http://gifna.unizar.es/trex * + * * + * REST is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * REST 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 General Public License for more details. * + * * + * You should have a copy of the GNU General Public License along with * + * REST in $REST_PATH/LICENSE. * + * If not, see http://www.gnu.org/licenses/. * + * For the list of contributors see $REST_PATH/CREDITS. * + *************************************************************************/ + +////////////////////////////////////////////////////////////////////////// +/// +/// This process allows to transform the detector hits mean positions using +/// rotation, translation and specular transformations. +/// +/// This process will not modify the detector hits inside the event. It +/// will just create new observables with the resulting transformed mean +/// positions. +/// +/// The process allows to include different definitions: +/// - **specular**: It requires a `position` and a `vector` that emplace the plane +/// position and orientation used for the specular transformation. +/// - **rotation**: It requires a `position` that defines the rotation center, +/// a `vector` that defines the rotation axis, and an `angle` that defines the +/// rotation amount. +/// - **translation**: It only requires to define the `vector` field with the +/// translation to be applied. +/// +/// The different transformations can be defined inside the RML section as +/// illustrated in the following example: +/// +/// \code +/// +/// +/// +/// +/// +/// +/// +/// +/// \endcode +/// +/// The transformations to be applied, and the order in which those transformations will +/// be applied are defined inside the parameter `transformations` that contains a list +/// with the names from the transformation definitions. +/// +/// ### Observables added by this process +/// +/// * **xMean**: The mean X-position after the transformation +/// * **yMean**: The mean Y-position after the transformation +/// * **zMean**: The mean Z-position after the transformation +/// +///______________________________________________________________________________ +/// +/// RESTsoft - Software for Rare Event Searches with TPCs +/// +/// History of developments: +/// +/// 2023-July: First implementation +/// +/// \class TRestDetectorHitmapTransformationProcess +/// \author Javier Galan +/// +///______________________________________________________________________________ +/// +////////////////////////////////////////////////////////////////////////// + +#include "TRestDetectorHitmapTransformationProcess.h" + +using namespace std; + +ClassImp(TRestDetectorHitmapTransformationProcess); + +/////////////////////////////////////////////// +/// \brief Default constructor +/// +TRestDetectorHitmapTransformationProcess::TRestDetectorHitmapTransformationProcess() { Initialize(); } + +/////////////////////////////////////////////// +/// \brief Default destructor +/// +TRestDetectorHitmapTransformationProcess::~TRestDetectorHitmapTransformationProcess() {} + +/////////////////////////////////////////////// +/// \brief Constructor loading data from a config file +/// +/// If no configuration path is defined using TRestMetadata::SetConfigFilePath +/// the path to the config file must be specified using full path, absolute or +/// relative. +/// +/// The default behaviour is that the config file must be specified with +/// full path, absolute or relative. +/// +/// \param configFilename A const char* giving the path to an RML file. +/// +TRestDetectorHitmapTransformationProcess::TRestDetectorHitmapTransformationProcess( + const char* configFilename) { + Initialize(); + LoadConfigFromFile(configFilename); +} + +/////////////////////////////////////////////// +/// \brief Function to initialize input/output event members and define the section name +/// +void TRestDetectorHitmapTransformationProcess::Initialize() { + SetSectionName(this->ClassName()); + SetLibraryVersion(LIBRARY_VERSION); + + fHitsEvent = nullptr; +} + +/////////////////////////////////////////////// +/// \brief The main processing event function +/// +TRestEvent* TRestDetectorHitmapTransformationProcess::ProcessEvent(TRestEvent* inputEvent) { + fHitsEvent = (TRestDetectorHitsEvent*)inputEvent; + + TVector3 hitMean = fHitsEvent->GetMeanPosition(); + + TVector3 transformedMean = hitMean; + + for (const auto& t : fTransformations) { + HitTransformation tr; + tr = GetTransformation(t); + + if (tr.type == "specular") transformedMean = Specular(transformedMean, tr); + if (tr.type == "rotation") transformedMean = Rotation(transformedMean, tr); + if (tr.type == "translation") transformedMean = Translation(transformedMean, tr); + } + + SetObservableValue("xMean", transformedMean.X()); + SetObservableValue("yMean", transformedMean.Y()); + SetObservableValue("zMean", transformedMean.Z()); + + return fHitsEvent; +} + +/////////////////////////////////////////////// +/// \brief It performs a specular transformation of the given `pos` in the argument and the transformation +/// properties stored in the HitTransformation. +/// +TVector3 TRestDetectorHitmapTransformationProcess::Specular(const TVector3& pos, + const HitTransformation& tr) { + if (tr.type != "specular") return {0, 0, 0}; + + TVector3 V = pos - tr.position; + Double_t vByN = V.Dot(tr.vector); + TVector3 reflectionVector = V - 2 * vByN * tr.vector; + return tr.position + reflectionVector; +} + +/////////////////////////////////////////////// +/// \brief It performs a rotation of the given `pos` in the argument and the transformation properties +/// stored in the HitTransformation. +/// +TVector3 TRestDetectorHitmapTransformationProcess::Rotation(const TVector3& pos, + const HitTransformation& tr) { + if (tr.type != "rotation") return {0, 0, 0}; + + TVector3 position = pos - tr.position; + position.Rotate(tr.angle, tr.vector); + position += tr.position; + + return position; +} + +/////////////////////////////////////////////// +/// \brief It performs a translation of the given `pos` in the argument and the transformation properties +/// stored in the HitTransformation. +/// +TVector3 TRestDetectorHitmapTransformationProcess::Translation(const TVector3& pos, + const HitTransformation& tr) { + if (tr.type != "translation") return {0, 0, 0}; + + TVector3 position = pos + tr.vector; + return position; +} + +/////////////////////////////////////////////// +/// \brief It returns the transformation structure that matches the name in the argument +/// +HitTransformation TRestDetectorHitmapTransformationProcess::GetTransformation(const std::string& name) { + for (const auto& t : fTransDefinitions) { + if (t.name == name) return t; + } + + HitTransformation Tr; + return Tr; +} + +/////////////////////////////////////////////// +/// \brief A custom initalization from a config file +/// +void TRestDetectorHitmapTransformationProcess::InitFromConfigFile() { + TRestEventProcess::InitFromConfigFile(); + + auto specularDef = GetElement("specular"); + while (specularDef) { + HitTransformation trans; + trans.type = "specular"; + + string name = GetFieldValue("name", specularDef); + if (name == "Not defined") { + RESTError << "The `name` field was not found in specular definition!" << RESTendl; + exit(1); + } + trans.name = name; + + TVector3 position = Get3DVectorParameterWithUnits("position", specularDef); + if (position == TVector3(-1, -1, -1)) { + RESTError << "The `position` field was not found in specular definition!" << RESTendl; + exit(1); + } + trans.position = position; + + TVector3 vect = Get3DVectorParameterWithUnits("vector", specularDef); + if (vect == TVector3(-1, -1, -1)) { + RESTError << "The `vector` field was not found in specular definition!" << RESTendl; + exit(1); + } + trans.vector = vect; + + fTransDefinitions.push_back(trans); + specularDef = GetNextElement(specularDef); + } + + auto rotationDef = GetElement("rotation"); + while (rotationDef) { + HitTransformation trans; + trans.type = "rotation"; + + string name = GetFieldValue("name", rotationDef); + if (name == "Not defined") { + RESTError << "The `name` field was not found in rotation definition!" << RESTendl; + exit(1); + } + trans.name = name; + + TVector3 position = Get3DVectorParameterWithUnits("position", rotationDef); + if (position == TVector3(-1, -1, -1)) { + RESTError << "The `position` field was not found in rotation definition!" << RESTendl; + exit(1); + } + trans.position = position; + + TVector3 vect = Get3DVectorParameterWithUnits("vector", rotationDef); + if (vect == TVector3(-1, -1, -1)) { + RESTError << "The `vector` field was not found in rotation definition!" << RESTendl; + exit(1); + } + trans.vector = vect; + + Double_t angle = GetDblParameterWithUnits("angle", rotationDef); + if (angle == PARAMETER_NOT_FOUND_DBL) { + RESTError << "The `angle` field was not found in rotation definition!" << RESTendl; + exit(1); + } + trans.angle = angle; + + fTransDefinitions.push_back(trans); + rotationDef = GetNextElement(rotationDef); + } + + auto translationDef = GetElement("translation"); + while (translationDef) { + HitTransformation trans; + trans.type = "translation"; + + string name = GetFieldValue("name", translationDef); + if (name == "Not defined") { + RESTError << "The `name` field was not found in translation definition!" << RESTendl; + exit(1); + } + trans.name = name; + + TVector3 vect = Get3DVectorParameterWithUnits("vector", translationDef); + if (vect == TVector3(-1, -1, -1)) { + RESTError << "The `vector` field was not found in translation definition!" << RESTendl; + exit(1); + } + trans.vector = vect; + + fTransDefinitions.push_back(trans); + translationDef = GetNextElement(translationDef); + } +} + +/////////////////////////////////////////////// +/// \brief Prints out the metadata member values +/// +void TRestDetectorHitmapTransformationProcess::PrintMetadata() { + BeginPrintProcess(); + + if (!fTransDefinitions.empty()) { + RESTMetadata << " List of transformation definitions: " << RESTendl; + RESTMetadata << " ----------------------------------- " << RESTendl; + RESTMetadata << " " << RESTendl; + } else + RESTMetadata << " No transformations found! " << RESTendl; + + for (const auto& t : fTransDefinitions) { + if (t.type == "specular") { + RESTMetadata << " - Specular transformation: " << RESTendl; + RESTMetadata << " + Plane position : (" << t.position.X() << ", " << t.position.Y() << ", " + << t.position.Z() << ") mm" << RESTendl; + RESTMetadata << " + Plane normal : (" << t.vector.X() << ", " << t.vector.Y() << ", " + << t.vector.Z() << ")" << RESTendl; + RESTMetadata << " " << RESTendl; + } + + if (t.type == "rotation") { + RESTMetadata << " - Rotation transformation: " << RESTendl; + RESTMetadata << " + Rotation center : (" << t.position.X() << ", " << t.position.Y() << ", " + << t.position.Z() << ") mm" << RESTendl; + RESTMetadata << " + Rotation axis : (" << t.vector.X() << ", " << t.vector.Y() << ", " + << t.vector.Z() << ")" << RESTendl; + RESTMetadata << " + Rotation angle : " << t.angle * units("degrees") << " degrees" << RESTendl; + RESTMetadata << " " << RESTendl; + } + + if (t.type == "translation") { + RESTMetadata << " - Translation transformation: " << RESTendl; + RESTMetadata << " + Translation vector : (" << t.vector.X() << ", " << t.vector.Y() << ", " + << t.vector.Z() << ") mm" << RESTendl; + RESTMetadata << " " << RESTendl; + } + } + + RESTMetadata << " Order of transformations: " << RESTendl; + RESTMetadata << " ------------------------- " << RESTendl; + RESTMetadata << " " << RESTendl; + + int n = 0; + for (const auto& t : fTransformations) { + n++; + RESTMetadata << n << ". " << t << RESTendl; + } + + EndPrintProcess(); +} From 22bb9d00e3a322a9014b7c8cab4101130df74a7f Mon Sep 17 00:00:00 2001 From: Javier Galan Date: Thu, 20 Jul 2023 20:02:53 +0200 Subject: [PATCH 21/32] Adding hitmap transformation example --- pipeline/analysis/transform.C | 26 ++++++++++++++++++++++++++ pipeline/analysis/transform.rml | 10 ++++++++++ 2 files changed, 36 insertions(+) create mode 100644 pipeline/analysis/transform.C create mode 100644 pipeline/analysis/transform.rml diff --git a/pipeline/analysis/transform.C b/pipeline/analysis/transform.C new file mode 100644 index 00000000..363d3507 --- /dev/null +++ b/pipeline/analysis/transform.C @@ -0,0 +1,26 @@ + +Int_t transform(Bool_t draw = false) { + TRestDetectorHitsEvent* ev = new TRestDetectorHitsEvent(); + + Double_t xCenter = 5; + Double_t yCenter = 10; + + TRandom3* random = new TRandom3(137); + for (int n = 0; n < 10000; n++) { + Double_t x = random->Gaus(xCenter, 3); + Double_t y = random->Gaus(yCenter, 3); + + ev->AddHit(x, y, 0, 1); + } + + // Initializing processes + string cfgFile1 = "transform.rml"; + TRestDetectorHitsTransformationProcess* t = + new TRestDetectorHitsTransformationProcess((char*)cfgFile1.c_str()); + t->PrintMetadata(); + + TRestDetectorHitsEvent* tEv = (TRestDetectorHitsEvent*)t->ProcessEvent(ev); + + cout << "[\033[92m OK \x1b[0m]" << endl; + return 0; +} diff --git a/pipeline/analysis/transform.rml b/pipeline/analysis/transform.rml new file mode 100644 index 00000000..7b1ba202 --- /dev/null +++ b/pipeline/analysis/transform.rml @@ -0,0 +1,10 @@ + + + + + + + + + + From ae8773174fabd7afe11e966cab385d7a1574e854 Mon Sep 17 00:00:00 2001 From: Javier Galan Date: Thu, 20 Jul 2023 20:08:46 +0200 Subject: [PATCH 22/32] Renaming to TRestDetectorHitmapAnalysisProcess --- ...h => TRestDetectorHitmapAnalysisProcess.h} | 14 ++++---- pipeline/analysis/{transform.C => hitmap.C} | 2 +- .../analysis/{transform.rml => hitmap.rml} | 0 ...=> TRestDetectorHitmapAnalysisProcess.cxx} | 36 +++++++++---------- 4 files changed, 24 insertions(+), 28 deletions(-) rename inc/{TRestDetectorHitmapTransformationProcess.h => TRestDetectorHitmapAnalysisProcess.h} (88%) rename pipeline/analysis/{transform.C => hitmap.C} (94%) rename pipeline/analysis/{transform.rml => hitmap.rml} (100%) rename src/{TRestDetectorHitmapTransformationProcess.cxx => TRestDetectorHitmapAnalysisProcess.cxx} (89%) diff --git a/inc/TRestDetectorHitmapTransformationProcess.h b/inc/TRestDetectorHitmapAnalysisProcess.h similarity index 88% rename from inc/TRestDetectorHitmapTransformationProcess.h rename to inc/TRestDetectorHitmapAnalysisProcess.h index 434f11c6..8912088c 100644 --- a/inc/TRestDetectorHitmapTransformationProcess.h +++ b/inc/TRestDetectorHitmapAnalysisProcess.h @@ -20,8 +20,8 @@ * For the list of contributors see $REST_PATH/CREDITS. * *************************************************************************/ -#ifndef RestCore_TRestDetectorHitmapTransformationProcess -#define RestCore_TRestDetectorHitmapTransformationProcess +#ifndef RestCore_TRestDetectorHitmapAnalysisProcess +#define RestCore_TRestDetectorHitmapAnalysisProcess #include @@ -46,7 +46,7 @@ struct HitTransformation { }; //! An analysis process to apply rotation/translation/specular to mean hit positions -class TRestDetectorHitmapTransformationProcess : public TRestEventProcess { +class TRestDetectorHitmapAnalysisProcess : public TRestEventProcess { private: /// A pointer to the specific TRestDetectorHitsEvent input TRestDetectorHitsEvent* fHitsEvent; //! @@ -79,10 +79,10 @@ class TRestDetectorHitmapTransformationProcess : public TRestEventProcess { const char* GetProcessName() const override { return "hitsTransformation"; } - TRestDetectorHitmapTransformationProcess(); - TRestDetectorHitmapTransformationProcess(const char* configFilename); - ~TRestDetectorHitmapTransformationProcess(); + TRestDetectorHitmapAnalysisProcess(); + TRestDetectorHitmapAnalysisProcess(const char* configFilename); + ~TRestDetectorHitmapAnalysisProcess(); - ClassDefOverride(TRestDetectorHitmapTransformationProcess, 1); + ClassDefOverride(TRestDetectorHitmapAnalysisProcess, 1); }; #endif diff --git a/pipeline/analysis/transform.C b/pipeline/analysis/hitmap.C similarity index 94% rename from pipeline/analysis/transform.C rename to pipeline/analysis/hitmap.C index 363d3507..e75c8a1b 100644 --- a/pipeline/analysis/transform.C +++ b/pipeline/analysis/hitmap.C @@ -1,5 +1,5 @@ -Int_t transform(Bool_t draw = false) { +Int_t hitmap(Bool_t draw = false) { TRestDetectorHitsEvent* ev = new TRestDetectorHitsEvent(); Double_t xCenter = 5; diff --git a/pipeline/analysis/transform.rml b/pipeline/analysis/hitmap.rml similarity index 100% rename from pipeline/analysis/transform.rml rename to pipeline/analysis/hitmap.rml diff --git a/src/TRestDetectorHitmapTransformationProcess.cxx b/src/TRestDetectorHitmapAnalysisProcess.cxx similarity index 89% rename from src/TRestDetectorHitmapTransformationProcess.cxx rename to src/TRestDetectorHitmapAnalysisProcess.cxx index 3cf5b158..3a7b4f18 100644 --- a/src/TRestDetectorHitmapTransformationProcess.cxx +++ b/src/TRestDetectorHitmapAnalysisProcess.cxx @@ -42,7 +42,7 @@ /// illustrated in the following example: /// /// \code -/// /// /// @@ -50,7 +50,7 @@ /// /// /// -/// +/// /// \endcode /// /// The transformations to be applied, and the order in which those transformations will @@ -71,28 +71,28 @@ /// /// 2023-July: First implementation /// -/// \class TRestDetectorHitmapTransformationProcess +/// \class TRestDetectorHitmapAnalysisProcess /// \author Javier Galan /// ///______________________________________________________________________________ /// ////////////////////////////////////////////////////////////////////////// -#include "TRestDetectorHitmapTransformationProcess.h" +#include "TRestDetectorHitmapAnalysisProcess.h" using namespace std; -ClassImp(TRestDetectorHitmapTransformationProcess); +ClassImp(TRestDetectorHitmapAnalysisProcess); /////////////////////////////////////////////// /// \brief Default constructor /// -TRestDetectorHitmapTransformationProcess::TRestDetectorHitmapTransformationProcess() { Initialize(); } +TRestDetectorHitmapAnalysisProcess::TRestDetectorHitmapAnalysisProcess() { Initialize(); } /////////////////////////////////////////////// /// \brief Default destructor /// -TRestDetectorHitmapTransformationProcess::~TRestDetectorHitmapTransformationProcess() {} +TRestDetectorHitmapAnalysisProcess::~TRestDetectorHitmapAnalysisProcess() {} /////////////////////////////////////////////// /// \brief Constructor loading data from a config file @@ -106,8 +106,7 @@ TRestDetectorHitmapTransformationProcess::~TRestDetectorHitmapTransformationProc /// /// \param configFilename A const char* giving the path to an RML file. /// -TRestDetectorHitmapTransformationProcess::TRestDetectorHitmapTransformationProcess( - const char* configFilename) { +TRestDetectorHitmapAnalysisProcess::TRestDetectorHitmapAnalysisProcess(const char* configFilename) { Initialize(); LoadConfigFromFile(configFilename); } @@ -115,7 +114,7 @@ TRestDetectorHitmapTransformationProcess::TRestDetectorHitmapTransformationProce /////////////////////////////////////////////// /// \brief Function to initialize input/output event members and define the section name /// -void TRestDetectorHitmapTransformationProcess::Initialize() { +void TRestDetectorHitmapAnalysisProcess::Initialize() { SetSectionName(this->ClassName()); SetLibraryVersion(LIBRARY_VERSION); @@ -125,7 +124,7 @@ void TRestDetectorHitmapTransformationProcess::Initialize() { /////////////////////////////////////////////// /// \brief The main processing event function /// -TRestEvent* TRestDetectorHitmapTransformationProcess::ProcessEvent(TRestEvent* inputEvent) { +TRestEvent* TRestDetectorHitmapAnalysisProcess::ProcessEvent(TRestEvent* inputEvent) { fHitsEvent = (TRestDetectorHitsEvent*)inputEvent; TVector3 hitMean = fHitsEvent->GetMeanPosition(); @@ -152,8 +151,7 @@ TRestEvent* TRestDetectorHitmapTransformationProcess::ProcessEvent(TRestEvent* i /// \brief It performs a specular transformation of the given `pos` in the argument and the transformation /// properties stored in the HitTransformation. /// -TVector3 TRestDetectorHitmapTransformationProcess::Specular(const TVector3& pos, - const HitTransformation& tr) { +TVector3 TRestDetectorHitmapAnalysisProcess::Specular(const TVector3& pos, const HitTransformation& tr) { if (tr.type != "specular") return {0, 0, 0}; TVector3 V = pos - tr.position; @@ -166,8 +164,7 @@ TVector3 TRestDetectorHitmapTransformationProcess::Specular(const TVector3& pos, /// \brief It performs a rotation of the given `pos` in the argument and the transformation properties /// stored in the HitTransformation. /// -TVector3 TRestDetectorHitmapTransformationProcess::Rotation(const TVector3& pos, - const HitTransformation& tr) { +TVector3 TRestDetectorHitmapAnalysisProcess::Rotation(const TVector3& pos, const HitTransformation& tr) { if (tr.type != "rotation") return {0, 0, 0}; TVector3 position = pos - tr.position; @@ -181,8 +178,7 @@ TVector3 TRestDetectorHitmapTransformationProcess::Rotation(const TVector3& pos, /// \brief It performs a translation of the given `pos` in the argument and the transformation properties /// stored in the HitTransformation. /// -TVector3 TRestDetectorHitmapTransformationProcess::Translation(const TVector3& pos, - const HitTransformation& tr) { +TVector3 TRestDetectorHitmapAnalysisProcess::Translation(const TVector3& pos, const HitTransformation& tr) { if (tr.type != "translation") return {0, 0, 0}; TVector3 position = pos + tr.vector; @@ -192,7 +188,7 @@ TVector3 TRestDetectorHitmapTransformationProcess::Translation(const TVector3& p /////////////////////////////////////////////// /// \brief It returns the transformation structure that matches the name in the argument /// -HitTransformation TRestDetectorHitmapTransformationProcess::GetTransformation(const std::string& name) { +HitTransformation TRestDetectorHitmapAnalysisProcess::GetTransformation(const std::string& name) { for (const auto& t : fTransDefinitions) { if (t.name == name) return t; } @@ -204,7 +200,7 @@ HitTransformation TRestDetectorHitmapTransformationProcess::GetTransformation(co /////////////////////////////////////////////// /// \brief A custom initalization from a config file /// -void TRestDetectorHitmapTransformationProcess::InitFromConfigFile() { +void TRestDetectorHitmapAnalysisProcess::InitFromConfigFile() { TRestEventProcess::InitFromConfigFile(); auto specularDef = GetElement("specular"); @@ -301,7 +297,7 @@ void TRestDetectorHitmapTransformationProcess::InitFromConfigFile() { /////////////////////////////////////////////// /// \brief Prints out the metadata member values /// -void TRestDetectorHitmapTransformationProcess::PrintMetadata() { +void TRestDetectorHitmapAnalysisProcess::PrintMetadata() { BeginPrintProcess(); if (!fTransDefinitions.empty()) { From aca947dac8fe0a2e42326e8d49f3c26f91a1776e Mon Sep 17 00:00:00 2001 From: "@cmargalejo" Date: Mon, 24 Jul 2023 12:34:55 +0200 Subject: [PATCH 23/32] Adding image tramsformedHitmap.png to the documentation --- images/transformedHitmap.png | Bin 0 -> 41036 bytes src/TRestDetectorHitmapAnalysisProcess.cxx | 3 +++ 2 files changed, 3 insertions(+) create mode 100644 images/transformedHitmap.png diff --git a/images/transformedHitmap.png b/images/transformedHitmap.png new file mode 100644 index 0000000000000000000000000000000000000000..1f18695b1b86fc5a670a85bce7b93d42fe877da5 GIT binary patch literal 41036 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 literal 0 HcmV?d00001 diff --git a/src/TRestDetectorHitmapAnalysisProcess.cxx b/src/TRestDetectorHitmapAnalysisProcess.cxx index 3a7b4f18..0497620b 100644 --- a/src/TRestDetectorHitmapAnalysisProcess.cxx +++ b/src/TRestDetectorHitmapAnalysisProcess.cxx @@ -53,6 +53,9 @@ /// /// \endcode /// +/// \htmlonly \endhtmlonly +/// ![The effect of different transfromation processes](transformedHitmap.png) +/// /// The transformations to be applied, and the order in which those transformations will /// be applied are defined inside the parameter `transformations` that contains a list /// with the names from the transformation definitions. From 6e91af4a101c8aed0b8bae9e01525d9ebd194aca Mon Sep 17 00:00:00 2001 From: "@cmargalejo" Date: Wed, 26 Jul 2023 12:30:34 +0200 Subject: [PATCH 24/32] TRestDetectorHitsRotationProcess documentation update --- src/TRestDetectorHitsRotationProcess.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/TRestDetectorHitsRotationProcess.cxx b/src/TRestDetectorHitsRotationProcess.cxx index 066fa999..61433b02 100644 --- a/src/TRestDetectorHitsRotationProcess.cxx +++ b/src/TRestDetectorHitsRotationProcess.cxx @@ -29,7 +29,7 @@ /// /// -/// +/// /// /// /// \endcode From 75bb04bb9af86235e2c84304e22044dc581406f7 Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Tue, 29 Aug 2023 10:47:11 +0200 Subject: [PATCH 25/32] Remove TRestDetectorHitsRotateAndTranslateProcess --- ...estDetectorHitsRotateAndTranslateProcess.h | 79 ----------- ...tDetectorHitsRotateAndTranslateProcess.cxx | 129 ------------------ 2 files changed, 208 deletions(-) delete mode 100644 inc/TRestDetectorHitsRotateAndTranslateProcess.h delete mode 100644 src/TRestDetectorHitsRotateAndTranslateProcess.cxx diff --git a/inc/TRestDetectorHitsRotateAndTranslateProcess.h b/inc/TRestDetectorHitsRotateAndTranslateProcess.h deleted file mode 100644 index cc156110..00000000 --- a/inc/TRestDetectorHitsRotateAndTranslateProcess.h +++ /dev/null @@ -1,79 +0,0 @@ -///______________________________________________________________________________ -///______________________________________________________________________________ -///______________________________________________________________________________ -/// -/// -/// RESTSoft : Software for Rare Event Searches with TPCs -/// -/// TRestDetectorHitsRotateAndTranslateProcess.h -/// -/// march 2016: First concept -/// Created as part of the conceptualization of existing REST -/// software. -/// Javier G. Garza -///_______________________________________________________________________________ - -#ifndef RestCore_TRestDetectorHitsRotateAndTranslateProcess -#define RestCore_TRestDetectorHitsRotateAndTranslateProcess - -#include - -#include "TRestDetectorGas.h" -#include "TRestDetectorHitsEvent.h" - -class TRestDetectorHitsRotateAndTranslateProcess : public TRestEventProcess { - private: - TRestDetectorHitsEvent* fInputHitsEvent; //! - TRestDetectorHitsEvent* fOutputHitsEvent; //! - - TVector3 fTranslationVector = {0, 0, 0}; ///< translation vector (x,y,z) - TVector3 fRotationVector = {0, 0, 0}; ///< rotation vector around axis (x,y,z) in radians - TVector3 fRotationCenter = {0, 0, 0}; ///< rotation center (x,y,z) - - void InitFromConfigFile() override; - void Initialize() override; - void LoadDefaultConfig(); - - protected: - // add here the members of your event process - - public: - any GetInputEvent() const override { return fInputHitsEvent; } - any GetOutputEvent() const override { return fOutputHitsEvent; } - - void InitProcess() override; - TRestEvent* ProcessEvent(TRestEvent* inputEvent) override; - void EndProcess() override; - - void LoadConfig(const std::string& configFilename); - - void PrintMetadata() override { - BeginPrintProcess(); - - RESTMetadata << "Translation vector (mm): (" << fTranslationVector.X() << ", " - << fTranslationVector.Y() << ", " << fTranslationVector.Z() << ")" << RESTendl; - TVector3 rotationVectorDegrees = fRotationVector * (180. / TMath::Pi()); - RESTMetadata << "Rotation vector (degrees): (" << rotationVectorDegrees.X() << ", " - << rotationVectorDegrees.Y() << ", " << rotationVectorDegrees.Z() << ")" << RESTendl; - - EndPrintProcess(); - } - - const char* GetProcessName() const override { return "rotateAndTranslate"; } - - inline Double_t GetTranslationX() const { return fTranslationVector.X(); } - inline Double_t GetTranslationY() const { return fTranslationVector.Y(); } - inline Double_t GetTranslationZ() const { return fTranslationVector.Z(); } - - inline Double_t GetRotationX() const { return fRotationVector.X(); } - inline Double_t GetRotationY() const { return fRotationVector.Y(); } - inline Double_t GetRotationZ() const { return fRotationVector.Z(); } - - TRestDetectorHitsRotateAndTranslateProcess(); - explicit TRestDetectorHitsRotateAndTranslateProcess(const char* configFilename); - ~TRestDetectorHitsRotateAndTranslateProcess(); - - ClassDefOverride(TRestDetectorHitsRotateAndTranslateProcess, 2); -}; - -#endif diff --git a/src/TRestDetectorHitsRotateAndTranslateProcess.cxx b/src/TRestDetectorHitsRotateAndTranslateProcess.cxx deleted file mode 100644 index 6509c46a..00000000 --- a/src/TRestDetectorHitsRotateAndTranslateProcess.cxx +++ /dev/null @@ -1,129 +0,0 @@ -///______________________________________________________________________________ -///______________________________________________________________________________ -///______________________________________________________________________________ -/// -/// -/// RESTSoft : Software for Rare Event Searches with TPCs -/// -/// TRestDetectorHitsRotateAndTranslateProcess.cxx -/// -/// Template to use to design "event process" classes inherited from -/// TRestDetectorHitsRotateAndTranslateProcess -/// How to use: replace TRestDetectorHitsRotateAndTranslateProcess by your -/// name, fill the required functions following instructions and add -/// all needed additional members and funcionality -/// -/// march 2016: First concept -/// Created as part of the conceptualization of existing REST -/// software. -/// Javier G. Garza -///_______________________________________________________________________________ - -////////////////////////////////////////////////////////////////////////// -/// -/// This process rotates and translates hits in a TRestDetectorHitsEvent. -/// Hits of type "VETO" are not affected by this process (we typically only want to rotate TPC hits). -/// -/// Usage: -/// -/// -/// -/// -/// -/// -/// - -#include "TRestDetectorHitsRotateAndTranslateProcess.h" - -using namespace std; - -ClassImp(TRestDetectorHitsRotateAndTranslateProcess); - -TRestDetectorHitsRotateAndTranslateProcess::TRestDetectorHitsRotateAndTranslateProcess() { Initialize(); } - -TRestDetectorHitsRotateAndTranslateProcess::TRestDetectorHitsRotateAndTranslateProcess( - const char* configFilename) { - Initialize(); - - if (LoadConfigFromFile(configFilename)) { - LoadDefaultConfig(); - } - - PrintMetadata(); -} - -TRestDetectorHitsRotateAndTranslateProcess::~TRestDetectorHitsRotateAndTranslateProcess() = default; - -void TRestDetectorHitsRotateAndTranslateProcess::LoadDefaultConfig() { SetTitle("Default config"); } - -void TRestDetectorHitsRotateAndTranslateProcess::Initialize() { - SetSectionName(this->ClassName()); - SetLibraryVersion(LIBRARY_VERSION); - - fInputHitsEvent = nullptr; - fOutputHitsEvent = nullptr; - - // Get volume name from parameter -} - -void TRestDetectorHitsRotateAndTranslateProcess::LoadConfig(const string& configFilename) { - if (LoadConfigFromFile(configFilename)) { - LoadDefaultConfig(); - } - - PrintMetadata(); -} - -void TRestDetectorHitsRotateAndTranslateProcess::InitProcess() {} - -TRestEvent* TRestDetectorHitsRotateAndTranslateProcess::ProcessEvent(TRestEvent* inputEvent) { - fInputHitsEvent = (TRestDetectorHitsEvent*)inputEvent; - fOutputHitsEvent = fInputHitsEvent; - - if (fOutputHitsEvent->GetNumberOfHits() == 0) { - return nullptr; - } - - for (unsigned int hit = 0; hit < fOutputHitsEvent->GetNumberOfHits(); hit++) { - const auto& type = fOutputHitsEvent->GetHits()->GetType(hit); - if (type == VETO) { - // Do not rotate VETO hits (we typically only rotate TPC hits) - continue; - } - fOutputHitsEvent->GetHits()->RotateIn3D(hit, fRotationVector.X(), fRotationVector.Y(), - fRotationVector.Z(), fRotationCenter); - fOutputHitsEvent->GetHits()->Translate(hit, fTranslationVector.X(), fTranslationVector.Y(), - fTranslationVector.Z()); - } - - return fOutputHitsEvent; -} - -void TRestDetectorHitsRotateAndTranslateProcess::EndProcess() {} - -void TRestDetectorHitsRotateAndTranslateProcess::InitFromConfigFile() { - fRotationCenter = Get3DVectorParameterWithUnits("rotationCenter", fRotationCenter); - fTranslationVector = Get3DVectorParameterWithUnits("translation", fTranslationVector); - - // rotation units should be specified in the rml (e.g. "90deg") - double rotationX = GetDblParameterWithUnits("rotationX", fRotationVector.X()); - double rotationY = GetDblParameterWithUnits("rotationY", fRotationVector.Y()); - double rotationZ = GetDblParameterWithUnits("rotationZ", fRotationVector.Z()); - fRotationVector = {rotationX, rotationY, rotationZ}; - - // legacy (maybe deprecated soon) - if (fTranslationVector.Mag2() == 0.0) { - fTranslationVector = { - GetDblParameterWithUnits("deltaX", 0.0), // - GetDblParameterWithUnits("deltaY", 0.0), // - GetDblParameterWithUnits("deltaZ", 0.0), // - }; - } - if (fRotationVector.Mag2() == 0.0) { - fRotationVector = { - GetDblParameterWithUnits("alpha", 0.0), // - GetDblParameterWithUnits("beta", 0.0), // - GetDblParameterWithUnits("gamma", 0.0), // - }; - } -} From c9e72d3fc01dc66c271de9cb0f57814fa2124207 Mon Sep 17 00:00:00 2001 From: Javier Galan Date: Tue, 29 Aug 2023 11:14:02 +0200 Subject: [PATCH 26/32] TRestDetectorHitmap fixing typos --- pipeline/analysis/hitmap.C | 3 +-- pipeline/analysis/hitmap.rml | 4 ++-- src/TRestDetectorHitmapAnalysisProcess.cxx | 6 ++++++ 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/pipeline/analysis/hitmap.C b/pipeline/analysis/hitmap.C index e75c8a1b..ddb56d90 100644 --- a/pipeline/analysis/hitmap.C +++ b/pipeline/analysis/hitmap.C @@ -15,8 +15,7 @@ Int_t hitmap(Bool_t draw = false) { // Initializing processes string cfgFile1 = "transform.rml"; - TRestDetectorHitsTransformationProcess* t = - new TRestDetectorHitsTransformationProcess((char*)cfgFile1.c_str()); + TRestDetectorHitmapAnalysisProcess* t = new TRestDetectorHitmapAnalysisProcess((char*)cfgFile1.c_str()); t->PrintMetadata(); TRestDetectorHitsEvent* tEv = (TRestDetectorHitsEvent*)t->ProcessEvent(ev); diff --git a/pipeline/analysis/hitmap.rml b/pipeline/analysis/hitmap.rml index 7b1ba202..09c84a39 100644 --- a/pipeline/analysis/hitmap.rml +++ b/pipeline/analysis/hitmap.rml @@ -1,10 +1,10 @@ - + - + diff --git a/src/TRestDetectorHitmapAnalysisProcess.cxx b/src/TRestDetectorHitmapAnalysisProcess.cxx index 0497620b..30948ff8 100644 --- a/src/TRestDetectorHitmapAnalysisProcess.cxx +++ b/src/TRestDetectorHitmapAnalysisProcess.cxx @@ -44,12 +44,18 @@ /// \code /// +/// /// /// /// /// /// /// +/// +/// +/// +/// +/// /// /// \endcode /// From c09e42fde6d6bcb69dacc4e26168fa6c4ecf162a Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Tue, 29 Aug 2023 11:15:25 +0200 Subject: [PATCH 27/32] Update name --- inc/TRestDetectorHitsRotationProcess.h | 2 +- inc/TRestDetectorHitsSpecularProcess.h | 2 +- inc/TRestDetectorHitsTranslationProcess.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/inc/TRestDetectorHitsRotationProcess.h b/inc/TRestDetectorHitsRotationProcess.h index 9d2195d5..efa38dc1 100644 --- a/inc/TRestDetectorHitsRotationProcess.h +++ b/inc/TRestDetectorHitsRotationProcess.h @@ -56,7 +56,7 @@ class TRestDetectorHitsRotationProcess : public TRestEventProcess { void PrintMetadata() override; - const char* GetProcessName() const override { return "rotationProcess"; } + const char* GetProcessName() const override { return "hitsRotation"; } inline Double_t GetAngle() const { return fAngle; } inline TVector3 GetAxis() const { return fAxis; } diff --git a/inc/TRestDetectorHitsSpecularProcess.h b/inc/TRestDetectorHitsSpecularProcess.h index 3964b00d..dcbb3270 100644 --- a/inc/TRestDetectorHitsSpecularProcess.h +++ b/inc/TRestDetectorHitsSpecularProcess.h @@ -54,7 +54,7 @@ class TRestDetectorHitsSpecularProcess : public TRestEventProcess { void PrintMetadata() override; /// It returns the given process name - const char* GetProcessName() const override { return "specularProcess"; } + const char* GetProcessName() const override { return "hitsSpecular"; } /// It returns the plane normal inline TVector3 GetNormal() const { return fNormal; } diff --git a/inc/TRestDetectorHitsTranslationProcess.h b/inc/TRestDetectorHitsTranslationProcess.h index d3c89776..21a465f2 100644 --- a/inc/TRestDetectorHitsTranslationProcess.h +++ b/inc/TRestDetectorHitsTranslationProcess.h @@ -50,7 +50,7 @@ class TRestDetectorHitsTranslationProcess : public TRestEventProcess { void PrintMetadata() override; - const char* GetProcessName() const override { return "translationProcess"; } + const char* GetProcessName() const override { return "hitsTranslation"; } inline TVector3 GetTranslation() const { return fTranslation; } From 23007c6865144e087248eaebd8db6d5b3d3ed442 Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Tue, 29 Aug 2023 11:15:37 +0200 Subject: [PATCH 28/32] simplified expression --- src/TRestDetectorHitsRotationProcess.cxx | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/TRestDetectorHitsRotationProcess.cxx b/src/TRestDetectorHitsRotationProcess.cxx index 61433b02..b4da3857 100644 --- a/src/TRestDetectorHitsRotationProcess.cxx +++ b/src/TRestDetectorHitsRotationProcess.cxx @@ -67,8 +67,6 @@ using namespace std; -#include - ClassImp(TRestDetectorHitsRotationProcess); TRestDetectorHitsRotationProcess::TRestDetectorHitsRotationProcess() { Initialize(); } @@ -104,7 +102,7 @@ TRestEvent* TRestDetectorHitsRotationProcess::ProcessEvent(TRestEvent* inputEven fInputEvent = (TRestDetectorHitsEvent*)inputEvent; fOutputEvent->SetEventInfo(fInputEvent); - Bool_t xyzEvent = fInputEvent->GetXYZHits()->GetNumberOfHits() == 0 ? false : true; + Bool_t xyzEvent = fInputEvent->GetXYZHits()->GetNumberOfHits() != 0; for (unsigned int hit = 0; hit < fInputEvent->GetNumberOfHits(); hit++) { TVector3 position(fInputEvent->GetX(hit), fInputEvent->GetY(hit), fInputEvent->GetZ(hit)); @@ -125,9 +123,9 @@ TRestEvent* TRestDetectorHitsRotationProcess::ProcessEvent(TRestEvent* inputEven void TRestDetectorHitsRotationProcess::InitFromConfigFile() { TRestEventProcess::InitFromConfigFile(); - fAxis = Get3DVectorParameterWithUnits("axis", {0, 0, 1}); + fAxis = Get3DVectorParameterWithUnits("axis", fAxis); fAxis.Unit(); - fCenter = Get3DVectorParameterWithUnits("center", {0, 0, 1}); + fCenter = Get3DVectorParameterWithUnits("center", fCenter); } void TRestDetectorHitsRotationProcess::PrintMetadata() { From 8d1e89df544a921324ddec935f07ce6b1c575ae3 Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Tue, 29 Aug 2023 11:20:35 +0200 Subject: [PATCH 29/32] exclude veto hits --- src/TRestDetectorHitsRotationProcess.cxx | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/TRestDetectorHitsRotationProcess.cxx b/src/TRestDetectorHitsRotationProcess.cxx index b4da3857..9173e31c 100644 --- a/src/TRestDetectorHitsRotationProcess.cxx +++ b/src/TRestDetectorHitsRotationProcess.cxx @@ -104,7 +104,16 @@ TRestEvent* TRestDetectorHitsRotationProcess::ProcessEvent(TRestEvent* inputEven Bool_t xyzEvent = fInputEvent->GetXYZHits()->GetNumberOfHits() != 0; for (unsigned int hit = 0; hit < fInputEvent->GetNumberOfHits(); hit++) { - TVector3 position(fInputEvent->GetX(hit), fInputEvent->GetY(hit), fInputEvent->GetZ(hit)); + TVector3 position = {fInputEvent->GetX(hit), fInputEvent->GetY(hit), fInputEvent->GetZ(hit)}; + const auto type = fInputEvent->GetType(hit); + const auto energy = fInputEvent->GetEnergy(hit); + const auto time = fInputEvent->GetTime(hit); + + if (type == VETO) { + // Only TPC hits will be rotated + fOutputEvent->AddHit(position.X(), position.Y(), position.Z(), energy, time, type); + continue; + } if (xyzEvent) { position -= fCenter; @@ -114,9 +123,9 @@ TRestEvent* TRestDetectorHitsRotationProcess::ProcessEvent(TRestEvent* inputEven this->SetError("TRestDetectorHitsRotationProcess. Only XYZ hits can be transformed"); } - fOutputEvent->AddHit(position.X(), position.Y(), position.Z(), fInputEvent->GetEnergy(hit), - fInputEvent->GetTime(hit), fInputEvent->GetType(hit)); + fOutputEvent->AddHit(position.X(), position.Y(), position.Z(), energy, time, type); } + return fOutputEvent; } From f2f00dff65031db5ef900c0cc782c2eaa82b8e0a Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Tue, 29 Aug 2023 11:24:28 +0200 Subject: [PATCH 30/32] simplify expression --- src/TRestDetectorHitsRotationProcess.cxx | 2 +- src/TRestDetectorHitsSpecularProcess.cxx | 4 +--- src/TRestDetectorHitsTranslationProcess.cxx | 4 +--- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/TRestDetectorHitsRotationProcess.cxx b/src/TRestDetectorHitsRotationProcess.cxx index 9173e31c..f8744292 100644 --- a/src/TRestDetectorHitsRotationProcess.cxx +++ b/src/TRestDetectorHitsRotationProcess.cxx @@ -102,7 +102,7 @@ TRestEvent* TRestDetectorHitsRotationProcess::ProcessEvent(TRestEvent* inputEven fInputEvent = (TRestDetectorHitsEvent*)inputEvent; fOutputEvent->SetEventInfo(fInputEvent); - Bool_t xyzEvent = fInputEvent->GetXYZHits()->GetNumberOfHits() != 0; + const Bool_t xyzEvent = fInputEvent->GetXYZHits()->GetNumberOfHits() != 0; for (unsigned int hit = 0; hit < fInputEvent->GetNumberOfHits(); hit++) { TVector3 position = {fInputEvent->GetX(hit), fInputEvent->GetY(hit), fInputEvent->GetZ(hit)}; const auto type = fInputEvent->GetType(hit); diff --git a/src/TRestDetectorHitsSpecularProcess.cxx b/src/TRestDetectorHitsSpecularProcess.cxx index ad6cb8a1..40e9f0a4 100644 --- a/src/TRestDetectorHitsSpecularProcess.cxx +++ b/src/TRestDetectorHitsSpecularProcess.cxx @@ -68,8 +68,6 @@ using namespace std; -#include - ClassImp(TRestDetectorHitsSpecularProcess); TRestDetectorHitsSpecularProcess::TRestDetectorHitsSpecularProcess() { Initialize(); } @@ -105,7 +103,7 @@ TRestEvent* TRestDetectorHitsSpecularProcess::ProcessEvent(TRestEvent* inputEven fInputEvent = (TRestDetectorHitsEvent*)inputEvent; fOutputEvent->SetEventInfo(fInputEvent); - Bool_t xyzEvent = fInputEvent->GetXYZHits()->GetNumberOfHits() == 0 ? false : true; + const Bool_t xyzEvent = fInputEvent->GetXYZHits()->GetNumberOfHits() != 0; for (unsigned int hit = 0; hit < fInputEvent->GetNumberOfHits(); hit++) { TVector3 position(fInputEvent->GetX(hit), fInputEvent->GetY(hit), fInputEvent->GetZ(hit)); diff --git a/src/TRestDetectorHitsTranslationProcess.cxx b/src/TRestDetectorHitsTranslationProcess.cxx index 2db0faea..eea59acd 100644 --- a/src/TRestDetectorHitsTranslationProcess.cxx +++ b/src/TRestDetectorHitsTranslationProcess.cxx @@ -60,8 +60,6 @@ using namespace std; -#include - ClassImp(TRestDetectorHitsTranslationProcess); TRestDetectorHitsTranslationProcess::TRestDetectorHitsTranslationProcess() { Initialize(); } @@ -97,7 +95,7 @@ TRestEvent* TRestDetectorHitsTranslationProcess::ProcessEvent(TRestEvent* inputE fInputEvent = (TRestDetectorHitsEvent*)inputEvent; fOutputEvent->SetEventInfo(fInputEvent); - Bool_t xyzEvent = fInputEvent->GetXYZHits()->GetNumberOfHits() == 0 ? false : true; + const Bool_t xyzEvent = fInputEvent->GetXYZHits()->GetNumberOfHits() != 0; for (unsigned int hit = 0; hit < fInputEvent->GetNumberOfHits(); hit++) { TVector3 position(fInputEvent->GetX(hit), fInputEvent->GetY(hit), fInputEvent->GetZ(hit)); From 3382e51bc856f4a8e19430b3e6d9aa1736646711 Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Wed, 30 Aug 2023 11:32:15 +0200 Subject: [PATCH 31/32] only affect XYZ hits --- src/TRestDetectorHitsRotationProcess.cxx | 20 +++++++----------- src/TRestDetectorHitsSpecularProcess.cxx | 23 +++++++++++---------- src/TRestDetectorHitsTranslationProcess.cxx | 15 ++++++++------ 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/TRestDetectorHitsRotationProcess.cxx b/src/TRestDetectorHitsRotationProcess.cxx index f8744292..4f9bdd0b 100644 --- a/src/TRestDetectorHitsRotationProcess.cxx +++ b/src/TRestDetectorHitsRotationProcess.cxx @@ -102,28 +102,24 @@ TRestEvent* TRestDetectorHitsRotationProcess::ProcessEvent(TRestEvent* inputEven fInputEvent = (TRestDetectorHitsEvent*)inputEvent; fOutputEvent->SetEventInfo(fInputEvent); - const Bool_t xyzEvent = fInputEvent->GetXYZHits()->GetNumberOfHits() != 0; for (unsigned int hit = 0; hit < fInputEvent->GetNumberOfHits(); hit++) { TVector3 position = {fInputEvent->GetX(hit), fInputEvent->GetY(hit), fInputEvent->GetZ(hit)}; const auto type = fInputEvent->GetType(hit); const auto energy = fInputEvent->GetEnergy(hit); const auto time = fInputEvent->GetTime(hit); - if (type == VETO) { - // Only TPC hits will be rotated - fOutputEvent->AddHit(position.X(), position.Y(), position.Z(), energy, time, type); + if (type != XYZ) { + fOutputEvent->AddHit(position, energy, time, type); continue; } - if (xyzEvent) { - position -= fCenter; - position.Rotate(fAngle, fAxis); - position += fCenter; - } else { - this->SetError("TRestDetectorHitsRotationProcess. Only XYZ hits can be transformed"); - } + // veto hits won't be rotated because they are not XYZ + + position -= fCenter; + position.Rotate(fAngle, fAxis); + position += fCenter; - fOutputEvent->AddHit(position.X(), position.Y(), position.Z(), energy, time, type); + fOutputEvent->AddHit(position, energy, time, type); } return fOutputEvent; diff --git a/src/TRestDetectorHitsSpecularProcess.cxx b/src/TRestDetectorHitsSpecularProcess.cxx index 40e9f0a4..4bc93ac8 100644 --- a/src/TRestDetectorHitsSpecularProcess.cxx +++ b/src/TRestDetectorHitsSpecularProcess.cxx @@ -103,22 +103,23 @@ TRestEvent* TRestDetectorHitsSpecularProcess::ProcessEvent(TRestEvent* inputEven fInputEvent = (TRestDetectorHitsEvent*)inputEvent; fOutputEvent->SetEventInfo(fInputEvent); - const Bool_t xyzEvent = fInputEvent->GetXYZHits()->GetNumberOfHits() != 0; for (unsigned int hit = 0; hit < fInputEvent->GetNumberOfHits(); hit++) { TVector3 position(fInputEvent->GetX(hit), fInputEvent->GetY(hit), fInputEvent->GetZ(hit)); + const auto type = fInputEvent->GetType(hit); + const auto energy = fInputEvent->GetEnergy(hit); + const auto time = fInputEvent->GetTime(hit); - if (xyzEvent) { - TVector3 V = position - fPosition; - Double_t vByN = V.Dot(fNormal); - TVector3 reflectionVector = V - 2 * vByN * fNormal; - - position = fPosition + reflectionVector; - } else { - this->SetError("TRestDetectorHitsSpecularProcess. Only XYZ hits can be transformed"); + if (type != XYZ) { + fOutputEvent->AddHit(position, energy, time, type); + continue; } - fOutputEvent->AddHit(position.X(), position.Y(), position.Z(), fInputEvent->GetEnergy(hit), - fInputEvent->GetTime(hit), fInputEvent->GetType(hit)); + const TVector3 relativePosition = position - fPosition; + const TVector3 reflectionVector = relativePosition - 2 * relativePosition.Dot(fNormal) * fNormal; + + position = fPosition + reflectionVector; + + fOutputEvent->AddHit(position, energy, time, type); } return fOutputEvent; } diff --git a/src/TRestDetectorHitsTranslationProcess.cxx b/src/TRestDetectorHitsTranslationProcess.cxx index eea59acd..ed0a193f 100644 --- a/src/TRestDetectorHitsTranslationProcess.cxx +++ b/src/TRestDetectorHitsTranslationProcess.cxx @@ -98,15 +98,18 @@ TRestEvent* TRestDetectorHitsTranslationProcess::ProcessEvent(TRestEvent* inputE const Bool_t xyzEvent = fInputEvent->GetXYZHits()->GetNumberOfHits() != 0; for (unsigned int hit = 0; hit < fInputEvent->GetNumberOfHits(); hit++) { TVector3 position(fInputEvent->GetX(hit), fInputEvent->GetY(hit), fInputEvent->GetZ(hit)); + const auto type = fInputEvent->GetType(hit); + const auto energy = fInputEvent->GetEnergy(hit); + const auto time = fInputEvent->GetTime(hit); - if (xyzEvent) { - position += fTranslation; - } else { - this->SetError("TRestDetectorHitsTranslationProcess. Only XYZ hits can be transformed"); + if (type != XYZ) { + fOutputEvent->AddHit(position, energy, time, type); + continue; } - fOutputEvent->AddHit(position.X(), position.Y(), position.Z(), fInputEvent->GetEnergy(hit), - fInputEvent->GetTime(hit), fInputEvent->GetType(hit)); + position += fTranslation; + + fOutputEvent->AddHit(position, energy, time, type); } return fOutputEvent; } From 92808a46441ab482793cfe20c37252fcdf07a9ef Mon Sep 17 00:00:00 2001 From: Luis Antonio Obis Aparicio Date: Wed, 30 Aug 2023 19:10:35 +0200 Subject: [PATCH 32/32] remove unused variable --- src/TRestDetectorHitsTranslationProcess.cxx | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/TRestDetectorHitsTranslationProcess.cxx b/src/TRestDetectorHitsTranslationProcess.cxx index ed0a193f..a5d1e1d3 100644 --- a/src/TRestDetectorHitsTranslationProcess.cxx +++ b/src/TRestDetectorHitsTranslationProcess.cxx @@ -95,7 +95,6 @@ TRestEvent* TRestDetectorHitsTranslationProcess::ProcessEvent(TRestEvent* inputE fInputEvent = (TRestDetectorHitsEvent*)inputEvent; fOutputEvent->SetEventInfo(fInputEvent); - const Bool_t xyzEvent = fInputEvent->GetXYZHits()->GetNumberOfHits() != 0; for (unsigned int hit = 0; hit < fInputEvent->GetNumberOfHits(); hit++) { TVector3 position(fInputEvent->GetX(hit), fInputEvent->GetY(hit), fInputEvent->GetZ(hit)); const auto type = fInputEvent->GetType(hit); @@ -108,7 +107,6 @@ TRestEvent* TRestDetectorHitsTranslationProcess::ProcessEvent(TRestEvent* inputE } position += fTranslation; - fOutputEvent->AddHit(position, energy, time, type); } return fOutputEvent;