diff --git a/NPLib/HYDE2/Hyde2Tracker.cxx b/NPLib/HYDE2/Hyde2Tracker.cxx new file mode 100644 index 0000000000000000000000000000000000000000..ee29c1f1f1fb1d328a13e990ffcbb48812050983 --- /dev/null +++ b/NPLib/HYDE2/Hyde2Tracker.cxx @@ -0,0 +1,284 @@ +/***************************************************************************** + * Copyright (C) 2009-2010 this file is part of the NPTool Project * + * * + * For the licensing terms see $NPTOOL/Licence/NPTool_Licence * + * For the list of contributors see $NPTOOL/Licence/Contributors * + *****************************************************************************/ + +/***************************************************************************** + * Original Author: N. de Sereville contact address: deserevi@ipno.in2p3.fr * + * * + * Creation Date : 31/08/09 * + * Last update : 10/09/09 * + *---------------------------------------------------------------------------* + * Decription: This class is mainly an interface to the * + * THyde2TrackerPhysics class and it deals with the geometrical* + * correspondance between strip number and absolute coordinates * + * (X, Y, Z) of interaction. * + *---------------------------------------------------------------------------* + * Comment: * + * + 10/09/09: Add support for Square and DummyShape shapes * + * (N. de Sereville) * + * * + * * + *****************************************************************************/ + +#include "Hyde2Tracker.h" + +// C++ headers +#include <iostream> +#include <fstream> +#include <string> +#include <cmath> +#include <stdlib.h> + +// NPL headers +#include "RootInput.h" +#include "RootOutput.h" + +// ROOT headers +#include "TChain.h" + +// Hyde2 headers +#include "Hyde2TrackerTrapezoid1.h" +#include "Hyde2TrackerTrapezoid2.h" +#include "Hyde2TrackerSquare1.h" + +using namespace std ; + + + + +Hyde2Tracker::Hyde2Tracker() + : m_EventData (new THyde2TrackerData()), + m_EventPhysics (new THyde2TrackerPhysics()) +{ +} + + + +Hyde2Tracker::~Hyde2Tracker() +{ + delete m_EventData; + delete m_EventPhysics; +} + + + +void Hyde2Tracker::Clear() +{ +} + + + +// Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token +void Hyde2Tracker::ReadConfiguration(string Path) +{ + // open configuration file + ifstream ConfigFile; + ConfigFile.open(Path.c_str()); + + bool HYD2TrkTrapezoid1 = false; + bool HYD2TrkTrapezoid2 = false; + bool HYD2TrkSquare1 = false; + + string LineBuffer; + while (!ConfigFile.eof()) { + getline(ConfigFile, LineBuffer); + if (LineBuffer.compare(0, 11, "HYD2Square1") == 0 && HYD2TrkSquare1 == false) { + HYD2TrkSquare1 = true; + + // instantiate a new "detector" corresponding to the Shape elements + Hyde2TrackerModule* myDetector = new Hyde2TrackerSquare1(m_ModulesMap, m_EventPhysics); + + // Pass the data object to the Hyde2Tracker*** object + myDetector->SetHyde2DataPointer(m_EventData); + + // read part of the configuration file corresponding to shape elements + ConfigFile.close(); + myDetector->ReadConfiguration(Path); + ConfigFile.open(Path.c_str()); + } + else if (LineBuffer.compare(0, 14, "HYD2Trapezoid1") == 0 && HYD2TrkTrapezoid1 == false) { + HYD2TrkTrapezoid1 = true; + + // instantiate a new "detector" corresponding to the Trapezoid elements + Hyde2TrackerModule* myDetector = new Hyde2TrackerTrapezoid1(m_ModulesMap, m_EventPhysics); + + // Pass the data object to the Hyde2Tracker*** object + myDetector->SetHyde2DataPointer(m_EventData); + + // read part of the configuration file corresponding to trapezoid elements + ConfigFile.close(); + myDetector->ReadConfiguration(Path); + ConfigFile.open(Path.c_str()); + } + else if (LineBuffer.compare(0, 14, "HYD2Trapezoid2") == 0 && HYD2TrkTrapezoid2 == false) { + HYD2TrkTrapezoid2 = true; + + // instantiate a new "detector" corresponding to the Trapezoid elements + Hyde2TrackerModule* myDetector = new Hyde2TrackerTrapezoid2(m_ModulesMap, m_EventPhysics); + + // Pass the data object to the Hyde2Tracker*** object + myDetector->SetHyde2DataPointer(m_EventData); + + // read part of the configuration file corresponding to trapezoid elements + ConfigFile.close(); + myDetector->ReadConfiguration(Path); + ConfigFile.open(Path.c_str()); + } + } +} + + +// Read stream at Path and pick-up calibration parameter using Token +// If argument is "Simulation" no change calibration is loaded +void Hyde2Tracker::ReadCalibrationFile(string Path) +{ + Path.c_str(); // remove warning at compilation time + +/* // Order of Polynom function used for calibration + int Calibration_Si_E_Order; + int Calibration_Si_T_Order; + int Calibration_SiLi_E_Order; + int Calibration_CsI_E_Order; + + // Calibration_Si_X_E[DetectorNumber][StripNumber][Order of Coeff] + vector< vector< vector< double > > > Calibration_Si_X_E ; + vector< vector< vector< double > > > Calibration_Si_X_T ; + vector< vector< vector< double > > > Calibration_Si_Y_E ; + vector< vector< vector< double > > > Calibration_Si_Y_T ; + + // Calibration_SiLi_E[DetectorNumber][PadNumber][Order of Coeff] + vector< vector< vector< double > > > Calibration_SiLi_E ; + + // Calibration_SiLi_E[DetectorNumber][CrystalNumber][Order of Coeff] + vector< vector< vector< double > > > Calibration_CsI_E ; + + if (Path == "Simulation") { // Simulation case: data already calibrated + Calibration_Si_E_Order = 1; + Calibration_Si_T_Order = 1; + Calibration_SiLi_E_Order = 1; + Calibration_CsI_E_Order = 1; + + vector<double> Coef; + // Order 0 Order 1 + Coef.push_back(0) ; Coef.push_back(1) ; + + vector< vector<double> > StripLine ; + StripLine.resize( 128 , Coef) ; + + Calibration_Si_X_E.resize( m_NumberOfModule , StripLine) ; + Calibration_Si_X_T.resize( m_NumberOfModule , StripLine) ; + Calibration_Si_Y_E.resize( m_NumberOfModule , StripLine) ; + Calibration_Si_Y_T.resize( m_NumberOfModule , StripLine) ; + + Calibration_SiLi_E.resize( m_NumberOfModule , StripLine) ; + Calibration_CsI_E .resize( m_NumberOfModule , StripLine) ; + } + else { + } +*/ +} + + + +// Activated associated Branches and link it to the private member DetectorData address +// In this method mother Branches (Detector) AND daughter leaf (fDetector_parameter) have to be activated +void Hyde2Tracker::InitializeRootInput() +{ + TChain* inputChain = RootInput::getInstance()->GetChain(); + inputChain->SetBranchStatus("HYDE2", true); + inputChain->SetBranchStatus("fHYD2*", true); + inputChain->SetBranchAddress("HYDE2", &m_EventData); +} + + + +// Create associated branches and associated private member DetectorPhysics address +void Hyde2Tracker::InitializeRootOutput() +{ + TTree* outputTree = RootOutput::getInstance()->GetTree(); + outputTree->Branch("HYDE2", "THyde2TrackerPhysics", &m_EventPhysics); +} + + + +// This method is called at each event read from the Input Tree. Aime is to build treat Raw dat in order to extract physical parameter. +void Hyde2Tracker::BuildPhysicalEvent() +{ + if (m_EventData->GetHYD2TrkFirstStageFrontEMult() > 0) { + for (UInt_t i = 0; i < m_EventData->GetHYD2TrkFirstStageFrontEMult(); i++) { + UShort_t detecNbr = m_EventData->GetHYD2TrkFirstStageFrontEDetectorNbr(i); + m_ModulesMap[detecNbr]->BuildPhysicalEvent(); + } + } +} + + + +// Same as above, but only the simplest event and/or simple method are used (low multiplicity, faster algorythm but less efficient ...). +// This method aimed to be used for analysis performed during experiment, when speed is requiered. +// NB: This method can eventually be the same as BuildPhysicalEvent. +void Hyde2Tracker::BuildSimplePhysicalEvent() +{ + BuildPhysicalEvent(); +} + + + +void Hyde2Tracker::DumpModulesMap() +{ + cout << "Hyde2Tracker::DumpMap()" << endl; + + map<int, Hyde2TrackerModule*>::iterator it; + + for (it = m_ModulesMap.begin(); it != m_ModulesMap.end(); ++it) { + cout << "Module " << it->first << " -> Address " << it->second << endl; + } +} + + + +void Hyde2Tracker::DumpStrippingScheme(int moduleNumber) +{ + cout << "Hyde2Tracker::DumpStrippingScheme()" << endl; + + for (int i = 1; i < 128; i++) { // front part + for (int j = 1; j < 128; j++) { // back part + cout << "strips X, Y: " << i << " " << j << "\t--->\t (X,Y,Z) mm: " + << m_ModulesMap[moduleNumber]->GetStripPositionX(moduleNumber, i, j) << "\t" + << m_ModulesMap[moduleNumber]->GetStripPositionY(moduleNumber, i, j) << "\t" + << m_ModulesMap[moduleNumber]->GetStripPositionZ(moduleNumber, i, j) << endl; + } + } +} + + + +double Hyde2Tracker::GetEnergyDeposit() +{ + if (m_EventPhysics->GetEventMultiplicity() > 0) { + return m_EventPhysics->GetTotalEnergy(0); + } + else + return -1000; +} + + + +TVector3 Hyde2Tracker::GetPositionOfInteraction() +{ + TVector3 Position = TVector3(-1000,-1000,-1000); + + if (m_EventPhysics->GetEventMultiplicity() == 1) { + Int_t ModuleNbr = m_EventPhysics->GetModuleNumber(0); + Int_t FrontPos = m_EventPhysics->GetFirstStageFrontPosition(0); + Int_t BackPos = m_EventPhysics->GetFirstStageBackPosition(0); + Position = TVector3(m_ModulesMap[ModuleNbr]->GetStripPositionX(ModuleNbr, FrontPos, BackPos), + m_ModulesMap[ModuleNbr]->GetStripPositionY(ModuleNbr, FrontPos, BackPos), + m_ModulesMap[ModuleNbr]->GetStripPositionZ(ModuleNbr, FrontPos, BackPos)); + } + + return Position; +} diff --git a/NPLib/HYDE2/Hyde2Tracker.h b/NPLib/HYDE2/Hyde2Tracker.h new file mode 100644 index 0000000000000000000000000000000000000000..36093b0c92dab10455d5a9bfac8364aeb33254e4 --- /dev/null +++ b/NPLib/HYDE2/Hyde2Tracker.h @@ -0,0 +1,110 @@ +/***************************************************************************** + * Copyright (C) 2009-2010 this file is part of the NPTool Project * + * * + * For the licensing terms see $NPTOOL/Licence/NPTool_Licence * + * For the list of contributors see $NPTOOL/Licence/Contributors * + *****************************************************************************/ + +/***************************************************************************** + * Original Author: N. de Sereville contact address: deserevi@ipno.in2p3.fr * + * * + * Creation Date : 31/08/09 * + * Last update : 10/09/09 * + *---------------------------------------------------------------------------* + * Decription: This class is mainly an interface to the * + * THyde2TrackerPhysics class and it deals with the geometrical* + * correspondance between strip number and absolute coordinates * + * (X, Y, Z) of interaction. * + *---------------------------------------------------------------------------* + * Comment: * + * + 10/09/09: Add support for Square and DummyShape shapes * + * (N. de Sereville) * + * * + * * + *****************************************************************************/ + +#ifndef Hyde2Tracker_H +#define Hyde2Tracker_H + +// NPL +#include "../include/VDetector.h" +#include "THyde2TrackerData.h" +#include "THyde2TrackerPhysics.h" +#include "Hyde2TrackerModule.h" + +// C++ +#include <map> +#include <vector> + +// Root +#include "TObject.h" +#include "TVector3.h" + +class Hyde2Tracker : public NPA::VDetector +{ +public: + Hyde2Tracker(); + virtual ~Hyde2Tracker(); + +public: + void Clear(); + void Clear(const Option_t*) {}; + +public: + ///////////////////////////////////// + // Innherited from VDetector Class // + ///////////////////////////////////// + // Read stream at ConfigFile to pick-up parameters of detector (Position,...) using Token + void ReadConfiguration(string); + + // Read stream at CalibFile and pick-up calibration parameter using Token + // If argument is "Simulation" no change calibration is loaded + void ReadCalibrationFile(string); + + // Activated associated Branches and link it to the private member DetectorData address + // In this method mother Branches (Detector) AND daughter leaf (fDetector_parameter) have to be activated + void InitializeRootInput(); + + // Create associated branches and associated private member DetectorPhysics address + void InitializeRootOutput(); + + // This method is called at each event read from the Input Tree. + // The aim is to build treat Raw dat in order to extract physical parameter. + void BuildPhysicalEvent(); + + // Same as above, but only the simplest event and/or simple method are used (low multiplicity, faster algorythm but less efficient ...). + // This method aimed to be used for analysis performed during experiment, when speed is requiered. + // NB: This method can eventually be the same as BuildPhysicalEvent. + void BuildSimplePhysicalEvent(); + + // Those two method all to clear the Event Physics or Data + void ClearEventPhysics() {m_EventPhysics->Clear();} + void ClearEventData() {m_EventData->Clear();} + + +public: + void DumpModulesMap(); + void DumpStrippingScheme(int moduleNumber); + +private: + map<int, Hyde2TrackerModule*> m_ModulesMap; + +public: + // Get Root input and output objects + THyde2TrackerData* GetEventData() {return m_EventData;} + THyde2TrackerPhysics* GetEventPhysics() {return m_EventPhysics;} + + // To be called after a build Physical Event + double GetEnergyDeposit(); + TVector3 GetPositionOfInteraction(); + + +private: + //////////////////////////////////////// + // Root Input and Output tree classes // + //////////////////////////////////////// + THyde2TrackerData* m_EventData; + THyde2TrackerPhysics* m_EventPhysics; +}; + +#endif diff --git a/NPLib/HYDE2/Hyde2TrackerModule.cxx b/NPLib/HYDE2/Hyde2TrackerModule.cxx new file mode 100644 index 0000000000000000000000000000000000000000..e2334f9337e836a3f28b0d92f6ff71212ea3ddb4 --- /dev/null +++ b/NPLib/HYDE2/Hyde2TrackerModule.cxx @@ -0,0 +1,23 @@ +#include "Hyde2TrackerModule.h" + + + +Hyde2TrackerModule::Hyde2TrackerModule() +{ + InitializeIndex(); +} + + + +Hyde2TrackerModule::~Hyde2TrackerModule() +{ +} + + + +void Hyde2TrackerModule::InitializeIndex() +{ + m_index["Square1"] = 2000; + m_index["Trapezoid1"] = 2200; + m_index["Trapezoid2"] = 2300; +} diff --git a/NPLib/HYDE2/Hyde2TrackerModule.h b/NPLib/HYDE2/Hyde2TrackerModule.h new file mode 100644 index 0000000000000000000000000000000000000000..69c9659836f19f1fc32532f9bb13021e7f08eb45 --- /dev/null +++ b/NPLib/HYDE2/Hyde2TrackerModule.h @@ -0,0 +1,48 @@ +#ifndef Hyde2TrackerModule_h +#define Hyde2TrackerModule_h 1 + +// C++ headers +#include <string> +#include <map> + +// NPTool - ROOT headers +#include "THyde2TrackerData.h" + +using namespace std; + + + +class Hyde2TrackerModule +{ +public: + Hyde2TrackerModule(); + virtual ~Hyde2TrackerModule(); + +public: + // Read stream at Configfile to pick-up parameters of detector (Position,...) + virtual void ReadConfiguration(string Path) = 0; + + // The goal of this method is to extract physical parameters from raw data + // Method called at each event read from the Input Tree + virtual void BuildPhysicalEvent() = 0; + + // Same as before but with a simpler treatment + virtual void BuildSimplePhysicalEvent() = 0; + + // Initialize the Index map for the different modules of Hyde2 + void InitializeIndex(); + + // Pass the THyde2TrackerData object from THyde2TrackerPhysics to the + // classes deriving from Hyde2TrackerModule + virtual void SetHyde2DataPointer(THyde2TrackerData* hyde2Data) = 0; + + // + virtual double GetStripPositionX(Int_t DetectorNumber, Int_t stripX, Int_t stripY) = 0; + virtual double GetStripPositionY(Int_t DetectorNumber, Int_t stripX, Int_t stripY) = 0; + virtual double GetStripPositionZ(Int_t DetectorNumber, Int_t stripX, Int_t stripY) = 0; + +protected: + map<string, int> m_index; +}; + +#endif diff --git a/NPLib/HYDE2/Hyde2TrackerSquare1.cxx b/NPLib/HYDE2/Hyde2TrackerSquare1.cxx new file mode 100644 index 0000000000000000000000000000000000000000..705b5b8d140a6cddc0f09879c02673259fce8bb3 --- /dev/null +++ b/NPLib/HYDE2/Hyde2TrackerSquare1.cxx @@ -0,0 +1,559 @@ +#include "Hyde2TrackerSquare1.h" + +// C++ headers +#include <limits> +#include <iostream> +#include <fstream> +#include <string> +#include <cmath> +#include <stdlib.h> + +// Hyde2 +#include "THyde2TrackerPhysics.h" + + +Hyde2TrackerSquare1::Hyde2TrackerSquare1(map<int, Hyde2TrackerModule*> &Module, + THyde2TrackerPhysics* &EventPhysics) + : m_ModuleTest(Module), + m_EventPhysics(EventPhysics), + m_EventData(0), + m_PreTreatData(new THyde2TrackerData), + m_NumberOfModule(0), + m_FirstStageFace(87.42), // mm + m_NumberOfStrips(220) +{ + m_StripPitch = m_FirstStageFace / (double)m_NumberOfStrips; +} + + + +Hyde2TrackerSquare1::~Hyde2TrackerSquare1() +{ + delete m_PreTreatData; +} + + + +void Hyde2TrackerSquare1::ReadConfiguration(string Path) +{ + ifstream ConfigFile; + ConfigFile.open(Path.c_str()); + string LineBuffer; + string DataBuffer; + + // A:X1_Y1 --> X:1 Y:1 + // B:X128_Y1 --> X:128 Y:1 + // C:X1_Y128 --> X:1 Y:128 + // D:X128_Y128 --> X:128 Y:128 + + double Ax, Bx, Cx, Dx, Ay, By, Cy, Dy, Az, Bz, Cz, Dz; + TVector3 A, B, C, D; + double Theta = 0, Phi = 0, R = 0, beta_u = 0 , beta_v = 0 , beta_w = 0; + + bool check_A = false; + bool check_C = false; + bool check_B = false; + bool check_D = false; + + bool check_Theta = false; + bool check_Phi = false; + bool check_R = false; + bool check_beta = false; + + bool ReadingStatus = false; + + while (!ConfigFile.eof()) { + getline(ConfigFile, LineBuffer); + + // If line is a Hyde2XXX bloc, reading toggle to true + // and toggle to true flags indicating which shape is treated. + if (LineBuffer.compare(0, 9, "HYD2Square1") == 0) { + cout << "///////////////////////" << endl; + cout << "Square1 module found:" << endl; + ReadingStatus = true; + } + + // Reading Block + while (ReadingStatus) { + ConfigFile >> DataBuffer ; + // Comment Line + if (DataBuffer.compare(0, 1, "%") == 0) { + ConfigFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n' ); + } + // Finding another telescope (safety), toggle out + else if (DataBuffer.compare(0, 11, "HYD2Square1") == 0) { + cout << "WARNING: Another Module is find before standard sequence of Token, Error may occured in Telecope definition" << endl; + ReadingStatus = false; + } + + // Position method + else if (DataBuffer.compare(0, 6, "X1_Y1=") == 0) { + check_A = true; + ConfigFile >> DataBuffer; + Ax = atof(DataBuffer.c_str()); + Ax = Ax; + ConfigFile >> DataBuffer; + Ay = atof(DataBuffer.c_str()); + Ay = Ay; + ConfigFile >> DataBuffer; + Az = atof(DataBuffer.c_str()); + Az = Az; + + A = TVector3(Ax, Ay, Az); + cout << "X1 Y1 corner position : (" << A.X() << ";" << A.Y() << ";" << A.Z() << ")" << endl; + } + else if (DataBuffer.compare(0, 8, "X128_Y1=") == 0) { + check_B = true; + ConfigFile >> DataBuffer; + Bx = atof(DataBuffer.c_str()); + Bx = Bx; + ConfigFile >> DataBuffer; + By = atof(DataBuffer.c_str()); + By = By; + ConfigFile >> DataBuffer; + Bz = atof(DataBuffer.c_str()); + Bz = Bz; + + B = TVector3(Bx, By, Bz); + cout << "X128 Y1 corner position : (" << B.X() << ";" << B.Y() << ";" << B.Z() << ")" << endl; + } + else if (DataBuffer.compare(0, 8, "X1_Y128=") == 0) { + check_C = true; + ConfigFile >> DataBuffer; + Cx = atof(DataBuffer.c_str()); + Cx = Cx; + ConfigFile >> DataBuffer; + Cy = atof(DataBuffer.c_str()); + Cy = Cy; + ConfigFile >> DataBuffer; + Cz = atof(DataBuffer.c_str()); + Cz = Cz; + + C = TVector3(Cx, Cy, Cz); + cout << "X1 Y128 corner position : (" << C.X() << ";" << C.Y() << ";" << C.Z() << ")" << endl; + } + else if (DataBuffer.compare(0, 10, "X128_Y128=") == 0) { + check_D = true; + ConfigFile >> DataBuffer; + Dx = atof(DataBuffer.c_str()); + Dx = Dx; + ConfigFile >> DataBuffer; + Dy = atof(DataBuffer.c_str()); + Dy = Dy; + ConfigFile >> DataBuffer; + Dz = atof(DataBuffer.c_str()); + Dz = Dz; + + D = TVector3(Dx, Dy, Dz); + cout << "X128 Y128 corner position : (" << D.X() << ";" << D.Y() << ";" << D.Z() << ")" << endl; + } // End Position Method + + // Angle method + else if (DataBuffer.compare(0, 6, "THETA=") == 0) { + check_Theta = true; + ConfigFile >> DataBuffer; + Theta = atof(DataBuffer.c_str()); + Theta = Theta; + cout << "Theta: " << Theta << endl; + } + else if (DataBuffer.compare(0, 4, "PHI=") == 0) { + check_Phi = true; + ConfigFile >> DataBuffer; + Phi = atof(DataBuffer.c_str()); + Phi = Phi; + cout << "Phi: " << Phi << endl; + } + else if (DataBuffer.compare(0, 2, "R=") == 0) { + check_R = true; + ConfigFile >> DataBuffer; + R = atof(DataBuffer.c_str()); + R = R; + cout << "R: " << R << endl; + } + else if (DataBuffer.compare(0, 5, "BETA=") == 0) { + check_beta = true; + ConfigFile >> DataBuffer; + beta_u = atof(DataBuffer.c_str()); + beta_u = beta_u; + ConfigFile >> DataBuffer; + beta_v = atof(DataBuffer.c_str()); + beta_v = beta_v; + ConfigFile >> DataBuffer; + beta_w = atof(DataBuffer.c_str()); + beta_w = beta_w; + cout << "Beta: " << beta_u << " " << beta_v << " " << beta_w << endl; + } + + ///////////////////////////////////////////////// + // If All necessary information there, toggle out + if ( (check_A && check_B && check_C && check_D) || (check_Theta && check_Phi && check_R && check_beta) ) { + ReadingStatus = false; + + // Add The previously define telescope + // With position method + if ( check_A && check_B && check_C && check_D ) { + AddModule(A, B, C, D); + m_ModuleTest[m_index["Square1"] + m_NumberOfModule] = this; + } + + // with angle method + else if ( check_Theta && check_Phi && check_R && check_beta ) { + AddModule(Theta, Phi, R, beta_u, beta_v, beta_w); + m_ModuleTest[m_index["Square1"] + m_NumberOfModule] = this; + } + + // reset boolean flag for point positioning + check_A = false; + check_B = false; + check_C = false; + check_D = false; + // reset boolean flag for angle positioning + check_Theta = false; + check_Phi = false; + check_R = false; + check_beta = false; + + } // end test for adding a module + } // end while for reading block + } // end while for reading file + + cout << endl << "/////////////////////////////" << endl<<endl; +} + + + +void Hyde2TrackerSquare1::PreTreat() +{ +} + + + +void Hyde2TrackerSquare1::BuildPhysicalEvent() +{ + // Check flags +// bool Check_FirstStage = false; + bool Check_SecondStage = false; + bool Check_ThirdStage = false; + bool Check_FourthStage = false; + bool Check_FifthStage = false; + bool Check_SixthStage = false; + + // Thresholds +/* + double FirstStage_Front_E_Threshold = 0; double FirstStage_Front_T_Threshold = 0; + double FirstStage_Back_E_Threshold = 0; double FirstStage_Back_T_Threshold = 0; + double SecondStage_E_Threshold = 0; double SecondStage_T_Threshold = 0; + double ThirdStage_E_Threshold = 0; double ThirdStage_T_Threshold = 0; +*/ + // calculate multipicity in the first stage + int multXE = m_EventData->GetHYD2TrkFirstStageFrontEMult(); + int multYE = m_EventData->GetHYD2TrkFirstStageBackEMult(); + int multXT = m_EventData->GetHYD2TrkFirstStageFrontTMult(); + int multYT = m_EventData->GetHYD2TrkFirstStageBackTMult(); + // calculate multiplicity of 2nd and third stages + int mult2E = m_EventData->GetHYD2TrkSecondStageEMult(); + int mult2T = m_EventData->GetHYD2TrkSecondStageTMult(); + int mult3E = m_EventData->GetHYD2TrkThirdStageEMult(); + int mult3T = m_EventData->GetHYD2TrkThirdStageTMult(); + int mult4E = m_EventData->GetHYD2TrkFourthStageEMult(); + int mult4T = m_EventData->GetHYD2TrkFourthStageTMult(); + int mult5E = m_EventData->GetHYD2TrkFifthStageEMult(); + int mult5T = m_EventData->GetHYD2TrkFifthStageTMult(); + int mult6E = m_EventData->GetHYD2TrkSixthStageEMult(); + int mult6T = m_EventData->GetHYD2TrkSixthStageTMult(); + + // Deal with multiplicity 1 for the first layer + if (multXE==1 && multYE==1 && multXT==1 && multYT==1) { + // calculate detector number + int det_ref = m_EventData->GetHYD2TrkFirstStageFrontEDetectorNbr(0); + int detecXE = m_EventData->GetHYD2TrkFirstStageFrontEDetectorNbr(0) / det_ref; + int detecXT = m_EventData->GetHYD2TrkFirstStageFrontTDetectorNbr(0) / det_ref; + int detecYE = m_EventData->GetHYD2TrkFirstStageBackEDetectorNbr(0) / det_ref; + int detecYT = m_EventData->GetHYD2TrkFirstStageBackTDetectorNbr(0) / det_ref; + + // case of same detector + if (detecXE*detecXT*detecYE*detecYT == 1) { + // store module number + m_EventPhysics->SetModuleNumber(det_ref); + // calculate strip number + int stripXE = m_EventData->GetHYD2TrkFirstStageFrontEStripNbr(0); + int stripXT = m_EventData->GetHYD2TrkFirstStageFrontTStripNbr(0); + int stripYE = m_EventData->GetHYD2TrkFirstStageBackEStripNbr(0); + int stripYT = m_EventData->GetHYD2TrkFirstStageBackTStripNbr(0); + + // case of same strips on X and Y + if (stripXE == stripXT && stripYE == stripYT) { // here we have a good strip event + // various +// Check_FirstStage = true; + // store strip ID + m_EventPhysics->SetFirstStageFrontPosition(stripXE); + m_EventPhysics->SetFirstStageBackPosition(stripYE); + // get energy from strips and store it + double EnergyStripFront = m_EventData->GetHYD2TrkFirstStageFrontEEnergy(0); + m_EventPhysics->SetFirstStageEnergy(EnergyStripFront); + double EnergyTot = EnergyStripFront; + // get time from strips and store it + double TimeStripBack = m_EventData->GetHYD2TrkFirstStageBackEEnergy(0); + m_EventPhysics->SetFirstStageTime(TimeStripBack); + + // check if we have a 2nd stage event + if (mult2E==1 && mult2T==1) { + Check_SecondStage = true; + double EnergySecond = m_EventData->GetHYD2TrkSecondStageEEnergy(0); + m_EventPhysics->SetSecondStageEnergy(EnergySecond); + EnergyTot += EnergySecond; + } + else if (mult2E>1 || mult2T>1) { + cout << "Warning: multiplicity in second stage greater than in firststage" << endl; + } + + // check if we have a third stage event + if (mult3E==1 && mult3T==1) { + Check_ThirdStage = true; + double EnergyThird = m_EventData->GetHYD2TrkThirdStageEEnergy(0); + m_EventPhysics->SetThirdStageEnergy(EnergyThird); + EnergyTot += EnergyThird; + } + else if (mult3E>1 || mult3T>1) { + cout << "Warning: multiplicity in third stage greater than in firststage" << endl; + } + + // check if we have a Fourth stage event + if (mult4E==1 && mult4T==1) { + Check_FourthStage = true; + double EnergyFourth = m_EventData->GetHYD2TrkFourthStageEEnergy(0); + m_EventPhysics->SetFourthStageEnergy(EnergyFourth); + EnergyTot += EnergyFourth; + } + else if (mult4E>1 || mult4T>1) { + cout << "Warning: multiplicity in fourth stage greater than in firststage" << endl; + } + + // check if we have a Fifth stage event + if (mult5E==1 && mult5T==1) { + Check_FifthStage = true; + double EnergyFifth = m_EventData->GetHYD2TrkFifthStageEEnergy(0); + m_EventPhysics->SetFifthStageEnergy(EnergyFifth); + EnergyTot += EnergyFifth; + } + else if (mult5E>1 || mult5T>1) { + cout << "Warning: multiplicity in fifth stage greater than in firststage" << endl; + } + + // check if we have a Sixth stage event + if (mult6E==1 && mult6T==1) { + Check_SixthStage = true; + double EnergySixth = m_EventData->GetHYD2TrkSixthStageEEnergy(0); + m_EventPhysics->SetSixthStageEnergy(EnergySixth); + EnergyTot += EnergySixth; + } + else if (mult6E>1 || mult6T>1) { + cout << "Warning: multiplicity in sixth stage greater than in firststage" << endl; + } + + // Fill total energy + m_EventPhysics->SetTotalEnergy(EnergyTot); + + // check strip position +/* cout << "strips X, Y : " << stripXE << " " << stripYE << endl; + cout << "position : " << endl; + cout << "\t X: " << GetStripPositionX(det_ref + m_index["Square1"], stripXE, stripYE) << endl; + cout << "\t Y: " << GetStripPositionY(det_ref + m_index["Square1"], stripXE, stripYE) << endl; + cout << "\t Z: " << GetStripPositionZ(det_ref + m_index["Square1"], stripXE, stripYE) << endl; +*/ + // Fill default values for second an third stages + if (!Check_SecondStage) { + m_EventPhysics->SetSecondStageEnergy(-1000); + m_EventPhysics->SetSecondStageTime(-1000); + m_EventPhysics->SetSecondStagePosition(-1000); + } + if (!Check_ThirdStage) { + m_EventPhysics->SetThirdStageEnergy(-1000); + m_EventPhysics->SetThirdStageTime(-1000); + m_EventPhysics->SetThirdStagePosition(-1000); + } + if (!Check_FourthStage) { + m_EventPhysics->SetFourthStageEnergy(-1000); + m_EventPhysics->SetFourthStageTime(-1000); + m_EventPhysics->SetFourthStagePosition(-1000); + } + if (!Check_FifthStage) { + m_EventPhysics->SetFifthStageEnergy(-1000); + m_EventPhysics->SetFifthStageTime(-1000); + m_EventPhysics->SetFifthStagePosition(-1000); + } + if (!Check_SixthStage) { + m_EventPhysics->SetSixthStageEnergy(-1000); + m_EventPhysics->SetSixthStageTime(-1000); + m_EventPhysics->SetSixthStagePosition(-1000); + } + } + else { + cout << "Not same strips" << endl; + } + } + else { + cout << "Not same detector" << endl; + } + } + else { +/* cout << "Multiplicity is not one, it is: " << endl; + cout << "\tmultXE: " << multXE << endl; + cout << "\tmultXT: " << multXT << endl; + cout << "\tmultYE: " << multYE << endl; + cout << "\tmultYT: " << multYT << endl;*/ + } +} + + + +void Hyde2TrackerSquare1::BuildSimplePhysicalEvent() +{ +} + + + +void Hyde2TrackerSquare1::AddModule(TVector3 C_X1_Y1, + TVector3 C_X128_Y1, + TVector3 C_X1_Y128, + TVector3 C_X128_Y128) +{ + m_NumberOfModule++; + + // remove warning using C_X128_Y128 + C_X128_Y128.Unit(); + + // Vector U on Module Face (paralelle to Y Strip) (NB: remember that Y strip are allong X axis) + TVector3 U = C_X128_Y1 - C_X1_Y1; + U = U.Unit(); + + // Vector V on Module Face (parallele to X Strip) + TVector3 V = C_X1_Y128 - C_X1_Y1; + V = V.Unit(); + + // Position Vector of Strip Center + TVector3 StripCenter = TVector3(0,0,0); + // Position Vector of X=1 Y=1 Strip + TVector3 Strip_1_1; + + // Buffer object to fill Position Array + vector<double> lineX; + vector<double> lineY; + vector<double> lineZ; + + vector< vector< double > > OneModuleStripPositionX; + vector< vector< double > > OneModuleStripPositionY; + vector< vector< double > > OneModuleStripPositionZ; + + // Moving StripCenter to 1.1 corner: + Strip_1_1 = C_X1_Y1 + (U+V) * (m_StripPitch/2.); + + for (int i = 0; i < m_NumberOfStrips; i++) { + lineX.clear(); + lineY.clear(); + lineZ.clear(); + + for (int j = 0; j < m_NumberOfStrips; j++) { + StripCenter = Strip_1_1 + m_StripPitch*(i*U + j*V); + + lineX.push_back( StripCenter.X() ); + lineY.push_back( StripCenter.Y() ); + lineZ.push_back( StripCenter.Z() ); + } + + OneModuleStripPositionX.push_back(lineX); + OneModuleStripPositionY.push_back(lineY); + OneModuleStripPositionZ.push_back(lineZ); + } + + m_StripPositionX.push_back( OneModuleStripPositionX ); + m_StripPositionY.push_back( OneModuleStripPositionY ); + m_StripPositionZ.push_back( OneModuleStripPositionZ ); +} + + + +void Hyde2TrackerSquare1::AddModule(double theta, + double phi, + double distance, + double beta_u, + double beta_v, + double beta_w) +{ + m_NumberOfModule++; + + // convert from degree to radian: + theta *= M_PI/180; + phi *= M_PI/180; + + // Vector U on Module Face (paralelle to Y Strip) (NB: remember that Y strip are allong X axis) + TVector3 U ; + // Vector V on Module Face (parallele to X Strip) + TVector3 V ; + // Vector W normal to Module Face (pointing CsI) + TVector3 W ; + // Vector position of Module Face center + TVector3 C ; + + C = TVector3(distance * sin(theta) * cos(phi), + distance * sin(theta) * sin(phi), + distance * cos(theta)); + + TVector3 YperpW = TVector3( cos(theta) * cos(phi), + cos(theta) * sin(phi), + -sin(theta)); + + W = C.Unit(); + U = W.Cross(YperpW); + V = W.Cross(U); + + U = U.Unit(); + V = V.Unit(); + + U.Rotate( beta_u * M_PI/180. , U ) ; + V.Rotate( beta_u * M_PI/180. , U ) ; + + U.Rotate( beta_v * M_PI/180. , V ) ; + V.Rotate( beta_v * M_PI/180. , V ) ; + + U.Rotate( beta_w * M_PI/180. , W ) ; + V.Rotate( beta_w * M_PI/180. , W ) ; + + // Position Vector of Strip Center + TVector3 StripCenter = TVector3(0,0,0); + // Position Vector of X=1 Y=1 Strip + TVector3 Strip_1_1; + + vector<double> lineX; + vector<double> lineY; + vector<double> lineZ; + + vector< vector< double > > OneModuleStripPositionX; + vector< vector< double > > OneModuleStripPositionY; + vector< vector< double > > OneModuleStripPositionZ; + + // Moving C to the 1.1 corner: + Strip_1_1 = C - 0.5 * (m_FirstStageFace - m_StripPitch) * (U + V); + + for (int i = 0; i < m_NumberOfStrips; i++) { + lineX.clear(); + lineY.clear(); + lineZ.clear(); + + for (int j = 0; j < m_NumberOfStrips; j++) { + StripCenter = Strip_1_1 + m_StripPitch * (i*U + j*V); + + lineX.push_back(StripCenter.X()); + lineY.push_back(StripCenter.Y()); + lineZ.push_back(StripCenter.Z()); + } + + OneModuleStripPositionX.push_back(lineX); + OneModuleStripPositionY.push_back(lineY); + OneModuleStripPositionZ.push_back(lineZ); + } + + m_StripPositionX.push_back( OneModuleStripPositionX ); + m_StripPositionY.push_back( OneModuleStripPositionY ); + m_StripPositionZ.push_back( OneModuleStripPositionZ ); +} diff --git a/NPLib/HYDE2/Hyde2TrackerSquare1.h b/NPLib/HYDE2/Hyde2TrackerSquare1.h new file mode 100644 index 0000000000000000000000000000000000000000..364699f8f7545b3f729f2c3054111fa84a19d316 --- /dev/null +++ b/NPLib/HYDE2/Hyde2TrackerSquare1.h @@ -0,0 +1,98 @@ +#ifndef Hyde2TrackerSquare1_h +#define Hyde2TrackerSquare1_h 1 + +// C++ headers +#include <string> +#include <map> +#include <vector> + +// ROOT headers +#include "TVector3.h" + +// Hyde2 headers +#include "THyde2TrackerData.h" +#include "THyde2TrackerPhysics.h" +#include "Hyde2TrackerModule.h" + +using namespace std; + + + +class Hyde2TrackerSquare1 : public Hyde2TrackerModule +{ +public: + //////////////////////////////////////////////////// + /////// Default Constructor and Destructor ///////// + //////////////////////////////////////////////////// + Hyde2TrackerSquare1(map<int, Hyde2TrackerModule*> &Module, THyde2TrackerPhysics* &EventPhysics); + virtual ~Hyde2TrackerSquare1(); + +public: + //////////////////////////////////////////////////// + //// Inherite from Hyde2TrackerModule class ///// + //////////////////////////////////////////////////// + // Read stream at Configfile to pick-up parameters of detector (Position,...) + void ReadConfiguration(string Path); + + // The goal of this method is to extract physical parameters from raw data + // Method called at each event read from the Input Tree + void BuildPhysicalEvent(); + + // Same as before but with a simpler treatment + void BuildSimplePhysicalEvent(); + +private: + map<int, Hyde2TrackerModule*> &m_ModuleTest; + THyde2TrackerPhysics* &m_EventPhysics; + +public: + void SetHyde2DataPointer(THyde2TrackerData* hyde2Data) {m_EventData = hyde2Data;}; + void PreTreat(); + +private: + // Hyde2 data coming from THyde2TrackerPhysics through the + // SetHyde2DataPointer method + THyde2TrackerData* m_EventData; + THyde2TrackerData* m_PreTreatData; + +public: + //////////////////////////////// + // Specific to Hyde2Tracker // + //////////////////////////////// + // Add a Module using Corner Coordinate information + void AddModule(TVector3 C_X1_Y1, + TVector3 C_X128_Y1, + TVector3 C_X1_Y128, + TVector3 C_X128_Y128); + + // Add a Module using R Theta Phi of Si center information + void AddModule(double theta, + double phi, + double distance, + double beta_u, + double beta_v, + double beta_w); + + // Getters to retrieve the (X,Y,Z) coordinates of a pixel defined by strips (X,Y) + double GetStripPositionX(int N ,int X ,int Y) { return m_StripPositionX[N-1-m_index["Square1"]][X-1][Y-1]; } + double GetStripPositionY(int N ,int X ,int Y) { return m_StripPositionY[N-1-m_index["Square1"]][X-1][Y-1]; } + double GetStripPositionZ(int N ,int X ,int Y) { return m_StripPositionZ[N-1-m_index["Square1"]][X-1][Y-1]; } + double GetNumberOfModule() { return m_NumberOfModule; } + +private: + // Spatial Position of Strip Calculated on basis of detector position + int m_NumberOfModule; + vector< vector < vector < double > > > m_StripPositionX; + vector< vector < vector < double > > > m_StripPositionY; + vector< vector < vector < double > > > m_StripPositionZ; + +private: + ////////////////////////////// + // Geometry and stip number // + ////////////////////////////// + double m_FirstStageFace; // mm + int m_NumberOfStrips; + double m_StripPitch; +}; + +#endif diff --git a/NPLib/HYDE2/Hyde2TrackerTrapezoid1.cxx b/NPLib/HYDE2/Hyde2TrackerTrapezoid1.cxx new file mode 100644 index 0000000000000000000000000000000000000000..e83e1394917c8b64f803c241def5f196909b977a --- /dev/null +++ b/NPLib/HYDE2/Hyde2TrackerTrapezoid1.cxx @@ -0,0 +1,560 @@ +#include "Hyde2TrackerTrapezoid1.h" + +// C++ headers +#include <limits> +#include <iostream> +#include <fstream> +#include <string> +#include <cmath> +#include <stdlib.h> + +// Hyde2 +#include "THyde2TrackerPhysics.h" + + +Hyde2TrackerTrapezoid1::Hyde2TrackerTrapezoid1(map<int, Hyde2TrackerModule*> &Module, + THyde2TrackerPhysics* &EventPhysics) + : m_ModuleTest(Module), + m_EventPhysics(EventPhysics), + m_EventData(0), + m_PreTreatData(new THyde2TrackerData), + m_NumberOfModule(0), + m_FirstStageHeight(87.68), // mm + m_FirstStageBaseLarge(85.48), // mm + m_FirstStageBaseSmall(54.17), // mm + m_NumberOfStripsX(214), + m_NumberOfStripsY(220) +{ + m_StripPitchX = m_FirstStageBaseLarge / (double)m_NumberOfStripsX; + m_StripPitchY = m_FirstStageHeight / (double)m_NumberOfStripsY; +} + + + +Hyde2TrackerTrapezoid1::~Hyde2TrackerTrapezoid1() +{ + delete m_PreTreatData; +} + + + +void Hyde2TrackerTrapezoid1::ReadConfiguration(string Path) +{ + ifstream ConfigFile; + ConfigFile.open(Path.c_str()); + string LineBuffer; + string DataBuffer; + + // A:X1_Y1 --> X:1 Y:1 + // B:X128_Y1 --> X:128 Y:1 + // C:X1_Y128 --> X:1 Y:128 + // D:X128_Y128 --> X:128 Y:128 + + double Ax, Bx, Cx, Dx, Ay, By, Cy, Dy, Az, Bz, Cz, Dz; + TVector3 A, B, C, D; + double Theta = 0, Phi = 0, R = 0, beta_u = 0 , beta_v = 0 , beta_w = 0; + + bool check_A = false; + bool check_C = false; + bool check_B = false; + bool check_D = false; + + bool check_Theta = false; + bool check_Phi = false; + bool check_R = false; + bool check_beta = false; + + bool ReadingStatus = false; + + while (!ConfigFile.eof()) { + getline(ConfigFile, LineBuffer); + + // If line is a Hyde2XXX bloc, reading toggle to true + // and toggle to true flags indicating which shape is treated. + if (LineBuffer.compare(0, 14, "HYD2Trapezoid1") == 0) { + cout << "///////////////////////" << endl; + cout << "Trapezoid1 module found:" << endl; + ReadingStatus = true; + } + + // Reading Block + while (ReadingStatus) { + ConfigFile >> DataBuffer ; + // Comment Line + if (DataBuffer.compare(0, 1, "%") == 0) { + ConfigFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n' ); + } + // Finding another telescope (safety), toggle out + else if (DataBuffer.compare(0, 14, "HYD2Trapezoid1") == 0) { + cout << "WARNING: Another Module is find before standard sequence of Token, Error may occured in Telecope definition" << endl; + ReadingStatus = false; + } + + // Position method + else if (DataBuffer.compare(0, 6, "X1_Y1=") == 0) { + check_A = true; + ConfigFile >> DataBuffer; + Ax = atof(DataBuffer.c_str()); + Ax = Ax; + ConfigFile >> DataBuffer; + Ay = atof(DataBuffer.c_str()); + Ay = Ay; + ConfigFile >> DataBuffer; + Az = atof(DataBuffer.c_str()); + Az = Az; + + A = TVector3(Ax, Ay, Az); + cout << "X1 Y1 corner position : (" << A.X() << ";" << A.Y() << ";" << A.Z() << ")" << endl; + } + else if (DataBuffer.compare(0, 8, "X128_Y1=") == 0) { + check_B = true; + ConfigFile >> DataBuffer; + Bx = atof(DataBuffer.c_str()); + Bx = Bx; + ConfigFile >> DataBuffer; + By = atof(DataBuffer.c_str()); + By = By; + ConfigFile >> DataBuffer; + Bz = atof(DataBuffer.c_str()); + Bz = Bz; + + B = TVector3(Bx, By, Bz); + cout << "X128 Y1 corner position : (" << B.X() << ";" << B.Y() << ";" << B.Z() << ")" << endl; + } + else if (DataBuffer.compare(0, 8, "X1_Y128=") == 0) { + check_C = true; + ConfigFile >> DataBuffer; + Cx = atof(DataBuffer.c_str()); + Cx = Cx; + ConfigFile >> DataBuffer; + Cy = atof(DataBuffer.c_str()); + Cy = Cy; + ConfigFile >> DataBuffer; + Cz = atof(DataBuffer.c_str()); + Cz = Cz; + + C = TVector3(Cx, Cy, Cz); + cout << "X1 Y128 corner position : (" << C.X() << ";" << C.Y() << ";" << C.Z() << ")" << endl; + } + else if (DataBuffer.compare(0, 10, "X128_Y128=") == 0) { + check_D = true; + ConfigFile >> DataBuffer; + Dx = atof(DataBuffer.c_str()); + Dx = Dx; + ConfigFile >> DataBuffer; + Dy = atof(DataBuffer.c_str()); + Dy = Dy; + ConfigFile >> DataBuffer; + Dz = atof(DataBuffer.c_str()); + Dz = Dz; + + D = TVector3(Dx, Dy, Dz); + cout << "X128 Y128 corner position : (" << D.X() << ";" << D.Y() << ";" << D.Z() << ")" << endl; + } // End Position Method + + // Angle method + else if (DataBuffer.compare(0, 6, "THETA=") == 0) { + check_Theta = true; + ConfigFile >> DataBuffer; + Theta = atof(DataBuffer.c_str()); + Theta = Theta; + cout << "Theta: " << Theta << endl; + } + else if (DataBuffer.compare(0, 4, "PHI=") == 0) { + check_Phi = true; + ConfigFile >> DataBuffer; + Phi = atof(DataBuffer.c_str()); + Phi = Phi; + cout << "Phi: " << Phi << endl; + } + else if (DataBuffer.compare(0, 2, "R=") == 0) { + check_R = true; + ConfigFile >> DataBuffer; + R = atof(DataBuffer.c_str()); + R = R; + cout << "R: " << R << endl; + } + else if (DataBuffer.compare(0, 5, "BETA=") == 0) { + check_beta = true; + ConfigFile >> DataBuffer; + beta_u = atof(DataBuffer.c_str()); + beta_u = beta_u; + ConfigFile >> DataBuffer; + beta_v = atof(DataBuffer.c_str()); + beta_v = beta_v; + ConfigFile >> DataBuffer; + beta_w = atof(DataBuffer.c_str()); + beta_w = beta_w; + cout << "Beta: " << beta_u << " " << beta_v << " " << beta_w << endl; + } + + ///////////////////////////////////////////////// + // If All necessary information there, toggle out + if ( (check_A && check_B && check_C && check_D) || (check_Theta && check_Phi && check_R && check_beta) ) { + ReadingStatus = false; + + // Add The previously define telescope + // With position method + if ( check_A && check_B && check_C && check_D ) { + AddModule(A, B, C, D); + m_ModuleTest[m_index["Trapezoid1"] + m_NumberOfModule] = this; + } + + // with angle method + else if ( check_Theta && check_Phi && check_R && check_beta ) { + AddModule(Theta, Phi, R, beta_u, beta_v, beta_w); + m_ModuleTest[m_index["Trapezoid1"] + m_NumberOfModule] = this; + } + + // reset boolean flag for point positioning + check_A = false; + check_B = false; + check_C = false; + check_D = false; + // reset boolean flag for angle positioning + check_Theta = false; + check_Phi = false; + check_R = false; + check_beta = false; + + } // end test for adding a module + } // end while for reading block + } // end while for reading file + + cout << endl << "/////////////////////////////" << endl<<endl; +} + + + +void Hyde2TrackerTrapezoid1::PreTreat() +{ +} + + + +void Hyde2TrackerTrapezoid1::BuildPhysicalEvent() +{ + // Check flags +// bool Check_FirstStage = false; + bool Check_SecondStage = false; + bool Check_ThirdStage = false; + bool Check_FourthStage = false; + bool Check_FifthStage = false; + bool Check_SixthStage = false; + + // Thresholds +/* + double FirstStage_Front_E_Threshold = 0; double FirstStage_Front_T_Threshold = 0; + double FirstStage_Back_E_Threshold = 0; double FirstStage_Back_T_Threshold = 0; + double SecondStage_E_Threshold = 0; double SecondStage_T_Threshold = 0; + double ThirdStage_E_Threshold = 0; double ThirdStage_T_Threshold = 0; +*/ + // calculate multipicity in the first stage + int multXE = m_EventData->GetHYD2TrkFirstStageFrontEMult(); + int multYE = m_EventData->GetHYD2TrkFirstStageBackEMult(); + int multXT = m_EventData->GetHYD2TrkFirstStageFrontTMult(); + int multYT = m_EventData->GetHYD2TrkFirstStageBackTMult(); + // calculate multiplicity of 2nd and third stages + int mult2E = m_EventData->GetHYD2TrkSecondStageEMult(); + int mult2T = m_EventData->GetHYD2TrkSecondStageTMult(); + int mult3E = m_EventData->GetHYD2TrkThirdStageEMult(); + int mult3T = m_EventData->GetHYD2TrkThirdStageTMult(); + int mult4E = m_EventData->GetHYD2TrkFourthStageEMult(); + int mult4T = m_EventData->GetHYD2TrkFourthStageTMult(); + int mult5E = m_EventData->GetHYD2TrkFifthStageEMult(); + int mult5T = m_EventData->GetHYD2TrkFifthStageTMult(); + int mult6E = m_EventData->GetHYD2TrkSixthStageEMult(); + int mult6T = m_EventData->GetHYD2TrkSixthStageTMult(); + + // Deal with multiplicity 1 for the first layer + if (multXE==1 && multYE==1 && multXT==1 && multYT==1) { + // calculate detector number + int det_ref = m_EventData->GetHYD2TrkFirstStageFrontEDetectorNbr(0); + int detecXE = m_EventData->GetHYD2TrkFirstStageFrontEDetectorNbr(0) / det_ref; + int detecXT = m_EventData->GetHYD2TrkFirstStageFrontTDetectorNbr(0) / det_ref; + int detecYE = m_EventData->GetHYD2TrkFirstStageBackEDetectorNbr(0) / det_ref; + int detecYT = m_EventData->GetHYD2TrkFirstStageBackTDetectorNbr(0) / det_ref; + + // case of same detector + if (detecXE*detecXT*detecYE*detecYT == 1) { + // store module number + m_EventPhysics->SetModuleNumber(det_ref); + // calculate strip number + int stripXE = m_EventData->GetHYD2TrkFirstStageFrontEStripNbr(0); + int stripXT = m_EventData->GetHYD2TrkFirstStageFrontTStripNbr(0); + int stripYE = m_EventData->GetHYD2TrkFirstStageBackEStripNbr(0); + int stripYT = m_EventData->GetHYD2TrkFirstStageBackTStripNbr(0); + + // case of same strips on X and Y + if (stripXE == stripXT && stripYE == stripYT) { // here we have a good strip event + // various +// Check_FirstStage = true; + // store strip ID + m_EventPhysics->SetFirstStageFrontPosition(stripXE); + m_EventPhysics->SetFirstStageBackPosition(stripYE); + // get energy from strips and store it + double EnergyStripFront = m_EventData->GetHYD2TrkFirstStageFrontEEnergy(0); + m_EventPhysics->SetFirstStageEnergy(EnergyStripFront); + double EnergyTot = EnergyStripFront; + // get time from strips and store it + double TimeStripBack = m_EventData->GetHYD2TrkFirstStageBackEEnergy(0); + m_EventPhysics->SetFirstStageTime(TimeStripBack); + + // check if we have a 2nd stage event + if (mult2E==1 && mult2T==1) { + Check_SecondStage = true; + double EnergySecond = m_EventData->GetHYD2TrkSecondStageEEnergy(0); + m_EventPhysics->SetSecondStageEnergy(EnergySecond); + EnergyTot += EnergySecond; + } + else if (mult2E>1 || mult2T>1) { + cout << "Warning: multiplicity in second stage greater than in firststage" << endl; + } + + // check if we have a third stage event + if (mult3E==1 && mult3T==1) { + Check_ThirdStage = true; + double EnergyThird = m_EventData->GetHYD2TrkThirdStageEEnergy(0); + m_EventPhysics->SetThirdStageEnergy(EnergyThird); + EnergyTot += EnergyThird; + } + else if (mult3E>1 || mult3T>1) { + cout << "Warning: multiplicity in third stage greater than in firststage" << endl; + } + + // check if we have a fourth stage event + if (mult4E==1 && mult4T==1) { + Check_FourthStage = true; + double EnergyFourth = m_EventData->GetHYD2TrkFourthStageEEnergy(0); + m_EventPhysics->SetFourthStageEnergy(EnergyFourth); + EnergyTot += EnergyFourth; + } + else if (mult4E>1 || mult4T>1) { + cout << "Warning: multiplicity in fourth stage greater than in firststage" << endl; + } + + // check if we have a fifth stage event + if (mult5E==1 && mult5T==1) { + Check_FifthStage = true; + double EnergyFifth = m_EventData->GetHYD2TrkFifthStageEEnergy(0); + m_EventPhysics->SetFifthStageEnergy(EnergyFifth); + EnergyTot += EnergyFifth; + } + else if (mult5E>1 || mult5T>1) { + cout << "Warning: multiplicity in fifth stage greater than in firststage" << endl; + } + + // check if we have a sixth stage event + if (mult6E==1 && mult6T==1) { + Check_SixthStage = true; + double EnergySixth = m_EventData->GetHYD2TrkSixthStageEEnergy(0); + m_EventPhysics->SetSixthStageEnergy(EnergySixth); + EnergyTot += EnergySixth; + } + else if (mult6E>1 || mult6T>1) { + cout << "Warning: multiplicity in sixth stage greater than in firststage" << endl; + } + + // Fill total energy + m_EventPhysics->SetTotalEnergy(EnergyTot); + + // Fill default values for second an third stages + if (!Check_SecondStage) { + m_EventPhysics->SetSecondStageEnergy(-1000); + m_EventPhysics->SetSecondStageTime(-1000); + m_EventPhysics->SetSecondStagePosition(-1000); + } + if (!Check_ThirdStage) { + m_EventPhysics->SetThirdStageEnergy(-1000); + m_EventPhysics->SetThirdStageTime(-1000); + m_EventPhysics->SetThirdStagePosition(-1000); + } + if (!Check_FourthStage) { + m_EventPhysics->SetFourthStageEnergy(-1000); + m_EventPhysics->SetFourthStageTime(-1000); + m_EventPhysics->SetFourthStagePosition(-1000); + } + if (!Check_FifthStage) { + m_EventPhysics->SetFifthStageEnergy(-1000); + m_EventPhysics->SetFifthStageTime(-1000); + m_EventPhysics->SetFifthStagePosition(-1000); + } + if (!Check_SixthStage) { + m_EventPhysics->SetSixthStageEnergy(-1000); + m_EventPhysics->SetSixthStageTime(-1000); + m_EventPhysics->SetSixthStagePosition(-1000); + } + } + else { + cout << "Not same strips" << endl; + } + } + else { + cout << "Not same detector" << endl; + } + } + else { +/* cout << "Multiplicity is not one, it is: " << endl; + cout << "\tmultXE: " << multXE << endl; + cout << "\tmultXT: " << multXT << endl; + cout << "\tmultYE: " << multYE << endl; + cout << "\tmultYT: " << multYT << endl;*/ + } +} + + + +void Hyde2TrackerTrapezoid1::BuildSimplePhysicalEvent() +{ +} + + + +void Hyde2TrackerTrapezoid1::AddModule(TVector3 C_X1_Y1, + TVector3 C_X128_Y1, + TVector3 C_X1_Y128, + TVector3 C_X128_Y128) +{ + m_NumberOfModule++; + + // Definition of vectors U and V are *identical* with definition + // in NPS. + // Vector U parallel to BaseLarge + TVector3 U = C_X128_Y1 - C_X1_Y1; + U = U.Unit(); + + // Vector V parallel to height + TVector3 V = 0.5 * (C_X1_Y128 + C_X128_Y128 - C_X1_Y1 - C_X128_Y1); + V = V.Unit(); + + // Position Vector of Strip Center + TVector3 StripCenter = TVector3(0,0,0); + // Position Vector of X=1 Y=1 Strip + TVector3 Strip_1_1; + + // Buffer object to fill Position Array + vector<double> lineX; + vector<double> lineY; + vector<double> lineZ; + + vector< vector< double > > OneModuleStripPositionX; + vector< vector< double > > OneModuleStripPositionY; + vector< vector< double > > OneModuleStripPositionZ; + + // Moving StripCenter to 1.1 corner: + Strip_1_1 = C_X1_Y1 + m_StripPitchX/2*U + m_StripPitchY/2*V; + + for (int i = 0; i < m_NumberOfStripsX; i++) { + lineX.clear(); + lineY.clear(); + lineZ.clear(); + + for (int j = 0; j < m_NumberOfStripsY; j++) { + StripCenter = Strip_1_1 + i*m_StripPitchX*U + j*m_StripPitchY*V; + + lineX.push_back( StripCenter.X() ); + lineY.push_back( StripCenter.Y() ); + lineZ.push_back( StripCenter.Z() ); + } + + OneModuleStripPositionX.push_back(lineX); + OneModuleStripPositionY.push_back(lineY); + OneModuleStripPositionZ.push_back(lineZ); + } + + m_StripPositionX.push_back( OneModuleStripPositionX ); + m_StripPositionY.push_back( OneModuleStripPositionY ); + m_StripPositionZ.push_back( OneModuleStripPositionZ ); +} + + + +void Hyde2TrackerTrapezoid1::AddModule(double theta, + double phi, + double distance, + double beta_u, + double beta_v, + double beta_w) +{ + m_NumberOfModule++; + + // convert from degree to radian: + theta *= M_PI/180; + phi *= M_PI/180; + + // Vector U on Module Face (paralelle to Y Strip) (NB: remember that Y strip are allong X axis) + TVector3 U ; + // Vector V on Module Face (parallele to X Strip) + TVector3 V ; + // Vector W normal to Module Face (pointing CsI) + TVector3 W ; + // Vector position of Module Face center + TVector3 C ; + + C = TVector3(distance * sin(theta) * cos(phi), + distance * sin(theta) * sin(phi), + distance * cos(theta)); + + TVector3 YperpW = TVector3( cos(theta) * cos(phi), + cos(theta) * sin(phi), + -sin(theta)); + + W = C.Unit(); + U = W.Cross(YperpW); + V = W.Cross(U); + + U = U.Unit(); + V = V.Unit(); + + U.Rotate( beta_u * M_PI/180. , U ) ; + V.Rotate( beta_u * M_PI/180. , U ) ; + + U.Rotate( beta_v * M_PI/180. , V ) ; + V.Rotate( beta_v * M_PI/180. , V ) ; + + U.Rotate( beta_w * M_PI/180. , W ) ; + V.Rotate( beta_w * M_PI/180. , W ) ; + + double Face = 50; // mm + double NumberOfStrip = 100; + double StripPitch = Face/NumberOfStrip; // mm + + vector<double> lineX; + vector<double> lineY; + vector<double> lineZ; + + vector< vector< double > > OneModuleStripPositionX; + vector< vector< double > > OneModuleStripPositionY; + vector< vector< double > > OneModuleStripPositionZ; + + double X, Y, Z; + + // Moving C to the 1.1 corner: + C.SetX( C.X() - ( Face/2 - StripPitch/2 ) * ( V.X() + U.X() ) ) ; + C.SetY( C.Y() - ( Face/2 - StripPitch/2 ) * ( V.Y() + U.Y() ) ) ; + C.SetZ( C.Z() - ( Face/2 - StripPitch/2 ) * ( V.Z() + U.Z() ) ) ; + + for (int i = 0; i < NumberOfStrip; i++) { + lineX.clear(); + lineY.clear(); + lineZ.clear(); + + for (int j = 0; j < NumberOfStrip; j++) { + X = C.X() + StripPitch * ( U.X()*i + V.X()*j ); + Y = C.Y() + StripPitch * ( U.Y()*i + V.Y()*j ); + Z = C.Z() + StripPitch * ( U.Z()*i + V.Z()*j ); + + lineX.push_back(X); + lineY.push_back(Y); + lineZ.push_back(Z); + } + + OneModuleStripPositionX.push_back(lineX); + OneModuleStripPositionY.push_back(lineY); + OneModuleStripPositionZ.push_back(lineZ); + } + + m_StripPositionX.push_back( OneModuleStripPositionX ); + m_StripPositionY.push_back( OneModuleStripPositionY ); + m_StripPositionZ.push_back( OneModuleStripPositionZ ); +} diff --git a/NPLib/HYDE2/Hyde2TrackerTrapezoid1.h b/NPLib/HYDE2/Hyde2TrackerTrapezoid1.h new file mode 100644 index 0000000000000000000000000000000000000000..d747be07d436035c67330e14b855abed3da59092 --- /dev/null +++ b/NPLib/HYDE2/Hyde2TrackerTrapezoid1.h @@ -0,0 +1,102 @@ +#ifndef Hyde2TrackerTrapezoid1_h +#define Hyde2TrackerTrapezoid1_h 1 + +// C++ headers +#include <string> +#include <map> +#include <vector> + +// ROOT headers +#include "TVector3.h" + +// Hyde2 headers +#include "THyde2TrackerData.h" +#include "THyde2TrackerPhysics.h" +#include "Hyde2TrackerModule.h" + +using namespace std; + + + +class Hyde2TrackerTrapezoid1 : public Hyde2TrackerModule +{ +public: + //////////////////////////////////////////////////// + /////// Default Constructor and Destructor ///////// + //////////////////////////////////////////////////// + Hyde2TrackerTrapezoid1(map<int, Hyde2TrackerModule*> &Module, THyde2TrackerPhysics* &EventPhysics); + virtual ~Hyde2TrackerTrapezoid1(); + +public: + //////////////////////////////////////////////////// + //// Inherite from Hyde2TrackerModule class ///// + //////////////////////////////////////////////////// + // Read stream at Configfile to pick-up parameters of detector (Position,...) + void ReadConfiguration(string Path); + + // The goal of this method is to extract physical parameters from raw data + // Method called at each event read from the Input Tree + void BuildPhysicalEvent(); + + // Same as before but with a simpler treatment + void BuildSimplePhysicalEvent(); + +private: + map<int, Hyde2TrackerModule*> &m_ModuleTest; + THyde2TrackerPhysics* &m_EventPhysics; + +public: + void SetHyde2DataPointer(THyde2TrackerData* hyde2Data) {m_EventData = hyde2Data;}; + void PreTreat(); + +private: + // Hyde2 data coming from THyde2TrackerPhysics through the + // SetHyde2DataPointer method + THyde2TrackerData* m_EventData; + THyde2TrackerData* m_PreTreatData; + +public: + //////////////////////////////// + // Specific to Hyde2Tracker // + //////////////////////////////// + // Add a Module using Corner Coordinate information + void AddModule(TVector3 C_X1_Y1, + TVector3 C_X128_Y1, + TVector3 C_X1_Y128, + TVector3 C_X128_Y128); + + // Add a Module using R Theta Phi of Si center information + void AddModule(double theta, + double phi, + double distance, + double beta_u, + double beta_v, + double beta_w); + + // Getters to retrieve the (X,Y,Z) coordinates of a pixel defined by strips (X,Y) + double GetStripPositionX(int N ,int X ,int Y) { return m_StripPositionX[N-1-m_index["Trapezoid1"]][X-1][Y-1]; } + double GetStripPositionY(int N ,int X ,int Y) { return m_StripPositionY[N-1-m_index["Trapezoid1"]][X-1][Y-1]; } + double GetStripPositionZ(int N ,int X ,int Y) { return m_StripPositionZ[N-1-m_index["Trapezoid1"]][X-1][Y-1]; } + double GetNumberOfModule() { return m_NumberOfModule; } + +private: + // Spatial Position of Strip Calculated on basis of detector position + int m_NumberOfModule; + vector< vector < vector < double > > > m_StripPositionX; + vector< vector < vector < double > > > m_StripPositionY; + vector< vector < vector < double > > > m_StripPositionZ; + +private: + ////////////////////////////// + // Geometry and stip number // + ////////////////////////////// + double m_FirstStageHeight; // mm + double m_FirstStageBaseLarge; // mm + double m_FirstStageBaseSmall; // mm + int m_NumberOfStripsX; + int m_NumberOfStripsY; + double m_StripPitchX; // mm + double m_StripPitchY; // mm +}; + +#endif diff --git a/NPLib/HYDE2/Hyde2TrackerTrapezoid2.cxx b/NPLib/HYDE2/Hyde2TrackerTrapezoid2.cxx new file mode 100644 index 0000000000000000000000000000000000000000..d8e9dbac966e6904b62234b4abf0780c1f34c716 --- /dev/null +++ b/NPLib/HYDE2/Hyde2TrackerTrapezoid2.cxx @@ -0,0 +1,560 @@ +#include "Hyde2TrackerTrapezoid2.h" + +// C++ headers +#include <limits> +#include <iostream> +#include <fstream> +#include <string> +#include <cmath> +#include <stdlib.h> + +// Hyde2 +#include "THyde2TrackerPhysics.h" + + +Hyde2TrackerTrapezoid2::Hyde2TrackerTrapezoid2(map<int, Hyde2TrackerModule*> &Module, + THyde2TrackerPhysics* &EventPhysics) + : m_ModuleTest(Module), + m_EventPhysics(EventPhysics), + m_EventData(0), + m_PreTreatData(new THyde2TrackerData), + m_NumberOfModule(0), + m_FirstStageHeight(50.52), // mm + m_FirstStageBaseLarge(51.62), // mm + m_FirstStageBaseSmall(20.30), // mm + m_NumberOfStripsX(129), + m_NumberOfStripsY(126) +{ + m_StripPitchX = m_FirstStageBaseLarge / (double)m_NumberOfStripsX; + m_StripPitchY = m_FirstStageHeight / (double)m_NumberOfStripsY; +} + + + +Hyde2TrackerTrapezoid2::~Hyde2TrackerTrapezoid2() +{ + delete m_PreTreatData; +} + + + +void Hyde2TrackerTrapezoid2::ReadConfiguration(string Path) +{ + ifstream ConfigFile; + ConfigFile.open(Path.c_str()); + string LineBuffer; + string DataBuffer; + + // A:X1_Y1 --> X:1 Y:1 + // B:X128_Y1 --> X:128 Y:1 + // C:X1_Y128 --> X:1 Y:128 + // D:X128_Y128 --> X:128 Y:128 + + double Ax, Bx, Cx, Dx, Ay, By, Cy, Dy, Az, Bz, Cz, Dz; + TVector3 A, B, C, D; + double Theta = 0, Phi = 0, R = 0, beta_u = 0 , beta_v = 0 , beta_w = 0; + + bool check_A = false; + bool check_C = false; + bool check_B = false; + bool check_D = false; + + bool check_Theta = false; + bool check_Phi = false; + bool check_R = false; + bool check_beta = false; + + bool ReadingStatus = false; + + while (!ConfigFile.eof()) { + getline(ConfigFile, LineBuffer); + + // If line is a Hyde2XXX bloc, reading toggle to true + // and toggle to true flags indicating which shape is treated. + if (LineBuffer.compare(0, 14, "HYD2Trapezoid2") == 0) { + cout << "///////////////////////" << endl; + cout << "Trapezoid2 module found:" << endl; + ReadingStatus = true; + } + + // Reading Block + while (ReadingStatus) { + ConfigFile >> DataBuffer ; + // Comment Line + if (DataBuffer.compare(0, 1, "%") == 0) { + ConfigFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n' ); + } + // Finding another telescope (safety), toggle out + else if (DataBuffer.compare(0, 14, "HYD2Trapezoid2") == 0) { + cout << "WARNING: Another Module is find before standard sequence of Token, Error may occured in Telecope definition" << endl; + ReadingStatus = false; + } + + // Position method + else if (DataBuffer.compare(0, 6, "X1_Y1=") == 0) { + check_A = true; + ConfigFile >> DataBuffer; + Ax = atof(DataBuffer.c_str()); + Ax = Ax; + ConfigFile >> DataBuffer; + Ay = atof(DataBuffer.c_str()); + Ay = Ay; + ConfigFile >> DataBuffer; + Az = atof(DataBuffer.c_str()); + Az = Az; + + A = TVector3(Ax, Ay, Az); + cout << "X1 Y1 corner position : (" << A.X() << ";" << A.Y() << ";" << A.Z() << ")" << endl; + } + else if (DataBuffer.compare(0, 8, "X128_Y1=") == 0) { + check_B = true; + ConfigFile >> DataBuffer; + Bx = atof(DataBuffer.c_str()); + Bx = Bx; + ConfigFile >> DataBuffer; + By = atof(DataBuffer.c_str()); + By = By; + ConfigFile >> DataBuffer; + Bz = atof(DataBuffer.c_str()); + Bz = Bz; + + B = TVector3(Bx, By, Bz); + cout << "X128 Y1 corner position : (" << B.X() << ";" << B.Y() << ";" << B.Z() << ")" << endl; + } + else if (DataBuffer.compare(0, 8, "X1_Y128=") == 0) { + check_C = true; + ConfigFile >> DataBuffer; + Cx = atof(DataBuffer.c_str()); + Cx = Cx; + ConfigFile >> DataBuffer; + Cy = atof(DataBuffer.c_str()); + Cy = Cy; + ConfigFile >> DataBuffer; + Cz = atof(DataBuffer.c_str()); + Cz = Cz; + + C = TVector3(Cx, Cy, Cz); + cout << "X1 Y128 corner position : (" << C.X() << ";" << C.Y() << ";" << C.Z() << ")" << endl; + } + else if (DataBuffer.compare(0, 10, "X128_Y128=") == 0) { + check_D = true; + ConfigFile >> DataBuffer; + Dx = atof(DataBuffer.c_str()); + Dx = Dx; + ConfigFile >> DataBuffer; + Dy = atof(DataBuffer.c_str()); + Dy = Dy; + ConfigFile >> DataBuffer; + Dz = atof(DataBuffer.c_str()); + Dz = Dz; + + D = TVector3(Dx, Dy, Dz); + cout << "X128 Y128 corner position : (" << D.X() << ";" << D.Y() << ";" << D.Z() << ")" << endl; + } // End Position Method + + // Angle method + else if (DataBuffer.compare(0, 6, "THETA=") == 0) { + check_Theta = true; + ConfigFile >> DataBuffer; + Theta = atof(DataBuffer.c_str()); + Theta = Theta; + cout << "Theta: " << Theta << endl; + } + else if (DataBuffer.compare(0, 4, "PHI=") == 0) { + check_Phi = true; + ConfigFile >> DataBuffer; + Phi = atof(DataBuffer.c_str()); + Phi = Phi; + cout << "Phi: " << Phi << endl; + } + else if (DataBuffer.compare(0, 2, "R=") == 0) { + check_R = true; + ConfigFile >> DataBuffer; + R = atof(DataBuffer.c_str()); + R = R; + cout << "R: " << R << endl; + } + else if (DataBuffer.compare(0, 5, "BETA=") == 0) { + check_beta = true; + ConfigFile >> DataBuffer; + beta_u = atof(DataBuffer.c_str()); + beta_u = beta_u; + ConfigFile >> DataBuffer; + beta_v = atof(DataBuffer.c_str()); + beta_v = beta_v; + ConfigFile >> DataBuffer; + beta_w = atof(DataBuffer.c_str()); + beta_w = beta_w; + cout << "Beta: " << beta_u << " " << beta_v << " " << beta_w << endl; + } + + ///////////////////////////////////////////////// + // If All necessary information there, toggle out + if ( (check_A && check_B && check_C && check_D) || (check_Theta && check_Phi && check_R && check_beta) ) { + ReadingStatus = false; + + // Add The previously define telescope + // With position method + if ( check_A && check_B && check_C && check_D ) { + AddModule(A, B, C, D); + m_ModuleTest[m_index["Trapezoid2"] + m_NumberOfModule] = this; + } + + // with angle method + else if ( check_Theta && check_Phi && check_R && check_beta ) { + AddModule(Theta, Phi, R, beta_u, beta_v, beta_w); + m_ModuleTest[m_index["Trapezoid2"] + m_NumberOfModule] = this; + } + + // reset boolean flag for point positioning + check_A = false; + check_B = false; + check_C = false; + check_D = false; + // reset boolean flag for angle positioning + check_Theta = false; + check_Phi = false; + check_R = false; + check_beta = false; + + } // end test for adding a module + } // end while for reading block + } // end while for reading file + + cout << endl << "/////////////////////////////" << endl<<endl; +} + + + +void Hyde2TrackerTrapezoid2::PreTreat() +{ +} + + + +void Hyde2TrackerTrapezoid2::BuildPhysicalEvent() +{ + // Check flags +// bool Check_FirstStage = false; + bool Check_SecondStage = false; + bool Check_ThirdStage = false; + bool Check_FourthStage = false; + bool Check_FifthStage = false; + bool Check_SixthStage = false; + + // Thresholds +/* + double FirstStage_Front_E_Threshold = 0; double FirstStage_Front_T_Threshold = 0; + double FirstStage_Back_E_Threshold = 0; double FirstStage_Back_T_Threshold = 0; + double SecondStage_E_Threshold = 0; double SecondStage_T_Threshold = 0; + double ThirdStage_E_Threshold = 0; double ThirdStage_T_Threshold = 0; +*/ + // calculate multipicity in the first stage + int multXE = m_EventData->GetHYD2TrkFirstStageFrontEMult(); + int multYE = m_EventData->GetHYD2TrkFirstStageBackEMult(); + int multXT = m_EventData->GetHYD2TrkFirstStageFrontTMult(); + int multYT = m_EventData->GetHYD2TrkFirstStageBackTMult(); + // calculate multiplicity of 2nd and third stages + int mult2E = m_EventData->GetHYD2TrkSecondStageEMult(); + int mult2T = m_EventData->GetHYD2TrkSecondStageTMult(); + int mult3E = m_EventData->GetHYD2TrkThirdStageEMult(); + int mult3T = m_EventData->GetHYD2TrkThirdStageTMult(); + int mult4E = m_EventData->GetHYD2TrkFourthStageEMult(); + int mult4T = m_EventData->GetHYD2TrkFourthStageTMult(); + int mult5E = m_EventData->GetHYD2TrkFifthStageEMult(); + int mult5T = m_EventData->GetHYD2TrkFifthStageTMult(); + int mult6E = m_EventData->GetHYD2TrkSixthStageEMult(); + int mult6T = m_EventData->GetHYD2TrkSixthStageTMult(); + + // Deal with multiplicity 1 for the first layer + if (multXE==1 && multYE==1 && multXT==1 && multYT==1) { + // calculate detector number + int det_ref = m_EventData->GetHYD2TrkFirstStageFrontEDetectorNbr(0); + int detecXE = m_EventData->GetHYD2TrkFirstStageFrontEDetectorNbr(0) / det_ref; + int detecXT = m_EventData->GetHYD2TrkFirstStageFrontTDetectorNbr(0) / det_ref; + int detecYE = m_EventData->GetHYD2TrkFirstStageBackEDetectorNbr(0) / det_ref; + int detecYT = m_EventData->GetHYD2TrkFirstStageBackTDetectorNbr(0) / det_ref; + + // case of same detector + if (detecXE*detecXT*detecYE*detecYT == 1) { + // store module number + m_EventPhysics->SetModuleNumber(det_ref); + // calculate strip number + int stripXE = m_EventData->GetHYD2TrkFirstStageFrontEStripNbr(0); + int stripXT = m_EventData->GetHYD2TrkFirstStageFrontTStripNbr(0); + int stripYE = m_EventData->GetHYD2TrkFirstStageBackEStripNbr(0); + int stripYT = m_EventData->GetHYD2TrkFirstStageBackTStripNbr(0); + + // case of same strips on X and Y + if (stripXE == stripXT && stripYE == stripYT) { // here we have a good strip event + // various +// Check_FirstStage = true; + // store strip ID + m_EventPhysics->SetFirstStageFrontPosition(stripXE); + m_EventPhysics->SetFirstStageBackPosition(stripYE); + // get energy from strips and store it + double EnergyStripFront = m_EventData->GetHYD2TrkFirstStageFrontEEnergy(0); + m_EventPhysics->SetFirstStageEnergy(EnergyStripFront); + double EnergyTot = EnergyStripFront; + // get time from strips and store it + double TimeStripBack = m_EventData->GetHYD2TrkFirstStageBackEEnergy(0); + m_EventPhysics->SetFirstStageTime(TimeStripBack); + + // check if we have a 2nd stage event + if (mult2E==1 && mult2T==1) { + Check_SecondStage = true; + double EnergySecond = m_EventData->GetHYD2TrkSecondStageEEnergy(0); + m_EventPhysics->SetSecondStageEnergy(EnergySecond); + EnergyTot += EnergySecond; + } + else if (mult2E>1 || mult2T>1) { + cout << "Warning: multiplicity in second stage greater than in firststage" << endl; + } + + // check if we have a third stage event + if (mult3E==1 && mult3T==1) { + Check_ThirdStage = true; + double EnergyThird = m_EventData->GetHYD2TrkThirdStageEEnergy(0); + m_EventPhysics->SetThirdStageEnergy(EnergyThird); + EnergyTot += EnergyThird; + } + else if (mult3E>1 || mult3T>1) { + cout << "Warning: multiplicity in third stage greater than in firststage" << endl; + } + + // check if we have a fourth stage event + if (mult4E==1 && mult4T==1) { + Check_FourthStage = true; + double EnergyFourth = m_EventData->GetHYD2TrkFourthStageEEnergy(0); + m_EventPhysics->SetFourthStageEnergy(EnergyFourth); + EnergyTot += EnergyFourth; + } + else if (mult4E>1 || mult4T>1) { + cout << "Warning: multiplicity in fourth stage greater than in firststage" << endl; + } + + // check if we have a fifth stage event + if (mult5E==1 && mult5T==1) { + Check_FifthStage = true; + double EnergyFifth = m_EventData->GetHYD2TrkFifthStageEEnergy(0); + m_EventPhysics->SetFifthStageEnergy(EnergyFifth); + EnergyTot += EnergyFifth; + } + else if (mult5E>1 || mult5T>1) { + cout << "Warning: multiplicity in fifth stage greater than in firststage" << endl; + } + + // check if we have a sixth stage event + if (mult6E==1 && mult6T==1) { + Check_SixthStage = true; + double EnergySixth = m_EventData->GetHYD2TrkSixthStageEEnergy(0); + m_EventPhysics->SetSixthStageEnergy(EnergySixth); + EnergyTot += EnergySixth; + } + else if (mult6E>1 || mult6T>1) { + cout << "Warning: multiplicity in sixth stage greater than in firststage" << endl; + } + + // Fill total energy + m_EventPhysics->SetTotalEnergy(EnergyTot); + + // Fill default values for second an third stages + if (!Check_SecondStage) { + m_EventPhysics->SetSecondStageEnergy(-1000); + m_EventPhysics->SetSecondStageTime(-1000); + m_EventPhysics->SetSecondStagePosition(-1000); + } + if (!Check_ThirdStage) { + m_EventPhysics->SetThirdStageEnergy(-1000); + m_EventPhysics->SetThirdStageTime(-1000); + m_EventPhysics->SetThirdStagePosition(-1000); + } + if (!Check_FourthStage) { + m_EventPhysics->SetFourthStageEnergy(-1000); + m_EventPhysics->SetFourthStageTime(-1000); + m_EventPhysics->SetFourthStagePosition(-1000); + } + if (!Check_FifthStage) { + m_EventPhysics->SetFifthStageEnergy(-1000); + m_EventPhysics->SetFifthStageTime(-1000); + m_EventPhysics->SetFifthStagePosition(-1000); + } + if (!Check_SixthStage) { + m_EventPhysics->SetSixthStageEnergy(-1000); + m_EventPhysics->SetSixthStageTime(-1000); + m_EventPhysics->SetSixthStagePosition(-1000); + } + } + else { + cout << "Not same strips" << endl; + } + } + else { + cout << "Not same detector" << endl; + } + } + else { +/* cout << "Multiplicity is not one, it is: " << endl; + cout << "\tmultXE: " << multXE << endl; + cout << "\tmultXT: " << multXT << endl; + cout << "\tmultYE: " << multYE << endl; + cout << "\tmultYT: " << multYT << endl;*/ + } +} + + + +void Hyde2TrackerTrapezoid2::BuildSimplePhysicalEvent() +{ +} + + + +void Hyde2TrackerTrapezoid2::AddModule(TVector3 C_X1_Y1, + TVector3 C_X128_Y1, + TVector3 C_X1_Y128, + TVector3 C_X128_Y128) +{ + m_NumberOfModule++; + + // Definition of vectors U and V are *identical* with definition + // in NPS. + // Vector U parallel to BaseLarge + TVector3 U = C_X128_Y1 - C_X1_Y1; + U = U.Unit(); + + // Vector V parallel to height + TVector3 V = 0.5 * (C_X1_Y128 + C_X128_Y128 - C_X1_Y1 - C_X128_Y1); + V = V.Unit(); + + // Position Vector of Strip Center + TVector3 StripCenter = TVector3(0,0,0); + // Position Vector of X=1 Y=1 Strip + TVector3 Strip_1_1; + + // Buffer object to fill Position Array + vector<double> lineX; + vector<double> lineY; + vector<double> lineZ; + + vector< vector< double > > OneModuleStripPositionX; + vector< vector< double > > OneModuleStripPositionY; + vector< vector< double > > OneModuleStripPositionZ; + + // Moving StripCenter to 1.1 corner: + Strip_1_1 = C_X1_Y1 + m_StripPitchX/2*U + m_StripPitchY/2*V; + + for (int i = 0; i < m_NumberOfStripsX; i++) { + lineX.clear(); + lineY.clear(); + lineZ.clear(); + + for (int j = 0; j < m_NumberOfStripsY; j++) { + StripCenter = Strip_1_1 + i*m_StripPitchX*U + j*m_StripPitchY*V; + + lineX.push_back( StripCenter.X() ); + lineY.push_back( StripCenter.Y() ); + lineZ.push_back( StripCenter.Z() ); + } + + OneModuleStripPositionX.push_back(lineX); + OneModuleStripPositionY.push_back(lineY); + OneModuleStripPositionZ.push_back(lineZ); + } + + m_StripPositionX.push_back( OneModuleStripPositionX ); + m_StripPositionY.push_back( OneModuleStripPositionY ); + m_StripPositionZ.push_back( OneModuleStripPositionZ ); +} + + + +void Hyde2TrackerTrapezoid2::AddModule(double theta, + double phi, + double distance, + double beta_u, + double beta_v, + double beta_w) +{ + m_NumberOfModule++; + + // convert from degree to radian: + theta *= M_PI/180; + phi *= M_PI/180; + + // Vector U on Module Face (paralelle to Y Strip) (NB: remember that Y strip are allong X axis) + TVector3 U ; + // Vector V on Module Face (parallele to X Strip) + TVector3 V ; + // Vector W normal to Module Face (pointing CsI) + TVector3 W ; + // Vector position of Module Face center + TVector3 C ; + + C = TVector3(distance * sin(theta) * cos(phi), + distance * sin(theta) * sin(phi), + distance * cos(theta)); + + TVector3 YperpW = TVector3( cos(theta) * cos(phi), + cos(theta) * sin(phi), + -sin(theta)); + + W = C.Unit(); + U = W.Cross(YperpW); + V = W.Cross(U); + + U = U.Unit(); + V = V.Unit(); + + U.Rotate( beta_u * M_PI/180. , U ) ; + V.Rotate( beta_u * M_PI/180. , U ) ; + + U.Rotate( beta_v * M_PI/180. , V ) ; + V.Rotate( beta_v * M_PI/180. , V ) ; + + U.Rotate( beta_w * M_PI/180. , W ) ; + V.Rotate( beta_w * M_PI/180. , W ) ; + + double Face = 50; // mm + double NumberOfStrip = 100; + double StripPitch = Face/NumberOfStrip; // mm + + vector<double> lineX; + vector<double> lineY; + vector<double> lineZ; + + vector< vector< double > > OneModuleStripPositionX; + vector< vector< double > > OneModuleStripPositionY; + vector< vector< double > > OneModuleStripPositionZ; + + double X, Y, Z; + + // Moving C to the 1.1 corner: + C.SetX( C.X() - ( Face/2 - StripPitch/2 ) * ( V.X() + U.X() ) ) ; + C.SetY( C.Y() - ( Face/2 - StripPitch/2 ) * ( V.Y() + U.Y() ) ) ; + C.SetZ( C.Z() - ( Face/2 - StripPitch/2 ) * ( V.Z() + U.Z() ) ) ; + + for (int i = 0; i < NumberOfStrip; i++) { + lineX.clear(); + lineY.clear(); + lineZ.clear(); + + for (int j = 0; j < NumberOfStrip; j++) { + X = C.X() + StripPitch * ( U.X()*i + V.X()*j ); + Y = C.Y() + StripPitch * ( U.Y()*i + V.Y()*j ); + Z = C.Z() + StripPitch * ( U.Z()*i + V.Z()*j ); + + lineX.push_back(X); + lineY.push_back(Y); + lineZ.push_back(Z); + } + + OneModuleStripPositionX.push_back(lineX); + OneModuleStripPositionY.push_back(lineY); + OneModuleStripPositionZ.push_back(lineZ); + } + + m_StripPositionX.push_back( OneModuleStripPositionX ); + m_StripPositionY.push_back( OneModuleStripPositionY ); + m_StripPositionZ.push_back( OneModuleStripPositionZ ); +} diff --git a/NPLib/HYDE2/Hyde2TrackerTrapezoid2.h b/NPLib/HYDE2/Hyde2TrackerTrapezoid2.h new file mode 100644 index 0000000000000000000000000000000000000000..7959cbf03b6a817764ac09a7a6974c0784c32350 --- /dev/null +++ b/NPLib/HYDE2/Hyde2TrackerTrapezoid2.h @@ -0,0 +1,102 @@ +#ifndef Hyde2TrackerTrapezoid2_h +#define Hyde2TrackerTrapezoid2_h 1 + +// C++ headers +#include <string> +#include <map> +#include <vector> + +// ROOT headers +#include "TVector3.h" + +// Hyde2 headers +#include "THyde2TrackerData.h" +#include "THyde2TrackerPhysics.h" +#include "Hyde2TrackerModule.h" + +using namespace std; + + + +class Hyde2TrackerTrapezoid2 : public Hyde2TrackerModule +{ +public: + //////////////////////////////////////////////////// + /////// Default Constructor and Destructor ///////// + //////////////////////////////////////////////////// + Hyde2TrackerTrapezoid2(map<int, Hyde2TrackerModule*> &Module, THyde2TrackerPhysics* &EventPhysics); + virtual ~Hyde2TrackerTrapezoid2(); + +public: + //////////////////////////////////////////////////// + //// Inherite from Hyde2TrackerModule class ///// + //////////////////////////////////////////////////// + // Read stream at Configfile to pick-up parameters of detector (Position,...) + void ReadConfiguration(string Path); + + // The goal of this method is to extract physical parameters from raw data + // Method called at each event read from the Input Tree + void BuildPhysicalEvent(); + + // Same as before but with a simpler treatment + void BuildSimplePhysicalEvent(); + +private: + map<int, Hyde2TrackerModule*> &m_ModuleTest; + THyde2TrackerPhysics* &m_EventPhysics; + +public: + void SetHyde2DataPointer(THyde2TrackerData* hyde2Data) {m_EventData = hyde2Data;}; + void PreTreat(); + +private: + // Hyde2 data coming from THyde2TrackerPhysics through the + // SetHyde2DataPointer method + THyde2TrackerData* m_EventData; + THyde2TrackerData* m_PreTreatData; + +public: + //////////////////////////////// + // Specific to Hyde2Tracker // + //////////////////////////////// + // Add a Module using Corner Coordinate information + void AddModule(TVector3 C_X1_Y1, + TVector3 C_X128_Y1, + TVector3 C_X1_Y128, + TVector3 C_X128_Y128); + + // Add a Module using R Theta Phi of Si center information + void AddModule(double theta, + double phi, + double distance, + double beta_u, + double beta_v, + double beta_w); + + // Getters to retrieve the (X,Y,Z) coordinates of a pixel defined by strips (X,Y) + double GetStripPositionX(int N ,int X ,int Y) { return m_StripPositionX[N-1-m_index["Trapezoid2"]][X-1][Y-1]; } + double GetStripPositionY(int N ,int X ,int Y) { return m_StripPositionY[N-1-m_index["Trapezoid2"]][X-1][Y-1]; } + double GetStripPositionZ(int N ,int X ,int Y) { return m_StripPositionZ[N-1-m_index["Trapezoid2"]][X-1][Y-1]; } + double GetNumberOfModule() { return m_NumberOfModule; } + +private: + // Spatial Position of Strip Calculated on basis of detector position + int m_NumberOfModule; + vector< vector < vector < double > > > m_StripPositionX; + vector< vector < vector < double > > > m_StripPositionY; + vector< vector < vector < double > > > m_StripPositionZ; + +private: + ////////////////////////////// + // Geometry and stip number // + ////////////////////////////// + double m_FirstStageHeight; // mm + double m_FirstStageBaseLarge; // mm + double m_FirstStageBaseSmall; // mm + int m_NumberOfStripsX; + int m_NumberOfStripsY; + double m_StripPitchX; // mm + double m_StripPitchY; // mm +}; + +#endif diff --git a/NPLib/HYDE2/Makefile b/NPLib/HYDE2/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..f4683340f6454ac7214b0fad0405cb6359b6c497 --- /dev/null +++ b/NPLib/HYDE2/Makefile @@ -0,0 +1,54 @@ +include ../Makefile.arch + +#------------------------------------------------------------------------------ +SHARELIB = libHyde2Data.so \ + libHyde2TrackerModules.so libHyde2Physics.so +all: $(SHARELIB) +#------------------------------------------------------------------------------ +############### Detector ############## + +## Hyde2 ## +libHyde2Data.so: THyde2TrackerData.o THyde2TrackerDataDict.o + $(LD) $(SOFLAGS) $^ $(OutPutOpt) $@ + +THyde2TrackerDataDict.cxx: THyde2TrackerData.h + rootcint -f $@ -c $^ + +libHyde2Physics.so: Hyde2Tracker.o THyde2TrackerPhysics.o \ + THyde2TrackerPhysicsDict.o + $(LD) $(SOFLAGS) $^ $(OutPutOpt) $@ + +THyde2TrackerPhysicsDict.cxx: THyde2TrackerPhysics.h + rootcint -f $@ -c $^ + +libHyde2TrackerModules.so: Hyde2TrackerModule.o Hyde2TrackerSquare1.o \ + Hyde2TrackerTrapezoid1.o Hyde2TrackerTrapezoid2.o + $(LD) $(SOFLAGS) $^ $(OutPutOpt) $@ + + + +# dependances +Hyde2Tracker.o: Hyde2Tracker.cxx Hyde2Tracker.h +THyde2TrackerData.o: THyde2TrackerData.cxx THyde2TrackerData.h +THyde2TrackerPhysics.o: THyde2TrackerPhysics.cxx THyde2TrackerPhysics.h +Hyde2TrackerModule.o: Hyde2TrackerModule.cxx Hyde2TrackerModule.h +Hyde2TrackerSquare1.o: Hyde2TrackerSquare1.cxx Hyde2TrackerSquare1.h +Hyde2TrackerTrapezoid1.o: Hyde2TrackerTrapezoid1.cxx Hyde2TrackerTrapezoid1.h +Hyde2TrackerTrapezoid2.o: Hyde2TrackerTrapezoid2.cxx Hyde2TrackerTrapezoid2.h +####################################### + +############# Clean and More ########## +clean: + @rm -f core *~ *.o *Dict* + +distclean: + make clean; rm -f *.so + +.SUFFIXES: .$(SrcSuf) + +### + +.$(SrcSuf).$(ObjSuf): + $(CXX) $(CXXFLAGS) $(INCLUDE) -c $< + + diff --git a/NPLib/HYDE2/Makefile_longer b/NPLib/HYDE2/Makefile_longer new file mode 100644 index 0000000000000000000000000000000000000000..f4683340f6454ac7214b0fad0405cb6359b6c497 --- /dev/null +++ b/NPLib/HYDE2/Makefile_longer @@ -0,0 +1,54 @@ +include ../Makefile.arch + +#------------------------------------------------------------------------------ +SHARELIB = libHyde2Data.so \ + libHyde2TrackerModules.so libHyde2Physics.so +all: $(SHARELIB) +#------------------------------------------------------------------------------ +############### Detector ############## + +## Hyde2 ## +libHyde2Data.so: THyde2TrackerData.o THyde2TrackerDataDict.o + $(LD) $(SOFLAGS) $^ $(OutPutOpt) $@ + +THyde2TrackerDataDict.cxx: THyde2TrackerData.h + rootcint -f $@ -c $^ + +libHyde2Physics.so: Hyde2Tracker.o THyde2TrackerPhysics.o \ + THyde2TrackerPhysicsDict.o + $(LD) $(SOFLAGS) $^ $(OutPutOpt) $@ + +THyde2TrackerPhysicsDict.cxx: THyde2TrackerPhysics.h + rootcint -f $@ -c $^ + +libHyde2TrackerModules.so: Hyde2TrackerModule.o Hyde2TrackerSquare1.o \ + Hyde2TrackerTrapezoid1.o Hyde2TrackerTrapezoid2.o + $(LD) $(SOFLAGS) $^ $(OutPutOpt) $@ + + + +# dependances +Hyde2Tracker.o: Hyde2Tracker.cxx Hyde2Tracker.h +THyde2TrackerData.o: THyde2TrackerData.cxx THyde2TrackerData.h +THyde2TrackerPhysics.o: THyde2TrackerPhysics.cxx THyde2TrackerPhysics.h +Hyde2TrackerModule.o: Hyde2TrackerModule.cxx Hyde2TrackerModule.h +Hyde2TrackerSquare1.o: Hyde2TrackerSquare1.cxx Hyde2TrackerSquare1.h +Hyde2TrackerTrapezoid1.o: Hyde2TrackerTrapezoid1.cxx Hyde2TrackerTrapezoid1.h +Hyde2TrackerTrapezoid2.o: Hyde2TrackerTrapezoid2.cxx Hyde2TrackerTrapezoid2.h +####################################### + +############# Clean and More ########## +clean: + @rm -f core *~ *.o *Dict* + +distclean: + make clean; rm -f *.so + +.SUFFIXES: .$(SrcSuf) + +### + +.$(SrcSuf).$(ObjSuf): + $(CXX) $(CXXFLAGS) $(INCLUDE) -c $< + + diff --git a/NPLib/HYDE2/Makefile_shorter b/NPLib/HYDE2/Makefile_shorter new file mode 100644 index 0000000000000000000000000000000000000000..da31f47e92eee971ded7ab629e75849ed448ce8b --- /dev/null +++ b/NPLib/HYDE2/Makefile_shorter @@ -0,0 +1,42 @@ +include ../Makefile.arch + +#------------------------------------------------------------------------------ +SHARELIB = libHyde2Data.so libHyde2Physics.so +all: $(SHARELIB) +#------------------------------------------------------------------------------ +############### Detector ############## + +## Hyde2 ## +libHyde2Data.so: THyde2TrackerData.o THyde2TrackerDataDict.o + $(LD) $(SOFLAGS) $^ $(OutPutOpt) $@ + +THyde2TrackerDataDict.cxx: THyde2TrackerData.h + rootcint -f $@ -c $^ + +libHyde2Physics.so: Hyde2Tracker.o THyde2TrackerPhysics.o THyde2TrackerPhysicsDict.o + $(LD) $(SOFLAGS) $^ $(OutPutOpt) $@ + +THyde2TrackerPhysicsDict.cxx: THyde2TrackerPhysics.h + rootcint -f $@ -c $^ + +# dependances +Hyde2Tracker.o: Hyde2Tracker.cxx Hyde2Tracker.h +THyde2TrackerData.o: THyde2TrackerData.cxx THyde2TrackerData.h +THyde2TrackerPhysics.o: THyde2TrackerPhysics.cxx THyde2TrackerPhysics.h +####################################### + +############# Clean and More ########## +clean: + @rm -f core *~ *.o *Dict* + +distclean: + make clean; rm -f *.so + +.SUFFIXES: .$(SrcSuf) + +### + +.$(SrcSuf).$(ObjSuf): + $(CXX) $(CXXFLAGS) $(INCLUDE) -c $< + + diff --git a/NPLib/HYDE2/README.txt b/NPLib/HYDE2/README.txt new file mode 100644 index 0000000000000000000000000000000000000000..738a7783ee0365fd2ed69f0ce68bec94a5150702 --- /dev/null +++ b/NPLib/HYDE2/README.txt @@ -0,0 +1,10 @@ +In case we want to create just the following shared libraries: + +libHyde2Physics.so +libHyde2Data.so + +use the makefile Makefile_shorter. Only the following files are needed: + +HydeTracker.(cxx,h) +THydeTrackerData.(cxx,h) +THydeTrackerPhysics.(cxx,h) diff --git a/NPLib/HYDE2/THyde2TrackerData.cxx b/NPLib/HYDE2/THyde2TrackerData.cxx new file mode 100644 index 0000000000000000000000000000000000000000..e069e7fbb33c9ec2a1ca8cb8515fe1310f33e4d3 --- /dev/null +++ b/NPLib/HYDE2/THyde2TrackerData.cxx @@ -0,0 +1,195 @@ +/***************************************************************************** + * Copyright (C) 2009-2010 this file is part of the NPTool Project * + * * + * For the licensing terms see $NPTOOL/Licence/NPTool_Licence * + * For the list of contributors see $NPTOOL/Licence/Contributors * + *****************************************************************************/ + +/***************************************************************************** + * Original Author: N. de Sereville contact address: deserevi@ipno.in2p3.fr * + * * + * Creation Date : 10/06/09 * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: This class stores the results of the G4 simulation for the * + * tracker part of the Hyde2 detector. * + * The format mimics what was used for the GANIL experiments * + * after conversion of the raw data with GRU. Ask * + * N. de Sereville for more informations. * + * This class derives from TObject (ROOT) and its aim is to be * + * stored in the output TTree of the G4 simulation * + *---------------------------------------------------------------------------* + * Comment: * + * * + * * + *****************************************************************************/ + +#include <iostream> +using namespace std; + +#include "THyde2TrackerData.h" + +ClassImp(THyde2TrackerData) + +THyde2TrackerData::THyde2TrackerData() +{ + // Default constructor + + Clear(); +} + + + +THyde2TrackerData::~THyde2TrackerData() +{ +} + + + +void THyde2TrackerData::Clear() +{ + // DSSD + // (X,E) + fHYD2Trk_FirstStage_FrontE_DetectorNbr.clear(); + fHYD2Trk_FirstStage_FrontE_StripNbr.clear() ; + fHYD2Trk_FirstStage_FrontE_Energy.clear() ; + // (X,T) + fHYD2Trk_FirstStage_FrontT_DetectorNbr.clear() ; + fHYD2Trk_FirstStage_FrontT_StripNbr.clear() ; + fHYD2Trk_FirstStage_FrontT_Time.clear() ; + // (Y,E) + fHYD2Trk_FirstStage_BackE_DetectorNbr.clear() ; + fHYD2Trk_FirstStage_BackE_StripNbr.clear() ; + fHYD2Trk_FirstStage_BackE_Energy.clear() ; + // (Y,T) + fHYD2Trk_FirstStage_BackT_DetectorNbr.clear() ; + fHYD2Trk_FirstStage_BackT_StripNbr.clear() ; + fHYD2Trk_FirstStage_BackT_Time.clear() ; + + // Second Stage + // E + fHYD2Trk_SecondStage_E_DetectorNbr.clear() ; + fHYD2Trk_SecondStage_E_PadNbr.clear() ; + fHYD2Trk_SecondStage_E_Energy.clear() ; + // T + fHYD2Trk_SecondStage_T_DetectorNbr.clear() ; + fHYD2Trk_SecondStage_T_PadNbr.clear() ; + fHYD2Trk_SecondStage_T_Time.clear() ; + + // Third Stage + // E + fHYD2Trk_ThirdStage_E_DetectorNbr.clear() ; + fHYD2Trk_ThirdStage_E_PadNbr.clear() ; + fHYD2Trk_ThirdStage_E_Energy.clear() ; + // T + fHYD2Trk_ThirdStage_T_DetectorNbr.clear() ; + fHYD2Trk_ThirdStage_T_PadNbr.clear() ; + fHYD2Trk_ThirdStage_T_Time.clear() ; + + // Fourth Stage + // E + fHYD2Trk_FourthStage_E_DetectorNbr.clear() ; + fHYD2Trk_FourthStage_E_PadNbr.clear() ; + fHYD2Trk_FourthStage_E_Energy.clear() ; + // T + fHYD2Trk_FourthStage_T_DetectorNbr.clear() ; + fHYD2Trk_FourthStage_T_PadNbr.clear() ; + fHYD2Trk_FourthStage_T_Time.clear() ; + + // Fifth Stage + // E + fHYD2Trk_FifthStage_E_DetectorNbr.clear() ; + fHYD2Trk_FifthStage_E_PadNbr.clear() ; + fHYD2Trk_FifthStage_E_Energy.clear() ; + // T + fHYD2Trk_FifthStage_T_DetectorNbr.clear() ; + fHYD2Trk_FifthStage_T_PadNbr.clear() ; + fHYD2Trk_FifthStage_T_Time.clear() ; + + // Sixth Stage + // E + fHYD2Trk_SixthStage_E_DetectorNbr.clear() ; + fHYD2Trk_SixthStage_E_PadNbr.clear() ; + fHYD2Trk_SixthStage_E_Energy.clear() ; + // T + fHYD2Trk_SixthStage_T_DetectorNbr.clear() ; + fHYD2Trk_SixthStage_T_PadNbr.clear() ; + fHYD2Trk_SixthStage_T_Time.clear() ; + +} + + + +void THyde2TrackerData::Dump() const +{ + cout << "XXXXXXXXXXXXXXXXXXXXXXXX New Event XXXXXXXXXXXXXXXXX" << endl; + + // DSSD + // (X,E) + cout << "HYD2Trk_FirstStage_FrontE_Mult = " << fHYD2Trk_FirstStage_FrontE_DetectorNbr.size() << endl; + for (UShort_t i = 0; i < fHYD2Trk_FirstStage_FrontE_DetectorNbr.size(); i++) + cout << "DetNbr: " << fHYD2Trk_FirstStage_FrontE_DetectorNbr[i] << " Strip: " << fHYD2Trk_FirstStage_FrontE_StripNbr[i] << " Energy: " << fHYD2Trk_FirstStage_FrontE_Energy[i] << endl; + // (X,T) + cout << "HYD2Trk_FirstStage_FrontT_Mult = " << fHYD2Trk_FirstStage_FrontT_DetectorNbr.size() << endl; + for (UShort_t i = 0; i < fHYD2Trk_FirstStage_FrontT_DetectorNbr.size(); i++) + cout << "DetNbr: " << fHYD2Trk_FirstStage_FrontT_DetectorNbr[i] << " Strip: " << fHYD2Trk_FirstStage_FrontT_StripNbr[i] << " Time: " << fHYD2Trk_FirstStage_FrontT_Time[i] << endl; + // (Y,E) + cout << "HYD2Trk_FirstStage_BackE_Mult = " << fHYD2Trk_FirstStage_BackE_DetectorNbr.size() << endl; + for (UShort_t i = 0; i < fHYD2Trk_FirstStage_BackE_DetectorNbr.size(); i++) + cout << "DetNbr: " << fHYD2Trk_FirstStage_BackE_DetectorNbr[i] << " Strip: " << fHYD2Trk_FirstStage_BackE_StripNbr[i] << " Energy: " << fHYD2Trk_FirstStage_BackE_Energy[i] << endl; + // (Y,T) + cout << "HYD2Trk_FirstStage_BackT_Mult = " << fHYD2Trk_FirstStage_BackT_DetectorNbr.size() << endl; + for (UShort_t i = 0; i < fHYD2Trk_FirstStage_BackT_DetectorNbr.size(); i++) + cout << "DetNbr: " << fHYD2Trk_FirstStage_BackT_DetectorNbr[i] << " Strip: " << fHYD2Trk_FirstStage_BackT_StripNbr[i] << " Time: " << fHYD2Trk_FirstStage_BackT_Time[i] << endl; + + // Second Stage + // Energy + cout << "HYD2Trk_SecondStage_E_Mult = " << fHYD2Trk_SecondStage_E_DetectorNbr.size() << endl; + for (UShort_t i = 0; i < fHYD2Trk_SecondStage_E_DetectorNbr.size(); i++) + cout << "Det: " << fHYD2Trk_SecondStage_E_DetectorNbr[i] << " Pad: " << fHYD2Trk_SecondStage_E_PadNbr[i] << " Energy: " << fHYD2Trk_SecondStage_E_Energy[i] << endl; + // Time + cout << "HYD2Trk_SecondStage_T_Mult = " << fHYD2Trk_SecondStage_T_DetectorNbr.size() << endl; + for (UShort_t i = 0; i < fHYD2Trk_SecondStage_T_DetectorNbr.size(); i++) + cout << "Det: " << fHYD2Trk_SecondStage_T_DetectorNbr[i] << " Pad: " << fHYD2Trk_SecondStage_T_PadNbr[i] << " Time: " << fHYD2Trk_SecondStage_T_Time[i] << endl; + + // Third Stage + // Energy + cout << "HYD2Trk_ThirdStage_E_Mult = " << fHYD2Trk_ThirdStage_E_DetectorNbr.size() << endl; + for (UShort_t i = 0; i < fHYD2Trk_ThirdStage_E_DetectorNbr.size(); i++) + cout << "Det: " << fHYD2Trk_ThirdStage_E_DetectorNbr[i] << " Pad: " << fHYD2Trk_ThirdStage_E_PadNbr[i] << " Energy: " << fHYD2Trk_ThirdStage_E_Energy[i] << endl; + // Time + cout << "HYD2Trk_ThirdStage_T_Mult = " << fHYD2Trk_ThirdStage_T_DetectorNbr.size() << endl; + for (UShort_t i = 0; i < fHYD2Trk_ThirdStage_T_DetectorNbr.size(); i++) + cout << "Det: " << fHYD2Trk_ThirdStage_T_DetectorNbr[i] << " Pad: " << fHYD2Trk_ThirdStage_T_PadNbr[i] << " Time: " << fHYD2Trk_ThirdStage_T_Time[i] << endl; + + // Fourth Stage + // Energy + cout << "HYD2Trk_FourthStage_E_Mult = " << fHYD2Trk_FourthStage_E_DetectorNbr.size() << endl; + for (UShort_t i = 0; i < fHYD2Trk_FourthStage_E_DetectorNbr.size(); i++) + cout << "Det: " << fHYD2Trk_FourthStage_E_DetectorNbr[i] << " Pad: " << fHYD2Trk_FourthStage_E_PadNbr[i] << " Energy: " << fHYD2Trk_FourthStage_E_Energy[i] << endl; + // Time + cout << "HYD2Trk_FourthStage_T_Mult = " << fHYD2Trk_FourthStage_T_DetectorNbr.size() << endl; + for (UShort_t i = 0; i < fHYD2Trk_FourthStage_T_DetectorNbr.size(); i++) + cout << "Det: " << fHYD2Trk_FourthStage_T_DetectorNbr[i] << " Pad: " << fHYD2Trk_FourthStage_T_PadNbr[i] << " Time: " << fHYD2Trk_FourthStage_T_Time[i] << endl; + + // Fifth Stage + // Energy + cout << "HYD2Trk_FifthStage_E_Mult = " << fHYD2Trk_FifthStage_E_DetectorNbr.size() << endl; + for (UShort_t i = 0; i < fHYD2Trk_FifthStage_E_DetectorNbr.size(); i++) + cout << "Det: " << fHYD2Trk_FifthStage_E_DetectorNbr[i] << " Pad: " << fHYD2Trk_FifthStage_E_PadNbr[i] << " Energy: " << fHYD2Trk_FifthStage_E_Energy[i] << endl; + // Time + cout << "HYD2Trk_FifthStage_T_Mult = " << fHYD2Trk_FifthStage_T_DetectorNbr.size() << endl; + for (UShort_t i = 0; i < fHYD2Trk_FifthStage_T_DetectorNbr.size(); i++) + cout << "Det: " << fHYD2Trk_FifthStage_T_DetectorNbr[i] << " Pad: " << fHYD2Trk_FifthStage_T_PadNbr[i] << " Time: " << fHYD2Trk_FifthStage_T_Time[i] << endl; + + // Sixth Stage + // Energy + cout << "HYD2Trk_SixthStage_E_Mult = " << fHYD2Trk_SixthStage_E_DetectorNbr.size() << endl; + for (UShort_t i = 0; i < fHYD2Trk_SixthStage_E_DetectorNbr.size(); i++) + cout << "Det: " << fHYD2Trk_SixthStage_E_DetectorNbr[i] << " Pad: " << fHYD2Trk_SixthStage_E_PadNbr[i] << " Energy: " << fHYD2Trk_SixthStage_E_Energy[i] << endl; + // Time + cout << "HYD2Trk_SixthStage_T_Mult = " << fHYD2Trk_SixthStage_T_DetectorNbr.size() << endl; + for (UShort_t i = 0; i < fHYD2Trk_SixthStage_T_DetectorNbr.size(); i++) + cout << "Det: " << fHYD2Trk_SixthStage_T_DetectorNbr[i] << " Pad: " << fHYD2Trk_SixthStage_T_PadNbr[i] << " Time: " << fHYD2Trk_SixthStage_T_Time[i] << endl; + +} diff --git a/NPLib/HYDE2/THyde2TrackerData.h b/NPLib/HYDE2/THyde2TrackerData.h new file mode 100644 index 0000000000000000000000000000000000000000..6768153a81831a5c9e60145cd8b675b07f03a69e --- /dev/null +++ b/NPLib/HYDE2/THyde2TrackerData.h @@ -0,0 +1,471 @@ +/***************************************************************************** + * Copyright (C) 2009-2010 this file is part of the NPTool Project * + * * + * For the licensing terms see $NPTOOL/Licence/NPTool_Licence * + * For the list of contributors see $NPTOOL/Licence/Contributors * + *****************************************************************************/ + +/***************************************************************************** + * Original Author: N. de Sereville contact address: deserevi@ipno.in2p3.fr * + * * + * Creation Date : 10/06/09 * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: This class stores the results of the G4 simulation for the * + * tracker part of the Hyde2 detector. * + * The format mimics what was used for the GANIL experiments * + * after conversion of the raw data with GRU. Ask * + * N. de Sereville for more informations. * + * This class derives from TObject (ROOT) and its aim is to be * + * stored in the output TTree of the G4 simulation * + *---------------------------------------------------------------------------* + * Comment: * + * * + * * + *****************************************************************************/ + +#ifndef __HYDE2TRACKERDATA__ +#define __HYDE2TRACKERDATA__ + +#include <vector> +#include "TObject.h" + +using namespace std ; + +class THyde2TrackerData : public TObject +{ +protected: + // First Stage + // Double Sided Silicon Detector + // Front + // Energy + vector<UShort_t> fHYD2Trk_FirstStage_FrontE_DetectorNbr; + vector<UShort_t> fHYD2Trk_FirstStage_FrontE_StripNbr; + vector<Double_t> fHYD2Trk_FirstStage_FrontE_Energy; + // Time + vector<UShort_t> fHYD2Trk_FirstStage_FrontT_DetectorNbr; + vector<UShort_t> fHYD2Trk_FirstStage_FrontT_StripNbr; + vector<Double_t> fHYD2Trk_FirstStage_FrontT_Time; + // Back + // Energy + vector<UShort_t> fHYD2Trk_FirstStage_BackE_DetectorNbr; + vector<UShort_t> fHYD2Trk_FirstStage_BackE_StripNbr; + vector<Double_t> fHYD2Trk_FirstStage_BackE_Energy; + // Time + vector<UShort_t> fHYD2Trk_FirstStage_BackT_DetectorNbr; + vector<UShort_t> fHYD2Trk_FirstStage_BackT_StripNbr; + vector<Double_t> fHYD2Trk_FirstStage_BackT_Time; + + // Second Stage + // Energy + vector<UShort_t> fHYD2Trk_SecondStage_E_DetectorNbr; + vector<UShort_t> fHYD2Trk_SecondStage_E_PadNbr; + vector<Double_t> fHYD2Trk_SecondStage_E_Energy; + // Time + vector<UShort_t> fHYD2Trk_SecondStage_T_DetectorNbr; + vector<UShort_t> fHYD2Trk_SecondStage_T_PadNbr; + vector<Double_t> fHYD2Trk_SecondStage_T_Time; + + // Third Stage + // Energy + vector<UShort_t> fHYD2Trk_ThirdStage_E_DetectorNbr; + vector<UShort_t> fHYD2Trk_ThirdStage_E_PadNbr; + vector<Double_t> fHYD2Trk_ThirdStage_E_Energy; + // Time + vector<UShort_t> fHYD2Trk_ThirdStage_T_DetectorNbr; + vector<UShort_t> fHYD2Trk_ThirdStage_T_PadNbr; + vector<Double_t> fHYD2Trk_ThirdStage_T_Time; + + // Fourth Stage + // Energy + vector<UShort_t> fHYD2Trk_FourthStage_E_DetectorNbr; + vector<UShort_t> fHYD2Trk_FourthStage_E_PadNbr; + vector<Double_t> fHYD2Trk_FourthStage_E_Energy; + // Time + vector<UShort_t> fHYD2Trk_FourthStage_T_DetectorNbr; + vector<UShort_t> fHYD2Trk_FourthStage_T_PadNbr; + vector<Double_t> fHYD2Trk_FourthStage_T_Time; + + // Fifth Stage + // Energy + vector<UShort_t> fHYD2Trk_FifthStage_E_DetectorNbr; + vector<UShort_t> fHYD2Trk_FifthStage_E_PadNbr; + vector<Double_t> fHYD2Trk_FifthStage_E_Energy; + // Time + vector<UShort_t> fHYD2Trk_FifthStage_T_DetectorNbr; + vector<UShort_t> fHYD2Trk_FifthStage_T_PadNbr; + vector<Double_t> fHYD2Trk_FifthStage_T_Time; + + // Sixth Stage + // Energy + vector<UShort_t> fHYD2Trk_SixthStage_E_DetectorNbr; + vector<UShort_t> fHYD2Trk_SixthStage_E_PadNbr; + vector<Double_t> fHYD2Trk_SixthStage_E_Energy; + // Time + vector<UShort_t> fHYD2Trk_SixthStage_T_DetectorNbr; + vector<UShort_t> fHYD2Trk_SixthStage_T_PadNbr; + vector<Double_t> fHYD2Trk_SixthStage_T_Time; + +public: + THyde2TrackerData(); + virtual ~THyde2TrackerData(); + + void Clear(); + void Clear(const Option_t*) {}; + void Dump() const; + + ///////////////////// SETTERS //////////////////////// + // DSSD + // (Front, E) + void SetHYD2TrkFirstStageFrontEDetectorNbr(UShort_t DetNbr) { + fHYD2Trk_FirstStage_FrontE_DetectorNbr.push_back(DetNbr); + } + void SetHYD2TrkFirstStageFrontEStripNbr(UShort_t StripNbr) { + fHYD2Trk_FirstStage_FrontE_StripNbr.push_back(StripNbr); + } + void SetHYD2TrkFirstStageFrontEEnergy(Double_t Energy) { + fHYD2Trk_FirstStage_FrontE_Energy.push_back(Energy); + } + // (Front, T) + void SetHYD2TrkFirstStageFrontTDetectorNbr(UShort_t DetNbr) { + fHYD2Trk_FirstStage_FrontT_DetectorNbr.push_back(DetNbr); + } + void SetHYD2TrkFirstStageFrontTStripNbr(UShort_t StripNbr) { + fHYD2Trk_FirstStage_FrontT_StripNbr.push_back(StripNbr); + } + void SetHYD2TrkFirstStageFrontTTime(Double_t Time) { + fHYD2Trk_FirstStage_FrontT_Time.push_back(Time); + } + + // (Back, E) + void SetHYD2TrkFirstStageBackEDetectorNbr(UShort_t DetNbr) { + fHYD2Trk_FirstStage_BackE_DetectorNbr.push_back(DetNbr); + } + void SetHYD2TrkFirstStageBackEStripNbr(UShort_t StripNbr) { + fHYD2Trk_FirstStage_BackE_StripNbr.push_back(StripNbr); + } + void SetHYD2TrkFirstStageBackEEnergy(Double_t Energy) { + fHYD2Trk_FirstStage_BackE_Energy.push_back(Energy); + } + // (Back, T) + void SetHYD2TrkFirstStageBackTDetectorNbr(UShort_t DetNbr) { + fHYD2Trk_FirstStage_BackT_DetectorNbr.push_back(DetNbr); + } + void SetHYD2TrkFirstStageBackTStripNbr(UShort_t StripNbr) { + fHYD2Trk_FirstStage_BackT_StripNbr.push_back(StripNbr); + } + void SetHYD2TrkFirstStageBackTTime(Double_t Time) { + fHYD2Trk_FirstStage_BackT_Time.push_back(Time); + } + + // Second Stage + // (E) + void SetHYD2TrkSecondStageEDetectorNbr(UShort_t DetNbr) { + fHYD2Trk_SecondStage_E_DetectorNbr.push_back(DetNbr); + } + void SetHYD2TrkSecondStageEPadNbr(UShort_t PadNbr) { + fHYD2Trk_SecondStage_E_PadNbr.push_back(PadNbr); + } + void SetHYD2TrkSecondStageEEnergy(Double_t Energy) { + fHYD2Trk_SecondStage_E_Energy.push_back(Energy); + } + // (T) + void SetHYD2TrkSecondStageTDetectorNbr(UShort_t DetNbr) { + fHYD2Trk_SecondStage_T_DetectorNbr.push_back(DetNbr); + } + void SetHYD2TrkSecondStageTPadNbr(UShort_t PadNbr) { + fHYD2Trk_SecondStage_T_PadNbr.push_back(PadNbr); + } + void SetHYD2TrkSecondStageTTime(Double_t Time) { + fHYD2Trk_SecondStage_T_Time.push_back(Time); + } + + // Third Stage + // (E) + void SetHYD2TrkThirdStageEDetectorNbr(UShort_t DetNbr) { + fHYD2Trk_ThirdStage_E_DetectorNbr.push_back(DetNbr); + } + void SetHYD2TrkThirdStageEPadNbr(UShort_t PadNbr) { + fHYD2Trk_ThirdStage_E_PadNbr.push_back(PadNbr); + } + void SetHYD2TrkThirdStageEEnergy(Double_t Energy) { + fHYD2Trk_ThirdStage_E_Energy.push_back(Energy); + } + // (T) + void SetHYD2TrkThirdStageTDetectorNbr(UShort_t DetNbr) { + fHYD2Trk_ThirdStage_T_DetectorNbr.push_back(DetNbr); + } + void SetHYD2TrkThirdStageTPadNbr(UShort_t PadNbr) { + fHYD2Trk_ThirdStage_T_PadNbr.push_back(PadNbr); + } + void SetHYD2TrkThirdStageTTime(Double_t Time) { + fHYD2Trk_ThirdStage_T_Time.push_back(Time); + } + + // Fourth Stage + // (E) + void SetHYD2TrkFourthStageEDetectorNbr(UShort_t DetNbr) { + fHYD2Trk_FourthStage_E_DetectorNbr.push_back(DetNbr); + } + void SetHYD2TrkFourthStageEPadNbr(UShort_t PadNbr) { + fHYD2Trk_FourthStage_E_PadNbr.push_back(PadNbr); + } + void SetHYD2TrkFourthStageEEnergy(Double_t Energy) { + fHYD2Trk_FourthStage_E_Energy.push_back(Energy); + } + // (T) + void SetHYD2TrkFourthStageTDetectorNbr(UShort_t DetNbr) { + fHYD2Trk_FourthStage_T_DetectorNbr.push_back(DetNbr); + } + void SetHYD2TrkFourthStageTPadNbr(UShort_t PadNbr) { + fHYD2Trk_FourthStage_T_PadNbr.push_back(PadNbr); + } + void SetHYD2TrkFourthStageTTime(Double_t Time) { + fHYD2Trk_FourthStage_T_Time.push_back(Time); + } + + // Fifth Stage + // (E) + void SetHYD2TrkFifthStageEDetectorNbr(UShort_t DetNbr) { + fHYD2Trk_FifthStage_E_DetectorNbr.push_back(DetNbr); + } + void SetHYD2TrkFifthStageEPadNbr(UShort_t PadNbr) { + fHYD2Trk_FifthStage_E_PadNbr.push_back(PadNbr); + } + void SetHYD2TrkFifthStageEEnergy(Double_t Energy) { + fHYD2Trk_FifthStage_E_Energy.push_back(Energy); + } + // (T) + void SetHYD2TrkFifthStageTDetectorNbr(UShort_t DetNbr) { + fHYD2Trk_FifthStage_T_DetectorNbr.push_back(DetNbr); + } + void SetHYD2TrkFifthStageTPadNbr(UShort_t PadNbr) { + fHYD2Trk_FifthStage_T_PadNbr.push_back(PadNbr); + } + void SetHYD2TrkFifthStageTTime(Double_t Time) { + fHYD2Trk_FifthStage_T_Time.push_back(Time); + } + + // Sixth Stage + // (E) + void SetHYD2TrkSixthStageEDetectorNbr(UShort_t DetNbr) { + fHYD2Trk_SixthStage_E_DetectorNbr.push_back(DetNbr); + } + void SetHYD2TrkSixthStageEPadNbr(UShort_t PadNbr) { + fHYD2Trk_SixthStage_E_PadNbr.push_back(PadNbr); + } + void SetHYD2TrkSixthStageEEnergy(Double_t Energy) { + fHYD2Trk_SixthStage_E_Energy.push_back(Energy); + } + // (T) + void SetHYD2TrkSixthStageTDetectorNbr(UShort_t DetNbr) { + fHYD2Trk_SixthStage_T_DetectorNbr.push_back(DetNbr); + } + void SetHYD2TrkSixthStageTPadNbr(UShort_t PadNbr) { + fHYD2Trk_SixthStage_T_PadNbr.push_back(PadNbr); + } + void SetHYD2TrkSixthStageTTime(Double_t Time) { + fHYD2Trk_SixthStage_T_Time.push_back(Time); + } + + + ///////////////////// GETTERS //////////////////////// + // DSSD + // (Front, E) + UShort_t GetHYD2TrkFirstStageFrontEMult() { + return fHYD2Trk_FirstStage_FrontE_DetectorNbr.size(); + } + UShort_t GetHYD2TrkFirstStageFrontEDetectorNbr(Int_t i) { + return fHYD2Trk_FirstStage_FrontE_DetectorNbr.at(i); + } + UShort_t GetHYD2TrkFirstStageFrontEStripNbr(Int_t i) { + return fHYD2Trk_FirstStage_FrontE_StripNbr.at(i); + } + Double_t GetHYD2TrkFirstStageFrontEEnergy(Int_t i) { + return fHYD2Trk_FirstStage_FrontE_Energy.at(i); + } + // (Front, T) + UShort_t GetHYD2TrkFirstStageFrontTMult() { + return fHYD2Trk_FirstStage_FrontT_DetectorNbr.size(); + } + UShort_t GetHYD2TrkFirstStageFrontTDetectorNbr(Int_t i) { + return fHYD2Trk_FirstStage_FrontT_DetectorNbr.at(i); + } + UShort_t GetHYD2TrkFirstStageFrontTStripNbr(Int_t i) { + return fHYD2Trk_FirstStage_FrontT_StripNbr.at(i); + } + Double_t GetHYD2TrkFirstStageFrontTTime(Int_t i) { + return fHYD2Trk_FirstStage_FrontT_Time.at(i); + } + // (Back, E) + UShort_t GetHYD2TrkFirstStageBackEMult() { + return fHYD2Trk_FirstStage_BackE_DetectorNbr.size(); + } + UShort_t GetHYD2TrkFirstStageBackEDetectorNbr(Int_t i) { + return fHYD2Trk_FirstStage_BackE_DetectorNbr.at(i); + } + UShort_t GetHYD2TrkFirstStageBackEStripNbr(Int_t i) { + return fHYD2Trk_FirstStage_BackE_StripNbr.at(i); + } + Double_t GetHYD2TrkFirstStageBackEEnergy(Int_t i) { + return fHYD2Trk_FirstStage_BackE_Energy.at(i); + } + // (Back, T) + UShort_t GetHYD2TrkFirstStageBackTMult() { + return fHYD2Trk_FirstStage_BackT_DetectorNbr.size(); + } + UShort_t GetHYD2TrkFirstStageBackTDetectorNbr(Int_t i) { + return fHYD2Trk_FirstStage_BackT_DetectorNbr.at(i); + } + UShort_t GetHYD2TrkFirstStageBackTStripNbr(Int_t i) { + return fHYD2Trk_FirstStage_BackT_StripNbr.at(i); + } + Double_t GetHYD2TrkFirstStageBackTTime(Int_t i) { + return fHYD2Trk_FirstStage_BackT_Time.at(i); + } + + // Second Stage + // (E) + UShort_t GetHYD2TrkSecondStageEMult() { + return fHYD2Trk_SecondStage_E_DetectorNbr.size(); + } + UShort_t GetHYD2TrkSecondStageEDetectorNbr(Int_t i) { + return fHYD2Trk_SecondStage_E_DetectorNbr.at(i); + } + UShort_t GetHYD2TrkSecondStageEPadNbr(Int_t i) { + return fHYD2Trk_SecondStage_E_PadNbr.at(i); + } + Double_t GetHYD2TrkSecondStageEEnergy(Int_t i) { + return fHYD2Trk_SecondStage_E_Energy.at(i); + } + // (T) + UShort_t GetHYD2TrkSecondStageTMult() { + return fHYD2Trk_SecondStage_T_DetectorNbr.size(); + } + UShort_t GetHYD2TrkSecondStageTDetectorNbr(Int_t i) { + return fHYD2Trk_SecondStage_T_DetectorNbr.at(i); + } + UShort_t GetHYD2TrkSecondStageTPadNbr(Int_t i) { + return fHYD2Trk_SecondStage_T_PadNbr.at(i); + } + Double_t GetHYD2TrkSecondStageTTime(Int_t i) { + return fHYD2Trk_SecondStage_T_Time.at(i); + } + + // Third Stage + // (E) + UShort_t GetHYD2TrkThirdStageEMult() { + return fHYD2Trk_ThirdStage_E_DetectorNbr.size(); + } + UShort_t GetHYD2TrkThirdStageEDetectorNbr(Int_t i) { + return fHYD2Trk_ThirdStage_E_DetectorNbr.at(i); + } + UShort_t GetHYD2TrkThirdStageEPadNbr(Int_t i) { + return fHYD2Trk_ThirdStage_E_PadNbr.at(i); + } + Double_t GetHYD2TrkThirdStageEEnergy(Int_t i) { + return fHYD2Trk_ThirdStage_E_Energy.at(i); + } + // (T) + UShort_t GetHYD2TrkThirdStageTMult() { + return fHYD2Trk_ThirdStage_T_DetectorNbr.size(); + } + UShort_t GetHYD2TrkThirdStageTDetectorNbr(Int_t i) { + return fHYD2Trk_ThirdStage_T_DetectorNbr.at(i); + } + UShort_t GetHYD2TrkThirdStageTPadNbr(Int_t i) { + return fHYD2Trk_ThirdStage_T_PadNbr.at(i); + } + Double_t GetHYD2TrkThirdStageTTime(Int_t i) { + return fHYD2Trk_ThirdStage_T_Time.at(i); + } + + // Fourth Stage + // (E) + UShort_t GetHYD2TrkFourthStageEMult() { + return fHYD2Trk_FourthStage_E_DetectorNbr.size(); + } + UShort_t GetHYD2TrkFourthStageEDetectorNbr(Int_t i) { + return fHYD2Trk_FourthStage_E_DetectorNbr.at(i); + } + UShort_t GetHYD2TrkFourthStageEPadNbr(Int_t i) { + return fHYD2Trk_FourthStage_E_PadNbr.at(i); + } + Double_t GetHYD2TrkFourthStageEEnergy(Int_t i) { + return fHYD2Trk_FourthStage_E_Energy.at(i); + } + // (T) + UShort_t GetHYD2TrkFourthStageTMult() { + return fHYD2Trk_FourthStage_T_DetectorNbr.size(); + } + UShort_t GetHYD2TrkFourthStageTDetectorNbr(Int_t i) { + return fHYD2Trk_FourthStage_T_DetectorNbr.at(i); + } + UShort_t GetHYD2TrkFourthStageTPadNbr(Int_t i) { + return fHYD2Trk_FourthStage_T_PadNbr.at(i); + } + Double_t GetHYD2TrkFourthStageTTime(Int_t i) { + return fHYD2Trk_FourthStage_T_Time.at(i); + } + + // Fifth Stage + // (E) + UShort_t GetHYD2TrkFifthStageEMult() { + return fHYD2Trk_FifthStage_E_DetectorNbr.size(); + } + UShort_t GetHYD2TrkFifthStageEDetectorNbr(Int_t i) { + return fHYD2Trk_FifthStage_E_DetectorNbr.at(i); + } + UShort_t GetHYD2TrkFifthStageEPadNbr(Int_t i) { + return fHYD2Trk_FifthStage_E_PadNbr.at(i); + } + Double_t GetHYD2TrkFifthStageEEnergy(Int_t i) { + return fHYD2Trk_FifthStage_E_Energy.at(i); + } + // (T) + UShort_t GetHYD2TrkFifthStageTMult() { + return fHYD2Trk_FifthStage_T_DetectorNbr.size(); + } + UShort_t GetHYD2TrkFifthStageTDetectorNbr(Int_t i) { + return fHYD2Trk_FifthStage_T_DetectorNbr.at(i); + } + UShort_t GetHYD2TrkFifthStageTPadNbr(Int_t i) { + return fHYD2Trk_FifthStage_T_PadNbr.at(i); + } + Double_t GetHYD2TrkFifthStageTTime(Int_t i) { + return fHYD2Trk_FifthStage_T_Time.at(i); + } + + // Sixth Stage + // (E) + UShort_t GetHYD2TrkSixthStageEMult() { + return fHYD2Trk_SixthStage_E_DetectorNbr.size(); + } + UShort_t GetHYD2TrkSixthStageEDetectorNbr(Int_t i) { + return fHYD2Trk_SixthStage_E_DetectorNbr.at(i); + } + UShort_t GetHYD2TrkSixthStageEPadNbr(Int_t i) { + return fHYD2Trk_SixthStage_E_PadNbr.at(i); + } + Double_t GetHYD2TrkSixthStageEEnergy(Int_t i) { + return fHYD2Trk_SixthStage_E_Energy.at(i); + } + // (T) + UShort_t GetHYD2TrkSixthStageTMult() { + return fHYD2Trk_SixthStage_T_DetectorNbr.size(); + } + UShort_t GetHYD2TrkSixthStageTDetectorNbr(Int_t i) { + return fHYD2Trk_SixthStage_T_DetectorNbr.at(i); + } + UShort_t GetHYD2TrkSixthStageTPadNbr(Int_t i) { + return fHYD2Trk_SixthStage_T_PadNbr.at(i); + } + Double_t GetHYD2TrkSixthStageTTime(Int_t i) { + return fHYD2Trk_SixthStage_T_Time.at(i); + } + + + ClassDef(THyde2TrackerData, 1) // Hyde2TrackerData structure +}; + +#endif diff --git a/NPLib/HYDE2/THyde2TrackerPhysics.cxx b/NPLib/HYDE2/THyde2TrackerPhysics.cxx new file mode 100644 index 0000000000000000000000000000000000000000..5320b726750e056e651b6b21f7a9b1b90401f1cd --- /dev/null +++ b/NPLib/HYDE2/THyde2TrackerPhysics.cxx @@ -0,0 +1,70 @@ +/***************************************************************************** + * Copyright (C) 2009-2010 this file is part of the NPTool Project * + * * + * For the licensing terms see $NPTOOL/Licence/NPTool_Licence * + * For the list of contributors see $NPTOOL/Licence/Contributors * + *****************************************************************************/ + +/***************************************************************************** + * Original Author: N. de Sereville contact address: deserevi@ipno.in2p3.fr * + * * + * Creation Date : 31/08/09 * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: This class stores the physical results after NPAnalysis is run* + * for the tracker part of the Hyde2 detector. * + * This class derives from TObject (ROOT) and its aim is to be * + * stored in the output TTree of NPAnalysis. * + *---------------------------------------------------------------------------* + * Comment: * + * * + * * + *****************************************************************************/ + +#include "THyde2TrackerPhysics.h" + + +ClassImp(THyde2TrackerPhysics) + + +THyde2TrackerPhysics::THyde2TrackerPhysics() +{ +} + + + +THyde2TrackerPhysics::~THyde2TrackerPhysics() +{ + Clear(); +} + + + +void THyde2TrackerPhysics::Clear() +{ + // General members + fEventType.clear(); + fModuleNumber.clear(); + fTotalEnergy.clear(); + + // First stage + fFirstStage_Energy.clear(); + fFirstStage_Time.clear(); + fFirstStage_FrontPosition.clear(); + fFirstStage_BackPosition.clear(); + + // Second stage + fSecondStage_Energy.clear(); + fSecondStage_Time.clear(); + fSecondStage_Position.clear(); + + // Third stage + fThirdStage_Energy.clear(); + fThirdStage_Time.clear(); + fThirdStage_Position.clear(); + + // Fourth stage + fFourthStage_Energy.clear(); + fFourthStage_Time.clear(); + fFourthStage_Position.clear(); +} diff --git a/NPLib/HYDE2/THyde2TrackerPhysics.h b/NPLib/HYDE2/THyde2TrackerPhysics.h new file mode 100644 index 0000000000000000000000000000000000000000..3da145f5cfac4114a8611fc2ae98bbc8ba2defe1 --- /dev/null +++ b/NPLib/HYDE2/THyde2TrackerPhysics.h @@ -0,0 +1,173 @@ +/***************************************************************************** + * Copyright (C) 2009-2010 this file is part of the NPTool Project * + * * + * For the licensing terms see $NPTOOL/Licence/NPTool_Licence * + * For the list of contributors see $NPTOOL/Licence/Contributors * + *****************************************************************************/ + +/***************************************************************************** + * Original Author: N. de Sereville contact address: deserevi@ipno.in2p3.fr * + * * + * Creation Date : 31/08/09 * + * Last update : 08/10/10 * + *---------------------------------------------------------------------------* + * Decription: This class stores the physical results after NPAnalysis is run* + * for the tracker part of the Hyde2 detector. * + * This class derives from TObject (ROOT) and its aim is to be * + * stored in the output TTree of NPAnalysis. * + *---------------------------------------------------------------------------* + * Comment: * + * + 08/10/10: Change private member names and add setters and getters * + * methods. BuildPhysicalEvent() method is moved to the * + * THyde2Tracker*** classes (N. de Sereville) * + * * + * * + *****************************************************************************/ + +#ifndef THYDE2TRACKERPHYSICS_H +#define THYDE2TRACKERPHYSICS_H + +#include "THyde2TrackerData.h" + +// ROOT +#include "TObject.h" + +// C++ +#include <vector> + +using namespace std ; + + +class THyde2TrackerPhysics : public TObject +{ +public: + THyde2TrackerPhysics(); + ~THyde2TrackerPhysics(); + +public: + void Clear(); + void Clear(const Option_t*) {}; + + +private: + vector<Int_t> fEventType; + vector<Int_t> fModuleNumber; + + // First stage + vector<Double_t> fFirstStage_Energy; + vector<Double_t> fFirstStage_Time; + vector<Int_t> fFirstStage_FrontPosition; + vector<Int_t> fFirstStage_BackPosition; + + // Second stage + vector<Double_t> fSecondStage_Energy; + vector<Double_t> fSecondStage_Time; + vector<Int_t> fSecondStage_Position; + + // Third stage + vector<Double_t> fThirdStage_Energy; + vector<Double_t> fThirdStage_Time; + vector<Int_t> fThirdStage_Position; + + // Fourth stage + vector<Double_t> fFourthStage_Energy; + vector<Double_t> fFourthStage_Time; + vector<Int_t> fFourthStage_Position; + + // Fifth stage + vector<Double_t> fFifthStage_Energy; + vector<Double_t> fFifthStage_Time; + vector<Int_t> fFifthStage_Position; + + // Sixth stage + vector<Double_t> fSixthStage_Energy; + vector<Double_t> fSixthStage_Time; + vector<Int_t> fSixthStage_Position; + + vector<Double_t> fTotalEnergy; + + +public: + ///////////////////////////////////// + // SETTERS // + ///////////////////////////////////// + // General + void SetEventType(Int_t evtType) {fEventType.push_back(evtType);} + void SetModuleNumber(Int_t moduleNbr) {fModuleNumber.push_back(moduleNbr);} + void SetTotalEnergy(Double_t ener) {fTotalEnergy.push_back(ener);} + + // First stage + void SetFirstStageEnergy(Double_t ener) {fFirstStage_Energy.push_back(ener);} + void SetFirstStageTime(Double_t time) {fFirstStage_Time.push_back(time);} + void SetFirstStageFrontPosition(Int_t x) {fFirstStage_FrontPosition.push_back(x);} + void SetFirstStageBackPosition(Int_t y) {fFirstStage_BackPosition.push_back(y);} + + // Second stage + void SetSecondStageEnergy(Double_t ener) {fSecondStage_Energy.push_back(ener);} + void SetSecondStageTime(Double_t time) {fSecondStage_Time.push_back(time);} + void SetSecondStagePosition(Int_t pos) {fSecondStage_Position.push_back(pos);} + + // Third stage + void SetThirdStageEnergy(Double_t ener) {fThirdStage_Energy.push_back(ener);} + void SetThirdStageTime(Double_t time) {fThirdStage_Time.push_back(time);} + void SetThirdStagePosition(Int_t pos) {fThirdStage_Position.push_back(pos);} + + // Fourth stage + void SetFourthStageEnergy(Double_t ener) {fFourthStage_Energy.push_back(ener);} + void SetFourthStageTime(Double_t time) {fFourthStage_Time.push_back(time);} + void SetFourthStagePosition(Int_t pos) {fFourthStage_Position.push_back(pos);} + + // Fifth stage + void SetFifthStageEnergy(Double_t ener) {fFifthStage_Energy.push_back(ener);} + void SetFifthStageTime(Double_t time) {fFifthStage_Time.push_back(time);} + void SetFifthStagePosition(Int_t pos) {fFifthStage_Position.push_back(pos);} + + // Sixth stage + void SetSixthStageEnergy(Double_t ener) {fSixthStage_Energy.push_back(ener);} + void SetSixthStageTime(Double_t time) {fSixthStage_Time.push_back(time);} + void SetSixthStagePosition(Int_t pos) {fSixthStage_Position.push_back(pos);} + + ///////////////////////////////////// + // GETTERS // + ///////////////////////////////////// + // General + Int_t GetEventMultiplicity() {return fTotalEnergy.size();} + Int_t GetEventType(Int_t i) {return fEventType.at(i);} + Int_t GetModuleNumber(Int_t i) {return fModuleNumber.at(i);} + Double_t GetTotalEnergy(Int_t i) {return fTotalEnergy.at(i);} + + // First stage + Double_t GetFirstStageEnergy(Int_t i) {return fFirstStage_Energy.at(i);} + Double_t GetFirstStageTime(Int_t i) {return fFirstStage_Time.at(i);} + Int_t GetFirstStageFrontPosition(Int_t i) {return fFirstStage_FrontPosition.at(i);} + Int_t GetFirstStageBackPosition(Int_t i) {return fFirstStage_BackPosition.at(i);} + + // Second stage + Double_t GetSecondStageEnergy(Int_t i) {return fSecondStage_Energy.at(i);} + Double_t GetSecondStageTime(Int_t i) {return fSecondStage_Time.at(i);} + Int_t GetSecondStagePosition(Int_t i) {return fSecondStage_Position.at(i);} + + // Third stage + Double_t GetThirdStageEnergy(Int_t i) {return fThirdStage_Energy.at(i);} + Double_t GetThirdStageTime(Int_t i) {return fThirdStage_Time.at(i);} + Int_t GetThirdStagePosition(Int_t i) {return fThirdStage_Position.at(i);} + + // Fourth stage + Double_t GetFourthStageEnergy(Int_t i) {return fFourthStage_Energy.at(i);} + Double_t GetFourthStageTime(Int_t i) {return fFourthStage_Time.at(i);} + Int_t GetFourthStagePosition(Int_t i) {return fFourthStage_Position.at(i);} + + // Fifth stage + Double_t GetFifthStageEnergy(Int_t i) {return fFifthStage_Energy.at(i);} + Double_t GetFifthStageTime(Int_t i) {return fFifthStage_Time.at(i);} + Int_t GetFifthStagePosition(Int_t i) {return fFifthStage_Position.at(i);} + + // Sixth stage + Double_t GetSixthStageEnergy(Int_t i) {return fSixthStage_Energy.at(i);} + Double_t GetSixthStageTime(Int_t i) {return fSixthStage_Time.at(i);} + Int_t GetSixthStagePosition(Int_t i) {return fSixthStage_Position.at(i);} + + ClassDef(THyde2TrackerPhysics,1) // THyde2TrackerPhysics structure +}; + +#endif