From f6a6cd276299c9d5ba12af4642cd6f199b9d5b66 Mon Sep 17 00:00:00 2001 From: ANNE Audrey <anne@lpccaen.in2p3.fr> Date: Fri, 7 Feb 2025 15:21:58 +0100 Subject: [PATCH] Wip/s034 --- Inputs/EventGenerator/neutron.source | 2 +- NPLib/Core/NPDetectorFactory.cxx | 5 +- NPLib/Core/NPOptionManager.h | 1 + NPLib/Detectors/Minos/TMinosPhysics.cxx | 15 +- NPLib/Detectors/Minos/TMinosPhysics.h | 10 +- NPLib/Detectors/Nebula/TNebulaData.h | 1 - NPLib/Detectors/Nebula/TNebulaPhysics.cxx | 51 +- NPLib/Detectors/Nebula/TNebulaPhysics.h | 24 +- NPLib/Detectors/NeuLAND/CMakeLists.txt | 6 + NPLib/Detectors/NeuLAND/TNeuLANDData.cxx | 92 + NPLib/Detectors/NeuLAND/TNeuLANDData.h | 147 ++ NPLib/Detectors/NeuLAND/TNeuLANDPhysics.cxx | 415 +++++ NPLib/Detectors/NeuLAND/TNeuLANDPhysics.h | 257 +++ NPLib/Detectors/NeuLAND/TNeuLANDSpectra.cxx | 174 ++ NPLib/Detectors/NeuLAND/TNeuLANDSpectra.h | 62 + NPLib/Detectors/Samurai/SamuraiFieldMap.cxx | 8 +- NPLib/Detectors/Samurai/TSamuraiBDCData.cxx | 1 + NPLib/Detectors/Samurai/TSamuraiBDCData.h | 2 +- .../Detectors/Samurai/TSamuraiBDCPhysics.cxx | 136 +- NPLib/Detectors/Samurai/TSamuraiBDCPhysics.h | 25 +- NPLib/Detectors/Samurai/TSamuraiFDC0Data.cxx | 3 +- .../Detectors/Samurai/TSamuraiFDC0Physics.cxx | 161 +- NPLib/Detectors/Samurai/TSamuraiFDC0Physics.h | 39 +- .../Detectors/Samurai/TSamuraiFDC2Physics.cxx | 108 +- NPLib/Detectors/Samurai/TSamuraiFDC2Physics.h | 19 +- .../Samurai/TSamuraiHodoscopePhysics.h | 1 + NPLib/Neutron/NPCrossTalk.cxx | 266 ++- NPLib/Neutron/NPCrossTalk.h | 4 +- NPLib/Physics/CMakeLists.txt | 9 +- NPLib/Physics/NPBeam.cxx | 1 - NPLib/Physics/NPBreitWigner.cxx | 269 +++ NPLib/Physics/NPBreitWigner.h | 125 ++ NPLib/Physics/NPQFS.cxx | 7 +- NPLib/Physics/NPQFS.h | 5 +- NPLib/Physics/NPReaction.cxx | 39 +- NPLib/Physics/NPReaction.h | 10 + NPLib/Physics/TReactionConditions.cxx | 2 +- NPLib/Physics/TReactionConditions.h | 5 +- .../NPDCReconstructionMT.cxx | 35 +- .../NPDCReconstructionMT.h | 2 +- NPSimulation/Core/MaterialManager.cc | 16 +- NPSimulation/Detectors/Minos/Minos.cc | 20 +- NPSimulation/Detectors/Nebula/Nebula.cc | 26 +- NPSimulation/Detectors/NeuLAND/CMakeLists.txt | 2 + NPSimulation/Detectors/NeuLAND/NeuLAND.cc | 493 ++++++ NPSimulation/Detectors/NeuLAND/NeuLAND.hh | 124 ++ NPSimulation/Detectors/Samurai/CMakeLists.txt | 2 +- NPSimulation/Detectors/Samurai/Samurai.cc | 20 +- NPSimulation/Detectors/Samurai/SamuraiBDC.cc | 455 +++++ NPSimulation/Detectors/Samurai/SamuraiBDC.hh | 151 ++ NPSimulation/Detectors/Samurai/SamuraiFDC0.cc | 390 +++++ NPSimulation/Detectors/Samurai/SamuraiFDC0.hh | 134 ++ NPSimulation/Detectors/Samurai/SamuraiFDC2.cc | 315 +++- NPSimulation/Detectors/Samurai/SamuraiFDC2.hh | 38 +- .../Samurai/SamuraiFieldPropagation.cc | 25 +- .../Samurai/SamuraiFieldPropagation.hh | 3 +- .../EventGenerator/EventGeneratorBeam.cc | 2 +- NPSimulation/Process/BeamReaction.cc | 5 +- NPSimulation/Process/CMakeLists.txt | 2 + NPSimulation/Scorers/CMakeLists.txt | 2 +- NPSimulation/Scorers/InteractionScorers.cc | 10 +- NPSimulation/Scorers/PlasticBar.cc | 11 +- NPSimulation/Scorers/PlasticBar.hh | 30 +- NPSimulation/Scorers/WireScorers.cc | 183 ++ NPSimulation/Scorers/WireScorers.hh | 170 ++ NPSimulation/ressources/macro/vis.mac.in | 4 - Projects/Dali/DaliMinos.detector | 8 +- Projects/Minos/Analysis.cxx | 2 +- Projects/Minos/Minos.detector | 2 +- Projects/Nebula/Analysis.cxx | 49 + Projects/Nebula/Analysis.h | 23 +- Projects/Nebula/Nebula.detector | 90 +- Projects/Nebula/db/NEBULA.xml | 14 +- Projects/Nebula/db/NEBULA2BARS.xml | 32 + Projects/Nebula/macro/GetTBrowser.C | 9 + Projects/Nebula/macro/draw/PositionZ.C | 17 +- Projects/Nebula/reaction/7Li_p_n_7Be.reaction | 15 +- .../Nebula/reaction/SimpleNeutrons.reaction | 4 +- Projects/S034/Analysis.cxx | 776 +++++++-- Projects/S034/Analysis.h | 186 +- Projects/S034/Calibration/BDC/CalibBDC.cxx | 2 +- Projects/S034/Calibration/BDC/CalibBDC1.cxx | 59 + Projects/S034/Calibration/BDC/CalibBDC2.cxx | 59 + Projects/S034/Calibration/FDC/CalibFDC0.cxx | 54 + Projects/S034/Calibration/FDC/CalibFDC2.cxx | 59 + Projects/S034/Calibration/Pos/BDC.cxx | 16 +- Projects/S034/Calibration/Pos/FDC.cxx | 41 +- Projects/S034/PhysicsListOption.txt | 2 +- Projects/S034/db/NEBULA.xml | 74 +- Projects/S034/db/NEULAND.xml | 1538 ++++++++++++++++- Projects/S034/{ => detector}/s034.detector | 54 +- Projects/S034/macro/Beam/BeamPlot.cxx | 54 + Projects/S034/macro/CalibFDC.cxx | 103 -- .../DriftChamber/DrawDCReconstructionBDCs.cxx | 271 +++ .../DriftChamber/DrawDCReconstructionFDC0.cxx | 145 ++ .../DriftChamber/DrawDCReconstructionFDC2.cxx | 192 ++ .../S034/macro/DriftChamber/ResolutionBDC.cxx | 297 ++++ .../macro/DriftChamber/ResolutionFDC0.cxx | 186 ++ .../macro/DriftChamber/ResolutionFDC2.cxx | 183 ++ Projects/S034/macro/testB2.cxx | 24 +- Projects/S034/minos_dali.detector | 95 - Projects/S034/project.config | 2 +- Projects/S034/reaction/He8.beam | 20 + Projects/S034/reaction/He8_pp.reaction | 61 + Projects/S034/reaction/pp.reaction | 1 + Projects/S034/root/analysis/.gitignore | 0 Projects/S034/root/mrdc/.gitignore | 0 Projects/S034/root/simulation/.gitignore | 0 Projects/Samurai/Samurai.detector | 24 +- 109 files changed, 9065 insertions(+), 955 deletions(-) create mode 100644 NPLib/Detectors/NeuLAND/CMakeLists.txt create mode 100644 NPLib/Detectors/NeuLAND/TNeuLANDData.cxx create mode 100644 NPLib/Detectors/NeuLAND/TNeuLANDData.h create mode 100644 NPLib/Detectors/NeuLAND/TNeuLANDPhysics.cxx create mode 100644 NPLib/Detectors/NeuLAND/TNeuLANDPhysics.h create mode 100644 NPLib/Detectors/NeuLAND/TNeuLANDSpectra.cxx create mode 100644 NPLib/Detectors/NeuLAND/TNeuLANDSpectra.h mode change 100644 => 100755 NPLib/Neutron/NPCrossTalk.cxx mode change 100644 => 100755 NPLib/Neutron/NPCrossTalk.h create mode 100644 NPLib/Physics/NPBreitWigner.cxx create mode 100644 NPLib/Physics/NPBreitWigner.h create mode 100644 NPSimulation/Detectors/NeuLAND/CMakeLists.txt create mode 100644 NPSimulation/Detectors/NeuLAND/NeuLAND.cc create mode 100644 NPSimulation/Detectors/NeuLAND/NeuLAND.hh create mode 100644 NPSimulation/Detectors/Samurai/SamuraiBDC.cc create mode 100644 NPSimulation/Detectors/Samurai/SamuraiBDC.hh create mode 100644 NPSimulation/Detectors/Samurai/SamuraiFDC0.cc create mode 100644 NPSimulation/Detectors/Samurai/SamuraiFDC0.hh create mode 100644 NPSimulation/Scorers/WireScorers.cc create mode 100644 NPSimulation/Scorers/WireScorers.hh create mode 100755 Projects/S034/Calibration/BDC/CalibBDC1.cxx create mode 100755 Projects/S034/Calibration/BDC/CalibBDC2.cxx create mode 100755 Projects/S034/Calibration/FDC/CalibFDC0.cxx create mode 100755 Projects/S034/Calibration/FDC/CalibFDC2.cxx rename Projects/S034/{ => detector}/s034.detector (56%) create mode 100644 Projects/S034/macro/Beam/BeamPlot.cxx delete mode 100755 Projects/S034/macro/CalibFDC.cxx create mode 100644 Projects/S034/macro/DriftChamber/DrawDCReconstructionBDCs.cxx create mode 100644 Projects/S034/macro/DriftChamber/DrawDCReconstructionFDC0.cxx create mode 100644 Projects/S034/macro/DriftChamber/DrawDCReconstructionFDC2.cxx create mode 100644 Projects/S034/macro/DriftChamber/ResolutionBDC.cxx create mode 100755 Projects/S034/macro/DriftChamber/ResolutionFDC0.cxx create mode 100755 Projects/S034/macro/DriftChamber/ResolutionFDC2.cxx delete mode 100644 Projects/S034/minos_dali.detector create mode 100755 Projects/S034/reaction/He8.beam create mode 100755 Projects/S034/reaction/He8_pp.reaction delete mode 100644 Projects/S034/root/analysis/.gitignore delete mode 100644 Projects/S034/root/mrdc/.gitignore delete mode 100644 Projects/S034/root/simulation/.gitignore diff --git a/Inputs/EventGenerator/neutron.source b/Inputs/EventGenerator/neutron.source index 9d673567e..b69093c2f 100755 --- a/Inputs/EventGenerator/neutron.source +++ b/Inputs/EventGenerator/neutron.source @@ -14,7 +14,7 @@ Isotropic % EnergyDistributionHist= hPFNS_jeff3.3.root PFNS_jeff_0 %EnergyDistribution= 0.38*sqrt(x)*exp(-x/0.847212) HalfOpenAngleMin= 0 - HalfOpenAngleMax= 180 + HalfOpenAngleMax= 30 x0= 0 y0= 0 z0= 0 mm diff --git a/NPLib/Core/NPDetectorFactory.cxx b/NPLib/Core/NPDetectorFactory.cxx index 221fd2acc..ff92dec21 100644 --- a/NPLib/Core/NPDetectorFactory.cxx +++ b/NPLib/Core/NPDetectorFactory.cxx @@ -112,13 +112,12 @@ NPL::VTreeReader* NPL::DetectorFactory::ConstructReader(std::string Token) { return m_ConstructReader[Token](); } else if (m_TokenLib.find(Token) != m_TokenLib.end()) { - std::cout << "In Token" << std::endl; + std::cout << "In Token : " << Token << std::endl; // Add absolute path to library name std::string path = getenv("NPTOOL"); - std::cout << "path : " << path << std::endl; std::string libName = path + "/NPLib/lib/" + m_TokenLib[Token]; dlopen(libName.c_str(), RTLD_NOW | RTLD_GLOBAL); - std::cout << "testtest " << libName.c_str() << std::endl; + std::cout << " Associated library : " << libName.c_str() << std::endl; char* LibError = dlerror(); if (m_ConstructReader.find(Token) != m_ConstructReader.end()) return m_ConstructReader[Token](); diff --git a/NPLib/Core/NPOptionManager.h b/NPLib/Core/NPOptionManager.h index c83050842..da7886e23 100644 --- a/NPLib/Core/NPOptionManager.h +++ b/NPLib/Core/NPOptionManager.h @@ -141,6 +141,7 @@ class NPOptionManager{ public: // user definition bool HasDefinition(std::string def) {return(fDefinition.find(def)!=fDefinition.end());} + int GetNumberDefinition(){return fDefinition.size();} private: // default values diff --git a/NPLib/Detectors/Minos/TMinosPhysics.cxx b/NPLib/Detectors/Minos/TMinosPhysics.cxx index 04ccd7800..630bdbb67 100644 --- a/NPLib/Detectors/Minos/TMinosPhysics.cxx +++ b/NPLib/Detectors/Minos/TMinosPhysics.cxx @@ -68,7 +68,7 @@ void TMinosPhysics::BuildPhysicalEvent() { Tracks_P0.push_back(clusters[i].GetP0()); Tracks_Dir.push_back(clusters[i].GetDir()); } - + if (sizeC == 2) { static TVector3 Vertex, delta; Delta_Vertex = MinimumDistanceTwoLines(Tracks_P0[0], Tracks_P0[0] + Tracks_Dir[0], Tracks_P0[1], @@ -90,9 +90,11 @@ void TMinosPhysics::PreTreat() { static string cal_v, cal_o; sizePad = m_EventData->GetPadMult(); + if (sizePad > 20) { for (unsigned int i = 0; i < sizePad; i++) { vector<unsigned short>* Charge = m_EventData->GetChargePtr(i); + if (Charge->size() > 40) { vector<unsigned short>* Time = m_EventData->GetTimePtr(i); m_utility.Calibrate(Time, Charge, i, T, Q); @@ -209,11 +211,11 @@ void TMinosPhysics::Clear() { Tracks_Dir.clear(); // Vertex information - X_Vertex = -1000; - Y_Vertex = -1000; - Z_Vertex = -1000; - Theta_12 = -1000; - Delta_Vertex = -1000; + X_Vertex = -10000; + Y_Vertex = -10000; + Z_Vertex = -10000; + Theta_12 = -10000; + Delta_Vertex = -10000; } /////////////////////////////////////////////////////////////////////////// @@ -235,6 +237,7 @@ void TMinosPhysics::ReadConfiguration(NPL::InputParser parser) { m_utility.SetParameters(m_TimeBin, m_ShapingTime, m_Baseline, m_Sampling); m_Position = blocks[i]->GetTVector3("Position", "mm"); m_ZRotation = blocks[i]->GetDouble("ZRotation", "deg"); + m_TargetLength = blocks[i]->GetDouble("TargetLength","mm"); string xmlpath = blocks[i]->GetString("XML"); NPL::XmlParser xml; xml.LoadFile(xmlpath); diff --git a/NPLib/Detectors/Minos/TMinosPhysics.h b/NPLib/Detectors/Minos/TMinosPhysics.h index f9ce20ac5..6c230a672 100644 --- a/NPLib/Detectors/Minos/TMinosPhysics.h +++ b/NPLib/Detectors/Minos/TMinosPhysics.h @@ -84,7 +84,7 @@ class TMinosPhysics : public TObject, public NPL::VDetector { unsigned int m_Sampling;//! TVector3 m_Position;//! double m_ZRotation;//! - + double m_TargetLength;//! NPL::MinosUtility m_utility;//! // an utility to fit the pad signal NPL::LinearRansac3D m_ransac;//! // a linear ransac to build the 3D tracks @@ -157,6 +157,8 @@ class TMinosPhysics : public TObject, public NPL::VDetector { vector<double> GetPad_Y() {return Y_Pad;} //! vector<double> GetPad_Z() {return Z_Pad;} //! vector<double> GetPad_T() {return T_Pad;} //! + + TVector3 GetVertex() {return TVector3(X_Vertex, Y_Vertex, Z_Vertex);}//! double GetVertexX() {return X_Vertex;} //! double GetVertexY() {return Y_Vertex;} //! double GetVertexZ() {return Z_Vertex;} //! @@ -164,11 +166,15 @@ class TMinosPhysics : public TObject, public NPL::VDetector { double GetDeltaVertex() {return Delta_Vertex;} //! double GetTheta12() {return Theta_12;} //! - int GetNbrOfTracks(){return Tracks_P0.size();} + int GetNbrOfTracks(){return Tracks_P0.size();}//! TVector3 GetTracksP0(unsigned int i){return Tracks_P0[i];}//! TVector3 GetTracksDir(unsigned int i){return Tracks_Dir[i];}//! double Angle(unsigned int i, unsigned j){return Tracks_Dir[i].Angle(Tracks_Dir[j]);}; + + TVector3 GetMinosPosition() {return m_Position;}//! + double GetTargetLength() {return m_TargetLength;}//! + // Static constructor to be passed to the Detector Factory public: static NPL::VDetector* Construct(); diff --git a/NPLib/Detectors/Nebula/TNebulaData.h b/NPLib/Detectors/Nebula/TNebulaData.h index 54eaea6e3..70dd23e5d 100644 --- a/NPLib/Detectors/Nebula/TNebulaData.h +++ b/NPLib/Detectors/Nebula/TNebulaData.h @@ -51,7 +51,6 @@ class TNebulaData : public TObject { // Time vector<UShort_t> fNebula_Td_ID; vector<Double_t> fNebula_Td_Time; - ////////////////////////////////////////////////////////////// // Constructor and destructor diff --git a/NPLib/Detectors/Nebula/TNebulaPhysics.cxx b/NPLib/Detectors/Nebula/TNebulaPhysics.cxx index 6a9202c7a..88999657a 100644 --- a/NPLib/Detectors/Nebula/TNebulaPhysics.cxx +++ b/NPLib/Detectors/Nebula/TNebulaPhysics.cxx @@ -36,21 +36,27 @@ using namespace std; #include "NPDetectorFactory.h" #include "NPOptionManager.h" #include "NPSystemOfUnits.h" + // ROOT #include "TChain.h" -ClassImp(TNebulaPhysics) +//To get light speed +#include "NPPhysicalConstants.h" +ClassImp(TNebulaPhysics) /////////////////////////////////////////////////////////////////////////// TNebulaPhysics::TNebulaPhysics() : m_EventData(new TNebulaData), m_EventPhysics(this), m_Spectra(0), - m_Q_RAW_Threshold(0), // adc channels - m_Q_Threshold(7), // normal bars in MeV + m_Q_RAW_Threshold(1), // adc channels + m_Q_Threshold(6), // normal bars in MeV m_V_Threshold(1), // veto bars in MeV - m_NumberOfBars(0) { + m_NumberOfBars(0) +{ + m_Material_Index = 1.58; + m_Signal_Effective_Velocity = (299792458/m_Material_Index)*NPUNITS::m/NPUNITS::s; } /////////////////////////////////////////////////////////////////////////// @@ -63,9 +69,11 @@ void TNebulaPhysics::ReadXML(NPL::XmlParser xml){ unsigned int id = b[i]->AsInt("ID"); // position - PositionX[id] = b[i]->AsDouble("PosX"); - PositionY[id] = b[i]->AsDouble("PosY"); + PositionX[id] = b[i]->AsDouble("PosX"); + PositionY[id] = b[i]->AsDouble("PosY"); PositionZ[id] = b[i]->AsDouble("PosZ"); + SubLayer[id] = b[i]->AsInt("SubLayer"); + std::string tree_name = RootInput::getInstance()->GetChain()->GetName(); if(tree_name!="SimulatedTree"){ // linear cal @@ -88,7 +96,9 @@ void TNebulaPhysics::ReadXML(NPL::XmlParser xml){ // DT position cal DTa[id] = b[i]->AsDouble("DTCal");//! DTb[id] = b[i]->AsDouble("DTOff");//! + } + else{ // linear cal aQu[id] =1; @@ -101,18 +111,19 @@ void TNebulaPhysics::ReadXML(NPL::XmlParser xml){ bTd[id] =0; // T average offset - avgT0[id]= 0; + //avgT0[id]= 0; + avgT0[id]= -4.743; // slew correction T= tcal +slwT/sqrt(Qcal) slwTu[id] = 0; slwTd[id] = 0; // DT position cal - DTa[id] = 1;//! + // DTa[id] = 1;//! DTb[id] = 0;//! - - + DTa[id] = 0.5*m_Signal_Effective_Velocity;//! } + } cout << " -> " << m_NumberOfBars << " bars found" << endl;; @@ -129,17 +140,25 @@ void TNebulaPhysics::BuildSimplePhysicalEvent() { void TNebulaPhysics::BuildPhysicalEvent() { // apply thresholds and calibration + // instantiate CalibrationManager static CalibrationManager* Cal = CalibrationManager::getInstance(); static double rawQup,calQup,rawQdown,calQdown,rawTup,calTup,rawTdown,calTdown,calQ,calT,Y; static unsigned int ID; + + + static double neutron_mass = 939.57; // MeV/c^2 + static double c_light = 299792458; //m.s-1 + // All vector size static unsigned int QUsize, QDsize, TUsize, TDsize ; QUsize = m_EventData->GetChargeUpMult(); QDsize = m_EventData->GetChargeDownMult(); TUsize = m_EventData->GetTimeUpMult(); TDsize = m_EventData->GetTimeDownMult(); + static double threshold; + // loop on Qup for (unsigned int qup = 0; qup < QUsize ; qup++) { rawQup = m_EventData->GetChargeUp(qup); @@ -208,14 +227,16 @@ void TNebulaPhysics::BuildPhysicalEvent() { DetectorNumber.push_back(ID); Charge.push_back(calQ); TOF.push_back(calT); - PosY.push_back(Y+PositionY[ID]); + PosY.push_back(Y+PositionY[ID]); PosX.push_back(PositionX[ID]); - PosZ.push_back(PositionZ[ID]); + PosZ.push_back(PositionZ[ID] + m_offset[0][2]); // [0]-> only one Nebula detector [2]-> z position - if(ID<121) - IsVeto.push_back(0); - else + if(SubLayer[ID]!=0){ + IsVeto.push_back(0); + } + else{ IsVeto.push_back(1); + } } } diff --git a/NPLib/Detectors/Nebula/TNebulaPhysics.h b/NPLib/Detectors/Nebula/TNebulaPhysics.h index 5e1499b8e..ea13da123 100644 --- a/NPLib/Detectors/Nebula/TNebulaPhysics.h +++ b/NPLib/Detectors/Nebula/TNebulaPhysics.h @@ -74,7 +74,22 @@ class TNebulaPhysics : public TObject, public NPL::VDetector { public: TVector3 GetPos(const unsigned int& i) const{ return TVector3(PosX[i],PosY[i],PosZ[i]); - } + }; + + double GetCharge(const unsigned int& i) const{ + return Charge[i]; + }; + int GetChargeMult() const{ + return Charge.size(); + }; + + double GetDetectorNumber(const unsigned int& i) const{ + return DetectorNumber[i]; + }; + + int GetDetectorNumberMult() const{ + return DetectorNumber.size(); + }; // Return true if one veto fired bool HasVeto(){ @@ -193,6 +208,10 @@ class TNebulaPhysics : public TObject, public NPL::VDetector { double m_Q_Threshold; //! double m_V_Threshold; //! + //effective velocity of signal inside bar + double m_Material_Index; //! + double m_Signal_Effective_Velocity; //! + public: void SetQThreshold(double t) {m_Q_Threshold=t;}; void SetVThreshold(double t) {m_V_Threshold=t;}; @@ -200,6 +219,9 @@ class TNebulaPhysics : public TObject, public NPL::VDetector { private: int m_NumberOfBars; //! + private: + std::map<unsigned int , unsigned int> SubLayer;//! + private: // offset and inversion std::map<unsigned int, TVector3> m_offset;//! std::map<unsigned int, bool> m_invertX;//! diff --git a/NPLib/Detectors/NeuLAND/CMakeLists.txt b/NPLib/Detectors/NeuLAND/CMakeLists.txt new file mode 100644 index 000000000..1898430d9 --- /dev/null +++ b/NPLib/Detectors/NeuLAND/CMakeLists.txt @@ -0,0 +1,6 @@ +add_custom_command(OUTPUT TNeuLANDPhysicsDict.cxx COMMAND ${CMAKE_BINARY_DIR}/scripts/build_dict.sh TNeuLANDPhysics.h TNeuLANDPhysicsDict.cxx TNeuLANDPhysics.rootmap libNPNeuLAND.dylib DEPENDS TNeuLANDPhysics.h) +add_custom_command(OUTPUT TNeuLANDDataDict.cxx COMMAND ${CMAKE_BINARY_DIR}/scripts/build_dict.sh TNeuLANDData.h TNeuLANDDataDict.cxx TNeuLANDData.rootmap libNPNeuLAND.dylib DEPENDS TNeuLANDData.h) +add_library(NPNeuLAND SHARED TNeuLANDSpectra.cxx TNeuLANDData.cxx TNeuLANDPhysics.cxx TNeuLANDDataDict.cxx TNeuLANDPhysicsDict.cxx ) +target_link_libraries(NPNeuLAND ${ROOT_LIBRARIES} NPCore) +install(FILES TNeuLANDData.h TNeuLANDPhysics.h TNeuLANDSpectra.h DESTINATION ${CMAKE_INCLUDE_OUTPUT_DIRECTORY}) + diff --git a/NPLib/Detectors/NeuLAND/TNeuLANDData.cxx b/NPLib/Detectors/NeuLAND/TNeuLANDData.cxx new file mode 100644 index 000000000..5dbaec958 --- /dev/null +++ b/NPLib/Detectors/NeuLAND/TNeuLANDData.cxx @@ -0,0 +1,92 @@ +/***************************************************************************** + * Copyright (C) 2009-2019 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 : December 2019 * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * This class hold NeuLAND Raw data * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + * * + *****************************************************************************/ + +#include "TNeuLANDData.h" + +#include <iostream> +#include <fstream> +#include <sstream> +#include <string> +using namespace std; + +ClassImp(TNeuLANDData) + + +////////////////////////////////////////////////////////////////////// +TNeuLANDData::TNeuLANDData() { +} + + + +////////////////////////////////////////////////////////////////////// +TNeuLANDData::~TNeuLANDData() { +} + + + +////////////////////////////////////////////////////////////////////// +void TNeuLANDData::Clear() { + // UP // + // Charge + fNeuLAND_Qu_ID.clear(); + fNeuLAND_Qu_Charge.clear(); + + // Time + fNeuLAND_Tu_ID.clear(); + fNeuLAND_Tu_Time.clear(); + + // DOWN // + // Charge + fNeuLAND_Qd_ID.clear(); + fNeuLAND_Qd_Charge.clear(); + + // Time + fNeuLAND_Td_ID.clear(); + fNeuLAND_Td_Time.clear(); +} + + + +////////////////////////////////////////////////////////////////////// +void TNeuLANDData::Dump() const { + // This method is very useful for debuging and worth the dev. + cout << "XXXXXXXXXXXXXXXXXXXXXXXX New Event [TNeuLANDData::Dump()] XXXXXXXXXXXXXXXXX" << endl; + /* + // Energy + size_t mysize = fNeuLAND_E_DetectorNbr.size(); + cout << "NeuLAND_E_Mult: " << mysize << endl; + + for (size_t i = 0 ; i < mysize ; i++){ + cout << "DetNbr: " << fNeuLAND_E_DetectorNbr[i] + << " Energy: " << fNeuLAND_Energy[i]; + } + + // Time + mysize = fNeuLAND_T_DetectorNbr.size(); + cout << "NeuLAND_T_Mult: " << mysize << endl; + + for (size_t i = 0 ; i < mysize ; i++){ + cout << "DetNbr: " << fNeuLAND_T_DetectorNbr[i] + << " Time: " << fNeuLAND_Time[i]; + } + */ +} diff --git a/NPLib/Detectors/NeuLAND/TNeuLANDData.h b/NPLib/Detectors/NeuLAND/TNeuLANDData.h new file mode 100644 index 000000000..4f6f274c1 --- /dev/null +++ b/NPLib/Detectors/NeuLAND/TNeuLANDData.h @@ -0,0 +1,147 @@ +#ifndef __NeuLANDDATA__ +#define __NeuLANDDATA__ +/***************************************************************************** + * Copyright (C) 2009-2019 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 : December 2019 * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * This class hold NeuLAND Raw data * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + * * + *****************************************************************************/ + +// STL +#include <vector> +using namespace std; + +// ROOT +#include "TObject.h" + +class TNeuLANDData : public TObject { + ////////////////////////////////////////////////////////////// + // data members are hold into vectors in order + // to allow multiplicity treatment + private: + // UP // + // Charge + vector<UShort_t> fNeuLAND_Qu_ID; + vector<Double_t> fNeuLAND_Qu_Charge; + + // Time + vector<UShort_t> fNeuLAND_Tu_ID; + vector<Double_t> fNeuLAND_Tu_Time; + + // DOWN // + // Charge + vector<UShort_t> fNeuLAND_Qd_ID; + vector<Double_t> fNeuLAND_Qd_Charge; + + // Time + vector<UShort_t> fNeuLAND_Td_ID; + vector<Double_t> fNeuLAND_Td_Time; + + + ////////////////////////////////////////////////////////////// + // Constructor and destructor + public: + TNeuLANDData(); + ~TNeuLANDData(); + + + ////////////////////////////////////////////////////////////// + // Inherited from TObject and overriden to avoid warnings + public: + void Clear(); + void Clear(const Option_t*) {}; + void Dump() const; + + + ////////////////////////////////////////////////////////////// + // Getters and Setters + // Prefer inline declaration to avoid unnecessary called of + // frequently used methods + // add //! to avoid ROOT creating dictionnary for the methods + public: + ////////////////////// SETTERS //////////////////////// + // UP // + // Charge + inline void SetChargeUp(const Double_t& ID, const Double_t& Charge){ + fNeuLAND_Qu_ID.push_back(ID); + fNeuLAND_Qu_Charge.push_back(Charge); + };//! + + // Time + inline void SetTimeUp(const Double_t& ID, const Double_t& Time){ + fNeuLAND_Tu_ID.push_back(ID); + fNeuLAND_Tu_Time.push_back(Time); + };//! + + // DOWN // + // Charge + inline void SetChargeDown(const Double_t& ID, const Double_t& Charge){ + fNeuLAND_Qd_ID.push_back(ID); + fNeuLAND_Qd_Charge.push_back(Charge); + };//! + + // Time + inline void SetTimeDown(const Double_t& ID, const Double_t& Time){ + fNeuLAND_Td_ID.push_back(ID); + fNeuLAND_Td_Time.push_back(Time); + };//! + + ////////////////////// GETTERS //////////////////////// + // MULT // + // Charge + inline unsigned int GetChargeUpMult() const + {return fNeuLAND_Qu_ID.size();}; + // Time + inline unsigned int GetTimeUpMult() const + {return fNeuLAND_Tu_ID.size();}; + // Charge + inline unsigned int GetChargeDownMult() const + {return fNeuLAND_Qd_ID.size();}; + // Time + inline unsigned int GetTimeDownMult() const + {return fNeuLAND_Td_ID.size();}; + + // Value // + // Charge + inline UShort_t GetChargeUpID(unsigned int& i) const + {return fNeuLAND_Qu_ID[i];}; + inline double GetChargeUp(unsigned int& i) const + {return fNeuLAND_Qu_Charge[i];}; + // Time + inline UShort_t GetTimeUpID(unsigned int& i) const + {return fNeuLAND_Tu_ID[i];}; + inline double GetTimeUp(unsigned int& i) const + {return fNeuLAND_Tu_Time[i];}; + // Charge + inline UShort_t GetChargeDownID(unsigned int& i) const + {return fNeuLAND_Qd_ID[i];}; + inline double GetChargeDown(unsigned int& i) const + {return fNeuLAND_Qd_Charge[i];}; + // Time + inline UShort_t GetTimeDownID(unsigned int& i) const + {return fNeuLAND_Td_ID[i];}; + inline double GetTimeDown(unsigned int& i) const + {return fNeuLAND_Td_Time[i];}; + + + ////////////////////////////////////////////////////////////// + // Required for ROOT dictionnary + ClassDef(TNeuLANDData,1) // NeuLANDData structure +}; + +#endif diff --git a/NPLib/Detectors/NeuLAND/TNeuLANDPhysics.cxx b/NPLib/Detectors/NeuLAND/TNeuLANDPhysics.cxx new file mode 100644 index 000000000..baf075286 --- /dev/null +++ b/NPLib/Detectors/NeuLAND/TNeuLANDPhysics.cxx @@ -0,0 +1,415 @@ +/***************************************************************************** + * Copyright (C) 2009-2019 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: Audrey ANNE contact address: anne@lpccaen.in2p3.fr * + * * + * Creation Date : November 2023 * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * This class hold NeuLAND Treated data * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + * * + *****************************************************************************/ + +#include "TNeuLANDPhysics.h" + +// STL +#include <sstream> +#include <iostream> +#include <cmath> +#include <stdlib.h> +#include <limits> +using namespace std; + +// NPL +#include "RootInput.h" +#include "RootOutput.h" +#include "NPDetectorFactory.h" +#include "NPOptionManager.h" +#include "NPSystemOfUnits.h" +// ROOT +#include "TChain.h" + +ClassImp(TNeuLANDPhysics) + + + /////////////////////////////////////////////////////////////////////////// +TNeuLANDPhysics::TNeuLANDPhysics() + : m_EventData(new TNeuLANDData), + m_EventPhysics(this), + m_Spectra(0), + m_Q_RAW_Threshold(0), // adc channels + m_Q_Threshold(7), // normal bars in MeV + m_V_Threshold(1), // veto bars in MeV + m_NumberOfBars(0) + { + m_Material_Index = 1.58; + m_Signal_Effective_Velocity = (3.0e8/m_Material_Index)*NPUNITS::m/NPUNITS::s; + } + +/////////////////////////////////////////////////////////////////////////// +/// A usefull method to bundle all operation to add a detector +void TNeuLANDPhysics::ReadXML(NPL::XmlParser xml){ + std::vector<NPL::XML::block*> b = xml.GetAllBlocksWithName("NEULAND"); + + for(unsigned int i = 0 ; i < b.size() ; i++){ + m_NumberOfBars++; + unsigned int id = b[i]->AsInt("ID"); + + // position + PositionX[id] = b[i]->AsDouble("xpos"); + PositionY[id] = b[i]->AsDouble("ypos"); + PositionZ[id] = b[i]->AsDouble("zpos"); + + // bar direction + DirectionBar[id] = b[i]->AsString("direction"); + + std::string tree_name = RootInput::getInstance()->GetChain()->GetName(); + + if(tree_name!="SimulatedTree"){ + // linear cal + aQu[id] = b[i]->AsDouble("QUCal"); + bQu[id] = b[i]->AsDouble("QUPed"); + aQd[id] = b[i]->AsDouble("QDCal"); + bQd[id] = b[i]->AsDouble("QDPed"); + aTu[id] = b[i]->AsDouble("TUCal"); + bTu[id] = b[i]->AsDouble("TUOff"); + aTd[id] = b[i]->AsDouble("TDCal"); + bTd[id] = b[i]->AsDouble("TDOff"); + + // T average offset + avgT0[id] = b[i]->AsDouble("TAveOff"); + + // slew correction T= tcal +slwT/sqrt(Qcal) + slwTu[id] = b[i]->AsDouble("TUSlw"); + slwTd[id] = b[i]->AsDouble("TDSlw"); + + // DT position cal + DTa[id] = b[i]->AsDouble("DTCal");//! + DTb[id] = b[i]->AsDouble("DTOff");//! + } + else{ + // linear cal + aQu[id] =1; + bQu[id] =0; + aQd[id] =1; + bQd[id] =0; + aTu[id] =1; + bTu[id] =0; + aTd[id] =1; + bTd[id] =0; + + // T average offset + //avgT0[id]= 0.0; + avgT0[id]= -6.5833; + + // slew correction T= tcal +slwT/sqrt(Qcal) + slwTu[id] = 0; + slwTd[id] = 0; + + // DT position cal + // DTa[id] = 1;//! + DTb[id] = 0;//! + + DTa[id] = 0.5*m_Signal_Effective_Velocity;//! + //DTa[id] = 94.87;//! + + + } + + } + cout << " -> " << m_NumberOfBars << " bars found" << endl; +} + +/////////////////////////////////////////////////////////////////////////// +void TNeuLANDPhysics::BuildSimplePhysicalEvent() { + BuildPhysicalEvent(); +} + + + +/////////////////////////////////////////////////////////////////////////// +void TNeuLANDPhysics::BuildPhysicalEvent() { + // apply thresholds and calibration + + // instantiate CalibrationManager + static CalibrationManager* Cal = CalibrationManager::getInstance(); + static double rawQup,calQup,rawQdown,calQdown,rawTup,calTup,rawTdown,calTdown,calQ,calT,X,Y; + static unsigned int ID; + + static double neutron_mass = 939.57; // MeV/c^2 + static double c_light = 299792458; //m.s-1 + + // All vector size + static unsigned int QUsize, QDsize, TUsize, TDsize ; + QUsize = m_EventData->GetChargeUpMult(); + QDsize = m_EventData->GetChargeDownMult(); + TUsize = m_EventData->GetTimeUpMult(); + TDsize = m_EventData->GetTimeDownMult(); + static double threshold; + // loop on Qup + for (unsigned int qup = 0; qup < QUsize ; qup++) { + rawQup = m_EventData->GetChargeUp(qup); + rawTup=-1; + rawQdown=-1; + rawTdown=-1; + if (rawQup > m_Q_RAW_Threshold) { + ID = m_EventData->GetChargeUpID(qup); + if(ID<401) + threshold=m_Q_Threshold; + else + threshold=m_V_Threshold; + + // look for associated Charge down + for(unsigned int qdown = 0 ; qdown < QDsize ; qdown++){ + if(m_EventData->GetChargeDownID(qdown)==ID){ + rawQdown=m_EventData->GetChargeDown(qdown); + if(rawQdown > m_Q_RAW_Threshold) + { + // Look for the associate time + for(unsigned int tdown = 0 ; tdown < TDsize; tdown++) + { + if(m_EventData->GetTimeDownID(qdown)==ID) + { + rawTdown=m_EventData->GetTimeDown(qdown); + break; + } + }// TDown + }//if raw threshold down + break; + } //if match ID + + }// Qdwown + + if(rawTdown>0){ // Tdown is found, means Qdown as well + // look for Tup + for(unsigned int tup = 0 ; tup < TUsize ; tup++){ + if(m_EventData->GetTimeUpID(tup)==ID){ + rawTup = m_EventData->GetTimeUp(tup); + break; + } + } + } + // Got everything, do the math + if(rawTup>0){ + // cal Q Up and Down + calQup=aQu[ID]*(rawQup-bQu[ID]); + calQdown=aQd[ID]*(rawQdown-bQd[ID]); + + // average value of Up and Down + calQ=sqrt(calQup*calQdown); + + // cal T Up + calTup=aTu[ID]*rawTup+bTu[ID]; + // slew correction + calTup -= slwTu[ID]/sqrt(rawQup-bQu[ID]); + + // cal T Down + calTdown=aTd[ID]*rawTdown+bTd[ID]; + // slew correction + calTdown -= slwTd[ID]/sqrt(rawQdown-bQd[ID]); + + if(calQ>threshold){ + calT= (calTdown+calTup)*0.5+avgT0[ID]+Cal->GetPedestal("NEULAND_T_ID"+NPL::itoa(ID)); + + if(DirectionBar[ID]=='H') + { + X = (calTdown-calTup)*DTa[ID]+DTb[ID]+Cal->GetPedestal("NEULAND_X_ID"+NPL::itoa(ID)); + Y = 0.0; + } + + if(DirectionBar[ID]=='V') + { + X = 0.0; + Y=(calTdown-calTup)*DTa[ID]+DTb[ID]+Cal->GetPedestal("NEULAND_Y_ID"+NPL::itoa(ID)); + } + + DetectorNumber.push_back(ID); + Charge.push_back(calQ); + TOF.push_back(calT); + PosY.push_back(Y+PositionY[ID]); + PosX.push_back(X+PositionX[ID]); + PosZ.push_back(PositionZ[ID] + m_offset[0][2]); // [0]-> only one Nebula detector [2]-> z position + + if(ID<401) + { + IsVeto.push_back(0); + } + else + IsVeto.push_back(1); + + X = 0.0; + Y = 0.0; + + } + } + + }// if raw threshold up + } // Qup +} + +/////////////////////////////////////////////////////////////////////////// +void TNeuLANDPhysics::PreTreat() { + +} + + + +/////////////////////////////////////////////////////////////////////////// +void TNeuLANDPhysics::ReadAnalysisConfig() { +} + +/////////////////////////////////////////////////////////////////////////// +void TNeuLANDPhysics::Clear() { + DetectorNumber.clear(); + Charge.clear(); + TOF.clear(); + PosY.clear(); + PosX.clear(); + PosZ.clear(); + IsVeto.clear(); +} + +/////////////////////////////////////////////////////////////////////////// +void TNeuLANDPhysics::ReadConfiguration(NPL::InputParser parser) { + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("NEULAND"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detector(s) found " << endl; + + vector<string> token= {"XML","Offset","InvertX","InvertY"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + cout << endl << "//// NeuLAND (" << i+1 << ")" << endl; + unsigned int det = std::atoi(blocks[i]->GetMainValue().c_str()); + string xmlpath = blocks[i]->GetString("XML"); + NPL::XmlParser xml; + xml.LoadFile(xmlpath); + ReadXML(xml); + TVector3 offset = blocks[i]->GetTVector3("Offset","mm"); + bool invertX = blocks[i]->GetInt("InvertX"); + bool invertY = blocks[i]->GetInt("InvertY"); + m_offset[det] = offset; + m_invertX[det] = invertX; + m_invertY[det] = invertY; + } + } +} + +/////////////////////////////////////////////////////////////////////////// +void TNeuLANDPhysics::InitSpectra() { + m_Spectra = new TNeuLANDSpectra(m_NumberOfBars); +} + + + +/////////////////////////////////////////////////////////////////////////// +void TNeuLANDPhysics::FillSpectra() { + m_Spectra -> FillRawSpectra(m_EventData); + m_Spectra -> FillPhysicsSpectra(m_EventPhysics); +} + + + +/////////////////////////////////////////////////////////////////////////// +void TNeuLANDPhysics::CheckSpectra() { + m_Spectra->CheckSpectra(); +} + + + +/////////////////////////////////////////////////////////////////////////// +void TNeuLANDPhysics::ClearSpectra() { +} + + + +/////////////////////////////////////////////////////////////////////////// +map< string , TH1*> TNeuLANDPhysics::GetSpectra() { + if(m_Spectra) + return m_Spectra->GetMapHisto(); + else{ + map< string , TH1*> empty; + return empty; + } +} + +/////////////////////////////////////////////////////////////////////////// +void TNeuLANDPhysics::WriteSpectra() { + m_Spectra->WriteSpectra(); +} + + + +/////////////////////////////////////////////////////////////////////////// +void TNeuLANDPhysics::AddParameterToCalibrationManager() { + CalibrationManager* Cal = CalibrationManager::getInstance(); + + vector<double> standardO={0}; + for (int i = 0; i < m_NumberOfBars; ++i) { + Cal->AddParameter("NEULAND_T_ID"+ NPL::itoa(i+1),standardO); + Cal->AddParameter("NEULAND_X_ID"+ NPL::itoa(i+1),standardO); + Cal->AddParameter("NEULAND_Y_ID"+ NPL::itoa(i+1),standardO); + } +} + + + +/////////////////////////////////////////////////////////////////////////// +void TNeuLANDPhysics::InitializeRootInputRaw() { + TChain* inputChain = RootInput::getInstance()->GetChain(); + inputChain->SetBranchStatus("NeuLAND", true ); + inputChain->SetBranchAddress("NeuLAND", &m_EventData ); +} + + + +/////////////////////////////////////////////////////////////////////////// +void TNeuLANDPhysics::InitializeRootInputPhysics() { + TChain* inputChain = RootInput::getInstance()->GetChain(); + inputChain->SetBranchAddress("NeuLAND", &m_EventPhysics); +} + + + +/////////////////////////////////////////////////////////////////////////// +void TNeuLANDPhysics::InitializeRootOutput() { + TTree* outputTree = RootOutput::getInstance()->GetTree("NeuLAND"); + outputTree->Branch("NeuLAND", "TNeuLANDPhysics", &m_EventPhysics); +} + + + +//////////////////////////////////////////////////////////////////////////////// +// Construct Method to be pass to the DetectorFactory // +//////////////////////////////////////////////////////////////////////////////// +NPL::VDetector* TNeuLANDPhysics::Construct() { + return (NPL::VDetector*) new TNeuLANDPhysics(); +} + + + +//////////////////////////////////////////////////////////////////////////////// +// Registering the construct method to the factory // +//////////////////////////////////////////////////////////////////////////////// +extern "C"{ + class proxy_NeuLAND{ + public: + proxy_NeuLAND(){ + NPL::DetectorFactory::getInstance()->AddToken("NEULAND","NeuLAND"); + NPL::DetectorFactory::getInstance()->AddDetector("NEULAND",TNeuLANDPhysics::Construct); + } + }; + + proxy_NeuLAND p_NeuLAND; +} + diff --git a/NPLib/Detectors/NeuLAND/TNeuLANDPhysics.h b/NPLib/Detectors/NeuLAND/TNeuLANDPhysics.h new file mode 100644 index 000000000..eded36d18 --- /dev/null +++ b/NPLib/Detectors/NeuLAND/TNeuLANDPhysics.h @@ -0,0 +1,257 @@ +#ifndef TNeuLANDPHYSICS_H +#define TNeuLANDPHYSICS_H +/***************************************************************************** + * Copyright (C) 2009-2019 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: Audrey ANNE contact address: anne@lpccaen.in2p3.fr * + * * + * Creation Date : November 2023 * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * This class hold NeuLAND Treated data * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + * * + *****************************************************************************/ + +// C++ headers +#include <vector> +#include <map> +#include <string> +using namespace std; + +// ROOT headers +#include "TObject.h" +#include "TH1.h" +#include "TVector3.h" +// NPTool headers +#include "TNeuLANDData.h" +#include "TNeuLANDSpectra.h" +#include "NPCalibrationManager.h" +#include "NPVDetector.h" +#include "NPInputParser.h" +#include "NPXmlParser.h" +// forward declaration +class TNeuLANDSpectra; + + + +class TNeuLANDPhysics : public TObject, public NPL::VDetector { + ////////////////////////////////////////////////////////////// + // constructor and destructor + public: + TNeuLANDPhysics(); + ~TNeuLANDPhysics() {}; + + + ////////////////////////////////////////////////////////////// + // Inherited from TObject and overriden to avoid warnings + public: + void Clear(); + void Clear(const Option_t*) {}; + + + ////////////////////////////////////////////////////////////// + // data obtained after BuildPhysicalEvent() and stored in + // output ROOT file + public: + vector<int> DetectorNumber; + vector<double> Charge; + vector<double> TOF; + vector<double> PosY; + vector<double> PosX; + vector<double> PosZ; + vector<bool> IsVeto; + + public: + TVector3 GetPos(const unsigned int& i) const{ + return TVector3(PosX[i],PosY[i],PosZ[i]); + } + + // Return true if one veto fired + bool HasVeto(){ + unsigned int size = IsVeto.size(); + for(unsigned int i = 0 ; i < size ; i++){ + if(IsVeto[i]) + return true; + } + return false; + }; + + /////////// Get index of fastest neutron + int GetFirstHit(){ + unsigned int size = TOF.size(); + unsigned int index=0; + + if(!size) + return -1; + + double tof = TOF[0]; + for(unsigned int i = 1 ; i < size ; i++){ + if(tof<TOF[i]){ + tof=TOF[i]; + index=i; + } + } + return index; + }; + + public: + /// A usefull method to bundle all operation to add a detector + void ReadXML(NPL::XmlParser); + + ////////////////////////////////////////////////////////////// + // methods inherited from the VDetector ABC class + public: + // read stream from ConfigFile to pick-up detector parameters + void ReadConfiguration(NPL::InputParser); + + // add parameters to the CalibrationManger + void AddParameterToCalibrationManager(); + + // method called event by event, aiming at extracting the + // physical information from detector + void BuildPhysicalEvent(); + + // same as BuildPhysicalEvent() method but with a simpler + // treatment + void BuildSimplePhysicalEvent(); + + // same as above but for online analysis + void BuildOnlinePhysicalEvent() {BuildPhysicalEvent();}; + + // activate raw data object and branches from input TChain + // in this method mother branches (Detector) AND daughter leaves + // (fDetector_parameter) have to be activated + void InitializeRootInputRaw(); + + // activate physics data object and branches from input TChain + // in this method mother branches (Detector) AND daughter leaves + // (fDetector_parameter) have to be activated + void InitializeRootInputPhysics(); + + // create branches of output ROOT file + void InitializeRootOutput(); + + // clear the raw and physical data objects event by event + void ClearEventPhysics() {Clear();} + void ClearEventData() {m_EventData->Clear();} + + // methods related to the TNeuLANDSpectra class + // instantiate the TNeuLANDSpectra class and + // declare list of histograms + void InitSpectra(); + + // fill the spectra + void FillSpectra(); + + // used for Online mainly, sanity check for histograms and + // change their color if issues are found, for example + void CheckSpectra(); + + // used for Online only, clear all the spectra + void ClearSpectra(); + + // write spectra to ROOT output file + void WriteSpectra(); + + + ////////////////////////////////////////////////////////////// + // specific methods to NeuLAND array + public: + // remove bad channels, calibrate the data and apply thresholds + void PreTreat(); + + // read the user configuration file. If no file is found, load standard one + void ReadAnalysisConfig(); + + // give and external TNeuLANDData object to TNeuLANDPhysics. + // needed for online analysis for example + void SetRawDataPointer(TNeuLANDData* rawDataPointer) {m_EventData = rawDataPointer;} + + // objects are not written in the TTree + private: + TNeuLANDData* m_EventData; //! + TNeuLANDPhysics* m_EventPhysics; //! + + // getters for raw and pre-treated data object + public: + TNeuLANDData* GetRawData() const {return m_EventData;} + + // parameters used in the analysis + private: + // thresholds + double m_Q_RAW_Threshold; //! + double m_Q_Threshold; //! + double m_V_Threshold; //! + + //effective velocity of signal inside bar + double m_Material_Index; //! + double m_Signal_Effective_Velocity; //! + + public: + void SetQThreshold(double t) {m_Q_Threshold=t;}; + void SetVThreshold(double t) {m_V_Threshold=t;}; + // number of detectors + private: + int m_NumberOfBars; //! + + private: // offset and inversion + std::map<unsigned int, TVector3> m_offset;//! + std::map<unsigned int, bool> m_invertX;//! + std::map<unsigned int, bool> m_invertY;//! + + private: // xml calibration + // position + std::map<unsigned int , double > PositionX;//! + std::map<unsigned int , double > PositionY;//! + std::map<unsigned int , double > PositionZ;//! + + //Horizontal or Vertical + std::map<unsigned int, string> DirectionBar;//! + + // linear cal + std::map<unsigned int , double > aQu;//! + std::map<unsigned int , double > bQu;//! + std::map<unsigned int , double > aQd;//! + std::map<unsigned int , double > bQd;//! + std::map<unsigned int , double > aTu;//! + std::map<unsigned int , double > bTu;//! + std::map<unsigned int , double > aTd;//! + std::map<unsigned int , double > bTd;//! + + // T average offset + std::map<unsigned int , double > avgT0;//! + + // slew correction T= tcal +slwT/sqrt(Qcal) + std::map<unsigned int , double > slwTu;//! + std::map<unsigned int , double > slwTd;//! + + // DT position cal + std::map<unsigned int , double > DTa;//! + std::map<unsigned int , double > DTb;//! + + + // spectra class + private: + TNeuLANDSpectra* m_Spectra; // ! + + // spectra getter + public: + map<string, TH1*> GetSpectra(); + + // Static constructor to be passed to the Detector Factory + public: + static NPL::VDetector* Construct(); + + ClassDef(TNeuLANDPhysics,1) // NeuLANDPhysics structure +}; +#endif diff --git a/NPLib/Detectors/NeuLAND/TNeuLANDSpectra.cxx b/NPLib/Detectors/NeuLAND/TNeuLANDSpectra.cxx new file mode 100644 index 000000000..2e3591a14 --- /dev/null +++ b/NPLib/Detectors/NeuLAND/TNeuLANDSpectra.cxx @@ -0,0 +1,174 @@ +/***************************************************************************** + * Copyright (C) 2009-2019 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 : December 2019 * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * This class hold NeuLAND Spectra * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + * * + *****************************************************************************/ + +// class header +#include "TNeuLANDSpectra.h" + +// STL +#include <iostream> +#include <string> +using namespace std; + +// NPTool header +#include "NPOptionManager.h" + + + +//////////////////////////////////////////////////////////////////////////////// +TNeuLANDSpectra::TNeuLANDSpectra() + : fNumberOfDetectors(0) { + SetName("NeuLAND"); +} + + + +//////////////////////////////////////////////////////////////////////////////// +TNeuLANDSpectra::TNeuLANDSpectra(unsigned int NumberOfDetectors) { + if(NPOptionManager::getInstance()->GetVerboseLevel()>0) + cout << "************************************************" << endl + << "TNeuLANDSpectra : Initalizing control spectra for " + << NumberOfDetectors << " Detectors" << endl + << "************************************************" << endl ; + SetName("NeuLAND"); + fNumberOfDetectors = NumberOfDetectors; + + InitRawSpectra(); + InitPreTreatedSpectra(); + InitPhysicsSpectra(); +} + + + +//////////////////////////////////////////////////////////////////////////////// +TNeuLANDSpectra::~TNeuLANDSpectra() { +} + + + +//////////////////////////////////////////////////////////////////////////////// +void TNeuLANDSpectra::InitRawSpectra() { + static string name; + for (unsigned int i = 0; i < fNumberOfDetectors; i++) { // loop on number of detectors + // Energy + name = "NeuLAND"+NPL::itoa(i+1)+"_ENERGY_RAW"; + AddHisto1D(name, name, 4096, 0, 16384, "NeuLAND/RAW"); + // Time + name = "NeuLAND"+NPL::itoa(i+1)+"_TIME_RAW"; + AddHisto1D(name, name, 4096, 0, 16384, "NeuLAND/RAW"); + } // end loop on number of detectors +} + + + +//////////////////////////////////////////////////////////////////////////////// +void TNeuLANDSpectra::InitPreTreatedSpectra() { + static string name; + for (unsigned int i = 0; i < fNumberOfDetectors; i++) { // loop on number of detectors + // Energy + name = "NeuLAND"+NPL::itoa(i+1)+"_ENERGY_CAL"; + AddHisto1D(name, name, 500, 0, 25, "NeuLAND/CAL"); + // Time + name = "NeuLAND"+NPL::itoa(i+1)+"_TIME_CAL"; + AddHisto1D(name, name, 500, 0, 25, "NeuLAND/CAL"); + + + } // end loop on number of detectors +} + + + +//////////////////////////////////////////////////////////////////////////////// +void TNeuLANDSpectra::InitPhysicsSpectra() { + static string name; + // Kinematic Plot + name = "NeuLAND_ENERGY_TIME"; + AddHisto2D(name, name, 500, 0, 500, 500, 0, 50, "NeuLAND/PHY"); +} + + + +//////////////////////////////////////////////////////////////////////////////// +void TNeuLANDSpectra::FillRawSpectra(TNeuLANDData* RawData) { +/* static string name; + static string family; + + // Energy + unsigned int sizeE = RawData->GetMultEnergy(); + for (unsigned int i = 0; i < sizeE; i++) { + name = "NeuLAND"+NPL::itoa(RawData->GetE_DetectorNbr(i))+"_ENERGY_RAW"; + family = "NeuLAND/RAW"; + + FillSpectra(family,name,RawData->Get_Energy(i)); + } + + // Time + unsigned int sizeT = RawData->GetMultTime(); + for (unsigned int i = 0; i < sizeT; i++) { + name = "NeuLAND"+NPL::itoa(RawData->GetT_DetectorNbr(i))+"_TIME_RAW"; + family = "NeuLAND/RAW"; + + FillSpectra(family,name,RawData->Get_Time(i)); + }*/ +} + + + +//////////////////////////////////////////////////////////////////////////////// +void TNeuLANDSpectra::FillPreTreatedSpectra(TNeuLANDData* PreTreatedData) { +/* static string name; + static string family; + + // Energy + unsigned int sizeE = PreTreatedData->GetMultEnergy(); + for (unsigned int i = 0; i < sizeE; i++) { + name = "NeuLAND"+NPL::itoa(PreTreatedData->GetE_DetectorNbr(i))+"_ENERGY_CAL"; + family = "NeuLAND/CAL"; + + FillSpectra(family,name,PreTreatedData->Get_Energy(i)); + } + + // Time + unsigned int sizeT = PreTreatedData->GetMultTime(); + for (unsigned int i = 0; i < sizeT; i++) { + name = "NeuLAND"+NPL::itoa(PreTreatedData->GetT_DetectorNbr(i))+"_TIME_CAL"; + family = "NeuLAND/CAL"; + + FillSpectra(family,name,PreTreatedData->Get_Time(i)); + }*/ +} + + + +//////////////////////////////////////////////////////////////////////////////// +void TNeuLANDSpectra::FillPhysicsSpectra(TNeuLANDPhysics* Physics) { +/* static string name; + static string family; + family= "NeuLAND/PHY"; + + // Energy vs time + unsigned int sizeE = Physics->Energy.size(); + for(unsigned int i = 0 ; i < sizeE ; i++){ + name = "NeuLAND_ENERGY_TIME"; + FillSpectra(family,name,Physics->Energy[i],Physics->Time[i]); + }*/ +} + diff --git a/NPLib/Detectors/NeuLAND/TNeuLANDSpectra.h b/NPLib/Detectors/NeuLAND/TNeuLANDSpectra.h new file mode 100644 index 000000000..343a01404 --- /dev/null +++ b/NPLib/Detectors/NeuLAND/TNeuLANDSpectra.h @@ -0,0 +1,62 @@ +#ifndef TNeuLANDSPECTRA_H +#define TNeuLANDSPECTRA_H +/***************************************************************************** + * Copyright (C) 2009-2019 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 : December 2019 * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * This class hold NeuLAND Spectra * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + * * + *****************************************************************************/ + +// NPLib headers +#include "NPVSpectra.h" +#include "TNeuLANDData.h" +#include "TNeuLANDPhysics.h" + +// Forward Declaration +class TNeuLANDPhysics; + + +class TNeuLANDSpectra : public VSpectra { + ////////////////////////////////////////////////////////////// + // constructor and destructor + public: + TNeuLANDSpectra(); + TNeuLANDSpectra(unsigned int NumberOfDetectors); + ~TNeuLANDSpectra(); + + ////////////////////////////////////////////////////////////// + // Initialization methods + private: + void InitRawSpectra(); + void InitPreTreatedSpectra(); + void InitPhysicsSpectra(); + + ////////////////////////////////////////////////////////////// + // Filling methods + public: + void FillRawSpectra(TNeuLANDData*); + void FillPreTreatedSpectra(TNeuLANDData*); + void FillPhysicsSpectra(TNeuLANDPhysics*); + + ////////////////////////////////////////////////////////////// + // Detector parameters + private: + unsigned int fNumberOfDetectors; +}; + +#endif diff --git a/NPLib/Detectors/Samurai/SamuraiFieldMap.cxx b/NPLib/Detectors/Samurai/SamuraiFieldMap.cxx index 7c7e102f4..25f730545 100644 --- a/NPLib/Detectors/Samurai/SamuraiFieldMap.cxx +++ b/NPLib/Detectors/Samurai/SamuraiFieldMap.cxx @@ -51,8 +51,7 @@ double SamuraiFieldMap::Delta(const double* parameter){ //pos =Propagate(parameter[0],m_FitPosFDC0,m_FitDirFDC0,false); pos =Propagate(parameter[0],m_FitPosFDC0,m_FitDirFDC0,true); // Move the fdc2 pos from lab frame to fdc2 frame - pos.back().RotateY(-m_fdc2angle+m_angle); - + pos.back().RotateY(-m_fdc2angle+m_angle); //double d = (pos.back().X()-m_FitPosFDC2.X())*(pos.back().X()-m_FitPosFDC2.X()); // return d; diff = pos.back()-m_FitPosFDC2; @@ -141,6 +140,7 @@ std::vector< TVector3 > SamuraiFieldMap::Propagate(double Brho, TVector3 pos, TV dir=dir.Unit(); static double r; r = sqrt(pos.X()*pos.X()+pos.Z()*pos.Z()); + // number of step taken static unsigned int count; count = 0; @@ -159,7 +159,6 @@ std::vector< TVector3 > SamuraiFieldMap::Propagate(double Brho, TVector3 pos, TV } } else {// failure - //cout << "Fail" << endl; return track; } @@ -180,7 +179,8 @@ std::vector< TVector3 > SamuraiFieldMap::Propagate(double Brho, TVector3 pos, TV func(N, pos+xk1*(m_StepTime/2.), imp+pk1*(m_StepTime/2.) , xk2, pk2); func(N, pos+xk2*(m_StepTime/2.), imp+pk2*(m_StepTime/2.) , xk3, pk3); func(N, pos+xk3*m_StepTime , imp+pk3*m_StepTime , xk4, pk4); - pos +=(xk1+2*xk2+2*xk3+xk4)*(m_StepTime/6.); + pos +=(xk1+2*xk2+2*xk3+xk4)*(m_StepTime/6.); + imp +=(pk1+2*pk2+2*pk3+pk4)*(m_StepTime/6.); if(store){ pos.RotateY(-m_angle); diff --git a/NPLib/Detectors/Samurai/TSamuraiBDCData.cxx b/NPLib/Detectors/Samurai/TSamuraiBDCData.cxx index 862fdde76..7e338083c 100644 --- a/NPLib/Detectors/Samurai/TSamuraiBDCData.cxx +++ b/NPLib/Detectors/Samurai/TSamuraiBDCData.cxx @@ -20,6 +20,7 @@ void TSamuraiBDCData::Clear(){ fBDC_WireNbr.clear(); fBDC_Time.clear(); fBDC_Edge.clear(); + } //////////////////////////////////////////////////////////////////////////////// diff --git a/NPLib/Detectors/Samurai/TSamuraiBDCData.h b/NPLib/Detectors/Samurai/TSamuraiBDCData.h index 50e87d81d..36eef2ea3 100644 --- a/NPLib/Detectors/Samurai/TSamuraiBDCData.h +++ b/NPLib/Detectors/Samurai/TSamuraiBDCData.h @@ -31,7 +31,7 @@ class TSamuraiBDCData: public TObject{ int const GetWireNbr(const unsigned int& i){return fBDC_WireNbr[i];}; double const GetTime(const unsigned int& i){return fBDC_Time[i];}; int const GetEdge(const unsigned int& i){return fBDC_Edge[i];}; - + ClassDef(TSamuraiBDCData,1); }; diff --git a/NPLib/Detectors/Samurai/TSamuraiBDCPhysics.cxx b/NPLib/Detectors/Samurai/TSamuraiBDCPhysics.cxx index 93871fe64..6420a3884 100644 --- a/NPLib/Detectors/Samurai/TSamuraiBDCPhysics.cxx +++ b/NPLib/Detectors/Samurai/TSamuraiBDCPhysics.cxx @@ -63,9 +63,32 @@ TVector3 TSamuraiBDCPhysics::GetPos(unsigned int det){ } } return res; +} +/////////////////////////////////////////////////////////////////////////// +int TSamuraiBDCPhysics::GetPileUpDet(unsigned int det){ + int res = -10000; + unsigned int size = PosX.size(); + for(unsigned int i = 0 ; i < size ; i++){ + if(Detector[i]==det){ + res = PileUp[i]; + } + } + return res; +} +/////////////////////////////////////////////////////////////////////////// +TVector3 TSamuraiBDCPhysics::GetDir(unsigned int det){ + TVector3 res(-10000,-10000,-10000); + unsigned int size = PosX.size(); + for(unsigned int i = 0 ; i < size ; i++){ + if(Detector[i]==det){ + res = Dir[i]; + } + } + return res; } + /////////////////////////////////////////////////////////////////////////// void TSamuraiBDCPhysics::BuildSimplePhysicalEvent(){ BuildPhysicalEvent(); @@ -73,6 +96,11 @@ void TSamuraiBDCPhysics::BuildSimplePhysicalEvent(){ /////////////////////////////////////////////////////////////////////////// void TSamuraiBDCPhysics::BuildPhysicalEvent(){ + m_simulation = 0; + std::string tree_name = RootInput::getInstance()->GetChain()->GetName(); + if(tree_name=="SimulatedTree"){m_simulation =1;} + else m_simulation = 0; + PreTreat(); static unsigned int det,layer,wire,size; @@ -103,7 +131,7 @@ void TSamuraiBDCPhysics::BuildPhysicalEvent(){ devY.push_back(0); Dir.push_back(TVector3()); PileUp.push_back(0); - + Mult[det]=0; X.clear();Z.clear();R.clear(); // Build the necessary X,Z,R vector @@ -114,15 +142,18 @@ void TSamuraiBDCPhysics::BuildPhysicalEvent(){ X[Wire_Angle[idx]].push_back(Wire_X[idx]); Z[Wire_Angle[idx]].push_back(Wire_Z[idx]); R[Wire_Angle[idx]].push_back(dl); - } - } + Wire_PosX[det].push_back(Wire_X[idx]); + Wire_PosZ[det].push_back(Wire_Z[idx]); + Wire_PosAngle[det].push_back(Wire_Angle[idx]); + Wire_PosR[det].push_back(dl); + } + } // end of for loop to build detectors // Reconstruct the vector for each of the plane of each of the detector VX0.clear();VX100.clear(),D.clear(); - uid=0; for(auto it = X.begin();it!=X.end();++it){ -#if __cplusplus > 199711L && NPMULTITHREADING +#if __cplusplus > 199711L && NPMULTITHREADING m_reconstruction.AddPlan(uid++,X[it->first],Z[it->first],R[it->first]); #else D[it->first]=m_reconstruction.BuildTrack2D(X[it->first],Z[it->first],R[it->first],X0,X100,a,b); @@ -138,7 +169,8 @@ void TSamuraiBDCPhysics::BuildPhysicalEvent(){ // Loop over the results for(auto it = X.begin();it!=X.end();++it){ #if __cplusplus > 199711L && NPMULTITHREADING - D[it->first]=m_reconstruction.GetResults(uid++,X0,X100,a,b); + D[it->first]=m_reconstruction.GetResults(uid++,X0,X100,a,b); + Track_D[det].push_back(D[it->first]); #endif // for Debug, write a file of // { std::ofstream f("distance.txt", std::ios::app); @@ -146,10 +178,15 @@ void TSamuraiBDCPhysics::BuildPhysicalEvent(){ // f.close(); // } - // very large "a" means track perpendicular to the chamber, what happen when there is pile up - if(abs(a)>5000) - PileUp[count]++; -//cout << a << " " << b << endl; + + if(abs(a)>5000){ + PileUp[count]++; + } + + Track_a[det].push_back(a); + Track_b[det].push_back(b); + Mult[det]+=X[it->first].size(); + // Position at z=0 TVector3 P(X0,0,0); P.RotateZ(it->first); @@ -190,8 +227,19 @@ void TSamuraiBDCPhysics::BuildPhysicalEvent(){ } } } + // Build the Reference position by averaging all possible pair size = C.size(); + + // for(unsigned int i = 0 ; i < size ; i++)// to get rid of inf value + // { + // if(!std::isnormal(C[i].X()) || !std::isnormal(C[i].Y())) + // { + // size = 0; + // continue; + // } + // } + if(size){ norm=0;PosX100=0;PosY100=0; for(unsigned int i = 0 ; i < size ; i++){ @@ -224,17 +272,20 @@ void TSamuraiBDCPhysics::BuildPhysicalEvent(){ // the Z axis PhiY[count]=(PosY100-PosY[count])/100.; Dir[count]=TVector3(PosX100-PosX[count],PosY100-PosY[count],100).Unit(); - if(m_invertX[det]) - PosX[count]*=-1; - if(m_invertY[det]) - PosY[count]*=-1; - + if(!m_simulation) + { + if(m_invertX[det]) + PosX[count]*=-1; + if(m_invertY[det]) + PosY[count]*=-1; + } + PosX[count]+=m_offset[det].X(); PosY[count]+=m_offset[det].Y(); PosZ[count]=m_offset[det].Z(); - } - } + } + } // end loop over X map values if(PosX[count]==0&&PosY[count]==0){ PosX.erase(PosX.begin()+count); PosY.erase(PosY.begin()+count); @@ -247,11 +298,14 @@ void TSamuraiBDCPhysics::BuildPhysicalEvent(){ count++; }// detector loop + return; } /////////////////////////////////////////////////////////////////////////// void TSamuraiBDCPhysics::PreTreat(){ + ClearPreTreatedData(); + static CalibrationManager* Cal = CalibrationManager::getInstance(); static string channel; @@ -283,15 +337,34 @@ void TSamuraiBDCPhysics::PreTreat(){ } // a valid wire must have an edge if(etime && time && etime-time>ToTThreshold_L && etime-time<ToTThreshold_H){ - channel="SamuraiBDC"+NPL::itoa(det)+"/L" + NPL::itoa(layer); + Layer.push_back(layer); + Wire.push_back(wire); + Time.push_back(time); + ToT.push_back(etime-time); + + channel="SamuraiBDC"+NPL::itoa(det)+"/L" + NPL::itoa(layer); SamuraiDCIndex idx(det,layer,wire); - if(!m_invertD[det]) - m_DCHit[det].push_back(DCHit(det,layer,wire,time,etime-time,Cal->ApplySigmoid(channel,etime))); - else - m_DCHit[det].push_back(DCHit(det,layer,wire,time,etime-time,2.5-Cal->ApplySigmoid(channel,etime))); - } + + if(m_simulation) + { + m_DCHit[det].push_back(DCHit(det,layer,wire,time,etime-time,m_EventData->GetTime(i))); + DriftLength.push_back(m_EventData->GetTime(i)); + } + else + { + if(!m_invertD[det]){ + m_DCHit[det].push_back(DCHit(det,layer,wire,time,etime-time,Cal->ApplySigmoid(channel,etime))); + DriftLength.push_back(Cal->ApplySigmoid(channel,etime)); + } + else{ + m_DCHit[det].push_back(DCHit(det,layer,wire,time,etime-time,2.5-Cal->ApplySigmoid(channel,etime))); + DriftLength.push_back(2.5-Cal->ApplySigmoid(channel,etime)); + } + } + + }//if etime && time etc } - } + }// loop on multiplicity return; } /////////////////////////////////////////////////////////////////////////// @@ -308,6 +381,21 @@ void TSamuraiBDCPhysics::Clear(){ Dir.clear(); PileUp.clear(); Detector.clear(); + + DriftLength.clear(); + Layer.clear(); + Wire.clear(); + Time.clear(); + ToT.clear(); + + Track_a.clear(); + Track_b.clear(); + Track_D.clear(); + Wire_PosX.clear(); + Wire_PosZ.clear(); + Wire_PosAngle.clear(); + Wire_PosR.clear(); + Mult.clear(); } /////////////////////////////////////////////////////////////////////////// diff --git a/NPLib/Detectors/Samurai/TSamuraiBDCPhysics.h b/NPLib/Detectors/Samurai/TSamuraiBDCPhysics.h index 9fae5422e..1dda5c143 100644 --- a/NPLib/Detectors/Samurai/TSamuraiBDCPhysics.h +++ b/NPLib/Detectors/Samurai/TSamuraiBDCPhysics.h @@ -81,10 +81,26 @@ class TSamuraiBDCPhysics : public TObject, public NPL::VDetector{ void Clear(const Option_t*) {}; public: + // Provide Physical Multiplicity + std::vector<double> DriftLength; + std::vector<int> Layer; + std::vector<int> Wire; + std::vector<double> Time; + std::vector<double> ToT; + // map of [bdc number]=vector of hit std::map<unsigned int, std::vector<DCHit>> m_DCHit;//! - + // Varibles from track reconstruction + std::map<unsigned int, int > Mult; + std::map<unsigned int, std::vector<double>> Track_a; + std::map<unsigned int, std::vector<double>> Track_b; + std::map<unsigned int, std::vector<double>> Track_D; + std::map<unsigned int, std::vector<double>> Wire_PosX; + std::map<unsigned int, std::vector<double>> Wire_PosZ; + std::map<unsigned int, std::vector<double>> Wire_PosR; + std::map<unsigned int, std::vector<double>> Wire_PosAngle; + // Computed variable std::vector<double> PosX; std::vector<double> PosY; @@ -103,6 +119,7 @@ class TSamuraiBDCPhysics : public TObject, public NPL::VDetector{ std::map<unsigned int, bool> m_invertY;//! std::map<unsigned int, bool> m_invertD;//! + bool m_simulation;//! public: // Projected position at given Z plan @@ -190,13 +207,19 @@ class TSamuraiBDCPhysics : public TObject, public NPL::VDetector{ TSamuraiBDCData* GetPreTreatedData() const {return m_PreTreatedData;} TVector3 GetPos(unsigned int det); + TVector3 GetOffset(unsigned int det) {return m_offset[det];} ; + TVector3 GetDir(unsigned int det); double GetPosX(unsigned int i) {return PosX[i];} double GetPosY(unsigned int i) {return PosY[i];} + double GetPosZ(unsigned int i) {return PosZ[i];} double GetThetaX(unsigned int i){return ThetaX[i];} double GetPhiY(unsigned int i) {return PhiY[i];} double GetDevX(unsigned int i) {return devX[i];} double GetDevY(unsigned int i) {return devY[i];} int GetPileUp(unsigned int i){return PileUp[i];} + int GetPileUpDet(unsigned int det); + int GetMult(){return PosX.size();}; + int GetMultDet(unsigned int det) {return Mult[det];} private: // Root Input and Output tree classes TSamuraiBDCData* m_EventData;//! diff --git a/NPLib/Detectors/Samurai/TSamuraiFDC0Data.cxx b/NPLib/Detectors/Samurai/TSamuraiFDC0Data.cxx index 5b88ee852..6c62a1c43 100644 --- a/NPLib/Detectors/Samurai/TSamuraiFDC0Data.cxx +++ b/NPLib/Detectors/Samurai/TSamuraiFDC0Data.cxx @@ -1,7 +1,8 @@ #include "TSamuraiFDC0Data.h" +#include "RootInput.h" #include <iostream> -TSamuraiFDC0Data::TSamuraiFDC0Data(){}; +TSamuraiFDC0Data::TSamuraiFDC0Data(){} TSamuraiFDC0Data::~TSamuraiFDC0Data(){}; //////////////////////////////////////////////////////////////////////////////// diff --git a/NPLib/Detectors/Samurai/TSamuraiFDC0Physics.cxx b/NPLib/Detectors/Samurai/TSamuraiFDC0Physics.cxx index aab333813..0fd7d09dd 100644 --- a/NPLib/Detectors/Samurai/TSamuraiFDC0Physics.cxx +++ b/NPLib/Detectors/Samurai/TSamuraiFDC0Physics.cxx @@ -9,7 +9,7 @@ * Original Author: Adrien MATTA contact address: matta@lpccaen.in2p3.fr * * * * Creation Date : October 2020 * - * Last update : * + * Last update : * // *---------------------------------------------------------------------------* * Decription: * * This class hold SamuraiFDC0 treated data * @@ -49,10 +49,11 @@ ClassImp(TSamuraiFDC0Physics) // ToTThreshold_H = 180; ToTThreshold_L = 0; ToTThreshold_H = 10000; - DriftLowThreshold=0.1 ; DriftUpThreshold=2.4; PowerThreshold=15; + Layer_Plan1[0]=0;Layer_Plan1[1]=1;Layer_Plan1[2]=4;Layer_Plan1[3]=5; + Layer_Plan2[0]=2;Layer_Plan1[1]=3;Layer_Plan1[2]=6;Layer_Plan1[3]=7; } /////////////////////////////////////////////////////////////////////////// @@ -62,16 +63,31 @@ void TSamuraiFDC0Physics::BuildSimplePhysicalEvent(){ /////////////////////////////////////////////////////////////////////////// void TSamuraiFDC0Physics::BuildPhysicalEvent(){ + + m_simulation = 0; + std::string tree_name = RootInput::getInstance()->GetChain()->GetName(); + if(tree_name=="SimulatedTree"){m_simulation =1;} + else m_simulation = 0; + PreTreat(); + // RemoveNoise(); // Map[plane angle, vector of spatial information] static map<double, vector<double> > X ; static map<double, vector<double> > Z ; - static map<double, vector<double> > R ; + static map<double, vector<double> > R ; + static map<int, vector<int> > WireInLayers; + + static map<int, int > WireInP1; + static map<int, int > WireInP2; + + WireInLayers.clear(); WireInP1.clear(); WireInP2.clear(); + static int det,layer,wire; X.clear();Z.clear();R.clear(); unsigned int size = Detector.size(); + for(unsigned int i = 0 ; i < size ; i++){ if(DriftLength[i] > DriftLowThreshold && DriftLength[i] < DriftUpThreshold){ det = Detector[i]; @@ -80,9 +96,35 @@ void TSamuraiFDC0Physics::BuildPhysicalEvent(){ SamuraiDCIndex idx(det,layer,wire); X[Wire_Angle[idx]].push_back(Wire_X[idx]); Z[Wire_Angle[idx]].push_back(Wire_Z[idx]); - R[Wire_Angle[idx]].push_back(DriftLength[i]); + R[Wire_Angle[idx]].push_back(DriftLength[i]); + WireInLayers[layer].push_back(1); + + Wire_PosX.push_back(Wire_X[idx]); + Wire_PosZ.push_back(Wire_Z[idx]); + Wire_PosAngle.push_back(Wire_Angle[idx]); + Wire_PosR.push_back(DriftLength[i]); + } + } + + int MultP1 =0; + int MultP2 =0; + int n = sizeof( Layer_Plan1) / sizeof(Layer_Plan1[0]); + + for(auto it = WireInLayers.begin();it!=WireInLayers.end();++it){ + bool exists = std::find(Layer_Plan1,Layer_Plan1 + n, it->first) != Layer_Plan1 + n; + + if(exists) { + WireInP1[it->first]= (it->second).size(); + if((it->second).size()>1) MultP1++; + } + else { + WireInP2[it->first]= (it->second).size(); + if((it->second).size()>1) MultP2++; } } + + if( MultP1>=2) MultInPlan++; + if( MultP2>=2) MultInPlan++; // Reconstruct the vector for each of the plane of each of the detector static double X0,X100,a,b; // store the BuildTrack2D results @@ -108,6 +150,7 @@ void TSamuraiFDC0Physics::BuildPhysicalEvent(){ for(auto it = X.begin();it!=X.end();++it){ #if __cplusplus > 199711L && NPMULTITHREADING D[it->first]=m_reconstruction.GetResults(uid++,X0,X100,a,b); + Track_D.push_back(D[it->first]); #endif /* // for Debug, write a file of @@ -116,10 +159,14 @@ void TSamuraiFDC0Physics::BuildPhysicalEvent(){ f.close(); } */ - // very large a means track perpendicular to the chamber, what happen when there is pile up - if(abs(a)>5000) + + if(abs(a)>5000){ PileUp++; + } + Track_a.push_back(a); + Track_b.push_back(b); + Mult+=X[it->first].size(); // Position at z=0 TVector3 P(X0,0,0); @@ -165,19 +212,30 @@ void TSamuraiFDC0Physics::BuildPhysicalEvent(){ } } } - + // Build the Reference position by averaging all possible pair size = C.size(); + + // for(unsigned int i = 0 ; i < size ; i++)// to get rid of inf value + // { + // if(!std::isnormal(C[i].X()) || !std::isnormal(C[i].Y())) + // { + // size = 0; + // continue; + // } + // } + static double PosX100,PosY100,norm; if(size){ PosX=0; PosY=0; + PosZ=0; PosX100=0; PosY100=0; norm=0; for(unsigned int i = 0 ; i < size ; i++){ PosX+= C[i].X()*W[i]; - PosY+= C[i].Y()*W[i]; + PosY+= C[i].Y()*W[i]; PosX100+= C100[i].X()*W[i]; PosY100+= C100[i].Y()*W[i]; norm+=W[i]; @@ -185,9 +243,10 @@ void TSamuraiFDC0Physics::BuildPhysicalEvent(){ MultMean=size; // Mean position at Z=0 + PosX=PosX/norm; PosY=PosY/norm; - + // Mean position at Z=100 PosX100=PosX100/norm; PosY100=PosY100/norm; @@ -200,16 +259,20 @@ void TSamuraiFDC0Physics::BuildPhysicalEvent(){ } devX=sqrt(devX/((size-1)*norm)); devY=sqrt(devY/((size-1)*norm)); - - if(m_invertX){ - PosX*=-1; - PosX100*=-1; - } - - if(m_invertY){ - PosY*=-1; - PosY100*=-1; - } + + if(!m_simulation) + { + if(m_invertX){ + PosX*=-1; + PosX100*=-1; + } + + if(m_invertY){ + PosY*=-1; + PosY100*=-1; + } + } + // Compute ThetaX, angle between the Direction vector projection in XZ with // the Z axis ThetaX=atan((PosX100-PosX)/100.); @@ -219,15 +282,22 @@ void TSamuraiFDC0Physics::BuildPhysicalEvent(){ PhiY=atan((PosY100-PosY)/100.); //PhiY=(PosY100-PosY)/100.; Dir=TVector3(PosX100-PosX,PosY100-PosY,100).Unit(); + PosX+=m_offset.X(); PosY+=m_offset.Y(); + PosZ+=m_offset.Z(); + OffsetX = m_offset.X(); + OffsetY = m_offset.Y(); + OffsetZ = m_offset.Z(); + } return; } /////////////////////////////////////////////////////////////////////////// void TSamuraiFDC0Physics::PreTreat(){ + static CalibrationManager* Cal = CalibrationManager::getInstance(); static string channel; // one map per detector @@ -269,14 +339,21 @@ void TSamuraiFDC0Physics::PreTreat(){ Time.push_back(time); ToT.push_back(etime-time); channel="SamuraiFDC0/L" + NPL::itoa(layer); - if(!m_invertD) - DriftLength.push_back(Cal->ApplySigmoid(channel,etime)); - else - DriftLength.push_back(2.5-Cal->ApplySigmoid(channel,etime)); - } - } - } + if(m_simulation) + { + DriftLength.push_back(m_EventData->GetTime(i)); + } + else + { + if(!m_invertD) + DriftLength.push_back(Cal->ApplySigmoid(channel,etime)); + else + DriftLength.push_back(2.5-Cal->ApplySigmoid(channel,etime)); + } + }//if etime && time etc + } + }//loop on multiplicity return; } /////////////////////////////////////////////////////////////////////////// @@ -319,12 +396,29 @@ void TSamuraiFDC0Physics::RemoveNoise(){ } return; } +//////////////////////////////////////////////////////////////////////////////// +TVector3 TSamuraiFDC0Physics::ProjectedPosition(double Z){ + TVector3 pos(-10000,-10000,-10000); + if(PosX!=-10000){ + pos = TVector3(PosX,PosY,0)+(Z/Dir.Z())*Dir; + } + return pos; +} +//////////////////////////////////////////////////////////////////////////////// +double TSamuraiFDC0Physics::ProjectedPositionX(double Z){ + return ProjectedPosition(Z).X(); +} +//////////////////////////////////////////////////////////////////////////////// +double TSamuraiFDC0Physics::ProjectedPositionY(double Z){ + return ProjectedPosition(Z).Y(); +} + /////////////////////////////////////////////////////////////////////////// void TSamuraiFDC0Physics::Clear(){ MultMean=0; PileUp=0; Mult=0; - PosX=PosY=-10000; + PosX=PosY=PosZ=-10000; ThetaX=PhiY=-10000; devX=devY=-10000; DriftLength.clear(); @@ -336,6 +430,19 @@ void TSamuraiFDC0Physics::Clear(){ ParticleDirection.clear(); MiddlePosition.clear(); Matched.clear(); + + OffsetX = -10000; + OffsetY = -10000; + OffsetZ = -10000; + Track_a.clear(); + Track_b.clear(); + Track_D.clear(); + Wire_PosX.clear(); + Wire_PosZ.clear(); + Wire_PosR.clear(); + Wire_PosAngle.clear(); + + MultInPlan = 0; } /////////////////////////////////////////////////////////////////////////// diff --git a/NPLib/Detectors/Samurai/TSamuraiFDC0Physics.h b/NPLib/Detectors/Samurai/TSamuraiFDC0Physics.h index a013d8bbb..c0c1c1fb3 100644 --- a/NPLib/Detectors/Samurai/TSamuraiFDC0Physics.h +++ b/NPLib/Detectors/Samurai/TSamuraiFDC0Physics.h @@ -66,12 +66,25 @@ class TSamuraiFDC0Physics : public TObject, public NPL::VDetector{ std::vector<double> Time; std::vector<double> ToT; std::vector<bool> Matched; + + // Variables from track reconstruction + std::vector<double> Track_a; + std::vector<double> Track_b; + std::vector <double> Track_D; + std::vector<double> Wire_PosX; + std::vector<double> Wire_PosZ; + std::vector<double> Wire_PosR; + std::vector<double> Wire_PosAngle; + + int MultInPlan; + // Computed variable std::vector<TVector3> ParticleDirection; std::vector<TVector3> MiddlePosition; double PosX; double PosY; + double PosZ; double ThetaX; double PhiY; double devX,devY; @@ -80,13 +93,17 @@ class TSamuraiFDC0Physics : public TObject, public NPL::VDetector{ int MultMean; int PileUp; + double OffsetX; + double OffsetY; + double OffsetZ; + private: // offset and inversion TVector3 m_offset;//! bool m_invertX;//! bool m_invertY;//! bool m_invertD;//! - - + bool m_simulation;//! + private: // Charateristic of the DC void AddDC(std::string name, NPL::XmlParser&);//! take the XML file and fill in Wire_X and Layer_Angle std::map<SamuraiDCIndex,double> Wire_X;//! X position of the wires @@ -99,7 +116,11 @@ class TSamuraiFDC0Physics : public TObject, public NPL::VDetector{ // since the calibration is a sigmoid there quite a few event at the edge double DriftLowThreshold;//! Minimum Drift length to keep the hit double DriftUpThreshold;//! Maximum Drift length to keep the hit - double PowerThreshold;//! Maximum P2 minimisation value to keep the track + double PowerThreshold;//! Maximum P2 minimisation value to keep the track + + int Layer_Plan1[4]; + int Layer_Plan2[4]; + void RemoveNoise(); // Construct the 2D track and ref position at Z=0 and Z=100 based on X,Z and Radius provided @@ -165,14 +186,19 @@ class TSamuraiFDC0Physics : public TObject, public NPL::VDetector{ // Retrieve raw and pre-treated data TSamuraiFDC0Data* GetRawData() const {return m_EventData;} - TVector3 GetPos(){return TVector3(PosX,PosY,m_offset.Z());} + TVector3 GetPos(){return TVector3(PosX,PosY,PosZ);} + TVector3 GetOffset(){return m_offset;} + bool GetInvertX(){return m_invertX;}; + bool GetInvertY(){return m_invertY;}; double GetPosX(){return PosX;} double GetPosY(){return PosY;} + double GetPosZ(){return PosZ;} double GetThetaX(){return ThetaX;} double GetPhiY(){return PhiY;} double GetDevX(){return devX;} double GetDevY(){return devY;} int GetPileUp(){return PileUp;} + int GetMult(){return Mult;} private: // Root Input and Output tree classes TSamuraiFDC0Data* m_EventData;//! @@ -181,8 +207,9 @@ class TSamuraiFDC0Physics : public TObject, public NPL::VDetector{ public: // Projected position at given Z plan - TVector3 ProjectedPosition(double Z){return TVector3(0,0,0);/*FIXME*/}; - + TVector3 ProjectedPosition(double Z); + double ProjectedPositionX(double Z); + double ProjectedPositionY(double Z); private: // Spectra Class // TSamuraiFDC0Spectra* m_Spectra; // ! diff --git a/NPLib/Detectors/Samurai/TSamuraiFDC2Physics.cxx b/NPLib/Detectors/Samurai/TSamuraiFDC2Physics.cxx index 9cd4e25e9..060c17a10 100644 --- a/NPLib/Detectors/Samurai/TSamuraiFDC2Physics.cxx +++ b/NPLib/Detectors/Samurai/TSamuraiFDC2Physics.cxx @@ -62,6 +62,12 @@ void TSamuraiFDC2Physics::BuildSimplePhysicalEvent(){ /////////////////////////////////////////////////////////////////////////// void TSamuraiFDC2Physics::BuildPhysicalEvent(){ + + m_simulation = 0; + std::string tree_name = RootInput::getInstance()->GetChain()->GetName(); + if(tree_name=="SimulatedTree"){m_simulation =1;} + else m_simulation = 0; + PreTreat(); // RemoveNoise(); @@ -81,7 +87,12 @@ void TSamuraiFDC2Physics::BuildPhysicalEvent(){ SamuraiDCIndex idx(det,layer,wire); X[Wire_Angle[idx]].push_back(Wire_X[idx]); Z[Wire_Angle[idx]].push_back(Wire_Z[idx]); - R[Wire_Angle[idx]].push_back(DriftLength[i]); + R[Wire_Angle[idx]].push_back(DriftLength[i]); + + Wire_PosX.push_back(Wire_X[idx]); + Wire_PosZ.push_back(Wire_Z[idx]); + Wire_PosAngle.push_back(Wire_Angle[idx]); + Wire_PosR.push_back(DriftLength[i]); } } @@ -110,8 +121,8 @@ void TSamuraiFDC2Physics::BuildPhysicalEvent(){ for(auto it = X.begin();it!=X.end();++it){ #if __cplusplus > 199711L && NPMULTITHREADING - - D[it->first]=m_reconstruction.GetResults(uid++,X0,X100,a,b); + D[it->first]=m_reconstruction.GetResults(uid++,X0,X100,a,b); + Track_D.push_back(D[it->first]); #endif /* // for Debug, write a file of @@ -120,10 +131,13 @@ void TSamuraiFDC2Physics::BuildPhysicalEvent(){ f.close(); } */ - // very large a means track perpendicular to the chamber, what happen when there is pile up + if(abs(a)>5000) PileUp++; + Track_a.push_back(a); + Track_b.push_back(b); + Mult+=X[it->first].size(); // Position at z=0 TVector3 P(X0,0,0); @@ -205,17 +219,21 @@ void TSamuraiFDC2Physics::BuildPhysicalEvent(){ devX=sqrt(devX/((size-1)*norm)); devY=sqrt(devY/((size-1)*norm)); - - if(m_invertX){ - PosX*=-1; - PosX100*=-1; - } - - if(m_invertY){ - PosY*=-1; - PosY100*=-1; - } - + + if(!m_simulation) + { + if(m_invertX){ + PosX*=-1; + PosX100*=-1; + } + }//end if simulation + + if(m_invertY) + { + PosY*=-1; + PosY100*=-1; + } + // Compute ThetaX, angle between the Direction vector projection in XZ with // the Z axis //ThetaX=atan((PosX100-PosX)/100.); @@ -225,13 +243,13 @@ void TSamuraiFDC2Physics::BuildPhysicalEvent(){ //PhiY=atan((PosY100-PosY)/100.); PhiY=(PosY100-PosY)/100.; Dir=TVector3(PosX100-PosX,PosY100-PosY,100).Unit(); + PosX+=m_offset.X(); PosY+=m_offset.Y(); + PosZ = m_offset.Z(); + } -/* if(PosX==-10000) - cout << " bad " << Detector.size()<< " " << size << endl; - else - cout << " okay" << Detector.size()<< " " << size << endl;*/ + return; } /////////////////////////////////////////////////////////////////////////// @@ -269,21 +287,28 @@ void TSamuraiFDC2Physics::PreTreat(){ if(etime && time && etime-time>ToTThreshold_L && etime-time<ToTThreshold_H){ if(!(wire==93 && layer ==7)){// remove noisy wire Detector.push_back(det); - Layer.push_back(layer); - Wire.push_back(wire); - Time.push_back(time); - ToT.push_back(etime-time); - channel="SamuraiFDC2/L" + NPL::itoa(layer); - // rescalling is needed because calib are bad. - // to be fixed - if(!m_invertD) - DriftLength.push_back(Cal->ApplySigmoid(channel,etime)); - else - DriftLength.push_back(10-Cal->ApplySigmoid(channel,etime)); - } - } + Layer.push_back(layer); + Wire.push_back(wire); + Time.push_back(time); + ToT.push_back(etime-time); + channel="SamuraiFDC2/L" + NPL::itoa(layer); + // rescalling is needed because calib are bad. + // to be fixed + if(m_simulation) + { + DriftLength.push_back(m_EventData->GetTime(i)); + } + else + { + if(!m_invertD) + DriftLength.push_back(Cal->ApplySigmoid(channel,etime)); + else + DriftLength.push_back(10-Cal->ApplySigmoid(channel,etime)); + } + }// "filter" for noisy wires + }//if etime && time etc } - } + }//loop on multiplicity return; } /////////////////////////////////////////////////////////////////////////// @@ -349,7 +374,7 @@ void TSamuraiFDC2Physics::Clear(){ MultMean=0; PileUp=0; Mult=0; - PosX=PosY=-10000; + PosX=PosY=PosZ=-10000; ThetaX=PhiY=-10000; devX=devY=-10000; DriftLength.clear(); @@ -361,6 +386,14 @@ void TSamuraiFDC2Physics::Clear(){ ParticleDirection.clear(); MiddlePosition.clear(); Matched.clear(); + + Track_a.clear(); + Track_b.clear(); + Track_D.clear(); + Wire_PosX.clear(); + Wire_PosZ.clear(); + Wire_PosR.clear(); + Wire_PosAngle.clear(); } /////////////////////////////////////////////////////////////////////////// @@ -399,7 +432,8 @@ void TSamuraiFDC2Physics::ReadConfiguration(NPL::InputParser parser){ GetOffset().Print(); PosX=1; - cout << m_invertY << endl; + //cout << m_invertY << endl; + } /////////////////////////////////////////////////////////////////////////// @@ -421,9 +455,9 @@ void TSamuraiFDC2Physics::AddDC(string name, NPL::XmlParser& xml){ else if(sDir=="Y") T=90*deg; else if(sDir=="U") - T=-30*deg; - else if(sDir=="V") T=+30*deg; + else if(sDir=="V") + T=-30*deg; else{ cout << "ERROR: Unknown layer orientation for Samurai FDC2"<< endl; exit(1); diff --git a/NPLib/Detectors/Samurai/TSamuraiFDC2Physics.h b/NPLib/Detectors/Samurai/TSamuraiFDC2Physics.h index 3e370bccd..e5ad76c7f 100644 --- a/NPLib/Detectors/Samurai/TSamuraiFDC2Physics.h +++ b/NPLib/Detectors/Samurai/TSamuraiFDC2Physics.h @@ -46,8 +46,6 @@ // Forward declaration //class TSamuraiFDC2Spectra; - - class TSamuraiFDC2Physics : public TObject, public NPL::VDetector{ public: TSamuraiFDC2Physics(); @@ -66,12 +64,23 @@ class TSamuraiFDC2Physics : public TObject, public NPL::VDetector{ std::vector<double> Time; std::vector<double> ToT; std::vector<bool> Matched; + + // Variables from track reconstruction + std::vector<double> Track_a; + std::vector<double> Track_b; + std::vector <double> Track_D; + std::vector<double> Wire_PosX; + std::vector<double> Wire_PosZ; + std::vector<double> Wire_PosR; + std::vector<double> Wire_PosAngle; + // Computed variable std::vector<TVector3> ParticleDirection; std::vector<TVector3> MiddlePosition; double PosX; double PosY; + double PosZ; double ThetaX; double PhiY; double devX,devY; @@ -79,12 +88,13 @@ class TSamuraiFDC2Physics : public TObject, public NPL::VDetector{ int Mult; int MultMean; int PileUp; - + private: // offset and inversion TVector3 m_offset;//! bool m_invertX;//! bool m_invertY;//! bool m_invertD;//! + bool m_simulation;//! public: // Projected position at given Z plan @@ -180,10 +190,13 @@ class TSamuraiFDC2Physics : public TObject, public NPL::VDetector{ bool GetInvertY(){return m_invertY;}; double GetPosX(){return PosX;} double GetPosY(){return PosY;} + double GetPosZ(){return PosZ;} double GetThetaX(){return ThetaX;} double GetDevX(){return devX;} double GetDevY(){return devY;} int GetPileUp(){return PileUp;} + TVector3 GetDir(){return Dir;} + int GetMult(){return Mult;} private: // Root Input and Output tree classes TSamuraiFDC2Data* m_EventData;//! diff --git a/NPLib/Detectors/Samurai/TSamuraiHodoscopePhysics.h b/NPLib/Detectors/Samurai/TSamuraiHodoscopePhysics.h index bacf5ceaf..d7f50d7bc 100644 --- a/NPLib/Detectors/Samurai/TSamuraiHodoscopePhysics.h +++ b/NPLib/Detectors/Samurai/TSamuraiHodoscopePhysics.h @@ -161,6 +161,7 @@ class TSamuraiHodoscopePhysics : public TObject, public NPL::VDetector { vector <double> GetCharge() {return Charge;} vector <double> GetTime() {return Time;} vector<int> GetID() {return ID;} + int GetMult() {return Charge.size();}; // give and external TSamuraiHodoscopeData object to TSamuraiHodoscopePhysics. // needed for online analysis for example diff --git a/NPLib/Neutron/NPCrossTalk.cxx b/NPLib/Neutron/NPCrossTalk.cxx old mode 100644 new mode 100755 index f6911a3f8..ac1518447 --- a/NPLib/Neutron/NPCrossTalk.cxx +++ b/NPLib/Neutron/NPCrossTalk.cxx @@ -39,7 +39,7 @@ CrossTalk::~CrossTalk(){ } //////////////////////////////////////////////////////////////////////////////// -void CrossTalk::AddHitVector(const vector<double>& X, const vector<double>& Y, const vector<double>& Z, const vector<double>& Q, const vector<double>& dX, const vector<double>& dY, const vector<double>& dZ, const vector<double> &T){ +void CrossTalk::AddHitVector(const vector<double>& X, const vector<double>& Y, const vector<double>& Z, const vector<double>& Q, const vector<double>& dX, const vector<double>& dY, const vector<double>& dZ, const vector<double> &T, const vector<int> &ID){ HitX = &X; @@ -52,13 +52,13 @@ void CrossTalk::AddHitVector(const vector<double>& X, const vector<double>& Y, c HitT = &T; HitQ = &Q; + HitID = &ID; sizeHit = X.size(); } - #if __cplusplus > 201103L bool cmp(pair<int,double> & a, pair<int,double>&b){ - return a.second < b.second; + return a.second < b.second; } #else bool cmp(pair<int,double>a, pair<int,double>b){ @@ -73,7 +73,7 @@ vector<int> CrossTalk::ComputeCrossTalk(const double& Causality, const double& D static double x2,y2,z2,dx2,dy2,dz2,t2; static double Dist, HyperSphere, Beta1; - //Attribute a new index based on the time arrive from the first to the last hit + //Attribute a new index based on the time of arrival from the first to the last hit //Using vector of pairs (ID,Time) static vector<pair<int, double>> pair_SortedID; pair_SortedID.clear(); @@ -133,30 +133,7 @@ vector<int> CrossTalk::ComputeCrossTalk(const double& Causality, const double& D static unsigned int count, count2; count=1,count2=9; m_HeadClust.clear(), m_QtotClust.clear(); - Clusters_3D->Clear(); - /* Clusters_3D->SetTitle("Hit Clusters in NEBULA & NeuLAND"); */ - /* Clusters_3D->SetFillColor(29); */ - /* Clusters_3D->SetMarkerSize(10); */ - /* Clusters_3D->SetMarkerStyle(20); */ - /* Clusters_3D->SetLineWidth(2); */ - - Clusters_3D->SetPoint(1,10000,-2500,0); - Clusters_3D->SetPoint(2,10000,-2500,2000); - Clusters_3D->SetPoint(3,10000,2500,0); - Clusters_3D->SetPoint(4,10000,2500,2000); - Clusters_3D->SetPoint(5,12500,-2500,0); - Clusters_3D->SetPoint(6,12500,-2500,2000); - Clusters_3D->SetPoint(7,12500,2500,0); - Clusters_3D->SetPoint(8,12500,2500,2000); - Clusters_3D->SetPointError(1,0,0,0); - Clusters_3D->SetPointError(2,0,0,0); - Clusters_3D->SetPointError(3,0,0,0); - Clusters_3D->SetPointError(4,0,0,0); - Clusters_3D->SetPointError(5,0,0,0); - Clusters_3D->SetPointError(6,0,0,0); - Clusters_3D->SetPointError(7,0,0,0); - Clusters_3D->SetPointError(8,0,0,0); - + for(auto itr = mapOfClust.begin(); itr != mapOfClust.end(); itr++){ mapOfHead[count] = itr->second[0]; m_HeadClust.push_back(itr->second[0]); @@ -166,9 +143,6 @@ vector<int> CrossTalk::ComputeCrossTalk(const double& Causality, const double& D Qtot = 0; for(int j =0; j < itr->second.size();j++){ Qtot += (*HitQ)[itr->second[j]]; - /* XY_Clusters->Set(count2, (*HitX)[itr->second[j]], (*HitY)[itr->second[j]]); */ - /* XZ_Clusters->Set(count2, (*HitX)[itr->second[j]], (*HitZ)[itr->second[j]]); */ - /* YZ_Clusters->Set(count2, (*HitZ)[itr->second[j]], (*HitY)[itr->second[j]]); */ /* cout << (*HitX)[itr->second[j]] << " " << (*HitdX)[itr->second[j]] << " " << (*HitdY)[itr->second[j]]<< ""<< (*HitdZ)[itr->second[j]]<< endl; */ Clusters_3D->SetPoint(count2, (*HitZ)[itr->second[j]], (*HitX)[itr->second[j]], (*HitY)[itr->second[j]]); Clusters_3D->SetPointError(count2, (*HitdZ)[itr->second[j]], (*HitdX)[itr->second[j]], (*HitdY)[itr->second[j]]); @@ -178,12 +152,7 @@ vector<int> CrossTalk::ComputeCrossTalk(const double& Causality, const double& D mapOfQtot[count] = Qtot; count++; } - - /* Clusters_3D->Draw("err"); */ - /* Clusters_2D.push_back(XY_Clusters); */ - /* Clusters_2D.push_back(XZ_Clusters); */ - /* Clusters_2D.push_back(YZ_Clusters); */ - + double v_n, Dmax, Qclust1, beta1, beta12; static vector<double> CrossTalk; CrossTalk.clear(); @@ -199,48 +168,199 @@ vector<int> CrossTalk::ComputeCrossTalk(const double& Causality, const double& D Dist = sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) + (z2-z1)*(z2-z1)); Dmax = (t2-t1)*v_n; beta12 = Dist/(t2-t1)/C_light; - /* if(beta1/beta12 > Causality){ */ - if( ( (*HitdX)[mapOfHead[i]] == 120. && Qclust1 < 96.9*beta1/beta12 - 70.5 )||( (*HitdX)[mapOfHead[i]] == 50. && Qclust1 < 150*beta1/beta12 - 130 ) ){ + if(beta1/beta12 > Causality){ + /* if( ( (*HitdX)[mapOfHead[i]] == 120. && Qclust1 < 96.9*beta1/beta12 - 70.5 )||( (*HitdX)[mapOfHead[i]] == 50. && Qclust1 < 150*beta1/beta12 - 130 ) ){ */ CrossTalk.push_back(j); } + } } + + //elimate potential CrossTalk in mapOfHead + static unsigned int sizeCT; + sizeCT = CrossTalk.size(); + for(unsigned int i = 0; i < sizeCT; i++ ){ + mapOfHead.erase(CrossTalk[i]); + mapOfQtot.erase(CrossTalk[i]); + } + + //return vector of real neutrons IDs + m_Neutrons.clear(); + m_QtotNeut.clear(); + for(auto itr = mapOfHead.begin(); itr != mapOfHead.end(); itr++){ + m_Neutrons.push_back(itr->second); + } + for(auto itr = mapOfQtot.begin(); itr != mapOfQtot.end(); itr++){ + m_QtotNeut.push_back(itr->second); + } + return m_Neutrons; } - //elimate potential CrossTalk in mapOfHead - static unsigned int sizeCT; - sizeCT = CrossTalk.size(); - for(unsigned int i = 0; i < sizeCT; i++ ){ - mapOfHead.erase(CrossTalk[i]); - mapOfQtot.erase(CrossTalk[i]); + ///////////////////////////////////////////////////// + ////////// KONDO CT ///////////////////////////////// + ///////////////////////////////////////////////////// + vector<int> CrossTalk::ComputeCrossTalk_Kondo(const double& Causality, const double& DistMin, const int& Option, TCutG* TCut1, TCutG* TCut2){ + + const double C_light = 299.792458; + static double x1,y1,z1,dx1,dy1,dz1,t1,q1,id1; + static double x2,y2,z2,dx2,dy2,dz2,t2,q2,id2; + static double Dt, Dist, HyperSphere, Beta1; + + //Attribute a new index based on the time arrive from the first to the last hit + //Using vector of pairs (ID,Time) + static vector<pair<int, double>> pair_SortedID; + pair_SortedID.clear(); + for(int i = 0; i < sizeHit; i++){ + pair_SortedID.emplace_back(i, (*HitT)[i]); + } + //Sort pair vector (ID,Time) in Time + sort(pair_SortedID.begin(), pair_SortedID.end(), cmp); + + m_SortedID.clear(); + //Put new ID sorted in a vector + for(int i = 0; i < sizeHit; i++){ + m_SortedID.push_back(pair_SortedID[i].first); + } + + // A different Cluster number (starting at 1) is assigned to each hit + static vector<int> ID_ClustHit; + ID_ClustHit.clear(); + for(int i =0 ; i < sizeHit; i++){ + ID_ClustHit.push_back(i+1); + } + + //Test each Dist(n-n) to find clusters + //When 2 neutrons are part of a the same cluster, change their ID_ClustHit for the lowest + //Create a map to hold the Hit_ID for each cluster + mapOfClust.clear(); + + /////////////////////////////////////// + /// HyperSphere cleaning (same wall) + ////////////////////////////////////// + + for(int j = 0; j < sizeHit-1; j++){ + if(ID_ClustHit[j]==-1) continue; + x1 = (*HitX)[m_SortedID[j]], y1 = (*HitY)[m_SortedID[j]], z1 = (*HitZ)[m_SortedID[j]]; + dx1 = (*HitdX)[m_SortedID[j]], dy1 = (*HitdY)[m_SortedID[j]]; + dz1 = (*HitdZ)[m_SortedID[j]]; + t1 = (*HitT)[m_SortedID[j]]; + id1=(*HitID)[m_SortedID[j]]; + Beta1 = sqrt(x1*x1 + y1*y1 + z1*z1)/t1/C_light; + for(int jj = j+1; jj < sizeHit ; jj++){ + if(ID_ClustHit[jj]==-1) continue; + x2 = (*HitX)[m_SortedID[jj]], y2 = (*HitY)[m_SortedID[jj]], z2 = (*HitZ)[m_SortedID[jj]], t2 = (*HitT)[m_SortedID[jj]], dx2 = (*HitdX)[m_SortedID[jj]]; + Dist = sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) + (z2-z1)*(z2-z1)); + Dt = t2-t1; + id2=(*HitID)[m_SortedID[jj]]; + double b12 = Dist/Dt/C_light; + if(id1 <= 400 && id2 <= 400){ + //Neuland same wall + double HypeSph1 = sqrt(((Dt-0.2591)/1.165)*((Dt-0.2591)/1.165) + ((Dist-70.8)/105)*((Dist-70.8)/105)); + if(HypeSph1 < 1){ + ID_ClustHit[jj]=-1; + } + } + else if( ((id1>400 && id1<=460)&&(id2>400&&id2<=460)) || (id1>460&&id2>460) ){ + // Nebula same wall + double HypeSph2 = sqrt(((Dt-0.6528)/1.608)*((Dt-0.6528)/1.608) + ((Dist-158.8)/151.5)*((Dist-158.8)/151.5)); + if(HypeSph2 < 1){ + ID_ClustHit[jj]=-1; + } + } + } + } + + ///////////////////////////////////////// + ///// Cleaning Gammas + /////////////////////////////////////////// + + for(int j = 0; j < sizeHit-1; j++){ + if(ID_ClustHit[j]==-1) continue; + x1 = (*HitX)[m_SortedID[j]], y1 = (*HitY)[m_SortedID[j]], z1 = (*HitZ)[m_SortedID[j]]; + dx1 = (*HitdX)[m_SortedID[j]], dy1 = (*HitdY)[m_SortedID[j]]; + dz1 = (*HitdZ)[m_SortedID[j]]; + t1 = (*HitT)[m_SortedID[j]]; + id1= (*HitID)[m_SortedID[j]]; + Beta1 = sqrt(x1*x1 + y1*y1 + z1*z1)/t1/C_light; + for(int jj = j+1; jj < sizeHit ; jj++){ + if(ID_ClustHit[jj]==-1) continue; + x2 = (*HitX)[m_SortedID[jj]], y2 = (*HitY)[m_SortedID[jj]], z2 = (*HitZ)[m_SortedID[jj]], t2 = (*HitT)[m_SortedID[jj]], dx2 = (*HitdX)[m_SortedID[jj]]; + Dist = sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) + (z2-z1)*(z2-z1)); + Dt = t2-t1; + id2=(*HitID)[m_SortedID[jj]]; + double b12 = Dist/Dt/C_light; + double q2 = (*HitQ)[m_SortedID[jj]]; + if(id1 <= 400 && id2 <= 400){ + //Neuland same wall + if( ( abs(1/b12 -1) < 3*0.24 && q2 < 15 ) || 1/b12 > 1 ){ + ID_ClustHit[jj] = -1; + } + } + else if( ((id1>400 && id1<=460)&&(id2>400&&id2<=460)) || (id1>460&&id2>460) ){ + // Nebula same wall + if(( abs((1/b12)-1) < 3*0.49 && q2<15 ) || 1/b12 > 1 ){ + ID_ClustHit[jj]=-1; + } + } + else{ + // Different Wall a + if(Beta1/b12 > 1 || (abs(1/b12 - 1) < 3*0.17 && q2 < 15)) + ID_ClustHit[jj]=-1; + } + } + } + + for(unsigned int i = 0; i < sizeHit; i++){ + if(ID_ClustHit[i]!=-1) + mapOfClust[ID_ClustHit[i]].push_back(m_SortedID[i]); + } + + //Put first hit in time of each cluster in a new map mapOfHead and remake + //the numbering of clusters (1,2,3...) + static map< unsigned int, unsigned int > mapOfHead; + static map< unsigned int, double > mapOfQtot; + /* static map< unsigned int, unsigned int > mapOfClust; */ + static unsigned int NbrOfClust; + mapOfHead.clear(), mapOfQtot.clear(); + NbrOfClust = mapOfClust.size(); + + static unsigned int count, count2; + count=1; m_HeadClust.clear(); + for(auto itr = mapOfClust.begin(); itr != mapOfClust.end(); itr++){ + mapOfHead[count] = itr->second[0]; + mapOfQtot[count] = 0; + m_HeadClust.push_back(itr->second[0]); + count++; + } + //return vector of real neutrons IDs + m_Neutrons.clear(); + m_QtotNeut.clear(); + m_QtotClust.clear(); + for(auto itr = mapOfHead.begin(); itr != mapOfHead.end(); itr++){ + m_Neutrons.push_back(itr->second); + m_HeadClust.push_back(itr->second); + } + for(auto itr = mapOfQtot.begin(); itr != mapOfQtot.end(); itr++){ + m_QtotNeut.push_back(itr->second); + m_QtotClust.push_back(itr->second); + } + return m_Neutrons; } - //return vector of real neutrons IDs - m_Neutrons.clear(); - m_QtotNeut.clear(); - for(auto itr = mapOfHead.begin(); itr != mapOfHead.end(); itr++){ - m_Neutrons.push_back(itr->second); + vector<int> CrossTalk::GetSortedHits(){ + return m_SortedID; } - for(auto itr = mapOfQtot.begin(); itr != mapOfQtot.end(); itr++){ - m_QtotNeut.push_back(itr->second); + vector<TGraph> CrossTalk::GetClusters(){ + return Clusters_2D; + } + TGraph2DErrors *CrossTalk::Get3DClusters(){ + return Clusters_3D; + } + vector<int> CrossTalk::GetHeadClust(){ + return m_HeadClust; + } + vector<double> CrossTalk::GetQtotClust(){ + return m_QtotClust; + } + vector<double> CrossTalk::GetQtotNeut(){ + return m_QtotNeut; } - return m_Neutrons; -} - -vector<int> CrossTalk::GetSortedHits(){ - return m_SortedID; -} -vector<TGraph> CrossTalk::GetClusters(){ - return Clusters_2D; -} -TGraph2DErrors *CrossTalk::Get3DClusters(){ - return Clusters_3D; -} -vector<int> CrossTalk::GetHeadClust(){ - return m_HeadClust; -} -vector<double> CrossTalk::GetQtotClust(){ - return m_QtotClust; -} -vector<double> CrossTalk::GetQtotNeut(){ - return m_QtotNeut; -} diff --git a/NPLib/Neutron/NPCrossTalk.h b/NPLib/Neutron/NPCrossTalk.h old mode 100644 new mode 100755 index d79164694..60b9253ed --- a/NPLib/Neutron/NPCrossTalk.h +++ b/NPLib/Neutron/NPCrossTalk.h @@ -37,9 +37,10 @@ namespace NPL{ public: - void AddHitVector(const std::vector<double>& X, const std::vector<double>& Y,const std::vector<double>& Z, const std::vector<double>& Q, const std::vector<double>& dX, const std::vector<double>& dY, const std::vector<double>& dZ, const std::vector<double>& T); + void AddHitVector(const std::vector<double>& X, const std::vector<double>& Y,const std::vector<double>& Z, const std::vector<double>& Q, const std::vector<double>& dX, const std::vector<double>& dY, const std::vector<double>& dZ, const std::vector<double>& T, const std::vector<int>& ID); std::vector<int> ComputeCrossTalk(const double& Causality, const double& DistMin, const int& Option, TCutG*TCut1, TCutG* TCut2 ); + std::vector<int> ComputeCrossTalk_Kondo(const double& Causality, const double& DistMin, const int& Option, TCutG*TCut1, TCutG* TCut2 ); std::vector<int> GetSortedHits(); std::vector<TGraph> GetClusters(); TGraph2DErrors *Get3DClusters(); @@ -57,6 +58,7 @@ namespace NPL{ const std::vector<double>* HitdZ; const std::vector<double>* HitT; const std::vector<double>* HitQ; + const std::vector<int>* HitID; std::vector<int> m_SortedID; std::map<unsigned int, std::vector<unsigned int>> mapOfClust; diff --git a/NPLib/Physics/CMakeLists.txt b/NPLib/Physics/CMakeLists.txt index ea903e3e3..d7063c226 100644 --- a/NPLib/Physics/CMakeLists.txt +++ b/NPLib/Physics/CMakeLists.txt @@ -28,7 +28,8 @@ add_custom_command(OUTPUT TFissionConditionsDict.cxx COMMAND ${CMAKE_BINARY_DIR} add_custom_command(OUTPUT NPTimeStampDict.cxx COMMAND ${CMAKE_BINARY_DIR}/scripts/build_dict.sh NPTimeStamp.h NPTimeStampDict.cxx NPTimeStamp.rootmap libNPPhysics.so NPTimeStampLinkDef.h DEPENDS NPTimeStamp.h NPTimeStampLinkDef.h) -add_library(NPPhysics SHARED GEF.cxx NPInelasticBreakup.cxx NPInelasticBreakupDict.cxx NPFissionDecay.cxx NPDecay.cxx NPBeam.cxx NPEnergyLoss.cxx NPFunction.cxx NPParticle.cxx NPReaction.cxx NPTimeStamp.cxx NPPhaseSpace.cxx NPQFS.cxx NPParticleDict.cxx NPReactionDict.cxx NPTimeStampDict.cxx NPPhaseSpaceDict.cxx NPQFSDict.cxx NPEnergyLossDict.cxx ) +add_library(NPPhysics SHARED GEF.cxx NPInelasticBreakup.cxx NPInelasticBreakupDict.cxx NPFissionDecay.cxx NPDecay.cxx NPBeam.cxx NPEnergyLoss.cxx NPFunction.cxx NPParticle.cxx NPReaction.cxx NPTimeStamp.cxx NPPhaseSpace.cxx NPQFS.cxx NPParticleDict.cxx NPReactionDict.cxx NPTimeStampDict.cxx NPPhaseSpaceDict.cxx NPQFSDict.cxx NPEnergyLossDict.cxx NPBreitWigner.cxx) + target_link_libraries(NPPhysics ${ROOT_LIBRARIES} Physics NPCore) add_library(NPInitialConditions SHARED TInitialConditions.cxx TInitialConditionsDict.cxx ) @@ -44,7 +45,9 @@ add_library(NPReactionConditions SHARED TReactionConditions.cxx TReactionConditi target_link_libraries(NPReactionConditions ${ROOT_LIBRARIES} ) add_library(NPFissionConditions SHARED TFissionConditions.cxx TFissionConditionsDict.cxx) -target_link_libraries(NPFissionConditions ${ROOT_LIBRARIES} ) +target_link_libraries(NPFissionConditions ${ROOT_LIBRARIES} ) + +install(FILES GEF.h NPInelasticBreakup.h NPFissionDecay.h NPDecay.h NPBeam.h NPEnergyLoss.h NPFunction.h NPParticle.h NPNucleus.h NPReaction.h NPPhaseSpace.h NPQFS.h NPTimeStamp.h TInitialConditions.h TTrackInfo.h TInteractionCoordinates.h TReactionConditions.h TFissionConditions.h NPBreitWigner.h DESTINATION ${CMAKE_INCLUDE_OUTPUT_DIRECTORY}) +install(FILES GEF.h NPInelasticBreakup.h NPFissionDecay.h NPDecay.h NPBeam.h NPEnergyLoss.h NPFunction.h NPParticle.h NPNucleus.h NPReaction.h NPPhaseSpace.h NPQFS.h NPTimeStamp.h TInitialConditions.h TTrackInfo.h TInteractionCoordinates.h TReactionConditions.h TFissionConditions.h NPBreitWigner.h DESTINATION ${CMAKE_INCLUDE_OUTPUT_DIRECTORY}) -install(FILES GEF.h NPInelasticBreakup.h NPFissionDecay.h NPDecay.h NPBeam.h NPEnergyLoss.h NPFunction.h NPParticle.h NPNucleus.h NPReaction.h NPPhaseSpace.h NPQFS.h NPTimeStamp.h TInitialConditions.h TTrackInfo.h TInteractionCoordinates.h TReactionConditions.h TFissionConditions.h DESTINATION ${CMAKE_INCLUDE_OUTPUT_DIRECTORY}) diff --git a/NPLib/Physics/NPBeam.cxx b/NPLib/Physics/NPBeam.cxx index ff5f5d840..0de5b6fbd 100644 --- a/NPLib/Physics/NPBeam.cxx +++ b/NPLib/Physics/NPBeam.cxx @@ -244,7 +244,6 @@ void Beam::GenerateRandomEvent(double& E, double& X, double& Y, double& Z, doubl //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void Beam::Print() const { - } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/NPLib/Physics/NPBreitWigner.cxx b/NPLib/Physics/NPBreitWigner.cxx new file mode 100644 index 000000000..53d280cfa --- /dev/null +++ b/NPLib/Physics/NPBreitWigner.cxx @@ -0,0 +1,269 @@ +#if __cplusplus > 201703L +/***************************************************************************** + * Copyright (C) 2009-2016 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 : Audrey ANNE contact address: anne@lpccaen.in2p3.fr * + * * + * Creation Date : February 2024 * + *---------------------------------------------------------------------------* + * Decription: * + * * + * * + * * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + * * + *****************************************************************************/ + +// STL +#include <iostream> +#include <fstream> +#include <cstdlib> +#include <sstream> +#include <cmath> +#include <vector> + +// NPL header +#include "NPBreitWigner.h" +#include "NPFunction.h" +#include "NPOptionManager.h" + +// ROOT Header +#include "TDirectory.h" +#include "TCanvas.h" + +// Use CLHEP System of unit and Physical Constant +#include "NPGlobalSystemOfUnits.h" +#include "NPPhysicalConstants.h" + +#ifdef NP_SYSTEM_OF_UNITS_H +using namespace NPUNITS; +#endif + +#include "TAxis.h" + +using namespace NPL; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +BreitWigner::BreitWigner():hc(hbarc/fermi), uma(amu_c2){ + + fR0 = 1.4; // Value in Breit Wigner models + fNeutron = Particle("n"); + + fShiftZero = 0; + fWidthCst = 0; + + // Breit Wigner parameters + fX0 = 1.0; + fW0 = 1.0; + fell = 0; + fA = 1; + fn = 1; + fparam0 = 1.0; + + // Calculated values + fmu = 1.0; + fR = 1.0; + frho_0 = 1.0; + fP0 = 1.0; + fSF0 = 1.0; + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +BreitWigner::~BreitWigner(){ +} + + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +void BreitWigner::ReadConfigurationFile(string Path){ + NPL::InputParser parser(Path); + ReadConfigurationFile(parser); +} + +void BreitWigner::ReadConfigurationFile(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("BreitWigner"); + if(blocks.size()>0 && NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "\033[1;35m//// Breit Wigner energy distribution " << endl; + + vector<string> token = {"Energy0","Width0", "l", "Heavy","Light", "NeutronNumber","MultiplicateurAmplitude", "ShiftZero", "WidthCst"}; + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(token)){ + + fX0 = blocks[i]->GetDouble("Energy0","MeV"); + fW0 = blocks[i]->GetDouble("Width0","MeV"); + if(fW0<=0) fW0 = 1e-4 ; + fell = blocks[i]->GetInt("l"); + fHeavy = Particle(blocks[i]->GetString("Heavy")); + fLight = Particle(blocks[i]->GetString("Light")); + fn = blocks[i]->GetInt("NeutronNumber"); + fparam0 = blocks[i]->GetDouble("MultiplicateurAmplitude","MeV"); + fShiftZero = blocks[i]->GetInt("ShiftZero"); + fWidthCst = blocks[i]->GetInt("WidthCst"); + + } + + else{ + cout << "ERROR: check your input file formatting in Breit Wigner block(s) " << endl; + exit(1); + } + + fA = fLight.GetA(); + fmu = (uma*fA*fn)/(fA+fn); + fR = fR0*(TMath::Power(fA,(1.0/3.0)) + TMath::Power(fn,(1.0/3.0))); + frho_0 = Calculate_Rho_Var(fX0); + fP0 = Penetration_Factor(frho_0); + fSF0 = Shift_Factor(frho_0); + + fQ = fLight.Mass() + fn*fNeutron.Mass() - fHeavy.Mass(); + cout << "Q de reaction = " << fQ << endl; + + + }//end reading token in input file +}//end ReadConfigurationFile + + +double BreitWigner::Eval(const double & x_) const { + + if(x_<0) return 0.; + + double rho_x, W, dX; + rho_x = Calculate_Rho_Var(x_); + W = Width(rho_x); + dX = Shift(rho_x); + + return fparam0*(W*fW0/4.0)/(TMath::Power(fX0+dX-x_,2.0) + TMath::Power(W/2.0, 2.0)); +} + +double BreitWigner::Eval_For_TF1(const double * x_, const double * /* params_ */) const +{ + return this->Eval(*x_); +} + + +TF1 * BreitWigner::Make_TF1() const +{ + return new TF1("BW_TF1", this,&BreitWigner::Eval_For_TF1, 0.0, 10.0, 0); +} + +TH1D * BreitWigner::Make_TH1() const +{ + TF1 *func = new TF1("BW_TF1", this, &BreitWigner::Eval_For_TF1, 0.0, 10.0, 0); + TH1D *Hist = dynamic_cast<TH1D*>(func->GetHistogram()); + + TAxis *AxisX = Hist->GetXaxis(); + AxisX->Set( AxisX->GetNbins(), fQ + (AxisX->GetXmin()), fQ + (AxisX->GetXmax()) ); + + return Hist; +} + +double BreitWigner::Calculate_Rho_Var( double E) const { + return sqrt(2.0*fmu*E)*fR/hc; +} + + +double BreitWigner::Width(double rho_x) const { + return fW0*Width_Ratio(rho_x); +} + +double BreitWigner::Shift(double rho_x) const { + return fW0*Shift_Ratio(rho_x); +} + + +double BreitWigner::Width_Ratio(double rho_x) const { + + if(fell>=0 and !fWidthCst){ + double fP = Penetration_Factor(rho_x); + return fP/fP0; + } + else return 1.0; +} + +double BreitWigner::Shift_Ratio(double rho_x) const { + if(fell>=0 and !fShiftZero){ + return (fSF0 - Shift_Factor(rho_x))/(2.0*fP0); + } + else return 0.0; +} + +double BreitWigner::Shift_Factor(double rho) const { + if(rho==0) rho = 1e-36; //to avoid singularities + + double J = std::cyl_bessel_j(fell+0.5, rho); + double Jm = std::cyl_bessel_j(fell-0.5, rho); + double Y = std::cyl_neumann(fell+0.5, rho); + double Ym = std::cyl_neumann(fell-0.5, rho); + + double sum2 = J*J + Y*Y ; + + return -(sum2*fell-(J*Jm+Y*Ym)*rho)/sum2; +} + + +double BreitWigner::Penetration_Factor(double rho) const { + if(rho==0) rho = 1e-36; // to avoid singularities + + Double_t J = std::cyl_bessel_j(fell+0.5,rho); + Double_t Y = std::cyl_neumann(fell+0.5,rho); + + return (2./TMath::Pi())/(TMath::Power(J,2)+TMath::Power(Y,2)); // in principle we must differiente rho / k but R is the same +} + + + +void BreitWigner::Dump() const { + //print +} + + + +//--------------- /!\ For test only /!\----------------- // +/* +TF1 * BreitWigner::Make_TF1(const char * name_) const +{ + return new TF1(name_, this, &BreitWigner::Eval_For_TF1, 0.0, 10.0, 0); +} +*/ + + +void BreitWigner::Save_TF1() const { + + TF1 *BWFunc = new TF1("BWFunc", this, &BreitWigner::Eval_For_TF1, 0.0, 10.0, 0); + + TFile myfile("../../Projects/S034_audrey/output/BreitWigner/testBW.root","RECREATE"); + + BWFunc->Write(); + myfile.Close(); + delete BWFunc; +} + + + +void BreitWigner::Save_Histo() const { + + TF1 *fonc = new TF1("fonc", this, &BreitWigner::Eval_For_TF1, 0.0, 10.0, 0); + + TFile myfile("../../Projects/S034_audrey/output/BreitWigner/testHist.root","RECREATE"); + + TH1 *hist = fonc->GetHistogram(); + + TAxis *a = hist->GetXaxis(); + a->Set( a->GetNbins(), fQ + (a->GetXmin()), fQ + (a->GetXmax()) ); + + hist->Write(); + myfile.Close(); + delete fonc; +} + +#endif diff --git a/NPLib/Physics/NPBreitWigner.h b/NPLib/Physics/NPBreitWigner.h new file mode 100644 index 000000000..83437be84 --- /dev/null +++ b/NPLib/Physics/NPBreitWigner.h @@ -0,0 +1,125 @@ +#ifndef NPBreitWigner_h +#define NPBreitWigner_h +#if __cplusplus > 201703L +/***************************************************************************** + * Copyright (C) 2009-2016 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 : Audrey ANNE contact address: anne@lpccaen.in2p3.fr * + * * + * Creation Date : February 2024 * + *---------------------------------------------------------------------------* + * Decription: * + * * + * * + * * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + * * + *****************************************************************************/ +// C++ header +#include <string> + +// ROOT header +#include "TH1.h" +#include "TF1.h" +#include "TMath.h" +#include <cmath> +#include "TRandom.h" + +// NPL header +#include "NPInputParser.h" +#include "NPParticle.h" + +class TF1; + +using namespace std; + +namespace NPL{ + + class BreitWigner{ + + public: // Constructors and Destructors + BreitWigner(); + ~BreitWigner(); + + + public: //Read Method + void ReadConfigurationFile(string Path); + void ReadConfigurationFile(NPL::InputParser); + + + private: + //Physical Constants + const double hc; + const double uma; + + bool fShiftZero; // = 0 -> Shift ; = 1 -> no Shift + bool fWidthCst; // = 0 -> constant Width ; = 1 -> Width + + double fR0; + + double fX0; + double fW0; + int fell; // l + int fA; // Fragment's A number + int fn; // Neutrons number + double fparam0; + + Particle fHeavy; // Heavy in BreitWigner (example : He8 -> He4 + 4n, Heavy is He8). + Particle fLight; // Light in BreitWigner (example : He8 -> He4 + 4n, Light is He4). + Particle fNeutron; + + //Calculated values + double frho_0; + double fP0; + double fSF0; + double fmu; // + double fR; + + double fQ; + + + public: + + void SetA(int A){fA = A;} + int GetA()const{return fA;} + + void SetL(int l){fell = l;} + int GetL()const{return fell;} + + double Calculate_Rho_Var(double E) const; + double Width(double rho_X) const; + double Shift(double rho_X) const; + double Width_Ratio(double rho_X) const; + double Shift_Ratio(double rho_x) const; + double Shift_Factor(double rho) const; + double Penetration_Factor(double rho) const; + + + double Eval(const double & x_) const; + double Eval_For_TF1(const double * x_, const double * /* params_ */) const; + + + TF1 * Make_TF1() const; + TH1D * Make_TH1() const; + + //TF1 * Make_TF1(const char * name_) const; + + //only for test -> TF1 and TH1 put in .root file + void Save_Histo() const ; + void Save_TF1() const ; + + void Dump() const; + }; +} + +#endif //c++17 +#endif //ndef diff --git a/NPLib/Physics/NPQFS.cxx b/NPLib/Physics/NPQFS.cxx index 17710ab3d..06295d4f9 100644 --- a/NPLib/Physics/NPQFS.cxx +++ b/NPLib/Physics/NPQFS.cxx @@ -58,13 +58,14 @@ using namespace NPUNITS; // ROOT #include"TF1.h" +#include "TMath.h" ClassImp(QFS) //////////////////////////////////////////////////////////////////////////////// QFS::QFS(){ - + //------------- Default Constructor ------------- fVerboseLevel = NPOptionManager::getInstance()->GetVerboseLevel(); fBeamEnergy = 0; @@ -92,12 +93,14 @@ QFS::QFS(){ fPerpMomentumHist = NULL; fParMomentumHist = NULL; fDeexcitation = false; + } //////////////////////////////////////////////////////////////////////////////// QFS::~QFS(){ + } ///////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -121,7 +124,7 @@ void QFS::ReadConfigurationFile(string Path){ //////////////////////////////////////////////////////////////////////////////// void QFS::ReadConfigurationFile(NPL::InputParser parser){ - + cout << " In QFS ReadConfiguration " << endl; vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("QFSReaction"); if(blocks.size()>0 && NPOptionManager::getInstance()->GetVerboseLevel()) diff --git a/NPLib/Physics/NPQFS.h b/NPLib/Physics/NPQFS.h index 5637d1471..089b4b4e3 100644 --- a/NPLib/Physics/NPQFS.h +++ b/NPLib/Physics/NPQFS.h @@ -45,6 +45,8 @@ #include "NPParticle.h" #include "NPBeam.h" #include "NPInputParser.h" + + using namespace NPL; // ROOT header @@ -62,10 +64,11 @@ namespace NPL{ class QFS{ public: // Constructors and Destructors - QFS(); + QFS(); ~QFS(); private: + int fVerboseLevel; Beam fParticleA; // Beam (A) Particle fParticleT; // Target (T) diff --git a/NPLib/Physics/NPReaction.cxx b/NPLib/Physics/NPReaction.cxx index 70f0206a1..f2e70c3ce 100644 --- a/NPLib/Physics/NPReaction.cxx +++ b/NPLib/Physics/NPReaction.cxx @@ -245,12 +245,6 @@ double Reaction::ShootRandomThetaCM() { return theta; } -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... -void Reaction::ShootRandomExcitationEnergy() { - if (fExcitationEnergyHist) { - SetExcitation4(fExcitationEnergyHist->GetRandom()); - } -} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... void Reaction::KineRelativistic(double& ThetaLab3, double& KineticEnergyLab3, double& ThetaLab4, @@ -473,6 +467,7 @@ void Reaction::ReadConfigurationFile(NPL::InputParser parser) { double CSHalfOpenAngleMin = 0 * deg; double CSHalfOpenAngleMax = 180 * deg; for (unsigned int i = 0; i < blocks.size(); i++) { + if (blocks[i]->HasTokenList(token1)) { int v = NPOptionManager::getInstance()->GetVerboseLevel(); NPOptionManager::getInstance()->SetVerboseLevel(0); @@ -483,7 +478,8 @@ void Reaction::ReadConfigurationFile(NPL::InputParser parser) { fParticle2 = GetParticle(blocks[i]->GetString("Target"), parser); fParticle3 = GetParticle(blocks[i]->GetString("Light"), parser); fParticle4 = GetParticle(blocks[i]->GetString("Heavy"), parser); - } + }// if token1 + else if (blocks[i]->HasTokenList(token2)) { fParticle1.SetVerboseLevel(0); fParticle1.ReadConfigurationFile(parser); @@ -492,7 +488,8 @@ void Reaction::ReadConfigurationFile(NPL::InputParser parser) { fParticle2 = GetParticle(blocks[i]->GetString("Target"), parser); fParticle3 = GetParticle(blocks[i]->GetString("Particle3"), parser); fParticle4 = GetParticle(blocks[i]->GetString("Particle4"), parser); - } + }//if token2 + else { cout << "ERROR: check your input file formatting \033[0m" << endl; exit(1); @@ -585,12 +582,38 @@ void Reaction::ReadConfigurationFile(NPL::InputParser parser) { // simulation fUseExInGeant4 = blocks[i]->GetInt("UseExInGeant4"); } + + }//end for loop TwoBodyReaction + + + vector<NPL::InputBlock*> blocksBW = parser.GetAllBlocksWithToken("BreitWigner"); + if (blocksBW.size() > 0 && NPOptionManager::getInstance()->GetVerboseLevel()) { + + #if __cplusplus > 201703L + fBreitWigner.ReadConfigurationFile(parser); + fExcitationEnergyHist = fBreitWigner.Make_TH1(); + fExcitation4 = 0; + #else + cout << "You need at least C++17 to use the BreitWigner distribution" << endl; + #endif } + + SetCSAngle(CSHalfOpenAngleMin / deg, CSHalfOpenAngleMax / deg); initializePrecomputeVariable(); cout << "\033[0m"; + +}//end ReadConfigurationFile + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void Reaction::ShootRandomExcitationEnergy() { + if (fExcitationEnergyHist) { + SetExcitation4(fExcitationEnergyHist->GetRandom()); + } } + //////////////////////////////////////////////////////////////////////////////////////////// void Reaction::initializePrecomputeVariable() { diff --git a/NPLib/Physics/NPReaction.h b/NPLib/Physics/NPReaction.h index fa43b2c6a..f216fd81a 100644 --- a/NPLib/Physics/NPReaction.h +++ b/NPLib/Physics/NPReaction.h @@ -36,6 +36,10 @@ #include "NPInputParser.h" #include "NPParticle.h" +#if __cplusplus > 201703L +#include "NPBreitWigner.h" +#endif + using namespace NPL; // ROOT header @@ -99,7 +103,13 @@ namespace NPL { double fExcitation4; // Excitation energy in MeV TH1D* fCrossSectionHist; // Differential cross section in CM frame TH2F* fDoubleDifferentialCrossSectionHist; // Diff. CS CM frame vs Beam E + TH1D* fExcitationEnergyHist; // Distribution of Excitation energy + + #if __cplusplus > 201703L + BreitWigner fBreitWigner; // Breit Wigner energy distribution + #endif + public: // Getters and Setters void SetBeamEnergy(const double& eBeam) { diff --git a/NPLib/Physics/TReactionConditions.cxx b/NPLib/Physics/TReactionConditions.cxx index f4882241d..c47c51d3c 100644 --- a/NPLib/Physics/TReactionConditions.cxx +++ b/NPLib/Physics/TReactionConditions.cxx @@ -87,7 +87,7 @@ void TReactionConditions::Dump() const{ << fRC_Internal_Momentum.X() << " ; " << fRC_Internal_Momentum.Y() << " ; " << fRC_Internal_Momentum.Z() << ")" << endl; - + TVector3 *emitted= new TVector3(); // emmitted particle unsigned int size = fRC_Particle_Name.size(); diff --git a/NPLib/Physics/TReactionConditions.h b/NPLib/Physics/TReactionConditions.h index ade0078b8..9b0ead8c7 100644 --- a/NPLib/Physics/TReactionConditions.h +++ b/NPLib/Physics/TReactionConditions.h @@ -58,6 +58,7 @@ private: double fRC_Vertex_Position_X; double fRC_Vertex_Position_Y; double fRC_Vertex_Position_Z; + //Center of mass angle for the reaction double fRC_ThetaCM; @@ -100,7 +101,7 @@ public: void SetExcitationEnergy4 (const double& Ex) {fRC_ExcitationEnergy4=Ex;};//! void SetThetaCM (const double & ThetaCM) {fRC_ThetaCM = ThetaCM;}//! void SetInternalMomentum (const TVector3& IntMom) {fRC_Internal_Momentum = IntMom;}//! - + // emmitted particles void SetParticleName (const string & Particle_Name) {fRC_Particle_Name.push_back(Particle_Name);}//! void SetTheta (const double & Angle) {fRC_Theta.push_back(Angle);}//! @@ -135,7 +136,7 @@ public: double GetExcitation4 () const {return fRC_ExcitationEnergy4 ;}//! double GetThetaCM () const {return fRC_ThetaCM;}//! TVector3 GetInternalMomentum () const {return fRC_Internal_Momentum;}//! - + // emmitted particles int GetParticleMultiplicity() const {return fRC_Kinetic_Energy.size();}//! string GetParticleName (const int &i) const {return fRC_Particle_Name[i];}//! diff --git a/NPLib/TrackReconstruction/NPDCReconstructionMT.cxx b/NPLib/TrackReconstruction/NPDCReconstructionMT.cxx index cca563472..7786a6575 100644 --- a/NPLib/TrackReconstruction/NPDCReconstructionMT.cxx +++ b/NPLib/TrackReconstruction/NPDCReconstructionMT.cxx @@ -30,6 +30,8 @@ using namespace std; using namespace NPL; + + //////////////////////////////////////////////////////////////////////////////// DCReconstructionMT::DCReconstructionMT(unsigned int number_thread) { ROOT::EnableThreadSafety(); @@ -70,10 +72,15 @@ void DCReconstructionMT::AddPlan(unsigned int ID, const vector<double>& X, const } } - fitX[free_thread] = &X; - fitZ[free_thread] = &Z; + // fitX[free_thread] = &X; + // fitZ[free_thread] = &Z; + + fitX[free_thread] = &Z; + fitZ[free_thread] = &X; + fitR[free_thread] = &R; m_uid[free_thread] = ID; + // assume all X,Z,R of same size sizeX[free_thread] = X.size(); m_Ready[free_thread] = true; @@ -142,6 +149,7 @@ double DCReconstructionMT::SumD(const double* parameter) { double P = 0; double a = parameter[0]; double b = parameter[1]; + double ab = a * b; double a2 = a * a; unsigned int id = parameter[2]; @@ -158,6 +166,7 @@ double DCReconstructionMT::SumD(const double* parameter) { x = (a * d - ab + c) / (1 + a2); z = a * x + b; p = (x - c) * (x - c) + (z - d) * (z - d) - r * r; + // numerical trick to have a smooth derivative instead of using abs P += sqrt(p * p + 0.1); } @@ -214,6 +223,7 @@ void DCReconstructionMT::StartThread(unsigned int id) { double ai, bi; unsigned int uid; const double* xs; + // create the functor // each threads needs its own or the minisation is not thread safe ROOT::Math::Functor* func = new ROOT::Math::Functor(this, &NPL::DCReconstructionMT::SumD, 3); @@ -233,9 +243,10 @@ void DCReconstructionMT::StartThread(unsigned int id) { // Define the starting point of the fit: a straight line passing through the // the first and last wire // z = ax+b -> x=(z-b)/a - ai = ((*fitZ[id])[sizeX[id] - 1] - (*fitZ[id])[0]) / - ((*fitX[id])[sizeX[id] - 1] - (*fitX[id])[0] + (*fitR[id])[sizeX[id] - 1] - (*fitR[id])[0]); - bi = (*fitZ[id])[0] - ai * ((*fitX[id])[0] + (*fitR[id])[0]); + // if(id == 0) cout << endl; + ai = ((*fitZ[id])[sizeX[id] - 1] - (*fitZ[id])[0]) / + ((*fitX[id])[sizeX[id] - 1] - (*fitX[id])[0] + (*fitR[id])[sizeX[id] - 1] - (*fitR[id])[0]); + bi = (*fitZ[id])[0] - ai * ((*fitX[id])[0] + (*fitR[id])[0]); if (std::isinf(ai)) { // then there is no two point in different layer m_a[uid] = -10000; @@ -244,11 +255,12 @@ void DCReconstructionMT::StartThread(unsigned int id) { m_X100[uid] = -10000; m_minimum[uid] = 10000; } - + else { + mini->Clear(); mini->SetVariable(0, "a", ai, 1); - mini->SetVariable(1, "b", bi, 1); + mini->SetVariable(1, "b", bi, 1); mini->SetFixedVariable(2, "id", id); // Perform minimisation mini->Minimize(); @@ -256,10 +268,15 @@ void DCReconstructionMT::StartThread(unsigned int id) { // access set of parameter that produce the minimum xs = mini->X(); uid = m_uid[id]; - m_a[uid] = xs[0]; - m_b[uid] = xs[1]; + // m_a[uid] = xs[0]; + // m_b[uid] = xs[1]; + + m_a[uid] = 1.0/xs[0]; + m_b[uid] = -(1.0/xs[0]) * xs[1]; m_X0[uid] = -m_b[uid] / m_a[uid]; m_X100[uid] = (100 - m_b[uid]) / m_a[uid]; + m_a[uid] = xs[0]; + m_b[uid] = xs[1]; m_minimum[uid] = mini->MinValue(); } // notify main thread job is done diff --git a/NPLib/TrackReconstruction/NPDCReconstructionMT.h b/NPLib/TrackReconstruction/NPDCReconstructionMT.h index 29af99a16..342a3ae8b 100644 --- a/NPLib/TrackReconstruction/NPDCReconstructionMT.h +++ b/NPLib/TrackReconstruction/NPDCReconstructionMT.h @@ -70,7 +70,7 @@ namespace NPL{ // Function used by the minimizer in BuildTrack2D double SumD(const double* parameter ); - + // For debugging/optimisation // Scan Sumd versus parameter a or b (tovary =0 for a, 1 for b) // return a TGraph for display diff --git a/NPSimulation/Core/MaterialManager.cc b/NPSimulation/Core/MaterialManager.cc index 14f7be2d8..4aaef449e 100644 --- a/NPSimulation/Core/MaterialManager.cc +++ b/NPSimulation/Core/MaterialManager.cc @@ -165,7 +165,7 @@ G4Material* MaterialManager::GetMaterialFromLibrary(string Name, double density) else if (Name == "Mylar") { if (!density) density = 1.397 * g / cm3; - G4Material* material = new G4Material("NPS_" + Name, density, 3); + G4Material* material = new G4Material("NPS_" + Name, density, 3); material->AddElement(GetElementFromLibrary("H"), 8); material->AddElement(GetElementFromLibrary("C"), 10); material->AddElement(GetElementFromLibrary("O"), 4); @@ -1285,7 +1285,7 @@ G4Material* MaterialManager::GetGasFromLibrary(string Name, double Pressure, dou string newName = oss.str(); map<string, G4Material*>::iterator it; it = m_Material.find(Name); - + double density = 0; G4double Vm = 0.08206 * Temperature * atmosphere / (Pressure * kelvin); @@ -1378,6 +1378,18 @@ G4Material* MaterialManager::GetGasFromLibrary(string Name, double Pressure, dou return material; } + if (Name == "CH4_60_He_40") // Gas mix of CH4 60% and He 40% at 20C° and 1 atm + { + density = ((0.6 * (12.0107 + 4 * 1.00794) + (0.4 * 1.00794))/Vm ) *mg/cm3; + G4Material* material = new G4Material("NPS_" + newName, density, 2, kStateGas, Temperature, Pressure); + + material->AddMaterial(GetGasFromLibrary("CH4", Pressure, Temperature), 0.6); + material->AddMaterial(GetGasFromLibrary("He", Pressure, Temperature), 0.4); + m_Material[newName] = material; + return material; + } + + else { exit(1); } diff --git a/NPSimulation/Detectors/Minos/Minos.cc b/NPSimulation/Detectors/Minos/Minos.cc index ea4ac5d1c..fa7a02068 100644 --- a/NPSimulation/Detectors/Minos/Minos.cc +++ b/NPSimulation/Detectors/Minos/Minos.cc @@ -107,14 +107,15 @@ Minos::Minos() { m_ReactionRegion = NULL; // RGB Color + Transparency - m_VisTarget = new G4VisAttributes(G4Colour(0.6, 1., 1., .4)); - m_VissimpleBox = new G4VisAttributes(G4Colour(0, 1, 0, .6)); - m_VisTPC = new G4VisAttributes(G4Colour(1., 0.5, 0.6, 0.3)); - m_VisRohacell = new G4VisAttributes(G4Colour(1., 1., 1., .8)); - m_VisKapton = new G4VisAttributes(G4Colour(1., 1., 0.6, 0.4)); - m_VisTargetCell = new G4VisAttributes(G4Colour(0, 0, 1, .4)); + + m_VisTarget = new G4VisAttributes(G4Colour(0.6, 1., 1., 1.0)); + m_VissimpleBox = new G4VisAttributes(G4Colour(0, 1, 0, 0.6)); + m_VisTPC = new G4VisAttributes(G4Colour(1., 0.5, 0.6, 0.6)); + m_VisRohacell = new G4VisAttributes(G4Colour(1., 1., 1., 0.6)); + m_VisKapton = new G4VisAttributes(G4Colour(1., 1., 0.6, 0.6)); + m_VisTargetCell = new G4VisAttributes(G4Colour(0, 0, 1, 0.6)); m_VisTargetCell->SetForceSolid(true); - m_VisOuterKapton = new G4VisAttributes(G4Colour(1., 1., 0.6, 0.8)); + m_VisOuterKapton = new G4VisAttributes(G4Colour(1., 1., 0.6, 0.6)); Raw_Signal = new TH1F("raw_Signal", "raw_Signal", 512, 0, 512); Elec_Signal = new TH1F("Elec_Signal", "Elec_Signal", 512, 0, 512); @@ -374,9 +375,10 @@ void Minos::ConstructDetector(G4LogicalVolume* world) { double MinosX = Det_pos.x(); double MinosY = Det_pos.y(); double MinosZ = Det_pos.z() + m_TargetLength[i] / 2.; - + new G4PVPlacement(0, // its name - G4ThreeVector(0, 0, +ChamberLength / 2), + G4ThreeVector(MinosX, MinosY, Det_pos.z() +ChamberLength / 2), + //G4ThreeVector(0, 0, +ChamberLength / 2), /* G4ThreeVector(wX,wY, wZ + ChamberLength - m_TargetLength[i]-WindowThickness*2. - 5*mm ), // Z positioning putting TPC beginn and Target beginning w/ difference of 5mm */ BuildTPC(), // its logical volume diff --git a/NPSimulation/Detectors/Nebula/Nebula.cc b/NPSimulation/Detectors/Nebula/Nebula.cc index 40911278c..e60d15eb0 100644 --- a/NPSimulation/Detectors/Nebula/Nebula.cc +++ b/NPSimulation/Detectors/Nebula/Nebula.cc @@ -90,11 +90,10 @@ Nebula::Nebula(){ m_Module = 0; m_Veto = 0; - // RGB Color + Transparency m_VisModule = new G4VisAttributes(G4Colour(0.263, 0.682, 0.639, 1)); //m_VisModule = new G4VisAttributes(G4Colour(0.145, 0.384, 0.596, 1)); - m_VisVeto = new G4VisAttributes(G4Colour(0.4, 0.4, 0.4, 0.2)); + m_VisVeto = new G4VisAttributes(G4Colour(0.4, 0.4, 0.4, 0.8)); m_VisPMT = new G4VisAttributes(G4Colour(0.1, 0.1, 0.1, 1)); m_VisFrame = new G4VisAttributes(G4Colour(0, 0.3, 1, 0.5)); @@ -170,7 +169,7 @@ void Nebula::ReadConfiguration(NPL::InputParser parser){ } else if(blocks[i]->HasTokenList(xml)){ if(NPOptionManager::getInstance()->GetVerboseLevel()) - cout << endl << "//// Nebula XML file" << i+1 << endl; + cout << endl << "//// Nebula XML file " << i+1 << endl; std::string xml_file = blocks[i]->GetString("XML"); G4ThreeVector Offset = NPS::ConvertVector(blocks[i]->GetTVector3("Offset","mm")); bool InvertX = blocks[i]->GetInt("InvertX"); @@ -321,15 +320,15 @@ void Nebula::ReadSensitive(const G4Event* ){ Light_tmp = PlasticScorer_Module->GetLight(i); Energy = RandGauss::shoot(Energy_tmp, Energy_tmp*Nebula_NS::ResoEnergy); Light = RandGauss::shoot(Light_tmp, Light_tmp*Nebula_NS::ResoLight); - + if(Light>Nebula_NS::LightThreshold){ int DetectorNbr = level[0]; - double Position = RandGauss::shoot(PlasticScorer_Module->GetPosition(i),Nebula_NS::ResoPosition); - + double Position = RandGauss::shoot(PlasticScorer_Module->GetPositionY(i),Nebula_NS::ResoPosition); + m_Event->SetChargeUp(DetectorNbr,Light*exp(-(Nebula_NS::ModuleHeight/2-Position)/Nebula_NS::Attenuation)); m_Event->SetChargeDown(DetectorNbr,Light*exp(-(Nebula_NS::ModuleHeight/2+Position)/Nebula_NS::Attenuation)); - - // Take TOF and Position and compute Tup and Tdown + + // Take Time and Y Position and compute Tup and Tdown double Time = RandGauss::shoot(PlasticScorer_Module->GetTime(i),Nebula_NS::ResoTime); Time_up = (Nebula_NS::ModuleHeight/2-Position)/(c_light/Nebula_NS::MaterialIndex) + Time; @@ -341,24 +340,22 @@ void Nebula::ReadSensitive(const G4Event* ){ } //cout << endl; - - ///////////////////////////////// VETO SCORER ////////////////////////////////// - unsigned int VetoHits_size = PlasticScorer_Veto->GetMult(); + unsigned int VetoHits_size = PlasticScorer_Veto->GetMult(); for(unsigned int i = 0 ; i < VetoHits_size ; i++){ vector<unsigned int> level = PlasticScorer_Veto->GetLevel(i); Energy_tmp = PlasticScorer_Veto->GetEnergy(i); Light_tmp = PlasticScorer_Veto->GetLight(i); Energy = RandGauss::shoot(Energy_tmp, Energy_tmp*Nebula_NS::ResoEnergy); Light = RandGauss::shoot(Light_tmp, Light_tmp*Nebula_NS::ResoLight); - + if(Light>Nebula_NS::LightThreshold){ double Time = RandGauss::shoot(PlasticScorer_Veto->GetTime(i),Nebula_NS::ResoTime); //cout << "Time is " << Time << endl; - double Position = RandGauss::shoot(PlasticScorer_Veto->GetPosition(i),Nebula_NS::ResoPosition); + double Position = RandGauss::shoot(PlasticScorer_Veto->GetPositionY(i),Nebula_NS::ResoPosition); //cout << "Position is " << Position << endl; int DetectorNbr = level[0] + m_TotalModule; - //cout << "Veto ID: " << DetectorNbr << endl; + // cout << "Veto ID: " << DetectorNbr << endl; m_Event->SetChargeUp(DetectorNbr,Light*exp(-(Nebula_NS::VetoHeight/2-Position)/Nebula_NS::Attenuation)); m_Event->SetChargeDown(DetectorNbr,Light*exp(-(Nebula_NS::VetoHeight/2+Position)/Nebula_NS::Attenuation)); @@ -370,6 +367,7 @@ void Nebula::ReadSensitive(const G4Event* ){ Time_down = (Nebula_NS::VetoHeight/2+Position)/(c_light/Nebula_NS::MaterialIndex) + Time; //cout << "Time_down is " << Time_down << endl; m_Event->SetTimeDown(DetectorNbr,Time_down); + } } diff --git a/NPSimulation/Detectors/NeuLAND/CMakeLists.txt b/NPSimulation/Detectors/NeuLAND/CMakeLists.txt new file mode 100644 index 000000000..b0931a90d --- /dev/null +++ b/NPSimulation/Detectors/NeuLAND/CMakeLists.txt @@ -0,0 +1,2 @@ +add_library(NPSNeuLAND SHARED NeuLAND.cc) +target_link_libraries(NPSNeuLAND NPSCore ${ROOT_LIBRARIES} ${Geant4_LIBRARIES} ${NPLib_LIBRARIES} -lNPNeuLAND) diff --git a/NPSimulation/Detectors/NeuLAND/NeuLAND.cc b/NPSimulation/Detectors/NeuLAND/NeuLAND.cc new file mode 100644 index 000000000..43aff6c7d --- /dev/null +++ b/NPSimulation/Detectors/NeuLAND/NeuLAND.cc @@ -0,0 +1,493 @@ +/***************************************************************************** + * Copyright (C) 2009-2019 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 : December 2019 * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * This class describe NeuLAND simulation * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + *****************************************************************************/ + +// C++ headers +#include <sstream> +#include <cmath> +#include <limits> +//G4 Geometry object +#include "G4Tubs.hh" +#include "G4Box.hh" + +//G4 sensitive +#include "G4SDManager.hh" +#include "G4MultiFunctionalDetector.hh" + +//G4 various object +#include "G4Material.hh" +#include "G4MaterialPropertiesTable.hh" +#include "G4Transform3D.hh" +#include "G4PVPlacement.hh" +#include "G4VisAttributes.hh" +#include "G4Colour.hh" + +// NPTool header +#include "NeuLAND.hh" +#include "PlasticBar.hh" +#include "InteractionScorers.hh" +#include "ProcessScorers.hh" +#include "RootOutput.h" +#include "MaterialManager.hh" +#include "NPSDetectorFactory.hh" +#include "NPOptionManager.h" +#include "NPSHitsMap.hh" +// CLHEP header +#include "CLHEP/Random/RandGauss.h" + +using namespace std; +using namespace CLHEP; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +namespace NeuLAND_NS{ + // Energy and time Resolution + const double LightThreshold = 0.1*MeV; + const double ResoTime = 0.75/2.355*ns; //0.75 + const double ResoEnergy = 0.1/2.355*MeV; + const double ResoLight = 0.1/2.355*MeV; + const double ResoPosition = 1.0*um; //1.0 + const double ModuleWidth = 50*mm ; + const double ModuleLength = 50*mm ; + const double ModuleHeight = 2500*mm ; + const double InterModule = 1*mm ; + const double VetoWidth = 320*mm ; + const double VetoLength = 10*mm ; + const double VetoHeight = 1900*mm ; + const double InterVeto = 1*mm ; + const int VetoPerWall = 12; + const int VetoPerExpand = 6; + const double WallToVeto = 10*cm; + const double MaterialIndex = 1.58; + const double Attenuation = 6680*mm; + + const string Material = "BC400"; +} +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +// NeuLAND Specific Method +NeuLAND::NeuLAND(){ + m_Event = new TNeuLANDData() ; + m_ModuleScorer = 0; + m_VetoScorer = 0; + m_Module = 0; + m_Veto = 0; + + + // RGB Color + Transparency + m_VisModule = new G4VisAttributes(G4Colour(0.263, 0.682, 0.639, 0.3)); + //m_VisModule = new G4VisAttributes(G4Colour(0.145, 0.384, 0.596, 1)); + m_VisVeto = new G4VisAttributes(G4Colour(0.4, 0.4, 0.4, 0.8)); + m_VisPMT = new G4VisAttributes(G4Colour(0.1, 0.1, 0.1, 1)); + m_VisFrame = new G4VisAttributes(G4Colour(0, 0.3, 1, 0.5)); + +} + +NeuLAND::~NeuLAND(){ +} +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void NeuLAND::AddWall(G4ThreeVector Pos, int NbrModule, bool Veto, bool Frame){ + // Convert the Pos value to R theta Phi as Spherical coordinate is easier in G4 + m_Pos.push_back(Pos); + m_NbrModule.push_back(NbrModule); + m_HasVeto.push_back(Veto); + m_HasFrame.push_back(Frame); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +G4LogicalVolume* NeuLAND::BuildModule(){ + if(!m_Module){ + G4Box* box = new G4Box("NeuLAND_Module",NeuLAND_NS::ModuleWidth*0.5, + NeuLAND_NS::ModuleHeight*0.5,NeuLAND_NS::ModuleLength*0.5); + + G4Material* DetectorMaterial = MaterialManager::getInstance()->GetMaterialFromLibrary(NeuLAND_NS::Material); + m_Module = new G4LogicalVolume(box,DetectorMaterial,"logic_NeuLAND_Module",0,0,0); + m_Module->SetVisAttributes(m_VisModule); + m_Module->SetSensitiveDetector(m_ModuleScorer); + } + return m_Module; +} +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +G4LogicalVolume* NeuLAND::BuildVeto(){ + if(!m_Veto){ + G4Box* box = new G4Box("NeuLAND_Veto",NeuLAND_NS::VetoWidth*0.5, + NeuLAND_NS::VetoHeight*0.5,NeuLAND_NS::VetoLength*0.5); + + G4Material* DetectorMaterial = MaterialManager::getInstance()->GetMaterialFromLibrary(NeuLAND_NS::Material); + + m_Veto = new G4LogicalVolume(box,DetectorMaterial,"logic_NeuLAND_Veto",0,0,0); + m_Veto->SetVisAttributes(m_VisVeto); + m_Veto->SetSensitiveDetector(m_VetoScorer); + } + return m_Veto; +} + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +// Virtual Method of NPS::VDetector class + +// Read stream at Configfile to pick-up parameters of detector (Position,...) +// Called in DetectorConstruction::ReadDetectorConfiguration Method +void NeuLAND::ReadConfiguration(NPL::InputParser parser){ + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("NEULAND"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " detectors found " << endl; + + // define an entire wall + vector<string> wall = {"Pos","NumberOfModule","Veto","Frame"}; + + // use an experiment xml file to position bars individually + vector<string> xml= {"XML","Offset","InvertX","InvertY"}; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(wall)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// NeuLAND " << i+1 << endl; + + G4ThreeVector Pos = NPS::ConvertVector(blocks[i]->GetTVector3("Pos","mm")); + int NbrModule = blocks[i]->GetInt("NumberOfModule"); + bool Veto = blocks[i]->GetInt("Veto"); + bool Frame= blocks[i]->GetInt("Frame"); + AddWall(Pos,NbrModule,Veto,Frame); + } + else if(blocks[i]->HasTokenList(xml)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// NeuLAND XML file " << i+1 << endl; + std::string xml_file = blocks[i]->GetString("XML"); + G4ThreeVector Offset = NPS::ConvertVector(blocks[i]->GetTVector3("Offset","mm")); + bool InvertX = blocks[i]->GetInt("InvertX"); + bool InvertY = blocks[i]->GetInt("InvertY"); + ReadXML(xml_file,Offset,InvertX,InvertY); + } + else{ + cout << "ERROR: check your input file formatting " << endl; + exit(1); + } + } + std::for_each(m_NbrModule.begin(), m_NbrModule.end(), [&] (int n) { + m_TotalModule += n; + }); +} + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void NeuLAND::ReadXML(std::string xml_file,G4ThreeVector offset, bool InvertX,bool InvertY){ + NPL::XmlParser xml; + xml.LoadFile(xml_file); + std::vector<NPL::XML::block*> b = xml.GetAllBlocksWithName("NEULAND"); + int NumberOfBars=0; + for(unsigned int i = 0 ; i < b.size() ; i++){ + NumberOfBars++; + unsigned int id = b[i]->AsInt("ID"); + + // position + auto PositionX = b[i]->AsDouble("xpos"); + //cout << "//// " << PositionX << " position en x " << endl; + auto PositionY = b[i]->AsDouble("ypos"); + //cout << "//// " << PositionY << " position en y " << endl; + auto PositionZ = b[i]->AsDouble("zpos"); + //cout << "//// " << PositionZ << " position en z " << endl; + //cout <<"============================" << endl; + + // SubLayer 0 is used for Veto + auto SubLayer = b[i]->AsInt("SubLayer"); + // Name "NoUseX" is used to silence bars + auto nousestr = b[i]->AsString("NAME"); + + auto DirectionBar = b[i]->AsString("direction"); + //cout << "direction des barres -> " << DirectionBar << endl; + // cout << "id = " << id << endl; + + // Remove unused bar + if(nousestr.find("NoUse")==std::string::npos && PositionX!=PositionZ){ + if(InvertX) + PositionX*=-1; + if(InvertY) + PositionY*=-1; + m_PositionBar[id]= G4ThreeVector(PositionX,PositionY,PositionZ)+offset; + + // Direction bar + if(DirectionBar.find("V")==std::string::npos) + {m_IsHorizontal[id] = true; + // cout << DirectionBar << endl; + } + else m_IsHorizontal[id] = false; + + // cout << " m_IsHorizontal[id] = " << m_IsHorizontal[id] << endl; + + if(SubLayer) + m_IsVetoBar[id]= false; + else + m_IsVetoBar[id]= true; + } + + } //end of for + cout << " -> " << NumberOfBars << " bars found" << endl; + + +} //end of ReadXML + +// Construct detector and inialise sensitive part. +// Called After DetectorConstruction::AddDetector Method +void NeuLAND::ConstructDetector(G4LogicalVolume* world){ + + // Start with XML case + G4RotationMatrix* Rot = new G4RotationMatrix(); + + for(auto pos : m_PositionBar){ + + //cout << "m_IsHorizontal " << m_IsHorizontal[pos.first] << endl; + + if(m_IsHorizontal[pos.first]) + { + Rot->rotateZ(90.*deg); + } + + + + if(!m_IsVetoBar[pos.first]){ + new G4PVPlacement(G4Transform3D(*Rot,pos.second), + BuildModule(), + "NeuLANDModule",world,false,pos.first); + } + else{ + new G4PVPlacement(G4Transform3D(*Rot,pos.second), + BuildVeto(), + "NeuLANDModule",world,false,pos.first); //"NeuLANDVeto" + } + + Rot->set(0,0,0); + } + + + //Not XML + unsigned int nbrM = 1 ; + unsigned int nbrV = 1 ; + + for (unsigned short i = 0 ; i < m_Pos.size() ; i++) { + for (unsigned short m = 0 ; m < m_NbrModule[i] ; m++) { + double offset = (NeuLAND_NS::ModuleWidth+NeuLAND_NS::InterModule)*(-m_NbrModule[i]*0.5+m)+NeuLAND_NS::ModuleWidth*0.5; + G4ThreeVector Offset(offset,0,0); + new G4PVPlacement(G4Transform3D(*Rot,m_Pos[i]+Offset), + BuildModule(), + "NeuLANDModule",world,false,nbrM++); + } + + if(m_HasVeto[i]){ + if(m_NbrModule[i] > 15){ + for (unsigned short m = 0 ; m < NeuLAND_NS::VetoPerWall ; m++) { + double offset = (NeuLAND_NS::VetoWidth+NeuLAND_NS::InterVeto)*(-NeuLAND_NS::VetoPerWall*0.5+m)+NeuLAND_NS::VetoWidth*0.5; + G4ThreeVector Offset(offset,0,-NeuLAND_NS::WallToVeto); + new G4PVPlacement(G4Transform3D(*Rot,m_Pos[i]+Offset), + BuildVeto(), + "NeuLANDVeto",world,false,nbrV++); + } + } + else{ + for (unsigned short m = 0 ; m < NeuLAND_NS::VetoPerExpand ; m++) { + double offset = (NeuLAND_NS::VetoWidth+NeuLAND_NS::InterVeto)*(-NeuLAND_NS::VetoPerExpand*0.5+m)+NeuLAND_NS::VetoWidth*0.5; + G4ThreeVector Offset(offset,0,-NeuLAND_NS::WallToVeto); + new G4PVPlacement(G4Transform3D(*Rot,m_Pos[i]+Offset), + BuildVeto(), + "NeuLANDVeto",world,false,nbrV++); + } + } + } + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +// Add Detector branch to the EventTree. +// Called After DetectorConstruction::AddDetector Method +void NeuLAND::InitializeRootOutput(){ + RootOutput *pAnalysis = RootOutput::getInstance(); + TTree *pTree = pAnalysis->GetTree(); + if(!pTree->FindBranch("NeuLAND")){ + pTree->Branch("NeuLAND", "TNeuLANDData",&m_Event) ; + } + pTree->SetBranchAddress("NeuLAND", &m_Event) ; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +// Read sensitive part and fill the Root tree. +// Called at in the EventAction::EndOfEventAvtion +void NeuLAND::ReadSensitive(const G4Event* ){ + m_Event->Clear(); + + /////////// + // PlasticBar scorer + PlasticBar::PS_PlasticBar* PlasticScorer_Module = (PlasticBar::PS_PlasticBar*) m_ModuleScorer->GetPrimitive(0); + PlasticBar::PS_PlasticBar* PlasticScorer_Veto = (PlasticBar::PS_PlasticBar*) m_VetoScorer->GetPrimitive(0); + // Should we put a ProcessScorer here to get the info if the particle is first neutron and give it to NeuLANDData ? + + double Time_up, Time_down; + double Energy_tmp, Light_tmp; + + //////////// TRIAL TO GET THE OPTICAL INDEX FROM MATERIAL PROPERTIES ///////////// + //Trying to get Optical Index from Material directly + //const G4Material* aMaterial = MaterialManager::getInstance()->GetMaterialFromLibrary(NeuLAND_NS::Material); + //G4MaterialPropertiesTable* aMaterialPropertiesTable = aMaterial->GetMaterialPropertiesTable(); + //if(!aMaterialPropertiesTable->PropertyExists("RINDEX")){ + // MaterialIndex = !aMaterialPropertiesTable->GetConstProperty("RINDEX"); + //} + //else{ + // MaterialIndex = 0; + //} + //cout << MaterialManager::getInstance()->GetMaterialFromLibrary(NeuLAND_NS::Material)->GetMaterialPropertiesTable()->GetMaterialPropertyNames()[0] << endl; + ////////////////////////////////////////////////////////////////////////////////// + + ///////////////////////////////// MODULE SCORER ////////////////////////////////// + unsigned int ModuleHits_size = PlasticScorer_Module->GetMult(); + for(unsigned int i = 0 ; i < ModuleHits_size ; i++){ + vector<unsigned int> level = PlasticScorer_Module->GetLevel(i); + Energy_tmp = PlasticScorer_Module->GetEnergy(i); + Light_tmp = PlasticScorer_Module->GetLight(i); + Energy = RandGauss::shoot(Energy_tmp, Energy_tmp*NeuLAND_NS::ResoEnergy); + Light = RandGauss::shoot(Light_tmp, Light_tmp*NeuLAND_NS::ResoLight); + + if(Light>NeuLAND_NS::LightThreshold){ + int DetectorNbr = level[0]; + double PositionY = RandGauss::shoot(PlasticScorer_Module->GetPositionY(i),NeuLAND_NS::ResoPosition); + double PositionX = RandGauss::shoot(PlasticScorer_Module->GetPositionX(i),NeuLAND_NS::ResoPosition); + + + double Position; + + if((1<=DetectorNbr and DetectorNbr <=50) or (101<=DetectorNbr and DetectorNbr<=150) or (201<=DetectorNbr and DetectorNbr<=250) or (301<=DetectorNbr and DetectorNbr<=350) ) + { + Position = PositionX; + } + + else + { + Position = PositionY; + } + + //cout << "--------------" << endl; + m_Event->SetChargeUp(DetectorNbr,Light*exp(-(NeuLAND_NS::ModuleHeight/2-Position)/NeuLAND_NS::Attenuation)); + m_Event->SetChargeDown(DetectorNbr,Light*exp(-(NeuLAND_NS::ModuleHeight/2+Position)/NeuLAND_NS::Attenuation)); + + // Take Time and Position and compute Tup and Tdown + double Time = RandGauss::shoot(PlasticScorer_Module->GetTime(i),NeuLAND_NS::ResoTime); + + Time_up = (NeuLAND_NS::ModuleHeight/2-Position)/(c_light/NeuLAND_NS::MaterialIndex) + Time; + m_Event->SetTimeUp(DetectorNbr,Time_up); + + Time_down = (NeuLAND_NS::ModuleHeight/2+Position)/(c_light/NeuLAND_NS::MaterialIndex) + Time; + m_Event->SetTimeDown(DetectorNbr,Time_down); + } + } + + ///////////////////////////////// VETO SCORER ////////////////////////////////// + unsigned int VetoHits_size = PlasticScorer_Veto->GetMult(); + for(unsigned int i = 0 ; i < VetoHits_size ; i++){ + vector<unsigned int> level = PlasticScorer_Veto->GetLevel(i); + Energy_tmp = PlasticScorer_Veto->GetEnergy(i); + Light_tmp = PlasticScorer_Veto->GetLight(i); + Energy = RandGauss::shoot(Energy_tmp, Energy_tmp*NeuLAND_NS::ResoEnergy); + Light = RandGauss::shoot(Light_tmp, Light_tmp*NeuLAND_NS::ResoLight); + + if(Light>NeuLAND_NS::LightThreshold){ + double Time = RandGauss::shoot(PlasticScorer_Veto->GetTime(i),NeuLAND_NS::ResoTime); + //cout << "Time is " << Time << endl; + double Position = RandGauss::shoot(PlasticScorer_Veto->GetPositionY(i),NeuLAND_NS::ResoPosition); + //cout << "Position is " << Position << endl; + int DetectorNbr = level[0] + m_TotalModule; + //cout << "Veto ID: " << DetectorNbr << endl; + + m_Event->SetChargeUp(DetectorNbr,Light*exp(-(NeuLAND_NS::VetoHeight/2-Position)/NeuLAND_NS::Attenuation)); + m_Event->SetChargeDown(DetectorNbr,Light*exp(-(NeuLAND_NS::VetoHeight/2+Position)/NeuLAND_NS::Attenuation)); + + Time_up = (NeuLAND_NS::VetoHeight/2-Position)/(c_light/NeuLAND_NS::MaterialIndex) + Time; + //cout << "Time_up is " << Time_up << endl; + m_Event->SetTimeUp(DetectorNbr,Time_up); + + Time_down = (NeuLAND_NS::VetoHeight/2+Position)/(c_light/NeuLAND_NS::MaterialIndex) + Time; + //cout << "Time_down is " << Time_down << endl; + m_Event->SetTimeDown(DetectorNbr,Time_down); + } + } + + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//////////////////////////////////////////////////////////////// +void NeuLAND::InitializeScorers() { + // This check is necessary in case the geometry is reloaded + bool already_exist = false; + m_ModuleScorer = CheckScorer("NeuLANDModuleScorer",already_exist) ; + m_VetoScorer = CheckScorer("NeuLANDVetoScorer",already_exist) ; + + if(already_exist) + return ; + + // Otherwise the scorer is initialise + // Module + vector<int> level; level.push_back(0); + G4VPrimitiveScorer* ModulePlasticBar= new PlasticBar::PS_PlasticBar("ModulePlasticBar",level, 0); + G4VPrimitiveScorer* ModuleInteraction= new InteractionScorers::PS_Interactions("ModuleInteraction",ms_InterCoord, 0); + G4VPrimitiveScorer* ModuleProcess= new ProcessScorers::PS_Process("ModuleProcess", 0); + //and register it to the multifunctionnal detector + m_ModuleScorer->RegisterPrimitive(ModulePlasticBar); + m_ModuleScorer->RegisterPrimitive(ModuleInteraction); + m_ModuleScorer->RegisterPrimitive(ModuleProcess); + G4SDManager::GetSDMpointer()->AddNewDetector(m_ModuleScorer) ; + + // Veto + G4VPrimitiveScorer* VetoPlasticBar= new PlasticBar::PS_PlasticBar("VetoPlasticBar",level, 0); + G4VPrimitiveScorer* VetoInteraction= new InteractionScorers::PS_Interactions("VetoInteraction",ms_InterCoord, 0); + G4VPrimitiveScorer* VetoProcess= new ProcessScorers::PS_Process("ModuleProcess", 0); + //and register it to the multifunctionnal detector + m_VetoScorer->RegisterPrimitive(VetoPlasticBar); + m_VetoScorer->RegisterPrimitive(VetoInteraction); + m_VetoScorer->RegisterPrimitive(VetoProcess); + G4SDManager::GetSDMpointer()->AddNewDetector(m_VetoScorer) ; + + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//////////////////////////////////////////////////////////////////////////////// +// Construct Method to be pass to the DetectorFactory // +//////////////////////////////////////////////////////////////////////////////// +NPS::VDetector* NeuLAND::Construct(){ + return (NPS::VDetector*) new NeuLAND(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//////////////////////////////////////////////////////////////////////////////// +// Registering the construct method to the factory // +//////////////////////////////////////////////////////////////////////////////// +extern"C" { + class proxy_nps_NeuLAND{ + public: + proxy_nps_NeuLAND(){ + NPS::DetectorFactory::getInstance()->AddToken("NEULAND","NEULAND"); + NPS::DetectorFactory::getInstance()->AddDetector("NEULAND",NeuLAND::Construct); + } + }; + + proxy_nps_NeuLAND p_nps_NeuLAND; +} diff --git a/NPSimulation/Detectors/NeuLAND/NeuLAND.hh b/NPSimulation/Detectors/NeuLAND/NeuLAND.hh new file mode 100644 index 000000000..5b7a20ce7 --- /dev/null +++ b/NPSimulation/Detectors/NeuLAND/NeuLAND.hh @@ -0,0 +1,124 @@ +#ifndef NeuLAND_h +#define NeuLAND_h 1 +/***************************************************************************** + * Copyright (C) 2009-2019 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 : December 2019 * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * This class describe NeuLAND simulation * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + *****************************************************************************/ + +// C++ header +#include <string> +#include <vector> +#include <map> +using namespace std; + +// G4 headers +#include "G4ThreeVector.hh" +#include "G4RotationMatrix.hh" +#include "G4LogicalVolume.hh" +#include "G4MultiFunctionalDetector.hh" + +// NPTool header +#include "NPSVDetector.hh" +#include "TNeuLANDData.h" +#include "NPInputParser.h" +#include "NPXmlParser.h" + +class NeuLAND : public NPS::VDetector{ + //////////////////////////////////////////////////// + /////// Default Constructor and Destructor ///////// + //////////////////////////////////////////////////// + public: + NeuLAND() ; + virtual ~NeuLAND() ; + + //////////////////////////////////////////////////// + //////// Specific Function of this Class /////////// + //////////////////////////////////////////////////// + public: + // Cartesian + void AddWall(G4ThreeVector POS, int NbrModule,bool veto,bool frame); + void ReadXML(std::string xml_file,G4ThreeVector offset, bool InvertX,bool InvertY); + + G4LogicalVolume* BuildModule(); + G4LogicalVolume* BuildVeto(); + + private: + std::map<unsigned int , G4ThreeVector> m_PositionBar; + std::map<unsigned int , bool> m_IsVetoBar; + std::map<unsigned int , bool> m_IsHorizontal; + G4LogicalVolume* m_Module; + G4LogicalVolume* m_Veto; + double Energy; + double Light; + + //////////////////////////////////////////////////// + ////// Inherite from NPS::VDetector class ///////// + //////////////////////////////////////////////////// + public: + // Read stream at Configfile to pick-up parameters of detector (Position,...) + // Called in DetecorConstruction::ReadDetextorConfiguration Method + void ReadConfiguration(NPL::InputParser) ; + + // Construct detector and inialise sensitive part. + // Called After DetecorConstruction::AddDetector Method + void ConstructDetector(G4LogicalVolume* world) ; + + // Add Detector branch to the EventTree. + // Called After DetectorConstruction::AddDetector Method + void InitializeRootOutput() ; + + // Read sensitive part and fill the Root tree. + // Called at in the EventAction::EndOfEventAvtion + void ReadSensitive(const G4Event* event) ; + + public: // Scorer + // Initialize all Scorer used by the MUST2Array + void InitializeScorers() ; + + // Associated Scorer + G4MultiFunctionalDetector* m_ModuleScorer ; + G4MultiFunctionalDetector* m_VetoScorer ; + //////////////////////////////////////////////////// + ///////////Event class to store Data//////////////// + //////////////////////////////////////////////////// + private: + TNeuLANDData* m_Event ; + + //////////////////////////////////////////////////// + ///////////////Private intern Data////////////////// + //////////////////////////////////////////////////// + private: // Geometry + // Detector Coordinate + vector<G4ThreeVector> m_Pos; + vector<int> m_NbrModule; + int m_TotalModule = 0; + vector<bool> m_HasVeto; + vector<bool> m_HasFrame; + + // Visualisation Attribute + G4VisAttributes* m_VisModule; + G4VisAttributes* m_VisVeto; + G4VisAttributes* m_VisPMT; + G4VisAttributes* m_VisFrame; + + // Needed for dynamic loading of the library + public: + static NPS::VDetector* Construct(); +}; +#endif diff --git a/NPSimulation/Detectors/Samurai/CMakeLists.txt b/NPSimulation/Detectors/Samurai/CMakeLists.txt index c77d1a472..0723c2234 100644 --- a/NPSimulation/Detectors/Samurai/CMakeLists.txt +++ b/NPSimulation/Detectors/Samurai/CMakeLists.txt @@ -1,2 +1,2 @@ -add_library(NPSSamurai SHARED Samurai.cc SamuraiFieldPropagation.cc SamuraiFDC2.cc SamuraiFDC1.cc) +add_library(NPSSamurai SHARED Samurai.cc SamuraiFieldPropagation.cc SamuraiFDC2.cc SamuraiFDC1.cc SamuraiFDC0.cc SamuraiBDC.cc) target_link_libraries(NPSSamurai NPSCore ${ROOT_LIBRARIES} ${Geant4_LIBRARIES} ${NPLib_LIBRARIES} -lNPSamurai) diff --git a/NPSimulation/Detectors/Samurai/Samurai.cc b/NPSimulation/Detectors/Samurai/Samurai.cc index 92da9b578..8353824cd 100644 --- a/NPSimulation/Detectors/Samurai/Samurai.cc +++ b/NPSimulation/Detectors/Samurai/Samurai.cc @@ -68,7 +68,7 @@ namespace Samurai_NS{ //Main outer box const double Magnet_Width = 6700*mm; //(x) const double Magnet_Height = 4640*mm;//(y) - const double Magnet_Depth = 6000*mm;//(z) + const double Magnet_Depth = 4950*mm;//(z) //If depth is larger, it overlaps on FDC2 const double Magnet_Depth_eps = 0.2*mm; //(delta-z) const string Magnet_Material = "G4_Galactic"; //G4_Galactic @@ -113,11 +113,17 @@ namespace Samurai_NS{ Samurai::Samurai(){ //Visualization attributes - m_VisMagnet = new G4VisAttributes(G4Colour(0,0,1,0.5)); - m_VisYokes = new G4VisAttributes(G4Colour(0,1,0,0.5)); - m_VisRYokes = new G4VisAttributes(G4Colour(1,0,0,0.5)); - m_VisPropvol = new G4VisAttributes(G4Colour(0,1,1,0.5)); + m_VisMagnet = new G4VisAttributes(G4Colour(0,0,1,0.2)); + m_VisYokes = new G4VisAttributes(G4Colour(0,1,0,0.2)); + m_VisRYokes = new G4VisAttributes(G4Colour(1,0,0,0.2)); + m_VisPropvol = new G4VisAttributes(G4Colour(0,1,1,0.2)); + + // m_VisMagnet = new G4VisAttributes(G4Colour(0,0,1,0.0)); + // m_VisYokes = new G4VisAttributes(G4Colour(0,1,0,0.0)); + // m_VisRYokes = new G4VisAttributes(G4Colour(1,0,0,0.0)); + // m_VisPropvol = new G4VisAttributes(G4Colour(0,1,1,0.0)); + //Logical volumes m_Magnet = NULL; m_Yoke = NULL; @@ -213,6 +219,7 @@ G4LogicalVolume* Samurai::BuildMagnet(){ m_Magnet->SetVisAttributes(m_VisMagnet); m_Magnet->SetSensitiveDetector(m_SamuraiScorer); cout << "ATTACHING SCORER\n"; + } return m_Magnet; } @@ -231,6 +238,7 @@ G4LogicalVolume* Samurai::BuildYoke(){ //Logical Volume m_Yoke = new G4LogicalVolume(yoke, YokeMaterial, "logic_Samurai_yoke",0,0,0); m_Yoke->SetVisAttributes(m_VisYokes); + } return m_Yoke; } @@ -405,7 +413,7 @@ void Samurai::SetPropagationRegion(){ if(!m_PropagationRegion){ m_PropagationRegion= new G4Region("NPSamuraiFieldPropagation"); m_PropagationRegion -> AddRootLogicalVolume(BuildPropvol()); - m_PropagationRegion->SetUserLimits(new G4UserLimits(m_StepSize)); + m_PropagationRegion->SetUserLimits(new G4UserLimits(m_StepSize)); } G4FastSimulationManager* mng = m_PropagationRegion->GetFastSimulationManager(); diff --git a/NPSimulation/Detectors/Samurai/SamuraiBDC.cc b/NPSimulation/Detectors/Samurai/SamuraiBDC.cc new file mode 100644 index 000000000..4288a4cc5 --- /dev/null +++ b/NPSimulation/Detectors/Samurai/SamuraiBDC.cc @@ -0,0 +1,455 @@ +/***************************************************************************** + * 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: Audrey ANNE contact address: anne@lpccaen.in2p3.fr * + * * + * Creation Date : * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * This class describe Samurai BDCs simulation * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + *****************************************************************************/ + +// C++ headers +#include <sstream> +#include <cmath> + +//G4 Geometry object +#include "G4Box.hh" +#include "G4Tubs.hh" + +//G4 sensitive +#include "G4SDManager.hh" +#include "G4MultiFunctionalDetector.hh" + +//G4 various object +#include "G4Material.hh" +#include "G4Transform3D.hh" +#include "G4PVPlacement.hh" +#include "G4VisAttributes.hh" +#include "G4Colour.hh" +#include "G4RegionStore.hh" + +// NPTool header +#include "SamuraiBDC.hh" +#include "RootOutput.h" +#include "MaterialManager.hh" +#include "NPSDetectorFactory.hh" +#include "NPOptionManager.h" +#include "NPSHitsMap.hh" +// CLHEP header +#include "CLHEP/Random/RandGauss.h" + +#include "WireScorers.hh" + +#include "G4TwoVector.hh" +#include "G4ExtrudedSolid.hh" + +using namespace std; +using namespace CLHEP; + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +namespace SamuraiBDC_NS{ + // Samurai magnet construction paramethers + + //Main outer box + const double BDC_Width = 94*mm; //(x) + const double BDC_Height = 94*mm;//(y) + const double BDC_Depth = 90*mm;//(z) + const string BDC_Gas = "CH4_60_He_40"; + + const double BDC_Temperature = 298.15; // K + const double BDC_Pressure = 1.0; //atm + + //Detector Number + const short int BDC_DetectorNumber = 1; + + //Wires + const double Wire_Length = 80*mm; + const double Wire_Diameter = 4.8*mm; + const string Wire_Gas = "CH4_60_He_40"; + const double Wire_Temperature = 298.15; // K + const double Wire_Pressure = 1.0; //atm + const int Number_Of_Layer = 8; // from 0 to 7 in the xml file + const int Number_Of_Wire_By_Layer = 16; // from 0 to 15 in the xml file + const double Drift_Speed = 1.33e-4;//------> FIX ME!!! not important (yet) + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +// Samurai Specific Method +SamuraiBDC::SamuraiBDC(){ + + //Visualization attributes + m_VisBDC = new G4VisAttributes(G4Colour(1,1,0,0.5)); + //Logical volumes + m_BDC1 = NULL; + m_BDC2 = NULL; + + //Wire + m_VisWire = new G4VisAttributes(G4Colour(1.0,0,0.0,1.0)); + //Logical volumes + m_Wire = NULL; + //Scorer + m_WireScorerBDC = NULL; + + //Data event + m_Event = new TSamuraiBDCData; + + //Hexagon + m_Hexagon = NULL; + +} + +SamuraiBDC::~SamuraiBDC(){ +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void SamuraiBDC::AddDetector(G4ThreeVector Mag_Pos, G4ThreeVector Offset, unsigned int det){ + + m_position[det] = Mag_Pos + Offset; + + return; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4LogicalVolume* SamuraiBDC::BuildBDC1(){ + if(!m_BDC1){ + //Shape - G4Box + G4Box* box = new G4Box("BDC_Box",SamuraiBDC_NS::BDC_Width*0.5, + SamuraiBDC_NS::BDC_Height*0.5,SamuraiBDC_NS::BDC_Depth*0.5); + + //Material - Gas + G4Material* Gas = MaterialManager::getInstance()->GetGasFromLibrary(SamuraiBDC_NS::BDC_Gas, SamuraiBDC_NS::BDC_Pressure,SamuraiBDC_NS::BDC_Temperature); + + //Logical Volume + m_BDC1 = new G4LogicalVolume(box, Gas, "logic_SamuraiBDC_box",0,0,0); + m_BDC1->SetVisAttributes(m_VisBDC); + } + return m_BDC1; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +G4LogicalVolume* SamuraiBDC::BuildBDC2(){ + if(!m_BDC2){ + //Shape - G4Box + G4Box* box = new G4Box("BDC_Box",SamuraiBDC_NS::BDC_Width*0.5, + SamuraiBDC_NS::BDC_Height*0.5,SamuraiBDC_NS::BDC_Depth*0.5); + + //Material - Gas + G4Material* Gas = MaterialManager::getInstance()->GetGasFromLibrary(SamuraiBDC_NS::BDC_Gas, SamuraiBDC_NS::BDC_Pressure,SamuraiBDC_NS::BDC_Temperature); + + //Logical Volume + m_BDC2 = new G4LogicalVolume(box, Gas, "logic_SamuraiBDC_box",0,0,0); + m_BDC2->SetVisAttributes(m_VisBDC); + } + return m_BDC2; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +G4LogicalVolume* SamuraiBDC::BuildWire(){ +if(!m_Wire){ + //Shape - G4Tubs + G4Tubs* solidWire = new G4Tubs("BDC_Wire", 0.0, SamuraiBDC_NS::Wire_Diameter*0.5,SamuraiBDC_NS::Wire_Length*0.5, 0., 360.); + + //Material - Gas + G4Material* GasWire = MaterialManager::getInstance()->GetGasFromLibrary(SamuraiBDC_NS::Wire_Gas, SamuraiBDC_NS::Wire_Pressure,SamuraiBDC_NS::Wire_Temperature); + + //Logical Volume + m_Wire = new G4LogicalVolume(solidWire, GasWire, "logic_SamuraiWire_tub",0,0,0); + m_Wire->SetVisAttributes(m_VisWire); + m_Wire->SetSensitiveDetector(m_WireScorerBDC); + + } + return m_Wire; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +G4LogicalVolume* SamuraiBDC::BuildHexagon(){ +if(!m_Hexagon){ + //Shape + + const G4int nsect = 6; + std::vector<G4TwoVector> polygon(nsect); + G4double ang = twopi/nsect; + + G4double dz = SamuraiBDC_NS::Wire_Length*0.5; + G4double rmax = SamuraiBDC_NS::Wire_Diameter*0.5; + + for (G4int i = 0; i < nsect; ++i) + { + G4double phi = i*ang; + G4double cosphi = std::cos(phi); + G4double sinphi = std::sin(phi); + polygon[i].set(rmax*cosphi, rmax*sinphi); + } + + G4TwoVector offsetA(0,0), offsetB(0,0); + G4double scaleA = 1, scaleB = 1; + G4VSolid* solidHexagon = new G4ExtrudedSolid("Extruded", polygon, dz, offsetA, scaleA, offsetB, scaleB); + + + + //Material - Gas + G4Material* GasWire = MaterialManager::getInstance()->GetGasFromLibrary(SamuraiBDC_NS::Wire_Gas, SamuraiBDC_NS::Wire_Pressure,SamuraiBDC_NS::Wire_Temperature); + + //Logical Volume + m_Hexagon = new G4LogicalVolume(solidHexagon, GasWire, "logic_SamuraiWire_tub",0,0,0); + m_Hexagon->SetVisAttributes(m_VisWire); + m_Hexagon->SetSensitiveDetector(m_WireScorerBDC); + + } + return m_Hexagon; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +// Virtual Method of NPS::VDetector class +// Read stream at Configfile to pick-up parameters of detector (Position,...) +// (Called in DetecorConstruction::ReadDetectorConfiguration Method) +void SamuraiBDC::ReadConfiguration(NPL::InputParser parser){ + + vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("SAMURAIBDC"); + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << "//// " << blocks.size() << " BDC detector(s) found " << endl; + + vector<string> xml = {"XML","Offset", "InvertX","InvertY","InvertD"}; + + G4ThreeVector Mag_Pos; + G4ThreeVector Offset; + + for(unsigned int i = 0 ; i < blocks.size() ; i++){ + if(blocks[i]->HasTokenList(xml)) + { + cout << endl << "//// Samurai BDC (" << i+1 << ")" << endl; + unsigned int det = std::atoi(blocks[i]->GetMainValue().c_str());//1 or 2 + string xml_file = blocks[i]->GetString("XML"); + Offset = NPS::ConvertVector(blocks[i]->GetTVector3("Offset", "mm")); + bool invert_x = blocks[i]->GetInt("InvertX"); + bool invert_y = blocks[i]->GetInt("InvertY"); + bool invert_d = blocks[i]->GetInt("InvertD"); + m_offset[det] = Offset; + m_invertX[det] = invert_x; + m_invertY[det] = invert_y; + m_invertD[det] = invert_d; + ReadXML(xml_file,Offset,invert_y,invert_y,det); + AddDetector(Mag_Pos, Offset, det); + } + + else{ + cout << "ERROR: check your XML input file for BDC detector" << endl; + exit(1); + }//end exception + + } + +}//end read configuration + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//////////////////// nouveau /////////////////// +void SamuraiBDC::ReadXML(std::string xml_file,G4ThreeVector offset, bool InvertX,bool InvertY,unsigned int det){ + NPL::XmlParser xml; + xml.LoadFile(xml_file); + + std::string name = "SAMURAIBDC"+NPL::itoa(det); + std::vector<NPL::XML::block*> b = xml.GetAllBlocksWithName(name); + + int NumberOfWires=0; + for(unsigned int i = 0 ; i < b.size() ; i++){ + NumberOfWires++; + + // Wire ID in general + auto ID = b[i]->AsInt("ID"); + + // Layer Number + auto LayerNbr = b[i]->AsInt("layer"); + + // Wire direction + auto DirectionWire = b[i]->AsString("anodedir"); + //Wire id in the layer + auto WireNbr = b[i]->AsInt("wireid"); + + //Wire x or y position + auto PositionXY = b[i]->AsDouble("wirepos"); + auto PositionZ = b[i]->AsDouble("wirez"); + + if(det==1) + { + // position wire and direction wire for BDC1 + if(DirectionWire.find("Y")==std::string::npos){ // if not horizontal + m_PositionWire1[ID] = G4ThreeVector(PositionXY,0.0,PositionZ); + m_IsHorizontal1[ID] = false; + } + else { + m_PositionWire1[ID] = G4ThreeVector(0.0,PositionXY,PositionZ); + m_IsHorizontal1[ID] = true; + } + + m_LayerNbr1[ID] = LayerNbr; + m_WireNbr1[ID] = WireNbr; + }//end det==1 + + else if(det==2) + { + // position wire and direction wire for BDC2 + if(DirectionWire.find("Y")==std::string::npos){ // if not horizontal + m_PositionWire2[ID] = G4ThreeVector(PositionXY,0.0,PositionZ); + m_IsHorizontal2[ID] = false; + } + else { + m_PositionWire2[ID] = G4ThreeVector(0.0,PositionXY,PositionZ); + m_IsHorizontal2[ID] = true; + } + + m_LayerNbr2[ID] = LayerNbr; + m_WireNbr2[ID] = WireNbr; + + }//end det==2 + + } //end of for loop + cout << " -> " << NumberOfWires << " wires found for BDC" <<det << endl; + +}//end of ReadXML + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +// Construct detector and inialise sensitive part. +// (Called After DetectorConstruction::AddDetector Method) +void SamuraiBDC::ConstructDetector(G4LogicalVolume* world){ + + G4RotationMatrix* Rot = new G4RotationMatrix(); + + new G4PVPlacement(0, m_position[1], + BuildBDC1(), "SAMURAIBDC1" , world, false, 1); + + new G4PVPlacement(0, m_position[2], + BuildBDC2(), "SAMURAIBDC2" , world, false, 2); + + for(auto pos1 : m_PositionWire1){ + if(m_IsHorizontal1[pos1.first]) + { + Rot->rotateY(90.*deg); + } + else { + Rot->rotateX(90.*deg); + } + + new G4PVPlacement(G4Transform3D(*Rot,pos1.second), + BuildWire(), + "WireModule", m_BDC1,false,pos1.first); + Rot->set(0,0,0); + }// end for loop on wires BDC1 + + for(auto pos2 : m_PositionWire2){ + if(m_IsHorizontal2[pos2.first]) + { + Rot->rotateY(90.*deg); + } + else Rot->rotateX(90.*deg); + + new G4PVPlacement(G4Transform3D(*Rot,pos2.second), + BuildWire(), + "WireModule", m_BDC2 ,false,pos2.first); + Rot->set(0,0,0); + }// end for loop on wires BDC2 + + return; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +// Add Detector branch to the EventTree. +// Called After DetecorConstruction::AddDetector Method +void SamuraiBDC::InitializeRootOutput(){ + RootOutput *pAnalysis = RootOutput::getInstance(); + TTree *pTree = pAnalysis->GetTree(); + if(!pTree->FindBranch("SamuraiBDC")){ + pTree->Branch("SamuraiBDC", "TSamuraiBDCData", &m_Event) ; + } + pTree->SetBranchAddress("SamuraiBDC", &m_Event); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + +// Read sensitive part and fill the Root tree. +// (Called at in the EventAction::EndOfEventAvtion) + +void SamuraiBDC::ReadSensitive(const G4Event* event){ + + m_Event->Clear(); + //Interaction Scorer + WireScorers::PS_Wire* WireScorerBDC= (WireScorers::PS_Wire*) m_WireScorerBDC->GetPrimitive(0); + + unsigned int sizeWire =WireScorerBDC->GetMult(); + for(unsigned int i = 0 ; i < sizeWire ; i++) + { + int layer = WireScorerBDC->GetLayerNumber(i); + int wireNbr = WireScorerBDC->GetWireNumber(i); + double time = WireScorerBDC->GetTime(i); + int edge = WireScorerBDC->GetEdge(i); + double DriftLength = WireScorerBDC->GetDriftLength(i); + int DetectorNumber = WireScorerBDC->GetDetectorNumber(i); + m_Event->SetData(DetectorNumber, layer, wireNbr, DriftLength, edge); + } + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void SamuraiBDC::InitializeScorers() { + // This check is necessary in case the geometry is reloaded + bool already_exist = false; + m_WireScorerBDC = CheckScorer("WireScorerBDC",already_exist) ; + + if(already_exist) + return; + + // Otherwise the scorer is initialised + vector<int> level; level.push_back(0); + + //Wire + G4VPrimitiveScorer* InteractionWireBDC= new WireScorers::PS_Wire("WS_BDC",level, SamuraiBDC_NS::Number_Of_Layer,SamuraiBDC_NS::Number_Of_Wire_By_Layer,SamuraiBDC_NS::Drift_Speed, m_WireAngle1) ; + m_WireScorerBDC->RegisterPrimitive(InteractionWireBDC); + G4SDManager::GetSDMpointer()->AddNewDetector(m_WireScorerBDC) ; + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//////////////////////////////////////////////////////////////////////////////// +// Construct Method to be pass to the DetectorFactory // +//////////////////////////////////////////////////////////////////////////////// + +NPS::VDetector* SamuraiBDC::Construct(){ + return (NPS::VDetector*) new SamuraiBDC(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//////////////////////////////////////////////////////////////////////////////// +// Registering the construct method to the factory // +//////////////////////////////////////////////////////////////////////////////// +extern"C" { + class proxy_nps_samuraiBDC{ + public: + proxy_nps_samuraiBDC(){ + NPS::DetectorFactory::getInstance()->AddToken("SAMURAIBDC","SAMURAIBDC"); + NPS::DetectorFactory::getInstance()->AddDetector("SAMURAIBDC",SamuraiBDC::Construct); + } + }; + + proxy_nps_samuraiBDC p_nps_samuraiBDC; +} + + diff --git a/NPSimulation/Detectors/Samurai/SamuraiBDC.hh b/NPSimulation/Detectors/Samurai/SamuraiBDC.hh new file mode 100644 index 000000000..7cf02368f --- /dev/null +++ b/NPSimulation/Detectors/Samurai/SamuraiBDC.hh @@ -0,0 +1,151 @@ +#ifndef Samurai_h +#define Samurai_h 1 +/***************************************************************************** + * 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: Audrey ANNE contact address: anne@lpccaen.in2p3.fr * + * * + * Creation Date : * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * This class describe Samurai BDCs simulation * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + *****************************************************************************/ + +// C++ header +#include <string> +#include <vector> +#include <stdlib.h> +using namespace std; + +// G4 headers +#include "G4ThreeVector.hh" +#include "G4RotationMatrix.hh" +#include "G4LogicalVolume.hh" +#include "G4MultiFunctionalDetector.hh" +#include "G4VSolid.hh" + +// NPTool header +#include "NPSVDetector.hh" +#include "NPInputParser.h" +#include "NPXmlParser.h" +#include "NPCore.h" +#include "TSamuraiBDCData.h" + +class SamuraiBDC : public NPS::VDetector{ + //////////////////////////////////////////////////// + /////// Default Constructor and Destructor ///////// + //////////////////////////////////////////////////// + public: + SamuraiBDC() ; + virtual ~SamuraiBDC() ; + + //////////////////////////////////////////////////// + /////// Specific Function of this Class /////////// + //////////////////////////////////////////////////// + public: + + // Cartezian BDC + void AddDetector(G4ThreeVector Mag_Pos, G4ThreeVector Offset, unsigned int det); + void ReadXML(std::string xml_file,G4ThreeVector offset, bool InvertX,bool InvertY, unsigned int det); + + G4LogicalVolume* BuildBDC1(); + G4LogicalVolume* BuildBDC2(); + G4LogicalVolume* BuildWire(); + G4LogicalVolume* BuildHexagon(); + + private: + + //Logical Volume + + //BDC1 + std::map<unsigned int , G4ThreeVector> m_PositionWire1; + std::map<unsigned int , int> m_LayerNbr1; + std::map<unsigned int , int> m_WireNbr1; + std::map<unsigned int , bool> m_IsHorizontal1; + std::map<unsigned int , double> m_WireAngle1; + + //BDC2 + std::map<unsigned int , G4ThreeVector> m_PositionWire2; + std::map<unsigned int , int> m_LayerNbr2; + std::map<unsigned int , int> m_WireNbr2; + std::map<unsigned int , bool> m_IsHorizontal2; + std::map<unsigned int , double> m_WireAngle2; + + G4LogicalVolume* m_BDC1; + G4LogicalVolume* m_BDC2; + G4LogicalVolume* m_Wire; + + G4LogicalVolume* m_Hexagon; + + //////////////////////////////////////////////////// + ////// Inherite from NPS::VDetector class ///////// + //////////////////////////////////////////////////// + public: + // Read stream at Configfile to pick-up parameters of detector (Position,...) + // Called in DetecorConstruction::ReadDetectorConfiguration Method + void ReadConfiguration(NPL::InputParser) ; + + // Construct detector and initialise sensitive part. + // (Called After DetecorConstruction::AddDetector Method) + void ConstructDetector(G4LogicalVolume* world) ; + + // Add Detector branch to the EventTree. + // (Called After DetecorConstruction::AddDetector Method) + void InitializeRootOutput() ; + + // Read sensitive part and fill the Root tree. + // (Called at in the EventAction::EndOfEventAction) + void ReadSensitive(const G4Event* event) ; + + public: + // Scorer + // Initialize the scorer(s) used by the BDC detector + void InitializeScorers() ; + + // Associated Scorer + G4MultiFunctionalDetector* m_WireScorerBDC ; + + //////////////////////////////////////////////////// + ///////////Event class to store Data//////////////// + //////////////////////////////////////////////////// + private: + TSamuraiBDCData* m_Event; + //////////////////////////////////////////////////// + + //////////////////////////////////////////////////// + ///////////////Private intern Data////////////////// + //////////////////////////////////////////////////// + private: + //Detector coordinates + std::map<unsigned int, G4ThreeVector> m_position;//! + std::map<unsigned int, G4ThreeVector> m_offset;//! + std::map<unsigned int, bool> m_invertX;//! + std::map<unsigned int, bool> m_invertY;//! + std::map<unsigned int, bool> m_invertD;//! + + // Visualisation Attributes + G4VisAttributes* m_VisBDC; + G4VisAttributes* m_VisWire; + + // Needed for dynamic loading of the library + public: + static NPS::VDetector* Construct(); +}; +#endif + + + + + + + diff --git a/NPSimulation/Detectors/Samurai/SamuraiFDC0.cc b/NPSimulation/Detectors/Samurai/SamuraiFDC0.cc new file mode 100644 index 000000000..a2bb64c33 --- /dev/null +++ b/NPSimulation/Detectors/Samurai/SamuraiFDC0.cc @@ -0,0 +1,390 @@ +/***************************************************************************** + * 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: Audrey Anne contact address: anne@lpccaen.in2p3.fr * + * * + * Creation Date : january 2024 * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * This class describe SamuraiFDC0 simulation * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + *****************************************************************************/ + +// C++ headers +#include <sstream> +#include <cmath> +//G4 Geometry object +#include "G4Box.hh" +#include "G4Tubs.hh" + +//G4 sensitive +#include "G4SDManager.hh" +#include "G4MultiFunctionalDetector.hh" + +//G4 various object +#include "G4Material.hh" +#include "G4Transform3D.hh" +#include "G4PVPlacement.hh" +#include "G4VisAttributes.hh" +#include "G4Colour.hh" +#include "G4RegionStore.hh" + +// NPTool header +#include "SamuraiFDC0.hh" +#include "InteractionScorers.hh" +#include "RootOutput.h" +#include "MaterialManager.hh" +#include "NPSDetectorFactory.hh" +#include "NPOptionManager.h" +#include "NPSHitsMap.hh" +// CLHEP header +#include "CLHEP/Random/RandGauss.h" + +#include "WireScorers.hh" + +#include "G4TwoVector.hh" +#include "G4ExtrudedSolid.hh" + +using namespace std; +using namespace CLHEP; + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +namespace SamuraiFDC0_NS{ + + //Main outer box + // const double FDC0_Width = 160*mm; //(x) + // const double FDC0_Height = 160*mm;//(y) + // const double FDC0_Depth = 160*mm;//(z) + + const double FDC0_Width = 170*mm; //(x) + const double FDC0_Height = 170*mm;//(y) + const double FDC0_Depth = 170*mm;//(z) + + const string FDC0_Gas = "CH4_60_He_40"; + const double FDC0_Temperature = 298.15; // K + const double FDC0_Pressure = 1.0; //atm + + //Detector Number + const short int FDC0_DetectorNumber = 0; + + //Wires + const double Wire_Length = 150*mm; + const double Wire_Diameter = 5*mm; + const string Wire_Gas = "CH4_60_He_40"; + const double Wire_Temperature = 298.15; // K + const double Wire_Pressure = 1.0; //atm + + const int Number_Of_Layer = 8; // from 0 to 7 in the xml file + const int Number_Of_Wire_By_Layer = 32; // from 0 to 31 in the xml file + const double Drift_Speed = 1.33e-4; //------> FIX ME!!! not important (yet) + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +// Samurai Specific Method +SamuraiFDC0::SamuraiFDC0(){ + + //Visualization attributes + + //Main box + m_VisFDC0 = new G4VisAttributes(G4Colour(0.0,1.0,0,0.1)); + //Logical volumes + m_FDC0 = NULL; + + //Wire + m_VisWire = new G4VisAttributes(G4Colour(1.0,0,0.0,1.0)); + //Logical volumes + m_Wire = NULL; + //Scorer + m_WireScorerFDC0 = NULL; + + //Data event + m_Event = new TSamuraiFDC0Data; + + //Hexagon + m_Hexagon = NULL; +} + +SamuraiFDC0::~SamuraiFDC0(){ +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void SamuraiFDC0::AddDetector(G4ThreeVector Mag_Pos, G4ThreeVector Offset){ + + m_Pos = Mag_Pos + Offset; + + return; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +G4LogicalVolume* SamuraiFDC0::BuildFDC0(){ + if(!m_FDC0){ + //Shape - G4Box + G4Box* box = new G4Box("FDC0_Box",SamuraiFDC0_NS::FDC0_Width*0.5, + SamuraiFDC0_NS::FDC0_Height*0.5,SamuraiFDC0_NS::FDC0_Depth*0.5); + + //Material - Gas + G4Material* Gas = MaterialManager::getInstance()->GetGasFromLibrary(SamuraiFDC0_NS::FDC0_Gas, SamuraiFDC0_NS::FDC0_Pressure,SamuraiFDC0_NS::FDC0_Temperature); + + //Logical Volume + m_FDC0 = new G4LogicalVolume(box, Gas , "logic_SamuraiFDC0_box",0,0,0); + m_FDC0->SetVisAttributes(m_VisFDC0); + } + return m_FDC0; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +G4LogicalVolume* SamuraiFDC0::BuildWire(){ +if(!m_Wire){ + //Shape - G4Tubs + G4Tubs* solidWire = new G4Tubs("FDC0_Wire", 0.0, SamuraiFDC0_NS::Wire_Diameter*0.5,SamuraiFDC0_NS::Wire_Length*0.5, 0., 360.); + + //Material - Gas + G4Material* GasWire = MaterialManager::getInstance()->GetGasFromLibrary(SamuraiFDC0_NS::Wire_Gas, SamuraiFDC0_NS::Wire_Pressure,SamuraiFDC0_NS::Wire_Temperature); + //Logical Volume + m_Wire = new G4LogicalVolume(solidWire, GasWire, "logic_SamuraiWire_tub",0,0,0); + m_Wire->SetVisAttributes(m_VisWire); + m_Wire->SetSensitiveDetector(m_WireScorerFDC0); + + } + return m_Wire; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +G4LogicalVolume* SamuraiFDC0::BuildHexagon(){ +if(!m_Hexagon){ + //Shape + + const G4int nsect = 6; + std::vector<G4TwoVector> polygon(nsect); + G4double ang = twopi/nsect; + + G4double dz = SamuraiFDC0_NS::Wire_Length*0.5; + G4double rmax = SamuraiFDC0_NS::Wire_Diameter*0.5; + + for (G4int i = 0; i < nsect; ++i) + { + G4double phi = i*ang; + G4double cosphi = std::cos(phi); + G4double sinphi = std::sin(phi); + polygon[i].set(rmax*cosphi, rmax*sinphi); + } + + G4TwoVector offsetA(0,0), offsetB(0,0); + G4double scaleA = 1, scaleB = 1; + G4VSolid* solidHexagon = new G4ExtrudedSolid("Extruded", polygon, dz, offsetA, scaleA, offsetB, scaleB); + + + + //Material - Gas + G4Material* GasWire = MaterialManager::getInstance()->GetGasFromLibrary(SamuraiFDC0_NS::Wire_Gas, SamuraiFDC0_NS::Wire_Pressure,SamuraiFDC0_NS::Wire_Temperature); + + //Logical Volume + m_Hexagon = new G4LogicalVolume(solidHexagon, GasWire, "logic_SamuraiWire_tub",0,0,0); + m_Hexagon->SetVisAttributes(m_VisWire); + m_Hexagon->SetSensitiveDetector(m_WireScorerFDC0); + + } + return m_Hexagon; +} + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +// Virtual Method of NPS::VDetector class +// Read stream at Configfile to pick-up parameters of detector (Position,...) +// (Called in DetecorConstruction::ReadDetectorConfiguration Method) +void SamuraiFDC0::ReadConfiguration(NPL::InputParser parser){ + + vector<NPL::InputBlock*> blocks2 = parser.GetAllBlocksWithToken("SAMURAIFDC0"); + + if(blocks2.size()==1){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) { + cout << "/////// Samurai FDC0 found ///////" << endl; + } + + vector<string> xml = {"XML","Offset", "InvertX","InvertY","InvertD"}; + + G4ThreeVector Mag_Pos; + G4ThreeVector Offset; + + if(blocks2[0]->HasTokenList(xml)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// FDC0 XML file " << endl; + string xml_file = blocks2[0]->GetString("XML"); + Offset = NPS::ConvertVector(blocks2[0]->GetTVector3("Offset", "mm")); + bool invert_x = blocks2[0]->GetInt("InvertX"); + bool invert_y = blocks2[0]->GetInt("InvertY"); + bool invert_z = blocks2[0]->GetInt("InvertD"); + ReadXML(xml_file,Offset,invert_x,invert_y); + } + + AddDetector(Mag_Pos, Offset); + + } + else{ + cout << "ERROR for FDC0: check your input file " << endl; + exit(1); + } + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//////////////////// nouveau /////////////////// +void SamuraiFDC0::ReadXML(std::string xml_file,G4ThreeVector offset, bool InvertX,bool InvertY){ + NPL::XmlParser xml; + xml.LoadFile(xml_file); + + std::vector<NPL::XML::block*> b = xml.GetAllBlocksWithName("SAMURAIFDC0"); + int NumberOfWires=0; + for(unsigned int i = 0 ; i < b.size() ; i++){ + NumberOfWires++; + + // Wire ID in general + auto ID = b[i]->AsInt("ID"); + + // Layer Number + auto LayerNbr = b[i]->AsInt("layer"); + + // Wire direction + auto DirectionWire = b[i]->AsString("anodedir"); + //Wire id in the layer + auto WireNbr = b[i]->AsInt("wireid"); + + //Wire x or y position + auto PositionXY = b[i]->AsDouble("wirepos"); + auto PositionZ = b[i]->AsDouble("wirez"); + + // position wire and direction wire + if(DirectionWire.find("Y")==std::string::npos){ // if not horizontal + m_PositionWire[ID] = G4ThreeVector(PositionXY,0.0,PositionZ); + m_IsHorizontal[ID] = false; + } + else { // if horizontal + m_PositionWire[ID] = G4ThreeVector(0.0,PositionXY,PositionZ); + m_IsHorizontal[ID] = true; + } + + m_LayerNbr[ID] = LayerNbr; + m_WireNbr[ID] = WireNbr; + + } //end of for loop + cout << " -> " << NumberOfWires << " wires found for FDC0" << endl; + +}//end of ReadXML + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +// Construct detector and inialise sensitive part. +// (Called After DetectorConstruction::AddDetector Method) +void SamuraiFDC0::ConstructDetector(G4LogicalVolume* world){ + + G4RotationMatrix* Rot = new G4RotationMatrix(); + + new G4PVPlacement(0, m_Pos, + BuildFDC0(), "SamuraiFDC0", world, false, 0); + + for(auto pos : m_PositionWire){ //loop on FDC0 wires + + if(m_IsHorizontal[pos.first]){ + Rot->rotateY(90.*deg); + + + } + else Rot->rotateX(90.*deg); + + new G4PVPlacement(G4Transform3D(*Rot,pos.second),BuildWire(), + "WireModule",m_FDC0,false,pos.first); + Rot->set(0,0,0); + }// end for loop on wires + + return; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +// Add Detector branch to the EventTree. +// Called After DetecorConstruction::AddDetector Method +void SamuraiFDC0::InitializeRootOutput(){ + RootOutput *pAnalysis = RootOutput::getInstance(); + TTree *pTree = pAnalysis->GetTree(); + + if(!pTree->FindBranch("SamuraiFDC0")){ + pTree->Branch("SamuraiFDC0", "TSamuraiFDC0Data", &m_Event) ; + } + pTree->SetBranchAddress("SamuraiFDC0", &m_Event); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +// Read sensitive part and fill the Root tree. +// (Called at in the EventAction::EndOfEventAvtion) +void SamuraiFDC0::ReadSensitive(const G4Event* event){ + + m_Event->Clear(); + + WireScorers::PS_Wire* WireScorerFDC0= (WireScorers::PS_Wire*) m_WireScorerFDC0->GetPrimitive(0); + + unsigned int sizeWire =WireScorerFDC0->GetMult(); + for(unsigned int i = 0 ; i < sizeWire ; i++) + { + int layer = WireScorerFDC0->GetLayerNumber(i); + int wireNbr = WireScorerFDC0->GetWireNumber(i); + double time = WireScorerFDC0->GetTime(i); + int edge = WireScorerFDC0->GetEdge(i); + double DriftLength = WireScorerFDC0->GetDriftLength(i); + + m_Event->SetData(SamuraiFDC0_NS::FDC0_DetectorNumber, layer, + wireNbr, DriftLength, edge);// driftlength instead of time + } + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void SamuraiFDC0::InitializeScorers() { + // This check is necessary in case the geometry is reloaded + bool already_exist = false; + m_WireScorerFDC0 = CheckScorer("WireScorerFDC0",already_exist); + if(already_exist) + return; + + // Otherwise the scorer is initialised + vector<int> level; level.push_back(0); + //Wire + G4VPrimitiveScorer* InteractionWire= new WireScorers::PS_Wire("WS_FDC0",level, SamuraiFDC0_NS::Number_Of_Layer,SamuraiFDC0_NS::Number_Of_Wire_By_Layer,SamuraiFDC0_NS::Drift_Speed, m_WireAngle) ; + m_WireScorerFDC0->RegisterPrimitive(InteractionWire); + G4SDManager::GetSDMpointer()->AddNewDetector(m_WireScorerFDC0) ; + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//////////////////////////////////////////////////////////////////////////////// +// Construct Method to be pass to the DetectorFactory // +//////////////////////////////////////////////////////////////////////////////// +NPS::VDetector* SamuraiFDC0::Construct(){ + return (NPS::VDetector*) new SamuraiFDC0(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//////////////////////////////////////////////////////////////////////////////// +// Registering the construct method to the factory // +//////////////////////////////////////////////////////////////////////////////// +extern"C" { + class proxy_nps_samuraiFDC0{ + public: + proxy_nps_samuraiFDC0(){ + NPS::DetectorFactory::getInstance()->AddToken("SAMURAIFDC0","SAMURAIFDC0"); + NPS::DetectorFactory::getInstance()->AddDetector("SAMURAIFDC0",SamuraiFDC0::Construct); + } + }; + + proxy_nps_samuraiFDC0 p_nps_samuraiFDC0; +} + + diff --git a/NPSimulation/Detectors/Samurai/SamuraiFDC0.hh b/NPSimulation/Detectors/Samurai/SamuraiFDC0.hh new file mode 100644 index 000000000..249954b77 --- /dev/null +++ b/NPSimulation/Detectors/Samurai/SamuraiFDC0.hh @@ -0,0 +1,134 @@ +#ifndef Samurai_h +#define Samurai_h 1 +/***************************************************************************** + * 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: Audrey Anne contact address: anne@lpccaen.in2p3.fr * + * * + * Creation Date : january 2024 * + * Last update : june 2024 * + *---------------------------------------------------------------------------* + * Decription: * + * This class describe SamuraiFDC0 simulation * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + *****************************************************************************/ + +// C++ header +#include <string> +#include <vector> +using namespace std; + +// G4 headers +#include "G4ThreeVector.hh" +#include "G4RotationMatrix.hh" +#include "G4LogicalVolume.hh" +#include "G4MultiFunctionalDetector.hh" +#include "G4VSolid.hh" + +// NPTool header +#include "NPSVDetector.hh" +#include "NPInputParser.h" +#include "NPXmlParser.h" + +#include "TSamuraiFDC0Data.h" + +class SamuraiFDC0 : public NPS::VDetector{ + //////////////////////////////////////////////////// + /////// Default Constructor and Destructor ///////// + //////////////////////////////////////////////////// + public: + SamuraiFDC0() ; + virtual ~SamuraiFDC0() ; + + //////////////////////////////////////////////////// + /////// Specific Function of this Class /////////// + //////////////////////////////////////////////////// + public: + + // Cartezian FDC0 + void AddDetector(G4ThreeVector Mag_Pos, G4ThreeVector Offset); + void ReadXML(std::string xml_file,G4ThreeVector offset, bool InvertX,bool InvertY); + + G4LogicalVolume* BuildFDC0(); + G4LogicalVolume* BuildWire(); + G4LogicalVolume* BuildHexagon(); + + private: + + //Logical Volume + std::map<unsigned int , G4ThreeVector> m_PositionWire; + std::map<unsigned int , int> m_LayerNbr; + std::map<unsigned int , int> m_WireNbr; + std::map<unsigned int , double> m_WireAngle; + std::map<unsigned int , bool> m_IsHorizontal; + + G4LogicalVolume* m_FDC0; + G4LogicalVolume* m_Wire; + G4LogicalVolume* m_Hexagon; + + //////////////////////////////////////////////////// + ////// Inherite from NPS::VDetector class ///////// + //////////////////////////////////////////////////// + public: + // Read stream at Configfile to pick-up parameters of detector (Position,...) + // Called in DetecorConstruction::ReadDetectorConfiguration Method + void ReadConfiguration(NPL::InputParser) ; + + // Construct detector and initialise sensitive part. + // (Called After DetecorConstruction::AddDetector Method) + void ConstructDetector(G4LogicalVolume* world) ; + + // Add Detector branch to the EventTree. + // (Called After DetecorConstruction::AddDetector Method) + void InitializeRootOutput() ; + + // Read sensitive part and fill the Root tree. + // (Called at in the EventAction::EndOfEventAction) + void ReadSensitive(const G4Event* event) ; + + public: + // Scorer + // Initialize the scorer(s) used by the FDC0 detector + void InitializeScorers() ; + + // Associated Scorer + G4MultiFunctionalDetector* m_WireScorerFDC0; + + //////////////////////////////////////////////////// + ///////////Event class to store Data//////////////// + //////////////////////////////////////////////////// + private: + + TSamuraiFDC0Data* m_Event; + + //////////////////////////////////////////////////// + ///////////////Private intern Data////////////////// + //////////////////////////////////////////////////// + private: + //Detector coordinates + G4ThreeVector m_Pos; + + // Visualisation Attributes + G4VisAttributes* m_VisFDC0; + G4VisAttributes* m_VisWire; + + // Needed for dynamic loading of the library + public: + static NPS::VDetector* Construct(); +}; +#endif + + + + + + + diff --git a/NPSimulation/Detectors/Samurai/SamuraiFDC2.cc b/NPSimulation/Detectors/Samurai/SamuraiFDC2.cc index e403e6317..122a9eab1 100644 --- a/NPSimulation/Detectors/Samurai/SamuraiFDC2.cc +++ b/NPSimulation/Detectors/Samurai/SamuraiFDC2.cc @@ -6,13 +6,13 @@ *****************************************************************************/ /***************************************************************************** - * Original Author: Omar Nasr contact address: omar.h.nasr@outlook.com * + * Original Author: Audrey ANNE contact address: anne@lpccaen.in2p3.fr * * * - * Creation Date : septembre 2021 * - * Last update : septembre 2021 * + * Creation Date : * + * Last update : august 2024 * *---------------------------------------------------------------------------* * Decription: * - * This class describe Samurai simulation * + * This class describe SamuraiFDC2 simulation * * * *---------------------------------------------------------------------------* * Comment: * @@ -37,9 +37,12 @@ #include "G4Colour.hh" #include "G4RegionStore.hh" +#include "G4Tubs.hh" +#include "G4SubtractionSolid.hh" +#include "G4IntersectionSolid.hh" + // NPTool header #include "SamuraiFDC2.hh" -//#include "CalorimeterScorers.hh" #include "InteractionScorers.hh" #include "RootOutput.h" #include "MaterialManager.hh" @@ -49,6 +52,8 @@ // CLHEP header #include "CLHEP/Random/RandGauss.h" +#include "WireScorers.hh" + using namespace std; using namespace CLHEP; @@ -58,14 +63,29 @@ namespace SamuraiFDC2_NS{ // Samurai magnet construction paramethers //Main outer box - const double FDC2_Width = 2616*mm; //(x) - const double FDC2_Height = 1156*mm;//(y) - const double FDC2_Depth = 876*mm;//(z) - const string FDC2_Material = "G4_Galactic"; + const double FDC2_Width = 2296*mm; //(x) + const double FDC2_Height = 836*mm;//(y) + const double FDC2_Depth = 650*mm;//(z) + const string FDC2_Material_Void = "G4_Galactic"; + + const string FDC2_Gas = "CH4_60_He_40"; + const double FDC2_Temperature = 298.15; // K + const double FDC2_Pressure = 1.0; //atm //Detector Number const short int FDC2_DetectorNumber = 2; + //Wires + const double Wire_length = 3000*mm; + const double Wire_diameter = 19.99*mm; + const string Wire_Gas = "CH4_60_He_40"; + const double Wire_Temperature = 298.15; // K + const double Wire_Pressure = 1.0; //atm + + const int Number_Of_Layer = 14; // from 0 to 13 in the xml file + const int Number_Of_Wire_By_Layer = 112; // from 0 to 111 in the xml file + const double Drift_Speed = 1.33e-4; //------> FIX ME!!! not important (yet) + } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -74,14 +94,20 @@ namespace SamuraiFDC2_NS{ SamuraiFDC2::SamuraiFDC2(){ //Visualization attributes - m_VisFDC2 = new G4VisAttributes(G4Colour(1,0,1,0.5)); + m_VisFDC2 = new G4VisAttributes(G4Colour(1,0,1,0.3)); //Logical volumes m_FDC2 = NULL; + + //Wire + m_VisWire = new G4VisAttributes(G4Colour(1.0,0,0.0,0.7)); + //Logical volumes + m_Wire = NULL; //Scorer - m_FDC2Scorer = NULL; - //Ideal Data event - m_Event = new TSamuraiIdealData; + m_WireScorerFDC2 = NULL; + //Data event + m_Event = new TSamuraiFDC2Data; + } SamuraiFDC2::~SamuraiFDC2(){ @@ -94,7 +120,7 @@ void SamuraiFDC2::AddDetector(G4ThreeVector Mag_Pos, double Mag_Angle, G4ThreeVe Offset.rotateY(-(m_Angle)); m_Pos = Mag_Pos + Offset; - + return; } @@ -105,19 +131,41 @@ G4LogicalVolume* SamuraiFDC2::BuildFDC2(){ //Shape - G4Box G4Box* box = new G4Box("FDC2_Box",SamuraiFDC2_NS::FDC2_Width*0.5, SamuraiFDC2_NS::FDC2_Height*0.5,SamuraiFDC2_NS::FDC2_Depth*0.5); - - //Material - vacuum - G4Material* VacuumMaterial = MaterialManager::getInstance() - ->GetMaterialFromLibrary(SamuraiFDC2_NS::FDC2_Material); + + //Material + G4Material* Gas = MaterialManager::getInstance()->GetGasFromLibrary(SamuraiFDC2_NS::FDC2_Gas,SamuraiFDC2_NS::FDC2_Pressure, SamuraiFDC2_NS::FDC2_Temperature); //Logical Volume - m_FDC2 = new G4LogicalVolume(box, VacuumMaterial, "logic_SamuraiFDC2_box",0,0,0); + m_FDC2 = new G4LogicalVolume(box, Gas, "logic_SamuraiFDC2_box",0,0,0); m_FDC2->SetVisAttributes(m_VisFDC2); - m_FDC2->SetSensitiveDetector(m_FDC2Scorer); } return m_FDC2; } + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +G4LogicalVolume* SamuraiFDC2::BuildWire(){ +if(!m_Wire){ + + //Shape - G4Tubs + G4Tubs* solidWire = new G4Tubs("FDC2_Wire", 0.0, SamuraiFDC2_NS::Wire_diameter*0.5,SamuraiFDC2_NS::Wire_length*0.5, 0., 360.); + + + //material + G4Material* GasWire = MaterialManager::getInstance()->GetGasFromLibrary(SamuraiFDC2_NS::Wire_Gas, SamuraiFDC2_NS::Wire_Pressure,SamuraiFDC2_NS::Wire_Temperature); + + + //Logical Volume + m_Wire = new G4LogicalVolume(solidWire, GasWire, "logic_SamuraiWire_tub",0,0,0); + m_Wire->SetVisAttributes(m_VisWire); + m_Wire->SetSensitiveDetector(m_WireScorerFDC2); + + } + return m_Wire; +} + + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // Virtual Method of NPS::VDetector class @@ -129,21 +177,25 @@ void SamuraiFDC2::ReadConfiguration(NPL::InputParser parser){ vector<NPL::InputBlock*> blocks = parser.GetAllBlocksWithToken("Samurai"); vector<NPL::InputBlock*> blocks2 = parser.GetAllBlocksWithToken("SAMURAIFDC2"); + G4ThreeVector Mag_Pos; + double Mag_Angle; + G4ThreeVector Offset; + double Off_Angle; + if(blocks.size()==1 && blocks2.size()==1){ if(NPOptionManager::getInstance()->GetVerboseLevel()) { - cout << "/////// Samurai FDC2 found ///////" << endl; + cout << "/////// Samurai FDC2 found with Samurai Magnet ///////" << endl; } vector<string> cart = {"POS","ANGLE"}; vector<string> sphe = {"R","Theta","Phi","ANGLE"}; - - G4ThreeVector Mag_Pos; - double Mag_Angle; - + vector<string> xml = {"XML","Offset", "InvertX","InvertY","InvertD"}; + if(blocks[0]->HasTokenList(cart)){ Mag_Pos = NPS::ConvertVector(blocks[0]->GetTVector3("POS", "cm")); Mag_Angle = blocks[0]->GetDouble("ANGLE","deg"); } - else if(blocks[0]->HasTokenList(sphe)){ + + if(blocks[0]->HasTokenList(sphe)){ double R = blocks[0]->GetDouble("R","mm"); double Theta = blocks[0]->GetDouble("Theta","deg"); double Phi = blocks[0]->GetDouble("Phi","deg"); @@ -152,38 +204,177 @@ void SamuraiFDC2::ReadConfiguration(NPL::InputParser parser){ Mag_Pos.setPhi(Phi); Mag_Angle = blocks[0]->GetDouble("ANGLE","deg"); } - - G4ThreeVector Offset = NPS::ConvertVector(blocks2[0]->GetTVector3("Offset", "mm")); - double Off_Angle = blocks2[0]->GetDouble("OffAngle","deg"); - //string xml = blocks2[0]->GetString("XML"); - //bool invert_x = blocks2[0]->GetBool("InvertX"); - //bool invert_y = blocks2[0]->GetBool("InvertY"); - //bool invert_z = blocks2[0]->GetBool("InvertD"); - + if(blocks2[0]->HasTokenList(xml)){ + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// FDC2 XML file " << endl; + string xml_file = blocks2[0]->GetString("XML"); + Offset = NPS::ConvertVector(blocks2[0]->GetTVector3("Offset", "mm")); + Off_Angle = blocks2[0]->GetDouble("OffAngle","deg"); + bool invert_x = blocks2[0]->GetInt("InvertX"); + bool invert_y = blocks2[0]->GetInt("InvertY"); + bool invert_z = blocks2[0]->GetInt("InvertD"); + ReadXML(xml_file,Offset,invert_x,invert_y); + } + AddDetector(Mag_Pos, Mag_Angle, Offset, Off_Angle); - } + }// SamuraiFDC2 and SamuraiMagnet + + else if(blocks.size()==0 && blocks2.size()==1) + { + if(NPOptionManager::getInstance()->GetVerboseLevel()) + { + cout << "/////// Samurai FDC2 ///////" << endl; + } + + vector<string> xml = {"XML","Offset", "InvertX","InvertY","InvertD"}; + if(blocks2[0]->HasTokenList(xml)){//--------------> nouveau + if(NPOptionManager::getInstance()->GetVerboseLevel()) + cout << endl << "//// FDC2 XML file " << endl;//--------------> nouveau + string xml_file = blocks2[0]->GetString("XML");//--------------> nouveau + Offset = NPS::ConvertVector(blocks2[0]->GetTVector3("Offset", "mm"));//-----------> nouveau + Off_Angle = blocks2[0]->GetDouble("OffAngle","deg");//-----------> nouveau + bool invert_x = blocks2[0]->GetInt("InvertX");//--------------> nouveau + bool invert_y = blocks2[0]->GetInt("InvertY");//--------------> nouveau + bool invert_z = blocks2[0]->GetInt("InvertD");//--------------> nouveau + ReadXML(xml_file,Offset,invert_x,invert_y);//--------------> nouveau + } + + m_Pos = Mag_Pos + Offset; + + }//SamuraiFDC2 + + else{ cout << "ERROR: there should be only one Samurai magnet, check your input file" << endl; exit(1); } - } + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void SamuraiFDC2::ReadXML(std::string xml_file,G4ThreeVector offset, bool InvertX,bool InvertY){ + NPL::XmlParser xml; + xml.LoadFile(xml_file); + + std::vector<NPL::XML::block*> b = xml.GetAllBlocksWithName("SAMURAIFDC2"); + int NumberOfWires=0; + for(unsigned int i = 0 ; i < b.size() ; i++){ + NumberOfWires++; + + // Wire ID in general + auto WireId = b[i]->AsInt("ID"); + + // Layer Number + auto LayerNbr = b[i]->AsInt("layer"); + + // Wire direction + auto DirectionWire = b[i]->AsString("anodedir"); + //Wire id in the layer + auto WireNbr = b[i]->AsInt("wireid"); + + //Wire x or y position + auto PositionX = b[i]->AsDouble("wirepos"); + auto PositionZ = b[i]->AsDouble("wirez"); + + // position wire and direction wire + // X , U or V + m_PositionWire[WireId] = G4ThreeVector(PositionX,0.0,PositionZ); + m_IsHorizontal[WireId] = false; + + m_WireAngle[WireId] = 0.0*deg; + + if(DirectionWire.find("X")!=std::string::npos){ //X + m_WireAngle[WireId] = 0.0*deg; + } + + else if(DirectionWire.find("U")!=std::string::npos){ //U + m_WireAngle[WireId] = -30.0*deg; + } + + else if (DirectionWire.find("V")!=std::string::npos){ //V + m_WireAngle[WireId] = 30.0*deg; + } + + m_LayerNbr[WireId] = LayerNbr; + m_WireNbr[WireId] = WireNbr; + + } //end of for loop + cout << " -> " << NumberOfWires << " wires found" << endl; + +}//end of ReadXML + + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... // Construct detector and inialise sensitive part. // (Called After DetectorConstruction::AddDetector Method) void SamuraiFDC2::ConstructDetector(G4LogicalVolume* world){ + // Box G4RotationMatrix* Rot = new G4RotationMatrix(); - Rot->rotateY(m_Angle); + Rot->rotateY(m_Angle);//rotation in volume's reference frame new G4PVPlacement(Rot, m_Pos, BuildFDC2(), "SamuraiFDC2", world, false, 0); + // Wires + G4RotationMatrix* RotWire = new G4RotationMatrix();// wire's rotation at the end + RotWire->set(0,0,0); + + G4RotationMatrix* BoxRot = new G4RotationMatrix(); + BoxRot->set(0,0,0); + + + //material + G4Material* GasWire = MaterialManager::getInstance()->GetGasFromLibrary(SamuraiFDC2_NS::Wire_Gas, SamuraiFDC2_NS::Wire_Pressure,SamuraiFDC2_NS::Wire_Temperature); + + + for(auto pos : m_PositionWire){ //loop on wires + + RotWire->rotateX(-90.*deg); + RotWire->rotateZ(m_WireAngle[pos.first]); + + G4ThreeVector position = pos.second; + double X = position[0]; + double Y = position[1]; + double Z = position[2]; + + double newX, newY; + newX = X*cos(-m_WireAngle[pos.first])+Y*sin(-m_WireAngle[pos.first]); + newY = -X*sin(-m_WireAngle[pos.first]) + Y*cos(-m_WireAngle[pos.first]); + + m_PositionWire[pos.first] = G4ThreeVector(newX, newY, Z); + G4ThreeVector positionWire(newX, newY, Z); + + + ////////////////////////////////////////////////////// + G4Box* box = new G4Box("FDC2_Box",SamuraiFDC2_NS::FDC2_Width*0.5, + SamuraiFDC2_NS::FDC2_Depth*0.5,SamuraiFDC2_NS::FDC2_Height*0.5); + G4Tubs* solidWire = new G4Tubs("FDC2_Wire", 0.0, SamuraiFDC2_NS::Wire_diameter*0.5,SamuraiFDC2_NS::Wire_length*0.5, 0., 360.); + + BoxRot->rotateY(m_WireAngle[pos.first]); + + G4ThreeVector BoxPosition(-X,0, 0); + G4Transform3D TransformBox(*BoxRot, BoxPosition); + + G4VSolid* Intersection = new G4IntersectionSolid("FDC2_Wire", solidWire, box, TransformBox); + m_Wire = new G4LogicalVolume(Intersection, GasWire, "logic_SamuraiWire_tub",0,0,0); + m_Wire->SetVisAttributes(m_VisWire); + m_Wire->SetSensitiveDetector(m_WireScorerFDC2); + + // intersection + new G4PVPlacement(G4Transform3D(*RotWire, positionWire), + m_Wire, + "WireModule",m_FDC2,false,pos.first); + + RotWire->set(0,0,0); + BoxRot->set(0,0,0); + + }// end for loop on wires + return; } @@ -194,10 +385,10 @@ void SamuraiFDC2::ConstructDetector(G4LogicalVolume* world){ void SamuraiFDC2::InitializeRootOutput(){ RootOutput *pAnalysis = RootOutput::getInstance(); TTree *pTree = pAnalysis->GetTree(); - if(!pTree->FindBranch("IdealDataFDC2")){ - pTree->Branch("IdealDataFDC2", "TSamuraiIdealData", &m_Event) ; + if(!pTree->FindBranch("SamuraiFDC2")){ + pTree->Branch("SamuraiFDC2", "TSamuraiFDC2Data", &m_Event) ; } - pTree->SetBranchAddress("IdealDataFDC2", &m_Event); + pTree->SetBranchAddress("SamuraiFDC2", &m_Event); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -208,25 +399,21 @@ void SamuraiFDC2::InitializeRootOutput(){ void SamuraiFDC2::ReadSensitive(const G4Event* event){ m_Event->Clear(); - //Interaction Scorer - InteractionScorers::PS_Interactions* Scorer= (InteractionScorers::PS_Interactions*) m_FDC2Scorer->GetPrimitive(0); - - unsigned int size = Scorer->GetMult(); - for(unsigned int i = 0 ; i < size ; i++){ - //vector<unsigned int> level = Scorer->GetLevel(i); - //double Energy = RandGauss::shoot(Scorer->GetEnergy(i),SamuraiFDC2_NS::ResoEnergy); - //double Energy = Scorer->GetEnergy(i); - - double energy = Scorer->GetEnergy(i); - double brho = Scorer->GetBrho(i); - double posx = Scorer->GetPositionX(i); - double posy = Scorer->GetPositionY(i); - double posz = Scorer->GetPositionZ(i); - double mom_mag = brho*Scorer->GetCharge(i); - double theta = Scorer->GetTheta(i); - double phi = Scorer->GetPhi(i); - m_Event->SetData(SamuraiFDC2_NS::FDC2_DetectorNumber, energy, posx, posy, posz, mom_mag, theta, phi, brho); - } + + WireScorers::PS_Wire* WireScorerFDC2= (WireScorers::PS_Wire*) m_WireScorerFDC2->GetPrimitive(0); + + unsigned int sizeWire =WireScorerFDC2->GetMult(); + for(unsigned int i = 0 ; i < sizeWire ; i++) + { + int layer = WireScorerFDC2->GetLayerNumber(i); + int wireNbr = WireScorerFDC2->GetWireNumber(i); + double time = WireScorerFDC2->GetTime(i); + int edge = WireScorerFDC2->GetEdge(i); + double DriftLength = WireScorerFDC2->GetDriftLength(i); + + m_Event->SetData(SamuraiFDC2_NS::FDC2_DetectorNumber, layer, + wireNbr, DriftLength, edge); + } } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -234,17 +421,17 @@ void SamuraiFDC2::ReadSensitive(const G4Event* event){ void SamuraiFDC2::InitializeScorers() { // This check is necessary in case the geometry is reloaded bool already_exist = false; - m_FDC2Scorer = CheckScorer("FDC2Scorer",already_exist) ; + m_WireScorerFDC2 = CheckScorer("WireScorerFDC2",already_exist); if(already_exist) return ; // Otherwise the scorer is initialised vector<int> level; level.push_back(0); - //Interaction - G4VPrimitiveScorer* Interaction= new InteractionScorers::PS_Interactions("Interaction",ms_InterCoord, 0) ; - m_FDC2Scorer->RegisterPrimitive(Interaction); - G4SDManager::GetSDMpointer()->AddNewDetector(m_FDC2Scorer) ; + //Wire + G4VPrimitiveScorer* InteractionWire= new WireScorers::PS_Wire("WS_FDC2",level, SamuraiFDC2_NS::Number_Of_Layer,SamuraiFDC2_NS::Number_Of_Wire_By_Layer,SamuraiFDC2_NS::Drift_Speed, m_WireAngle) ; + m_WireScorerFDC2->RegisterPrimitive(InteractionWire); + G4SDManager::GetSDMpointer()->AddNewDetector(m_WireScorerFDC2) ; } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/NPSimulation/Detectors/Samurai/SamuraiFDC2.hh b/NPSimulation/Detectors/Samurai/SamuraiFDC2.hh index 1dc277fc1..c8cbf458b 100644 --- a/NPSimulation/Detectors/Samurai/SamuraiFDC2.hh +++ b/NPSimulation/Detectors/Samurai/SamuraiFDC2.hh @@ -8,13 +8,13 @@ *****************************************************************************/ /***************************************************************************** - * Original Author: Omar Nasr contact address: omar.h.nasr@outlook.com * +* Original Author: Audrey ANNE contact address: anne@lpccaen.in2p3.fr * * * - * Creation Date : septembre 2021 * - * Last update : septembre 2021 * + * Creation Date : * + * Last update : august 2024 * *---------------------------------------------------------------------------* * Decription: * - * This class describe Samurai simulation * + * This class describe SamuraiFDC2 simulation * * * *---------------------------------------------------------------------------* * Comment: * @@ -37,9 +37,10 @@ using namespace std; // NPTool header #include "NPSVDetector.hh" #include "NPInputParser.h" +#include "NPXmlParser.h" + +#include "TSamuraiFDC2Data.h" -//#include "SamuraiFieldPropagation.hh" -#include "TSamuraiIdealData.h" class SamuraiFDC2 : public NPS::VDetector{ @@ -57,16 +58,22 @@ class SamuraiFDC2 : public NPS::VDetector{ // Cartezian FDC2 void AddDetector(G4ThreeVector Mag_Pos, double Mag_Angle, G4ThreeVector Offset, double Off_Angle); + void ReadXML(std::string xml_file,G4ThreeVector offset, bool InvertX,bool InvertY); G4LogicalVolume* BuildFDC2(); + G4LogicalVolume* BuildWire(); + private: //Logical Volume - G4LogicalVolume* m_FDC2; - - // Visualisation Attributes - G4VisAttributes* m_VisFDC2; + std::map<unsigned int , G4ThreeVector> m_PositionWire; + std::map<unsigned int , int> m_LayerNbr; + std::map<unsigned int , int> m_WireNbr; + std::map<unsigned int , double> m_WireAngle; + std::map<unsigned int , bool> m_IsHorizontal; + G4LogicalVolume* m_FDC2; + G4LogicalVolume* m_Wire; //////////////////////////////////////////////////// ////// Inherite from NPS::VDetector class ///////// @@ -95,15 +102,16 @@ class SamuraiFDC2 : public NPS::VDetector{ // Associated Scorer - G4MultiFunctionalDetector* m_FDC2Scorer ; + G4MultiFunctionalDetector* m_WireScorerFDC2 ; + //////////////////////////////////////////////////// ///////////Event class to store Data//////////////// //////////////////////////////////////////////////// private: - //TSamuraiFDC2Data* m_Event; + TSamuraiFDC2Data* m_Event; ////////////////////////////////////////////////////////////////// - TSamuraiIdealData* m_Event; + //TSamuraiIdealData* m_Event; //////////////////////////////////////////////////// ///////////////Private intern Data////////////////// @@ -113,7 +121,11 @@ class SamuraiFDC2 : public NPS::VDetector{ G4ThreeVector m_Pos; // Angle of Rotation double m_Angle; + + // Visualisation Attributes + G4VisAttributes* m_VisFDC2; + G4VisAttributes* m_VisWire; // Needed for dynamic loading of the library public: diff --git a/NPSimulation/Detectors/Samurai/SamuraiFieldPropagation.cc b/NPSimulation/Detectors/Samurai/SamuraiFieldPropagation.cc index 6571c9964..37e6b193d 100644 --- a/NPSimulation/Detectors/Samurai/SamuraiFieldPropagation.cc +++ b/NPSimulation/Detectors/Samurai/SamuraiFieldPropagation.cc @@ -38,6 +38,7 @@ #include "G4UserLimits.hh" #include "G4SystemOfUnits.hh" #include "G4PhysicalConstants.hh" +#include "G4RunManager.hh" //nptool libraries #include "NPFunction.h" #include "NPInputParser.h" @@ -136,11 +137,18 @@ void NPS::SamuraiFieldPropagation::ReadConfiguration() { //////////////////////////////////////////////////////////////////////////////// G4bool NPS::SamuraiFieldPropagation::IsApplicable(const G4ParticleDefinition& particleType) { if (particleType.GetPDGCharge() == 0) return false; + + else if (particleType.GetParticleName() == "e-" or particleType.GetParticleName() == "e+" ) + { + return false; + } + return true; } //////////////////////////////////////////////////////////////////////////////// G4bool NPS::SamuraiFieldPropagation::ModelTrigger(const G4FastTrack& fastTrack) { + return true; } @@ -286,7 +294,7 @@ void NPS::SamuraiFieldPropagation::RungeKuttaPropagation (const G4FastTrack& fas double speed = PrimaryTrack->GetVelocity(); double charge = PrimaryTrack->GetParticleDefinition()->GetPDGCharge() / coulomb; double ConF_p = 1 / (joule * c_light / (m/s)) ; // MeV/c to kg*m/s (SI units) - + //Initially inside is false -> calculate trajectory if (!inside){ count = 2;//skip first two positions as they are the same as the current position @@ -298,14 +306,14 @@ void NPS::SamuraiFieldPropagation::RungeKuttaPropagation (const G4FastTrack& fas trajectory.clear(); trajectory = m_Map->Propagate(Brho, pos, dir); - + inside = true; } G4ThreeVector newPosition (trajectory[count].x(), trajectory[count].y(), trajectory[count].z()); //benchmark //G4ThreeVector newDir = (newPosition - localPosition).unit(); - //G4ThreeVector newMomentum = newDir * localMomentum.mag(); + //G4ThreeVector newMomentum = newDir * localMomentum.mag(); //Check if newPosition is not inside if (solid->Inside(newPosition) != kInside){ @@ -320,13 +328,18 @@ void NPS::SamuraiFieldPropagation::RungeKuttaPropagation (const G4FastTrack& fas //if(single_particle) PrintData(m_StepSize, newPosition, newMomentum, outRKsp); //else PrintData(m_StepSize, newPosition, newMomentum, outRK); //counter++; + } - + //benchmark G4ThreeVector newDir = (newPosition - localPosition).unit(); G4ThreeVector newMomentum = newDir * localMomentum.mag(); - - + + if(abs(newPosition[0]-localPosition[0])>10.0 or abs(newPosition[1]-localPosition[1])>10.0 or abs(newPosition[2]-localPosition[2])>10.0) + { + G4RunManager::GetRunManager()->AbortEvent(); + } + double time = PrimaryTrack->GetGlobalTime()+(newPosition - localPosition).mag()/speed; fastStep.ProposePrimaryTrackFinalPosition( newPosition ); diff --git a/NPSimulation/Detectors/Samurai/SamuraiFieldPropagation.hh b/NPSimulation/Detectors/Samurai/SamuraiFieldPropagation.hh index 8cfc6c13a..d959ffd17 100644 --- a/NPSimulation/Detectors/Samurai/SamuraiFieldPropagation.hh +++ b/NPSimulation/Detectors/Samurai/SamuraiFieldPropagation.hh @@ -82,8 +82,7 @@ namespace NPS{ // out << setprecision(17) << pos.x() << "\t" << pos.y() << "\t" << pos.z() << "\t"; // out << setprecision(17) << mom.x() << "\t" << mom.y() << "\t" << mom.z() << "\t"; // out << setprecision(17) << mom.getR() << "\t" << mom.getPhi() << "\t" << mom.getTheta() << endl; - //} - + //} bool m_Initialized; //field map initialized double m_StepSize; //propagation step size diff --git a/NPSimulation/EventGenerator/EventGeneratorBeam.cc b/NPSimulation/EventGenerator/EventGeneratorBeam.cc index 7421c05d6..c8c0387d3 100644 --- a/NPSimulation/EventGenerator/EventGeneratorBeam.cc +++ b/NPSimulation/EventGenerator/EventGeneratorBeam.cc @@ -99,7 +99,7 @@ void EventGeneratorBeam::GenerateEvent(G4Event* anEvent){ m_Beam->GenerateRandomEvent(InitialBeamEnergy, x0, y0, z0, Beam_thetaX, Beam_phiY); double Xdir = tan(Beam_thetaX); //tan(thetax)= px/pz double Ydir = tan(Beam_phiY); //tan(phiy)= py/pz - double Zdir = 1; // fix pz=1 arbitrarily + double Zdir = 1.0; // fix pz=1 arbitrarily G4ThreeVector BeamDir(Xdir,Ydir,Zdir); BeamDir = BeamDir.unit(); G4ThreeVector BeamPos(x0,y0,z0); diff --git a/NPSimulation/Process/BeamReaction.cc b/NPSimulation/Process/BeamReaction.cc index 7ccd9a9f1..43b6d6840 100644 --- a/NPSimulation/Process/BeamReaction.cc +++ b/NPSimulation/Process/BeamReaction.cc @@ -242,7 +242,7 @@ G4bool NPS::BeamReaction::ModelTrigger(const G4FastTrack& fastTrack) { //////////////////////////////////////////////////////////////////////////////// void NPS::BeamReaction::DoIt(const G4FastTrack& fastTrack, G4FastStep& fastStep) { - // std::cout << "DOIT" << std::endl; + //std::cout << "DO IT" << std::endl; m_shoot = false; m_length = abs(m_length); // Get the track info @@ -309,8 +309,9 @@ void NPS::BeamReaction::DoIt(const G4FastTrack& fastTrack, G4FastStep& fastStep) // Use to clean up the IonTable in case of the Ex changing at every event G4ParticleDefinition* HeavyName; - if (m_Reaction.GetUseExInGeant4()) + if (m_Reaction.GetUseExInGeant4()){ HeavyName = IonTable->GetIon(HeavyZ, HeavyA, m_Reaction.GetExcitation4() * MeV); + } else HeavyName = IonTable->GetIon(HeavyZ, HeavyA); diff --git a/NPSimulation/Process/CMakeLists.txt b/NPSimulation/Process/CMakeLists.txt index ae5e920ae..040566ef9 100644 --- a/NPSimulation/Process/CMakeLists.txt +++ b/NPSimulation/Process/CMakeLists.txt @@ -1,6 +1,8 @@ if(Geant4_VERSION_MAJOR GREATER 10) message("Compiling without IonIonElastic") + add_library(NPSProcess OBJECT ThreeBody.cc FissionDecay.cc Decay.cc BeamReaction.cc FastDriftElectron.cc PhysicsList.cc G4DriftElectron.cc G4IonizationWithDE.cc G4DriftElectronPhysics.cc G4DEAbsorption.cc G4DEAmplification.cc G4DETransport.cc menate_R.cc NeutronHPphysics.cc NeutronHPMessenger.cc) + add_definitions(-DGEANT4_11) add_definitions(-DUSE_NEUTRONHP) else() diff --git a/NPSimulation/Scorers/CMakeLists.txt b/NPSimulation/Scorers/CMakeLists.txt index e53c4bb72..be3835155 100644 --- a/NPSimulation/Scorers/CMakeLists.txt +++ b/NPSimulation/Scorers/CMakeLists.txt @@ -1,2 +1,2 @@ -add_library(NPSScorers SHARED CylinderTPCScorers.cc DriftChamberScorers.cc NPSHitsMap.hh CalorimeterScorers.cc InteractionScorers.cc DSSDScorers.cc SiliconScorers.cc PhotoDiodeScorers.cc ObsoleteGeneralScorers.cc DriftElectronScorers.cc TPCScorers.cc MDMScorer.cc NeutronDetectorScorers.cc ProcessScorers.cc PlasticBar.cc GeScorers.cc GaseousDetectorScorers.cc) +add_library(NPSScorers SHARED CylinderTPCScorers.cc DriftChamberScorers.cc NPSHitsMap.hh CalorimeterScorers.cc InteractionScorers.cc DSSDScorers.cc SiliconScorers.cc PhotoDiodeScorers.cc ObsoleteGeneralScorers.cc DriftElectronScorers.cc TPCScorers.cc MDMScorer.cc NeutronDetectorScorers.cc ProcessScorers.cc PlasticBar.cc GeScorers.cc GaseousDetectorScorers.cc WireScorers.cc) target_link_libraries(NPSScorers ${ROOT_LIBRARIES} ${Geant4_LIBRARIES} ${NPLib_LIBRARIES} -lNPInitialConditions -lNPInteractionCoordinates) diff --git a/NPSimulation/Scorers/InteractionScorers.cc b/NPSimulation/Scorers/InteractionScorers.cc index 6eddde1bb..30dedbb04 100644 --- a/NPSimulation/Scorers/InteractionScorers.cc +++ b/NPSimulation/Scorers/InteractionScorers.cc @@ -53,19 +53,25 @@ G4bool PS_Interactions::ProcessHits(G4Step* aStep, G4TouchableHistory*){ t_Mass = aStep->GetTrack()->GetDynamicParticle()->GetMass(); t_Charge = aStep->GetTrack()->GetDynamicParticle()->GetCharge(); double KineticEnergy = aStep->GetTrack()->GetDynamicParticle()->GetKineticEnergy(); + if (t_Charge > 0) { t_Brho = sqrt(KineticEnergy * KineticEnergy + 2 * KineticEnergy * t_Mass) / (c_light * t_Charge); + } + + else { + t_Brho = NAN; + } // add it to check the theta of momentum // MOMENT = aStep->GetPreStepPoint()->GetMomentumDirection(); vector<InteractionData>::iterator it; it = m_DataVector.find(t_Index); - if(it!=m_DataVector.end()) + if(it!=m_DataVector.end()){ it->Add(t_Energy); + } else { m_DataVector.Set(t_Index,t_Energy,t_Time,t_Position.x(),t_Position.y(),t_Position.z(), /*MOMENT*/ t_Position.theta(),t_Position.phi(), t_ParticleName, t_A, t_Z, t_Mass, t_Charge, t_Brho); - } return TRUE; diff --git a/NPSimulation/Scorers/PlasticBar.cc b/NPSimulation/Scorers/PlasticBar.cc index 1ea8e9ad5..f545d9379 100644 --- a/NPSimulation/Scorers/PlasticBar.cc +++ b/NPSimulation/Scorers/PlasticBar.cc @@ -97,7 +97,8 @@ PS_PlasticBar::PS_PlasticBar(G4String name, vector<G4int> NestingLevel, G4int de m_NestingLevel = NestingLevel; auto tree = RootOutput::getInstance()->GetTree(); tree->Branch("PlasticBar_Time", &t_Time); - tree->Branch("PlasticBar_Position", &t_Position); + tree->Branch("PlasticBar_PositionX", &t_PositionX); + tree->Branch("PlasticBar_PositionY", &t_PositionY); tree->Branch("PlasticBar_TotalEnergy_by_Z", &t_TotalEnergy_by_Z); tree->Branch("PlasticBar_TotalLight_by_Z", &t_TotalLight_by_Z); t_TotalEnergy_by_Z = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; @@ -127,7 +128,8 @@ G4bool PS_PlasticBar::ProcessHits(G4Step* aStep, G4TouchableHistory*) { if (particlename != "neutron" && Z < 7) { t_Energy = aStep->GetTotalEnergyDeposit(); t_Time = aStep->GetPostStepPoint()->GetGlobalTime(); - t_Position = aStep->GetPostStepPoint()->GetPosition()[1]; + t_PositionX = aStep->GetPostStepPoint()->GetPosition()[0]; + t_PositionY = aStep->GetPostStepPoint()->GetPosition()[1]; t_Level.clear(); for (unsigned int i = 0; i < mysize; i++) { @@ -140,7 +142,8 @@ G4bool PS_PlasticBar::ProcessHits(G4Step* aStep, G4TouchableHistory*) { it = m_Data.find(PlasticBarData::CalculateIndex(t_Level)); if (it == m_Data.end()) { - m_Data.Set(0.0, 0.0, t_Position, t_Time, t_Level); + m_Data.Set(0.0, 0.0, t_PositionY, t_Time, t_Level, t_PositionX); + AddEntry(); // Adds null entry to t_Energy_by_ChargeNumber auto lastEnergyEntry = t_Energy_by_ChargeNumber.end() - 1; // iterator (*lastEnergyEntry)[Z] += t_Energy; @@ -163,7 +166,7 @@ G4bool PS_PlasticBar::ProcessHits(G4Step* aStep, G4TouchableHistory*) { // now, if the next interaction is a Transportation, and there is an energy deposition, it means that we are // observing the last step. To avoid having all the positions on the exit of the bar, lets consider the // PreStepPosition instead. - } + } //end "if process transportation" return TRUE; } diff --git a/NPSimulation/Scorers/PlasticBar.hh b/NPSimulation/Scorers/PlasticBar.hh index 691743be1..d931fd3f5 100644 --- a/NPSimulation/Scorers/PlasticBar.hh +++ b/NPSimulation/Scorers/PlasticBar.hh @@ -36,14 +36,16 @@ namespace PlasticBar { // Hold One hit info class PlasticBarData { - public: - PlasticBarData(const double& Energy, const double& Light, const double& Position, const double& Time, - const std::vector<unsigned int>& Nesting) { + public: + PlasticBarData(const double& Energy, const double& Light, const double& PositionY, const double& Time, + const std::vector<unsigned int>& Nesting, const double& PositionX) + { m_Index = CalculateIndex(Nesting); m_Level = Nesting; m_Energy = Energy; m_Light = Light; - m_Position = Position; + m_PositionX = PositionX; + m_PositionY = PositionY; m_Time = Time; }; ~PlasticBarData(){}; @@ -53,7 +55,8 @@ namespace PlasticBar { std::vector<unsigned int> m_Level; double m_Energy; double m_Light; - double m_Position; + double m_PositionX; + double m_PositionY; double m_Time; public: @@ -64,7 +67,8 @@ namespace PlasticBar { inline std::vector<unsigned int> GetLevel() const { return m_Level; }; inline double GetEnergy() const { return m_Energy; }; inline double GetLight() const { return m_Light; }; - inline double GetPosition() const { return m_Position; }; + inline double GetPositionX() const {return m_PositionX; }; + inline double GetPositionY() const { return m_PositionY; }; inline double GetTime() const { return m_Time; }; public: @@ -89,10 +93,11 @@ namespace PlasticBar { inline unsigned int size() { return m_Data.size(); }; PlasticBarData* operator[](const unsigned int& i) { return &m_Data[i]; }; - inline void Set(const double& Energy, const double& Light, const double& Position, const double& Time, - const std::vector<unsigned int>& Nesting) { - m_Data.push_back(PlasticBarData(Energy, Light, Position, Time, Nesting)); + inline void Set(const double& Energy, const double& Light, const double& PositionY, const double& Time, + const std::vector<unsigned int>& Nesting, const double& PositionX) { + m_Data.push_back(PlasticBarData(Energy, Light, PositionY, Time, Nesting, PositionX)); }; + }; //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... @@ -137,7 +142,8 @@ namespace PlasticBar { private: double t_Energy; double t_Light; - double t_Position; + double t_PositionX; + double t_PositionY; double t_Time; std::vector<unsigned int> t_Level; @@ -158,9 +164,11 @@ namespace PlasticBar { inline unsigned int GetMult() { return m_Data.size(); }; inline double GetEnergy(const unsigned int& i) { return m_Data[i]->GetEnergy(); }; inline double GetLight(const unsigned int& i) { return m_Data[i]->GetLight(); }; - inline double GetPosition(const unsigned int& i) { return m_Data[i]->GetPosition(); }; + inline double GetPositionX(const unsigned int& i) { return m_Data[i]->GetPositionX(); }; + inline double GetPositionY(const unsigned int& i) { return m_Data[i]->GetPositionY(); }; inline double GetTime(const unsigned int& i) { return m_Data[i]->GetTime(); }; inline std::vector<unsigned int> GetLevel(const unsigned int& i) { return m_Data[i]->GetLevel(); }; + }; } // namespace PlasticBar diff --git a/NPSimulation/Scorers/WireScorers.cc b/NPSimulation/Scorers/WireScorers.cc new file mode 100644 index 000000000..bd0cf5a3d --- /dev/null +++ b/NPSimulation/Scorers/WireScorers.cc @@ -0,0 +1,183 @@ +/***************************************************************************** + * Copyright (C) 2009-2016 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: Audrey ANNE contact address: anne@lpccaen.in2p3.fr * + * * + * Creation Date : July 2024 * + * Last update : January 2025 * + *---------------------------------------------------------------------------* + * Decription: * + * Scorer for wires in gas detector * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + * * + *****************************************************************************/ +#include "WireScorers.hh" +#include "G4SteppingManager.hh" +#include "G4UnitsTable.hh" +#include "RootOutput.h" +#include "TMath.h" + +#include "TVector3.h" +using namespace WireScorers; +using namespace std; + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +unsigned int WireData::CalculateIndex(const vector<unsigned int>& level) { + + unsigned int size = level.size(); + unsigned int result = 0; + unsigned int multiplier = 1; + for (unsigned int i = 0; i < size; i++) { + result += level[i] * multiplier; + multiplier *= 1000; + } + return result; +} + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +vector<WireData>::iterator WireDataVector::find(const unsigned int& index) { + for (vector<WireData>::iterator it = m_Data.begin(); it != m_Data.end(); it++) { + if ((*it).GetIndex() == index) + return it; + } + return m_Data.end(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +PS_Wire::PS_Wire(G4String name, vector<G4int> NestingLevel, G4int TotalNumberLayer, G4int NumberWireByLayer, G4double DriftSpeed,std::map<unsigned int , double> map_WireAngle, G4int depth) : G4VPrimitiveScorer(name, depth) { + m_NestingLevel = NestingLevel; + m_TotalNumberLayer = TotalNumberLayer; + m_NumberWireByLayer = NumberWireByLayer; + m_DriftSpeed = DriftSpeed; + m_WireAngle = map_WireAngle; + + auto tree = RootOutput::getInstance()->GetTree(); + // tree->Branch("Layer_Number", &t_LayerNumber); + // tree->Branch("Wire_Number", &t_WireNumber); + // tree->Branch("Wire_Time", &t_Time); + // tree->Branch("Edge", &t_Edge); + + G4String PosInWireX = name + "_PosInWireX"; + G4String PosInWireY = name + "_PosInWireY"; + G4String PosInWireZ = name + "_PosInWireZ"; + + tree->Branch(PosInWireX, &t_PosInWireX); + tree->Branch(PosInWireY, &t_PosInWireY); + tree->Branch(PosInWireZ, &t_PosInWireZ); + +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +PS_Wire::~PS_Wire() {} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +G4bool PS_Wire::ProcessHits(G4Step* aStep, G4TouchableHistory*) { + + // Contain information as many copy number as nested volume + unsigned int mysize = m_NestingLevel.size(); + + G4String particlename = aStep->GetTrack()->GetParticleDefinition()->GetParticleName(); + + //Solid information + static G4VSolid* solid; + solid = aStep->GetTrack()->GetTouchable()->GetSolid(); + + G4ThreeVector WirePosition = aStep->GetTrack()->GetTouchable()->GetTranslation(); //wire's center position + //cout << solid->GetName() << " WirePos X = " << WirePosition[0] << " WirePos Y = " << WirePosition[1] << " WirePos Z = " << WirePosition[2] << endl; + const G4RotationMatrix* WireRotation = aStep->GetTrack()->GetTouchable()->GetRotation(); + + // we only keep information about charged particles + if (particlename != "neutron") { + + //Detector number and Wire copy number + t_DetectorNumber = aStep->GetTrack()->GetTouchable()->GetCopyNumber(1); //Wires are contained in a box + int CopyNbr; + CopyNbr = aStep->GetTrack()->GetTouchable()->GetCopyNumber(0); + t_WireNumber = (CopyNbr-1)%m_NumberWireByLayer; //-1 because copynbr is the ID contained in the xml file and ID begins at 1. + t_LayerNumber = (floor((CopyNbr-1)/m_NumberWireByLayer)); + + //cout << "solid name = " << solid->GetName() << " particle name = " << particlename << " Copy number = " << CopyNbr << " layer number = " << t_LayerNumber << " wire number = " << t_WireNumber << endl; + + t_Level.clear(); + + G4ThreeVector PrePosWire = aStep->GetPreStepPoint()->GetPosition(); //lab position when particle enters the cylinder + G4ThreeVector PostPosWire = aStep->GetPostStepPoint()->GetPosition(); //lab position when particle exists the cylinder + + G4ThreeVector InOutDir = PostPosWire - PrePosWire; //particle's direction vector + G4ThreeVector PointC = PrePosWire + 0.5*InOutDir; //closest point to the cylinder center on the particle's path + + //cout << " presposwire = " << PrePosWire << " postposwire = " << PostPosWire << " PointC = "<< PointC << endl; + + t_PosInWireX.push_back(PointC[0]); //leading egde + t_PosInWireX.push_back(-10000); // trailing edge + + t_PosInWireY.push_back(PointC[1]); + t_PosInWireY.push_back(-10000); + + t_PosInWireZ.push_back(PointC[2]); + t_PosInWireZ.push_back(-10000); + + G4ThreeVector DirectionWireZ; // wire direction vector z' in the lab x,y,z vectors basis + DirectionWireZ = WireRotation->rowZ(); + + G4ThreeVector PointA = WirePosition; // first point on the symmetry axis of the cylinder + G4ThreeVector PointB = WirePosition + DirectionWireZ; // second point on the symmetry axis of the cylinder + + //cout << " CenterPointWire = " << PointA << " CenterPointWire + shift = " << PointB << endl; + + G4ThreeVector AB = PointB - PointA; + G4ThreeVector AC = PointC - PointA; + + G4ThreeVector CrossABAC = AB.cross(AC); + G4double MagCrossABAC = CrossABAC.mag(); + G4double MagAB = AB.mag(); + + G4double CD = MagCrossABAC/MagAB; // DriftLength + t_DrifLength = CD; + + + t_Time = (t_DrifLength/m) / (m_DriftSpeed*299792458);///!!!NEEDS TO BE FIXED BEFORE USE!!!/// + + for (unsigned int i = 0; i < mysize; i++) { + t_Level.push_back(aStep->GetPostStepPoint()->GetTouchableHandle()->GetCopyNumber(m_NestingLevel[i])); + } + + m_Data.Set(t_Time*1e9 , t_Level, t_LayerNumber, t_WireNumber,1, t_DrifLength, t_DetectorNumber); // leading egde + m_Data.Set((t_Time+(t_Time/10))*1e9 , t_Level, t_LayerNumber, t_WireNumber,0, t_DrifLength+(t_DrifLength*100), t_DetectorNumber);// trailing edge + + } + + return TRUE; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void PS_Wire::Initialize(G4HCofThisEvent*) { clear();} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void PS_Wire::EndOfEvent(G4HCofThisEvent*) {} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void PS_Wire::clear() { + m_Data.clear(); + t_Level.clear(); + + t_PosInWireX.clear(); + t_PosInWireY.clear(); + t_PosInWireZ.clear(); +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void PS_Wire::DrawAll() {} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void PS_Wire::PrintAll() {} +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/NPSimulation/Scorers/WireScorers.hh b/NPSimulation/Scorers/WireScorers.hh new file mode 100644 index 000000000..63cf4aba3 --- /dev/null +++ b/NPSimulation/Scorers/WireScorers.hh @@ -0,0 +1,170 @@ +#ifndef WireScorer_h +#define WireScorer_h 1 +/***************************************************************************** + * Copyright (C) 2009-2016 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: Audrey ANNE contact address: anne@lpccaen.in2p3.fr * + * * + * Creation Date : July 2024 * + * Last update : January 2025 * + *---------------------------------------------------------------------------* + * Decription: * + * * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + *****************************************************************************/ +#include "G4VPrimitiveScorer.hh" +#include "NPSHitsMap.hh" +// #include "NPSecondaries.hh" + +#include <array> +#include <map> +using namespace CLHEP; + +namespace WireScorers { + + + ///////////////////////////////////////////////////////////////////// + //////////////////////// class WireData //////////////////////// + ///////////////////////////////////////////////////////////////////// + // Hold One hit info + class WireData { + public: + WireData(const double& Time, const std::vector<unsigned int>& Nesting, const unsigned int& LayerNumber, const unsigned int& WireNumber, const unsigned int& Edge, const double& DriftLength, const int& DetectorNumber) + { + m_Index = CalculateIndex(Nesting); + m_Level = Nesting; + m_Time = Time; + m_LayerNumber = LayerNumber; + m_WireNumber = WireNumber; + m_Edge = Edge; + m_DriftLength = DriftLength; + m_DetectorNumber = DetectorNumber; + }; + ~WireData(){}; + + private: + unsigned int m_Index; + std::vector<unsigned int> m_Level; + double m_PositionX; + double m_Time; + unsigned int m_LayerNumber; + unsigned int m_WireNumber; + unsigned int m_Edge; + double m_DriftLength; + int m_DetectorNumber; + + public: + static unsigned int CalculateIndex(const std::vector<unsigned int>& Nesting); + + public: + inline unsigned int GetIndex() const { return m_Index; }; + inline std::vector<unsigned int> GetLevel() const { return m_Level; }; + inline double GetTime() const { return m_Time; }; + inline unsigned int GetLayerNumber() const { return m_LayerNumber; }; + inline unsigned int GetWireNumber() const { return m_WireNumber; }; + inline unsigned int GetEdge() const { return m_Edge; }; + inline double GetDriftLength() const { return m_DriftLength; }; + inline unsigned int GetDetectorNumber() const {return m_DetectorNumber; }; + + }; + + ///////////////////////////////////////////////////////////////////// + //////////////////////// class WireDataVector//////////////////////// + ///////////////////////////////////////////////////////////////////// + + // Manage a vector of Wire hit + class WireDataVector { + public: + WireDataVector(){}; + ~WireDataVector(){}; + + private: + std::vector<WireData> m_Data; + + public: + std::vector<WireData>::iterator find(const unsigned int& index); + inline void clear() { m_Data.clear(); }; + inline std::vector<WireData>::iterator end() { return m_Data.end(); }; + inline std::vector<WireData>::iterator begin() { return m_Data.begin(); }; + inline unsigned int size() { return m_Data.size(); }; + WireData* operator[](const unsigned int& i) { return &m_Data[i]; }; + + inline void Set(const double& Time,const std::vector<unsigned int>& Nesting, const unsigned int& LayerNumber, const unsigned int& WireNumber, const unsigned int& Edge, const double& DriftLength, const unsigned int& DetectorNumber) { + m_Data.push_back(WireData(Time, Nesting, LayerNumber, WireNumber, Edge, DriftLength, DetectorNumber)); + }; + + }; + + ////////////////////////////////////////////////////// + //////////////// class PS_Wire /////////////////////// + ////////////////////////////////////////////////////// + + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + class PS_Wire : public G4VPrimitiveScorer { + + public: // with description + PS_Wire(G4String name, std::vector<G4int> NestingLevel, G4int TotalNumberLayer, G4int NumberWireByLayer, G4double DriftSpeed, std::map<unsigned int , double> map_WireAngle, G4int depth = 0 ); + ~PS_Wire(); + + protected: // with description + G4bool ProcessHits(G4Step*, G4TouchableHistory*); + + public: + void Initialize(G4HCofThisEvent*); + void EndOfEvent(G4HCofThisEvent*); + void clear(); + void DrawAll(); + void PrintAll(); + + private: + // How much level of volume nesting should be considered + // Give the list of the nesting level at which the copy number should be return. + // 0 is the lowest level possible (the actual volume copy number in which the interaction happen) + std::vector<G4int> m_NestingLevel; + G4int m_TotalNumberLayer; + G4int m_NumberWireByLayer; + G4double m_DriftSpeed; + std::map<unsigned int , double> m_WireAngle; + + private: + WireDataVector m_Data; + + private: + double t_Time; + std::vector<unsigned int> t_Level; + unsigned int t_LayerNumber; + unsigned int t_WireNumber; + unsigned int t_Edge; + double t_DrifLength; + unsigned int t_DetectorNumber; + + std::vector<double> t_PosInWireX; + std::vector<double> t_PosInWireY; + std::vector<double> t_PosInWireZ; + + public: + inline unsigned int GetMult() { return m_Data.size(); }; + inline double GetTime(const unsigned int& i) { return m_Data[i]->GetTime(); }; + inline std::vector<unsigned int> GetLevel(const unsigned int& i) { return m_Data[i]->GetLevel(); }; + + inline unsigned int GetLayerNumber (const unsigned int& i) {return m_Data[i]->GetLayerNumber(); }; + inline unsigned int GetWireNumber(const unsigned int& i) { return m_Data[i]->GetWireNumber(); }; + inline unsigned int GetEdge(const unsigned int& i) { return m_Data[i]->GetEdge(); }; + + inline double GetDriftLength(const unsigned int& i ) {return m_Data[i]->GetDriftLength();}; + + inline double GetDetectorNumber(const unsigned int& i) {return m_Data[i]->GetDetectorNumber();}; + }; + + +} // namespace Wire + +#endif diff --git a/NPSimulation/ressources/macro/vis.mac.in b/NPSimulation/ressources/macro/vis.mac.in index 37862e2d4..1063d15b7 100644 --- a/NPSimulation/ressources/macro/vis.mac.in +++ b/NPSimulation/ressources/macro/vis.mac.in @@ -52,10 +52,6 @@ /vis/modeling/trajectories/DrawByParentID/Decay4/setLineColourRGBA 1 1 1 1 - - -/vis/modeling/trajectories/select DrawByParentID - # To superimpose all of the events from a given run: /vis/scene/endOfEventAction accumulate 10 diff --git a/Projects/Dali/DaliMinos.detector b/Projects/Dali/DaliMinos.detector index e25d6ed3a..50e417dc6 100755 --- a/Projects/Dali/DaliMinos.detector +++ b/Projects/Dali/DaliMinos.detector @@ -1,9 +1,15 @@ Minos - POS= 0 0 0 mm + Position= 0 0 0 mm TargetLength= 152.76 mm TargetMaterial= LH2 CellMaterial= Mylar TPCOnly= 0 + TargetZOffset= 0 mm + TimeBin= 30 ns + ShapingTime= 333.9 ns + Baseline= 250 + Sampling= 10 + ZOffset= 0 mm XML= /Users/matta/mrdc/xml/s034/MINOS.xml %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Dali diff --git a/Projects/Minos/Analysis.cxx b/Projects/Minos/Analysis.cxx index 07ed88ffd..c64f59517 100644 --- a/Projects/Minos/Analysis.cxx +++ b/Projects/Minos/Analysis.cxx @@ -33,7 +33,7 @@ Analysis::~Analysis(){ //////////////////////////////////////////////////////////////////////////////// void Analysis::Init(){ - Minos= (TMinosPhysicsPhysics*) m_DetectorManager->GetDetector("Minos"); + Minos= (TMinosPhysics*) m_DetectorManager->GetDetector("Minos"); } //////////////////////////////////////////////////////////////////////////////// diff --git a/Projects/Minos/Minos.detector b/Projects/Minos/Minos.detector index f0e602acc..4ba27ea85 100644 --- a/Projects/Minos/Minos.detector +++ b/Projects/Minos/Minos.detector @@ -18,7 +18,7 @@ Minos ShapingTime= 333.9 ns BaseLine= 250 Sampling= 10 - ZOffset= 0 mm + ZOffset= -4000 mm TargetZOffset= 0 mm ZRotation= 0 mm XML= ../S034/db/MINOS.xml diff --git a/Projects/Nebula/Analysis.cxx b/Projects/Nebula/Analysis.cxx index a6aafa1a0..05dec2bf9 100644 --- a/Projects/Nebula/Analysis.cxx +++ b/Projects/Nebula/Analysis.cxx @@ -24,6 +24,12 @@ using namespace std; #include"Analysis.h" #include"NPAnalysisFactory.h" #include"NPDetectorManager.h" +#include "NPOptionManager.h" + + + + + //////////////////////////////////////////////////////////////////////////////// Analysis::Analysis(){ } @@ -33,22 +39,65 @@ Analysis::~Analysis(){ //////////////////////////////////////////////////////////////////////////////// void Analysis::Init(){ + bool simulation = false; + if(NPOptionManager::getInstance()->HasDefinition("simulation")) + { + cout << "Considering input data as simulation" << endl; + simulation=true; + } + Nebula= (TNebulaPhysics*) m_DetectorManager->GetDetector("NEBULA"); + + n =NPL::Particle("neutron"); + mn = n.Mass(); + + InitOutputBranch(); } //////////////////////////////////////////////////////////////////////////////// void Analysis::TreatEvent(){ + Clear(); + + if(Nebula->Charge.size()>0 && !Nebula->HasVeto()){ + // Index of first neutron hit + unsigned int first = Nebula->GetFirstHit(); + TVector3 Pfirst = (Nebula->GetPos(first)); + double L = Pfirst.Mag(); + Tn_n = Nebula->TOF[first]; + Beta_n = (L/Tn_n)/NPUNITS::c_light; + Gamma_n = 1.0/(sqrt(1.0-(Beta_n*Beta_n))); + Etot_n = Gamma_n * mn; + Ec_n = (Gamma_n -1.0)*mn; + } + } //////////////////////////////////////////////////////////////////////////////// void Analysis::End(){ + +} + +//////////////////////////////////////////////////////////////////////////////// +void Analysis::Clear(){ + Beta_n= -1000; + Tn_n=-1000; + Gamma_n =-1000; + Etot_n = -1000; + Ec_n= -1000; } + +void Analysis::InitOutputBranch() { + RootOutput::getInstance()->GetTree()->Branch("Beta_n",&Beta_n); + RootOutput::getInstance()->GetTree()->Branch("Ec_n",&Ec_n); +} + //////////////////////////////////////////////////////////////////////////////// // Construct Method to be pass to the DetectorFactory // //////////////////////////////////////////////////////////////////////////////// NPL::VAnalysis* Analysis::Construct(){ + return (NPL::VAnalysis*) new Analysis(); } diff --git a/Projects/Nebula/Analysis.h b/Projects/Nebula/Analysis.h index c9c09f4aa..db0f10493 100644 --- a/Projects/Nebula/Analysis.h +++ b/Projects/Nebula/Analysis.h @@ -23,6 +23,12 @@ #include"NPVAnalysis.h" #include"TNebulaPhysics.h" +#include"NPEnergyLoss.h" +#include "NPParticle.h" + +#include "TH1F.h" +#include "TFile.h" + class Analysis: public NPL::VAnalysis{ public: Analysis(); @@ -33,10 +39,25 @@ class Analysis: public NPL::VAnalysis{ void TreatEvent(); void End(); - static NPL::VAnalysis* Construct(); + void InitOutputBranch(); + static NPL::VAnalysis* Construct(); private: TNebulaPhysics* Nebula; + private: // output variable + double Tn_n; + double Beta_n; + double Gamma_n; + double Etot_n; + double Ec_n; + + private: // Energy loss table + NPL::Particle n; + double mn ; + + public: + void Clear(); + }; #endif diff --git a/Projects/Nebula/Nebula.detector b/Projects/Nebula/Nebula.detector index e81c5eb01..eec64a761 100644 --- a/Projects/Nebula/Nebula.detector +++ b/Projects/Nebula/Nebula.detector @@ -1,10 +1,11 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Target - THICKNESS= 0.49 cm - RADIUS= 28 mm - MATERIAL= Vacuum +%Target + THICKNESS= 0.01 cm + %RADIUS= 28 mm + RADIUS= 200 mm + MATERIAL= Vacuum ANGLE= 0 deg - X= 3.5 cm + X= 0 cm Y= 0 mm Z= 0 mm %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -16,34 +17,73 @@ NEBULA InvertX= 0 InvertY= 0 -% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %Samurai -% POS= 0 0 0 mm -% ANGLE= 30 deg + POS= 0 0 3900 mm + ANGLE= 30 deg % % -% METHOD= 1 + METHOD= 0 % % 0=RungeKutta, 1=EliaOmar -% FIELDMAP=3T.table.bin + FIELDMAP= 3T.table.bin % %fieldmap/3T.table.bin % % fieldmap path -% STEPS_PER_METER= 1000 + STEPS_PER_METER= 1000 + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %SAMURAIFDC1 -% %XML= db/SAMURAIFDC0_20200109.xml -% %Offset= -0.00666226 0.102191 -3370.01 mm + XML= db/SAMURAIFDC0_20200109.xml + Offset= -0.00666226 0.102191 -3370.01 mm % Offset= -0.00666226 0.102191 -4370.01 mm -% %InvertX= 1 -% %InvertY= 0 -% %InvertD= 1 -% + InvertX= 1 + InvertY= 0 + InvertD= 1 + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%SAMURAIFDC2 -% %XML= db/SAMURAIFDC2.xml -% Offset= 1000 200 5000 mm -% OffAngle= 59.930 deg -% %-252.416 -0.228477 4122.57 mm -% %InvertX= 0 -% %InvertY= 1 -% %InvertD= 1 +%SAMURAIFDC1 +% Offset= -0.00666226 0.102191 -4370.01 mm +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%SAMURAIFDC2 + % XML= db/SAMURAIFDC2.xml + % Offset= 1000 200 5000 mm + Offset= -252.416 -0.228477 7000.57 mm + OffAngle= 59.930 deg + InvertX= 0 + InvertY= 1 + InvertD= 1 +%SAMURAIFDC0 + % XML= db/SAMURAIFDC0_20200109.xml + %POS= 0 0 1000 mm + %Offset= -0.00666226 0.102191 -4000.01 mm + Offset= -0.00666226 0.102191 -4370.01 mm + %Offset= -252.416 -0.228477 5000.57 mm + %OffAngle= 59.930 deg + InvertX= 1 + InvertY= 0 + InvertD= 1 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%NEULAND + XML= db/NEULAND.xml + Offset= 0 0 0 mm + InvertX= 0 + InvertY= 0 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%Minos + %Position= 0.345399 1.02061 -4656.63 mm + Position= 0 0 0 mm + ZRotation= 40.6 deg + TargetLength= 151.72 mm + TargetZOffset= 0 mm + ZOffset= 0 mm + TargetMaterial= LH2 + CellMaterial= Mylar + TPCOnly= 0 + TimeBin= 30 ns + ShapingTime= 333.9 ns + Baseline= 250 + Sampling= 10 + XML= db/MINOS.xml diff --git a/Projects/Nebula/db/NEBULA.xml b/Projects/Nebula/db/NEBULA.xml index b7c0c6677..84329e270 100755 --- a/Projects/Nebula/db/NEBULA.xml +++ b/Projects/Nebula/db/NEBULA.xml @@ -4264,7 +4264,7 @@ <SubLayer>0</SubLayer> <PosX>-1522</PosX> <PosY>0</PosY> -<PosZ>15004.8</PosZ> +<PosZ>15024.8</PosZ> <TUCal>0.0676695</TUCal> <TUOff>0</TUOff> <TUSlw>40</TUSlw> @@ -4328,7 +4328,7 @@ <SubLayer>0</SubLayer> <PosX>-902</PosX> <PosY>0</PosY> -<PosZ>15004.8</PosZ> +<PosZ>15024.8</PosZ> <TUCal>0.0682021</TUCal> <TUOff>0</TUOff> <TUSlw>40</TUSlw> @@ -4392,7 +4392,7 @@ <SubLayer>0</SubLayer> <PosX>-282</PosX> <PosY>0</PosY> -<PosZ>15004.8</PosZ> +<PosZ>15024.8</PosZ> <TUCal>0.0679071</TUCal> <TUOff>0</TUOff> <TUSlw>40</TUSlw> @@ -4456,7 +4456,7 @@ <SubLayer>0</SubLayer> <PosX>338</PosX> <PosY>0</PosY> -<PosZ>15004.8</PosZ> +<PosZ>15024.8</PosZ> <TUCal>0.0676573</TUCal> <TUOff>0</TUOff> <TUSlw>40</TUSlw> @@ -4520,7 +4520,7 @@ <SubLayer>0</SubLayer> <PosX>958</PosX> <PosY>0</PosY> -<PosZ>15004.8</PosZ> +<PosZ>15024.8</PosZ> <TUCal>0.0686263</TUCal> <TUOff>0</TUOff> <TUSlw>40</TUSlw> @@ -4584,7 +4584,7 @@ <SubLayer>0</SubLayer> <PosX>1578</PosX> <PosY>0</PosY> -<PosZ>15004.8</PosZ> +<PosZ>15024.8</PosZ> <TUCal>0.0673654</TUCal> <TUOff>0</TUOff> <TUSlw>40</TUSlw> @@ -4608,6 +4608,7 @@ <qd_ch>27</qd_ch> <Ignore>0</Ignore> </NEBULA> +<!-- <NEBULA> <ID>145</ID> <NAME>NoUse1</NAME> @@ -5632,4 +5633,5 @@ <qd_ch>-1</qd_ch> <Ignore>0</Ignore> </NEBULA> +--> </dataroot> diff --git a/Projects/Nebula/db/NEBULA2BARS.xml b/Projects/Nebula/db/NEBULA2BARS.xml index dc6de7026..47b7469db 100755 --- a/Projects/Nebula/db/NEBULA2BARS.xml +++ b/Projects/Nebula/db/NEBULA2BARS.xml @@ -64,4 +64,36 @@ <qd_ch>0</qd_ch> <Ignore>0</Ignore> </NEBULA> +<NEBULA> +<ID>3</ID> +<NAME>103</NAME> +<FPl>13</FPl> +<Layer>1</Layer> +<SubLayer>1</SubLayer> +<PosX>0</PosX> +<PosY>0</PosY> +<PosZ>1242</PosZ> +<TUCal>1</TUCal> +<TUOff>0</TUOff> +<TUSlw>0</TUSlw> +<QUCal>0.0278832</QUCal> +<QUPed>176.884</QUPed> +<TDCal>1</TDCal> +<TDOff>0</TDOff> +<TDSlw>0</TDSlw> +<QDCal>0.0278832</QDCal> +<QDPed>211.422</QDPed> +<DTCal>94.87</DTCal> +<DTOff>0</DTOff> +<TAveOff>-4.743</TAveOff> +<tu_geo>11</tu_geo> +<tu_ch>0</tu_ch> +<qu_geo>21</qu_geo> +<qu_ch>0</qu_ch> +<td_geo>12</td_geo> +<td_ch>0</td_ch> +<qd_geo>22</qd_geo> +<qd_ch>0</qd_ch> +<Ignore>0</Ignore> +</NEBULA> </dataroot> diff --git a/Projects/Nebula/macro/GetTBrowser.C b/Projects/Nebula/macro/GetTBrowser.C index 70d5948c8..0b2737ca2 100644 --- a/Projects/Nebula/macro/GetTBrowser.C +++ b/Projects/Nebula/macro/GetTBrowser.C @@ -1,9 +1,14 @@ + + void GetTBrowser(){ TH1F *h1 = new TH1F("h1","Somme des Temps",100,-4,4); TFile* f = TFile::Open("root/simulation/SimulatedTree.root"); + TTree *t = (TTree*)f->Get("SimulatedTree"); + + TBranch *b = (TBranch*)t->GetBranch("Nebula"); TLeaf *tu = b->GetLeaf("fNebula_Tu_Time"); //Float_t td; @@ -16,4 +21,8 @@ void GetTBrowser(){ //sum += td; h1->Fill(sum); } + + + h1->Draw(); + } diff --git a/Projects/Nebula/macro/draw/PositionZ.C b/Projects/Nebula/macro/draw/PositionZ.C index c2624a21a..b400d6b07 100644 --- a/Projects/Nebula/macro/draw/PositionZ.C +++ b/Projects/Nebula/macro/draw/PositionZ.C @@ -1,20 +1,26 @@ -#include "/local/lemair/nptool/NPLib/Detectors/Nebula/TNebulaPhysics.h" +//#include "/local/lemair/nptool/NPLib/Detectors/Nebula/TNebulaPhysics.h" #include <iostream> // std::cout #include <algorithm> // std::find #include <vector> - +#include "TFile.h" +#include "TCanvas.h" +#include "TH1F.h" +#include "TTree.h" +#include "TBranch.h" void PositionZ(){ TFile* f = TFile::Open("root/simulation/SimulatedTree.root"); + + TTree* t = (TTree*)f->Get("SimulatedTree"); TCanvas *c1 = new TCanvas("c1","Position Z",1080,720); vector<double>* PosZ; int vec_size; TBranch* branch; - - TH1F *h = new TH1F("h","Position Z",2400,10800,12200); - t->SetBranchAddress("Pos_Z", &PosZ, &branch); + + TH1F *h = new TH1F("h","Position Z",2400,10800,16000); + t->SetBranchAddress("Nebula.PosZ", &PosZ, &branch); int nentries = t->GetEntries(); for(int i=0 ; i<nentries ; i++){ @@ -25,5 +31,6 @@ void PositionZ(){ } h->Draw("SAME"); + } diff --git a/Projects/Nebula/reaction/7Li_p_n_7Be.reaction b/Projects/Nebula/reaction/7Li_p_n_7Be.reaction index 43d6df9b3..e802dac62 100644 --- a/Projects/Nebula/reaction/7Li_p_n_7Be.reaction +++ b/Projects/Nebula/reaction/7Li_p_n_7Be.reaction @@ -3,14 +3,15 @@ Beam Particle= p Energy= 196 MeV SigmaEnergy= 0 MeV - SigmaThetaX= 1 deg - SigmaPhiY= 1 deg - SigmaX= 5 mm - SigmaY= 5 mm + SigmaThetaX= 0 deg + SigmaPhiY= 0 deg + SigmaX= 0 mm + SigmaY= 0 mm MeanThetaX= 0 deg MeanPhiY= 0 deg MeanX= 0 mm MeanY= 0 mm + ZEmission= -100 mm %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TwoBodyReaction @@ -21,6 +22,8 @@ TwoBodyReaction ExcitationEnergyLight= 0.0 MeV ExcitationEnergyHeavy= 0.43 MeV CrossSectionPath= flat.txt CSR - ShootLight= 0 - ShootHeavy= 0 + ShootLight= 1 + ShootHeavy= 1 + %HalfOpenAngleMin= -5 deg + %HalfOpenAngleMax= 5 deg %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Projects/Nebula/reaction/SimpleNeutrons.reaction b/Projects/Nebula/reaction/SimpleNeutrons.reaction index 604767b04..dd60ba285 100755 --- a/Projects/Nebula/reaction/SimpleNeutrons.reaction +++ b/Projects/Nebula/reaction/SimpleNeutrons.reaction @@ -3,8 +3,8 @@ Beam Particle= n Energy= 150 MeV SigmaEnergy= 0 MeV - SigmaThetaX= 1.5 deg - SigmaPhiY= 1.5 deg + SigmaThetaX= 5 deg + SigmaPhiY= 5 deg SigmaX= 0 cm SigmaY= 0 cm MeanThetaX= 0 deg diff --git a/Projects/S034/Analysis.cxx b/Projects/S034/Analysis.cxx index b3ab208c7..095774b6c 100644 --- a/Projects/S034/Analysis.cxx +++ b/Projects/S034/Analysis.cxx @@ -9,7 +9,7 @@ * Original Author: A. Matta contact address: matta@lpccaen.in2p3.fr * * * * Creation Date : May 2021 * - * Last update : * + * Last update : October 2024 * *---------------------------------------------------------------------------* * Decription: * * This class describe S034 analysis project * @@ -30,8 +30,16 @@ using namespace std; #include"RootOutput.h" #include"NPParticle.h" +#include"NPOptionManager.h" + +#include "TROOT.h" + +//thetaX angle dans le plan XZ +//PhiY angle dans le plan YZ + //////////////////////////////////////////////////////////////////////////////// -Analysis::Analysis(){ +Analysis::Analysis() +{ } //////////////////////////////////////////////////////////////////////////////// Analysis::~Analysis(){ @@ -40,203 +48,629 @@ Analysis::~Analysis(){ //////////////////////////////////////////////////////////////////////////////// void Analysis::Init(){ - Plastic= (TBigRIPSPlasticPhysics*) m_DetectorManager->GetDetector("BigRIPSPlastic"); - Minos= (TMinosPhysics*) m_DetectorManager->GetDetector("Minos"); - Nebula = (TNebulaPhysics*) m_DetectorManager->GetDetector("NEBULA"); - BDC = (TSamuraiBDCPhysics*) m_DetectorManager->GetDetector("SAMURAIBDC"); - FDC0 = (TSamuraiFDC0Physics*) m_DetectorManager->GetDetector("SAMURAIFDC0"); - FDC2 = (TSamuraiFDC2Physics*) m_DetectorManager->GetDetector("SAMURAIFDC2"); - Hodo = (TSamuraiHodoscopePhysics*) m_DetectorManager->GetDetector("SAMURAIHOD"); - - Nebula->SetQThreshold(0); - Nebula->SetVThreshold(0); - - FragmentTarget = NPL::EnergyLoss("He6_LH2.G4table","G4Table",1000 ); - m_field.LoadMap(30*deg,"field_map/180702-2,40T-3000.table.bin",10); - m_field.SetFDC2Angle((59.930-90.0)*deg); - m_field.SetFDC2R(FDC2->GetOffset().Z()); - InitOutputBranch(); - InitInputBranch(); - // for fdc/bdc alignement - //file.open("Calibration/Pos/bdc.txt"); - He4=NPL::Particle("4He"); - He6=NPL::Particle("6He"); + EventInCut = false; + CompleteAnalysis = false; + + //--------------------> Boolean initialisation <-----------------// + std::string tree_name = RootInput::getInstance()->GetChain()->GetName(); + if(tree_name=="SimulatedTree"){ + IsSimulation =true; + cout << "--------------->>> Analysing SIMULATED data <<<---------------" << endl; + } + else{ + IsSimulation =false; + cout << "--------------->>> Analysing EXPERIMENT data <<<---------------" << endl; + } + + + + //Create 2 files (1st with FDC0, FDC2 and Minos hit positions and 2nd with BDC1, BDC2 and Minos hit positions for FDC/BDC alignment) + if(NPOptionManager::getInstance()->HasDefinition("alignment_file")){ + CreateAlignmentFile = true; + cout << "--------------->>> Producing a data file for aligmnent <<<---------------" << endl; + } + else CreateAlignmentFile = false; + + + + if(!NPOptionManager::getInstance()->HasDefinition("detector_resolution")){ + cout << "--------------->>> Analysing for all detectors <<<-------------" << endl; + CompleteAnalysis = true; + + //Detectors only for experimental data + if(!IsSimulation) + { + Plastic = (TBigRIPSPlasticPhysics*) m_DetectorManager->GetDetector("BigRIPSPlastic"); + Hodo = (TSamuraiHodoscopePhysics*) m_DetectorManager->GetDetector("SAMURAIHOD"); + } + + //Other detectors for both analysis and simulation + Minos= (TMinosPhysics*) m_DetectorManager->GetDetector("Minos"); + BDC = (TSamuraiBDCPhysics*) m_DetectorManager->GetDetector("SAMURAIBDC"); + FDC0 = (TSamuraiFDC0Physics*) m_DetectorManager->GetDetector("SAMURAIFDC0"); + FDC2 = (TSamuraiFDC2Physics*) m_DetectorManager->GetDetector("SAMURAIFDC2"); + //Nebula = (TNebulaPhysics*) m_DetectorManager->GetDetector("NEBULA"); + + // Nebula->SetQThreshold(0); //???? + // Nebula->SetVThreshold(0); //???? + + ////////// Field loading ////////// + // m_field.LoadMap(30*deg,"field_map/180702-2,40T-3000.table.bin",10); + // m_field.SetFDC2Angle((59.930-90.0)*deg); + // m_field.SetFDC2R(FDC2->GetOffset().Z()); + + TargetLength = Minos->GetTargetLength(); //mm + MinosPosition = Minos->GetMinosPosition(); //mm lab reference frame (Minos entrance) + Minos_InZ = MinosPosition.Z(); + Minos_OutZ = MinosPosition.Z() + TargetLength; + } + + //Detectors only in simulation + if(IsSimulation) + { + //NeuLAND = (TNeuLANDPhysics*) m_DetectorManager->GetDetector("NeuLAND"); + Initial_Conditions=new TInitialConditions(); + } + + // if(!IsSimulation) + // { + // Minos= (TMinosPhysics*) m_DetectorManager->GetDetector("Minos"); + // } + + + + //setup information + LengthF7F13 = 36576.5; //mm + + ////////// He4 Energy loss in target ////////// + // FragmentTarget = NPL::EnergyLoss("He4_LH2.G4table","G4Table",1000 ); + + // He4=NPL::Particle("4He"); He8=NPL::Particle("8He"); - He8.SetBeta(0.5152); - n =NPL::Particle("neutron"); - mhe6 = He6.Mass(); - mn = n.Mass(); - sumM= mhe6+mn; + //He8.SetBeta(0.5152); // expected value + He8.SetBeta(0.5152); // expected value + mHe8 = He8.Mass(); + // n = NPL::Particle("neutron"); + // mhe4 = He4.Mass(); + // mn = n.Mass(); + // sumM= mhe4+mn; + + // Text file for alignment + + countLimitAlignment = 10000; + if(CreateAlignmentFile){ + countAlignment = 0; + fileBDC.open("Calibration/Pos/bdc.txt"); + fileFDC.open("Calibration/Pos/fdc.txt"); + } + + + InitInputBranch(); + InitOutputBranch(); + LoadCuts(); + +} + +//////////////////////////////////////////////////////////////////////////////// +void Analysis::LoadCuts(){ + + std::unique_ptr<TFile> myFile( TFile::Open("cut/Cut_Beam.root") ); + cut_Beam = myFile->Get<TCutG>("Cut_Beam"); + + myFile.reset(); } //////////////////////////////////////////////////////////////////////////////// void Analysis::TreatEvent(){ - Clear(); + if(!CompleteAnalysis) return; - static TLorentzVector LVHe6; - static TLorentzVector LVn; - Trigger=Trigger&0x00ff; - - - // BigRIPS plastic - double TF5=-1; - double TF13=-1; - double TF7=-1; - double TOF_F5F13=-1; - double TOF_F7F13=-1; - unsigned int sizeP = Plastic->FP.size(); - for(unsigned int i = 0 ; i < sizeP ; i++){ - if(Plastic->FP[i]==5){ - TF5=Plastic->TSlew[i]; - } - else if(Plastic->FP[i]==13&&Plastic->ID[i]==4){// two plastic at F13 taking only one - TF13=Plastic->TSlew[i]; - } - else if(Plastic->FP[i]==7){ - TF7=Plastic->TSlew[i]; - } - } + Clear(); + //cout << CreateAlignmentFile << endl; + Trigger=log(Trigger&0x00ff)/log(2.0); + // static TLorentzVector LVHe4; + // static TLorentzVector LVn; + // static TLorentzvector LVBeam; - if(TF7>0 && TF13>0){ - // offset is adjusted to give the expected beta - TOF_F7F13=TF13-TF7+6.71626e+02; - static double LengthF7F13 = 117915-66409; - Beta_b=(LengthF7F13/TOF_F7F13)/NPUNITS::c_light; - // to find offset: - //Beta_b=TOF_F7F13-LengthF7F13/He8.GetVelocity(); - } - // Samurai-Minos - if( Beta_b>0.5140 && Beta_b < 0.5165 // Correct Beta - && Hodo->Charge.size()==1 && Hodo->Charge[0]>28 && Hodo->Charge[0]<42 && Hodo->Time[0]>58 && Hodo->Time[0]<68 // 6He in Hodo->cope - && FDC2->PosX>-1500 && FDC2->PosX<1000 - && FDC2->PosY>-500 && FDC2->PosY<500 - && FDC0->PosX>-80 && FDC0->PosX<80 - && FDC0->PosY>-80 && FDC0->PosY<80 // both FDC ok - && Minos->Tracks_P0.size()==1 ) { // p,pn only - // Compute ThetaX and PhiY using Minos vertex and FDC0 X - // Check if both BDC are reconstructed - TVector3 BDC1=BDC->GetPos(1); - TVector3 BDC2=BDC->GetPos(2); - if( BDC1.Z()!=-10000 && BDC2.Z()!=-10000){ - TVector3 Vertex,delta; - TVector3 P1 = Minos->Tracks_P0[0]+Minos->Tracks_Dir[0]; - - // Vertex in Samurai Reference frame - MinimumDistanceTwoLines(BDC1,BDC2, - Minos->Tracks_P0[0], P1, - Vertex, delta) ; + ////// BigRIPS plastic ////// + double TF3= -1; + double TF5=-1; + double TF7=-1; + double TF13_P1=-1; + double TF13_P2 = -1; + + unsigned int sizeP = Plastic->FP.size(); + if(!IsSimulation){ + for(unsigned int i = 0 ; i < sizeP ; i++){ - TVector3 FDC0_Dir= FDC0->GetPos()-Vertex; - FDC0_Dir=FDC0_Dir.Unit(); - TVector3 BDCDir=BDC2-BDC1; - BDCDir=BDCDir.Unit(); - BDCDir*=(Vertex.Z()-BDC2.Z())/BDCDir.Z(); - BDCX=(BDC2+BDCDir).X(); - BDCY=(BDC2+BDCDir).Y(); - - // XYZ relative to Minos entrance - X=Vertex.X(); - Y=Vertex.Y(); - Z=Vertex.Z()+4650; - - // Fragment analysis - if(FDC0_Dir.Z()>0.6 && Z>0 && Z<150 && sqrt(X*X+Y*Y)<15){ - double FDC0_ThetaX = atan((FDC0->PosX-Vertex.X())/(1254.39-Z)); - double FDC0_PhiY = atan((FDC0->PosY-Vertex.Y())/(1254.39-Z)); - Brho=m_field.FindBrho(FDC0->GetPos(),FDC0_Dir,FDC2->GetPos(),TVector3(0,0,1)); - He6.SetBrho(Brho); - double Energy = He6.GetEnergy(); - if(Energy){ - Energy=FragmentTarget.EvaluateInitialEnergy(Energy,150-Z,FDC0_Dir.Angle(TVector3(0,0,1))); - He6.SetKineticEnergy(Energy); - Beta_f=He6.GetBeta(); - LVHe6.SetVectM(TVector3(0,0,0),mhe6); - LVHe6.Boost(Beta_f*FDC0_Dir.Unit()); - } + if(Plastic->FP[i]==3) TF3=Plastic->TSlew[i]; + else if(Plastic->FP[i]==5) TF5=Plastic->TSlew[i]; + else if(Plastic->FP[i]==7) TF7=Plastic->TSlew[i]; + else if(Plastic->FP[i]==13 && Plastic->ID[i]==4){// two plastic at F13 taking the 1st one + TF13_P1= Plastic->TSlew[i]; + Charge_F13_P1 = sqrt(Plastic->QL[i]*Plastic->QR[i]); + } + else if(Plastic->FP[i]==13 && Plastic->ID[i]==5){// two plastic at F13 taking the 2nd one + TF13_P2= Plastic->TSlew[i]; + Charge_F13_P2 = sqrt(Plastic->QL[i]*Plastic->QR[i]); + } + + if((Plastic->FP[i]==3||Plastic->FP[i]==5||Plastic->FP[i]==7||Plastic->FP[i]==13) && Plastic->multiHit[i]>0) MultiHit_PlasticBeam = true; + //if((Plastic->FP[i]==3||Plastic->FP[i]==5||Plastic->FP[i]==7||Plastic->FP[i]==13||Plastic->FP[i]==63) && Plastic->multiHit[i]>0) MultiHit_PlasticBeam = true; + } // end for loop on sizeP + + Charge_F13_P1P2 = sqrt(sqrt((Charge_F13_P1*Charge_F13_P1)*(Charge_F13_P2*Charge_F13_P2))); + + // plastic 1 and 2 + if(TF7>0 && TF13_P1>0 && TF13_P2>0){ + static double Offset_TOF_F7F13_P1P2 = 102.6; //xml file samuraiplastic.s034.2.xml + //Offset_TOF_F7F13_P1P2 = 0.0; + + double TF13_P1P2 = (TF13_P1 + TF13_P2)/2.0; + // to find offset: + Beam_Offset_TOF = -(TF13_P1P2-TF7)-LengthF7F13/He8.GetVelocity(); + //cout<< He8.GetBeta()<< endl; + //cout << He8.GetEnergy() << endl; + + TOF_F7F13_P1P2= -(TF13_P1P2-TF7) - Offset_TOF_F7F13_P1P2; + Beta_F7F13_P1P2=(LengthF7F13/TOF_F7F13_P1P2)/NPUNITS::c_light; + Beam_Beta = Beta_F7F13_P1P2; + He8.SetBeta(Beam_Beta); + }// end plastic 1 and 2 + + } // end if simulation == false + + if(IsSimulation) { + He8.SetKineticEnergy(Initial_Conditions->GetIncidentInitialKineticEnergy()); + Beam_Beta = He8.GetBeta(); + } + + Beam_Gamma = 1/sqrt(1-(Beam_Beta*Beam_Beta)); + Beam_P = Beam_Beta * Beam_Gamma * mHe8; + + // event selection + if((!IsSimulation && TMath::IsInside(TOF_F7F13_P1P2,Charge_F13_P1P2,cut_Beam->GetN(),cut_Beam->GetX(),cut_Beam->GetY())) || IsSimulation) EventInCut = true; + + //BDC + MultBDC = BDC->GetMult(); + BDC1_PileUp = BDC->GetPileUpDet(1); + BDC2_PileUp = BDC->GetPileUpDet(2); + + //Minos + Minos_TrackNbr = Minos->GetNbrOfTracks(); + + //FDC0 + FDC0_PileUp = FDC0->GetPileUp(); + + //Hodoscope + if(IsSimulation) HodoMult = 1; + else HodoMult = Hodo->GetMult(); + + + + + + + + // if (MultBDC>=2) + // cout << Beam_Beta << " " << MultBDC << " " << BDC1_PileUp << " " << BDC2_PileUp << " " << Minos_TrackNbr << " " << FDC0_PileUp << " " << HodoMult << endl; + + //Samurai-Minos + if(EventInCut && Beam_Beta > 0.512 && Beam_Beta < 0.518 && MultBDC==2/* && BDC1_PileUp==0 && BDC2_PileUp==0*/ /*&& (Minos_TrackNbr==1 || Minos_TrackNbr==2) &&*/ /*FDC0_PileUp==0 &&*/ /*(HodoMult==1 || HodoMult== 2)*/){ // selection for simulation and experimental data + + // Beam and BDC + BDC1_Pos = BDC->GetPos(1); + BDC1_X = BDC1_Pos[0]; + BDC1_Y = BDC1_Pos[1]; + BDC1_Z = BDC1_Pos[2]; + + BDC2_Pos = BDC->GetPos(2); + BDC2_X = BDC2_Pos[0]; + BDC2_Y = BDC2_Pos[1]; + BDC2_Z = BDC2_Pos[2]; + + BDCs_Dir = (BDC2_Pos - BDC1_Pos).Unit(); + + Beam_Px = BDCs_Dir.X()*Beam_P; + Beam_Py = BDCs_Dir.Y()*Beam_P; + Beam_Pz = BDCs_Dir.Z()*Beam_P; + + Beam_KE_Tot = He8.GetEnergy(); + Beam_KE = (He8.GetEnergy())/(He8.GetA()); // Kinetic Energy by nucleon + + Beam_Theta = BDCs_Dir.Angle(TVector3(0.0,0.0,1.0))*180.0/TMath::Pi(); + + Beam_ThetaX = atan2(BDC2_X-BDC1_X,BDC2_Z-BDC1_Z); + Beam_ThetaY = atan2(BDC2_Y-BDC1_Y,BDC2_Z-BDC1_Z); + + // if(IsSimulation) return; + + //Minos + if(Minos_TrackNbr==1){ + Minos_Track1P0 = Minos->GetTracksP0(0); + Minos_Track1Dir = Minos->GetTracksDir(0); + Minos_DistMin = MinimumDistanceTwoLines(Minos_Track1P0, Minos_Track1P0 + Minos_Track1Dir, BDC1_Pos, BDC1_Pos + BDCs_Dir, Minos_Vertex, Minos_Delta); + } + + else if(Minos_TrackNbr==2){ + Minos_Vertex = Minos->GetVertex(); + Minos_DistMin = Minos->GetDeltaVertex(); + Minos_TwoProtonAngle = Minos->GetTheta12(); + } + + Minos_Vertex_X = Minos_Vertex.X(); + Minos_Vertex_Y = Minos_Vertex.Y(); + Minos_Vertex_Z = Minos_Vertex.Z(); + // cout << Minos_Vertex_X << " " << Minos_Vertex_Y << " " << Minos_Vertex_Z << endl; + Minos_RVertex = sqrt( Minos_Vertex_X* Minos_Vertex_X + Minos_Vertex_Y*Minos_Vertex_Y); + + Minos_Vertex_InDet = Minos_Vertex - MinosPosition; + Minos_Vertex_XInDet = Minos_Vertex_InDet.X(); + Minos_Vertex_YInDet = Minos_Vertex_InDet.Y(); + Minos_Vertex_ZInDet = Minos_Vertex_InDet.Z(); + + BDC_XVertex = BDCs_Dir.X() * ((Minos_Vertex_Z - BDC1_Z)/BDCs_Dir.Z()) + BDC1_X; + BDC_YVertex = BDCs_Dir.Y() * ((Minos_Vertex_Z - BDC1_Z)/BDCs_Dir.Z()) + BDC1_Y; + + //FDC0 + FDC0_Pos = FDC0->GetPos(); + FDC0_X = FDC0_Pos.X(); + FDC0_Y = FDC0_Pos.Y(); + FDC0_Z = FDC0_Pos.Z(); + + Fragment_TrackDir = (FDC0_Pos - Minos_Vertex).Unit(); + + Minos_Out = Minos_Vertex + ((Minos_OutZ - Minos_Vertex_Z)/Fragment_TrackDir.Z())*Fragment_TrackDir; + Minos_OutX = Minos_Out.X(); + Minos_OutY = Minos_Out.Y(); + Minos_ROut = sqrt(Minos_OutX*Minos_OutX + Minos_OutY*Minos_OutY); + + Minos_PathFragment = Minos_Vertex - Minos_Out; + Minos_DistFragment = Minos_PathFragment.Mag(); + + Minos_In = BDC1_Pos + ((Minos_InZ - BDC1_Z)/BDCs_Dir.Z())*BDCs_Dir; + Minos_InX = Minos_In.X(); + Minos_InY = Minos_In.Y(); + Minos_RIn = sqrt(Minos_InX*Minos_InX + Minos_InY*Minos_InY); + + //FDC2 + FDC2_Pos = FDC2->GetPos(); + FDC2_X = FDC2_Pos.X(); + FDC2_Y = FDC2_Pos.Y(); + FDC2_Z = FDC2_Pos.Z(); + + + //Hodoscope + // position extrapolée de la fdc2 vers l'hodoscope + + + + // creation of files fdc.txt and bdc.txt with BDCs, Minos and FDCs hit positions + // cout << CreateAlignmentFile << endl; + + if(CreateAlignmentFile) FillAlignmentFiles(); + } + + + // TVector3 Beam_Boost; + + // // Samurai-Minos + // if( Beam_Beta>0.5140 && Beam_Beta < 0.5165 // Correct Beta + // && Hodo->Charge.size()==1 && Hodo->Charge[0]>28 && Hodo->Charge[0]<42 && Hodo->Time[0]>58 && Hodo->Time[0]<68 // 6He in Hodo->cope ----------->>>>>>>> à changer pour He4 + // && FDC2->PosX>-1500 && FDC2->PosX<1000 + // && FDC2->PosY>-500 && FDC2->PosY<500 + // && FDC0->PosX>-80 && FDC0->PosX<80 + // && FDC0->PosY>-80 && FDC0->PosY<80 // both FDC ok + // && Minos->Tracks_P0.size()==1 ) { // p,pn only // and p,p' ? + // // Compute ThetaX and PhiY using Minos vertex and FDC0 X + // // Check if both BDC are reconstructed + // TVector3 BDC1=BDC->GetPos(1); + // TVector3 BDC2=BDC->GetPos(2); + // if( BDC1.Z()!=-10000 && BDC2.Z()!=-10000){ + // TVector3 Vertex,delta; + // TVector3 P1 = Minos->Tracks_P0[0]+Minos->Tracks_Dir[0]; + + // // Vertex in Samurai Reference frame + // MinimumDistanceTwoLines(BDC1,BDC2, + // Minos->Tracks_P0[0], P1, + // Vertex, delta) ; + + // TVector3 FDC0_Dir= FDC0->GetPos()-Vertex; + // FDC0_Dir=FDC0_Dir.Unit(); + // TVector3 BDCDir=BDC2-BDC1; + // BDCDir=BDCDir.Unit(); + // BDCDir*=(Vertex.Z()-BDC2.Z())/BDCDir.Z(); + // BDCX=(BDC2+BDCDir).X(); + // BDCY=(BDC2+BDCDir).Y(); + + // // XYZ relative to Minos entrance + // X=Vertex.X(); + // Y=Vertex.Y(); + // Z=Vertex.Z()+4650; + + // // Fragment analysis + // if(FDC0_Dir.Z()>0.6 && Z>0 && Z<150 && sqrt(X*X+Y*Y)<15){ + // double FDC0_ThetaX = atan((FDC0->PosX-Vertex.X())/(1254.39-Z)); + // double FDC0_PhiY = atan((FDC0->PosY-Vertex.Y())/(1254.39-Z)); + // Brho=m_field.FindBrho(FDC0->GetPos(),FDC0_Dir,FDC2->GetPos(),TVector3(0,0,1)); + // He6.SetBrho(Brho); + // double Energy = He6.GetEnergy(); + // if(Energy){ + // Energy=FragmentTarget.EvaluateInitialEnergy(Energy,150-Z,FDC0_Dir.Angle(TVector3(0,0,1))); + // He6.SetKineticEnergy(Energy); + // Beta_f=He6.GetBeta(); + // LVHe4.SetVectM(TVector3(0,0,0),mhe6); + // LVHe4.Boost(Beta_f*FDC0_Dir.Unit()); + // } - } + // } - // Neutron analysis - if(Nebula->Charge.size()>0 && !Nebula->HasVeto()){ - // Index of first neutron hit - unsigned int first = Nebula->GetFirstHit(); - TVector3 Pfirst = (Nebula->GetPos(first)-Vertex); - double L = Pfirst.Mag(); - double TSBT= (Vertex.Z()+7377.56)/(Beta_b*c_light); - TOF_n = Nebula->TOF[first]-TSBT-TF13; - Beta_n = (L/TOF_n)/NPUNITS::c_light; - LVn.SetVectM(TVector3(0,0,0),mn); - LVn.Boost(Beta_n*Pfirst.Unit()); - } + // // Neutron analysis + // if(Nebula->Charge.size()>0 && !Nebula->HasVeto()){ + // // Index of first neutron hit + // unsigned int first = Nebula->GetFirstHit(); + // TVector3 Pfirst = (Nebula->GetPos(first)-Vertex); + // double L = Pfirst.Mag(); + // double TSBT= (Vertex.Z()+7377.56)/(Beam_Beta*c_light); + // TOF_n = Nebula->TOF[first]-TSBT-TF13; + // Beta_n = (L/TOF_n)/NPUNITS::c_light; + // LVn.SetVectM(TVector3(0,0,0),mn); + // LVn.Boost(Beta_n*Pfirst.Unit()); + // } - // a full event - if(Beta_n&&Beta_f){ - He6.SetEnergyImpulsion(LVHe6); - n.SetEnergyImpulsion(LVn); - Erel = (LVHe6+LVn).Mag()-sumM; - } - // Calib////////////////////////////////////////////////////////////////// - /* static int count=0; - if(Minos->Delta_Vertex < 5 && FDC2->PosX-252.55>0&&FDC0->GetPos().X()>-10000 && FDC0->Dir.Z()>0.9 && Minos->Z_Vertex>0&& sqrt(Minos->X_Vertex*Minos->X_Vertex+Minos->Y_Vertex*Minos->Y_Vertex)<15){ - file << FDC0->GetPos().X() <<" " << FDC0->GetPos().Y() << " " << FDC0->GetPos().Z() <<" " ; - file << Minos->X_Vertex <<" " << Minos->Y_Vertex << " " << Minos->Z_Vertex << " " ; - file << FDC2->GetPos().X() <<" " << FDC2->GetPos().Y() << " " << FDC2->GetPos().Z() <<" " << FDC2->Dir.X() <<" " << FDC2->Dir.Y() << " " << FDC2->Dir.Z()<< endl; - count ++; - } - if(count>1000) - exit(1); - */ - /* static int count=0; - if(Minos->Delta_Vertex < 5 && sqrt(Minos->X_Vertex*Minos->X_Vertex+Minos->Y_Vertex*Minos->Y_Vertex)<15 && Minos->Z_Vertex>-4650){ - file << BDC1.X() <<" " << BDC1.Y()<< " " << BDC1.Z() <<" " ; - file << BDC2.X() <<" " << BDC2.Y()<< " " << BDC2.Z() <<" " ; - file << Minos->X_Vertex <<" " << Minos->Y_Vertex << " " << Minos->Z_Vertex << endl ; - count ++; - } - if(count>10000) - exit(1); - */ + // // a full event + // if(Beta_n&&Beta_f){ + // He6.SetEnergyImpulsion(LVHe4); + // n.SetEnergyImpulsion(LVn); + // Erel = (LVHe4+LVn).Mag()-sumM; + // } - } - } + // } + // } + + } //////////////////////////////////////////////////////////////////////////////// void Analysis::End(){ + + fileBDC.close(); + fileFDC.close(); + //free(Plastic); + //free(BDC); } //////////////////////////////////////////////////////////////////////////////// void Analysis::Clear(){ - Brho=-1000; - BDCX=-1000; - BDCY=-1000; - Beta_f=-1000; - Beta_n=-1000; - Beta_b=-1000; - X=Y=Z=-1000; - TOF_n=-1000; - Erel=-1000; + He8.SetBeta(0.5152); + + + MultiHit_PlasticBeam = false; + EventInCut = false; + + //Beam + Beam_Beta= -10000; + Beam_Gamma =-10000; + Beam_P = -10000; + Beam_KE = -10000; + Beam_KE_Tot=-10000; + // Beam_Boost.Clear(); + Beam_Px =-10000; + Beam_Py =-10000; + Beam_Pz = -10000; + Beam_Theta = -10000; + + //plastic 1 + TOF_F7F13_P1 = -10000; + Charge_F13_P1 = -10000; + Beta_F7F13_P1 = -10000; + + //plastic 2 + TOF_F7F13_P2 = -10000; + Charge_F13_P2 = -10000; + Beta_F7F13_P2 = -10000; + + //plastic 1 and 2 + TOF_F7F13_P1P2 = -1000; + Charge_F13_P1P2 = -1000; + Beta_F7F13_P1P2 = -1000; + Beam_Offset_TOF = -10000; + + //BDC1 and BDC2 + BDC1_X= BDC1_Y= BDC1_Z = -10000; + BDC2_X= BDC2_Y = BDC2_Z = -10000; + BDC1_Pos.Clear(); + BDC2_Pos.Clear(); + BDC1_PileUp = -10000; + BDC2_PileUp = -10000; + + Beam_ThetaX = Beam_ThetaY = -10000; + BDC_XVertex = BDC_YVertex = -10000; + + //Minos + Minos_Vertex.Clear(); + Minos_Vertex_X = -10000; + Minos_Vertex_Y =-10000; + Minos_Vertex_Z = -10000; + Minos_TrackNbr = -10000; + Minos_DistMin=-10000;// minimum distance between the 2 lines used in trajectory reconstruction + Minos_RVertex=-10000; + Minos_PathFragment.Clear(); + Minos_DistFragment = -10000; + Minos_In.Clear(); + Minos_InX = Minos_InY =-10000; + Minos_RIn = -10000; + Minos_Out.Clear(); + Minos_OutX = Minos_OutY =-10000; + Minos_ROut = -10000; + Minos_Delta.Clear(); + Minos_TwoProtonAngle = -10000; + Minos_Track1P0.Clear(); + Minos_Track1Dir.Clear(); + Minos_Vertex_InDet.Clear(); + Minos_Vertex_XInDet = -10000; + Minos_Vertex_YInDet = -10000; + Minos_Vertex_ZInDet = -10000; + + //FDC0 + FDC0_Pos.Clear(); + FDC0_X = FDC0_Y = FDC0_Z =-10000; + FDC0_PileUp = -10000; + + + //FDC2 + FDC2_Pos.Clear(); + FDC2_X = FDC2_Y = FDC2_Z =-10000; + FDC2_PileUp = -10000; + + //Hodoscope + HodoMult = -10000; + } //////////////////////////////////////////////////////////////////////////////// void Analysis::InitOutputBranch() { - RootOutput::getInstance()->GetTree()->Branch("Brho",&Brho,"Brho/D"); - RootOutput::getInstance()->GetTree()->Branch("BDCX",&BDCX,"BDCX/D"); - RootOutput::getInstance()->GetTree()->Branch("BDCY",&BDCY,"BDCY/D"); - RootOutput::getInstance()->GetTree()->Branch("X",&X,"X/D"); - RootOutput::getInstance()->GetTree()->Branch("Y",&Y,"Y/D"); - RootOutput::getInstance()->GetTree()->Branch("Z",&Z,"Z/D"); - RootOutput::getInstance()->GetTree()->Branch("Erel",&Erel,"Erel/D"); - RootOutput::getInstance()->GetTree()->Branch("Beta_f",&Beta_f,"Beta_f/D"); - RootOutput::getInstance()->GetTree()->Branch("Beta_n",&Beta_n,"Beta_n/D"); - RootOutput::getInstance()->GetTree()->Branch("Beta_b",&Beta_b,"Beta_b/D"); - RootOutput::getInstance()->GetTree()->Branch("TOF_n",&TOF_n,"TOF_n/D"); + + //Beam + RootOutput::getInstance()->GetTree()->Branch("Beam_Beta",&Beam_Beta,"Beam_Beta/D"); + RootOutput::getInstance()->GetTree()->Branch("MultiHit_PlasticBeam",&MultiHit_PlasticBeam,"MultiHit_PlasticBeam/D"); + RootOutput::getInstance()->GetTree()->Branch("Beam_Gamma",&Beam_Gamma,"Beam_Gamma/D"); + RootOutput::getInstance()->GetTree()->Branch("Beam_P",&Beam_P,"Beam_P/D"); + + // plastic 1 + // RootOutput::getInstance()->GetTree()->Branch("TOF_F7F13_P1",&TOF_F7F13_P1,"TOF_F7F13_P1/D"); + // RootOutput::getInstance()->GetTree()->Branch("Charge_F13_P1",&Charge_F13_P1,"Charge_F13_P1/D"); + // RootOutput::getInstance()->GetTree()->Branch("Beta_F7F13_P1",&Beta_F7F13_P1,"Beta_F7F13_P1/D"); + // plastic 2 + // RootOutput::getInstance()->GetTree()->Branch("TOF_F7F13_P2",&TOF_F7F13_P2,"TOF_F7F13_P2/D"); + // RootOutput::getInstance()->GetTree()->Branch("Charge_F13_P2",&Charge_F13_P2,"Charge_F13_P2/D"); + // RootOutput::getInstance()->GetTree()->Branch("Beta_F7F13_P2",&Beta_F7F13_P2,"Beta_F7F13_P2/D"); + + //plastic 1 and 2 + RootOutput::getInstance()->GetTree()->Branch("Beam_Offset_TOF",&Beam_Offset_TOF,"Beam_Offset_TOF/D"); + RootOutput::getInstance()->GetTree()->Branch("TOF_F7F13_P1P2",&TOF_F7F13_P1P2,"TOF_F7F13_P1P2/D"); + RootOutput::getInstance()->GetTree()->Branch("Charge_F13_P1P2",&Charge_F13_P1P2,"Charge_F13_P1P2/D"); + //RootOutput::getInstance()->GetTree()->Branch("Beta_F7F13_P1P2",&Beta_F7F13_P1P2,"Beta_F7F13_P1P2/D"); + + //Beam + RootOutput::getInstance()->GetTree()->Branch("Beam_Px",&Beam_Px,"Beam_Px/D"); + RootOutput::getInstance()->GetTree()->Branch("Beam_Py",&Beam_Py,"Beam_Py/D"); + RootOutput::getInstance()->GetTree()->Branch("Beam_Pz",&Beam_Pz,"Beam_Pz/D"); + + RootOutput::getInstance()->GetTree()->Branch("Beam_KE_Tot",&Beam_KE_Tot,"Beam_KE_Tot/D"); + RootOutput::getInstance()->GetTree()->Branch("Beam_KE",&Beam_KE,"Beam_KE/D"); // KE/u + + RootOutput::getInstance()->GetTree()->Branch("Beam_Theta",&Beam_Theta,"Beam_Theta/D"); + + //BDC1 et BDC2 + RootOutput::getInstance()->GetTree()->Branch("BDC1_X",&BDC1_X,"BDC1_X/D"); + RootOutput::getInstance()->GetTree()->Branch("BDC1_Y",&BDC1_Y,"BDC1_Y/D"); + RootOutput::getInstance()->GetTree()->Branch("BDC1_Z",&BDC1_Z,"BDC1_Z/D"); + + RootOutput::getInstance()->GetTree()->Branch("BDC2_X",&BDC2_X,"BDC2_X/D"); + RootOutput::getInstance()->GetTree()->Branch("BDC2_Y",&BDC2_Y,"BDC2_Y/D"); + RootOutput::getInstance()->GetTree()->Branch("BDC2_Z",&BDC2_Z,"BDC2_Z/D"); + + RootOutput::getInstance()->GetTree()->Branch("BDC1_PileUp",&BDC1_PileUp,"BDC1_PileUp/I"); + RootOutput::getInstance()->GetTree()->Branch("BDC2_PileUp",&BDC2_PileUp,"BDC2_PileUp/I"); + + RootOutput::getInstance()->GetTree()->Branch("Beam_ThetaX",&Beam_ThetaX,"Beam_ThetaX/D"); + RootOutput::getInstance()->GetTree()->Branch("Beam_ThetaY",&Beam_ThetaY,"Beam_ThetaY/D"); + + RootOutput::getInstance()->GetTree()->Branch("BDC_XVertex",&BDC_XVertex,"BDC_XVertex/D"); + RootOutput::getInstance()->GetTree()->Branch("BDC_YVertex",&BDC_YVertex,"BDC_YVertex/D"); + + //Minos + RootOutput::getInstance()->GetTree()->Branch("Minos_TrackNbr",&Minos_TrackNbr,"Minos_TrackNbr/I"); + RootOutput::getInstance()->GetTree()->Branch("Minos_Vertex_X",&Minos_Vertex_X,"Minos_Vertex_X/D"); + RootOutput::getInstance()->GetTree()->Branch("Minos_Vertex_Y",&Minos_Vertex_Y,"Minos_Vertex_Y/D"); + RootOutput::getInstance()->GetTree()->Branch("Minos_Vertex_Z",&Minos_Vertex_Z,"Minos_Vertex_Z/D"); + RootOutput::getInstance()->GetTree()->Branch("Minos_DistMin",&Minos_DistMin,"Minos_DistMin/D"); RootOutput::getInstance()->GetTree()->Branch("Minos_PathFragment",&Minos_PathFragment); + RootOutput::getInstance()->GetTree()->Branch("Minos_DistFragment",&Minos_DistFragment,"Minos_DistFragment/D"); + RootOutput::getInstance()->GetTree()->Branch("Minos_InX",&Minos_InX,"Minos_InX/D"); + RootOutput::getInstance()->GetTree()->Branch("Minos_InY",&Minos_InY,"Minos_InY/D"); + RootOutput::getInstance()->GetTree()->Branch("Minos_InZ",&Minos_InZ,"Minos_InZ/D"); + RootOutput::getInstance()->GetTree()->Branch("Minos_RIn",&Minos_RIn,"Minos_RIn/D"); + + RootOutput::getInstance()->GetTree()->Branch("Minos_RVertex",&Minos_RVertex,"Minos_RVertex/D"); + + RootOutput::getInstance()->GetTree()->Branch("Minos_Vertex_XInDet",&Minos_Vertex_XInDet,"Minos_Vertex_XInDet/D"); + RootOutput::getInstance()->GetTree()->Branch("Minos_Vertex_YInDet",&Minos_Vertex_YInDet,"Minos_Vertex_YInDet/D"); + RootOutput::getInstance()->GetTree()->Branch("Minos_Vertex_ZInDet",&Minos_Vertex_ZInDet,"Minos_Vertex_ZInDet/D"); + RootOutput::getInstance()->GetTree()->Branch("Minos_TwoProtonAngle",&Minos_TwoProtonAngle,"Minos_TwoProtonAngle/D"); + + RootOutput::getInstance()->GetTree()->Branch("Minos_OutX",&Minos_OutX,"Minos_OutX/D"); + RootOutput::getInstance()->GetTree()->Branch("Minos_OutY",&Minos_OutY,"Minos_OutY/D"); + RootOutput::getInstance()->GetTree()->Branch("Minos_OutZ",&Minos_OutZ,"Minos_OutZ/D"); + RootOutput::getInstance()->GetTree()->Branch("Minos_ROut",&Minos_ROut,"Minos_ROut/D"); + + //FDC0 + RootOutput::getInstance()->GetTree()->Branch("FDC0_X",&FDC0_X,"FDC0_X/D"); + RootOutput::getInstance()->GetTree()->Branch("FDC0_Y",&FDC0_Y,"FDC0_Y/D"); + RootOutput::getInstance()->GetTree()->Branch("FDC0_Z",&FDC0_Z,"FDC0_Z/D"); + RootOutput::getInstance()->GetTree()->Branch("FDC0_PileUp",&FDC0_PileUp,"FDC0_PileUp/I"); + + //FDC2 + RootOutput::getInstance()->GetTree()->Branch("FDC2_X",&FDC2_X,"FDC2_X/D"); + RootOutput::getInstance()->GetTree()->Branch("FDC2_Y",&FDC2_Y,"FDC2_Y/D"); + RootOutput::getInstance()->GetTree()->Branch("FDC2_Z",&FDC2_Z,"FDC2_Z/D"); + RootOutput::getInstance()->GetTree()->Branch("FDC2_PileUp",&FDC2_PileUp,"FDC2_PileUp/I"); + + //Hodoscope + RootOutput::getInstance()->GetTree()->Branch("HodoMult",&HodoMult,"HodoMult/I"); + + //Trigger RootOutput::getInstance()->GetTree()->Branch("Trigger",&Trigger,"Trigger/I"); -} +} + //////////////////////////////////////////////////////////////////////////////// void Analysis::InitInputBranch(){ - RootInput::getInstance()->GetChain()->SetBranchAddress("Trigger",&Trigger); + if(IsSimulation){ + RootInput::getInstance()->GetChain()->SetBranchAddress("InitialConditions",&Initial_Conditions); + } + if(!IsSimulation){ + RootInput::getInstance()->GetChain()->SetBranchAddress("Trigger",&Trigger); + } } + +//////////////////////////////////////////////////////////////////////////////// +void Analysis::FillAlignmentFiles(){ + cout << "////////////////WARNING: CONDITION ON MINOS Z_VERTEX TO CHECK//////////////////" << endl; + + fileFDC << FDC0->GetPos().X() <<" " << FDC0->GetPos().Y() << " " << FDC0->GetPos().Z() <<" " ; + fileFDC << Minos->X_Vertex <<" " << Minos->Y_Vertex << " " << Minos->Z_Vertex << " " ; + fileFDC << FDC2->GetPos().X() <<" " << FDC2->GetPos().Y() << " " << FDC2->GetPos().Z() <<" " << FDC2->Dir.X() <<" " << FDC2->Dir.Y() << " " << FDC2->Dir.Z()<< endl; + + TVector3 BDC1=BDC->GetPos(1); + TVector3 BDC2=BDC->GetPos(2); + fileBDC << BDC1.X() <<" " << BDC1.Y()<< " " << BDC1.Z() <<" " ; + fileBDC << BDC2.X() <<" " << BDC2.Y()<< " " << BDC2.Z() <<" " ; + fileBDC << Minos->X_Vertex <<" " << Minos->Y_Vertex << " " << Minos->Z_Vertex << endl ; + countAlignment++; + + /* + if(Minos->Delta_Vertex < 5 && FDC2->PosX-252.55>0 && FDC0->GetPos().X()>-10000 && FDC0->Dir.Z()>0.9 && Minos->Z_Vertex<-900 && sqrt(Minos->X_Vertex*Minos->X_Vertex+Minos->Y_Vertex*Minos->Y_Vertex)<15){ + fileFDC << FDC0->GetPos().X() <<" " << FDC0->GetPos().Y() << " " << FDC0->GetPos().Z() <<" " ; + fileFDC << Minos->X_Vertex <<" " << Minos->Y_Vertex << " " << Minos->Z_Vertex << " " ; + fileFDC << FDC2->GetPos().X() <<" " << FDC2->GetPos().Y() << " " << FDC2->GetPos().Z() <<" " << FDC2->Dir.X() <<" " << FDC2->Dir.Y() << " " << FDC2->Dir.Z()<< endl; + + TVector3 BDC1=BDC->GetPos(1); + TVector3 BDC2=BDC->GetPos(2); + fileBDC << BDC1.X() <<" " << BDC1.Y()<< " " << BDC1.Z() <<" " ; + fileBDC << BDC2.X() <<" " << BDC2.Y()<< " " << BDC2.Z() <<" " ; + fileBDC << Minos->X_Vertex <<" " << Minos->Y_Vertex << " " << Minos->Z_Vertex << endl ; + countAlignment++; + + } + */ + + + if(countAlignment>=countLimitAlignment) { + CreateAlignmentFile = false; + cout << "fin de creation fichier alignement" << endl; + } + +} + //////////////////////////////////////////////////////////////////////////////// // Construct Method to be pass to the AnalysisFactory // //////////////////////////////////////////////////////////////////////////////// diff --git a/Projects/S034/Analysis.h b/Projects/S034/Analysis.h index bb609b7e9..fb842e28a 100644 --- a/Projects/S034/Analysis.h +++ b/Projects/S034/Analysis.h @@ -25,6 +25,7 @@ #include"NPEnergyLoss.h" #include"TMinosPhysics.h" #include"TNebulaPhysics.h" +#include"TNeuLANDPhysics.h" #include"TSamuraiBDCPhysics.h" #include"TSamuraiFDC0Physics.h" #include"TSamuraiFDC2Physics.h" @@ -32,49 +33,172 @@ #include"TBigRIPSPlasticPhysics.h" #include"SamuraiFieldMap.h" #include<fstream> + +#include"TInitialConditions.h" + +//Root +#include "TCutG.h" +#include "TFile.h" + class Analysis: public NPL::VAnalysis{ - public: - Analysis(); - ~Analysis(); + +public: + Analysis(); + ~Analysis(); - public: - void Init(); - void TreatEvent(); - void End(); +public: + void Init(); + void TreatEvent(); + void End(); - static NPL::VAnalysis* Construct(); + static NPL::VAnalysis* Construct(); + +private: // boolean + bool IsSimulation; + bool CreateAlignmentFile; + bool CompleteAnalysis; + bool EventInCut; - private: +private: //cut files + TCutG *cut_Beam ; + +private: //detector used in the analysis TBigRIPSPlasticPhysics* Plastic; TMinosPhysics* Minos; TNebulaPhysics* Nebula; + TNeuLANDPhysics* NeuLAND; TSamuraiBDCPhysics* BDC; TSamuraiFDC0Physics* FDC0; TSamuraiFDC2Physics* FDC2; TSamuraiHodoscopePhysics* Hodo; - + SamuraiFieldMap m_field ; -// ofstream file; - private: // output variable - double Brho,BDCX,BDCY,X,Y,Z,Erel; - double TOF_n; - double Beta_f; - double Beta_n; - double Beta_b; - int Trigger; - private: // Energy loss table - NPL::EnergyLoss FragmentTarget ; - NPL::Particle He4,He6,He8,n; - double mhe6; - double mn ; - double sumM; - - - - public: - void Clear(); - void InitOutputBranch(); - void InitInputBranch(); + + TInitialConditions* Initial_Conditions; + +private: //setup information + //setup + double LengthF7F13; + double TargetLength; + double FDC2Angle; + TVector3 MinosPosition; + +private: // Energy loss table + particles information + NPL::EnergyLoss FragmentTarget; + NPL::Particle He4,He6,He8,n; + double mHe8; + double mHe4; + double mhe6; + double mn ; + double sumM; + + +private: // output files and variables + + ///Files/// + ofstream fileBDC; + ofstream fileFDC; + int countAlignment; + int countLimitAlignment; + + + ///Variables/// + + //// Beam //// + + double MultiHit_PlasticBeam; + + double Beam_Gamma; + double Beam_P; + TVector3 Beam_Boost; + + + //plastic 1 + double Beta_F7F13_P1; + double Charge_F13_P1; + double TOF_F7F13_P1; + + + //plastic 2 + double Beta_F7F13_P2; + double Charge_F13_P2; + double TOF_F7F13_P2; + + // both plastic together + double Beta_F7F13_P1P2; + double Charge_F13_P1P2; + double TOF_F7F13_P1P2; + + //Beam + double Beam_Px, Beam_Py, Beam_Pz; + double Beam_KE_Tot; + double Beam_KE; + double Beam_Beta; + double Beam_Theta; + double Beam_Offset_TOF; + + //BDC1 and BDC2 + double BDC1_X,BDC1_Y, BDC1_Z; + double BDC2_X,BDC2_Y, BDC2_Z; + TVector3 BDC1_Pos, BDC2_Pos; + TVector3 BDCs_Dir; + int MultBDC; + int BDC1_PileUp, BDC2_PileUp; + + double Beam_ThetaX, Beam_ThetaY; + double BDC_XVertex, BDC_YVertex; + + //Minos + TVector3 Minos_Vertex; + double Minos_Vertex_X, Minos_Vertex_Y, Minos_Vertex_Z; + int Minos_TrackNbr; + double Minos_DistMin;// minimum distance between the 2 lines used in trajectory reconstruction + double Minos_RVertex; + TVector3 Minos_PathFragment; + double Minos_DistFragment; + TVector3 Minos_In; + double Minos_InX, Minos_InY, Minos_InZ; + double Minos_RIn; + TVector3 Minos_Out; + double Minos_OutX, Minos_OutY, Minos_OutZ; // to calculate fragment's path in target + double Minos_ROut; + double Minos_TwoProtonAngle; + TVector3 Minos_Delta, Minos_Track1P0, Minos_Track1Dir; + TVector3 Minos_Vertex_InDet; + double Minos_Vertex_XInDet; + double Minos_Vertex_YInDet; + double Minos_Vertex_ZInDet; + + + //FDC0 + TVector3 FDC0_Pos; + double FDC0_X, FDC0_Y,FDC0_Z; + int FDC0_PileUp; + + //Fragment + TVector3 Fragment_TrackDir; + + //FDC2 + TVector3 FDC2_Pos; + double FDC2_X, FDC2_Y,FDC2_Z; + int FDC2_PileUp; + + + //Hodoscope + // int + int HodoMult; + + //Trigger + int Trigger; + +public: + void Clear(); + void InitOutputBranch(); + void InitInputBranch(); + + void FillAlignmentFiles(); + void LoadCuts(); + }; #endif diff --git a/Projects/S034/Calibration/BDC/CalibBDC.cxx b/Projects/S034/Calibration/BDC/CalibBDC.cxx index fcd922caa..2fdf41985 100755 --- a/Projects/S034/Calibration/BDC/CalibBDC.cxx +++ b/Projects/S034/Calibration/BDC/CalibBDC.cxx @@ -61,7 +61,7 @@ void CalibBDC(){ /* BDC=2; */ /* NLayer = 14; */ -/* c->SetBranchStatus("SamuraiBDC2",true); */ +/* c->SetBranchStatus("SamuraiBDC",true); */ /* ofstream fout2(Form("CalibFiles/BDC2_Calib_%d.txt", run12)); */ /* inter = 10;// inter wire distance */ /* low=1200; */ diff --git a/Projects/S034/Calibration/BDC/CalibBDC1.cxx b/Projects/S034/Calibration/BDC/CalibBDC1.cxx new file mode 100755 index 000000000..5cc19a9fb --- /dev/null +++ b/Projects/S034/Calibration/BDC/CalibBDC1.cxx @@ -0,0 +1,59 @@ +void CalibBDC(){ + + for(int runNbr =824; runNbr <= 824 ; runNbr++){ + + TChain* c = new TChain("RawTree"); + c->Add(Form("../../root/mrdc/run%d/run%d_SAMURAIBDC.root",runNbr,runNbr)); + c->SetBranchStatus("*",false); + + // BDC1 + int BDC=1; + int NLayer = 8; + c->SetBranchStatus("SamuraiBDC",true); + ofstream fout(Form("BDC%d_Calib_%d.txt",BDC, runNbr)); + double inter = 2.5;// inter wire distance / 2 + double low=1600; + double high=1900; + + cout <<"Calibrating BDC" << BDC << " run number : " << runNbr << endl; + + string cond; + + TF1* f = new TF1("sigmoid","[0]/(exp([1]*([2]-x))+1)"); + //TF1* f = new TF1("sigmoid","0*(x<[0])+(x-[0])*[1]*(x>[0]&&x<[2])+[3]*(x>[2])"); + + TH1D* h = new TH1D("h","h",1500,0,3000); + for(unsigned int i = 0 ; i < NLayer; i++){ + cond = Form("fBDC_LayerNbr==%d&&fBDC_Edge==0&&fBDC_Time>%f&&fBDC_Time<%f&&fBDC_Time@.size()>10&&fBDC_Time@.size()<100 &&fBDC_DetectorNbr==%d ",i,low,high,BDC); + c->Draw("fBDC_Time>>h",cond.c_str()); + TH1D* g = new TH1D(*h); + unsigned int size = h->GetNbinsX(); + for(unsigned int i = 0 ; i < size ; i++){ + g->SetBinContent(i,h->Integral(0,i)); + } + + //new TCanvas(); + //g->Draw(); + cout << g->GetMaximum() << endl; + f->SetParameter(0,g->GetMaximum()); + f->SetParameter(1,0.1); + f->SetParameter(2,1700); + f->SetParLimits(1,0,1); + f->SetParLimits(2,1600,1900); + + g->Fit(f); + // Renormalize the distribution to the maximum driftlength + f->SetParameter(0,inter); + double p0 = f->GetParameter(0); + double p1 = f->GetParameter(1); + double p2 = f->GetParameter(2); + //new TCanvas(); + //c->Draw(Form("%f/(exp(%f*(%f-(Time+ToT)))+1)>>hh(200,0,2.5)",p0,p1,p2),cond.c_str()); + fout << Form("BDC%d_L%d ",BDC,i) << p0 << " " << p1 << " " << p2 << endl; +// gPad->Update(); +// gPad->WaitPrimitive(); + } + fout.close(); + + } +} diff --git a/Projects/S034/Calibration/BDC/CalibBDC2.cxx b/Projects/S034/Calibration/BDC/CalibBDC2.cxx new file mode 100755 index 000000000..149d7ca33 --- /dev/null +++ b/Projects/S034/Calibration/BDC/CalibBDC2.cxx @@ -0,0 +1,59 @@ +void CalibBDC(){ + + for(int runNbr =824; runNbr <= 824 ; runNbr++){ + + TChain* c = new TChain("RawTree"); + c->Add(Form("../../root/mrdc/run%d/run%d_SAMURAIBDC.root",runNbr,runNbr)); + c->SetBranchStatus("*",false); + + // BDC2 + int BDC=2; + int NLayer = 8; + c->SetBranchStatus("SamuraiBDC",true); + ofstream fout(Form("BDC%d_Calib_%d.txt",BDC, runNbr)); + double inter = 2.5;// inter wire distance / 2 + double low=1600; + double high=1900; + + cout <<"Calibrating BDC" << BDC << " run number : " << runNbr << endl; + + string cond; + + TF1* f = new TF1("sigmoid","[0]/(exp([1]*([2]-x))+1)"); + //TF1* f = new TF1("sigmoid","0*(x<[0])+(x-[0])*[1]*(x>[0]&&x<[2])+[3]*(x>[2])"); + + TH1D* h = new TH1D("h","h",1500,0,3000); + for(unsigned int i = 0 ; i < NLayer; i++){ + cond = Form("fBDC_LayerNbr==%d&&fBDC_Edge==0&&fBDC_Time>%f&&fBDC_Time<%f&&fBDC_Time@.size()>10&&fBDC_Time@.size()<100 &&fBDC_DetectorNbr==%d ",i,low,high,BDC); + c->Draw("fBDC_Time>>h",cond.c_str()); + TH1D* g = new TH1D(*h); + unsigned int size = h->GetNbinsX(); + for(unsigned int i = 0 ; i < size ; i++){ + g->SetBinContent(i,h->Integral(0,i)); + } + + //new TCanvas(); + //g->Draw(); + cout << g->GetMaximum() << endl; + f->SetParameter(0,g->GetMaximum()); + f->SetParameter(1,0.1); + f->SetParameter(2,1700); + f->SetParLimits(1,0,1); + f->SetParLimits(2,1600,1900); + + g->Fit(f); + // Renormalize the distribution to the maximum driftlength + f->SetParameter(0,inter); + double p0 = f->GetParameter(0); + double p1 = f->GetParameter(1); + double p2 = f->GetParameter(2); + //new TCanvas(); + //c->Draw(Form("%f/(exp(%f*(%f-(Time+ToT)))+1)>>hh(200,0,2.5)",p0,p1,p2),cond.c_str()); + fout << Form("BDC%d_L%d ",BDC,i) << p0 << " " << p1 << " " << p2 << endl; +// gPad->Update(); +// gPad->WaitPrimitive(); + } + fout.close(); + + } +} diff --git a/Projects/S034/Calibration/FDC/CalibFDC0.cxx b/Projects/S034/Calibration/FDC/CalibFDC0.cxx new file mode 100755 index 000000000..197448a62 --- /dev/null +++ b/Projects/S034/Calibration/FDC/CalibFDC0.cxx @@ -0,0 +1,54 @@ +void CalibFDC0(){ + + for(int run8 =656; run8 <= 656; run8++){ + + // FDC ////////// + int FDC = 0; + int NLayer = 8; + double inter = 2.5;// inter wire distance/2 -> maximum driftlength + double low=1720; + double high=1820; + + TChain* c = new TChain("RawTree"); + c->Add(Form("../root/mrdc/run%d/run%d_SAMURAIFDC%i.root",run8,run8,FDC)); + c->SetBranchStatus("*",false); + c->SetBranchStatus("SamuraiFDC0",true); + + //ofstream fout(Form("FDC%i_Calib_%d.txt",FDC,run8)); + + cout <<"Calibrating FDC" << FDC << " run number : " << run8 << endl; + + string cond; + + TF1* f = new TF1("sigmoid","[0]/(exp([1]*([2]-x))+1)"); + //TF1* f = new TF1("sigmoid","0*(x<[0])+(x-[0])*[1]*(x>[0]&&x<[2])+[3]*(x>[2])"); + + TH1D* h = new TH1D("h","h",1500,0,3000); + for(unsigned int i = 0 ; i < NLayer-6; i++){ + cond = Form("fFDC%d_LayerNbr==%d&&fFDC%d_Edge==0&&fFDC%d_Time>%f&&fFDC%d_Time<%f&&fFDC%d_Time@.size()>10&&fFDC%d_Time@.size()<100",FDC,i,FDC,FDC,low,FDC,high,FDC,FDC); + c->Draw(Form("fFDC%d_Time>>h",FDC),cond.c_str()); + TH1D* g = new TH1D(*h); + unsigned int size = h->GetNbinsX(); + for(unsigned int i = 0 ; i < size ; i++){ + g->SetBinContent(i,h->Integral(0,i)); + } + new TCanvas(); + g->Draw(); + cout << g->GetMaximum() << endl; + f->SetParameter(0,g->GetMaximum()); + f->SetParameter(1,8e-3); + f->SetParameter(2,1500); + + g->Fit(f); + // Renormalize the distribution to 10 mm + f->SetParameter(0,inter); + double p0 = f->GetParameter(0); + double p1 = f->GetParameter(1); + double p2 = f->GetParameter(2); + //new TCanvas(); + //c->Draw(Form("%f/(exp(%f*(%f-(Time+ToT)))+1)>>hh(200,0,2.5)",p0,p1,p2),cond.c_str()); + //fout << Form("FDC%d_L%d ",FDC,i) << p0 << " " << p1 << " " << p2 << endl; + } + //fout.close(); + } +} diff --git a/Projects/S034/Calibration/FDC/CalibFDC2.cxx b/Projects/S034/Calibration/FDC/CalibFDC2.cxx new file mode 100755 index 000000000..7e4b21aee --- /dev/null +++ b/Projects/S034/Calibration/FDC/CalibFDC2.cxx @@ -0,0 +1,59 @@ +void CalibFDC2(){ + + for(int run8 = 630; run8 <= 630 ; run8++){ + + + ///////////////// + // FDC2 + int FDC=2; + int NLayer = 14; + double inter = 10;// inter wire distance/2 -> maximum driftlength + double low=1200; + double high=1700; + //////////////// + auto c = new TChain("RawTree"); + c->Add(Form("../root/mrdc/run%d/run%d_SAMURAIFDC%i.root",run8,run8,FDC)); + c->SetBranchStatus("*",false); + c->SetBranchStatus("SamuraiFDC2",true); + + + //ofstream fout(Form("FDC%i_Calib_%d.txt",FDC,run8)); + + + cout <<"Calibrating FDC" << FDC << " run number : " << run8 << endl; + + string cond; + + TF1* f = new TF1("sigmoid","[0]/(exp([1]*([2]-x))+1)"); + //TF1* f = new TF1("sigmoid","0*(x<[0])+(x-[0])*[1]*(x>[0]&&x<[2])+[3]*(x>[2])"); + + TH1D* h = new TH1D("h","h",1500,0,3000); + for(unsigned int i = 0 ; i < NLayer; i++){ + cond = Form("fFDC%d_LayerNbr==%d&&fFDC%d_Edge==0&&fFDC%d_Time>%f&&fFDC%d_Time<%f&&fFDC%d_Time@.size()>10&&fFDC%d_Time@.size()<100",FDC,i,FDC,FDC,low,FDC,high,FDC,FDC); + c->Draw(Form("fFDC%d_Time>>h",FDC),cond.c_str()); + TH1D* g = new TH1D(*h); + unsigned int size = h->GetNbinsX(); + for(unsigned int i = 0 ; i < size ; i++){ + g->SetBinContent(i,h->Integral(0,i)); + } + //new TCanvas(); + //g->Draw(); + cout << g->GetMaximum() << endl; + f->SetParameter(0,g->GetMaximum()); + f->SetParameter(1,8e-3); + f->SetParameter(2,1500); + + g->Fit(f); + // Renormalize the distribution to 10 mm + f->SetParameter(0,inter); + double p0 = f->GetParameter(0); + double p1 = f->GetParameter(1); + double p2 = f->GetParameter(2); + //new TCanvas(); + //c->Draw(Form("%f/(exp(%f*(%f-(Time+ToT)))+1)>>hh(200,0,2.5)",p0,p1,p2),cond.c_str()); + fout << Form("FDC%d_L%d ",FDC,i) << p0 << " " << p1 << " " << p2 << endl; + } + fout.close(); + + } +} diff --git a/Projects/S034/Calibration/Pos/BDC.cxx b/Projects/S034/Calibration/Pos/BDC.cxx index bebc79d18..4efea0555 100644 --- a/Projects/S034/Calibration/Pos/BDC.cxx +++ b/Projects/S034/Calibration/Pos/BDC.cxx @@ -45,6 +45,16 @@ void LoadFile(){ } else { cout << "Success opening file" << endl; + + /* + int lineCount = 0; // Initializing a variable to count lines +std::string line; + while (std::getline(file, line)) { // Loop through each line in the file + lineCount++; // Incrementing line count for each line read + } + cout << lineCount << endl; + exit(1); + */ } double xm,ym,zm; @@ -59,7 +69,9 @@ void LoadFile(){ pos2.push_back(p2); posM.push_back(pM); } + cout << " Val " << pos1.size() << " Value Loaded" << endl; file.close(); + //exit(1); } //////////////////////////////////////////////////////////////////////////////// void BDC(){ @@ -88,11 +100,13 @@ void BDC(){ min->Minimize(); const double* x = min->X(); - cout << "X1 =" << x[0]<<endl; + cout <<"\033[0;31mX1 = " << x[0]<<endl; + // cout << "X1 =" << x[0]<<endl; cout << "Y1 =" << x[1]<<endl; cout << "Z1 =" << x[2]<<endl; cout << "X2 =" << x[3]<<endl; cout << "Y2 =" << x[4]<<endl; cout << "Z2 =" << x[5]<<endl; cout << "Minimum: " << devR(x) << endl; + cout << "\033[0m\n"; } diff --git a/Projects/S034/Calibration/Pos/FDC.cxx b/Projects/S034/Calibration/Pos/FDC.cxx index 0bf889b1c..aa4764b36 100644 --- a/Projects/S034/Calibration/Pos/FDC.cxx +++ b/Projects/S034/Calibration/Pos/FDC.cxx @@ -17,7 +17,7 @@ double devB(const double* parameter){ oM.Print(); o0.Print(); o2.Print(); - field.SetFDC2R(parameter[6]); + field.SetFDC2R(parameter[9]); static auto h = new TH1D("h","h", 1000,0,10); h->Reset(); for(unsigned int i = 0 ; i < size ; i++){ @@ -28,10 +28,11 @@ double devB(const double* parameter){ p2=*(pos2[i])+o2; d0=(p0-pM).Unit(); // p2.Print(); - if(d0.Z()>0.9) - h->Fill(field.FindBrho(p0,d0,p2,*dir2[i])); + h->Fill(field.FindBrho(p0,d0,p2,*dir2[i])); } - cout << h->GetStdDev() << " " << parameter[0] << endl; + //cout << h->GetStdDev() << " " << parameter[0] << endl; + //h->Draw(); + //gPad->Update(); return h->GetStdDev(); } //////////////////////////////////////////////////////////////////////////////// @@ -44,6 +45,14 @@ void LoadFile(){ } else { cout << "Success opening file" << endl; + /* + int lineCount = 0; // Initializing a variable to count lines +std::string line; + while (std::getline(file, line)) { // Loop through each line in the file + lineCount++; // Incrementing line count for each line read + } + cout << lineCount << endl; + */ } double xm,ym,zm; @@ -83,7 +92,7 @@ void FDC(){ double parameter[10]={40.6,0,0,-4657.39, 0, 0,-3372.07,-252.55,0,4123.47}; devB(parameter); - // min->SetLimitedVariable(0,"AM",parameter[0],1,-90,90); + //min->SetLimitedVariable(0,"AM",parameter[0],1,-90,90); min->SetFixedVariable(0,"AM",parameter[0]); min->SetLimitedVariable(1,"XM",parameter[1],1,-10,10); min->SetLimitedVariable(2,"YM",parameter[2],1,-10,10); @@ -106,15 +115,17 @@ void FDC(){ */ min->Minimize(); const double* x = min->X(); - cout << "AM =" << x[0]<<endl; - cout << "XM =" << x[1]<<endl; - cout << "YM =" << x[2]<<endl; - cout << "ZM =" << x[3]<<endl; - cout << "X0 =" << x[4]<<endl; - cout << "Y0 =" << x[5]<<endl; - cout << "Z0 =" << x[6]<<endl; - cout << "X2 =" << x[7]<<endl; - cout << "Y2 =" << x[8]<<endl; - cout << "Z2 =" << x[9]<<endl; + system("Color DE"); + cout <<"\033[0;31mAM = " << x[0]<<endl; + cout << "XM = " << x[1]<<endl; + cout << "YM = " << x[2]<<endl; + cout << "ZM = " << x[3]<<endl; + cout << "X0 = " << x[4]<<endl; + cout << "Y0 = " << x[5]<<endl; + cout << "Z0 = " << x[6]<<endl; + cout << "X2 = " << x[7]<<endl; + cout << "Y2 = " << x[8]<<endl; + cout << "Z2 = " << x[9]<<endl; cout << "Minimum: " << devB(x) << endl; + cout << "\033[0m\n"; } diff --git a/Projects/S034/PhysicsListOption.txt b/Projects/S034/PhysicsListOption.txt index 5a8ee25ad..a58e9877f 100644 --- a/Projects/S034/PhysicsListOption.txt +++ b/Projects/S034/PhysicsListOption.txt @@ -9,5 +9,5 @@ OpticalPhysics 0 HadronPhysicsINCLXX 0 HadronPhysicsQGSP_BIC_HP 0 Decay 0 -DriftElectronPhysics 1 +DriftElectronPhysics 0 diff --git a/Projects/S034/db/NEBULA.xml b/Projects/S034/db/NEBULA.xml index 1a5e451d0..84329e270 100755 --- a/Projects/S034/db/NEBULA.xml +++ b/Projects/S034/db/NEBULA.xml @@ -1,36 +1,36 @@ <?xml version="1.0" encoding="UTF-8"?> <dataroot> <NEBULA> - <ID>1</ID> - <NAME>101</NAME> - <FPl>13</FPl> - <Layer>1</Layer> - <SubLayer>1</SubLayer> - <PosX>-1901.8</PosX> - <PosY>0</PosY> - <PosZ>14431.3</PosZ> - <TUCal>0.0656086</TUCal> - <TUOff>0</TUOff> - <TUSlw>39.763</TUSlw> - <QUCal>0.0278832</QUCal> - <QUPed>176.884</QUPed> - <TDCal>0.0671919</TDCal> - <TDOff>0</TDOff> - <TDSlw>40.7</TDSlw> - <QDCal>0.0278832</QDCal> - <QDPed>211.422</QDPed> - <DTCal>76.257</DTCal> - <DTOff>-51.3483</DTOff> - <TAveOff>-25.70746</TAveOff> - <tu_geo>11</tu_geo> - <tu_ch>0</tu_ch> - <qu_geo>21</qu_geo> - <qu_ch>0</qu_ch> - <td_geo>12</td_geo> - <td_ch>0</td_ch> - <qd_geo>22</qd_geo> - <qd_ch>0</qd_ch> - <Ignore>0</Ignore> +<ID>1</ID> +<NAME>101</NAME> +<FPl>13</FPl> +<Layer>1</Layer> +<SubLayer>1</SubLayer> +<PosX>-1901.8</PosX> +<PosY>0</PosY> +<PosZ>14431.3</PosZ> +<TUCal>0.0656086</TUCal> +<TUOff>0</TUOff> +<TUSlw>39.763</TUSlw> +<QUCal>0.0278832</QUCal> +<QUPed>176.884</QUPed> +<TDCal>0.0671919</TDCal> +<TDOff>0</TDOff> +<TDSlw>40.7</TDSlw> +<QDCal>0.0278832</QDCal> +<QDPed>211.422</QDPed> +<DTCal>76.257</DTCal> +<DTOff>-51.3483</DTOff> +<TAveOff>-25.70746</TAveOff> +<tu_geo>11</tu_geo> +<tu_ch>0</tu_ch> +<qu_geo>21</qu_geo> +<qu_ch>0</qu_ch> +<td_geo>12</td_geo> +<td_ch>0</td_ch> +<qd_geo>22</qd_geo> +<qd_ch>0</qd_ch> +<Ignore>0</Ignore> </NEBULA> <NEBULA> <ID>2</ID> @@ -4264,7 +4264,7 @@ <SubLayer>0</SubLayer> <PosX>-1522</PosX> <PosY>0</PosY> -<PosZ>15004.8</PosZ> +<PosZ>15024.8</PosZ> <TUCal>0.0676695</TUCal> <TUOff>0</TUOff> <TUSlw>40</TUSlw> @@ -4328,7 +4328,7 @@ <SubLayer>0</SubLayer> <PosX>-902</PosX> <PosY>0</PosY> -<PosZ>15004.8</PosZ> +<PosZ>15024.8</PosZ> <TUCal>0.0682021</TUCal> <TUOff>0</TUOff> <TUSlw>40</TUSlw> @@ -4392,7 +4392,7 @@ <SubLayer>0</SubLayer> <PosX>-282</PosX> <PosY>0</PosY> -<PosZ>15004.8</PosZ> +<PosZ>15024.8</PosZ> <TUCal>0.0679071</TUCal> <TUOff>0</TUOff> <TUSlw>40</TUSlw> @@ -4456,7 +4456,7 @@ <SubLayer>0</SubLayer> <PosX>338</PosX> <PosY>0</PosY> -<PosZ>15004.8</PosZ> +<PosZ>15024.8</PosZ> <TUCal>0.0676573</TUCal> <TUOff>0</TUOff> <TUSlw>40</TUSlw> @@ -4520,7 +4520,7 @@ <SubLayer>0</SubLayer> <PosX>958</PosX> <PosY>0</PosY> -<PosZ>15004.8</PosZ> +<PosZ>15024.8</PosZ> <TUCal>0.0686263</TUCal> <TUOff>0</TUOff> <TUSlw>40</TUSlw> @@ -4584,7 +4584,7 @@ <SubLayer>0</SubLayer> <PosX>1578</PosX> <PosY>0</PosY> -<PosZ>15004.8</PosZ> +<PosZ>15024.8</PosZ> <TUCal>0.0673654</TUCal> <TUOff>0</TUOff> <TUSlw>40</TUSlw> @@ -4608,6 +4608,7 @@ <qd_ch>27</qd_ch> <Ignore>0</Ignore> </NEBULA> +<!-- <NEBULA> <ID>145</ID> <NAME>NoUse1</NAME> @@ -5632,4 +5633,5 @@ <qd_ch>-1</qd_ch> <Ignore>0</Ignore> </NEBULA> +--> </dataroot> diff --git a/Projects/S034/db/NEULAND.xml b/Projects/S034/db/NEULAND.xml index f8a71a540..a552f30de 100755 --- a/Projects/S034/db/NEULAND.xml +++ b/Projects/S034/db/NEULAND.xml @@ -1,47 +1,51 @@ <?xml version="1.0" encoding="UTF-8"?> <dataroot> <NEULAND> - <ID>1</ID> - <NAME>NeuLANDPla0H-0</NAME> - <FPL>13</FPL> - <direction>H</direction> - <layer>0</layer> - <bar>0</bar> - <qcal0>1</qcal0> - <qped0>46</qped0> - <tdc0ns0>1178</tdc0ns0> - <tdc25ns0>3284</tdc25ns0> - <tdc0ns0_t17>1141</tdc0ns0_t17> - <tdc25ns0_t17>3281</tdc25ns0_t17> - <qcal1>1</qcal1> - <qped1>36</qped1> - <tdc0ns1>1203</tdc0ns1> - <tdc25ns1>3278</tdc25ns1> - <tdc0ns1_t17>1154</tdc0ns1_t17> - <tdc25ns1_t17>3276</tdc25ns1_t17> - <tdiff_offset>45.5521</tdiff_offset> - <sync_offset>-13.9147</sync_offset> - <vscint>8.37529</vscint> - <ediff_offset>1.01314</ediff_offset> - <esync_offset>0.0628646</esync_offset> - <att>358.252</att> - <crate0>1</crate0> - <module0>9</module0> - <channel0>11</channel0> - <sam0>6</sam0> - <gtb0>0</gtb0> - <crate1>4</crate1> - <module1>2</module1> - <channel1>1</channel1> - <sam1>5</sam1> - <gtb1>1</gtb1> - <zpos>11165</zpos> +<ID>1</ID> +<NAME>NeuLANDPla0H-0</NAME> +<FPL>13</FPL> +<direction>H</direction> +<SubLayer>1</SubLayer> +<layer>0</layer> +<bar>0</bar> +<qcal0>1</qcal0> +<qped0>46</qped0> +<tdc0ns0>1178</tdc0ns0> +<tdc25ns0>3284</tdc25ns0> +<tdc0ns0_t17>1141</tdc0ns0_t17> +<tdc25ns0_t17>3281</tdc25ns0_t17> +<qcal1>1</qcal1> +<qped1>36</qped1> +<tdc0ns1>1203</tdc0ns1> +<tdc25ns1>3278</tdc25ns1> +<tdc0ns1_t17>1154</tdc0ns1_t17> +<tdc25ns1_t17>3276</tdc25ns1_t17> +<tdiff_offset>45.5521</tdiff_offset> +<sync_offset>-13.9147</sync_offset> +<vscint>8.37529</vscint> +<ediff_offset>1.01314</ediff_offset> +<esync_offset>0.0628646</esync_offset> +<att>358.252</att> +<crate0>1</crate0> +<module0>9</module0> +<channel0>11</channel0> +<sam0>6</sam0> +<gtb0>0</gtb0> +<crate1>4</crate1> +<module1>2</module1> +<channel1>1</channel1> +<sam1>5</sam1> +<gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-1225</ypos> +<zpos>11165</zpos> </NEULAND> <NEULAND> <ID>2</ID> <NAME>NeuLANDPla0H-1</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>1</bar> <qcal0>1</qcal0> @@ -72,6 +76,8 @@ <channel1>0</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-1175</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -79,6 +85,7 @@ <NAME>NeuLANDPla0H-2</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>2</bar> <qcal0>1</qcal0> @@ -109,6 +116,8 @@ <channel1>15</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-1125</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -116,6 +125,7 @@ <NAME>NeuLANDPla0H-3</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>3</bar> <qcal0>1</qcal0> @@ -146,6 +156,8 @@ <channel1>14</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-1075</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -153,6 +165,7 @@ <NAME>NeuLANDPla0H-4</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>4</bar> <qcal0>1</qcal0> @@ -183,6 +196,8 @@ <channel1>13</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-1025</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -190,6 +205,7 @@ <NAME>NeuLANDPla0H-5</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>5</bar> <qcal0>1</qcal0> @@ -220,6 +236,8 @@ <channel1>12</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-975</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -227,6 +245,7 @@ <NAME>NeuLANDPla0H-6</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>6</bar> <qcal0>1</qcal0> @@ -257,6 +276,8 @@ <channel1>11</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-925</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -264,6 +285,7 @@ <NAME>NeuLANDPla0H-7</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>7</bar> <qcal0>1</qcal0> @@ -294,6 +316,8 @@ <channel1>10</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-875</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -301,6 +325,7 @@ <NAME>NeuLANDPla0H-8</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>8</bar> <qcal0>1</qcal0> @@ -331,6 +356,8 @@ <channel1>9</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-825</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -338,6 +365,7 @@ <NAME>NeuLANDPla0H-9</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>9</bar> <qcal0>1</qcal0> @@ -368,6 +396,8 @@ <channel1>8</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-775</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -375,6 +405,7 @@ <NAME>NeuLANDPla0H-10</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>10</bar> <qcal0>1</qcal0> @@ -405,6 +436,8 @@ <channel1>7</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-725</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -412,6 +445,7 @@ <NAME>NeuLANDPla0H-11</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>11</bar> <qcal0>1</qcal0> @@ -442,6 +476,8 @@ <channel1>6</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-675</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -449,6 +485,7 @@ <NAME>NeuLANDPla0H-12</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>12</bar> <qcal0>1</qcal0> @@ -479,6 +516,8 @@ <channel1>5</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-625</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -486,6 +525,7 @@ <NAME>NeuLANDPla0H-13</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>13</bar> <qcal0>1</qcal0> @@ -516,6 +556,8 @@ <channel1>4</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-575</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -523,6 +565,7 @@ <NAME>NeuLANDPla0H-14</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>14</bar> <qcal0>1</qcal0> @@ -553,6 +596,8 @@ <channel1>3</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-525</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -560,6 +605,7 @@ <NAME>NeuLANDPla0H-15</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>15</bar> <qcal0>1</qcal0> @@ -590,6 +636,8 @@ <channel1>2</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-475</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -597,6 +645,7 @@ <NAME>NeuLANDPla0H-16</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>16</bar> <qcal0>1</qcal0> @@ -627,6 +676,8 @@ <channel1>1</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-425</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -634,6 +685,7 @@ <NAME>NeuLANDPla0H-17</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>17</bar> <qcal0>1</qcal0> @@ -664,6 +716,8 @@ <channel1>0</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-375</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -671,6 +725,7 @@ <NAME>NeuLANDPla0H-18</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>18</bar> <qcal0>1</qcal0> @@ -701,6 +756,8 @@ <channel1>15</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-325</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -708,6 +765,7 @@ <NAME>NeuLANDPla0H-19</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>19</bar> <qcal0>1</qcal0> @@ -738,6 +796,8 @@ <channel1>14</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-275</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -745,6 +805,7 @@ <NAME>NeuLANDPla0H-20</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>20</bar> <qcal0>1</qcal0> @@ -775,6 +836,8 @@ <channel1>13</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-225</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -782,6 +845,7 @@ <NAME>NeuLANDPla0H-21</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>21</bar> <qcal0>1</qcal0> @@ -812,6 +876,8 @@ <channel1>12</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-175</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -819,6 +885,7 @@ <NAME>NeuLANDPla0H-22</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>22</bar> <qcal0>1</qcal0> @@ -849,6 +916,8 @@ <channel1>11</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-125</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -856,6 +925,7 @@ <NAME>NeuLANDPla0H-23</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>23</bar> <qcal0>1</qcal0> @@ -886,6 +956,8 @@ <channel1>10</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-75</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -893,6 +965,7 @@ <NAME>NeuLANDPla0H-24</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>24</bar> <qcal0>1</qcal0> @@ -923,6 +996,8 @@ <channel1>9</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-25</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -930,6 +1005,7 @@ <NAME>NeuLANDPla0H-25</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>25</bar> <qcal0>1</qcal0> @@ -960,6 +1036,8 @@ <channel1>8</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>25</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -967,6 +1045,7 @@ <NAME>NeuLANDPla0H-26</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>26</bar> <qcal0>1</qcal0> @@ -997,6 +1076,8 @@ <channel1>7</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>75</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -1004,6 +1085,7 @@ <NAME>NeuLANDPla0H-27</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>27</bar> <qcal0>1</qcal0> @@ -1034,6 +1116,8 @@ <channel1>6</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>125</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -1041,6 +1125,7 @@ <NAME>NeuLANDPla0H-28</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>28</bar> <qcal0>1</qcal0> @@ -1071,6 +1156,8 @@ <channel1>5</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>175</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -1078,6 +1165,7 @@ <NAME>NeuLANDPla0H-29</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>29</bar> <qcal0>1</qcal0> @@ -1108,6 +1196,8 @@ <channel1>4</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>225</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -1115,6 +1205,7 @@ <NAME>NeuLANDPla0H-30</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>30</bar> <qcal0>1</qcal0> @@ -1145,6 +1236,8 @@ <channel1>3</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>275</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -1152,6 +1245,7 @@ <NAME>NeuLANDPla0H-31</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>31</bar> <qcal0>1</qcal0> @@ -1182,6 +1276,8 @@ <channel1>2</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>325</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -1189,6 +1285,7 @@ <NAME>NeuLANDPla0H-32</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>32</bar> <qcal0>1</qcal0> @@ -1219,6 +1316,8 @@ <channel1>1</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>375</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -1226,6 +1325,7 @@ <NAME>NeuLANDPla0H-33</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>33</bar> <qcal0>1</qcal0> @@ -1256,6 +1356,8 @@ <channel1>0</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>425</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -1263,6 +1365,7 @@ <NAME>NeuLANDPla0H-34</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>34</bar> <qcal0>1</qcal0> @@ -1293,6 +1396,8 @@ <channel1>15</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>475</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -1300,6 +1405,7 @@ <NAME>NeuLANDPla0H-35</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>35</bar> <qcal0>1</qcal0> @@ -1330,6 +1436,8 @@ <channel1>14</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>525</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -1337,6 +1445,7 @@ <NAME>NeuLANDPla0H-36</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>36</bar> <qcal0>1</qcal0> @@ -1367,6 +1476,8 @@ <channel1>13</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>575</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -1374,6 +1485,7 @@ <NAME>NeuLANDPla0H-37</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>37</bar> <qcal0>1</qcal0> @@ -1404,6 +1516,8 @@ <channel1>12</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>625</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -1411,6 +1525,7 @@ <NAME>NeuLANDPla0H-38</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>38</bar> <qcal0>1</qcal0> @@ -1441,6 +1556,8 @@ <channel1>11</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>675</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -1448,6 +1565,7 @@ <NAME>NeuLANDPla0H-39</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>39</bar> <qcal0>1</qcal0> @@ -1478,6 +1596,8 @@ <channel1>10</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>725</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -1485,6 +1605,7 @@ <NAME>NeuLANDPla0H-40</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>40</bar> <qcal0>1</qcal0> @@ -1515,6 +1636,8 @@ <channel1>9</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>775</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -1522,6 +1645,7 @@ <NAME>NeuLANDPla0H-41</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>41</bar> <qcal0>1</qcal0> @@ -1552,6 +1676,8 @@ <channel1>8</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>825</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -1559,6 +1685,7 @@ <NAME>NeuLANDPla0H-42</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>42</bar> <qcal0>1</qcal0> @@ -1589,6 +1716,8 @@ <channel1>7</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>875</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -1596,6 +1725,7 @@ <NAME>NeuLANDPla0H-43</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>43</bar> <qcal0>1</qcal0> @@ -1626,6 +1756,8 @@ <channel1>6</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>925</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -1633,6 +1765,7 @@ <NAME>NeuLANDPla0H-44</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>44</bar> <qcal0>1</qcal0> @@ -1663,6 +1796,8 @@ <channel1>5</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>975</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -1670,6 +1805,7 @@ <NAME>NeuLANDPla0H-45</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>45</bar> <qcal0>1</qcal0> @@ -1700,6 +1836,8 @@ <channel1>4</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>1025</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -1707,6 +1845,7 @@ <NAME>NeuLANDPla0H-46</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>46</bar> <qcal0>1</qcal0> @@ -1737,6 +1876,8 @@ <channel1>3</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>1075</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -1744,6 +1885,7 @@ <NAME>NeuLANDPla0H-47</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>47</bar> <qcal0>1</qcal0> @@ -1774,6 +1916,8 @@ <channel1>2</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>1125</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -1781,6 +1925,7 @@ <NAME>NeuLANDPla0H-48</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>48</bar> <qcal0>1</qcal0> @@ -1811,6 +1956,8 @@ <channel1>1</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>1175</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -1818,6 +1965,7 @@ <NAME>NeuLANDPla0H-49</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>0</layer> <bar>49</bar> <qcal0>1</qcal0> @@ -1848,6 +1996,8 @@ <channel1>0</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>1225</ypos> <zpos>11165</zpos> </NEULAND> <NEULAND> @@ -1855,6 +2005,7 @@ <NAME>NeuLANDPla1V-0</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>0</bar> <qcal0>1</qcal0> @@ -1885,6 +2036,8 @@ <channel1>9</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-1225</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -1892,6 +2045,7 @@ <NAME>NeuLANDPla1V-1</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>1</bar> <qcal0>1</qcal0> @@ -1922,6 +2076,8 @@ <channel1>8</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-1175</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -1929,6 +2085,7 @@ <NAME>NeuLANDPla1V-2</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>2</bar> <qcal0>1</qcal0> @@ -1959,6 +2116,8 @@ <channel1>7</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-1125</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -1966,6 +2125,7 @@ <NAME>NeuLANDPla1V-3</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>3</bar> <qcal0>1</qcal0> @@ -1996,6 +2156,8 @@ <channel1>6</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-1075</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -2003,6 +2165,7 @@ <NAME>NeuLANDPla1V-4</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>4</bar> <qcal0>1</qcal0> @@ -2033,6 +2196,8 @@ <channel1>5</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-1025</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -2040,6 +2205,7 @@ <NAME>NeuLANDPla1V-5</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>5</bar> <qcal0>1</qcal0> @@ -2070,6 +2236,8 @@ <channel1>4</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-975</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -2077,6 +2245,7 @@ <NAME>NeuLANDPla1V-6</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>6</bar> <qcal0>1</qcal0> @@ -2107,6 +2276,8 @@ <channel1>3</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-925</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -2114,6 +2285,7 @@ <NAME>NeuLANDPla1V-7</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>7</bar> <qcal0>1</qcal0> @@ -2144,6 +2316,8 @@ <channel1>2</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-875</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -2151,6 +2325,7 @@ <NAME>NeuLANDPla1V-8</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>8</bar> <qcal0>1</qcal0> @@ -2181,6 +2356,8 @@ <channel1>1</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-825</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -2188,6 +2365,7 @@ <NAME>NeuLANDPla1V-9</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>9</bar> <qcal0>1</qcal0> @@ -2218,6 +2396,8 @@ <channel1>0</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-775</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -2225,6 +2405,7 @@ <NAME>NeuLANDPla1V-10</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>10</bar> <qcal0>1</qcal0> @@ -2255,6 +2436,8 @@ <channel1>15</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-725</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -2262,6 +2445,7 @@ <NAME>NeuLANDPla1V-11</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>11</bar> <qcal0>1</qcal0> @@ -2292,6 +2476,8 @@ <channel1>14</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-675</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -2299,6 +2485,7 @@ <NAME>NeuLANDPla1V-12</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>12</bar> <qcal0>1</qcal0> @@ -2329,6 +2516,8 @@ <channel1>13</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-625</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -2336,6 +2525,7 @@ <NAME>NeuLANDPla1V-13</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>13</bar> <qcal0>1</qcal0> @@ -2366,6 +2556,8 @@ <channel1>12</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-575</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -2373,6 +2565,7 @@ <NAME>NeuLANDPla1V-14</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>14</bar> <qcal0>1</qcal0> @@ -2403,6 +2596,8 @@ <channel1>11</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-525</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -2410,6 +2605,7 @@ <NAME>NeuLANDPla1V-15</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>15</bar> <qcal0>1</qcal0> @@ -2440,6 +2636,8 @@ <channel1>10</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-475</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -2447,6 +2645,7 @@ <NAME>NeuLANDPla1V-16</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>16</bar> <qcal0>1</qcal0> @@ -2477,6 +2676,8 @@ <channel1>9</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-425</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -2484,6 +2685,7 @@ <NAME>NeuLANDPla1V-17</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>17</bar> <qcal0>1</qcal0> @@ -2514,6 +2716,8 @@ <channel1>8</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-375</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -2521,6 +2725,7 @@ <NAME>NeuLANDPla1V-18</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>18</bar> <qcal0>1</qcal0> @@ -2551,6 +2756,8 @@ <channel1>7</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>-325</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -2558,6 +2765,7 @@ <NAME>NeuLANDPla1V-19</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>19</bar> <qcal0>1</qcal0> @@ -2588,6 +2796,8 @@ <channel1>6</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>-275</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -2595,6 +2805,7 @@ <NAME>NeuLANDPla1V-20</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>20</bar> <qcal0>1</qcal0> @@ -2625,6 +2836,8 @@ <channel1>5</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>-225</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -2632,6 +2845,7 @@ <NAME>NeuLANDPla1V-21</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>21</bar> <qcal0>1</qcal0> @@ -2662,6 +2876,8 @@ <channel1>4</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>-175</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -2669,6 +2885,7 @@ <NAME>NeuLANDPla1V-22</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>22</bar> <qcal0>1</qcal0> @@ -2699,6 +2916,8 @@ <channel1>3</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>-125</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -2706,6 +2925,7 @@ <NAME>NeuLANDPla1V-23</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>23</bar> <qcal0>1</qcal0> @@ -2736,6 +2956,8 @@ <channel1>2</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>-75</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -2743,6 +2965,7 @@ <NAME>NeuLANDPla1V-24</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>24</bar> <qcal0>1</qcal0> @@ -2773,6 +2996,8 @@ <channel1>1</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>-25</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -2780,6 +3005,7 @@ <NAME>NeuLANDPla1V-25</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>25</bar> <qcal0>1</qcal0> @@ -2810,6 +3036,8 @@ <channel1>0</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>25</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -2817,6 +3045,7 @@ <NAME>NeuLANDPla1V-26</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>26</bar> <qcal0>1</qcal0> @@ -2847,6 +3076,8 @@ <channel1>15</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>75</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -2854,6 +3085,7 @@ <NAME>NeuLANDPla1V-27</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>27</bar> <qcal0>1</qcal0> @@ -2884,6 +3116,8 @@ <channel1>14</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>125</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -2891,6 +3125,7 @@ <NAME>NeuLANDPla1V-28</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>28</bar> <qcal0>1</qcal0> @@ -2921,6 +3156,8 @@ <channel1>13</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>175</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -2928,6 +3165,7 @@ <NAME>NeuLANDPla1V-29</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>29</bar> <qcal0>1</qcal0> @@ -2958,6 +3196,8 @@ <channel1>12</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>225</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -2965,6 +3205,7 @@ <NAME>NeuLANDPla1V-30</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>30</bar> <qcal0>1</qcal0> @@ -2995,6 +3236,8 @@ <channel1>15</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>275</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -3002,6 +3245,7 @@ <NAME>NeuLANDPla1V-31</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>31</bar> <qcal0>1</qcal0> @@ -3032,6 +3276,8 @@ <channel1>14</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>325</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -3039,6 +3285,7 @@ <NAME>NeuLANDPla1V-32</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>32</bar> <qcal0>1</qcal0> @@ -3069,6 +3316,8 @@ <channel1>13</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>375</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -3076,6 +3325,7 @@ <NAME>NeuLANDPla1V-33</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>33</bar> <qcal0>1</qcal0> @@ -3106,6 +3356,8 @@ <channel1>12</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>425</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -3113,6 +3365,7 @@ <NAME>NeuLANDPla1V-34</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>34</bar> <qcal0>1</qcal0> @@ -3143,6 +3396,8 @@ <channel1>11</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>475</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -3150,6 +3405,7 @@ <NAME>NeuLANDPla1V-35</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>35</bar> <qcal0>1</qcal0> @@ -3180,6 +3436,8 @@ <channel1>10</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>525</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -3187,6 +3445,7 @@ <NAME>NeuLANDPla1V-36</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>36</bar> <qcal0>1</qcal0> @@ -3217,6 +3476,8 @@ <channel1>9</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>575</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -3224,6 +3485,7 @@ <NAME>NeuLANDPla1V-37</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>37</bar> <qcal0>1</qcal0> @@ -3254,6 +3516,8 @@ <channel1>8</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>625</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -3261,6 +3525,7 @@ <NAME>NeuLANDPla1V-38</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>38</bar> <qcal0>1</qcal0> @@ -3291,6 +3556,8 @@ <channel1>7</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>675</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -3298,6 +3565,7 @@ <NAME>NeuLANDPla1V-39</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>39</bar> <qcal0>1</qcal0> @@ -3328,6 +3596,8 @@ <channel1>6</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>725</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -3335,6 +3605,7 @@ <NAME>NeuLANDPla1V-40</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>40</bar> <qcal0>1</qcal0> @@ -3365,6 +3636,8 @@ <channel1>5</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>775</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -3372,6 +3645,7 @@ <NAME>NeuLANDPla1V-41</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>41</bar> <qcal0>1</qcal0> @@ -3402,6 +3676,8 @@ <channel1>4</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>825</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -3409,6 +3685,7 @@ <NAME>NeuLANDPla1V-42</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>42</bar> <qcal0>1</qcal0> @@ -3439,6 +3716,8 @@ <channel1>3</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>875</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -3446,6 +3725,7 @@ <NAME>NeuLANDPla1V-43</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>43</bar> <qcal0>1</qcal0> @@ -3476,6 +3756,8 @@ <channel1>2</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>925</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -3483,6 +3765,7 @@ <NAME>NeuLANDPla1V-44</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>44</bar> <qcal0>1</qcal0> @@ -3513,6 +3796,8 @@ <channel1>1</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>975</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -3520,6 +3805,7 @@ <NAME>NeuLANDPla1V-45</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>45</bar> <qcal0>1</qcal0> @@ -3550,6 +3836,8 @@ <channel1>0</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>1025</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -3557,6 +3845,7 @@ <NAME>NeuLANDPla1V-46</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>46</bar> <qcal0>1</qcal0> @@ -3587,6 +3876,8 @@ <channel1>15</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>1075</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -3594,6 +3885,7 @@ <NAME>NeuLANDPla1V-47</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>47</bar> <qcal0>1</qcal0> @@ -3624,6 +3916,8 @@ <channel1>14</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>1125</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -3631,6 +3925,7 @@ <NAME>NeuLANDPla1V-48</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>48</bar> <qcal0>1</qcal0> @@ -3661,6 +3956,8 @@ <channel1>13</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>1175</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -3668,6 +3965,7 @@ <NAME>NeuLANDPla1V-49</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>49</bar> <qcal0>1</qcal0> @@ -3698,6 +3996,8 @@ <channel1>12</channel1> <sam1>5</sam1> <gtb1>1</gtb1> +<xpos>1225</xpos> +<ypos>0</ypos> <zpos>11215</zpos> </NEULAND> <NEULAND> @@ -3705,6 +4005,7 @@ <NAME>NeuLANDPla2H-0</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>0</bar> <qcal0>1</qcal0> @@ -3735,6 +4036,8 @@ <channel1>1</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-1225</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -3742,6 +4045,7 @@ <NAME>NeuLANDPla2H-1</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>1</bar> <qcal0>1</qcal0> @@ -3772,6 +4076,8 @@ <channel1>0</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-1175</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -3779,6 +4085,7 @@ <NAME>NeuLANDPla2H-2</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>2</bar> <qcal0>1</qcal0> @@ -3809,6 +4116,8 @@ <channel1>15</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-1125</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -3816,6 +4125,7 @@ <NAME>NeuLANDPla2H-3</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>3</bar> <qcal0>1</qcal0> @@ -3846,6 +4156,8 @@ <channel1>14</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-1075</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -3853,6 +4165,7 @@ <NAME>NeuLANDPla2H-4</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>4</bar> <qcal0>1</qcal0> @@ -3883,6 +4196,8 @@ <channel1>13</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-1025</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -3890,6 +4205,7 @@ <NAME>NeuLANDPla2H-5</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>5</bar> <qcal0>1</qcal0> @@ -3920,6 +4236,8 @@ <channel1>12</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-975</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -3927,6 +4245,7 @@ <NAME>NeuLANDPla2H-6</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>6</bar> <qcal0>1</qcal0> @@ -3957,6 +4276,8 @@ <channel1>11</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-925</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -3964,6 +4285,7 @@ <NAME>NeuLANDPla2H-7</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>7</bar> <qcal0>1</qcal0> @@ -3994,6 +4316,8 @@ <channel1>10</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-875</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -4001,6 +4325,7 @@ <NAME>NeuLANDPla2H-8</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>8</bar> <qcal0>1</qcal0> @@ -4031,6 +4356,8 @@ <channel1>9</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-825</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -4038,6 +4365,7 @@ <NAME>NeuLANDPla2H-9</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>9</bar> <qcal0>1</qcal0> @@ -4068,6 +4396,8 @@ <channel1>8</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-775</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -4075,6 +4405,7 @@ <NAME>NeuLANDPla2H-10</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>10</bar> <qcal0>1</qcal0> @@ -4105,6 +4436,8 @@ <channel1>7</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-725</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -4112,6 +4445,7 @@ <NAME>NeuLANDPla2H-11</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>11</bar> <qcal0>1</qcal0> @@ -4142,6 +4476,8 @@ <channel1>6</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-675</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -4149,6 +4485,7 @@ <NAME>NeuLANDPla2H-12</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>12</bar> <qcal0>1</qcal0> @@ -4179,6 +4516,8 @@ <channel1>5</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-625</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -4186,6 +4525,7 @@ <NAME>NeuLANDPla2H-13</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>13</bar> <qcal0>1</qcal0> @@ -4216,6 +4556,8 @@ <channel1>4</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-575</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -4223,6 +4565,7 @@ <NAME>NeuLANDPla2H-14</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>14</bar> <qcal0>1</qcal0> @@ -4253,6 +4596,8 @@ <channel1>3</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-525</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -4260,6 +4605,7 @@ <NAME>NeuLANDPla2H-15</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>15</bar> <qcal0>1</qcal0> @@ -4290,6 +4636,8 @@ <channel1>2</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-475</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -4297,6 +4645,7 @@ <NAME>NeuLANDPla2H-16</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>16</bar> <qcal0>1</qcal0> @@ -4327,6 +4676,8 @@ <channel1>1</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-425</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -4334,6 +4685,7 @@ <NAME>NeuLANDPla2H-17</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>17</bar> <qcal0>1</qcal0> @@ -4364,6 +4716,8 @@ <channel1>0</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-375</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -4371,6 +4725,7 @@ <NAME>NeuLANDPla2H-18</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>18</bar> <qcal0>1</qcal0> @@ -4401,6 +4756,8 @@ <channel1>15</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-325</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -4408,6 +4765,7 @@ <NAME>NeuLANDPla2H-19</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>19</bar> <qcal0>1</qcal0> @@ -4438,6 +4796,8 @@ <channel1>14</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-275</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -4445,6 +4805,7 @@ <NAME>NeuLANDPla2H-20</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>20</bar> <qcal0>1</qcal0> @@ -4475,6 +4836,8 @@ <channel1>13</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-225</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -4482,6 +4845,7 @@ <NAME>NeuLANDPla2H-21</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>21</bar> <qcal0>1</qcal0> @@ -4512,6 +4876,8 @@ <channel1>12</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-175</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -4519,6 +4885,7 @@ <NAME>NeuLANDPla2H-22</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>22</bar> <qcal0>1</qcal0> @@ -4549,6 +4916,8 @@ <channel1>11</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-125</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -4556,6 +4925,7 @@ <NAME>NeuLANDPla2H-23</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>23</bar> <qcal0>1</qcal0> @@ -4586,6 +4956,8 @@ <channel1>10</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-75</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -4593,6 +4965,7 @@ <NAME>NeuLANDPla2H-24</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>24</bar> <qcal0>1</qcal0> @@ -4623,6 +4996,8 @@ <channel1>9</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-25</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -4630,6 +5005,7 @@ <NAME>NeuLANDPla2H-25</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>25</bar> <qcal0>1</qcal0> @@ -4660,6 +5036,8 @@ <channel1>8</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>25</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -4667,6 +5045,7 @@ <NAME>NeuLANDPla2H-26</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>26</bar> <qcal0>1</qcal0> @@ -4697,6 +5076,8 @@ <channel1>7</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>75</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -4704,6 +5085,7 @@ <NAME>NeuLANDPla2H-27</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>27</bar> <qcal0>1</qcal0> @@ -4734,6 +5116,8 @@ <channel1>6</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>125</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -4741,6 +5125,7 @@ <NAME>NeuLANDPla2H-28</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>28</bar> <qcal0>1</qcal0> @@ -4771,6 +5156,8 @@ <channel1>5</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>175</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -4778,6 +5165,7 @@ <NAME>NeuLANDPla2H-29</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>29</bar> <qcal0>1</qcal0> @@ -4808,6 +5196,8 @@ <channel1>4</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>225</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -4815,6 +5205,7 @@ <NAME>NeuLANDPla2H-30</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>30</bar> <qcal0>1</qcal0> @@ -4845,6 +5236,8 @@ <channel1>10</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>275</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -4852,6 +5245,7 @@ <NAME>NeuLANDPla2H-31</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>31</bar> <qcal0>1</qcal0> @@ -4882,6 +5276,8 @@ <channel1>2</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>325</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -4889,6 +5285,7 @@ <NAME>NeuLANDPla2H-32</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>32</bar> <qcal0>1</qcal0> @@ -4919,6 +5316,8 @@ <channel1>1</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>375</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -4926,6 +5325,7 @@ <NAME>NeuLANDPla2H-33</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>33</bar> <qcal0>1</qcal0> @@ -4956,6 +5356,8 @@ <channel1>0</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>425</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -4963,6 +5365,7 @@ <NAME>NeuLANDPla2H-34</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>34</bar> <qcal0>1</qcal0> @@ -4993,6 +5396,8 @@ <channel1>15</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>475</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -5000,6 +5405,7 @@ <NAME>NeuLANDPla2H-35</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>35</bar> <qcal0>1</qcal0> @@ -5030,6 +5436,8 @@ <channel1>14</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>525</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -5037,6 +5445,7 @@ <NAME>NeuLANDPla2H-36</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>36</bar> <qcal0>1</qcal0> @@ -5067,6 +5476,8 @@ <channel1>13</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>575</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -5074,6 +5485,7 @@ <NAME>NeuLANDPla2H-37</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>37</bar> <qcal0>1</qcal0> @@ -5104,6 +5516,8 @@ <channel1>12</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>625</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -5111,6 +5525,7 @@ <NAME>NeuLANDPla2H-38</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>38</bar> <qcal0>1</qcal0> @@ -5141,6 +5556,8 @@ <channel1>11</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>675</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -5148,6 +5565,7 @@ <NAME>NeuLANDPla2H-39</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>39</bar> <qcal0>1</qcal0> @@ -5178,6 +5596,8 @@ <channel1>10</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>725</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -5185,6 +5605,7 @@ <NAME>NeuLANDPla2H-40</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>40</bar> <qcal0>1</qcal0> @@ -5215,6 +5636,8 @@ <channel1>9</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>775</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -5222,6 +5645,7 @@ <NAME>NeuLANDPla2H-41</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>41</bar> <qcal0>1</qcal0> @@ -5252,6 +5676,8 @@ <channel1>8</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>825</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -5259,6 +5685,7 @@ <NAME>NeuLANDPla2H-42</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>42</bar> <qcal0>1</qcal0> @@ -5289,6 +5716,8 @@ <channel1>7</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>875</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -5296,6 +5725,7 @@ <NAME>NeuLANDPla2H-43</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>43</bar> <qcal0>1</qcal0> @@ -5326,6 +5756,8 @@ <channel1>6</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>925</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -5333,6 +5765,7 @@ <NAME>NeuLANDPla2H-44</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>44</bar> <qcal0>1</qcal0> @@ -5363,6 +5796,8 @@ <channel1>5</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>975</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -5370,6 +5805,7 @@ <NAME>NeuLANDPla2H-45</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>45</bar> <qcal0>1</qcal0> @@ -5400,6 +5836,8 @@ <channel1>4</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>1025</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -5407,6 +5845,7 @@ <NAME>NeuLANDPla2H-46</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>46</bar> <qcal0>1</qcal0> @@ -5437,6 +5876,8 @@ <channel1>3</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>1075</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -5444,6 +5885,7 @@ <NAME>NeuLANDPla2H-47</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>47</bar> <qcal0>1</qcal0> @@ -5474,6 +5916,8 @@ <channel1>2</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>1125</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -5481,6 +5925,7 @@ <NAME>NeuLANDPla2H-48</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>48</bar> <qcal0>1</qcal0> @@ -5511,6 +5956,8 @@ <channel1>1</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>1175</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -5518,6 +5965,7 @@ <NAME>NeuLANDPla2H-49</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>2</layer> <bar>49</bar> <qcal0>1</qcal0> @@ -5548,6 +5996,8 @@ <channel1>0</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>1225</ypos> <zpos>11265</zpos> </NEULAND> <NEULAND> @@ -5555,6 +6005,7 @@ <NAME>NeuLANDPla3V-0</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>0</bar> <qcal0>1</qcal0> @@ -5585,6 +6036,8 @@ <channel1>9</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-1225</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -5592,6 +6045,7 @@ <NAME>NeuLANDPla3V-1</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>1</bar> <qcal0>1</qcal0> @@ -5622,6 +6076,8 @@ <channel1>8</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-1175</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -5629,6 +6085,7 @@ <NAME>NeuLANDPla3V-2</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>2</bar> <qcal0>1</qcal0> @@ -5659,6 +6116,8 @@ <channel1>7</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-1125</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -5666,6 +6125,7 @@ <NAME>NeuLANDPla3V-3</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>3</bar> <qcal0>1</qcal0> @@ -5696,6 +6156,8 @@ <channel1>6</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-1075</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -5703,6 +6165,7 @@ <NAME>NeuLANDPla3V-4</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>4</bar> <qcal0>1</qcal0> @@ -5733,6 +6196,8 @@ <channel1>5</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-1025</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -5740,6 +6205,7 @@ <NAME>NeuLANDPla3V-5</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>5</bar> <qcal0>1</qcal0> @@ -5770,6 +6236,8 @@ <channel1>4</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-975</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -5777,6 +6245,7 @@ <NAME>NeuLANDPla3V-6</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>6</bar> <qcal0>1</qcal0> @@ -5807,6 +6276,8 @@ <channel1>3</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-925</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -5814,6 +6285,7 @@ <NAME>NeuLANDPla3V-7</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>7</bar> <qcal0>1</qcal0> @@ -5844,6 +6316,8 @@ <channel1>2</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-875</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -5851,6 +6325,7 @@ <NAME>NeuLANDPla3V-8</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>8</bar> <qcal0>1</qcal0> @@ -5881,6 +6356,8 @@ <channel1>1</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-825</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -5888,6 +6365,7 @@ <NAME>NeuLANDPla3V-9</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>9</bar> <qcal0>1</qcal0> @@ -5918,6 +6396,8 @@ <channel1>0</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-775</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -5925,6 +6405,7 @@ <NAME>NeuLANDPla3V-10</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>10</bar> <qcal0>1</qcal0> @@ -5955,6 +6436,8 @@ <channel1>15</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-725</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -5962,6 +6445,7 @@ <NAME>NeuLANDPla3V-11</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>11</bar> <qcal0>1</qcal0> @@ -5992,6 +6476,8 @@ <channel1>14</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-675</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -5999,6 +6485,7 @@ <NAME>NeuLANDPla3V-12</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>12</bar> <qcal0>1</qcal0> @@ -6029,6 +6516,8 @@ <channel1>13</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-625</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -6036,6 +6525,7 @@ <NAME>NeuLANDPla3V-13</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>13</bar> <qcal0>1</qcal0> @@ -6066,6 +6556,8 @@ <channel1>12</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-575</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -6073,6 +6565,7 @@ <NAME>NeuLANDPla3V-14</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>14</bar> <qcal0>1</qcal0> @@ -6103,6 +6596,8 @@ <channel1>11</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-525</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -6110,6 +6605,7 @@ <NAME>NeuLANDPla3V-15</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>15</bar> <qcal0>1</qcal0> @@ -6140,6 +6636,8 @@ <channel1>10</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-475</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -6147,6 +6645,7 @@ <NAME>NeuLANDPla3V-16</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>16</bar> <qcal0>1</qcal0> @@ -6177,6 +6676,8 @@ <channel1>9</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-425</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -6184,6 +6685,7 @@ <NAME>NeuLANDPla3V-17</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>17</bar> <qcal0>1</qcal0> @@ -6214,6 +6716,8 @@ <channel1>8</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-375</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -6221,6 +6725,7 @@ <NAME>NeuLANDPla3V-18</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>18</bar> <qcal0>1</qcal0> @@ -6251,6 +6756,8 @@ <channel1>7</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-325</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -6258,6 +6765,7 @@ <NAME>NeuLANDPla3V-19</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>19</bar> <qcal0>1</qcal0> @@ -6288,6 +6796,8 @@ <channel1>6</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-275</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -6295,6 +6805,7 @@ <NAME>NeuLANDPla3V-20</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>20</bar> <qcal0>1</qcal0> @@ -6325,6 +6836,8 @@ <channel1>5</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-225</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -6332,6 +6845,7 @@ <NAME>NeuLANDPla3V-21</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>21</bar> <qcal0>1</qcal0> @@ -6362,6 +6876,8 @@ <channel1>4</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-175</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -6369,6 +6885,7 @@ <NAME>NeuLANDPla3V-22</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>22</bar> <qcal0>1</qcal0> @@ -6399,6 +6916,8 @@ <channel1>3</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-125</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -6406,6 +6925,7 @@ <NAME>NeuLANDPla3V-23</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>23</bar> <qcal0>1</qcal0> @@ -6436,6 +6956,8 @@ <channel1>2</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-75</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -6443,6 +6965,7 @@ <NAME>NeuLANDPla3V-24</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>24</bar> <qcal0>1</qcal0> @@ -6473,6 +6996,8 @@ <channel1>1</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>-25</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -6480,6 +7005,7 @@ <NAME>NeuLANDPla3V-25</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>25</bar> <qcal0>1</qcal0> @@ -6510,6 +7036,8 @@ <channel1>0</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>25</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -6517,6 +7045,7 @@ <NAME>NeuLANDPla3V-26</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>26</bar> <qcal0>1</qcal0> @@ -6547,6 +7076,8 @@ <channel1>15</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>75</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -6554,6 +7085,7 @@ <NAME>NeuLANDPla3V-27</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>27</bar> <qcal0>1</qcal0> @@ -6584,6 +7116,8 @@ <channel1>14</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>125</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -6591,6 +7125,7 @@ <NAME>NeuLANDPla3V-28</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>28</bar> <qcal0>1</qcal0> @@ -6621,6 +7156,8 @@ <channel1>13</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>175</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -6628,6 +7165,7 @@ <NAME>NeuLANDPla3V-29</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>29</bar> <qcal0>1</qcal0> @@ -6658,6 +7196,8 @@ <channel1>12</channel1> <sam1>6</sam1> <gtb1>1</gtb1> +<xpos>225</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -6665,6 +7205,7 @@ <NAME>NeuLANDPla3V-30</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>30</bar> <qcal0>1</qcal0> @@ -6695,6 +7236,8 @@ <channel1>15</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>275</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -6702,6 +7245,7 @@ <NAME>NeuLANDPla3V-31</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>31</bar> <qcal0>1</qcal0> @@ -6732,6 +7276,8 @@ <channel1>14</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>325</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -6739,6 +7285,7 @@ <NAME>NeuLANDPla3V-32</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>32</bar> <qcal0>1</qcal0> @@ -6769,6 +7316,8 @@ <channel1>13</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>375</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -6776,6 +7325,7 @@ <NAME>NeuLANDPla3V-33</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>33</bar> <qcal0>1</qcal0> @@ -6806,6 +7356,8 @@ <channel1>12</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>425</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -6813,6 +7365,7 @@ <NAME>NeuLANDPla3V-34</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>34</bar> <qcal0>1</qcal0> @@ -6843,6 +7396,8 @@ <channel1>11</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>475</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -6850,6 +7405,7 @@ <NAME>NeuLANDPla3V-35</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>35</bar> <qcal0>1</qcal0> @@ -6880,6 +7436,8 @@ <channel1>10</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>525</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -6887,6 +7445,7 @@ <NAME>NeuLANDPla3V-36</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>36</bar> <qcal0>1</qcal0> @@ -6917,6 +7476,8 @@ <channel1>9</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>575</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -6924,6 +7485,7 @@ <NAME>NeuLANDPla3V-37</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>37</bar> <qcal0>1</qcal0> @@ -6954,6 +7516,8 @@ <channel1>8</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>625</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -6961,6 +7525,7 @@ <NAME>NeuLANDPla3V-38</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>38</bar> <qcal0>1</qcal0> @@ -6991,6 +7556,8 @@ <channel1>7</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>675</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -6998,6 +7565,7 @@ <NAME>NeuLANDPla3V-39</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>39</bar> <qcal0>1</qcal0> @@ -7028,6 +7596,8 @@ <channel1>6</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>725</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -7035,6 +7605,7 @@ <NAME>NeuLANDPla3V-40</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>40</bar> <qcal0>1</qcal0> @@ -7065,6 +7636,8 @@ <channel1>5</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>775</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -7072,6 +7645,7 @@ <NAME>NeuLANDPla3V-41</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>41</bar> <qcal0>1</qcal0> @@ -7102,6 +7676,8 @@ <channel1>4</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>825</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -7109,6 +7685,7 @@ <NAME>NeuLANDPla3V-42</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>42</bar> <qcal0>1</qcal0> @@ -7139,6 +7716,8 @@ <channel1>3</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>875</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -7146,6 +7725,7 @@ <NAME>NeuLANDPla3V-43</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>43</bar> <qcal0>1</qcal0> @@ -7176,6 +7756,8 @@ <channel1>2</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>925</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -7183,6 +7765,7 @@ <NAME>NeuLANDPla3V-44</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>44</bar> <qcal0>1</qcal0> @@ -7213,6 +7796,8 @@ <channel1>1</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>975</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -7220,6 +7805,7 @@ <NAME>NeuLANDPla3V-45</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>45</bar> <qcal0>1</qcal0> @@ -7250,6 +7836,8 @@ <channel1>0</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>1025</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -7257,6 +7845,7 @@ <NAME>NeuLANDPla3V-46</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>46</bar> <qcal0>1</qcal0> @@ -7287,6 +7876,8 @@ <channel1>15</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>1075</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -7294,6 +7885,7 @@ <NAME>NeuLANDPla3V-47</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>47</bar> <qcal0>1</qcal0> @@ -7324,6 +7916,8 @@ <channel1>14</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>1125</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -7331,6 +7925,7 @@ <NAME>NeuLANDPla3V-48</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>48</bar> <qcal0>1</qcal0> @@ -7361,6 +7956,8 @@ <channel1>13</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>1175</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -7368,6 +7965,7 @@ <NAME>NeuLANDPla3V-49</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>3</layer> <bar>49</bar> <qcal0>1</qcal0> @@ -7398,6 +7996,8 @@ <channel1>12</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>1225</xpos> +<ypos>0</ypos> <zpos>11315</zpos> </NEULAND> <NEULAND> @@ -7405,6 +8005,7 @@ <NAME>NeuLANDPla4H-0</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>0</bar> <qcal0>1</qcal0> @@ -7435,6 +8036,8 @@ <channel1>1</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-1225</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -7442,6 +8045,7 @@ <NAME>NeuLANDPla4H-1</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>1</bar> <qcal0>1</qcal0> @@ -7472,6 +8076,8 @@ <channel1>0</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-1175</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -7479,6 +8085,7 @@ <NAME>NeuLANDPla4H-2</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>2</bar> <qcal0>1</qcal0> @@ -7509,6 +8116,8 @@ <channel1>15</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-1125</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -7516,6 +8125,7 @@ <NAME>NeuLANDPla4H-3</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>3</bar> <qcal0>1</qcal0> @@ -7546,6 +8156,8 @@ <channel1>14</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-1075</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -7553,6 +8165,7 @@ <NAME>NeuLANDPla4H-4</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>4</bar> <qcal0>1</qcal0> @@ -7583,6 +8196,8 @@ <channel1>13</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-1025</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -7590,6 +8205,7 @@ <NAME>NeuLANDPla4H-5</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>5</bar> <qcal0>1</qcal0> @@ -7620,6 +8236,8 @@ <channel1>12</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-975</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -7627,6 +8245,7 @@ <NAME>NeuLANDPla4H-6</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>6</bar> <qcal0>1</qcal0> @@ -7657,6 +8276,8 @@ <channel1>11</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-925</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -7664,6 +8285,7 @@ <NAME>NeuLANDPla4H-7</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>7</bar> <qcal0>1</qcal0> @@ -7694,6 +8316,8 @@ <channel1>10</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-875</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -7701,6 +8325,7 @@ <NAME>NeuLANDPla4H-8</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>8</bar> <qcal0>1</qcal0> @@ -7731,6 +8356,8 @@ <channel1>9</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-825</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -7738,6 +8365,7 @@ <NAME>NeuLANDPla4H-9</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>9</bar> <qcal0>1</qcal0> @@ -7768,6 +8396,8 @@ <channel1>8</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-775</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -7775,6 +8405,7 @@ <NAME>NeuLANDPla4H-10</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>10</bar> <qcal0>1</qcal0> @@ -7805,6 +8436,8 @@ <channel1>7</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-725</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -7812,6 +8445,7 @@ <NAME>NeuLANDPla4H-11</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>11</bar> <qcal0>1</qcal0> @@ -7842,6 +8476,8 @@ <channel1>6</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-675</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -7849,6 +8485,7 @@ <NAME>NeuLANDPla4H-12</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>12</bar> <qcal0>1</qcal0> @@ -7879,6 +8516,8 @@ <channel1>5</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-625</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -7886,6 +8525,7 @@ <NAME>NeuLANDPla4H-13</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>13</bar> <qcal0>1</qcal0> @@ -7916,6 +8556,8 @@ <channel1>4</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-575</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -7923,6 +8565,7 @@ <NAME>NeuLANDPla4H-14</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>14</bar> <qcal0>1</qcal0> @@ -7953,6 +8596,8 @@ <channel1>3</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-525</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -7960,6 +8605,7 @@ <NAME>NeuLANDPla4H-15</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>15</bar> <qcal0>1</qcal0> @@ -7990,6 +8636,8 @@ <channel1>2</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-475</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -7997,6 +8645,7 @@ <NAME>NeuLANDPla4H-16</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>16</bar> <qcal0>1</qcal0> @@ -8027,6 +8676,8 @@ <channel1>1</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-425</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -8034,6 +8685,7 @@ <NAME>NeuLANDPla4H-17</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>17</bar> <qcal0>1</qcal0> @@ -8064,6 +8716,8 @@ <channel1>0</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-375</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -8071,6 +8725,7 @@ <NAME>NeuLANDPla4H-18</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>18</bar> <qcal0>1</qcal0> @@ -8101,6 +8756,8 @@ <channel1>15</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-325</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -8108,6 +8765,7 @@ <NAME>NeuLANDPla4H-19</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>19</bar> <qcal0>1</qcal0> @@ -8138,6 +8796,8 @@ <channel1>14</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-275</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -8145,6 +8805,7 @@ <NAME>NeuLANDPla4H-20</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>20</bar> <qcal0>1</qcal0> @@ -8175,6 +8836,8 @@ <channel1>13</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-225</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -8182,6 +8845,7 @@ <NAME>NeuLANDPla4H-21</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>21</bar> <qcal0>1</qcal0> @@ -8212,6 +8876,8 @@ <channel1>12</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-175</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -8219,6 +8885,7 @@ <NAME>NeuLANDPla4H-22</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>22</bar> <qcal0>1</qcal0> @@ -8249,6 +8916,8 @@ <channel1>11</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-125</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -8256,6 +8925,7 @@ <NAME>NeuLANDPla4H-23</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>23</bar> <qcal0>1</qcal0> @@ -8286,6 +8956,8 @@ <channel1>10</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-75</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -8293,6 +8965,7 @@ <NAME>NeuLANDPla4H-24</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>24</bar> <qcal0>1</qcal0> @@ -8323,6 +8996,8 @@ <channel1>9</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>-25</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -8330,6 +9005,7 @@ <NAME>NeuLANDPla4H-25</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>25</bar> <qcal0>1</qcal0> @@ -8360,6 +9036,8 @@ <channel1>8</channel1> <sam1>7</sam1> <gtb1>1</gtb1> +<xpos>0</xpos> +<ypos>25</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -8367,6 +9045,7 @@ <NAME>NeuLANDPla4H-26</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>26</bar> <qcal0>1</qcal0> @@ -8397,6 +9076,8 @@ <channel1>7</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>75</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -8404,6 +9085,7 @@ <NAME>NeuLANDPla4H-27</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>27</bar> <qcal0>1</qcal0> @@ -8434,6 +9116,8 @@ <channel1>6</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>125</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -8441,6 +9125,7 @@ <NAME>NeuLANDPla4H-28</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>28</bar> <qcal0>1</qcal0> @@ -8471,6 +9156,8 @@ <channel1>5</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>175</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -8478,6 +9165,7 @@ <NAME>NeuLANDPla4H-29</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>29</bar> <qcal0>1</qcal0> @@ -8508,6 +9196,8 @@ <channel1>4</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>225</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -8515,6 +9205,7 @@ <NAME>NeuLANDPla4H-30</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>30</bar> <qcal0>1</qcal0> @@ -8545,6 +9236,8 @@ <channel1>3</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>275</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -8552,6 +9245,7 @@ <NAME>NeuLANDPla4H-31</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>31</bar> <qcal0>1</qcal0> @@ -8582,6 +9276,8 @@ <channel1>2</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>325</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -8589,6 +9285,7 @@ <NAME>NeuLANDPla4H-32</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>32</bar> <qcal0>1</qcal0> @@ -8619,6 +9316,8 @@ <channel1>1</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>375</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -8626,6 +9325,7 @@ <NAME>NeuLANDPla4H-33</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>33</bar> <qcal0>1</qcal0> @@ -8656,6 +9356,8 @@ <channel1>0</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>425</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -8663,6 +9365,7 @@ <NAME>NeuLANDPla4H-34</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>34</bar> <qcal0>1</qcal0> @@ -8693,6 +9396,8 @@ <channel1>15</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>475</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -8700,6 +9405,7 @@ <NAME>NeuLANDPla4H-35</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>35</bar> <qcal0>1</qcal0> @@ -8730,6 +9436,8 @@ <channel1>14</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>525</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -8737,6 +9445,7 @@ <NAME>NeuLANDPla4H-36</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>36</bar> <qcal0>1</qcal0> @@ -8767,6 +9476,8 @@ <channel1>13</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>575</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -8774,6 +9485,7 @@ <NAME>NeuLANDPla4H-37</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>37</bar> <qcal0>1</qcal0> @@ -8804,6 +9516,8 @@ <channel1>12</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>625</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -8811,6 +9525,7 @@ <NAME>NeuLANDPla4H-38</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>38</bar> <qcal0>1</qcal0> @@ -8841,6 +9556,8 @@ <channel1>11</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>675</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -8848,6 +9565,7 @@ <NAME>NeuLANDPla4H-39</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>39</bar> <qcal0>1</qcal0> @@ -8878,6 +9596,8 @@ <channel1>10</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>725</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -8885,6 +9605,7 @@ <NAME>NeuLANDPla4H-40</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>40</bar> <qcal0>1</qcal0> @@ -8915,6 +9636,8 @@ <channel1>9</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>775</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -8922,6 +9645,7 @@ <NAME>NeuLANDPla4H-41</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>41</bar> <qcal0>1</qcal0> @@ -8952,6 +9676,8 @@ <channel1>8</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>825</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -8959,6 +9685,7 @@ <NAME>NeuLANDPla4H-42</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>42</bar> <qcal0>1</qcal0> @@ -8989,6 +9716,8 @@ <channel1>7</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>875</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -8996,6 +9725,7 @@ <NAME>NeuLANDPla4H-43</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>43</bar> <qcal0>1</qcal0> @@ -9026,6 +9756,8 @@ <channel1>6</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>925</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -9033,6 +9765,7 @@ <NAME>NeuLANDPla4H-44</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>44</bar> <qcal0>1</qcal0> @@ -9063,6 +9796,8 @@ <channel1>5</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>975</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -9070,6 +9805,7 @@ <NAME>NeuLANDPla4H-45</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>45</bar> <qcal0>1</qcal0> @@ -9100,6 +9836,8 @@ <channel1>4</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>1025</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -9107,6 +9845,7 @@ <NAME>NeuLANDPla4H-46</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>46</bar> <qcal0>1</qcal0> @@ -9137,6 +9876,8 @@ <channel1>3</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>1075</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -9144,6 +9885,7 @@ <NAME>NeuLANDPla4H-47</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>47</bar> <qcal0>1</qcal0> @@ -9174,6 +9916,8 @@ <channel1>2</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>1125</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -9181,6 +9925,7 @@ <NAME>NeuLANDPla4H-48</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>48</bar> <qcal0>1</qcal0> @@ -9211,6 +9956,8 @@ <channel1>1</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>1175</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -9218,6 +9965,7 @@ <NAME>NeuLANDPla4H-49</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>4</layer> <bar>49</bar> <qcal0>1</qcal0> @@ -9248,6 +9996,8 @@ <channel1>0</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>1225</ypos> <zpos>11365</zpos> </NEULAND> <NEULAND> @@ -9255,6 +10005,7 @@ <NAME>NeuLANDPla5V-0</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>0</bar> <qcal0>1</qcal0> @@ -9285,6 +10036,8 @@ <channel1>9</channel1> <sam1>6</sam1> <gtb1>0</gtb1> +<xpos>-1225</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -9292,6 +10045,7 @@ <NAME>NeuLANDPla5V-1</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>1</bar> <qcal0>1</qcal0> @@ -9322,6 +10076,8 @@ <channel1>8</channel1> <sam1>6</sam1> <gtb1>0</gtb1> +<xpos>-1175</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -9329,6 +10085,7 @@ <NAME>NeuLANDPla5V-2</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>2</bar> <qcal0>1</qcal0> @@ -9359,6 +10116,8 @@ <channel1>7</channel1> <sam1>6</sam1> <gtb1>0</gtb1> +<xpos>-1125</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -9366,6 +10125,7 @@ <NAME>NeuLANDPla5V-3</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>3</bar> <qcal0>1</qcal0> @@ -9396,6 +10156,8 @@ <channel1>6</channel1> <sam1>6</sam1> <gtb1>0</gtb1> +<xpos>-1075</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -9403,6 +10165,7 @@ <NAME>NeuLANDPla5V-4</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>4</bar> <qcal0>1</qcal0> @@ -9433,6 +10196,8 @@ <channel1>5</channel1> <sam1>6</sam1> <gtb1>0</gtb1> +<xpos>-1025</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -9440,6 +10205,7 @@ <NAME>NeuLANDPla5V-5</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>5</bar> <qcal0>1</qcal0> @@ -9470,6 +10236,8 @@ <channel1>4</channel1> <sam1>6</sam1> <gtb1>0</gtb1> +<xpos>-975</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -9477,6 +10245,7 @@ <NAME>NeuLANDPla5V-6</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>6</bar> <qcal0>1</qcal0> @@ -9507,6 +10276,8 @@ <channel1>3</channel1> <sam1>6</sam1> <gtb1>0</gtb1> +<xpos>-925</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -9514,6 +10285,7 @@ <NAME>NeuLANDPla5V-7</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>7</bar> <qcal0>1</qcal0> @@ -9544,6 +10316,8 @@ <channel1>2</channel1> <sam1>6</sam1> <gtb1>0</gtb1> +<xpos>-875</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -9551,6 +10325,7 @@ <NAME>NeuLANDPla5V-8</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>8</bar> <qcal0>1</qcal0> @@ -9581,6 +10356,8 @@ <channel1>1</channel1> <sam1>6</sam1> <gtb1>0</gtb1> +<xpos>-825</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -9588,6 +10365,7 @@ <NAME>NeuLANDPla5V-9</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>9</bar> <qcal0>1</qcal0> @@ -9618,6 +10396,8 @@ <channel1>0</channel1> <sam1>6</sam1> <gtb1>0</gtb1> +<xpos>-775</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -9625,6 +10405,7 @@ <NAME>NeuLANDPla5V-10</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>10</bar> <qcal0>1</qcal0> @@ -9655,6 +10436,8 @@ <channel1>15</channel1> <sam1>6</sam1> <gtb1>0</gtb1> +<xpos>-725</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -9662,6 +10445,7 @@ <NAME>NeuLANDPla5V-11</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>11</bar> <qcal0>1</qcal0> @@ -9692,6 +10476,8 @@ <channel1>14</channel1> <sam1>6</sam1> <gtb1>0</gtb1> +<xpos>-675</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -9699,6 +10485,7 @@ <NAME>NeuLANDPla5V-12</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>12</bar> <qcal0>1</qcal0> @@ -9729,6 +10516,8 @@ <channel1>13</channel1> <sam1>6</sam1> <gtb1>0</gtb1> +<xpos>-625</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -9736,6 +10525,7 @@ <NAME>NeuLANDPla5V-13</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>13</bar> <qcal0>1</qcal0> @@ -9766,6 +10556,8 @@ <channel1>12</channel1> <sam1>6</sam1> <gtb1>0</gtb1> +<xpos>-575</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -9773,6 +10565,7 @@ <NAME>NeuLANDPla5V-14</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>14</bar> <qcal0>1</qcal0> @@ -9803,6 +10596,8 @@ <channel1>11</channel1> <sam1>6</sam1> <gtb1>0</gtb1> +<xpos>-525</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -9810,6 +10605,7 @@ <NAME>NeuLANDPla5V-15</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>15</bar> <qcal0>1</qcal0> @@ -9840,6 +10636,8 @@ <channel1>10</channel1> <sam1>6</sam1> <gtb1>0</gtb1> +<xpos>-475</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -9847,6 +10645,7 @@ <NAME>NeuLANDPla5V-16</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>16</bar> <qcal0>1</qcal0> @@ -9877,6 +10676,8 @@ <channel1>9</channel1> <sam1>6</sam1> <gtb1>0</gtb1> +<xpos>-425</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -9884,6 +10685,7 @@ <NAME>NeuLANDPla5V-17</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>17</bar> <qcal0>1</qcal0> @@ -9914,6 +10716,8 @@ <channel1>8</channel1> <sam1>6</sam1> <gtb1>0</gtb1> +<xpos>-375</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -9921,6 +10725,7 @@ <NAME>NeuLANDPla5V-18</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>18</bar> <qcal0>1</qcal0> @@ -9951,6 +10756,8 @@ <channel1>7</channel1> <sam1>6</sam1> <gtb1>0</gtb1> +<xpos>-325</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -9958,6 +10765,7 @@ <NAME>NeuLANDPla5V-19</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>19</bar> <qcal0>1</qcal0> @@ -9988,6 +10796,8 @@ <channel1>6</channel1> <sam1>6</sam1> <gtb1>0</gtb1> +<xpos>-275</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -9995,6 +10805,7 @@ <NAME>NeuLANDPla5V-20</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>20</bar> <qcal0>1</qcal0> @@ -10025,6 +10836,8 @@ <channel1>5</channel1> <sam1>6</sam1> <gtb1>0</gtb1> +<xpos>-225</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -10032,6 +10845,7 @@ <NAME>NeuLANDPla5V-21</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>21</bar> <qcal0>1</qcal0> @@ -10062,6 +10876,8 @@ <channel1>4</channel1> <sam1>6</sam1> <gtb1>0</gtb1> +<xpos>-175</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -10069,6 +10885,7 @@ <NAME>NeuLANDPla5V-22</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>22</bar> <qcal0>1</qcal0> @@ -10099,6 +10916,8 @@ <channel1>3</channel1> <sam1>6</sam1> <gtb1>0</gtb1> +<xpos>-125</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -10106,6 +10925,7 @@ <NAME>NeuLANDPla5V-23</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>23</bar> <qcal0>1</qcal0> @@ -10136,6 +10956,8 @@ <channel1>2</channel1> <sam1>6</sam1> <gtb1>0</gtb1> +<xpos>-75</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -10143,6 +10965,7 @@ <NAME>NeuLANDPla5V-24</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>24</bar> <qcal0>1</qcal0> @@ -10173,6 +10996,8 @@ <channel1>1</channel1> <sam1>6</sam1> <gtb1>0</gtb1> +<xpos>-25</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -10180,6 +11005,7 @@ <NAME>NeuLANDPla5V-25</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>25</bar> <qcal0>1</qcal0> @@ -10210,6 +11036,8 @@ <channel1>0</channel1> <sam1>6</sam1> <gtb1>0</gtb1> +<xpos>25</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -10217,6 +11045,7 @@ <NAME>NeuLANDPla5V-26</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>26</bar> <qcal0>1</qcal0> @@ -10247,6 +11076,8 @@ <channel1>15</channel1> <sam1>6</sam1> <gtb1>0</gtb1> +<xpos>75</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -10254,6 +11085,7 @@ <NAME>NeuLANDPla5V-27</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>27</bar> <qcal0>1</qcal0> @@ -10284,6 +11116,8 @@ <channel1>14</channel1> <sam1>6</sam1> <gtb1>0</gtb1> +<xpos>125</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -10291,6 +11125,7 @@ <NAME>NeuLANDPla5V-28</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>28</bar> <qcal0>1</qcal0> @@ -10321,6 +11156,8 @@ <channel1>13</channel1> <sam1>6</sam1> <gtb1>0</gtb1> +<xpos>175</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -10328,6 +11165,7 @@ <NAME>NeuLANDPla5V-29</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>29</bar> <qcal0>1</qcal0> @@ -10358,6 +11196,8 @@ <channel1>12</channel1> <sam1>6</sam1> <gtb1>0</gtb1> +<xpos>225</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -10365,6 +11205,7 @@ <NAME>NeuLANDPla5V-30</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>30</bar> <qcal0>1</qcal0> @@ -10395,6 +11236,8 @@ <channel1>15</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>275</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -10402,6 +11245,7 @@ <NAME>NeuLANDPla5V-31</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>31</bar> <qcal0>1</qcal0> @@ -10432,6 +11276,8 @@ <channel1>14</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>325</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -10439,6 +11285,7 @@ <NAME>NeuLANDPla5V-32</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>32</bar> <qcal0>1</qcal0> @@ -10469,6 +11316,8 @@ <channel1>13</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>375</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -10476,6 +11325,7 @@ <NAME>NeuLANDPla5V-33</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>33</bar> <qcal0>1</qcal0> @@ -10506,6 +11356,8 @@ <channel1>12</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>425</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -10513,6 +11365,7 @@ <NAME>NeuLANDPla5V-34</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>34</bar> <qcal0>1</qcal0> @@ -10543,6 +11396,8 @@ <channel1>11</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>475</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -10550,6 +11405,7 @@ <NAME>NeuLANDPla5V-35</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>35</bar> <qcal0>1</qcal0> @@ -10580,6 +11436,8 @@ <channel1>10</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>525</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -10587,6 +11445,7 @@ <NAME>NeuLANDPla5V-36</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>36</bar> <qcal0>1</qcal0> @@ -10617,6 +11476,8 @@ <channel1>9</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>575</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -10624,6 +11485,7 @@ <NAME>NeuLANDPla5V-37</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>37</bar> <qcal0>1</qcal0> @@ -10654,6 +11516,8 @@ <channel1>8</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>625</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -10661,6 +11525,7 @@ <NAME>NeuLANDPla5V-38</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>38</bar> <qcal0>1</qcal0> @@ -10691,6 +11556,8 @@ <channel1>7</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>675</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -10698,6 +11565,7 @@ <NAME>NeuLANDPla5V-39</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>39</bar> <qcal0>1</qcal0> @@ -10728,6 +11596,8 @@ <channel1>6</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>725</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -10735,6 +11605,7 @@ <NAME>NeuLANDPla5V-40</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>40</bar> <qcal0>1</qcal0> @@ -10765,6 +11636,8 @@ <channel1>5</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>775</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -10772,6 +11645,7 @@ <NAME>NeuLANDPla5V-41</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>41</bar> <qcal0>1</qcal0> @@ -10802,6 +11676,8 @@ <channel1>4</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>825</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -10809,6 +11685,7 @@ <NAME>NeuLANDPla5V-42</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>42</bar> <qcal0>1</qcal0> @@ -10839,6 +11716,8 @@ <channel1>3</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>875</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -10846,6 +11725,7 @@ <NAME>NeuLANDPla5V-43</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>43</bar> <qcal0>1</qcal0> @@ -10876,6 +11756,8 @@ <channel1>2</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>925</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -10883,6 +11765,7 @@ <NAME>NeuLANDPla5V-44</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>44</bar> <qcal0>1</qcal0> @@ -10913,6 +11796,8 @@ <channel1>1</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>975</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -10920,6 +11805,7 @@ <NAME>NeuLANDPla5V-45</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>45</bar> <qcal0>1</qcal0> @@ -10950,6 +11836,8 @@ <channel1>0</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>1025</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -10957,6 +11845,7 @@ <NAME>NeuLANDPla5V-46</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>46</bar> <qcal0>1</qcal0> @@ -10987,6 +11876,8 @@ <channel1>15</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>1075</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -10994,6 +11885,7 @@ <NAME>NeuLANDPla5V-47</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>47</bar> <qcal0>1</qcal0> @@ -11024,6 +11916,8 @@ <channel1>14</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>1125</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -11031,6 +11925,7 @@ <NAME>NeuLANDPla5V-48</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>48</bar> <qcal0>1</qcal0> @@ -11061,6 +11956,8 @@ <channel1>13</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>1175</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -11068,6 +11965,7 @@ <NAME>NeuLANDPla5V-49</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>5</layer> <bar>49</bar> <qcal0>1</qcal0> @@ -11098,6 +11996,8 @@ <channel1>12</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>1225</xpos> +<ypos>0</ypos> <zpos>11415</zpos> </NEULAND> <NEULAND> @@ -11105,6 +12005,7 @@ <NAME>NeuLANDPla6H-0</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>0</bar> <qcal0>1</qcal0> @@ -11135,6 +12036,8 @@ <channel1>10</channel1> <sam1>6</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>-1225</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -11142,6 +12045,7 @@ <NAME>NeuLANDPla6H-1</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>1</bar> <qcal0>1</qcal0> @@ -11172,6 +12076,8 @@ <channel1>0</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>-1175</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -11179,6 +12085,7 @@ <NAME>NeuLANDPla6H-2</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>2</bar> <qcal0>1</qcal0> @@ -11209,6 +12116,8 @@ <channel1>15</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>-1125</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -11216,6 +12125,7 @@ <NAME>NeuLANDPla6H-3</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>3</bar> <qcal0>1</qcal0> @@ -11246,6 +12156,8 @@ <channel1>14</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>-1075</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -11253,6 +12165,7 @@ <NAME>NeuLANDPla6H-4</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>4</bar> <qcal0>1</qcal0> @@ -11283,6 +12196,8 @@ <channel1>13</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>-1025</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -11290,6 +12205,7 @@ <NAME>NeuLANDPla6H-5</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>5</bar> <qcal0>1</qcal0> @@ -11320,6 +12236,8 @@ <channel1>12</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>-975</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -11327,6 +12245,7 @@ <NAME>NeuLANDPla6H-6</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>6</bar> <qcal0>1</qcal0> @@ -11357,6 +12276,8 @@ <channel1>11</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>-925</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -11364,6 +12285,7 @@ <NAME>NeuLANDPla6H-7</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>7</bar> <qcal0>1</qcal0> @@ -11394,6 +12316,8 @@ <channel1>10</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>-875</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -11401,6 +12325,7 @@ <NAME>NeuLANDPla6H-8</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>8</bar> <qcal0>1</qcal0> @@ -11431,6 +12356,8 @@ <channel1>9</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>-825</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -11438,6 +12365,7 @@ <NAME>NeuLANDPla6H-9</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>9</bar> <qcal0>1</qcal0> @@ -11468,6 +12396,8 @@ <channel1>8</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>-775</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -11475,6 +12405,7 @@ <NAME>NeuLANDPla6H-10</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>10</bar> <qcal0>1</qcal0> @@ -11505,6 +12436,8 @@ <channel1>7</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>-725</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -11512,6 +12445,7 @@ <NAME>NeuLANDPla6H-11</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>11</bar> <qcal0>1</qcal0> @@ -11542,6 +12476,8 @@ <channel1>6</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>-675</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -11549,6 +12485,7 @@ <NAME>NeuLANDPla6H-12</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>12</bar> <qcal0>1</qcal0> @@ -11579,6 +12516,8 @@ <channel1>5</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>-625</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -11586,6 +12525,7 @@ <NAME>NeuLANDPla6H-13</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>13</bar> <qcal0>1</qcal0> @@ -11616,6 +12556,8 @@ <channel1>4</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>-575</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -11623,6 +12565,7 @@ <NAME>NeuLANDPla6H-14</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>14</bar> <qcal0>1</qcal0> @@ -11653,6 +12596,8 @@ <channel1>3</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>-525</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -11660,6 +12605,7 @@ <NAME>NeuLANDPla6H-15</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>15</bar> <qcal0>1</qcal0> @@ -11690,6 +12636,8 @@ <channel1>2</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>-475</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -11697,6 +12645,7 @@ <NAME>NeuLANDPla6H-16</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>16</bar> <qcal0>1</qcal0> @@ -11727,6 +12676,8 @@ <channel1>1</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>-425</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -11734,6 +12685,7 @@ <NAME>NeuLANDPla6H-17</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>17</bar> <qcal0>1</qcal0> @@ -11764,6 +12716,8 @@ <channel1>0</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>-375</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -11771,6 +12725,7 @@ <NAME>NeuLANDPla6H-18</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>18</bar> <qcal0>1</qcal0> @@ -11801,6 +12756,8 @@ <channel1>15</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>-325</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -11808,6 +12765,7 @@ <NAME>NeuLANDPla6H-19</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>19</bar> <qcal0>1</qcal0> @@ -11838,6 +12796,8 @@ <channel1>14</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>-275</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -11845,6 +12805,7 @@ <NAME>NeuLANDPla6H-20</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>20</bar> <qcal0>1</qcal0> @@ -11875,6 +12836,8 @@ <channel1>13</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>-225</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -11882,6 +12845,7 @@ <NAME>NeuLANDPla6H-21</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>21</bar> <qcal0>1</qcal0> @@ -11912,6 +12876,8 @@ <channel1>12</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>-175</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -11919,6 +12885,7 @@ <NAME>NeuLANDPla6H-22</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>22</bar> <qcal0>1</qcal0> @@ -11949,6 +12916,8 @@ <channel1>11</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>-125</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -11956,6 +12925,7 @@ <NAME>NeuLANDPla6H-23</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>23</bar> <qcal0>1</qcal0> @@ -11986,6 +12956,8 @@ <channel1>10</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>-75</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -11993,6 +12965,7 @@ <NAME>NeuLANDPla6H-24</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>24</bar> <qcal0>1</qcal0> @@ -12023,6 +12996,8 @@ <channel1>9</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>-25</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -12030,6 +13005,7 @@ <NAME>NeuLANDPla6H-25</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>25</bar> <qcal0>1</qcal0> @@ -12060,6 +13036,8 @@ <channel1>8</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>25</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -12067,6 +13045,7 @@ <NAME>NeuLANDPla6H-26</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>26</bar> <qcal0>1</qcal0> @@ -12097,6 +13076,8 @@ <channel1>7</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>75</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -12104,6 +13085,7 @@ <NAME>NeuLANDPla6H-27</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>27</bar> <qcal0>1</qcal0> @@ -12134,6 +13116,8 @@ <channel1>6</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>125</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -12141,6 +13125,7 @@ <NAME>NeuLANDPla6H-28</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>28</bar> <qcal0>1</qcal0> @@ -12171,6 +13156,8 @@ <channel1>5</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>175</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -12178,6 +13165,7 @@ <NAME>NeuLANDPla6H-29</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>29</bar> <qcal0>1</qcal0> @@ -12208,6 +13196,8 @@ <channel1>4</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>225</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -12215,6 +13205,7 @@ <NAME>NeuLANDPla6H-30</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>30</bar> <qcal0>1</qcal0> @@ -12245,6 +13236,8 @@ <channel1>3</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>275</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -12252,6 +13245,7 @@ <NAME>NeuLANDPla6H-31</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>31</bar> <qcal0>1</qcal0> @@ -12282,6 +13276,8 @@ <channel1>2</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>325</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -12289,6 +13285,7 @@ <NAME>NeuLANDPla6H-32</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>32</bar> <qcal0>1</qcal0> @@ -12319,6 +13316,8 @@ <channel1>1</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>375</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -12326,6 +13325,7 @@ <NAME>NeuLANDPla6H-33</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>33</bar> <qcal0>1</qcal0> @@ -12356,6 +13356,8 @@ <channel1>0</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>425</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -12363,6 +13365,7 @@ <NAME>NeuLANDPla6H-34</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>34</bar> <qcal0>1</qcal0> @@ -12393,6 +13396,8 @@ <channel1>15</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>475</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -12400,6 +13405,7 @@ <NAME>NeuLANDPla6H-35</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>35</bar> <qcal0>1</qcal0> @@ -12430,6 +13436,8 @@ <channel1>14</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>525</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -12437,6 +13445,7 @@ <NAME>NeuLANDPla6H-36</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>36</bar> <qcal0>1</qcal0> @@ -12467,6 +13476,8 @@ <channel1>13</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>575</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -12474,6 +13485,7 @@ <NAME>NeuLANDPla6H-37</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>37</bar> <qcal0>1</qcal0> @@ -12504,6 +13516,8 @@ <channel1>12</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>625</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -12511,6 +13525,7 @@ <NAME>NeuLANDPla6H-38</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>38</bar> <qcal0>1</qcal0> @@ -12541,6 +13556,8 @@ <channel1>11</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>675</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -12548,6 +13565,7 @@ <NAME>NeuLANDPla6H-39</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>39</bar> <qcal0>1</qcal0> @@ -12578,6 +13596,8 @@ <channel1>10</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>725</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -12585,6 +13605,7 @@ <NAME>NeuLANDPla6H-40</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>40</bar> <qcal0>1</qcal0> @@ -12615,6 +13636,8 @@ <channel1>9</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>775</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -12622,6 +13645,7 @@ <NAME>NeuLANDPla6H-41</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>41</bar> <qcal0>1</qcal0> @@ -12652,6 +13676,8 @@ <channel1>8</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>825</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -12659,6 +13685,7 @@ <NAME>NeuLANDPla6H-42</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>42</bar> <qcal0>1</qcal0> @@ -12689,6 +13716,8 @@ <channel1>7</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>875</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -12696,6 +13725,7 @@ <NAME>NeuLANDPla6H-43</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>43</bar> <qcal0>1</qcal0> @@ -12726,6 +13756,8 @@ <channel1>6</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>925</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -12733,6 +13765,7 @@ <NAME>NeuLANDPla6H-44</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>44</bar> <qcal0>1</qcal0> @@ -12763,6 +13796,8 @@ <channel1>5</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>975</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -12770,6 +13805,7 @@ <NAME>NeuLANDPla6H-45</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>45</bar> <qcal0>1</qcal0> @@ -12800,6 +13836,8 @@ <channel1>4</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>1025</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -12807,6 +13845,7 @@ <NAME>NeuLANDPla6H-46</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>46</bar> <qcal0>1</qcal0> @@ -12837,6 +13876,8 @@ <channel1>3</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>1075</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -12844,6 +13885,7 @@ <NAME>NeuLANDPla6H-47</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>47</bar> <qcal0>1</qcal0> @@ -12874,6 +13916,8 @@ <channel1>2</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>1125</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -12881,6 +13925,7 @@ <NAME>NeuLANDPla6H-48</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>48</bar> <qcal0>1</qcal0> @@ -12911,6 +13956,8 @@ <channel1>1</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>1175</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -12918,6 +13965,7 @@ <NAME>NeuLANDPla6H-49</NAME> <FPL>13</FPL> <direction>H</direction> +<SubLayer>1</SubLayer> <layer>6</layer> <bar>49</bar> <qcal0>1</qcal0> @@ -12948,6 +13996,8 @@ <channel1>0</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>0</xpos> +<ypos>1225</ypos> <zpos>11465</zpos> </NEULAND> <NEULAND> @@ -12955,6 +14005,7 @@ <NAME>NeuLANDPla7V-0</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>0</bar> <qcal0>1</qcal0> @@ -12985,6 +14036,8 @@ <channel1>9</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>-1225</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -12992,6 +14045,7 @@ <NAME>NeuLANDPla7V-1</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>1</bar> <qcal0>1</qcal0> @@ -13022,6 +14076,8 @@ <channel1>8</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>-1175</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -13029,6 +14085,7 @@ <NAME>NeuLANDPla7V-2</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>2</bar> <qcal0>1</qcal0> @@ -13059,6 +14116,8 @@ <channel1>7</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>-1125</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -13066,6 +14125,7 @@ <NAME>NeuLANDPla7V-3</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>3</bar> <qcal0>1</qcal0> @@ -13096,6 +14156,8 @@ <channel1>6</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>-1075</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -13103,6 +14165,7 @@ <NAME>NeuLANDPla7V-4</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>4</bar> <qcal0>1</qcal0> @@ -13133,6 +14196,8 @@ <channel1>5</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>-1025</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -13140,6 +14205,7 @@ <NAME>NeuLANDPla7V-5</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>5</bar> <qcal0>1</qcal0> @@ -13170,6 +14236,8 @@ <channel1>4</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>-975</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -13177,6 +14245,7 @@ <NAME>NeuLANDPla7V-6</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>6</bar> <qcal0>1</qcal0> @@ -13207,6 +14276,8 @@ <channel1>3</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>-925</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -13214,6 +14285,7 @@ <NAME>NeuLANDPla7V-7</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>7</bar> <qcal0>1</qcal0> @@ -13244,6 +14316,8 @@ <channel1>2</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>-875</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -13251,6 +14325,7 @@ <NAME>NeuLANDPla7V-8</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>8</bar> <qcal0>1</qcal0> @@ -13281,6 +14356,8 @@ <channel1>1</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>-825</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -13288,6 +14365,7 @@ <NAME>NeuLANDPla7V-9</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>9</bar> <qcal0>1</qcal0> @@ -13318,6 +14396,8 @@ <channel1>0</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>-775</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -13325,6 +14405,7 @@ <NAME>NeuLANDPla7V-10</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>10</bar> <qcal0>1</qcal0> @@ -13355,6 +14436,8 @@ <channel1>15</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>-725</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -13362,6 +14445,7 @@ <NAME>NeuLANDPla7V-11</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>11</bar> <qcal0>1</qcal0> @@ -13392,6 +14476,8 @@ <channel1>14</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>-675</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -13399,6 +14485,7 @@ <NAME>NeuLANDPla7V-12</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>12</bar> <qcal0>1</qcal0> @@ -13429,6 +14516,8 @@ <channel1>13</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>-625</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -13436,6 +14525,7 @@ <NAME>NeuLANDPla7V-13</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>13</bar> <qcal0>1</qcal0> @@ -13466,6 +14556,8 @@ <channel1>12</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>-575</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -13473,6 +14565,7 @@ <NAME>NeuLANDPla7V-14</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>14</bar> <qcal0>1</qcal0> @@ -13503,6 +14596,8 @@ <channel1>11</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>-525</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -13510,6 +14605,7 @@ <NAME>NeuLANDPla7V-15</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>15</bar> <qcal0>1</qcal0> @@ -13540,6 +14636,8 @@ <channel1>10</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>-475</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -13547,6 +14645,7 @@ <NAME>NeuLANDPla7V-16</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>16</bar> <qcal0>1</qcal0> @@ -13577,6 +14676,8 @@ <channel1>9</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>-425</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -13584,6 +14685,7 @@ <NAME>NeuLANDPla7V-17</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>17</bar> <qcal0>1</qcal0> @@ -13614,6 +14716,8 @@ <channel1>8</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>-375</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -13621,6 +14725,7 @@ <NAME>NeuLANDPla7V-18</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>18</bar> <qcal0>1</qcal0> @@ -13651,6 +14756,8 @@ <channel1>7</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>-325</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -13658,6 +14765,7 @@ <NAME>NeuLANDPla7V-19</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>19</bar> <qcal0>1</qcal0> @@ -13688,6 +14796,8 @@ <channel1>6</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>-275</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -13695,6 +14805,7 @@ <NAME>NeuLANDPla7V-20</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>20</bar> <qcal0>1</qcal0> @@ -13725,6 +14836,8 @@ <channel1>5</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>-225</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -13732,6 +14845,7 @@ <NAME>NeuLANDPla7V-21</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>21</bar> <qcal0>1</qcal0> @@ -13762,6 +14876,8 @@ <channel1>4</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>-175</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -13769,6 +14885,7 @@ <NAME>NeuLANDPla7V-22</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>22</bar> <qcal0>1</qcal0> @@ -13799,6 +14916,8 @@ <channel1>3</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>-125</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -13806,6 +14925,7 @@ <NAME>NeuLANDPla7V-23</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>23</bar> <qcal0>1</qcal0> @@ -13836,6 +14956,8 @@ <channel1>2</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>-75</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -13843,6 +14965,7 @@ <NAME>NeuLANDPla7V-24</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>24</bar> <qcal0>1</qcal0> @@ -13873,6 +14996,8 @@ <channel1>1</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>-25</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -13880,6 +15005,7 @@ <NAME>NeuLANDPla7V-25</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>25</bar> <qcal0>1</qcal0> @@ -13910,6 +15036,8 @@ <channel1>0</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>25</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -13917,6 +15045,7 @@ <NAME>NeuLANDPla7V-26</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>26</bar> <qcal0>1</qcal0> @@ -13947,6 +15076,8 @@ <channel1>15</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>75</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -13954,6 +15085,7 @@ <NAME>NeuLANDPla7V-27</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>27</bar> <qcal0>1</qcal0> @@ -13984,6 +15116,8 @@ <channel1>14</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>125</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -13991,6 +15125,7 @@ <NAME>NeuLANDPla7V-28</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>28</bar> <qcal0>1</qcal0> @@ -14021,6 +15156,8 @@ <channel1>13</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>175</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -14028,6 +15165,7 @@ <NAME>NeuLANDPla7V-29</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>29</bar> <qcal0>1</qcal0> @@ -14058,6 +15196,8 @@ <channel1>12</channel1> <sam1>5</sam1> <gtb1>0</gtb1> +<xpos>225</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -14065,6 +15205,7 @@ <NAME>NeuLANDPla7V-30</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>30</bar> <qcal0>1</qcal0> @@ -14095,6 +15236,8 @@ <channel1>15</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>275</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -14102,6 +15245,7 @@ <NAME>NeuLANDPla7V-31</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>31</bar> <qcal0>1</qcal0> @@ -14132,6 +15276,8 @@ <channel1>14</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>325</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -14139,6 +15285,7 @@ <NAME>NeuLANDPla7V-32</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>32</bar> <qcal0>1</qcal0> @@ -14169,6 +15316,8 @@ <channel1>13</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>375</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -14176,6 +15325,7 @@ <NAME>NeuLANDPla7V-33</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>33</bar> <qcal0>1</qcal0> @@ -14206,6 +15356,8 @@ <channel1>12</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>425</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -14213,6 +15365,7 @@ <NAME>NeuLANDPla7V-34</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>34</bar> <qcal0>1</qcal0> @@ -14243,6 +15396,8 @@ <channel1>11</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>475</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -14250,6 +15405,7 @@ <NAME>NeuLANDPla7V-35</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>35</bar> <qcal0>1</qcal0> @@ -14280,6 +15436,8 @@ <channel1>10</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>525</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -14287,6 +15445,7 @@ <NAME>NeuLANDPla7V-36</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>36</bar> <qcal0>1</qcal0> @@ -14317,6 +15476,8 @@ <channel1>9</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>575</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -14324,6 +15485,7 @@ <NAME>NeuLANDPla7V-37</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>37</bar> <qcal0>1</qcal0> @@ -14354,6 +15516,8 @@ <channel1>8</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>625</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -14361,6 +15525,7 @@ <NAME>NeuLANDPla7V-38</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>38</bar> <qcal0>1</qcal0> @@ -14391,6 +15556,8 @@ <channel1>7</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>675</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -14398,6 +15565,7 @@ <NAME>NeuLANDPla7V-39</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>39</bar> <qcal0>1</qcal0> @@ -14428,6 +15596,8 @@ <channel1>6</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>725</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -14435,6 +15605,7 @@ <NAME>NeuLANDPla7V-40</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>40</bar> <qcal0>1</qcal0> @@ -14465,6 +15636,8 @@ <channel1>5</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>775</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -14472,6 +15645,7 @@ <NAME>NeuLANDPla7V-41</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>41</bar> <qcal0>1</qcal0> @@ -14502,6 +15676,8 @@ <channel1>4</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>825</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -14509,6 +15685,7 @@ <NAME>NeuLANDPla7V-42</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>42</bar> <qcal0>1</qcal0> @@ -14539,6 +15716,8 @@ <channel1>3</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>875</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -14546,6 +15725,7 @@ <NAME>NeuLANDPla7V-43</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>43</bar> <qcal0>1</qcal0> @@ -14576,6 +15756,8 @@ <channel1>2</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>925</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -14583,6 +15765,7 @@ <NAME>NeuLANDPla7V-44</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>44</bar> <qcal0>1</qcal0> @@ -14613,6 +15796,8 @@ <channel1>1</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>975</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -14620,6 +15805,7 @@ <NAME>NeuLANDPla7V-45</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>45</bar> <qcal0>1</qcal0> @@ -14650,6 +15836,8 @@ <channel1>0</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>1025</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -14657,6 +15845,7 @@ <NAME>NeuLANDPla7V-46</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>46</bar> <qcal0>1</qcal0> @@ -14687,6 +15876,8 @@ <channel1>15</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>1075</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -14694,6 +15885,7 @@ <NAME>NeuLANDPla7V-47</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>47</bar> <qcal0>1</qcal0> @@ -14724,6 +15916,8 @@ <channel1>14</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>1125</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -14731,6 +15925,7 @@ <NAME>NeuLANDPla7V-48</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>48</bar> <qcal0>1</qcal0> @@ -14761,6 +15956,8 @@ <channel1>13</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>1175</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> <NEULAND> @@ -14768,6 +15965,7 @@ <NAME>NeuLANDPla7V-49</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>7</layer> <bar>49</bar> <qcal0>1</qcal0> @@ -14798,13 +15996,17 @@ <channel1>12</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>1225</xpos> +<ypos>0</ypos> <zpos>11515</zpos> </NEULAND> +<!-- <NEULAND> <ID>401</ID> <NAME>MasterStart</NAME> <FPL>13</FPL> <direction>V</direction> +<SubLayer>1</SubLayer> <layer>1</layer> <bar>1</bar> <qcal0>1</qcal0> @@ -14835,6 +16037,272 @@ <channel1>11</channel1> <sam1>7</sam1> <gtb1>0</gtb1> +<xpos>-1175</xpos> +<ypos>0</ypos> <zpos>0</zpos> +</NEULAND>--> +<NEULAND> +<ID>401</ID> +<NAME>NEULANDVETO1</NAME> +<FPl>13</FPl> +<direction>V</direction> +<Layer>1</Layer> +<SubLayer>0</SubLayer> +<xpos>-1120</xpos> +<ypos>0</ypos> +<zpos>10830</zpos> +<TUCal>0.0764449</TUCal> +<TUOff>0</TUOff> +<TUSlw>0</TUSlw> +<QUCal>0.0084</QUCal> +<QUPed>270.381</QUPed> +<TDCal>0.0772675</TDCal> +<TDOff>0</TDOff> +<TDSlw>0</TDSlw> +<QDCal>0.0077</QDCal> +<QDPed>327.727</QDPed> +<DTCal>5.27777</DTCal> +<DTOff>0</DTOff> +<TAveOff>0</TAveOff> +<tu_geo>31</tu_geo> +<tu_ch>0</tu_ch> +<td_geo>31</td_geo> +<td_ch>8</td_ch> +<qu_geo>31</qu_geo> +<qu_ch>0</qu_ch> +<qd_geo>31</qd_geo> +<qd_ch>8</qd_ch> +<Ignore>0</Ignore> +</NEULAND> +<NEULAND> +<ID>402</ID> +<NAME>NEULANDVETO2</NAME> +<FPl>13</FPl> +<direction>V</direction> +<Layer>1</Layer> +<SubLayer>0</SubLayer> +<xpos>-800</xpos> +<ypos>0</ypos> +<zpos>10830</zpos> +<TUCal>0.0781229</TUCal> +<TUOff>0</TUOff> +<TUSlw>0</TUSlw> +<QUCal>0.0071</QUCal> +<QUPed>188.705</QUPed> +<TDCal>0.0773227</TDCal> +<TDOff>0</TDOff> +<TDSlw>0</TDSlw> +<QDCal>0.0093</QDCal> +<QDPed>329.087</QDPed> +<DTCal>5.42857</DTCal> +<DTOff>0</DTOff> +<TAveOff>0</TAveOff> +<tu_geo>31</tu_geo> +<tu_ch>1</tu_ch> +<td_geo>31</td_geo> +<td_ch>9</td_ch> +<qu_geo>31</qu_geo> +<qu_ch>1</qu_ch> +<qd_geo>31</qd_geo> +<qd_ch>9</qd_ch> +<Ignore>0</Ignore> +</NEULAND> +<NEULAND> +<ID>403</ID> +<NAME>NEULANDVETO3</NAME> +<FPl>13</FPl> +<direction>V</direction> +<Layer>1</Layer> +<SubLayer>0</SubLayer> +<xpos>-480</xpos> +<ypos>0</ypos> +<zpos>10830</zpos> +<TUCal>0.0768897</TUCal> +<TUOff>0</TUOff> +<TUSlw>0</TUSlw> +<QUCal>0.0064</QUCal> +<QUPed>194.707</QUPed> +<TDCal>0.076907</TDCal> +<TDOff>0</TDOff> +<TDSlw>0</TDSlw> +<QDCal>0.0084</QDCal> +<QDPed>274.876</QDPed> +<DTCal>5.27777</DTCal> +<DTOff>0</DTOff> +<TAveOff>0</TAveOff> +<tu_geo>31</tu_geo> +<tu_ch>2</tu_ch> +<td_geo>31</td_geo> +<td_ch>10</td_ch> +<qu_geo>31</qu_geo> +<qu_ch>2</qu_ch> +<qd_geo>31</qd_geo> +<qd_ch>10</qd_ch> +<Ignore>0</Ignore> +</NEULAND> +<NEULAND> +<ID>404</ID> +<NAME>NEULANDVETO4</NAME> +<FPl>13</FPl> +<direction>V</direction> +<Layer>1</Layer> +<SubLayer>0</SubLayer> +<xpos>-160</xpos> +<ypos>0</ypos> +<zpos>10830</zpos> +<TUCal>0.0763626</TUCal> +<TUOff>0</TUOff> +<TUSlw>0</TUSlw> +<QUCal>0.0092</QUCal> +<QUPed>231.671</QUPed> +<TDCal>0.077865</TDCal> +<TDOff>0</TDOff> +<TDSlw>0</TDSlw> +<QDCal>0.0087</QDCal> +<QDPed>361.245</QDPed> +<DTCal>5.13514</DTCal> +<DTOff>0</DTOff> +<TAveOff>0</TAveOff> +<tu_geo>31</tu_geo> +<tu_ch>3</tu_ch> +<td_geo>31</td_geo> +<td_ch>11</td_ch> +<qu_geo>31</qu_geo> +<qu_ch>3</qu_ch> +<qd_geo>31</qd_geo> +<qd_ch>11</qd_ch> +<Ignore>0</Ignore> +</NEULAND> +<NEULAND> +<ID>405</ID> +<NAME>NEULANDVETO5</NAME> +<FPl>13</FPl> +<direction>V</direction> +<Layer>1</Layer> +<SubLayer>0</SubLayer> +<xpos>160</xpos> +<ypos>0</ypos> +<zpos>10830</zpos> +<TUCal>0.0771958</TUCal> +<TUOff>0</TUOff> +<TUSlw>0</TUSlw> +<QUCal>0.0072</QUCal> +<QUPed>288.36</QUPed> +<TDCal>0.0764381</TDCal> +<TDOff>0</TDOff> +<TDSlw>0</TDSlw> +<QDCal>0.0104</QDCal> +<QDPed>319.26</QDPed> +<DTCal>5.27777</DTCal> +<DTOff>0</DTOff> +<TAveOff>0</TAveOff> +<tu_geo>31</tu_geo> +<tu_ch>4</tu_ch> +<td_geo>31</td_geo> +<td_ch>12</td_ch> +<qu_geo>31</qu_geo> +<qu_ch>4</qu_ch> +<qd_geo>31</qd_geo> +<qd_ch>12</qd_ch> +<Ignore>0</Ignore> +</NEULAND> +<NEULAND> +<ID>406</ID> +<NAME>NEULANDVETO6</NAME> +<FPl>13</FPl> +<direction>V</direction> +<Layer>1</Layer> +<SubLayer>0</SubLayer> +<xpos>480</xpos> +<ypos>0</ypos> +<zpos>10830</zpos> +<TUCal>0.0768041</TUCal> +<TUOff>0</TUOff> +<TUSlw>0</TUSlw> +<QUCal>0.0063</QUCal> +<QUPed>275.527</QUPed> +<TDCal>0.0767091</TDCal> +<TDOff>0</TDOff> +<TDSlw>0</TDSlw> +<QDCal>0.0101</QDCal> +<QDPed>386.405</QDPed> +<DTCal>5.42857</DTCal> +<DTOff>0</DTOff> +<TAveOff>0</TAveOff> +<tu_geo>31</tu_geo> +<tu_ch>5</tu_ch> +<td_geo>31</td_geo> +<td_ch>13</td_ch> +<qu_geo>31</qu_geo> +<qu_ch>5</qu_ch> +<qd_geo>31</qd_geo> +<qd_ch>13</qd_ch> +<Ignore>0</Ignore> +</NEULAND> +<NEULAND> +<ID>407</ID> +<NAME>NEULANDVETO7</NAME> +<FPl>13</FPl> +<direction>V</direction> +<Layer>1</Layer> +<SubLayer>0</SubLayer> +<xpos>800</xpos> +<ypos>0</ypos> +<zpos>10830</zpos> +<TUCal>0.0771441</TUCal> +<TUOff>0</TUOff> +<TUSlw>0</TUSlw> +<QUCal>0.0095</QUCal> +<QUPed>367.965</QUPed> +<TDCal>0.0777481</TDCal> +<TDOff>0</TDOff> +<TDSlw>0</TDSlw> +<QDCal>0.0083</QDCal> +<QDPed>253.031</QDPed> +<DTCal>5</DTCal> +<DTOff>0</DTOff> +<TAveOff>0</TAveOff> +<tu_geo>31</tu_geo> +<tu_ch>6</tu_ch> +<td_geo>31</td_geo> +<td_ch>14</td_ch> +<qu_geo>31</qu_geo> +<qu_ch>6</qu_ch> +<qd_geo>31</qd_geo> +<qd_ch>14</qd_ch> +<Ignore>0</Ignore> +</NEULAND> +<NEULAND> +<ID>408</ID> +<NAME>NEULANDVETO8</NAME> +<FPl>13</FPl> +<direction>V</direction> +<Layer>1</Layer> +<SubLayer>0</SubLayer> +<xpos>1120</xpos> +<ypos>0</ypos> +<zpos>10830</zpos> +<TUCal>0.0772522</TUCal> +<TUOff>0</TUOff> +<TUSlw>0</TUSlw> +<QUCal>0.0101</QUCal> +<QUPed>346.16</QUPed> +<TDCal>0.0786016</TDCal> +<TDOff>0</TDOff> +<TDSlw>0</TDSlw> +<QDCal>0.0096</QDCal> +<QDPed>188.551</QDPed> +<DTCal>5.13514</DTCal> +<DTOff>0</DTOff> +<TAveOff>0</TAveOff> +<tu_geo>31</tu_geo> +<tu_ch>7</tu_ch> +<td_geo>31</td_geo> +<td_ch>15</td_ch> +<qu_geo>31</qu_geo> +<qu_ch>7</qu_ch> +<qd_geo>31</qd_geo> +<qd_ch>15</qd_ch> +<Ignore>0</Ignore> </NEULAND> </dataroot> diff --git a/Projects/S034/s034.detector b/Projects/S034/detector/s034.detector similarity index 56% rename from Projects/S034/s034.detector rename to Projects/S034/detector/s034.detector index 32f48fb17..665e42838 100644 --- a/Projects/S034/s034.detector +++ b/Projects/S034/detector/s034.detector @@ -1,9 +1,20 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%Target + THICKNESS= 0.1 cm + %RADIUS= 28 mm + RADIUS= 200 mm + MATERIAL= 7Li + ANGLE= 0 deg + X= 0 cm + Y= 0 mm + Z= -4500 mm + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% BigRIPSPlastic XML= db/SAMURAIPlastic.s034.2.xml %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -BigRIPSIC +%BigRIPSIC XML= db/BigRIPSIC.xml %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -24,7 +35,7 @@ SAMURAIBDC 2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Minos - Position= 0.345399 1.02061 -4650 mm + Position= 0.345399 1.02061 -4650.0 mm ZRotation= 40.6 deg TargetLength= 151.72 mm TargetZOffset= 0 mm @@ -39,29 +50,54 @@ Minos XML= db/MINOS.xml %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Samurai +% POS= 0 0 3900 mm + POS= 0 0 0 mm + ANGLE= 30 deg +% % + METHOD= 0 +% % 0=RungeKutta, 1=EliaOmar + %FIELDMAP= field_map/3T.table.bin + FIELDMAP= field_map/180702-2,40T-3000.table.bin +% % fieldmap path + STEPS_PER_METER= 1000 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + SAMURAIFDC0 - XML= db/SAMURAIFDC0_20200109.xml - Offset= -0.00666226 0.102191 -3370.01 mm - InvertX= 1 - InvertY= 0 - InvertD= 1 + XML= db/SAMURAIFDC0_20200109.xml + %POS= 0 0 0 cm + %Offset= -0.00666226 0.102191 -3370.01 mm + Offset= -0.00666226 0.102191 -3370.01 mm + InvertX= 1 + InvertY= 0 + InvertD= 1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% SAMURAIFDC2 XML= db/SAMURAIFDC2.xml Offset= -252.416 -0.228477 4122.57 mm + OffAngle= 59.930 deg InvertX= 0 InvertY= 1 InvertD= 1 + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% SAMURAIHOD XML= db/SAMURAIHOD_s034_all40mV_s037_20170702.xml %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -NEBULA +%NEBULA XML= db/NEBULA.xml - Offset= 0 0 0 mm + Offset= 0 0 -4647.3 mm InvertX= 0 InvertY= 0 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%NEULAND + XML= db/NEULAND.xml + Offset= 0 0 -4133.64 mm + InvertX= 0 + InvertY= 0 diff --git a/Projects/S034/macro/Beam/BeamPlot.cxx b/Projects/S034/macro/Beam/BeamPlot.cxx new file mode 100644 index 000000000..52142a305 --- /dev/null +++ b/Projects/S034/macro/Beam/BeamPlot.cxx @@ -0,0 +1,54 @@ +#include<iostream> + +#include <string> +#include "TString.h" +#include "TFile.h" +#include "TCanvas.h" + +#include "TF1.h" +#include "TH1.h" +#include "TH2.h" +#include "TTree.h" +#include "TCanvas.h" + +using namespace std; + + +void BeamPlot(){ + + TFile *f = new TFile("./root/analysis/run725.root"); + TTree *tree = (TTree*)f->Get("PhysicsTree"); + //cout << "nbr entries = " << tree->GetEntries() << endl; + + TFile foutXThetaX("./beam/hBeamXThetaX.root","recreate"); + auto hBeamXThetaX = new TH2F("hBeamXThetaX","hBeamXThetaX",80,-40,40,80,-0.05,0.05); + tree->Draw("Beam_ThetaX:BDC1_X>>hBeamXThetaX","Beam_ThetaX>-9000 && BDC1_X>-9000 && BDC1_X<1000 && Trigger==0"); + hBeamXThetaX->Write(); + auto hBeamThetaX = new TH1D("hBeamThetaX","hBeamThetaX",300,-0.05,0.05); + tree->Draw("Beam_ThetaX>>hBeamThetaX","Beam_ThetaX>-9000 && Trigger==0"); + hBeamThetaX->Write(); + auto hBeamX = new TH1D("hBeamX","hBeamX",300,-40,40); + tree->Draw("BDC1_X>>hBeamX","BDC1_X>-9000 && BDC1_X<1000 && Trigger==0"); + hBeamX->Write(); + foutXThetaX.Close(); + + TFile foutYThetaY("./beam/hBeamYThetaY.root","recreate"); + auto hBeamYThetaY = new TH2F("hBeamYThetaY","hBeamYThetaY",80,-40,40,80,-0.05,0.05); + tree->Draw("Beam_ThetaY:BDC1_Y>>hBeamYThetaY","Beam_ThetaY>-9000 && BDC1_Y>-9000 && BDC1_Y<1000 && Trigger==0"); + hBeamYThetaY->Write(); + auto hBeamThetaY = new TH1D("hBeamThetaY","hBeamThetaY",300,-0.05,0.05); + tree->Draw("Beam_ThetaY>>hBeamThetaY","Beam_ThetaY>-9000 && Trigger==0"); + hBeamThetaY->Write(); + auto hBeamY = new TH1D("hBeamY","hBeamY",300,-40,40); + tree->Draw("BDC1_Y>>hBeamY","BDC1_Y>-9000 && BDC1_Y<1000 && Trigger==0"); + hBeamY->Write(); + foutYThetaY.Close(); + + TFile foutKE("./beam/hBeamEnergy.root","recreate"); + auto hBeamEnergy = new TH1D("hBeamEnergy","hBeamEnergy",100,1235,1260); + tree->Draw("Beam_KE_Tot>>hBeamEnergy","Beam_KE_Tot>-9000 && Trigger==0"); + hBeamEnergy->Write(); + foutKE.Close(); + + +} diff --git a/Projects/S034/macro/CalibFDC.cxx b/Projects/S034/macro/CalibFDC.cxx deleted file mode 100755 index 3c9cda374..000000000 --- a/Projects/S034/macro/CalibFDC.cxx +++ /dev/null @@ -1,103 +0,0 @@ -void CalibFDC(){ - - for(int run12 =696; run12 <= 700 ; run12++){ - - TChain* c = new TChain("RawTree"); - c->Add(Form("~/nptool/rawData/rawData_FDC/%d.root",run12)); - c->SetBranchStatus("*",false); - - // FDC - /* int FDC = 0; */ - /* int NLayer = 8; */ - /* c->SetBranchStatus("SamuraiFDC0",true); */ - /* ofstream fout(Form("CalibFiles/FDC0_Calib_%d.txt",run12)); */ - /* double inter = 2.5;// inter wire distance */ - /* double low=1720; */ - /* double high=1820; */ - - // FDC2 - int FDC=2; - int NLayer = 14; - c->SetBranchStatus("SamuraiFDC2",true); - ofstream fout(Form("CalibFiles/FDC2_Calib_%d.txt", run12)); - double inter = 10;// inter wire distance - double low=1200; - double high=1700; - - cout <<"Calibrating FDC" << FDC << " run number : " << run12 << endl; - - string cond; - - TF1* f = new TF1("sigmoid","[0]/(exp([1]*([2]-x))+1)"); - //TF1* f = new TF1("sigmoid","0*(x<[0])+(x-[0])*[1]*(x>[0]&&x<[2])+[3]*(x>[2])"); - - TH1D* h = new TH1D("h","h",1500,0,3000); - for(unsigned int i = 0 ; i < NLayer; i++){ - cond = Form("fFDC%d_LayerNbr==%d&&fFDC%d_Edge==0&&fFDC%d_Time>%f&&fFDC%d_Time<%f&&fFDC%d_Time@.size()>10&&fFDC%d_Time@.size()<100",FDC,i,FDC,FDC,low,FDC,high,FDC,FDC); - c->Draw(Form("fFDC%d_Time>>h",FDC),cond.c_str()); - TH1D* g = new TH1D(*h); - unsigned int size = h->GetNbinsX(); - for(unsigned int i = 0 ; i < size ; i++){ - g->SetBinContent(i,h->Integral(0,i)); - } - //new TCanvas(); - //g->Draw(); - cout << g->GetMaximum() << endl; - f->SetParameter(0,g->GetMaximum()); - f->SetParameter(1,8e-3); - f->SetParameter(2,1500); - - g->Fit(f); - // Renormalize the distribution to 10 mm - f->SetParameter(0,inter); - double p0 = f->GetParameter(0); - double p1 = f->GetParameter(1); - double p2 = f->GetParameter(2); - //new TCanvas(); - //c->Draw(Form("%f/(exp(%f*(%f-(Time+ToT)))+1)>>hh(200,0,2.5)",p0,p1,p2),cond.c_str()); - fout << Form("FDC%d_L%d ",FDC,i) << p0 << " " << p1 << " " << p2 << endl; - } - fout.close(); - -/* ////////////////////////////////////////// */ -/* // FDC2 */ -/* ////////////////////////////////////////// */ - -/* FDC=2; */ -/* NLayer = 14; */ -/* c->SetBranchStatus("SamuraiFDC2",true); */ -/* ofstream fout2(Form("CalibFiles/FDC2_Calib_%d.txt", run12)); */ -/* inter = 10;// inter wire distance */ -/* low=1200; */ -/* high=1700; */ -/* h->Clear(); */ - -/* for(unsigned int i = 0 ; i < NLayer; i++){ */ -/* cond = Form("fFDC%d_LayerNbr==%d&&fFDC%d_Edge==0&&fFDC%d_Time>%f&&fFDC%d_Time<%f&&fFDC%d_Time@.size()>10&&fFDC%d_Time@.size()<100",FDC,i,FDC,FDC,low,FDC,high,FDC,FDC); */ -/* c->Draw(Form("fFDC%d_Time>>h",FDC),cond.c_str()); */ -/* TH1D* g = new TH1D(*h); */ -/* unsigned int size = h->GetNbinsX(); */ -/* for(unsigned int i = 0 ; i < size ; i++){ */ -/* g->SetBinContent(i,h->Integral(0,i)); */ -/* } */ -/* //new TCanvas(); */ -/* //g->Draw(); */ -/* cout << g->GetMaximum() << endl; */ -/* f->SetParameter(0,g->GetMaximum()); */ -/* f->SetParameter(1,8e-3); */ -/* f->SetParameter(2,1500); */ - -/* g->Fit(f); */ -/* // Renormalize the distribution to 10 mm */ -/* f->SetParameter(0,inter); */ -/* double p0 = f->GetParameter(0); */ -/* double p1 = f->GetParameter(1); */ -/* double p2 = f->GetParameter(2); */ -/* //new TCanvas(); */ -/* //c->Draw(Form("%f/(exp(%f*(%f-(Time+ToT)))+1)>>hh(200,0,2.5)",p0,p1,p2),cond.c_str()); */ -/* fout2 << Form("FDC%d_L%d ",FDC,i) << p0 << " " << p1 << " " << p2 << endl; */ -/* } */ -/* fout2.close(); */ - - } -} diff --git a/Projects/S034/macro/DriftChamber/DrawDCReconstructionBDCs.cxx b/Projects/S034/macro/DriftChamber/DrawDCReconstructionBDCs.cxx new file mode 100644 index 000000000..14365c13b --- /dev/null +++ b/Projects/S034/macro/DriftChamber/DrawDCReconstructionBDCs.cxx @@ -0,0 +1,271 @@ +#include<iostream> +#include <string> +#include "TString.h" +#include "TEllipse.h" +using namespace std; + +void DrawDCReconstructionBDCs(){ + + auto anafile = new TFile("./root/analysis/run725.root"); + auto anatree = (TTree*) anafile->FindObjectAny("PhysicsTree"); + + auto SamuraiBDC = new TSamuraiBDCPhysics(); + anatree->SetBranchAddress("SamuraiBDC", &SamuraiBDC); + + //// BDC1 //// + vector<double> Wire_X_P1_BDC1, Wire_X_P2_BDC1; + vector<double> Wire_Z_P1_BDC1, Wire_Z_P2_BDC1 ; + vector<double> Wire_DriftLength_P1_BDC1, Wire_DriftLength_P2_BDC1; + double Track_a_P1_BDC1, Track_a_P2_BDC1; + double Track_b_P1_BDC1, Track_b_P2_BDC1; + double Track_D_P1_BDC1, Track_D_P2_BDC1; + double UpperXLimit_P1_BDC1,UpperXLimit_P2_BDC1, LowerXLimit_P1_BDC1, LowerXLimit_P2_BDC1; + + + //// BDC2 //// + vector<double> Wire_X_P1_BDC2, Wire_X_P2_BDC2; + vector<double> Wire_Z_P1_BDC2, Wire_Z_P2_BDC2 ; + vector<double> Wire_DriftLength_P1_BDC2, Wire_DriftLength_P2_BDC2; + double Track_a_P1_BDC2, Track_a_P2_BDC2; + double Track_b_P1_BDC2, Track_b_P2_BDC2; + double Track_D_P1_BDC2, Track_D_P2_BDC2; + double UpperXLimit_P1_BDC2,UpperXLimit_P2_BDC2, LowerXLimit_P1_BDC2, LowerXLimit_P2_BDC2; + + + TCanvas *c1 = new TCanvas(); + c1->Divide(2,2); + + //// BDC1 //// + TGraph *g1 = new TGraph(); + g1->GetXaxis()->SetTitle("X"); + g1->GetYaxis()->SetTitle("Z"); + + TGraph *g2 = new TGraph(); + g2->GetXaxis()->SetTitle("X"); + g2->GetYaxis()->SetTitle("Z"); + + + //// BDC2 //// + TGraph *g3 = new TGraph(); + g3->GetXaxis()->SetTitle("X"); + g3->GetYaxis()->SetTitle("Z"); + + TGraph *g4 = new TGraph(); + g4->GetXaxis()->SetTitle("X"); + g4->GetYaxis()->SetTitle("Z"); + + unsigned int n = 145; + for( unsigned int i = n; i < (n +1); i++) + { + anatree->GetEntry(i); + + //// BDC1 //// + unsigned int VectorEntriesBDC1 = SamuraiBDC->GetMultDet(1); + if(VectorEntriesBDC1==0) return; + for (unsigned int j = 0; j < VectorEntriesBDC1 ; j++) + { + if(SamuraiBDC->Wire_PosAngle[1][j]==0) + { + g1->SetPoint(g1->GetN(), SamuraiBDC->Wire_PosX[1][j],SamuraiBDC->Wire_PosZ[1][j]); + + Wire_X_P1_BDC1.push_back(SamuraiBDC->Wire_PosX[1][j]); + Wire_Z_P1_BDC1.push_back(SamuraiBDC->Wire_PosZ[1][j]); + Wire_DriftLength_P1_BDC1.push_back(SamuraiBDC->Wire_PosR[1][j]); + Track_a_P1_BDC1 = 1/SamuraiBDC->Track_a[1][0]; + Track_b_P1_BDC1 = -Track_a_P1_BDC1*SamuraiBDC->Track_b[1][0]; + Track_D_P1_BDC1 = SamuraiBDC->Track_D[1][0]; + } + + if(SamuraiBDC->Wire_PosAngle[1][j]!=0) + { + g2->SetPoint(g2->GetN(), SamuraiBDC->Wire_PosX[1][j],SamuraiBDC->Wire_PosZ[1][j]); + + Wire_X_P2_BDC1.push_back(SamuraiBDC->Wire_PosX[1][j]); + Wire_Z_P2_BDC1.push_back(SamuraiBDC->Wire_PosZ[1][j]); + Wire_DriftLength_P2_BDC1.push_back(SamuraiBDC->Wire_PosR[1][j]); + Track_a_P2_BDC1 = 1/SamuraiBDC->Track_a[1][1]; + Track_b_P2_BDC1 = -Track_a_P2_BDC1*SamuraiBDC->Track_b[1][1]; + Track_D_P2_BDC1 = SamuraiBDC->Track_D[1][1]; + } + + } + + //// BDC2 //// + unsigned int VectorEntriesBDC2 = SamuraiBDC->GetMultDet(2); + if(VectorEntriesBDC2==0) return; + for (unsigned int j = 0; j < VectorEntriesBDC2 ; j++) + { + if(SamuraiBDC->Wire_PosAngle[2][j]==0) + { + g3->SetPoint(g3->GetN(), SamuraiBDC->Wire_PosX[2][j],SamuraiBDC->Wire_PosZ[2][j]); + + Wire_X_P1_BDC2.push_back(SamuraiBDC->Wire_PosX[2][j]); + Wire_Z_P1_BDC2.push_back(SamuraiBDC->Wire_PosZ[2][j]); + Wire_DriftLength_P1_BDC2.push_back(SamuraiBDC->Wire_PosR[2][j]); + Track_a_P1_BDC2 = 1/SamuraiBDC->Track_a[2][0]; + Track_b_P1_BDC2 = -Track_a_P1_BDC2*SamuraiBDC->Track_b[2][0]; + Track_D_P1_BDC2 = SamuraiBDC->Track_D[2][0]; + } + + if(SamuraiBDC->Wire_PosAngle[2][j]!=0) + { + g4->SetPoint(g4->GetN(), SamuraiBDC->Wire_PosX[2][j],SamuraiBDC->Wire_PosZ[2][j]); + + Wire_X_P2_BDC2.push_back(SamuraiBDC->Wire_PosX[2][j]); + Wire_Z_P2_BDC2.push_back(SamuraiBDC->Wire_PosZ[2][j]); + Wire_DriftLength_P2_BDC2.push_back(SamuraiBDC->Wire_PosR[2][j]); + Track_a_P2_BDC2 = 1/SamuraiBDC->Track_a[2][1]; + Track_b_P2_BDC2 = -Track_a_P2_BDC2*SamuraiBDC->Track_b[2][1]; + Track_D_P2_BDC2 = SamuraiBDC->Track_D[2][1]; + } + + } + + //// BDC1 //// + + UpperXLimit_P1_BDC1 = Wire_X_P1_BDC1[0] + 50; + LowerXLimit_P1_BDC1 = Wire_X_P1_BDC1[0] - 50; + + cout << "Track_a_P1_BDC1 = " << Track_a_P1_BDC1 << endl; + cout << "Track_b_P1_BDC1 = " << Track_b_P1_BDC1 << endl; + cout << "Track_D_P1_BDC1 = " << Track_D_P1_BDC1 << endl; + cout << endl; + + UpperXLimit_P2_BDC1 = Wire_X_P2_BDC1[0] + 50; + LowerXLimit_P2_BDC1 = Wire_X_P2_BDC1[0] - 50; + + cout << "Track_a_P2_BDC1 = " << Track_a_P2_BDC1 << endl; + cout << "Track_b_P2_BDC1 = " << Track_b_P2_BDC1 << endl; + cout << "Track_D_P2_BDC1 = " << Track_D_P2_BDC1 << endl; + cout << endl; + + //// BDC2 //// + + UpperXLimit_P1_BDC2 = Wire_X_P1_BDC2[0] + 50; + LowerXLimit_P1_BDC2 = Wire_X_P1_BDC2[0] - 50; + + cout << "Track_a_P1_BDC2 = " << Track_a_P1_BDC2 << endl; + cout << "Track_b_P1_BDC2 = " << Track_b_P1_BDC2 << endl; + cout << "Track_D_P1_BDC2 = " << Track_D_P1_BDC2 << endl; + cout << endl; + + UpperXLimit_P2_BDC2 = Wire_X_P2_BDC2[0] + 50; + LowerXLimit_P2_BDC2 = Wire_X_P2_BDC2[0] - 50; + + cout << "Track_a_P2_BDC2 = " << Track_a_P2_BDC2 << endl; + cout << "Track_b_P2_BDC2 = " << Track_b_P2_BDC2 << endl; + cout << "Track_D_P2_BDC2 = " << Track_D_P2_BDC2 << endl; + + + /////////// Draw ///////////// + + //// BDC1 //// + ///// Plan 1 ///// + c1->cd(1); + g1->Draw("AP"); + cout << "Number of Wires with information in plan 1 = " << Wire_X_P1_BDC1.size() << endl; + for(unsigned int j=0; j< Wire_X_P1_BDC1.size(); j++){ + TEllipse *circle1 = new TEllipse(Wire_X_P1_BDC1[j],Wire_Z_P1_BDC1[j],Wire_DriftLength_P1_BDC1[j],Wire_DriftLength_P1_BDC1[j]); + circle1->Draw(); + } + + TH1 *t1 = g1->GetHistogram(); + t1->GetXaxis()->SetLimits(LowerXLimit_P1_BDC1, UpperXLimit_P1_BDC1); + t1->GetYaxis()->SetRangeUser(-40,40); + + auto f1 = new TF1("f1","[0]*x+[1]",-200,200); + f1->SetParameters(Track_a_P1_BDC1,Track_b_P1_BDC1); + + double YLine1_P1_BDC1 = f1->Eval(LowerXLimit_P1_BDC1); + double YLine2_P1_BDC1 = f1->Eval(UpperXLimit_P1_BDC1); + + TLine *l1=new TLine(LowerXLimit_P1_BDC1,YLine1_P1_BDC1,UpperXLimit_P1_BDC1,YLine2_P1_BDC1); + l1->SetLineColor(kBlue); + l1->SetLineWidth(2); + l1->Draw("SAME"); + + ///// Plan 2 ///// + c1->cd(2); + g2->Draw("AP"); + cout << "Number of Wires with information in plan 2 = " << Wire_X_P2_BDC1.size() << endl; + for(unsigned int j=0; j< Wire_X_P2_BDC1.size(); j++){ + TEllipse *circle2 = new TEllipse(Wire_X_P2_BDC1[j],Wire_Z_P2_BDC1[j],Wire_DriftLength_P2_BDC1[j],Wire_DriftLength_P2_BDC1[j]); + circle2->Draw(); + } + + TH1 *t2 = g2->GetHistogram(); + t2->GetXaxis()->SetLimits(LowerXLimit_P2_BDC1, UpperXLimit_P2_BDC1); + t2->GetYaxis()->SetRangeUser(-40,40); + + auto f2 = new TF1("f2","[0]*x+[1]",-200,200); + f2->SetParameters(Track_a_P2_BDC1,Track_b_P2_BDC1); + + double YLine1_P2_BDC1 = f2->Eval(LowerXLimit_P2_BDC1); + double YLine2_P2_BDC1 = f2->Eval(UpperXLimit_P2_BDC1); + + TLine *l2=new TLine(LowerXLimit_P2_BDC1,YLine1_P2_BDC1,UpperXLimit_P2_BDC1,YLine2_P2_BDC1); + l2->SetLineColor(kBlue); + l2->SetLineWidth(2); + l2->Draw("SAME"); + + +//// BDC2 //// + ///// Plan 1 ///// + c1->cd(3); + g3->Draw("AP"); + cout << "Number of Wires with information in plan 1 = " << Wire_X_P1_BDC2.size() << endl; + for(unsigned int j=0; j< Wire_X_P1_BDC2.size(); j++){ + TEllipse *circle3 = new TEllipse(Wire_X_P1_BDC2[j],Wire_Z_P1_BDC2[j],Wire_DriftLength_P1_BDC2[j],Wire_DriftLength_P1_BDC2[j]); + circle3->Draw(); + } + + TH1 *t3 = g3->GetHistogram(); + t3->GetXaxis()->SetLimits(LowerXLimit_P1_BDC2, UpperXLimit_P1_BDC2); + t3->GetYaxis()->SetRangeUser(-40,40); + + auto f3 = new TF1("f3","[0]*x+[1]",-200,200); + f3->SetParameters(Track_a_P1_BDC2,Track_b_P1_BDC2); + + double YLine1_P1_BDC2 = f3->Eval(LowerXLimit_P1_BDC2); + double YLine2_P1_BDC2 = f3->Eval(UpperXLimit_P1_BDC2); + + TLine *l3=new TLine(LowerXLimit_P1_BDC2,YLine1_P1_BDC2,UpperXLimit_P1_BDC2,YLine2_P1_BDC2); + l3->SetLineColor(kBlue); + l3->SetLineWidth(2); + l3->Draw("SAME"); + + ///// Plan 2 ///// + c1->cd(4); + g4->Draw("AP"); + cout << "Number of Wires with information in plan 2 = " << Wire_X_P2_BDC2.size() << endl; + for(unsigned int j=0; j< Wire_X_P2_BDC2.size(); j++){ + TEllipse *circle4 = new TEllipse(Wire_X_P2_BDC2[j],Wire_Z_P2_BDC2[j],Wire_DriftLength_P2_BDC2[j],Wire_DriftLength_P2_BDC2[j]); + circle4->Draw(); + } + + TH1 *t4 = g4->GetHistogram(); + t4->GetXaxis()->SetLimits(LowerXLimit_P2_BDC2, UpperXLimit_P2_BDC2); + t4->GetYaxis()->SetRangeUser(-40,40); + + auto f4 = new TF1("f4","[0]*x+[1]",-200,200); + f4->SetParameters(Track_a_P2_BDC2,Track_b_P2_BDC2); + + double YLine1_P2_BDC2 = f4->Eval(LowerXLimit_P2_BDC2); + double YLine2_P2_BDC2 = f4->Eval(UpperXLimit_P2_BDC2); + + TLine *l4=new TLine(LowerXLimit_P2_BDC2,YLine1_P2_BDC2,UpperXLimit_P2_BDC2,YLine2_P2_BDC2); + l4->SetLineColor(kBlue); + l4->SetLineWidth(2); + l4->Draw("SAME"); + + + + + + }// end of for loop + + +} + + + diff --git a/Projects/S034/macro/DriftChamber/DrawDCReconstructionFDC0.cxx b/Projects/S034/macro/DriftChamber/DrawDCReconstructionFDC0.cxx new file mode 100644 index 000000000..8819ad5ee --- /dev/null +++ b/Projects/S034/macro/DriftChamber/DrawDCReconstructionFDC0.cxx @@ -0,0 +1,145 @@ +#include<iostream> +#include <string> +#include "TString.h" +#include "TEllipse.h" +using namespace std; + +void DrawDCReconstructionFDC0(){ + + auto anafile = new TFile("./root/analysis/run725.root"); + auto anatree = (TTree*) anafile->FindObjectAny("PhysicsTree"); + + auto SamuraiFDC0 = new TSamuraiFDC0Physics(); + anatree->SetBranchAddress("SamuraiFDC0", &SamuraiFDC0); + + vector<double> Wire_X_P1, Wire_X_P2; + vector<double> Wire_Z_P1, Wire_Z_P2 ; + vector<double> Wire_DriftLength_P1, Wire_DriftLength_P2; + double Track_a_P1, Track_a_P2; + double Track_b_P1, Track_b_P2; + double Track_D_P1, Track_D_P2; + + double UpperXLimit_P1,UpperXLimit_P2, LowerXLimit_P1, LowerXLimit_P2 ; + + TCanvas *c1 = new TCanvas(); + c1->Divide(2,1); + + TGraph *g1 = new TGraph(); + g1->GetXaxis()->SetTitle("X"); + g1->GetYaxis()->SetTitle("Z"); + + TGraph *g2 = new TGraph(); + g2->GetXaxis()->SetTitle("X"); + g2->GetYaxis()->SetTitle("Z"); + + unsigned int n = 16; + for( unsigned int i = n; i < (n +1); i++) + { + anatree->GetEntry(i); + unsigned int VectorEntries = SamuraiFDC0->GetMult(); + + if(VectorEntries==0) return; + + for (unsigned int j = 0; j < VectorEntries ; j++) + { + if(SamuraiFDC0->Wire_PosAngle[j]==0) + { + g1->SetPoint(g1->GetN(), SamuraiFDC0->Wire_PosX[j],SamuraiFDC0->Wire_PosZ[j]); + + Wire_X_P1.push_back(SamuraiFDC0->Wire_PosX[j]); + Wire_Z_P1.push_back(SamuraiFDC0->Wire_PosZ[j]); + Wire_DriftLength_P1.push_back(SamuraiFDC0->Wire_PosR[j]); + Track_a_P1 = 1/SamuraiFDC0->Track_a[0]; + Track_b_P1 = -Track_a_P1*SamuraiFDC0->Track_b[0]; + Track_D_P1 = SamuraiFDC0->Track_D[0]; + } + + if(SamuraiFDC0->Wire_PosAngle[j]!=0) + { + g2->SetPoint(g2->GetN(), SamuraiFDC0->Wire_PosX[j],SamuraiFDC0->Wire_PosZ[j]); + + Wire_X_P2.push_back(SamuraiFDC0->Wire_PosX[j]); + Wire_Z_P2.push_back(SamuraiFDC0->Wire_PosZ[j]); + Wire_DriftLength_P2.push_back(SamuraiFDC0->Wire_PosR[j]); + Track_a_P2 = 1/SamuraiFDC0->Track_a[1]; + Track_b_P2 = -Track_a_P2*SamuraiFDC0->Track_b[1]; + Track_D_P2 = SamuraiFDC0->Track_D[1]; + } + + } + + UpperXLimit_P1 = Wire_X_P1[0] + 50; + LowerXLimit_P1 = Wire_X_P1[0] - 50; + + cout << "Track_a_P1 = " << Track_a_P1 << endl; + cout << "Track_b_P1 = " << Track_b_P1 << endl; + cout << "Track_D_P1 = " << Track_D_P1 << endl; + cout << endl; + + UpperXLimit_P2 = Wire_X_P2[0] + 50; + LowerXLimit_P2 = Wire_X_P2[0] - 50; + + cout << "Track_a_P2 = " << Track_a_P2 << endl; + cout << "Track_b_P2 = " << Track_b_P2 << endl; + cout << "Track_D_P2 = " << Track_D_P2 << endl; + + /////////// Draw ///////////// + + ///// Plan 1 ///// + c1->cd(1); + g1->Draw("AP"); + cout << "Number of Wires with information in plan 1 = " << Wire_X_P1.size() << endl; + for(unsigned int j=0; j< Wire_X_P1.size(); j++){ + TEllipse *circle1 = new TEllipse(Wire_X_P1[j],Wire_Z_P1[j],Wire_DriftLength_P1[j],Wire_DriftLength_P1[j]); + circle1->Draw(); + //cout << " circle drawn = " << j << endl; + } + + TH1 *t1 = g1->GetHistogram(); + t1->GetXaxis()->SetLimits(LowerXLimit_P1, UpperXLimit_P1); + t1->GetYaxis()->SetRangeUser(-40,40); + + auto f1 = new TF1("f1","[0]*x+[1]",-200,200); + f1->SetParameters(Track_a_P1,Track_b_P1); + + double YLine1_P1 = f1->Eval(LowerXLimit_P1); + double YLine2_P1 = f1->Eval(UpperXLimit_P1); + + TLine *l1=new TLine(LowerXLimit_P1,YLine1_P1,UpperXLimit_P1,YLine2_P1); + l1->SetLineColor(kBlue); + l1->SetLineWidth(2); + l1->Draw("SAME"); + + ///// Plan 2 ///// + c1->cd(2); + g2->Draw("AP"); + cout << "Number of Wires with information in plan 2 = " << Wire_X_P2.size() << endl; + for(unsigned int j=0; j< Wire_X_P2.size(); j++){ + TEllipse *circle2 = new TEllipse(Wire_X_P2[j],Wire_Z_P2[j],Wire_DriftLength_P2[j],Wire_DriftLength_P2[j]); + circle2->Draw(); + //cout << " circle drawn = " << j << endl; + } + + TH1 *t2 = g2->GetHistogram(); + t2->GetXaxis()->SetLimits(LowerXLimit_P2, UpperXLimit_P2); + t2->GetYaxis()->SetRangeUser(-40,40); + + auto f2 = new TF1("f2","[0]*x+[1]",-200,200); + f2->SetParameters(Track_a_P2,Track_b_P2); + + double YLine1_P2 = f2->Eval(LowerXLimit_P2); + double YLine2_P2 = f2->Eval(UpperXLimit_P2); + + TLine *l2=new TLine(LowerXLimit_P2,YLine1_P2,UpperXLimit_P2,YLine2_P2); + l2->SetLineColor(kBlue); + l2->SetLineWidth(2); + l2->Draw("SAME"); + + + }// end of for loop + + +} + + + diff --git a/Projects/S034/macro/DriftChamber/DrawDCReconstructionFDC2.cxx b/Projects/S034/macro/DriftChamber/DrawDCReconstructionFDC2.cxx new file mode 100644 index 000000000..dfda4982b --- /dev/null +++ b/Projects/S034/macro/DriftChamber/DrawDCReconstructionFDC2.cxx @@ -0,0 +1,192 @@ +#include<iostream> +#include <string> +#include "TString.h" +#include "TEllipse.h" +using namespace std; + +void DrawDCReconstructionFDC2(){ + + auto anafile = new TFile("./root/analysis/run725.root"); + auto anatree = (TTree*) anafile->FindObjectAny("PhysicsTree"); + + auto SamuraiFDC2 = new TSamuraiFDC2Physics(); + anatree->SetBranchAddress("SamuraiFDC2", &SamuraiFDC2); + + vector<double> Wire_X_P1, Wire_X_P2, Wire_X_P3; + vector<double> Wire_Z_P1, Wire_Z_P2, Wire_Z_P3 ; + vector<double> Wire_DriftLength_P1, Wire_DriftLength_P2,Wire_DriftLength_P3 ; + double Track_a_P1, Track_a_P2, Track_a_P3; + double Track_b_P1, Track_b_P2, Track_b_P3; + double Track_D_P1, Track_D_P2, Track_D_P3; + + double UpperXLimit_P1,UpperXLimit_P2,UpperXLimit_P3; + double LowerXLimit_P1, LowerXLimit_P2, LowerXLimit_P3 ; + + TCanvas *c1 = new TCanvas(); + c1->Divide(3,1); + + TGraph *g1 = new TGraph(); + g1->GetXaxis()->SetTitle("X"); + g1->GetYaxis()->SetTitle("Z"); + + TGraph *g2 = new TGraph(); + g2->GetXaxis()->SetTitle("X"); + g2->GetYaxis()->SetTitle("Z"); + + TGraph *g3 = new TGraph(); + g3->GetXaxis()->SetTitle("X"); + g3->GetYaxis()->SetTitle("Z"); + + unsigned int n = 824; + for( unsigned int i = n; i < (n +1); i++) + { + cout << i << endl; + anatree->GetEntry(i); + unsigned int VectorEntries = SamuraiFDC2->GetMult(); + if(VectorEntries==0) return; + + for (unsigned int j = 0; j < VectorEntries ; j++) + { + if(SamuraiFDC2->Wire_PosAngle[j]<0) + { + g1->SetPoint(g1->GetN(), SamuraiFDC2->Wire_PosX[j],SamuraiFDC2->Wire_PosZ[j]); + + Wire_X_P1.push_back(SamuraiFDC2->Wire_PosX[j]); + Wire_Z_P1.push_back(SamuraiFDC2->Wire_PosZ[j]); + Wire_DriftLength_P1.push_back(SamuraiFDC2->Wire_PosR[j]); + Track_a_P1 = 1/SamuraiFDC2->Track_a[0]; + Track_b_P1 = -Track_a_P1*SamuraiFDC2->Track_b[0]; + Track_D_P1 = SamuraiFDC2->Track_D[0]; + } + + if(SamuraiFDC2->Wire_PosAngle[j]==0) + { + g2->SetPoint(g2->GetN(), SamuraiFDC2->Wire_PosX[j],SamuraiFDC2->Wire_PosZ[j]); + + Wire_X_P2.push_back(SamuraiFDC2->Wire_PosX[j]); + Wire_Z_P2.push_back(SamuraiFDC2->Wire_PosZ[j]); + Wire_DriftLength_P2.push_back(SamuraiFDC2->Wire_PosR[j]); + Track_a_P2 = 1/SamuraiFDC2->Track_a[1]; + Track_b_P2 = -Track_a_P2*SamuraiFDC2->Track_b[1]; + Track_D_P2 = SamuraiFDC2->Track_D[1]; + } + + if(SamuraiFDC2->Wire_PosAngle[j]>0) + { + g3->SetPoint(g3->GetN(), SamuraiFDC2->Wire_PosX[j],SamuraiFDC2->Wire_PosZ[j]); + + Wire_X_P3.push_back(SamuraiFDC2->Wire_PosX[j]); + Wire_Z_P3.push_back(SamuraiFDC2->Wire_PosZ[j]); + Wire_DriftLength_P3.push_back(SamuraiFDC2->Wire_PosR[j]); + Track_a_P3 = 1/SamuraiFDC2->Track_a[2]; + Track_b_P3 = -Track_a_P3*SamuraiFDC2->Track_b[2]; + Track_D_P3 = SamuraiFDC2->Track_D[2]; + } + } + + UpperXLimit_P1 = Wire_X_P1[0] + 200; + LowerXLimit_P1 = Wire_X_P1[0] - 200; + + cout << "Track_a_P1 = " << Track_a_P1 << endl; + cout << "Track_b_P1 = " << Track_b_P1 << endl; + cout << "Track_D_P1 = " << Track_D_P1 << endl; + cout << endl; + + UpperXLimit_P2 = Wire_X_P2[0] + 200; + LowerXLimit_P2 = Wire_X_P2[0] - 200; + + cout << "Track_a_P2 = " << Track_a_P2 << endl; + cout << "Track_b_P2 = " << Track_b_P2 << endl; + cout << "Track_D_P2 = " << Track_D_P2 << endl; + cout << endl; + + UpperXLimit_P3 = Wire_X_P3[0] + 200; + LowerXLimit_P3 = Wire_X_P3[0] - 200; + + cout << "Track_a_P3 = " << Track_a_P3 << endl; + cout << "Track_b_P3 = " << Track_b_P3 << endl; + cout << "Track_D_P3 = " << Track_D_P3 << endl; + + /////////// Draw ///////////// + + ///// Plan 1 ///// + c1->cd(1); + g1->Draw("AP"); + cout << "Number of Wires with information in plan 1 = " << Wire_X_P1.size() << endl; + for(unsigned int j=0; j< Wire_X_P1.size(); j++){ + TEllipse *circle1 = new TEllipse(Wire_X_P1[j],Wire_Z_P1[j],Wire_DriftLength_P1[j],Wire_DriftLength_P1[j]); + circle1->Draw(); + } + + TH1 *t1 = g1->GetHistogram(); + t1->GetXaxis()->SetLimits(LowerXLimit_P1, UpperXLimit_P1); + t1->GetYaxis()->SetRangeUser(-400,400); + + auto f1 = new TF1("f1","[0]*x+[1]",-200,200); + f1->SetParameters(Track_a_P1,Track_b_P1); + + double YLine1_P1 = f1->Eval(LowerXLimit_P1); + double YLine2_P1 = f1->Eval(UpperXLimit_P1); + + TLine *l1=new TLine(LowerXLimit_P1,YLine1_P1,UpperXLimit_P1,YLine2_P1); + l1->SetLineColor(kBlue); + l1->SetLineWidth(2); + l1->Draw("SAME"); + + ///// Plan 2 ///// + c1->cd(2); + g2->Draw("AP"); + cout << "Number of Wires with information in plan 2 = " << Wire_X_P2.size() << endl; + for(unsigned int j=0; j< Wire_X_P2.size(); j++){ + TEllipse *circle2 = new TEllipse(Wire_X_P2[j],Wire_Z_P2[j],Wire_DriftLength_P2[j],Wire_DriftLength_P2[j]); + circle2->Draw(); + //cout << " circle drawn = " << j << endl; + } + + TH1 *t2 = g2->GetHistogram(); + t2->GetXaxis()->SetLimits(LowerXLimit_P2, UpperXLimit_P2); + t2->GetYaxis()->SetRangeUser(-400,400); + + auto f2 = new TF1("f2","[0]*x+[1]",-200,200); + f2->SetParameters(Track_a_P2,Track_b_P2); + + double YLine1_P2 = f2->Eval(LowerXLimit_P2); + double YLine2_P2 = f2->Eval(UpperXLimit_P2); + + TLine *l2=new TLine(LowerXLimit_P2,YLine1_P2,UpperXLimit_P2,YLine2_P2); + l2->SetLineColor(kBlue); + l2->SetLineWidth(2); + l2->Draw("SAME"); + + ///// Plan 3 ///// + c1->cd(3); + g3->Draw("AP"); + cout << "Number of Wires with information in plan 3 = " << Wire_X_P3.size() << endl; + for(unsigned int j=0; j< Wire_X_P3.size(); j++){ + TEllipse *circle3 = new TEllipse(Wire_X_P3[j],Wire_Z_P3[j],Wire_DriftLength_P3[j],Wire_DriftLength_P3[j]); + circle3->Draw(); + } + + TH1 *t3 = g3->GetHistogram(); + t3->GetXaxis()->SetLimits(LowerXLimit_P3, UpperXLimit_P3); + t3->GetYaxis()->SetRangeUser(-400,400); + + auto f3 = new TF1("f3","[0]*x+[1]",-200,200); + f3->SetParameters(Track_a_P3,Track_b_P3); + + double YLine1_P3 = f3->Eval(LowerXLimit_P3); + double YLine2_P3 = f3->Eval(UpperXLimit_P3); + + TLine *l3=new TLine(LowerXLimit_P3,YLine1_P3,UpperXLimit_P3,YLine2_P3); + l3->SetLineColor(kBlue); + l3->SetLineWidth(2); + l3->Draw("SAME"); + + + }// end of for loop + + +} + + + diff --git a/Projects/S034/macro/DriftChamber/ResolutionBDC.cxx b/Projects/S034/macro/DriftChamber/ResolutionBDC.cxx new file mode 100644 index 000000000..bf0395002 --- /dev/null +++ b/Projects/S034/macro/DriftChamber/ResolutionBDC.cxx @@ -0,0 +1,297 @@ +using namespace std; + +//#include "TSamuraiBDCPhysics.h" + +void ResolutionBDC(){ + + auto simufile = new TFile("root/simulation/SimulationResolutionBDCV2.root"); + auto simutree = (TTree*) simufile->FindObjectAny("SimulatedTree"); + + auto anafile = new TFile("root/analysis/AnalysisResolutionBDCV2.root"); + auto anatree = (TTree*) anafile->FindObjectAny("PhysicsTree"); + + simutree->AddFriend(anatree); + + TH1 *hResolutionX_BDC1 = new TH1D("hResolutionX_BDC1", "hResolutionX_BDC1",100, -0.2,0.2); + TH1 *hResolutionY_BDC1 = new TH1D("hResolutionY_BDC1", "hResolutionY_BDC1",100, -0.2,0.2); + + TH1 *hResolutionX_BDC2 = new TH1D("hResolutionX_BDC2", "hResolutionX_BDC2",100, -0.2,0.2); + TH1 *hResolutionY_BDC2 = new TH1D("hResolutionY_BDC2", "hResolutionY_BDC2",100, -0.2,0.2); + + double X_Beam, Y_Beam, Z_Beam; + X_Beam = 0.0; + Y_Beam = 0.0; + Z_Beam = -7000; //mm + + vector<double> *PosInWireX = new vector <double>(); + vector<double> *PosInWireY = new vector <double>(); + vector<double> *PosInWireZ = new vector <double>(); + + simutree->SetBranchAddress("PosInWireX",&PosInWireX); + simutree->SetBranchAddress("PosInWireY",&PosInWireY); + simutree->SetBranchAddress("PosInWireZ",&PosInWireZ); + + auto SamuraiBDC = new TSamuraiBDCData(); + simutree->SetBranchAddress("SamuraiBDC", &SamuraiBDC); + + auto PhysicsBDC = new TSamuraiBDCPhysics(); + anatree->SetBranchAddress("SamuraiBDC", &PhysicsBDC); + + //Position calculated in PhysicsSamuraiBDC.cxx + double PosX_calc_BDC1,PosY_calc_BDC1,PosZ_calc_BDC1; + double PosX_calc_BDC2,PosY_calc_BDC2,PosZ_calc_BDC2; + + TVector3 Pos_calc_BDC1; + TVector3 Pos_calc_BDC2; + + // Two points on the particle track( to calculate the expected value) + double PointA_X_BDC1, PointA_Y_BDC1, PointA_Z_BDC1; + double PointB_X_BDC1, PointB_Y_BDC1, PointB_Z_BDC1; + + double PointA_X_BDC2, PointA_Y_BDC2, PointA_Z_BDC2; + double PointB_X_BDC2, PointB_Y_BDC2, PointB_Z_BDC2; + + // True position in simulation + double PosX_simu_BDC1, PosY_simu_BDC1, PosZ_simu_BDC1; + double PosX_simu_BDC2, PosY_simu_BDC2, PosZ_simu_BDC2; + + double Diff_X_BDC1, Diff_Y_BDC1, Radius_BDC1; + double Diff_X_BDC2, Diff_Y_BDC2, Radius_BDC2; + + double Theta_XZ_BDC1, Theta_YZ_BDC1; + double Theta_XZ_BDC2, Theta_YZ_BDC2; + + int PileUp_BDC1; + int PileUp_BDC2; + + ///////// Ouput //////////// + + auto *outFile = new TFile("./root/resolution/ResolutionBDC.root","RECREATE"); + TTree *outTree = new TTree("OutTree", "OutTree"); + + outTree->Branch("PosX_calc_BDC1",&PosX_calc_BDC1); + outTree->Branch("PosY_calc_BDC1",&PosY_calc_BDC1); + outTree->Branch("PosZ_calc_BDC1",&PosZ_calc_BDC1); + + outTree->Branch("PosX_calc_BDC2",&PosX_calc_BDC2); + outTree->Branch("PosY_calc_BDC2",&PosY_calc_BDC2); + outTree->Branch("PosZ_calc_BDC2",&PosZ_calc_BDC2); + + outTree->Branch("PosX_simu_BDC1",&PosX_simu_BDC1); + outTree->Branch("PosY_simu_BDC1",&PosY_simu_BDC1); + outTree->Branch("PosZ_simu_BDC1",&PosZ_simu_BDC1); + + outTree->Branch("PosX_simu_BDC2",&PosX_simu_BDC2); + outTree->Branch("PosY_simu_BDC2",&PosY_simu_BDC2); + outTree->Branch("PosZ_simu_BDC2",&PosZ_simu_BDC2); + + outTree->Branch("Diff_X_BDC1",&Diff_X_BDC1); + outTree->Branch("Diff_Y_BDC1",&Diff_Y_BDC1); + + outTree->Branch("Diff_X_BDC2",&Diff_X_BDC2); + outTree->Branch("Diff_Y_BDC2",&Diff_Y_BDC2); + + outTree->Branch("Radius_BDC1",&Radius_BDC1); + outTree->Branch("Radius_BDC2",&Radius_BDC2); + + outTree->Branch("Theta_XZ_BDC1", &Theta_XZ_BDC1); + outTree->Branch("Theta_YZ_BDC1", &Theta_YZ_BDC1); + + outTree->Branch("Theta_XZ_BDC2", &Theta_XZ_BDC2); + outTree->Branch("Theta_YZ_BDC2", &Theta_YZ_BDC2); + + outTree->Branch("PileUp_BDC1", &PileUp_BDC1); + outTree->Branch("PileUp_BDC2", &PileUp_BDC2); + + //////// Resolution calculation ////// + unsigned int TreeEntries = simutree->GetEntries(); + + for(unsigned int i = 0; i < TreeEntries; i++) + { + Diff_X_BDC1 = -10000; + Diff_Y_BDC1 = -10000; + + Diff_X_BDC2 = -10000; + Diff_Y_BDC2 = -10000; + + PosX_calc_BDC1 = PosY_calc_BDC1 = PosZ_calc_BDC1 = -10000; + PosX_calc_BDC2 = PosY_calc_BDC2 = PosZ_calc_BDC2 = -10000; + + PosX_simu_BDC1 = PosY_simu_BDC1 = PosZ_simu_BDC1 = -10000; + PosX_simu_BDC2 = PosY_simu_BDC2 = PosZ_simu_BDC2 = -10000; + + PointA_X_BDC1 = PointA_Y_BDC1 = PointA_Z_BDC1 = PointB_X_BDC1 = PointB_Y_BDC1 = PointB_Z_BDC1 = -10000; + PointA_X_BDC2 = PointA_Y_BDC2 = PointA_Z_BDC2 = PointB_X_BDC2 = PointB_Y_BDC2 = PointB_Z_BDC2 = -10000; + + PileUp_BDC1 = PileUp_BDC2 = -10000; + + + simutree->GetEntry(i); + + unsigned int VectorEntries = SamuraiBDC->Mult(); + + Pos_calc_BDC1 = PhysicsBDC->GetPos(1); + + PosX_calc_BDC1 = Pos_calc_BDC1[0]; + PosY_calc_BDC1 = Pos_calc_BDC1[1]; + PosZ_calc_BDC1 = Pos_calc_BDC1[2]; + + Pos_calc_BDC2 = PhysicsBDC->GetPos(2); + + PosX_calc_BDC2 = Pos_calc_BDC2[0]; + PosY_calc_BDC2 = Pos_calc_BDC2[1]; + PosZ_calc_BDC2 = Pos_calc_BDC2[2]; + + PileUp_BDC1 = PhysicsBDC->GetPileUp(0); + PileUp_BDC2 = PhysicsBDC->GetPileUp(1); + + for ( unsigned int j = 0; j < VectorEntries ; j++) + { + if(SamuraiBDC->GetEdge(j)==1 && SamuraiBDC->GetDetectorNbr(j)==1 && (PointB_Z_BDC1 < PosZ_calc_BDC1)) + { + PointA_X_BDC1 = PointB_X_BDC1; + PointA_Y_BDC1 = PointB_Y_BDC1; + PointA_Z_BDC1 = PointB_Z_BDC1; + + PointB_X_BDC1 = PosInWireX->at(j); + PointB_Y_BDC1 = PosInWireY->at(j); + PointB_Z_BDC1 = PosInWireZ->at(j); + + // cout << PosInWireX->at(j) << endl; + // cout << PosInWireY->at(j) << endl; + // cout << PosInWireZ->at(j) << endl; + // cout << endl; + } + + if(SamuraiBDC->GetEdge(j)==1 && SamuraiBDC->GetDetectorNbr(j)==2 && (PointB_Z_BDC2 < PosZ_calc_BDC2)) + { + PointA_X_BDC2 = PointB_X_BDC2; + PointA_Y_BDC2 = PointB_Y_BDC2; + PointA_Z_BDC2 = PointB_Z_BDC2; + + PointB_X_BDC2 = PosInWireX->at(j); + PointB_Y_BDC2 = PosInWireY->at(j); + PointB_Z_BDC2 = PosInWireZ->at(j); + + // cout << PosInWireX->at(j) << endl; + // cout << PosInWireY->at(j) << endl; + // cout << PosInWireZ->at(j) << endl; + // cout << endl; + } + + + + else if(SamuraiBDC->GetEdge(j)==0) + continue; + + // else + // { + // cout << SamuraiBDC->GetDetectorNbr(j) << endl; + // cout << SamuraiBDC->GetEdge(j) << endl; + // cout << "ERROR: edge value must be equal to 1 or 0, check the simulated tree" << endl; + // exit(1); + // } + + if(PointB_Z_BDC1 > PosZ_calc_BDC1 && PointB_Z_BDC2 > PosZ_calc_BDC2) { + break; + } + + + }//end loop for j + + //cout << endl; + + TVector3 PointA_BDC1 (PointA_X_BDC1, PointA_Y_BDC1, PointA_Z_BDC1); + TVector3 PointB_BDC1 (PointB_X_BDC1, PointB_Y_BDC1, PointB_Z_BDC1); + + TVector3 Direct_BDC1; + Direct_BDC1 = PointB_BDC1 - PointA_BDC1; + + TVector3 Pos_simu_BDC1 = PointA_BDC1 + ((PosZ_calc_BDC1 - PointA_BDC1[2]) / Direct_BDC1[2])*Direct_BDC1; + + PosX_simu_BDC1 = Pos_simu_BDC1[0]; + PosY_simu_BDC1 = Pos_simu_BDC1[1]; + PosZ_simu_BDC1 = Pos_simu_BDC1[2]; + + Diff_X_BDC1 = PosX_calc_BDC1 - PosX_simu_BDC1; + Diff_Y_BDC1 = PosY_calc_BDC1 - PosY_simu_BDC1; + + Radius_BDC1 = sqrt(PosX_simu_BDC1*PosX_simu_BDC1 + PosY_simu_BDC1*PosY_simu_BDC1); + + Theta_XZ_BDC1 = atan2(PosX_simu_BDC1 - X_Beam,PosZ_simu_BDC1 - Z_Beam)*180.0/TMath::Pi(); + Theta_YZ_BDC1 = atan2( PosY_simu_BDC1 - Y_Beam,PosZ_simu_BDC1 - Z_Beam)*180.0/TMath::Pi(); + + + //cout << PosZ_simu_BDC1 << " " << PosZ_calc_BDC1 << endl; + + + //cout << "calc X = " << PosX_simu_BDC1 << " simu = " << PosX_calc_BDC1 << endl; + // cout << "calc Y = " << PosY_simu_BDC1 << " simu = " << PosY_calc_BDC1 << endl; + if(PosZ_simu_BDC1 != -10000){ + hResolutionX_BDC1->Fill(Diff_X_BDC1); + hResolutionY_BDC1->Fill(Diff_Y_BDC1); + } + + + + + + TVector3 PointA_BDC2 (PointA_X_BDC2, PointA_Y_BDC2, PointA_Z_BDC2); + TVector3 PointB_BDC2 (PointB_X_BDC2, PointB_Y_BDC2, PointB_Z_BDC2); + + TVector3 Direct_BDC2; + Direct_BDC2 = PointB_BDC2 - PointA_BDC2; + + TVector3 Pos_simu_BDC2 = PointA_BDC2 + ((PosZ_calc_BDC2 - PointA_BDC2[2]) / Direct_BDC2[2])*Direct_BDC2; + + PosX_simu_BDC2 = Pos_simu_BDC2[0]; + PosY_simu_BDC2 = Pos_simu_BDC2[1]; + PosZ_simu_BDC2 = Pos_simu_BDC2[2]; + + Diff_X_BDC2 = PosX_calc_BDC2 - PosX_simu_BDC2; + Diff_Y_BDC2 = PosY_calc_BDC2 - PosY_simu_BDC2; + + Radius_BDC2 = sqrt(PosX_simu_BDC2*PosX_simu_BDC2 + PosY_simu_BDC2*PosY_simu_BDC2); + + Theta_XZ_BDC2 = atan2(PosZ_simu_BDC2 - Z_Beam, PosX_simu_BDC2 - X_Beam)*180.0/TMath::Pi(); + Theta_YZ_BDC2 = atan2(PosZ_simu_BDC2 - Z_Beam, PosY_simu_BDC2 - Y_Beam)*180.0/TMath::Pi(); + + if(PosZ_simu_BDC2 != -10000){ + hResolutionX_BDC2->Fill(PosX_calc_BDC2-PosX_simu_BDC2); + hResolutionY_BDC2->Fill(PosY_calc_BDC2-PosY_simu_BDC2); + } + + + if(PosZ_simu_BDC2 == -10000 || PosX_simu_BDC2 == -10000 || PosY_simu_BDC2 == -10000) cout << " BDC2 -10000" << endl; + + if(PosZ_simu_BDC1 == -10000 || PosX_simu_BDC1 == -10000 || PosY_simu_BDC1 == -10000) cout << " BDC1 -10000" << endl; + + + outTree->Fill(); + }//end loop i + + outTree->AutoSave(); + + cout << hResolutionX_BDC1->GetRMS() << endl; + cout << hResolutionY_BDC1->GetRMS() << endl; + + cout << hResolutionX_BDC2->GetRMS() << endl; + cout << hResolutionY_BDC2->GetRMS() << endl; + + TCanvas *c1 = new TCanvas(); + c1->Divide(2,2); + c1->cd(1); + hResolutionX_BDC1->Draw(); + + c1->cd(2); + hResolutionY_BDC1->Draw(); + + c1->cd(3); + hResolutionX_BDC2->Draw(); + + c1->cd(4); + hResolutionY_BDC2->Draw(); + + + +} diff --git a/Projects/S034/macro/DriftChamber/ResolutionFDC0.cxx b/Projects/S034/macro/DriftChamber/ResolutionFDC0.cxx new file mode 100755 index 000000000..112ba05d9 --- /dev/null +++ b/Projects/S034/macro/DriftChamber/ResolutionFDC0.cxx @@ -0,0 +1,186 @@ +using namespace std; + + +void ResolutionFDC0(){ + + ///////////// Input ///////////// + // Get data from simulation and experimental data trees + auto simufile = new TFile("root/simulation/SimulationResolutionFDC0V2.root"); + //auto simufile = new TFile("root/simulation/SimuWhtDriftMinos.root"); + auto simutree = (TTree*) simufile->FindObjectAny("SimulatedTree"); + + auto anafile = new TFile("root/analysis/AnalysisResolutionFDC0V2.root"); + //auto anafile = new TFile("root/analysis/SimuWhtDriftMinos.root"); + auto anatree = (TTree*) anafile->FindObjectAny("PhysicsTree"); + + simutree->AddFriend(anatree); + + TH1 *hResolutionX = new TH1D("hResolutionX", "hResolutionX",200, -0.05,0.05); + TH1 *hResolutionY = new TH1D("hResolutionY", "hResolutionY",200, -0.05,0.05); + + double X_Beam, Y_Beam, Z_Beam; + X_Beam = 0.0; + Y_Beam = 0.0; + Z_Beam = -7000; //mm + + vector<double> *PosInWireX = new vector <double>(); + vector<double> *PosInWireY = new vector <double>(); + vector<double> *PosInWireZ = new vector <double>(); + + simutree->SetBranchAddress("PosInWireX",&PosInWireX); //Position for each wire + simutree->SetBranchAddress("PosInWireY",&PosInWireY); + simutree->SetBranchAddress("PosInWireZ",&PosInWireZ); + + auto SamuraiFDC0 = new TSamuraiFDC0Data(); + simutree->SetBranchAddress("SamuraiFDC0", &SamuraiFDC0); + + auto PhysicsFDC0 = new TSamuraiFDC0Physics(); + anatree->SetBranchAddress("SamuraiFDC0", &PhysicsFDC0); + + double PosX_calc, PosY_calc, PosZ;//Position calculated in PhysicsSamuraiFDC0.cxx + + // Two points on the particle track( to calculate the expected value) + double PointA_X, PointA_Y, PointA_Z; + double PointB_X, PointB_Y, PointB_Z; + + // True position in simulation + double PosX_simu, PosY_simu, PosZ_simu; + + double Diff_X, Diff_Y, Radius; + + double Theta_XZ, Theta_YZ; + + int PileUp, Mult; + ///////// Ouput //////////// + + auto *outFile = new TFile("./root/resolution/ResolutionFDC0.root","RECREATE"); + TTree *outTree = new TTree("OutTree", "OutTree"); + + outTree->Branch("PosX_calc",&PosX_calc); + outTree->Branch("PosY_calc",&PosY_calc); + outTree->Branch("PosZ_calc",&PosZ); + + outTree->Branch("PosX_simu",&PosX_simu); + outTree->Branch("PosY_simu",&PosY_simu); + outTree->Branch("PosZ_simu",&PosZ_simu); + + outTree->Branch("Diff_X",&Diff_X); + outTree->Branch("Diff_Y",&Diff_Y); + + outTree->Branch("Radius",&Radius); + + outTree->Branch("Theta_XZ", &Theta_XZ); + outTree->Branch("Theta_YZ", &Theta_YZ); + + outTree->Branch("PileUp", &PileUp); + outTree->Branch("Mult", &Mult); + + //////// Resolution calculation ////// + + + unsigned int TreeEntries = anatree->GetEntries(); + + for( unsigned int i = 0; i < TreeEntries; i++) + { + Diff_X = -10000; + Diff_Y = -10000; + + PosX_simu = PosY_simu = PosZ_simu = -10000; + PosX_calc = PosY_calc = PosZ = -10000; + + PointA_X = PointA_Y = PointA_Z = PointB_X = PointB_Y = PointB_Z = -10000; + + PileUp = Mult = -10000; + + simutree->GetEntry(i); + + unsigned int VectorEntries = SamuraiFDC0->Mult(); + PosX_calc = PhysicsFDC0->GetPosX(); // position obtained from reconstruction + //cout << PosX_calc << endl; + PosY_calc = PhysicsFDC0->GetPosY(); + PosZ = PhysicsFDC0->GetPosZ(); + + PileUp = PhysicsFDC0->GetPileUp(); + Mult = PhysicsFDC0->GetMult(); + for ( unsigned int j = 0; j < VectorEntries ; j++) + { + if(SamuraiFDC0->GetEdge(j)==1) + { + PointA_X = PointB_X; + PointA_Y = PointB_Y; + PointA_Z = PointB_Z; + + PointB_X = PosInWireX->at(j); + PointB_Y = PosInWireY->at(j); + PointB_Z = PosInWireZ->at(j); + } + + else if( SamuraiFDC0->GetEdge(j)==0) + continue; + + else + { + cout << "ERROR: edge value must be equal to 1 or 0, check the simulated tree" << endl; + exit(1); + } + + if(PointB_Z > PosZ) { + break; + } + + + }//end loop for j + + //cout << endl; + + TVector3 PointA (PointA_X, PointA_Y, PointA_Z); + TVector3 PointB (PointB_X, PointB_Y, PointB_Z); + + TVector3 Direct; + Direct = PointB - PointA; + + TVector3 Pos_simu = PointA + ((PosZ - PointA[2]) / Direct[2])*Direct; + + PosX_simu = Pos_simu[0]; + PosY_simu = Pos_simu[1]; + PosZ_simu = Pos_simu[2]; + + Diff_X = PosX_calc - PosX_simu; + Diff_Y = PosY_calc - PosY_simu; + + cout << PosX_simu << " " << PosX_calc << " " << PosY_simu << " " << PosY_calc << endl; + cout << endl; + + Radius = sqrt(PosX_simu*PosX_simu + PosY_simu*PosY_simu); + + Theta_XZ = atan2(PosZ_simu - Z_Beam, PosX_simu - X_Beam)*180.0/TMath::Pi(); + Theta_YZ = atan2(PosZ_simu - Z_Beam, PosY_simu - Y_Beam)*180.0/TMath::Pi(); + + if(PosX_simu!= -10000 && PosY_simu!= -10000 && PosZ_simu != -10000 && PosX_calc!= -10000 && PosY_calc!= -10000 && PosZ!= -10000){ + hResolutionX->Fill(Diff_X); + hResolutionY->Fill(Diff_Y); + } + + outTree->Fill(); + + }//end loop i + + outTree->AutoSave(); + + cout << hResolutionX->GetRMS() << endl; + cout << hResolutionY->GetRMS() << endl; + + // double rootMeanSquare1 = std::sqrt( hResolutionX->GetMean()*hResolutionX->GetMean() + hResolutionX->GetRMS()*hResolutionX->GetRMS() ); + + + TCanvas *c1 = new TCanvas(); + c1->Divide(1,2); + c1->cd(1); + hResolutionX->Draw(); + + c1->cd(2); + hResolutionY->Draw(); + + + +} diff --git a/Projects/S034/macro/DriftChamber/ResolutionFDC2.cxx b/Projects/S034/macro/DriftChamber/ResolutionFDC2.cxx new file mode 100755 index 000000000..68ba7aa18 --- /dev/null +++ b/Projects/S034/macro/DriftChamber/ResolutionFDC2.cxx @@ -0,0 +1,183 @@ +using namespace std; + + +void ResolutionFDC2(){ + + ///////////// Input ///////////// + // Get data from simulation and experimental data trees + auto simufile = new TFile("root/simulation/SimulationResolutionFDC2V2.root"); + auto simutree = (TTree*) simufile->FindObjectAny("SimulatedTree"); + + auto anafile = new TFile("root/analysis/AnalysisResolutionFDC2V2.root"); + auto anatree = (TTree*) anafile->FindObjectAny("PhysicsTree"); + + simutree->AddFriend(anatree); + + TH1 *hResolutionX = new TH1D("hResolutionX", "hResolutionX",200, -0.05,0.05); + TH1 *hResolutionY = new TH1D("hResolutionY", "hResolutionY",200, -0.05,0.05); + + double X_Beam, Y_Beam, Z_Beam; + X_Beam = 0.0; + Y_Beam = 0.0; + Z_Beam = -7000; //mm + + vector<double> *PosInWireX = new vector <double>(); + vector<double> *PosInWireY = new vector <double>(); + vector<double> *PosInWireZ = new vector <double>(); + + simutree->SetBranchAddress("PosInWireX",&PosInWireX); //Position for each wire + simutree->SetBranchAddress("PosInWireY",&PosInWireY); + simutree->SetBranchAddress("PosInWireZ",&PosInWireZ); + + auto SamuraiFDC2 = new TSamuraiFDC2Data(); + simutree->SetBranchAddress("SamuraiFDC2", &SamuraiFDC2); + + auto PhysicsFDC2 = new TSamuraiFDC2Physics(); + anatree->SetBranchAddress("SamuraiFDC2", &PhysicsFDC2); + + double PosX_calc, PosY_calc, PosZ;//Position calculated in PhysicsSamuraiFDC2.cxx + + // Two points on the particle track( to calculate the expected value) + double PointA_X, PointA_Y, PointA_Z; + double PointB_X, PointB_Y, PointB_Z; + + // True position in simulation + double PosX_simu, PosY_simu, PosZ_simu; + + double Diff_X, Diff_Y, Radius; + + double Theta_XZ, Theta_YZ; + + int PileUp; + ///////// Ouput //////////// + + auto *outFile = new TFile("./root/resolution/ResolutionFDC2.root","RECREATE"); + TTree *outTree = new TTree("OutTree", "OutTree"); + + outTree->Branch("PosX_calc",&PosX_calc); + outTree->Branch("PosY_calc",&PosY_calc); + outTree->Branch("PosZ_calc",&PosZ); + + outTree->Branch("PosX_simu",&PosX_simu); + outTree->Branch("PosY_simu",&PosY_simu); + outTree->Branch("PosZ_simu",&PosZ_simu); + + outTree->Branch("Diff_X",&Diff_X); + outTree->Branch("Diff_Y",&Diff_Y); + + outTree->Branch("Radius",&Radius); + + outTree->Branch("Theta_XZ", &Theta_XZ); + outTree->Branch("Theta_YZ", &Theta_YZ); + + outTree->Branch("PileUp", &PileUp); + + //////// Resolution calculation ////// + + + unsigned int TreeEntries = simutree->GetEntries(); + + for( unsigned int i = 0; i < TreeEntries; i++) + { + //Clear(); + Diff_X = -10000; + Diff_Y = -10000; + + PosX_simu = PosY_simu = PosZ_simu = -10000; + PosX_calc = PosY_calc = PosZ = -10000; + + PointA_X = PointA_Y = PointA_Z = PointB_X = PointB_Y = PointB_Z = -10000; + + PileUp = -10000; + + simutree->GetEntry(i); + + unsigned int VectorEntries = SamuraiFDC2->Mult(); + PosX_calc = PhysicsFDC2->GetPosX(); // position obtained from reconstruction + //cout << PosX_calc << endl; + PosY_calc = PhysicsFDC2->GetPosY(); + PosZ = PhysicsFDC2->GetPosZ(); + + PileUp = PhysicsFDC2->GetPileUp(); + + + for ( unsigned int j = 0; j < VectorEntries ; j++) + { + if(SamuraiFDC2->GetEdge(j)==1) + { + PointA_X = PointB_X; + PointA_Y = PointB_Y; + PointA_Z = PointB_Z; + + PointB_X = PosInWireX->at(j); + PointB_Y = PosInWireY->at(j); + PointB_Z = PosInWireZ->at(j); + } + + else if( SamuraiFDC2->GetEdge(j)==0) + continue; + + else + { + cout << "ERROR: edge value must be equal to 1 or 0, check the simulated tree" << endl; + exit(1); + } + + if(PointB_Z > PosZ) { + break; + } + + + }//end loop for j + + //cout << endl; + + TVector3 PointA (PointA_X, PointA_Y, PointA_Z); + TVector3 PointB (PointB_X, PointB_Y, PointB_Z); + + TVector3 Direct; + Direct = PointB - PointA; + + TVector3 Pos_simu = PointA + ((PosZ - PointA[2]) / Direct[2])*Direct; + + PosX_simu = Pos_simu[0]; + PosY_simu = Pos_simu[1]; + PosZ_simu = Pos_simu[2]; + + Diff_X = PosX_calc - PosX_simu; + Diff_Y = PosY_calc - PosY_simu; + + Radius = sqrt(PosX_simu*PosX_simu + PosY_simu*PosY_simu); + + Theta_XZ = atan2(PosZ_simu - Z_Beam, PosX_simu - X_Beam)*180.0/TMath::Pi(); + + Theta_YZ = atan2(PosZ_simu - Z_Beam, PosY_simu - Y_Beam)*180.0/3.14159; + + if(PosX_simu!= -10000 && PosY_simu!= -10000 && PosZ_simu != -10000 && PosX_calc!= -10000 && PosY_calc!= -10000 && PosZ!= -10000){ + hResolutionX->Fill(Diff_X); + hResolutionY->Fill(Diff_Y); + } + + outTree->Fill(); + + }//end loop i + + outTree->AutoSave(); + + cout << hResolutionX->GetRMS() << endl; + cout << hResolutionY->GetRMS() << endl; + + // double rootMeanSquare1 = std::sqrt( hResolutionX->GetMean()*hResolutionX->GetMean() + hResolutionX->GetRMS()*hResolutionX->GetRMS() ); + + + TCanvas *c1 = new TCanvas(); + c1->Divide(1,2); + c1->cd(1); + hResolutionX->Draw(); + + c1->cd(2); + hResolutionY->Draw(); + + + +} diff --git a/Projects/S034/macro/testB2.cxx b/Projects/S034/macro/testB2.cxx index 869abd346..ca9b10532 100644 --- a/Projects/S034/macro/testB2.cxx +++ b/Projects/S034/macro/testB2.cxx @@ -11,36 +11,22 @@ void testB2(){ //auto h=new TH1D("dB","dB",1000,-2e-1,2e-1); // new TCanvas(); auto h=new TH1D("dB","dB",1000,-0.1,0.1); - auto hX=new TH2D("dBX","dBX",500,-100,100,500,-0.01,0.01); - auto hY=new TH2D("dBY","dBY",500,-100,100,500,-0.01,0.01); double r = gRandom->Uniform(-1,1); - for(unsigned int i = 0 ; i < 100 ; i++){ - double X = gRandom->Uniform(-100,100); - double Y = gRandom->Uniform(-100,100); - TVector3 p(X,Y,-3500); - //TVector3 d(gRandom->Uniform(-0.05,0.05),gRandom->Uniform(-0.05,0.05),1); + TVector3 p(gRandom->Uniform(-5,5),gRandom->Uniform(-5,5),-3500); + TVector3 d(gRandom->Uniform(-0.05,0.05),gRandom->Uniform(-0.05,0.05),1); // //TVector3 p(0,0,-3500); - TVector3 d(0,0,1); + //TVector3 d(0,0,1); double b = gRandom->Uniform(3,7); std::vector< TVector3 > track = field.Propagate(b,p,d,false); // rotate from lab angle to FDC2 frame track.back().RotateY(-fdc2angle+angle); double br=field.FindBrho(p,d,track.back(),d); - //double pc = 100*(br-b)/b; - - double pc = br-b; -// cout <<" " << 100*(br-b)/b << " " << br << " " << b << endl; + double pc = 100*(br-b)/b; + cout <<" " << 100*(br-b)/b << " " << br << " " << b << endl; h->Fill(pc); - hX->Fill(X,pc); - hY->Fill(Y,pc); } h->Draw(); - new TCanvas(); - hX->Draw("colz"); - new TCanvas(); - hY->Draw("colz"); - } diff --git a/Projects/S034/minos_dali.detector b/Projects/S034/minos_dali.detector deleted file mode 100644 index facf9c4bf..000000000 --- a/Projects/S034/minos_dali.detector +++ /dev/null @@ -1,95 +0,0 @@ -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Minos - Position= 0 0 0 mm - ZRotation= 40.6 deg - TargetZOffset= 0 mm - ZOffset= -4650 - TargetLength= 151.72 mm - TargetMaterial= LH2 - CellMaterial= Mylar - TPCOnly= 0 - TimeBin= 30 ns - ShapingTime= 333.9 ns - BaseLine= 250 - Sampling= 10 - XML= db/MINOS.xml - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Dali - R = 212.4 mm - Alpha = 240 deg - Zeta = 298.28 mm - Ring = 1 - Material = NaI(Tl) -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Dali - R = 212.4 mm - Alpha = 180 deg - Zeta = 298.28 mm - Ring = 1 - Material = NaI(Tl) -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Dali - R= 212.4 mm - Alpha = 120 deg - Zeta = 298.28 mm - Ring = 1 - Material = NaI(Tl) -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Dali - R = 212.4 mm - Alpha = 60 deg - Zeta = 298.28 mm - Ring = 1 - Material = NaI(Tl) -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Dali - R = 212.4 mm - Alpha = 0 deg - Zeta = 298.28 mm - Ring = 1 - Material = NaI(Tl) -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Dali - R = 212.4 mm - Alpha = -60 deg - Zeta = 298.28 mm - Ring = 1 - Material = NaI(Tl) -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Dali - R = 212.4 mm - Alpha = 240 deg - Zeta = 469.28 mm - Material = NaI(Tl) -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Dali - R = 212.4 mm - Alpha = 180 deg - Zeta = 469.28 mm - Material = NaI(Tl) -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Dali - R = 212.4 mm - Alpha = 120 deg - Zeta = 469.28 mm - Material = NaI(Tl) -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Dali - R = 212.4 mm - Alpha = 60 deg - Zeta = 469.28 mm - Material = NaI(Tl) -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Dali - R = 212.4 mm - Alpha = 0 deg - Zeta = 469.28 mm - Material = NaI(Tl) -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -Dali - R = 212.4 mm - Alpha = -60 deg - Zeta = 469.28 mm - Material = NaI(Tl) -% diff --git a/Projects/S034/project.config b/Projects/S034/project.config index e8be9bccc..850d419b8 100644 --- a/Projects/S034/project.config +++ b/Projects/S034/project.config @@ -1,4 +1,4 @@ -Project FDC2 +Project S034 AnalysisOutput= ./root/analysis SimulationOutput= ./root/simulation EnergyLoss= ./energy_loss diff --git a/Projects/S034/reaction/He8.beam b/Projects/S034/reaction/He8.beam new file mode 100755 index 000000000..5ff8a12c3 --- /dev/null +++ b/Projects/S034/reaction/He8.beam @@ -0,0 +1,20 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Beam + Particle= 8He + %Energy= 600 MeV + %Energy= 1248 MeV + %SigmaEnergy= 2.986 MeV + %SigmaThetaX= 0.4791 deg + %SigmaPhiY= 0.5433 deg + %SigmaX= 15.43 mm + %SigmaY= 18.17 mm + %MeanThetaX= -0.04855 deg + %MeanPhiY= 0.009168 deg + %MeanX= 1.361 mm + %MeanY= 1.288 mm + EnergyProfilePath= /local/anne/nptool/Projects/S034_audrey/beam/hBeamEnergy.root hBeamEnergy + XThetaXProfilePath= ./beam/hBeamXThetaX.root hBeamXThetaX + YPhiYProfilePath= ./beam/hBeamYThetaY.root hBeamYThetaY + ZProfile = -6876.34 mm + ZEmission= -7000 mm + diff --git a/Projects/S034/reaction/He8_pp.reaction b/Projects/S034/reaction/He8_pp.reaction new file mode 100755 index 000000000..ceaa236a2 --- /dev/null +++ b/Projects/S034/reaction/He8_pp.reaction @@ -0,0 +1,61 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Beam + Particle= 8He + %Energy= 1248 MeV + %SigmaEnergy= 0.1 MeV + %SigmaThetaX= 0.1 deg + %SigmaPhiY= 0.1 deg + %SigmaX= 0 mm + %SigmaY= 0 mm + %MeanThetaX= 0.0 deg + %MeanPhiY= 0.0 deg + %MeanX= 0 mm + %MeanY= 0 mm + EnergyProfilePath= ./beam/hBeamEnergy.root hBeamEnergy + XThetaXProfilePath= ./beam/hBeamXThetaX.root hBeamXThetaX + YPhiYProfilePath= ./beam/hBeamYThetaY.root hBeamYThetaY + ZEmission= -7000 mm + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% This is useful to redefine the reference mass of resonnance +%% without this block the g.s. of the system is taken as the +%% first resonant state in nutab +%DefineParticle 8He + SubPart= 4He n n n n + BindingEnergy= 0 MeV + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +TwoBodyReaction + Beam= 8He + Target= 1H + Light= 1H + Heavy= 8He + ExcitationEnergyLight= 0.0 MeV + ExcitationEnergyHeavy= 3.43 MeV + CrossSectionPath= reaction/flat.txt CSR + ShootLight= 1 + ShootHeavy= 1 + %UseExInGeant4= 1 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +Decay 8He + Daughter= 4He n n n n + ExcitationEnergy= 0 0 0 0 0 MeV + Threshold= 0 MeV + BranchingRatio= 1 + LifeTime= 0 ns + Shoot= 1 1 1 1 1 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%BreitWigner + Energy0= 3.0 MeV + Width0= 2.0 MeV + l= 1 + Heavy= 8He + Light= 4He + NeutronNumber= 4 + MultiplicateurAmplitude= 1.0 MeV + ShiftZero= 0 + WidthCst= 0 + + diff --git a/Projects/S034/reaction/pp.reaction b/Projects/S034/reaction/pp.reaction index a2285aa84..297d7d0f6 100644 --- a/Projects/S034/reaction/pp.reaction +++ b/Projects/S034/reaction/pp.reaction @@ -18,6 +18,7 @@ Beam %EnergyProfilePath= %XThetaXProfilePath= %YPhiYProfilePath= + ZEmission= -5000 mm %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TwoBodyReaction Beam= 1H diff --git a/Projects/S034/root/analysis/.gitignore b/Projects/S034/root/analysis/.gitignore deleted file mode 100644 index e69de29bb..000000000 diff --git a/Projects/S034/root/mrdc/.gitignore b/Projects/S034/root/mrdc/.gitignore deleted file mode 100644 index e69de29bb..000000000 diff --git a/Projects/S034/root/simulation/.gitignore b/Projects/S034/root/simulation/.gitignore deleted file mode 100644 index e69de29bb..000000000 diff --git a/Projects/Samurai/Samurai.detector b/Projects/Samurai/Samurai.detector index 53e981171..36be1abae 100644 --- a/Projects/Samurai/Samurai.detector +++ b/Projects/Samurai/Samurai.detector @@ -14,27 +14,27 @@ Samurai % METHOD= 1 % 0=RungeKutta, 1=EliaOmar - FIELDMAP=3T.table.bin + FIELDMAP= 3T.table.bin %fieldmap/3T.table.bin % fieldmap path STEPS_PER_METER= 1000 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% SAMURAIFDC1 - %XML= db/SAMURAIFDC0_20200109.xml + XML= db/SAMURAIFDC0_20200109.xml %Offset= -0.00666226 0.102191 -3370.01 mm Offset= -0.00666226 0.102191 -4370.01 mm - %InvertX= 1 - %InvertY= 0 - %InvertD= 1 + InvertX= 1 + InvertY= 0 + InvertD= 1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -SAMURAIFDC2 - %XML= db/SAMURAIFDC2.xml - Offset= 1000 200 5000 mm +%SAMURAIFDC2 +% XML= db/SAMURAIFDC2.xml +% Offset= 1000 200 5000 mm OffAngle= 59.930 deg - %-252.416 -0.228477 4122.57 mm - %InvertX= 0 - %InvertY= 1 - %InvertD= 1 + Offset= -252.416 -0.228477 5000.57 mm + InvertX= 0 + InvertY= 1 + InvertD= 1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -- GitLab