diff --git a/NPLib/Detectors/Samurai/CMakeLists.txt b/NPLib/Detectors/Samurai/CMakeLists.txt index 639fd771a6cacc88c3dfd0f1bcc7e981089be24f..3492bd26990d0b5a4c79621470a287e1f7e4ed6c 100644 --- a/NPLib/Detectors/Samurai/CMakeLists.txt +++ b/NPLib/Detectors/Samurai/CMakeLists.txt @@ -1,5 +1,8 @@ add_custom_command(OUTPUT TSamuraiHodoscopeDataDict.cxx COMMAND ${CMAKE_BINARY_DIR}/scripts/build_dict.sh TSamuraiHodoscopeData.h TSamuraiHodoscopeDataDict.cxx TSamuraiHodoscopeData.rootmap libNPSamurai.dylib DEPENDS TSamuraiHodoscopeData.h) + +add_custom_command(OUTPUT SamuraiFieldMapDict.cxx COMMAND ${CMAKE_BINARY_DIR}/scripts/build_dict.sh SamuraiFieldMap.h SamuraiFieldMapDict.cxx SamuraiFieldMap.rootmap libNPSamurai.dylib DEPENDS SamuraiFieldMap.h) + add_custom_command(OUTPUT TSamuraiHodoscopePhysicsDict.cxx COMMAND ${CMAKE_BINARY_DIR}/scripts/build_dict.sh TSamuraiHodoscopePhysics.h TSamuraiHodoscopePhysicsDict.cxx TSamuraiHodoscopePhysics.rootmap libNPSamurai.dylib DEPENDS TSamuraiHodoscopePhysics.h) add_custom_command(OUTPUT TSamuraiBDCDataDict.cxx COMMAND ${CMAKE_BINARY_DIR}/scripts/build_dict.sh TSamuraiBDCData.h TSamuraiBDCDataDict.cxx TSamuraiBDCData.rootmap libNPSamurai.dylib DEPENDS TSamuraiBDCData.h) @@ -14,8 +17,8 @@ add_custom_command(OUTPUT TSamuraiFDC0DataDict.cxx COMMAND ${CMAKE_BINARY_DIR}/s add_custom_command(OUTPUT TSamuraiFDC0PhysicsDict.cxx COMMAND ${CMAKE_BINARY_DIR}/scripts/build_dict.sh TSamuraiFDC0Physics.h TSamuraiFDC0PhysicsDict.cxx TSamuraiFDC0Physics.rootmap libNPSamurai.dylib DEPENDS TSamuraiFDC0Physics.h) -add_library(NPSamurai SHARED TSamuraiHodoscopeData.cxx TSamuraiBDCData.cxx TSamuraiBDCPhysics.cxx TSamuraiBDCDataDict.cxx TSamuraiBDCPhysicsDict.cxx TSamuraiFDC2Data.cxx TSamuraiFDC2DataDict.cxx TSamuraiHodoscopePhysics.cxx TSamuraiHodoscopePhysicsDict.cxx TSamuraiFDC2Physics.cxx TSamuraiHodoscopeDataDict.cxx TSamuraiFDC2PhysicsDict.cxx TSamuraiFDC0Data.cxx TSamuraiFDC0DataDict.cxx TSamuraiFDC0Physics.cxx TSamuraiFDC0PhysicsDict.cxx) +add_library(NPSamurai SHARED SamuraiFieldMapDict.cxx SamuraiFieldMap.cxx TSamuraiHodoscopeData.cxx TSamuraiBDCData.cxx TSamuraiBDCPhysics.cxx TSamuraiBDCDataDict.cxx TSamuraiBDCPhysicsDict.cxx TSamuraiFDC2Data.cxx TSamuraiFDC2DataDict.cxx TSamuraiHodoscopePhysics.cxx TSamuraiHodoscopePhysicsDict.cxx TSamuraiFDC2Physics.cxx TSamuraiHodoscopeDataDict.cxx TSamuraiFDC2PhysicsDict.cxx TSamuraiFDC0Data.cxx TSamuraiFDC0DataDict.cxx TSamuraiFDC0Physics.cxx TSamuraiFDC0PhysicsDict.cxx) target_link_libraries(NPSamurai ${ROOT_LIBRARIES} NPCore NPTrackReconstruction) -install(FILES TSamuraiBDCData.h TSamuraiBDCPhysics.h TSamuraiHodoscopeData.h TSamuraiHodoscopePhysics.h TSamuraiFDC2Data.h TSamuraiFDC2Physics.h TSamuraiFDC0Data.h TSamuraiFDC0Physics.h SamuraiDCIndex.h DESTINATION ${CMAKE_INCLUDE_OUTPUT_DIRECTORY}) +install(FILES SamuraiFieldMap.h TSamuraiBDCData.h TSamuraiBDCPhysics.h TSamuraiHodoscopeData.h TSamuraiHodoscopePhysics.h TSamuraiFDC2Data.h TSamuraiFDC2Physics.h TSamuraiFDC0Data.h TSamuraiFDC0Physics.h SamuraiDCIndex.h DESTINATION ${CMAKE_INCLUDE_OUTPUT_DIRECTORY}) diff --git a/NPLib/Detectors/Samurai/SamuraiFieldMap.cxx b/NPLib/Detectors/Samurai/SamuraiFieldMap.cxx new file mode 100644 index 0000000000000000000000000000000000000000..bd6acff292c7f9c1df382d328086883252599aff --- /dev/null +++ b/NPLib/Detectors/Samurai/SamuraiFieldMap.cxx @@ -0,0 +1,141 @@ +/***************************************************************************** + * Copyright (C) 2009-2021 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: Adrien Matta contact address: matta@lpccaen.in2p3.fr * + * * + * Creation Date : May 2021 * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * This class hold Samurai field map data * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + * * + *****************************************************************************/ + +#include "SamuraiFieldMap.h" +#include <fstream> +#include <iostream> +using namespace std; + +ClassImp(SamuraiFieldMap); + +//////////////////////////////////////////////////////////////////////////////// +SamuraiFieldMap::SamuraiFieldMap(std::string file){ + LoadMap(file); +} +//////////////////////////////////////////////////////////////////////////////// +void SamuraiFieldMap::LoadMap(std::string file){ + if(file.find(".bin")!=std::string::npos) + LoadBinary(file); + else + LoadAscii(file); +} +//////////////////////////////////////////////////////////////////////////////// +std::vector<float>& SamuraiFieldMap::GetB(std::vector<float>& pos){ + static vector<float> nullv ={0,0,0}; + auto it=m_field.find(pos); + if(it!=m_field.end()){ + return it->second; + } + else + return nullv; +} + +//////////////////////////////////////////////////////////////////////////////// +void SamuraiFieldMap::LoadAscii(std::string file){ + ifstream in(file.c_str()); + if(!in.is_open()){ + cout << "Error: failed to load samurai field map " << file << endl; + exit(1); + } + + cout << "//////// Loading Ascii Samurai field map " << file << endl; + float x,y,z,Bx,By,Bz; + + m_x_max=m_y_max=m_z_max=-1e32; + m_x_min=m_y_min=m_z_min=1e32; + unsigned int count =0 ; + + // ignore 8 first line + string buffer; + for(unsigned int i = 0 ; i < 8 ; i++){ + getline(in,buffer); + } + + while(in >> x >> y >> z >> Bx >> By >> Bz){ + if(++count%50000==0) + cout << "\r - Loading " << count << " values " << flush; + vector<float> p = {x,y,z}; + vector<float> B = {Bx,By,Bz}; + m_field[p]=B; + if(x<m_x_min) + m_x_min=x; + if(x>m_x_max) + m_x_max=x; + if(y<m_y_min) + m_y_min=y; + if(y>m_y_max) + m_y_max=y; + if(z<m_z_min) + m_z_min=z; + if(z>m_z_max) + m_z_max=z; + } + + cout << "\r - " << count << " values loaded" << endl; + in.close(); +} +//////////////////////////////////////////////////////////////////////////////// +void SamuraiFieldMap::LoadBinary(std::string file){ + ifstream in(file.c_str(),std::ifstream::binary); + if(!in.is_open()){ + cout << "Error: failed to load samurai field map " << file << endl; + exit(1); + } + + cout << "//////// Loading Binary Samurai field map " << file << endl; + float x,y,z,Bx,By,Bz; + + m_x_max=m_y_max=m_z_max=-1e32; + m_x_min=m_y_min=m_z_min=1e32; + unsigned int count =0 ; + while(!in.eof()){ + + if(++count%50000==0) + cout << "\r - Loading " << count << " values " << flush; + + in.read((char*)&x,sizeof(x)); + in.read((char*)&y,sizeof(y)); + in.read((char*)&z,sizeof(z)); + in.read((char*)&Bx,sizeof(Bx)); + in.read((char*)&By,sizeof(By)); + in.read((char*)&Bz,sizeof(Bz)); + + vector<float> p = {x,y,z}; + vector<float> B = {Bx,By,Bz}; + m_field[p]=B; + if(x<m_x_min) + m_x_min=x; + if(x>m_x_max) + m_x_max=x; + if(y<m_y_min) + m_y_min=y; + if(y>m_y_max) + m_y_max=y; + if(z<m_z_min) + m_z_min=z; + if(z>m_z_max) + m_z_max=z; + } + cout << "\r - " << count << " values loaded" << endl; + cout << " - min(" << m_x_min <<";"<< m_y_min <<";" << m_z_min<< ") max(" << m_x_max <<";"<< m_y_max <<";" << m_z_max<< ")" << endl; + in.close(); +} diff --git a/NPLib/Detectors/Samurai/SamuraiFieldMap.h b/NPLib/Detectors/Samurai/SamuraiFieldMap.h new file mode 100644 index 0000000000000000000000000000000000000000..ee48d2d688df85f1e5a5c6fe74262aaf7fb9bc96 --- /dev/null +++ b/NPLib/Detectors/Samurai/SamuraiFieldMap.h @@ -0,0 +1,57 @@ +#ifndef SamuraiFieldMap_h +#define SamuraiFieldMap_h +/***************************************************************************** + * Copyright (C) 2009-2021 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: Adrien Matta contact address: matta@lpccaen.in2p3.fr * + * * + * Creation Date : May 2021 * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * This class hold Samurai field map data * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + * * + *****************************************************************************/ + +#include"TObject.h" +#include<string> +#include<vector> +#include<map> + +class SamuraiFieldMap{ + + public: + SamuraiFieldMap(){}; + SamuraiFieldMap(std::string file); + ~SamuraiFieldMap(){}; + + public: // Map reading + void LoadMap(std::string file); + void LoadAscii(std::string file); + void LoadBinary(std::string file); + + private: + // map[Pos]=B; + std::map<std::vector<float>,std::vector<float>> m_field; + float m_x_max,m_y_max,m_z_max,m_x_min,m_y_min,m_z_min; + + public: + std::vector<float>& GetB(std::vector<float>& pos); + inline std::vector<float>& GetB(float x,float y ,float z){ + std::vector<float> pos = {x,y,z}; + return GetB(pos); + }; + + ClassDef(SamuraiFieldMap,1); +}; + +#endif diff --git a/NPLib/Detectors/Samurai/TSamuraiHodoscopePhysics.h b/NPLib/Detectors/Samurai/TSamuraiHodoscopePhysics.h index 1e21c32ea5cd4e88b07faf29dcf2859ee8681a96..542198b365f50e80f2772585114fceccc41ba771 100644 --- a/NPLib/Detectors/Samurai/TSamuraiHodoscopePhysics.h +++ b/NPLib/Detectors/Samurai/TSamuraiHodoscopePhysics.h @@ -1,7 +1,7 @@ #ifndef TSamuraiHodoscopePHYSICS_H #define TSamuraiHodoscopePHYSICS_H /***************************************************************************** - * Copyright (C) 2009-2019 this file is part of the NPTool Project * + * Copyright (C) 2009-2021 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 * diff --git a/Projects/S034/Analysis.cxx b/Projects/S034/Analysis.cxx index 9094323d62dc7f379e8f5af977d281d87fcb00f5..eef3038757c0ee65991937660b9bf27b60cb9639 100644 --- a/Projects/S034/Analysis.cxx +++ b/Projects/S034/Analysis.cxx @@ -43,6 +43,7 @@ void Analysis::Init(){ FDC0 = (TSamuraiFDC0Physics*) m_DetectorManager->GetDetector("SAMURAIFDC0"); FDC2 = (TSamuraiFDC2Physics*) m_DetectorManager->GetDetector("SAMURAIFDC2"); Hodo = (TSamuraiHodoscopePhysics*) m_DetectorManager->GetDetector("SAMURAIHOD"); + m_field.LoadMap("field_map/180702-2,40T-3000.table.bin"); InitOutputBranch(); InitInputBranch(); diff --git a/Projects/S034/Analysis.h b/Projects/S034/Analysis.h index 6c893a7b90ce7a5c4b6ee1eb726e5077e4dddfee..e5ace49dd1dce98fb0a3ffd6c1386eb528669aa2 100644 --- a/Projects/S034/Analysis.h +++ b/Projects/S034/Analysis.h @@ -28,6 +28,7 @@ #include"TSamuraiFDC0Physics.h" #include"TSamuraiFDC2Physics.h" #include"TSamuraiHodoscopePhysics.h" +#include"SamuraiFieldMap.h" class Analysis: public NPL::VAnalysis{ public: @@ -48,7 +49,7 @@ class Analysis: public NPL::VAnalysis{ TSamuraiFDC0Physics* FDC0; TSamuraiFDC2Physics* FDC2; TSamuraiHodoscopePhysics* Hodo; - + SamuraiFieldMap m_field ; private: // output variable double Brho; double Beta_f; diff --git a/Projects/S034/field_map/ascii2bin.cxx b/Projects/S034/field_map/ascii2bin.cxx new file mode 100644 index 0000000000000000000000000000000000000000..ef2e7ea617bb37e4ca3eba1a43ee6088355af8f9 --- /dev/null +++ b/Projects/S034/field_map/ascii2bin.cxx @@ -0,0 +1,38 @@ +void ascii2bin(){ + std::string file ="180702-2,40T-3000.table"; + ifstream in(file.c_str()); + if(!in.is_open()){ + cout << "Error: failed to load samurai field map " << file << endl; + exit(1); + } + + cout << "//////// Loading Samurai Field Map " << file << endl; + float x,y,z,Bx,By,Bz; + std::string name = file+".bin"; + ofstream out(name.c_str(),std::ofstream::binary); + + unsigned int count =0 ; + + // ignore 8 first line + string buffer; + for(unsigned int i = 0 ; i < 8 ; i++){ + getline(in,buffer); + } + + while(in >> x >> y >> z >> Bx >> By >> Bz){ + if(++count%10000==0) + cout << "\r - Loading " << count << " values " << flush; + out.write((char*)&x,sizeof(x)); + out.write((char*)&y,sizeof(y)); + out.write((char*)&z,sizeof(z)); + out.write((char*)&Bx,sizeof(Bx)); + out.write((char*)&By,sizeof(By)); + out.write((char*)&Bz,sizeof(Bz)); + //out << x << y << z << Bx << By << Bz; + } + + cout << "\r - " << count << " values loaded" << endl; + + out.close(); + in.close(); +}