From 9f03027c5c35361e23bbd11a5737b369f1bd5ddf Mon Sep 17 00:00:00 2001 From: Nicolas de Sereville <deserevi@ipno.in2p3.fr> Date: Thu, 15 Jan 2015 18:11:09 +0100 Subject: [PATCH] + Add rectangular shapes for Gaspard + Update MUGAST geometry so rectangular detectors are now taken into account --- Inputs/DetectorConfiguration/MUGAST.detector | 45 +- NPLib/GASPARD/GaspardTracker.cxx | 16 + NPLib/GASPARD/GaspardTrackerRectangle.cxx | 526 +++++++++++ NPLib/GASPARD/GaspardTrackerRectangle.h | 119 +++ NPLib/GASPARD/GaspardTrackerRectangle.o | Bin 0 -> 76576 bytes NPLib/GASPARD/GaspardTrackerTrapezoid.cxx | 8 +- NPLib/GASPARD/Makefile | 4 +- NPSimulation/GASPARD/GaspardTracker.cc | 19 + NPSimulation/GASPARD/GaspardTrackerAnnular.hh | 4 +- NPSimulation/GASPARD/GaspardTrackerModule.cc | 1 + .../GASPARD/GaspardTrackerRectangle.cc | 821 ++++++++++++++++++ .../GASPARD/GaspardTrackerRectangle.hh | 182 ++++ .../GASPARD/GaspardTrackerTrapezoid.hh | 30 +- 13 files changed, 1726 insertions(+), 49 deletions(-) create mode 100644 NPLib/GASPARD/GaspardTrackerRectangle.cxx create mode 100644 NPLib/GASPARD/GaspardTrackerRectangle.h create mode 100644 NPLib/GASPARD/GaspardTrackerRectangle.o create mode 100644 NPSimulation/GASPARD/GaspardTrackerRectangle.cc create mode 100644 NPSimulation/GASPARD/GaspardTrackerRectangle.hh diff --git a/Inputs/DetectorConfiguration/MUGAST.detector b/Inputs/DetectorConfiguration/MUGAST.detector index 81bedc361..c73db9923 100644 --- a/Inputs/DetectorConfiguration/MUGAST.detector +++ b/Inputs/DetectorConfiguration/MUGAST.detector @@ -1,9 +1,9 @@ -}%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%Detector%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 GeneralTarget %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 Target - THICKNESS= 18 + THICKNESS= 1 RADIUS= 7.5 MATERIAL= CD2 X= 0 @@ -29,8 +29,8 @@ GPDTrapezoid X128_Y1= 122.368 54.712 -71.098 X1_Y1= 57.084 119.996 -71.098 FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 0 VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 GPDTrapezoid @@ -62,33 +62,26 @@ GPDTrapezoid SECONDSTAGE= 0 THIRDSTAGE= 0 VIS= all + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 Barrel -<<<<<<< HEAD -%GPDSquare - X1_Y1= -61.823 128.742 53.5 - X128_Y1= -61.823 128.742 -58.5 - X1_Y128= -132.251 58.314 -58.5 - X128_Y128= -132.251 58.314 53.5 -======= -GPDSquare - X128_Y1= -61.823 128.742 53.5 - X1_Y128= -61.823 128.742 -58.5 - X128_Y128= -132.251 58.314 -58.5 - X1_Y1= -132.251 58.314 53.5 ->>>>>>> f6b4686ada3bd21e20e035ddb4e9549f9980aa08 +GPDRectangle + X1_Y1= -132.251 58.314 53.5 + X128_Y1= -61.823 128.742 53.5 + X1_Y128= -132.251 58.314 -58.5 + X128_Y128= -61.823 128.742 -58.5 FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 0 VIS= all %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 -%GPDSquare - X1_Y1= -134.75 47.281 53.5 - X128_Y1= -134.75 47.281 -58.5 - X1_Y128= -134.75 -52.319 -58.5 - X128_Y128= -134.75 -52.319 53.5 +GPDRectangle + X1_Y1= -134.75 -52.319 53.5 + X128_Y1= -134.75 47.281 53.5 + X1_Y128= -134.75 -52.319 -58.5 + X128_Y128= -134.75 47.281 -58.5 FIRSTSTAGE= 1 - SECONDSTAGE= 1 - THIRDSTAGE= 1 + SECONDSTAGE= 0 + THIRDSTAGE= 0 VIS= all diff --git a/NPLib/GASPARD/GaspardTracker.cxx b/NPLib/GASPARD/GaspardTracker.cxx index c3f1479bd..af49f5ef6 100644 --- a/NPLib/GASPARD/GaspardTracker.cxx +++ b/NPLib/GASPARD/GaspardTracker.cxx @@ -44,6 +44,7 @@ #include "GaspardTrackerTrapezoid.h" #include "GaspardTrackerAnnular.h" #include "GaspardTrackerSquare.h" +#include "GaspardTrackerRectangle.h" using namespace std ; @@ -80,6 +81,7 @@ void GaspardTracker::ReadConfiguration(string Path) ConfigFile.open(Path.c_str()); bool GPDTrkSquare = false; + bool GPDTrkRectangle = false; bool GPDTrkTrapezoid = false; bool GPDTrkAnnular = false; bool GPDTrkDummyShape = false; @@ -101,6 +103,20 @@ void GaspardTracker::ReadConfiguration(string Path) myDetector->ReadConfiguration(Path); ConfigFile.open(Path.c_str()); } + else if (LineBuffer.compare(0, 12, "GPDRectangle") == 0 && GPDTrkRectangle == false) { + GPDTrkRectangle = true; + + // instantiate a new "detector" corresponding to the Rectangle elements + GaspardTrackerModule* myDetector = new GaspardTrackerRectangle(m_ModulesMap, m_EventPhysics); + + // Pass the data object to the GaspardTracker*** object + myDetector->SetGaspardDataPointer(m_EventData); + + // read part of the configuration file corresponding to trapezoid elements + ConfigFile.close(); + myDetector->ReadConfiguration(Path); + ConfigFile.open(Path.c_str()); + } else if (LineBuffer.compare(0, 12, "GPDTrapezoid") == 0 && GPDTrkTrapezoid == false) { GPDTrkTrapezoid = true; diff --git a/NPLib/GASPARD/GaspardTrackerRectangle.cxx b/NPLib/GASPARD/GaspardTrackerRectangle.cxx new file mode 100644 index 000000000..f8e4e1a30 --- /dev/null +++ b/NPLib/GASPARD/GaspardTrackerRectangle.cxx @@ -0,0 +1,526 @@ +/***************************************************************************** + * Copyright (C) 2009-2014 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: contact address: * + * * + * Creation Date : * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * * + * * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + * * + *****************************************************************************/ +#include "GaspardTrackerRectangle.h" + +// C++ headers +#include <limits> +#include <iostream> +#include <fstream> +#include <string> +#include <cmath> +#include <stdlib.h> + +// Gaspard +#include "TGaspardTrackerPhysics.h" + + +GaspardTrackerRectangle::GaspardTrackerRectangle(map<int, GaspardTrackerModule*> &Module, + TGaspardTrackerPhysics* &EventPhysics) + : m_ModuleTest(Module), + m_EventPhysics(EventPhysics), + m_EventData(0), + m_PreTreatData(new TGaspardTrackerData), + m_NumberOfModule(0), + m_FirstStageLength(112), // mm + m_FirstStageWidth(99.6), // mm + m_NumberOfStrips(128) +{ + m_StripPitchX = m_FirstStageWidth / (double)m_NumberOfStrips; + m_StripPitchY = m_FirstStageLength / (double)m_NumberOfStrips; +} + + + +GaspardTrackerRectangle::~GaspardTrackerRectangle() +{ + delete m_PreTreatData; +} + + + +void GaspardTrackerRectangle::ReadConfiguration(string Path) +{ + ifstream ConfigFile; + ConfigFile.open(Path.c_str()); + string LineBuffer; + string DataBuffer; + + // A:X1_Y1 --> X:1 Y:1 + // B:X128_Y1 --> X:128 Y:1 + // C:X1_Y128 --> X:1 Y:128 + // D:X128_Y128 --> X:128 Y:128 + + double Ax, Bx, Cx, Dx, Ay, By, Cy, Dy, Az, Bz, Cz, Dz; + TVector3 A, B, C, D; + double Theta = 0, Phi = 0, R = 0, beta_u = 0 , beta_v = 0 , beta_w = 0; + + bool check_A = false; + bool check_C = false; + bool check_B = false; + bool check_D = false; + + bool check_Theta = false; + bool check_Phi = false; + bool check_R = false; + bool check_beta = false; + + bool ReadingStatus = false; + + while (!ConfigFile.eof()) { + getline(ConfigFile, LineBuffer); + + // If line is a GaspardXXX bloc, reading toggle to true + // and toggle to true flags indicating which shape is treated. + if (LineBuffer.compare(0, 12, "GPDRectangle") == 0) { + cout << "///////////////////////" << endl; + cout << "Rectangle module found:" << endl; + ReadingStatus = true; + } + + // Reading Block + while (ReadingStatus) { + ConfigFile >> DataBuffer ; + // Comment Line + if (DataBuffer.compare(0, 1, "%") == 0) { + ConfigFile.ignore(std::numeric_limits<std::streamsize>::max(), '\n' ); + } + // Finding another telescope (safety), toggle out + else if (DataBuffer.compare(0, 12, "GPDRectangle") == 0) { + cout << "WARNING: Another Module is find before standard sequence of Token, Error may occured in Telecope definition" << endl; + ReadingStatus = false; + } + + // Position method + else if (DataBuffer.compare(0, 6, "X1_Y1=") == 0) { + check_A = true; + ConfigFile >> DataBuffer; + Ax = atof(DataBuffer.c_str()); + Ax = Ax; + ConfigFile >> DataBuffer; + Ay = atof(DataBuffer.c_str()); + Ay = Ay; + ConfigFile >> DataBuffer; + Az = atof(DataBuffer.c_str()); + Az = Az; + + A = TVector3(Ax, Ay, Az); + cout << "X1 Y1 corner position : (" << A.X() << ";" << A.Y() << ";" << A.Z() << ")" << endl; + } + else if (DataBuffer.compare(0, 8, "X128_Y1=") == 0) { + check_B = true; + ConfigFile >> DataBuffer; + Bx = atof(DataBuffer.c_str()); + Bx = Bx; + ConfigFile >> DataBuffer; + By = atof(DataBuffer.c_str()); + By = By; + ConfigFile >> DataBuffer; + Bz = atof(DataBuffer.c_str()); + Bz = Bz; + + B = TVector3(Bx, By, Bz); + cout << "X128 Y1 corner position : (" << B.X() << ";" << B.Y() << ";" << B.Z() << ")" << endl; + } + else if (DataBuffer.compare(0, 8, "X1_Y128=") == 0) { + check_C = true; + ConfigFile >> DataBuffer; + Cx = atof(DataBuffer.c_str()); + Cx = Cx; + ConfigFile >> DataBuffer; + Cy = atof(DataBuffer.c_str()); + Cy = Cy; + ConfigFile >> DataBuffer; + Cz = atof(DataBuffer.c_str()); + Cz = Cz; + + C = TVector3(Cx, Cy, Cz); + cout << "X1 Y128 corner position : (" << C.X() << ";" << C.Y() << ";" << C.Z() << ")" << endl; + } + else if (DataBuffer.compare(0, 10, "X128_Y128=") == 0) { + check_D = true; + ConfigFile >> DataBuffer; + Dx = atof(DataBuffer.c_str()); + Dx = Dx; + ConfigFile >> DataBuffer; + Dy = atof(DataBuffer.c_str()); + Dy = Dy; + ConfigFile >> DataBuffer; + Dz = atof(DataBuffer.c_str()); + Dz = Dz; + + D = TVector3(Dx, Dy, Dz); + cout << "X128 Y128 corner position : (" << D.X() << ";" << D.Y() << ";" << D.Z() << ")" << endl; + } // End Position Method + + // Angle method + else if (DataBuffer.compare(0, 6, "THETA=") == 0) { + check_Theta = true; + ConfigFile >> DataBuffer; + Theta = atof(DataBuffer.c_str()); + Theta = Theta; + cout << "Theta: " << Theta << endl; + } + else if (DataBuffer.compare(0, 4, "PHI=") == 0) { + check_Phi = true; + ConfigFile >> DataBuffer; + Phi = atof(DataBuffer.c_str()); + Phi = Phi; + cout << "Phi: " << Phi << endl; + } + else if (DataBuffer.compare(0, 2, "R=") == 0) { + check_R = true; + ConfigFile >> DataBuffer; + R = atof(DataBuffer.c_str()); + R = R; + cout << "R: " << R << endl; + } + else if (DataBuffer.compare(0, 5, "BETA=") == 0) { + check_beta = true; + ConfigFile >> DataBuffer; + beta_u = atof(DataBuffer.c_str()); + beta_u = beta_u; + ConfigFile >> DataBuffer; + beta_v = atof(DataBuffer.c_str()); + beta_v = beta_v; + ConfigFile >> DataBuffer; + beta_w = atof(DataBuffer.c_str()); + beta_w = beta_w; + cout << "Beta: " << beta_u << " " << beta_v << " " << beta_w << endl; + } + + ///////////////////////////////////////////////// + // If All necessary information there, toggle out + if ( (check_A && check_B && check_C && check_D) || (check_Theta && check_Phi && check_R && check_beta) ) { + ReadingStatus = false; + + // Add The previously define telescope + // With position method + if ( check_A && check_B && check_C && check_D ) { + AddModule(A, B, C, D); + m_ModuleTest[m_index["Rectangle"] + m_NumberOfModule] = this; + } + + // with angle method + else if ( check_Theta && check_Phi && check_R && check_beta ) { + AddModule(Theta, Phi, R, beta_u, beta_v, beta_w); + m_ModuleTest[m_index["Rectangle"] + m_NumberOfModule] = this; + } + + // reset boolean flag for point positioning + check_A = false; + check_B = false; + check_C = false; + check_D = false; + // reset boolean flag for angle positioning + check_Theta = false; + check_Phi = false; + check_R = false; + check_beta = false; + + } // end test for adding a module + } // end while for reading block + } // end while for reading file + + cout << endl << "/////////////////////////////" << endl<<endl; +} + + + +void GaspardTrackerRectangle::PreTreat() +{ +} + + + +void GaspardTrackerRectangle::BuildPhysicalEvent() +{ + // Check flags +// bool Check_FirstStage = false; + bool Check_SecondStage = false; + bool Check_ThirdStage = false; + + // Thresholds +/* + double FirstStage_Front_E_Threshold = 0; double FirstStage_Front_T_Threshold = 0; + double FirstStage_Back_E_Threshold = 0; double FirstStage_Back_T_Threshold = 0; + double SecondStage_E_Threshold = 0; double SecondStage_T_Threshold = 0; + double ThirdStage_E_Threshold = 0; double ThirdStage_T_Threshold = 0; +*/ + // calculate multipicity in the first stage + int multXE = m_EventData->GetGPDTrkFirstStageFrontEMult(); + int multYE = m_EventData->GetGPDTrkFirstStageBackEMult(); + int multXT = m_EventData->GetGPDTrkFirstStageFrontTMult(); + int multYT = m_EventData->GetGPDTrkFirstStageBackTMult(); + // calculate multiplicity of 2nd and third stages + int mult2E = m_EventData->GetGPDTrkSecondStageEMult(); + int mult2T = m_EventData->GetGPDTrkSecondStageTMult(); + int mult3E = m_EventData->GetGPDTrkThirdStageEMult(); + int mult3T = m_EventData->GetGPDTrkThirdStageTMult(); + + // Deal with multiplicity 1 for the first layer + if (multXE==1 && multYE==1 && multXT==1 && multYT==1) { + // calculate detector number + int det_ref = m_EventData->GetGPDTrkFirstStageFrontEDetectorNbr(0); + int detecXE = m_EventData->GetGPDTrkFirstStageFrontEDetectorNbr(0) / det_ref; + int detecXT = m_EventData->GetGPDTrkFirstStageFrontTDetectorNbr(0) / det_ref; + int detecYE = m_EventData->GetGPDTrkFirstStageBackEDetectorNbr(0) / det_ref; + int detecYT = m_EventData->GetGPDTrkFirstStageBackTDetectorNbr(0) / det_ref; + + // case of same detector + if (detecXE*detecXT*detecYE*detecYT == 1) { + // store module number + m_EventPhysics->SetModuleNumber(det_ref); + // calculate strip number + int stripXE = m_EventData->GetGPDTrkFirstStageFrontEStripNbr(0); + int stripXT = m_EventData->GetGPDTrkFirstStageFrontTStripNbr(0); + int stripYE = m_EventData->GetGPDTrkFirstStageBackEStripNbr(0); + int stripYT = m_EventData->GetGPDTrkFirstStageBackTStripNbr(0); + + // case of same strips on X and Y + if (stripXE == stripXT && stripYE == stripYT) { // here we have a good strip event + // various +// Check_FirstStage = true; + // store strip ID + m_EventPhysics->SetFirstStageFrontPosition(stripXE); + m_EventPhysics->SetFirstStageBackPosition(stripYE); + // get energy from strips and store it + double EnergyStripFront = m_EventData->GetGPDTrkFirstStageFrontEEnergy(0); + m_EventPhysics->SetFirstStageEnergy(EnergyStripFront); + double EnergyTot = EnergyStripFront; + // get time from strips and store it + double TimeStripBack = m_EventData->GetGPDTrkFirstStageBackEEnergy(0); + m_EventPhysics->SetFirstStageTime(TimeStripBack); + + // check if we have a 2nd stage event + if (mult2E==1 && mult2T==1) { + Check_SecondStage = true; + double EnergySecond = m_EventData->GetGPDTrkSecondStageEEnergy(0); + m_EventPhysics->SetSecondStageEnergy(EnergySecond); + EnergyTot += EnergySecond; + } + else if (mult2E>1 || mult2T>1) { + cout << "Warning: multiplicity in second stage greater than in firststage" << endl; + } + + // check if we have a third stage event + if (mult3E==1 && mult3T==1) { + Check_ThirdStage = true; + double EnergyThird = m_EventData->GetGPDTrkThirdStageEEnergy(0); + m_EventPhysics->SetThirdStageEnergy(EnergyThird); + EnergyTot += EnergyThird; + } + else if (mult3E>1 || mult3T>1) { + cout << "Warning: multiplicity in third stage greater than in firststage" << endl; + } + + // Fill total energy + m_EventPhysics->SetTotalEnergy(EnergyTot); + + // Fill default values for second an third stages + if (!Check_SecondStage) { + m_EventPhysics->SetSecondStageEnergy(-1000); + m_EventPhysics->SetSecondStageTime(-1000); + m_EventPhysics->SetSecondStagePosition(-1000); + } + if (!Check_ThirdStage) { + m_EventPhysics->SetThirdStageEnergy(-1000); + m_EventPhysics->SetThirdStageTime(-1000); + m_EventPhysics->SetThirdStagePosition(-1000); + } + } + else { + cout << "Not same strips" << endl; + } + } + else { + cout << "Not same detector" << endl; + } + } + else { +/* cout << "Multiplicity is not one, it is: " << endl; + cout << "\tmultXE: " << multXE << endl; + cout << "\tmultXT: " << multXT << endl; + cout << "\tmultYE: " << multYE << endl; + cout << "\tmultYT: " << multYT << endl;*/ + } +} + + + +void GaspardTrackerRectangle::BuildSimplePhysicalEvent() +{ +} + + + +void GaspardTrackerRectangle::AddModule(TVector3 C_X1_Y1, + TVector3 C_X128_Y1, + TVector3 C_X1_Y128, + TVector3 C_X128_Y128) +{ + m_NumberOfModule++; + + // remove warning using C_X128_Y128 + C_X128_Y128.Unit(); + + // Definition of vectors U and V are *identical* with definition + // in NPS. + // Vector U parallel to BaseLarge + TVector3 U = C_X128_Y1 - C_X1_Y1; + U = U.Unit(); + + // Vector V parallel to height + TVector3 V = C_X1_Y128 - C_X1_Y1; + V = V.Unit(); + + // Position Vector of Strip Center + TVector3 StripCenter = TVector3(0,0,0); + // Position Vector of X=1 Y=1 Strip + TVector3 Strip_1_1; + + // Buffer object to fill Position Array + vector<double> lineX; + vector<double> lineY; + vector<double> lineZ; + + vector< vector< double > > OneModuleStripPositionX; + vector< vector< double > > OneModuleStripPositionY; + vector< vector< double > > OneModuleStripPositionZ; + + // Moving StripCenter to 1.1 corner: + Strip_1_1 = C_X1_Y1 + m_StripPitchX/2*U + m_StripPitchY/2*V; + + for (int i = 0; i < m_NumberOfStrips; i++) { + lineX.clear(); + lineY.clear(); + lineZ.clear(); + + for (int j = 0; j < m_NumberOfStrips; j++) { + StripCenter = Strip_1_1 + i*m_StripPitchX*U + j*m_StripPitchY*V; + + lineX.push_back( StripCenter.X() ); + lineY.push_back( StripCenter.Y() ); + lineZ.push_back( StripCenter.Z() ); + } + + OneModuleStripPositionX.push_back(lineX); + OneModuleStripPositionY.push_back(lineY); + OneModuleStripPositionZ.push_back(lineZ); + } + + m_StripPositionX.push_back( OneModuleStripPositionX ); + m_StripPositionY.push_back( OneModuleStripPositionY ); + m_StripPositionZ.push_back( OneModuleStripPositionZ ); +} + + + +void GaspardTrackerRectangle::AddModule(double theta, + double phi, + double distance, + double beta_u, + double beta_v, + double beta_w) +{ + m_NumberOfModule++; + + // convert from degree to radian: + theta *= M_PI/180; + phi *= M_PI/180; + + // Vector U on Module Face (paralelle to Y Strip) (NB: remember that Y strip are allong X axis) + TVector3 U ; + // Vector V on Module Face (parallele to X Strip) + TVector3 V ; + // Vector W normal to Module Face (pointing CsI) + TVector3 W ; + // Vector position of Module Face center + TVector3 C ; + + C = TVector3(distance * sin(theta) * cos(phi), + distance * sin(theta) * sin(phi), + distance * cos(theta)); + + TVector3 YperpW = TVector3( cos(theta) * cos(phi), + cos(theta) * sin(phi), + -sin(theta)); + + W = C.Unit(); + U = W.Cross(YperpW); + V = W.Cross(U); + + U = U.Unit(); + V = V.Unit(); + + U.Rotate( beta_u * M_PI/180. , U ) ; + V.Rotate( beta_u * M_PI/180. , U ) ; + + U.Rotate( beta_v * M_PI/180. , V ) ; + V.Rotate( beta_v * M_PI/180. , V ) ; + + U.Rotate( beta_w * M_PI/180. , W ) ; + V.Rotate( beta_w * M_PI/180. , W ) ; + + double Face = 50; // mm + double NumberOfStrip = 100; + double StripPitch = Face/NumberOfStrip; // mm + + vector<double> lineX; + vector<double> lineY; + vector<double> lineZ; + + vector< vector< double > > OneModuleStripPositionX; + vector< vector< double > > OneModuleStripPositionY; + vector< vector< double > > OneModuleStripPositionZ; + + double X, Y, Z; + + // Moving C to the 1.1 corner: + C.SetX( C.X() - ( Face/2 - StripPitch/2 ) * ( V.X() + U.X() ) ) ; + C.SetY( C.Y() - ( Face/2 - StripPitch/2 ) * ( V.Y() + U.Y() ) ) ; + C.SetZ( C.Z() - ( Face/2 - StripPitch/2 ) * ( V.Z() + U.Z() ) ) ; + + for (int i = 0; i < NumberOfStrip; i++) { + lineX.clear(); + lineY.clear(); + lineZ.clear(); + + for (int j = 0; j < NumberOfStrip; j++) { + X = C.X() + StripPitch * ( U.X()*i + V.X()*j ); + Y = C.Y() + StripPitch * ( U.Y()*i + V.Y()*j ); + Z = C.Z() + StripPitch * ( U.Z()*i + V.Z()*j ); + + lineX.push_back(X); + lineY.push_back(Y); + lineZ.push_back(Z); + } + + OneModuleStripPositionX.push_back(lineX); + OneModuleStripPositionY.push_back(lineY); + OneModuleStripPositionZ.push_back(lineZ); + } + + m_StripPositionX.push_back( OneModuleStripPositionX ); + m_StripPositionY.push_back( OneModuleStripPositionY ); + m_StripPositionZ.push_back( OneModuleStripPositionZ ); +} diff --git a/NPLib/GASPARD/GaspardTrackerRectangle.h b/NPLib/GASPARD/GaspardTrackerRectangle.h new file mode 100644 index 000000000..5abf984e1 --- /dev/null +++ b/NPLib/GASPARD/GaspardTrackerRectangle.h @@ -0,0 +1,119 @@ +#ifndef GaspardTrackerRectangle_h +#define GaspardTrackerRectangle_h 1 +/***************************************************************************** + * Copyright (C) 2009-2014 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: contact address: * + * * + * Creation Date : * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + *****************************************************************************/ +// C++ headers +#include <string> +#include <map> +#include <vector> + +// ROOT headers +#include "TVector3.h" + +// Gaspard headers +#include "TGaspardTrackerData.h" +#include "TGaspardTrackerPhysics.h" +#include "GaspardTrackerModule.h" + +using namespace std; + + + +class GaspardTrackerRectangle : public GaspardTrackerModule +{ +public: + //////////////////////////////////////////////////// + /////// Default Constructor and Destructor ///////// + //////////////////////////////////////////////////// + GaspardTrackerRectangle(map<int, GaspardTrackerModule*> &Module, TGaspardTrackerPhysics* &EventPhysics); + virtual ~GaspardTrackerRectangle(); + +public: + //////////////////////////////////////////////////// + //// Inherite from GaspardTrackerModule class ///// + //////////////////////////////////////////////////// + // Read stream at Configfile to pick-up parameters of detector (Position,...) + void ReadConfiguration(string Path); + + // The goal of this method is to extract physical parameters from raw data + // Method called at each event read from the Input Tree + void BuildPhysicalEvent(); + + // Same as before but with a simpler treatment + void BuildSimplePhysicalEvent(); + +private: + map<int, GaspardTrackerModule*> &m_ModuleTest; + TGaspardTrackerPhysics* &m_EventPhysics; + +public: + void SetGaspardDataPointer(TGaspardTrackerData* gaspardData) {m_EventData = gaspardData;}; + void PreTreat(); + +private: + // Gaspard data coming from TGaspardTrackerPhysics through the + // SetGaspardDataPointer method + TGaspardTrackerData* m_EventData; + TGaspardTrackerData* m_PreTreatData; + +public: + //////////////////////////////// + // Specific to GaspardTracker // + //////////////////////////////// + // Add a Module using Corner Coordinate information + void AddModule(TVector3 C_X1_Y1, + TVector3 C_X128_Y1, + TVector3 C_X1_Y128, + TVector3 C_X128_Y128); + + // Add a Module using R Theta Phi of Si center information + void AddModule(double theta, + double phi, + double distance, + double beta_u, + double beta_v, + double beta_w); + + // Getters to retrieve the (X,Y,Z) coordinates of a pixel defined by strips (X,Y) + double GetStripPositionX(int N ,int X ,int Y) { return m_StripPositionX[N-1-m_index["Rectangle"]][X-1][Y-1]; } + double GetStripPositionY(int N ,int X ,int Y) { return m_StripPositionY[N-1-m_index["Rectangle"]][X-1][Y-1]; } + double GetStripPositionZ(int N ,int X ,int Y) { return m_StripPositionZ[N-1-m_index["Rectangle"]][X-1][Y-1]; } + double GetNumberOfModule() { return m_NumberOfModule; } + +private: + // Spatial Position of Strip Calculated on basis of detector position + int m_NumberOfModule; + vector< vector < vector < double > > > m_StripPositionX; + vector< vector < vector < double > > > m_StripPositionY; + vector< vector < vector < double > > > m_StripPositionZ; + +private: + ////////////////////////////// + // Geometry and stip number // + ////////////////////////////// + double m_FirstStageLength; // mm + double m_FirstStageWidth; // mm + int m_NumberOfStrips; + double m_StripPitchX; // mm + double m_StripPitchY; // mm +}; + +#endif diff --git a/NPLib/GASPARD/GaspardTrackerRectangle.o b/NPLib/GASPARD/GaspardTrackerRectangle.o new file mode 100644 index 0000000000000000000000000000000000000000..af156dc3d708f33496dbb6b958dc4a3118683d90 GIT binary patch literal 76576 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 R5gh%C?ng)8!_nqC{0|PUj(h+B literal 0 HcmV?d00001 diff --git a/NPLib/GASPARD/GaspardTrackerTrapezoid.cxx b/NPLib/GASPARD/GaspardTrackerTrapezoid.cxx index 6fb4980ca..f8208749e 100644 --- a/NPLib/GASPARD/GaspardTrackerTrapezoid.cxx +++ b/NPLib/GASPARD/GaspardTrackerTrapezoid.cxx @@ -42,11 +42,11 @@ GaspardTrackerTrapezoid::GaspardTrackerTrapezoid(map<int, GaspardTrackerModule*> m_PreTreatData(new TGaspardTrackerData), m_NumberOfModule(0), // gaspHyde - m_FirstStageBaseLarge(97.5), // mm - m_FirstStageHeight(113.5), // mm +// m_FirstStageBaseLarge(97.5), // mm +// m_FirstStageHeight(113.5), // mm // mugast -// m_FirstStageBaseLarge(92.326), // mm -// m_FirstStageHeight(105), // mm + m_FirstStageBaseLarge(92.326), // mm + m_FirstStageHeight(105), // mm m_NumberOfStripsX(128), m_NumberOfStripsY(128) { diff --git a/NPLib/GASPARD/Makefile b/NPLib/GASPARD/Makefile index 4dabe0481..c291681ba 100644 --- a/NPLib/GASPARD/Makefile +++ b/NPLib/GASPARD/Makefile @@ -7,8 +7,7 @@ all: $(SHARELIB) ############### Detector ############## ## Gaspard ## -libGaspard.so: TGaspardTrackerData.o TGaspardTrackerDataDict.o GaspardTracker.o TGaspardTrackerPhysics.o TGaspardTrackerPhysicsDict.o GaspardTrackerModule.o GaspardTrackerDummyShape.o GaspardTrackerTrapezoid.o GaspardTrackerAnnular.o GaspardTrackerSquare.o - +libGaspard.so: TGaspardTrackerData.o TGaspardTrackerDataDict.o GaspardTracker.o TGaspardTrackerPhysics.o TGaspardTrackerPhysicsDict.o GaspardTrackerModule.o GaspardTrackerDummyShape.o GaspardTrackerTrapezoid.o GaspardTrackerAnnular.o GaspardTrackerSquare.o GaspardTrackerRectangle.o $(LD) $(SOFLAGS) $^ $(OutPutOpt) $@ TGaspardTrackerDataDict.cxx: TGaspardTrackerData.h @@ -28,6 +27,7 @@ GaspardTrackerDummyShape.o: GaspardTrackerDummyShape.cxx GaspardTrackerDummyShap GaspardTrackerTrapezoid.o: GaspardTrackerTrapezoid.cxx GaspardTrackerTrapezoid.h GaspardTrackerAnnular.o: GaspardTrackerAnnular.cxx GaspardTrackerAnnular.h GaspardTrackerSquare.o: GaspardTrackerSquare.cxx GaspardTrackerSquare.h +GaspardTrackerRectangle.o: GaspardTrackerRectangle.cxx GaspardTrackerRectangle.h ####################################### ############# Clean and More ########## diff --git a/NPSimulation/GASPARD/GaspardTracker.cc b/NPSimulation/GASPARD/GaspardTracker.cc index 3130225d0..b993cf0d9 100644 --- a/NPSimulation/GASPARD/GaspardTracker.cc +++ b/NPSimulation/GASPARD/GaspardTracker.cc @@ -29,6 +29,7 @@ // NPTool headers #include "GaspardTracker.hh" #include "GaspardTrackerSquare.hh" +#include "GaspardTrackerRectangle.hh" #include "GaspardTrackerTrapezoid.hh" #include "GaspardTrackerAnnular.hh" #include "GaspardTrackerDummyShape.hh" @@ -57,6 +58,7 @@ void GaspardTracker::ReadConfiguration(string Path) ConfigFile.open(Path.c_str()); bool GPDTrkSquare = false; + bool GPDTrkRectangle = false; bool GPDTrkTrapezoid = false; bool GPDTrkAnnular = false; bool GPDTrkDummyShape = false; @@ -81,6 +83,23 @@ void GaspardTracker::ReadConfiguration(string Path) // store GaspardTrackerSquare "detector" m_Modules.push_back(myDetector); } + else if (LineBuffer.compare(0, 12, "GPDRectangle") == 0 && GPDTrkRectangle == false) { + GPDTrkRectangle = true; + + // instantiate a new "detector" corresponding to the Square elements + GaspardTrackerModule* myDetector = new GaspardTrackerRectangle(); + + // read part of the configuration file corresponding to square elements + ConfigFile.close(); + myDetector->ReadConfiguration(Path); + ConfigFile.open(Path.c_str()); + + // ms_InterCoord comes from VDetector + myDetector->SetInterCoordPointer(ms_InterCoord); + + // store GaspardTrackerSquare "detector" + m_Modules.push_back(myDetector); + } else if (LineBuffer.compare(0, 12, "GPDTrapezoid") == 0 && GPDTrkTrapezoid == false) { GPDTrkTrapezoid = true; diff --git a/NPSimulation/GASPARD/GaspardTrackerAnnular.hh b/NPSimulation/GASPARD/GaspardTrackerAnnular.hh index 68f162721..bb2abde4f 100644 --- a/NPSimulation/GASPARD/GaspardTrackerAnnular.hh +++ b/NPSimulation/GASPARD/GaspardTrackerAnnular.hh @@ -142,9 +142,9 @@ namespace GPDANNULAR const G4double FirstStageThickness = 300*micrometer; const G4double FirstStageRmin = 16*mm; // MUGAST -// const G4double FirstStageRmax = 45*mm; + const G4double FirstStageRmax = 45*mm; // gaspHyde - const G4double FirstStageRmax = 52*mm; +// const G4double FirstStageRmax = 52*mm; // const G4double VacBoxThickness = 3*cm ; const G4double VacBoxThickness = 0.4*cm; diff --git a/NPSimulation/GASPARD/GaspardTrackerModule.cc b/NPSimulation/GASPARD/GaspardTrackerModule.cc index 0907c7508..6d460fb4e 100644 --- a/NPSimulation/GASPARD/GaspardTrackerModule.cc +++ b/NPSimulation/GASPARD/GaspardTrackerModule.cc @@ -61,6 +61,7 @@ void GaspardTrackerModule::InitializeRootOutput() void GaspardTrackerModule::InitializeIndex() { m_index["Square"] = 0; + m_index["Rectangle"] = 0; m_index["Trapezoid"] = 100; m_index["Annular"] = 200; m_index["DummyShape"] = 1000; diff --git a/NPSimulation/GASPARD/GaspardTrackerRectangle.cc b/NPSimulation/GASPARD/GaspardTrackerRectangle.cc new file mode 100644 index 000000000..c2bf95fd0 --- /dev/null +++ b/NPSimulation/GASPARD/GaspardTrackerRectangle.cc @@ -0,0 +1,821 @@ +/***************************************************************************** + * Copyright (C) 2009-2013 this file is part of the NPTool Project * + * * + * For the licensing terms see $NPTOOL/Licence/NPTool_Licence * + * For the list of contributors see $NPTOOL/Licence/Contributors * + *****************************************************************************/ + +/***************************************************************************** + * Original Author: N. de Sereville contact address: deserevi@ipno.in2p3.fr * + * * + * Creation Date : 15/07/09 * + * Last update : 12/10/09 * + *---------------------------------------------------------------------------* + * Decription: Define a module of trapezoidal shape for the Gaspard tracker * + * * + *---------------------------------------------------------------------------* + * Comment: * + * + 12/10/09: Change scorer scheme (N. de Sereville) * + * + 01/10/10: Fix bug with TInteractionCoordinate map size in Read * + * Sensitive (N. de Sereville) * + * * + * * + *****************************************************************************/ + +// C++ headers +#include <sstream> +#include <string> +#include <cmath> + +// G4 Geometry headers +#include "G4Box.hh" + +// G4 various headers +#include "G4MaterialTable.hh" +#include "G4Element.hh" +#include "G4ElementTable.hh" +#include "G4VisAttributes.hh" +#include "G4Colour.hh" +#include "G4RotationMatrix.hh" +#include "G4Transform3D.hh" +#include "G4PVPlacement.hh" +#include "G4PVDivision.hh" + +// G4 sensitive +#include "G4SDManager.hh" +#include "G4MultiFunctionalDetector.hh" + +// NPTool headers +#include "GaspardTrackerRectangle.hh" +#include "ObsoleteGeneralScorers.hh" +#include "GaspardScorers.hh" +#include "SiliconScorers.hh" +#include "MaterialManager.hh" +#include "RootOutput.h" +#include "VDetector.hh" +// CLHEP +#include "CLHEP/Random/RandGauss.h" + +using namespace std; +using namespace CLHEP; + +using namespace GPDRECT; +using namespace GPDSCORERS; + + + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +GaspardTrackerRectangle::GaspardTrackerRectangle() +{ + ms_InterCoord = 0; +} + + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +GaspardTrackerRectangle::~GaspardTrackerRectangle() +{ +} + + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void GaspardTrackerRectangle::AddModule(G4ThreeVector X1_Y1 , + G4ThreeVector X128_Y1 , + G4ThreeVector X1_Y128 , + G4ThreeVector X128_Y128 , + bool wFirstStage , + bool wSecondStage , + bool wThirdStage) +{ + m_DefinitionType.push_back(true) ; + + m_X1_Y1.push_back(X1_Y1) ; + m_X128_Y1.push_back(X128_Y1) ; + m_X1_Y128.push_back(X1_Y128) ; + m_X128_Y128.push_back(X128_Y128) ; + m_wFirstStage.push_back(wFirstStage) ; + m_wSecondStage.push_back(wSecondStage) ; + m_wThirdStage.push_back(wThirdStage) ; + + m_R.push_back(0) ; + m_Theta.push_back(0) ; + m_Phi.push_back(0) ; + m_beta_u.push_back(0) ; + m_beta_v.push_back(0) ; + m_beta_w.push_back(0) ; +} + + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void GaspardTrackerRectangle::AddModule(G4double R , + G4double Theta , + G4double Phi , + G4double beta_u , + G4double beta_v , + G4double beta_w , + bool wFirstStage , + bool wSecondStage , + bool wThirdStage) +{ + G4ThreeVector empty = G4ThreeVector(0, 0, 0); + + m_DefinitionType.push_back(false); + + m_R.push_back(R) ; + m_Theta.push_back(Theta) ; + m_Phi.push_back(Phi) ; + m_beta_u.push_back(beta_u) ; + m_beta_v.push_back(beta_v) ; + m_beta_w.push_back(beta_w) ; + m_wFirstStage.push_back(wFirstStage) ; + m_wSecondStage.push_back(wSecondStage) ; + m_wThirdStage.push_back(wThirdStage) ; + + m_X1_Y1.push_back(empty) ; + m_X128_Y1.push_back(empty) ; + m_X1_Y128.push_back(empty) ; + m_X128_Y128.push_back(empty) ; +} + + + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void GaspardTrackerRectangle::VolumeMaker(G4int DetectorNumber, + G4ThreeVector MMpos, + G4RotationMatrix* MMrot, + bool wFirstStage, + bool wSecondStage, + bool wThirdStage, + G4LogicalVolume* world) +{ + G4double NbrTelescopes = DetectorNumber ; + G4String DetNumber ; + ostringstream Number ; + Number << NbrTelescopes ; + DetNumber = Number.str() ; + + //////////////////////////////////////////////////////////////// + ////////////// Starting Volume Definition ////////////////////// + //////////////////////////////////////////////////////////////// + G4String Name = "GPDRectangle" + DetNumber ; + + // Definition of the volume containing the sensitive detector + G4Box* solidGPDRectangle = new G4Box(Name, 0.5*Width, 0.5*Length, Depth/2); + G4LogicalVolume* logicGPDRectangle = new G4LogicalVolume(solidGPDRectangle, m_MaterialVacuum, Name, 0, 0, 0); + + new G4PVPlacement(G4Transform3D(*MMrot, MMpos), logicGPDRectangle, Name, world, false, DetectorNumber); + + G4VisAttributes* RectangleeVisAtt = new G4VisAttributes(G4Colour(0.90, 0.90, 0.90)); + RectangleeVisAtt->SetForceWireframe(true); + logicGPDRectangle->SetVisAttributes(RectangleeVisAtt); + + //Place two marker to identify the u and v axis on silicon face: + //marker are placed a bit before the silicon itself so they don't perturbate simulation + //Uncomment to help debugging or if you want to understand the way the code work. + //I should recommand to Comment it during simulation to avoid perturbation of simulation + //Remember G4 is limitationg step on geometry constraints. + /* + G4ThreeVector positionMarkerU = CT*0.98 + MMu*SiliconFace/4; + G4Box* solidMarkerU = new G4Box( "solidMarkerU" , SiliconFace/4 , 1*mm , 1*mm ) ; + G4LogicalVolume* logicMarkerU = new G4LogicalVolume( solidMarkerU , m_MaterialVacuum , "logicMarkerU",0,0,0) ; + PVPBuffer = new G4PVPlacement(G4Transform3D(*MMrot,positionMarkerU),logicMarkerU,"MarkerU",world,false,0) ; + + G4VisAttributes* MarkerUVisAtt= new G4VisAttributes(G4Colour(0.,0.,0.5));//blue + logicMarkerU->SetVisAttributes(MarkerUVisAtt); + + G4ThreeVector positionMarkerV = CT*0.98 + MMv*SiliconFace/4; + G4Box* solidMarkerV = new G4Box( "solidMarkerU" , 1*mm , SiliconFace/4 , 1*mm ) ; + G4LogicalVolume* logicMarkerV = new G4LogicalVolume( solidMarkerV , m_MaterialVacuum , "logicMarkerV",0,0,0) ; + PVPBuffer = new G4PVPlacement(G4Transform3D(*MMrot,positionMarkerV),logicMarkerV,"MarkerV",world,false,0) ; + + G4VisAttributes* MarkerVVisAtt= new G4VisAttributes(G4Colour(0.,0.5,0.5));//green + logicMarkerV->SetVisAttributes(MarkerVVisAtt); + */ + + //////////////////////////////////////////////////////////////// + /////////////////// First Stage Construction//////////////////// + //////////////////////////////////////////////////////////////// + if (wFirstStage) { + // Silicon detector itself + G4ThreeVector positionFirstStage = G4ThreeVector(0, 0, FirstStage_PosZ); + + G4Box* solidFirstStage = new G4Box("solidFirstStage", 0.5*FirstStageWidth, 0.5*FirstStageLength, 0.5*FirstStageThickness); + G4LogicalVolume* logicFirstStage = new G4LogicalVolume(solidFirstStage, m_MaterialSilicon, "logicFirstStage", 0, 0, 0); + + new G4PVPlacement(0, + positionFirstStage, + logicFirstStage, + Name + "_FirstStage", + logicGPDRectangle, + false, + DetectorNumber); + + // Set First Stage sensible + logicFirstStage->SetSensitiveDetector(m_FirstStageScorer); + + ///Visualisation of FirstStage Strip + G4VisAttributes* FirstStageVisAtt = new G4VisAttributes(G4Colour(0.3, 0.3, 0.3)); // blue + logicFirstStage->SetVisAttributes(FirstStageVisAtt); + } + + //////////////////////////////////////////////////////////////// + //////////////// Second Stage Construction //////////////////// + //////////////////////////////////////////////////////////////// + if (wSecondStage) { + // Second stage silicon detector + G4ThreeVector positionSecondStage = G4ThreeVector(0, 0, SecondStage_PosZ); + + G4Box* solidSecondStage = new G4Box("solidSecondStage", 0.5*SecondStageWidth, 0.5*SecondStageLength, 0.5*SecondStageThickness); + G4LogicalVolume* logicSecondStage = new G4LogicalVolume(solidSecondStage, m_MaterialSilicon, "logicSecondStage", 0, 0, 0); + + new G4PVPlacement(0, + positionSecondStage, + logicSecondStage, + Name + "_SecondStage", + logicGPDRectangle, + false, + DetectorNumber); + + // Set Second Stage sensible + logicSecondStage->SetSensitiveDetector(m_SecondStageScorer); + + ///Visualisation of SecondStage Strip + G4VisAttributes* SecondStageVisAtt = new G4VisAttributes(G4Colour(0.3, 0.3, 0.3)); + logicSecondStage->SetVisAttributes(SecondStageVisAtt); + } + + //////////////////////////////////////////////////////////////// + ///////////////// Third Stage Construction ///////////////////// + //////////////////////////////////////////////////////////////// + if (wThirdStage) { + // Third stage silicon detector + G4ThreeVector positionThirdStage = G4ThreeVector(0, 0, ThirdStage_PosZ); + + G4Box* solidThirdStage = new G4Box("solidThirdStage", 0.5*ThirdStageWidth, 0.5*ThirdStageLength, 0.5*ThirdStageThickness); + G4LogicalVolume* logicThirdStage = new G4LogicalVolume(solidThirdStage, m_MaterialSilicon, "logicThirdStage", 0, 0, 0); + + new G4PVPlacement(0, + positionThirdStage, + logicThirdStage, + Name + "_ThirdStage", + logicGPDRectangle, + false, + DetectorNumber); + + // Set Third Stage sensible + logicThirdStage->SetSensitiveDetector(m_ThirdStageScorer); + + ///Visualisation of Third Stage + G4VisAttributes* ThirdStageVisAtt = new G4VisAttributes(G4Colour(0.3, 0.3, 0.3)); // red + logicThirdStage->SetVisAttributes(ThirdStageVisAtt); + } +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +// Virtual Method of VDetector class + +// Read stream at Configfile to pick-up parameters of detector (Position,...) +// Called in DetecorConstruction::ReadDetextorConfiguration Method +void GaspardTrackerRectangle::ReadConfiguration(string Path) +{ + ifstream ConfigFile ; + ConfigFile.open(Path.c_str()) ; + string LineBuffer ; + string DataBuffer ; + + // A:X1_Y1 --> X:1 Y:1 + // B:X128_Y1 --> X:128 Y:1 + // C:X1_Y128 --> X:1 Y:128 + // D:X128_Y128 --> X:128 Y:128 + + G4double Ax , Bx , Cx , Dx , Ay , By , Cy , Dy , Az , Bz , Cz , Dz ; + G4ThreeVector A , B , C , D ; + G4double Theta = 0 , Phi = 0 , R = 0 , beta_u = 0 , beta_v = 0 , beta_w = 0 ; + int FIRSTSTAGE = 0 , SECONDSTAGE = 0 , THIRDSTAGE = 0 ; + + bool ReadingStatus = false ; + + bool check_A = false ; + bool check_C = false ; + bool check_B = false ; + bool check_D = false ; + + bool check_Theta = false ; + bool check_Phi = false ; + bool check_R = false ; + + bool check_FirstStage = false ; + bool check_SecondStage = false ; + bool check_ThirdStage = false ; + bool checkVis = false ; + + while (!ConfigFile.eof()) { + getline(ConfigFile, LineBuffer); + if (LineBuffer.compare(0, 12, "GPDRectangle") == 0) { + G4cout << "///" << G4endl ; + G4cout << "Rectangle element found: " << G4endl ; + ReadingStatus = true ; + } + + while(ReadingStatus){ + + ConfigFile >> DataBuffer; + // Comment Line + if (DataBuffer.compare(0, 1, "%") == 0) {/*do nothing */;} + + // Position method + else if (DataBuffer.compare(0, 6, "X1_Y1=") == 0) { + check_A = true; + ConfigFile >> DataBuffer ; + Ax = atof(DataBuffer.c_str()) ; + Ax = Ax * mm ; + ConfigFile >> DataBuffer ; + Ay = atof(DataBuffer.c_str()) ; + Ay = Ay * mm ; + ConfigFile >> DataBuffer ; + Az = atof(DataBuffer.c_str()) ; + Az = Az * mm ; + + A = G4ThreeVector(Ax, Ay, Az); + G4cout << "X1 Y1 corner position : " << A << G4endl; + } + + else if (DataBuffer.compare(0, 8, "X128_Y1=") == 0) { + check_B = true; + ConfigFile >> DataBuffer ; + Bx = atof(DataBuffer.c_str()) ; + Bx = Bx * mm ; + ConfigFile >> DataBuffer ; + By = atof(DataBuffer.c_str()) ; + By = By * mm ; + ConfigFile >> DataBuffer ; + Bz = atof(DataBuffer.c_str()) ; + Bz = Bz * mm ; + + B = G4ThreeVector(Bx, By, Bz); + G4cout << "X128 Y1 corner position : " << B << G4endl; + } + + else if (DataBuffer.compare(0, 8, "X1_Y128=") == 0) { + check_C = true; + ConfigFile >> DataBuffer ; + Cx = atof(DataBuffer.c_str()) ; + Cx = Cx * mm ; + ConfigFile >> DataBuffer ; + Cy = atof(DataBuffer.c_str()) ; + Cy = Cy * mm ; + ConfigFile >> DataBuffer ; + Cz = atof(DataBuffer.c_str()) ; + Cz = Cz * mm ; + + C = G4ThreeVector(Cx, Cy, Cz); + G4cout << "X1 Y128 corner position : " << C << G4endl; + } + + else if (DataBuffer.compare(0, 10, "X128_Y128=") == 0) { + check_D = true; + ConfigFile >> DataBuffer ; + Dx = atof(DataBuffer.c_str()) ; + Dx = Dx * mm ; + ConfigFile >> DataBuffer ; + Dy = atof(DataBuffer.c_str()) ; + Dy = Dy * mm ; + ConfigFile >> DataBuffer ; + Dz = atof(DataBuffer.c_str()) ; + Dz = Dz * mm ; + + D = G4ThreeVector(Dx, Dy, Dz); + G4cout << "X128 Y128 corner position : " << D << G4endl; + } + + + // Angle method + else if (DataBuffer.compare(0, 6, "THETA=") == 0) { + check_Theta = true; + ConfigFile >> DataBuffer ; + Theta = atof(DataBuffer.c_str()) ; + Theta = Theta * deg; + G4cout << "Theta: " << Theta / deg << G4endl; + } + + else if (DataBuffer.compare(0, 4, "PHI=") == 0) { + check_Phi = true; + ConfigFile >> DataBuffer ; + Phi = atof(DataBuffer.c_str()) ; + Phi = Phi * deg; + G4cout << "Phi: " << Phi / deg << G4endl; + } + + else if (DataBuffer.compare(0, 2, "R=") == 0) { + check_R = true; + ConfigFile >> DataBuffer ; + R = atof(DataBuffer.c_str()) ; + R = R * mm; + G4cout << "R: " << R / mm << G4endl; + } + + else if (DataBuffer.compare(0, 5, "BETA=") == 0) { + ConfigFile >> DataBuffer ; + beta_u = atof(DataBuffer.c_str()) ; + beta_u = beta_u * deg ; + ConfigFile >> DataBuffer ; + beta_v = atof(DataBuffer.c_str()) ; + beta_v = beta_v * deg ; + ConfigFile >> DataBuffer ; + beta_w = atof(DataBuffer.c_str()) ; + beta_w = beta_w * deg ; + G4cout << "Beta: " << beta_u / deg << " " << beta_v / deg << " " << beta_w / deg << G4endl ; + } + + else if (DataBuffer.compare(0, 11, "FIRSTSTAGE=") == 0) { + check_FirstStage = true ; + ConfigFile >> DataBuffer; + FIRSTSTAGE = atof(DataBuffer.c_str()) ; + } + + else if (DataBuffer.compare(0, 12, "SECONDSTAGE=") == 0) { + check_SecondStage = true ; + ConfigFile >> DataBuffer; + SECONDSTAGE = atof(DataBuffer.c_str()) ; + } + + else if (DataBuffer.compare(0, 11, "THIRDSTAGE=") == 0) { + check_ThirdStage = true ; + ConfigFile >> DataBuffer; + THIRDSTAGE = atof(DataBuffer.c_str()) ; + } + + else if (DataBuffer.compare(0, 4, "VIS=") == 0) { + checkVis = true ; + ConfigFile >> DataBuffer; + if (DataBuffer.compare(0, 3, "all") == 0) m_non_sensitive_part_visiualisation = true; + } + + else G4cout << "WARNING: Wrong Token, GaspardTrackerRectangle: Rectangle Element not added" << G4endl; + + //Add The previously define telescope + //With position method + if ((check_A && check_B && check_C && check_D && check_FirstStage && check_SecondStage && check_ThirdStage && checkVis) && !(check_Theta && check_Phi && check_R)) { + + ReadingStatus = false ; + check_A = false ; + check_C = false ; + check_B = false ; + check_D = false ; + check_FirstStage = false ; + check_SecondStage = false ; + check_ThirdStage = false ; + checkVis = false ; + + AddModule(A , + B , + C , + D , + FIRSTSTAGE == 1 , + SECONDSTAGE == 1 , + THIRDSTAGE == 1); + } + + //with angle method + if ((check_Theta && check_Phi && check_R && check_FirstStage && check_SecondStage && check_ThirdStage && checkVis) && !(check_A && check_B && check_C && check_D)) { + ReadingStatus = false ; + check_Theta = false ; + check_Phi = false ; + check_R = false ; + check_FirstStage = false ; + check_SecondStage = false ; + check_ThirdStage = false ; + checkVis = false ; + + AddModule(R , + Theta , + Phi , + beta_u , + beta_v , + beta_w , + FIRSTSTAGE == 1 , + SECONDSTAGE == 1 , + THIRDSTAGE == 1); + } + + + } + } +} + +// Construct detector and inialise sensitive part. +// Called After DetecorConstruction::AddDetector Method +void GaspardTrackerRectangle::ConstructDetector(G4LogicalVolume* world) +{ + G4RotationMatrix* MMrot = NULL; + G4ThreeVector MMpos = G4ThreeVector(0, 0, 0); + G4ThreeVector MMu = G4ThreeVector(0, 0, 0); + G4ThreeVector MMv = G4ThreeVector(0, 0, 0); + G4ThreeVector MMw = G4ThreeVector(0, 0, 0); + G4ThreeVector MMCenter = G4ThreeVector(0, 0, 0); + + bool FirstStage = true ; + bool SecondStage = true ; + bool ThirdStage = true ; + + G4int NumberOfModule = m_DefinitionType.size() ; + + for (G4int i = 0; i < NumberOfModule; i++) { + // By Point + if (m_DefinitionType[i]) { + // (u,v,w) unitary vector associated to trapezoidal referencial + // (u,v) // to silicon plan + // ------ + // | | ^ + // | | | v + // | | | + // ------ <------ + // u + // w perpendicular to (u,v) plan and pointing ThirdStage + G4cout << "XXXXXXXXXXXX Rectangle " << i << " XXXXXXXXXXXXX" << G4endl; + MMu = m_X128_Y1[i] - m_X1_Y1[i]; + MMu = MMu.unit(); + G4cout << "MMu: " << MMu << G4endl; + + MMv = 0.5 * (m_X1_Y128[i] + m_X128_Y128[i] - m_X1_Y1[i] - m_X128_Y1[i]); + MMv = MMv.unit(); + G4cout << "MMv: " << MMv << G4endl; + + MMw = MMu.cross(MMv); + MMw = MMw.unit(); + G4cout << "MMw: " << MMw << G4endl; + + // Center of the module + MMCenter = (m_X1_Y1[i] + m_X1_Y128[i] + m_X128_Y1[i] + m_X128_Y128[i]) / 4; + + // Passage Matrix from Lab Referential to Module Referential + MMrot = new G4RotationMatrix(MMu, MMv, MMw); + // translation to place Module + MMpos = MMw * Depth * 0.5 + MMCenter; + } + + // By Angle + else { + G4double Theta = m_Theta[i]; + G4double Phi = m_Phi[i]; + + // (u,v,w) unitary vector associated to telescope referencial + // (u,v) // to silicon plan + // ------- + // / \ ^ + // / \ | v + // / \ | + // --------------- <------ + // u + // w perpendicular to (u,v) plan and pointing ThirdStage + // Phi is angle between X axis and projection in (X,Y) plan + // Theta is angle between position vector and z axis + G4double wX = m_R[i] * sin(Theta / rad) * cos(Phi / rad); + G4double wY = m_R[i] * sin(Theta / rad) * sin(Phi / rad); + G4double wZ = m_R[i] * cos(Theta / rad); + MMw = G4ThreeVector(wX, wY, wZ); + + // vector corresponding to the center of the module + MMCenter = MMw; + + // vector parallel to one axis of silicon plane + // in fact, this is vector u + G4double ii = cos(Theta / rad) * cos(Phi / rad); + G4double jj = cos(Theta / rad) * sin(Phi / rad); + G4double kk = -sin(Theta / rad); + G4ThreeVector Y = G4ThreeVector(ii, jj, kk); + + MMw = MMw.unit(); + MMv = MMw.cross(Y); + MMu = MMv.cross(MMw); + MMv = MMv.unit(); + MMu = MMu.unit(); + + G4cout << "XXXXXXXXXXXX Rectangle " << i << " XXXXXXXXXXXXX" << G4endl; + G4cout << "MMu: " << MMu << G4endl; + G4cout << "MMv: " << MMv << G4endl; + G4cout << "MMw: " << MMw << G4endl; + + // Passage Matrix from Lab Referential to Telescope Referential + MMrot = new G4RotationMatrix(MMu, MMv, MMw); + // Telescope is rotate of Beta angle around MMv axis. + MMrot->rotate(m_beta_u[i], MMu); + MMrot->rotate(m_beta_v[i], MMv); + MMrot->rotate(m_beta_w[i], MMw); + // translation to place Telescope + MMpos = MMw * Depth * 0.5 + MMCenter; + } + + FirstStage = m_wFirstStage[i]; + SecondStage = m_wSecondStage[i]; + ThirdStage = m_wThirdStage[i]; + + VolumeMaker(i + 1, MMpos, MMrot, FirstStage, SecondStage, ThirdStage, world); + } + + delete MMrot; +} + + + +// Connect the GaspardTrackingData class to the output TTree +// of the simulation +void GaspardTrackerRectangle::InitializeRootOutput() +{ +} + + + +// Set the TinteractionCoordinates object from VDetector to the present class +void GaspardTrackerRectangle::SetInterCoordPointer(TInteractionCoordinates* interCoord) +{ + ms_InterCoord = interCoord; +} + + + +// Read sensitive part and fill the Root tree. +// Called at in the EventAction::EndOfEventAvtion +void GaspardTrackerRectangle::ReadSensitive(const G4Event* event) +{ + ////////////// + // First stage + G4THitsMap<G4double*>* GPD1HitMap; + std::map<G4int, G4double**>::iterator GPD1_itr; + + G4int GPD1CollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("FirstStageScorerGPDRectangle/GPDRectangleFirstStage"); + GPD1HitMap = (G4THitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(GPD1CollectionID)); + + // Loop on the GPD map + for (GPD1_itr = GPD1HitMap->GetMap()->begin(); GPD1_itr != GPD1HitMap->GetMap()->end(); GPD1_itr++) { + G4double* Info = *(GPD1_itr->second); + + double Energy = Info[0]; + if (Energy > EnergyThreshold) { + double Time = Info[1]; + int DetNbr = (int) Info[7]; + int StripFront = (int) Info[8]; + int StripBack = (int) Info[9]; + + // detector number + ms_Event->SetGPDTrkFirstStageFrontEDetectorNbr(m_index["Rectangle"] + DetNbr); + ms_Event->SetGPDTrkFirstStageFrontTDetectorNbr(m_index["Rectangle"] + DetNbr); + ms_Event->SetGPDTrkFirstStageBackEDetectorNbr(m_index["Rectangle"] + DetNbr); + ms_Event->SetGPDTrkFirstStageBackTDetectorNbr(m_index["Rectangle"] + DetNbr); + + // energy + ms_Event->SetGPDTrkFirstStageFrontEEnergy(RandGauss::shoot(Energy, ResoFirstStage)); + ms_Event->SetGPDTrkFirstStageBackEEnergy(RandGauss::shoot(Energy, ResoFirstStage)); + + // time + Time = RandGauss::shoot(Time, ResoTimePPAC); + ms_Event->SetGPDTrkFirstStageFrontTTime(RandGauss::shoot(Time, ResoTimeGpd)); + ms_Event->SetGPDTrkFirstStageBackTTime(RandGauss::shoot(Time, ResoTimeGpd)); + + // strips X and Y + ms_Event->SetGPDTrkFirstStageFrontEStripNbr(StripFront); + ms_Event->SetGPDTrkFirstStageFrontTStripNbr(StripFront); + ms_Event->SetGPDTrkFirstStageBackEStripNbr(StripBack); + ms_Event->SetGPDTrkFirstStageBackTStripNbr(StripBack); + + // Interaction Coordinates + ms_InterCoord->SetDetectedPositionX(Info[2]); + ms_InterCoord->SetDetectedPositionY(Info[3]); + ms_InterCoord->SetDetectedPositionZ(Info[4]); + ms_InterCoord->SetDetectedAngleTheta(Info[5]/deg); + ms_InterCoord->SetDetectedAnglePhi(Info[6]/deg); + } + } + // clear map for next event + GPD1HitMap->clear(); + + + ////////////// + // Second stage + G4THitsMap<G4double*>* GPD2HitMap; + std::map<G4int, G4double**>::iterator GPD2_itr; + + G4int GPD2CollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("SecondStageScorerGPDRectangle/GPDRectangleSecondStage"); + GPD2HitMap = (G4THitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(GPD2CollectionID)); + + // Loop on the GPD map + for (GPD2_itr = GPD2HitMap->GetMap()->begin(); GPD2_itr != GPD2HitMap->GetMap()->end(); GPD2_itr++) { + G4double* Info = *(GPD2_itr->second); + + double Energy = Info[0]; + if (Energy > EnergyThreshold) { + double Time = Info[1]; + int DetNbr = (int) Info[7]; + int StripFront = (int) Info[8]; + + // detector number + ms_Event->SetGPDTrkSecondStageEDetectorNbr(m_index["Rectangle"] + DetNbr); + ms_Event->SetGPDTrkSecondStageTDetectorNbr(m_index["Rectangle"] + DetNbr); + + // energy + ms_Event->SetGPDTrkSecondStageEEnergy(RandGauss::shoot(Energy, ResoSecondStage)); + + // time + Time = RandGauss::shoot(Time, ResoTimePPAC); + ms_Event->SetGPDTrkSecondStageTTime(RandGauss::shoot(Time, ResoTimeGpd)); + + // strips X and Y + ms_Event->SetGPDTrkSecondStageEPadNbr(StripFront); + ms_Event->SetGPDTrkSecondStageTPadNbr(StripFront); + } + } + // clear map for next event + GPD2HitMap->clear(); + + + ////////////// + // Third stage + G4THitsMap<G4double*>* GPD3HitMap; + std::map<G4int, G4double**>::iterator GPD3_itr; + + G4int GPD3CollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("ThirdStageScorerGPDRectangle/GPDRectangleThirdStage"); + GPD3HitMap = (G4THitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(GPD3CollectionID)); + + // Loop on the GPD map + for (GPD3_itr = GPD3HitMap->GetMap()->begin(); GPD3_itr != GPD3HitMap->GetMap()->end(); GPD3_itr++) { + G4double* Info = *(GPD3_itr->second); + + double Energy = Info[0]; + if (Energy > EnergyThreshold) { + double Time = Info[1]; + int DetNbr = (int) Info[7]; + int StripFront = (int) Info[8]; + + // detector number + ms_Event->SetGPDTrkThirdStageEDetectorNbr(m_index["Rectangle"] + DetNbr); + ms_Event->SetGPDTrkThirdStageTDetectorNbr(m_index["Rectangle"] + DetNbr); + + // energy + ms_Event->SetGPDTrkThirdStageEEnergy(RandGauss::shoot(Energy, ResoThirdStage)); + + // time + Time = RandGauss::shoot(Time, ResoTimePPAC); + ms_Event->SetGPDTrkThirdStageTTime(RandGauss::shoot(Time, ResoTimeGpd)); + + // strips X and Y + ms_Event->SetGPDTrkThirdStageEPadNbr(StripFront); + ms_Event->SetGPDTrkThirdStageTPadNbr(StripFront); + } + } + // clear map for next event + GPD3HitMap->clear(); +} + + + +void GaspardTrackerRectangle::InitializeScorers() +{ + // check whether scorers are already defined + bool already_exist = false; + m_FirstStageScorer = VDetector::CheckScorer("FirstStageScorerGPDRectangle", already_exist); + m_SecondStageScorer = VDetector::CheckScorer("SecondStageScorerGPDRectangle", already_exist); + m_ThirdStageScorer = VDetector::CheckScorer("ThirdStageScorerGPDRectangle", already_exist); + if (already_exist) return; + + // First stage scorer + G4VPrimitiveScorer* GPDScorerFirstStage = + new SILICONSCORERS::PS_Silicon_Rectangle("GPDRectangleFirstStage", + 0, + FirstStageWidth, + FirstStageLength, + NumberOfStrips, + NumberOfStrips); + + // Second stage scorer + G4VPrimitiveScorer* GPDScorerSecondStage = + new SILICONSCORERS::PS_Silicon_Rectangle("GPDRectangleSecondStage", + 0, + SecondStageWidth, + SecondStageLength, + 1, + 1); + + // Third stage scorer + G4VPrimitiveScorer* GPDScorerThirdStage = + new SILICONSCORERS::PS_Silicon_Rectangle("GPDRectangleThirdStage", + 0, + ThirdStageWidth, + ThirdStageLength, + 1, + 1); + + // register scorers to the multifunctionnal detector + m_FirstStageScorer ->RegisterPrimitive(GPDScorerFirstStage); + m_SecondStageScorer ->RegisterPrimitive(GPDScorerSecondStage); + m_ThirdStageScorer ->RegisterPrimitive(GPDScorerThirdStage); + + // Add All Scorer to the Global Scorer Manager + G4SDManager::GetSDMpointer()->AddNewDetector(m_FirstStageScorer); + G4SDManager::GetSDMpointer()->AddNewDetector(m_SecondStageScorer); + G4SDManager::GetSDMpointer()->AddNewDetector(m_ThirdStageScorer); +} diff --git a/NPSimulation/GASPARD/GaspardTrackerRectangle.hh b/NPSimulation/GASPARD/GaspardTrackerRectangle.hh new file mode 100644 index 000000000..51f160cb8 --- /dev/null +++ b/NPSimulation/GASPARD/GaspardTrackerRectangle.hh @@ -0,0 +1,182 @@ +#ifndef GaspardTrackerRectangle_h +#define GaspardTrackerRectangle_h 1 +/***************************************************************************** + * Copyright (C) 2009-2013 this file is part of the NPTool Project * + * * + * For the licensing terms see $NPTOOL/Licence/NPTool_Licence * + * For the list of contributors see $NPTOOL/Licence/Contributors * + *****************************************************************************/ + +/***************************************************************************** + * Original Author: N. de Sereville contact address: deserevi@ipno.in2p3.fr * + * * + * Creation Date : 15/07/09 * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: Define a module of trapezoidal shape for the Gaspard tracker * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + * * + *****************************************************************************/ + + + +// C++ headers +#include <vector> + +// NPTool header +#include "GaspardTrackerModule.hh" +#include "TInteractionCoordinates.h" + +using namespace std; + using namespace CLHEP; + + + +class GaspardTrackerRectangle : public GaspardTrackerModule +{ + //////////////////////////////////////////////////// + /////// Default Constructor and Destructor ///////// + //////////////////////////////////////////////////// +public: + GaspardTrackerRectangle(); + virtual ~GaspardTrackerRectangle(); + + //////////////////////////////////////////////////// + //////// Specific Function of this Class /////////// + //////////////////////////////////////////////////// +public: + // By Position Method + void AddModule(G4ThreeVector TL , + G4ThreeVector BL , + G4ThreeVector BR , + G4ThreeVector CT , + bool wFirstStage , + bool wSecondStage , + bool wThirdStage); + + // By Angle Method + void AddModule(G4double R , + G4double Theta , + G4double Phi , + G4double beta_u , + G4double beta_v , + G4double beta_w , + bool wFirstStage , + bool wSecondStage , + bool wThirdStage); + + // Effectively construct Volume + // Avoid to have two time same code for Angle and Point definition + void VolumeMaker(G4int DetectorNumber, + G4ThreeVector MMpos, + G4RotationMatrix* MMrot, + bool wFirstStage, + bool wSecondStage, + bool wThirdStage, + G4LogicalVolume* world); + + + //////////////////////////////////////////////////// + //// Inherite from GaspardTrackerModule class ///// + //////////////////////////////////////////////////// +public: + // Read stream at Configfile to pick-up parameters of detector (Position,...) + // Called in DetecorConstruction::ReadDetextorConfiguration Method + void ReadConfiguration(string Path); + + // Construct detector and inialise sensitive part. + // Called After DetecorConstruction::AddDetector Method + void ConstructDetector(G4LogicalVolume* world); + + // Add Detector branch to the EventTree. + // Called After DetecorConstruction::AddDetector Method + void InitializeRootOutput(); + + // Initialize all scorers necessary for the detector + void InitializeScorers(); + + // Read sensitive part and fill the Root tree. + // Called at in the EventAction::EndOfEventAvtion + void ReadSensitive(const G4Event* event); + + // Give the static TInteractionCoordinates from VDetector to the classes + // deriving from GaspardTrackerModule + // This is mandatory since the GaspardTracker*** does not derive from VDetector + void SetInterCoordPointer(TInteractionCoordinates* interCoord); + TInteractionCoordinates* GetInterCoordPointer() {return ms_InterCoord;}; + + + //////////////////////////////////////////////////// + ///////////////Private intern Data////////////////// + //////////////////////////////////////////////////// +private: + // Interaction Coordinates coming from VDetector through the + // SetInteractionCoordinatesPointer method + TInteractionCoordinates* ms_InterCoord; + + // True if Define by Position, False is Define by angle + vector<bool> m_DefinitionType ; + + // Used for "By Point Definition" + vector<G4ThreeVector> m_X1_Y1 ; // Top Left Corner Position Vector + vector<G4ThreeVector> m_X1_Y128 ; // Bottom Left Corner Position Vector + vector<G4ThreeVector> m_X128_Y1 ; // Bottom Right Corner Position Vector + vector<G4ThreeVector> m_X128_Y128 ; // Center Corner Position Vector + + // Used for "By Angle Definition" + vector<G4double> m_R ; // | + vector<G4double> m_Theta ; // > Spherical coordinate of Strips Silicium Plate + vector<G4double> m_Phi ; // | + + vector<G4double> m_beta_u ; // | + vector<G4double> m_beta_v ; // > Tilt angle of the Telescope + vector<G4double> m_beta_w ; // | +}; + + + +namespace GPDRECT +{ + // Energy/Time resolutions for the different layers + const G4double ResoFirstStage = 0.021 ;// = 52keV of Resolution // Unit is MeV/2.35 + const G4double ResoSecondStage = 0.043 ;// = 130 keV of resolution // Unit is MeV/2.35 + const G4double ResoThirdStage = 0.043 ;// = 100 kev of resolution // Unit is MeV/2.35 + const G4double ResoTimeGpd = 0.212765957 ;// = 500ps // Unit is ns/2.35 + const G4double ResoTimePPAC = 0.106382979 ;// = 250ps // Unit is ns/2.35 + + + // Threshold + const G4double EnergyThreshold = 0.2*MeV; + + // Geometry + const G4double Length = 115*mm; + const G4double Width = 101*mm; + const G4double Depth = 20*mm; + const G4double InterStageDistance = 7*mm; + + // First stage + const G4double FirstStageLength = 112.0*mm; + const G4double FirstStageWidth = 99.6*mm; + const G4double FirstStageThickness = 500*micrometer; + const G4int NumberOfStrips = 128; + + // Second stage + const G4double SecondStageLength = FirstStageLength; + const G4double SecondStageWidth = FirstStageWidth; + const G4double SecondStageThickness = 1.5*mm; + + // Third stage + const G4double ThirdStageLength = FirstStageLength; + const G4double ThirdStageWidth = FirstStageWidth; + const G4double ThirdStageThickness = 1.5*mm; + + // Starting at the front of the first stage and pointing to the third stage + const G4double FirstStage_PosZ = Depth* -0.5 + 0.5*FirstStageThickness; + const G4double SecondStage_PosZ = Depth* -0.5 + 0.5*SecondStageThickness + 1*InterStageDistance; + const G4double ThirdStage_PosZ = Depth* -0.5 + 0.5*ThirdStageThickness + 2*InterStageDistance; +} + +#endif diff --git a/NPSimulation/GASPARD/GaspardTrackerTrapezoid.hh b/NPSimulation/GASPARD/GaspardTrackerTrapezoid.hh index f6993c11c..5e564cf44 100644 --- a/NPSimulation/GASPARD/GaspardTrackerTrapezoid.hh +++ b/NPSimulation/GASPARD/GaspardTrackerTrapezoid.hh @@ -154,17 +154,17 @@ namespace GPDTRAP // const G4double BaseSmall = 35*mm; // const G4double Length = 20*mm; // gaspHyde - const G4double Height = 115*mm; - const G4double BaseLarge = 98*mm; - const G4double BaseSmall = 30*mm; - const G4double Length = 20*mm; - const G4double InterStageDistance = 7*mm; - // mugast -// const G4double Height = 106*mm; -// const G4double BaseLarge = 93*mm; -// const G4double BaseSmall = 26*mm; +// const G4double Height = 115*mm; +// const G4double BaseLarge = 98*mm; +// const G4double BaseSmall = 30*mm; // const G4double Length = 20*mm; // const G4double InterStageDistance = 7*mm; + // mugast + const G4double Height = 106*mm; + const G4double BaseLarge = 93*mm; + const G4double BaseSmall = 26*mm; + const G4double Length = 20*mm; + const G4double InterStageDistance = 7*mm; // First stage // const G4double FirstStageThickness = 300*micrometer; @@ -177,13 +177,13 @@ namespace GPDTRAP // const G4double FirstStageBaseLarge = 78*mm; // const G4double FirstStageBaseSmall = 29*mm; // gaspHyde - const G4double FirstStageHeight = 113.5*mm; - const G4double FirstStageBaseLarge = 97.5*mm; - const G4double FirstStageBaseSmall = 28.5*mm; +// const G4double FirstStageHeight = 113.5*mm; +// const G4double FirstStageBaseLarge = 97.5*mm; +// const G4double FirstStageBaseSmall = 28.5*mm; // mugast -// const G4double FirstStageHeight = 105*mm; -// const G4double FirstStageBaseLarge = 92.326*mm; -// const G4double FirstStageBaseSmall = 25.77*mm; + const G4double FirstStageHeight = 105*mm; + const G4double FirstStageBaseLarge = 92.326*mm; + const G4double FirstStageBaseSmall = 25.77*mm; // Second stage const G4double SecondStageHeight = FirstStageHeight; -- GitLab