From fccce220bb3e593055966d193a7fd1498a0c53e1 Mon Sep 17 00:00:00 2001 From: adrien matta <matta@lpccaen.in2p3.fr> Date: Fri, 3 Feb 2017 10:11:13 +0100 Subject: [PATCH] * Adding new Silicon Scorer based on png images to set the strip number - allow arbitrary geometry - can be used to simulate interstrip and dead layer - Use a base class NPImage to manage the image information - switch must2 to new scorers - fix must2 limitation to event with less particle than telescope (issue #17) --- Examples/Example1/ShowResults.C | 2 +- Inputs/EventGenerator/alpha.source | 6 +- NPLib/Core/CMakeLists.txt | 4 +- NPLib/Core/NPImage.cxx | 159 ++++ NPLib/Core/NPImage.h | 71 ++ NPLib/Detectors/Chio/TChio_digPhysics.cxx | 7 +- NPLib/Detectors/MUST2/ressources/Mask.cxx | 58 ++ NPLib/Detectors/MUST2/ressources/maskBack.png | Bin 0 -> 320612 bytes .../Detectors/MUST2/ressources/maskFront.png | Bin 0 -> 325078 bytes NPLib/ressources/CMake/Root.cmake | 2 +- NPSimulation/Detectors/MUST2/MUST2Array.cc | 709 +++++++----------- NPSimulation/Detectors/MUST2/MUST2Array.hh | 2 +- NPSimulation/Scorers/CalorimeterScorers.cc | 1 - NPSimulation/Scorers/SiliconScorers.cc | 154 +++- NPSimulation/Scorers/SiliconScorers.hh | 316 +++++--- 15 files changed, 926 insertions(+), 565 deletions(-) create mode 100644 NPLib/Core/NPImage.cxx create mode 100644 NPLib/Core/NPImage.h create mode 100644 NPLib/Detectors/MUST2/ressources/Mask.cxx create mode 100644 NPLib/Detectors/MUST2/ressources/maskBack.png create mode 100644 NPLib/Detectors/MUST2/ressources/maskFront.png diff --git a/Examples/Example1/ShowResults.C b/Examples/Example1/ShowResults.C index 6c2d5867b..4a6f99d23 100644 --- a/Examples/Example1/ShowResults.C +++ b/Examples/Example1/ShowResults.C @@ -42,7 +42,7 @@ ETOF->Draw("same"); // Kinematical Line // c1->cd(3); //chain->Draw("ELab:ThetaLab>>hKine(500,0,45,400,0,40)","MUST2.CsI_E<0 && MUST2.TelescopeNumber<5 && EDE && ETOF","colz"); -chain->Draw("ELab:ThetaLab","MUST2.CsI_E<0 && MUST2.TelescopeNumber<5 && EDE && ETOF","colz"); +chain->Draw("ELab:ThetaLab>>h(1000,0,90,1000,0,30)","MUST2.CsI_E<0 && MUST2.TelescopeNumber<5 && EDE && ETOF","colz"); NPL::Reaction r("11Li(d,3He)10He@553"); r.SetExcitationHeavy(1.4); diff --git a/Inputs/EventGenerator/alpha.source b/Inputs/EventGenerator/alpha.source index e7453e142..6cb81d282 100644 --- a/Inputs/EventGenerator/alpha.source +++ b/Inputs/EventGenerator/alpha.source @@ -4,10 +4,10 @@ % Energy are given in MeV , Position in mm % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Isotropic - EnergyLow= 0 MeV - EnergyHigh= 850 MeV + EnergyLow= 30 MeV + EnergyHigh= 30 MeV HalfOpenAngleMin= 0 deg - HalfOpenAngleMax= 10 deg + HalfOpenAngleMax= 180 deg x0= 0 mm y0= 0 mm z0= 0 mm diff --git a/NPLib/Core/CMakeLists.txt b/NPLib/Core/CMakeLists.txt index e5ef4df37..fc38abc16 100644 --- a/NPLib/Core/CMakeLists.txt +++ b/NPLib/Core/CMakeLists.txt @@ -1,5 +1,5 @@ add_custom_command(OUTPUT TAsciiFileDict.cxx COMMAND ../scripts/build_dict.sh TAsciiFile.h TAsciiFileDict.cxx TAsciiFile.rootmap libNPCore.so) add_custom_command(OUTPUT NPVDetectorDict.cxx COMMAND ../scripts/build_dict.sh NPVDetector.h NPVDetectorDict.cxx NPVDetector.rootmap libNPCore.so NPCoreLinkdef.h) -add_library(NPCore SHARED NPVAnalysis.cxx NPAnalysisFactory.cxx NPCalibrationManager.cxx NPOptionManager.cxx RootOutput.cxx RootInput.cxx TAsciiFile.cxx TAsciiFileDict.cxx NPDetectorManager.cxx NPVDetector.cxx NPVDetectorDict.cxx NPVSpectra.cxx NPDetectorFactory.cxx NPSpectraServer.cxx NPInputParser.cxx) +add_library(NPCore SHARED NPVAnalysis.cxx NPAnalysisFactory.cxx NPCalibrationManager.cxx NPOptionManager.cxx RootOutput.cxx RootInput.cxx TAsciiFile.cxx TAsciiFileDict.cxx NPDetectorManager.cxx NPVDetector.cxx NPVDetectorDict.cxx NPVSpectra.cxx NPDetectorFactory.cxx NPSpectraServer.cxx NPInputParser.cxx NPImage.cxx) target_link_libraries(NPCore ${ROOT_LIBRARIES}) -install(FILES NPVAnalysis.h NPAnalysisFactory.h NPCalibrationManager.h NPOptionManager.h RootInput.h RootOutput.h TAsciiFile.h NPDetectorManager.h NPVDetector.h NPGlobalSystemOfUnits.h NPPhysicalConstants.h NPSystemOfUnits.h NPVSpectra.h NPDetectorFactory.h NPSpectraServer.h NPInputParser.h DESTINATION ${CMAKE_INCLUDE_OUTPUT_DIRECTORY}) +install(FILES NPVAnalysis.h NPAnalysisFactory.h NPCalibrationManager.h NPOptionManager.h RootInput.h RootOutput.h TAsciiFile.h NPDetectorManager.h NPVDetector.h NPGlobalSystemOfUnits.h NPPhysicalConstants.h NPSystemOfUnits.h NPVSpectra.h NPDetectorFactory.h NPSpectraServer.h NPInputParser.h NPImage.h DESTINATION ${CMAKE_INCLUDE_OUTPUT_DIRECTORY}) diff --git a/NPLib/Core/NPImage.cxx b/NPLib/Core/NPImage.cxx new file mode 100644 index 000000000..b14777de0 --- /dev/null +++ b/NPLib/Core/NPImage.cxx @@ -0,0 +1,159 @@ +/***************************************************************************** + * 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: Adrien Matta contact address: matta@lpccaen.in2p3.fr * + * * + * Creation Date : * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * This class is wrapper of root TASImage to manipulate and generate * + * detector pixel map * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + * * + *****************************************************************************/ + +//NPTool +#include "NPImage.h" + +//STL +#include<iostream> + +//////////////////////////////////////////////////////////////////////////////// +NPL::Image::Image(){ + m_Image = NULL; + m_ARGB = NULL; +} +//////////////////////////////////////////////////////////////////////////////// +NPL::Image::Image(std::string filename,double Xscalling,double Yscalling){ + m_Image = new TASImage(filename.c_str()); + m_ARGB = m_Image->GetArgbArray(); + m_Xscaling = Xscalling; + m_Yscaling = Yscalling; +} +//////////////////////////////////////////////////////////////////////////////// +NPL::Image::~Image(){ + if(m_Image) + delete m_Image; + if(m_ARGB) + delete m_ARGB; +} +//////////////////////////////////////////////////////////////////////////////// +void NPL::Image::Open(std::string filename){ + if(m_Image) + delete m_Image; + if(m_ARGB) + delete m_ARGB; + + m_Image = new TASImage(filename.c_str()); + m_ARGB = m_Image->GetArgbArray(); +} + +//////////////////////////////////////////////////////////////////////////////// +void NPL::Image::Print(double scale){ + unsigned int yPixel = m_Image->GetHeight(); + unsigned int xPixel = m_Image->GetWidth(); + + m_Image->Scale(scale*xPixel,scale*yPixel); + + for(unsigned int i = 0 ; i < m_Image->GetWidth() ; i++){ + for(unsigned int j = 0 ; j < m_Image->GetHeight() ; j++){ + unsigned int index = i*xPixel+j; + unsigned int b = GetBlueAtPixel(i,j); + unsigned int g = GetGreenAtPixel(i,j); + unsigned int r = GetRedAtPixel(i,j); + unsigned int a = GetAlphaAtPixel(i,j); + + if(r||b||g) + std::cout << "x"<< " " ; + else + std::cout << "."<<" " ; + } + std::cout << std::endl; + } +} +//////////////////////////////////////////////////////////////////////////////// +void NPL::Image::Save(std::string filename){ + m_Image->WriteImage(filename.c_str()); +} + + +//////////////////////////////////////////////////////////////////////////////// +void NPL::Image::Draw(){ + m_Image->Draw(); +} + +//////////////////////////////////////////////////////////////////////////////// +unsigned int NPL::Image::GetRedAtCoordinate(double x, double y){ + unsigned int xp = x/m_Xscaling+m_Image->GetWidth()/2 ; + unsigned int yp = y/m_Yscaling+m_Image->GetHeight()/2 ; + return GetRedAtPixel(xp,yp); +} + +//////////////////////////////////////////////////////////////////////////////// +unsigned int NPL::Image::GetGreenAtCoordinate(double x, double y){ + unsigned int xp = x/m_Xscaling+m_Image->GetWidth()/2 ; + unsigned int yp = y/m_Yscaling+m_Image->GetHeight()/2 ; + return GetRedAtPixel(xp,yp); +} +//////////////////////////////////////////////////////////////////////////////// +unsigned int NPL::Image::GetBlueAtCoordinate(double x, double y){ + unsigned int xp = x/m_Xscaling+m_Image->GetWidth()/2 ; + unsigned int yp = y/m_Yscaling+m_Image->GetHeight()/2 ; + return GetRedAtPixel(xp,yp); +} +//////////////////////////////////////////////////////////////////////////////// +unsigned int NPL::Image::GetAlphaAtCoordinate(double x, double y){ + unsigned int xp = x/m_Xscaling+m_Image->GetWidth()/2 ; + unsigned int yp = y/m_Yscaling+m_Image->GetHeight()/2 ; + return GetRedAtPixel(xp,yp); +} +//////////////////////////////////////////////////////////////////////////////// +unsigned int NPL::Image::GetPixelAtCoordinate(double x, double y){ + unsigned int xp = x/m_Xscaling+m_Image->GetWidth()/2 ; + unsigned int yp = y/m_Yscaling+m_Image->GetHeight()/2 ; + return m_ARGB[PixelToIndex(xp,yp)]; +} + + +//////////////////////////////////////////////////////////////////////////////// +unsigned int NPL::Image::PixelToIndex(unsigned int x, unsigned int y){ + return x*m_Image->GetWidth()+y; +} + +//////////////////////////////////////////////////////////////////////////////// +unsigned int NPL::Image::GetRedAtPixel(unsigned int x, unsigned int y){ + unsigned int v = m_ARGB[PixelToIndex(x,y)]; + v= (v>>16)&0xff; + return v; +} +//////////////////////////////////////////////////////////////////////////////// +unsigned int NPL::Image::GetGreenAtPixel(unsigned int x, unsigned int y){ + unsigned int v = m_ARGB[PixelToIndex(x,y)]; + v= (v>>8)&0xff; + return v; + +} +//////////////////////////////////////////////////////////////////////////////// +unsigned int NPL::Image::GetBlueAtPixel(unsigned int x, unsigned int y){ + unsigned int v = m_ARGB[PixelToIndex(x,y)]; + v= v&0xff; + return v; + +} +//////////////////////////////////////////////////////////////////////////////// +unsigned int NPL::Image::GetAlphaAtPixel(unsigned int x, unsigned int y){ + unsigned int v = m_ARGB[PixelToIndex(x,y)]; + v= (v>>24)&0xff; + return v; + +} + diff --git a/NPLib/Core/NPImage.h b/NPLib/Core/NPImage.h new file mode 100644 index 000000000..39000431e --- /dev/null +++ b/NPLib/Core/NPImage.h @@ -0,0 +1,71 @@ +/***************************************************************************** + * 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: Adrien Matta contact address: matta@lpccaen.in2p3.fr * + * * + * Creation Date : * + * Last update : * + *---------------------------------------------------------------------------* + * Decription: * + * This class is wrapper of root TASImage to manipulate and generate * + * detector pixel map * + * * + *---------------------------------------------------------------------------* + * Comment: * + * * + * * + *****************************************************************************/ + + +// ROOT +#include"TASImage.h" + +//STL +#include<string> + +namespace NPL{ + + class Image{ + + public: + Image(); + Image(std::string filename,double Xscalling,double Yscalling); + ~Image(); + + public: + void Open(std::string filename); + void Print(double scale=0); // print mockup in terminal + void Draw(); // draw in a new canvas (interactive only) + void Save(std::string filename); // save the image + + public: // Get the value based on coordinate + unsigned int GetRedAtCoordinate(double x, double y); + unsigned int GetGreenAtCoordinate(double x, double y); + unsigned int GetBlueAtCoordinate(double x, double y); + unsigned int GetAlphaAtCoordinate(double x, double y); + unsigned int GetPixelAtCoordinate(double x, double y); + + + public: // Get the value based on pixel + unsigned int PixelToIndex(unsigned int x, unsigned int y); + unsigned int GetRedAtPixel(unsigned int x, unsigned int y); + unsigned int GetGreenAtPixel(unsigned int x, unsigned int y); + unsigned int GetBlueAtPixel(unsigned int x, unsigned int y); + unsigned int GetAlphaAtPixel(unsigned int x, unsigned int y); + + public: + void GenerateStrip(unsigned int Nbr, double x, double y , double interstrip , unsigned int pixel); + + private: + TASImage* m_Image; // the image itself + unsigned int* m_ARGB; // the alpha red green blue array of pixel value + double m_Xscaling; // pixel per mm + double m_Yscaling; // pixel per mm + }; + +} diff --git a/NPLib/Detectors/Chio/TChio_digPhysics.cxx b/NPLib/Detectors/Chio/TChio_digPhysics.cxx index dc23e116a..7b238a1db 100644 --- a/NPLib/Detectors/Chio/TChio_digPhysics.cxx +++ b/NPLib/Detectors/Chio/TChio_digPhysics.cxx @@ -62,14 +62,11 @@ void TChio_digPhysics::ReadConfiguration(NPL::InputParser parser){ if(NPOptionManager::getInstance()->GetVerboseLevel()) cout << "//// " << blocks.size() << " detectors found " << endl; - vector<string> token = {"A","B","C","D"}; + vector<string> token = {"POS"}; for(unsigned int i = 0 ; i < blocks.size() ; i++){ if(blocks[i]->HasTokenList(token)){ - TVector3 A = blocks[i]->GetTVector3("A","mm"); - TVector3 B = blocks[i]->GetTVector3("B","mm"); - TVector3 C = blocks[i]->GetTVector3("C","mm"); - TVector3 D = blocks[i]->GetTVector3("D","mm"); + TVector3 Pos = blocks[i]->GetTVector3("POS","mm"); // AddChio(A,B,C,D); } diff --git a/NPLib/Detectors/MUST2/ressources/Mask.cxx b/NPLib/Detectors/MUST2/ressources/Mask.cxx new file mode 100644 index 000000000..33c72bc1d --- /dev/null +++ b/NPLib/Detectors/MUST2/ressources/Mask.cxx @@ -0,0 +1,58 @@ +void Mask(){ + + double dimension = 100.42; + double active = 97.30; + double pitch = 97.30/128; + double width = 0.7; +// +// double dimension = 100; +// double active = 97; +// double pitch = 97/97; +// double width = 0.5; + + // mm per pixel + double scale = 0.01; + //pitch in pixel + unsigned int spitch = pitch/scale; + unsigned int swidth = width/scale; + unsigned int sinter = (spitch - swidth)/2; + cout << spitch << " " << swidth << " " << sinter << endl; + // image size + unsigned int size = dimension/scale; + cout << "Image size: " << size << "x" << size<< endl ; + double* zargb = new double[size*size]; + TASImage* zero = new TASImage("zero",zargb,size,size,0); + zero->WriteImage("mask.png"); + TASImage* mask = new TASImage("mask.png"); + delete[] zargb; + unsigned int* argb = mask->GetArgbArray(); + unsigned int* argb2 = mask->GetArgbArray(); + unsigned int index = 0; + double border1 = (dimension-active)/scale; + double border2 = (active)/scale; + + for(unsigned int px = 0 ; px < size ; px++){ + for(unsigned int py = 0 ; py < size ; py++){ + if(px%1000==0) + cout << "\r" << px << "/" << size << flush; + // Compute array index + index = px * size + py; + // Inactive sides + if(px < border1|| py < border1 || px>border2 || py>border2) + argb[index] = 0xffff0000; + else{ // strips + unsigned int coord = px-border1; + unsigned int nbr = coord/spitch; + // cout << coord << " " << nbr*spitch+sinter << " " << spitch << " " << sinter << " " << spitch << " " << sinter << endl; + if(coord<(nbr*spitch+sinter) || coord >(((nbr+1)*spitch-sinter))){// interstrip + argb[index] = 0xffff0000+(((nbr+1))<<8)+nbr; + } + else + argb[index] = 0xff000000 + nbr; + } + } + } + mask->WriteImage("mask.png"); + //mask->Draw(); + +} diff --git a/NPLib/Detectors/MUST2/ressources/maskBack.png b/NPLib/Detectors/MUST2/ressources/maskBack.png new file mode 100644 index 0000000000000000000000000000000000000000..40753f6d6e226ee99d1d9a27524e1576f56a9a5f GIT binary patch literal 320612 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 literal 0 HcmV?d00001 diff --git a/NPLib/Detectors/MUST2/ressources/maskFront.png b/NPLib/Detectors/MUST2/ressources/maskFront.png new file mode 100644 index 0000000000000000000000000000000000000000..6644c19a7279d326859c83ab956ac8ffc3fa3681 GIT binary patch literal 325078 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 JFU!g;{(owjM&1Ab literal 0 HcmV?d00001 diff --git a/NPLib/ressources/CMake/Root.cmake b/NPLib/ressources/CMake/Root.cmake index 245789a62..d6b72cb0d 100644 --- a/NPLib/ressources/CMake/Root.cmake +++ b/NPLib/ressources/CMake/Root.cmake @@ -36,7 +36,7 @@ endif() ## Collect the different information ## # List of Root dependencies -set(ROOT_LIBRARIES dl Gui Core RIO Net Hist Gpad Tree Physics MathCore Thread ) +set(ROOT_LIBRARIES dl Gui Core RIO Net Hist Gpad Tree Physics MathCore Thread ASImage) # Lib directories exec_program(${NPTOOL_ROOT_CONFIG} ARGS "--libdir" OUTPUT_VARIABLE ROOT_LIBRARY_DIR) diff --git a/NPSimulation/Detectors/MUST2/MUST2Array.cc b/NPSimulation/Detectors/MUST2/MUST2Array.cc index bfe806930..52625d30d 100644 --- a/NPSimulation/Detectors/MUST2/MUST2Array.cc +++ b/NPSimulation/Detectors/MUST2/MUST2Array.cc @@ -37,13 +37,13 @@ #include "G4VisAttributes.hh" #include "G4Colour.hh" #include "G4PVDivision.hh" - +#include "Randomize.hh" // NPS #include "MaterialManager.hh" #include "NPSDetectorFactory.hh" #include "ObsoleteGeneralScorers.hh" -#include "MUST2Scorers.hh" - +#include "SiliconScorers.hh" +#include "CalorimeterScorers.hh" #include "NPOptionManager.h" //ROOT @@ -161,7 +161,7 @@ void MUST2Array::VolumeMaker( G4int TelescopeNumber, Name , world , false , - 0 ); + TelescopeNumber ); if (m_non_sensitive_part_visiualisation){ G4VisAttributes* FrameVisAtt = new G4VisAttributes(G4Colour(0.80, 0.80, 0.80)); @@ -176,7 +176,7 @@ void MUST2Array::VolumeMaker( G4int TelescopeNumber, G4LogicalVolume* logicVacBox = new G4LogicalVolume(solidVacBox, m_MaterialVacuum, "logicVacBox", 0, 0, 0); - new G4PVPlacement(0, positionVacBox, logicVacBox, Name + "_VacBox", logicMM, false, 0); + new G4PVPlacement(0, positionVacBox, logicVacBox, Name + "_VacBox", logicMM, false, TelescopeNumber ); logicVacBox->SetVisAttributes(G4VisAttributes::Invisible); @@ -193,8 +193,8 @@ void MUST2Array::VolumeMaker( G4int TelescopeNumber, G4Box* solidAluStrip = new G4Box("AluBox", 0.5*SiliconFace, 0.5*SiliconFace, 0.5*AluStripThickness); G4LogicalVolume* logicAluStrip = new G4LogicalVolume(solidAluStrip, m_MaterialAluminium, "logicAluStrip", 0, 0, 0); - new G4PVPlacement(0, positionAluStripFront, logicAluStrip, Name + "_AluStripFront", logicMM, false, 0); - new G4PVPlacement(0, positionAluStripBack, logicAluStrip, Name + "_AluStripBack", logicMM, false, 0); + new G4PVPlacement(0, positionAluStripFront, logicAluStrip, Name + "_AluStripFront", logicMM, false, TelescopeNumber ); + new G4PVPlacement(0, positionAluStripBack, logicAluStrip, Name + "_AluStripBack", logicMM, false, TelescopeNumber ); logicAluStrip->SetVisAttributes(G4VisAttributes::Invisible); @@ -203,7 +203,7 @@ void MUST2Array::VolumeMaker( G4int TelescopeNumber, G4Box* solidSilicon = new G4Box("solidSilicon", 0.5*SiliconFace, 0.5*SiliconFace, 0.5*SiliconThickness); G4LogicalVolume* logicSilicon = new G4LogicalVolume(solidSilicon, m_MaterialSilicon, "logicSilicon", 0, 0, 0); - new G4PVPlacement(0, positionSilicon, logicSilicon, Name + "_Silicon", logicMM, false, 0); + new G4PVPlacement(0, positionSilicon, logicSilicon, Name + "_Silicon", logicMM, false, TelescopeNumber ); ///Set Silicon strip sensible @@ -245,148 +245,158 @@ void MUST2Array::VolumeMaker( G4int TelescopeNumber, G4ThreeVector ShiftSiLiDown = G4ThreeVector(0.25 * SiliconFace + 0.5 * SiLiSpace, 0, 0) ; // SiLi : left side of SiLi detector - G4Box* solidSiLi_LT = new G4Box("SiLi_LT" , 0.5*SiLi_WidthX_Left , 0.5*SiLi_HighY_Upper , 0.5*SiLiThickness); - G4Box* solidSiLi_RT = new G4Box("SiLi_RT" , 0.5*SiLi_WidthX_Right , 0.5*SiLi_HighY_Upper , 0.5*SiLiThickness); - G4Box* solidSiLi_LC1 = new G4Box("SiLi_LC1" , 0.5*SiLi_WidthX_Left , 0.5*SiLi_HighY_Center , 0.5*SiLiThickness); - G4Box* solidSiLi_RC1 = new G4Box("SiLi_RC1" , 0.5*SiLi_WidthX_Right , 0.5*SiLi_HighY_Center , 0.5*SiLiThickness); - G4Box* solidSiLi_LB = new G4Box("SiLi_LB" , 0.5*SiLi_WidthX_Left , 0.5*SiLi_HighY_Upper , 0.5*SiLiThickness); - G4Box* solidSiLi_RB = new G4Box("SiLi_RB" , 0.5*SiLi_WidthX_Right , 0.5*SiLi_HighY_Upper , 0.5*SiLiThickness); - G4Box* solidSiLi_LC2 = new G4Box("SiLi_LC2" , 0.5*SiLi_WidthX_Left , 0.5*SiLi_HighY_Center , 0.5*SiLiThickness); - G4Box* solidSiLi_RC2 = new G4Box("SiLi_RC2" , 0.5*SiLi_WidthX_Right , 0.5*SiLi_HighY_Center , 0.5*SiLiThickness); - - G4LogicalVolume* logicSiLi_LT = new G4LogicalVolume(solidSiLi_LT , m_MaterialSilicon , "SiLi_LT" , 0 , 0 , 0); - G4LogicalVolume* logicSiLi_RT = new G4LogicalVolume(solidSiLi_RT , m_MaterialSilicon , "SiLi_RT" , 0 , 0 , 0); - G4LogicalVolume* logicSiLi_LC1 = new G4LogicalVolume(solidSiLi_LC1 , m_MaterialSilicon , "SiLi_LC1" , 0 , 0 , 0); - G4LogicalVolume* logicSiLi_RC1 = new G4LogicalVolume(solidSiLi_RC1 , m_MaterialSilicon , "SiLi_RC1" , 0 , 0 , 0); - G4LogicalVolume* logicSiLi_LB = new G4LogicalVolume(solidSiLi_LB , m_MaterialSilicon , "SiLi_LB" , 0 , 0 , 0); - G4LogicalVolume* logicSiLi_RB = new G4LogicalVolume(solidSiLi_RB , m_MaterialSilicon , "SiLi_RB" , 0 , 0 , 0); - G4LogicalVolume* logicSiLi_LC2 = new G4LogicalVolume(solidSiLi_LC2 , m_MaterialSilicon , "SiLi_LC2" , 0 , 0 , 0); - G4LogicalVolume* logicSiLi_RC2 = new G4LogicalVolume(solidSiLi_RC2 , m_MaterialSilicon , "SiLi_RC2" , 0 , 0 , 0); + G4Box* solidSiLi_LT = new G4Box("SiLi_LT", 0.5*SiLi_WidthX_Left, 0.5*SiLi_HighY_Upper, 0.5*SiLiThickness); + G4Box* solidSiLi_RT = new G4Box("SiLi_RT", 0.5*SiLi_WidthX_Right, 0.5*SiLi_HighY_Upper, 0.5*SiLiThickness); + G4Box* solidSiLi_LC1 = new G4Box("SiLi_LC1", 0.5*SiLi_WidthX_Left, 0.5*SiLi_HighY_Center, 0.5*SiLiThickness); + G4Box* solidSiLi_RC1 = new G4Box("SiLi_RC1", 0.5*SiLi_WidthX_Right, 0.5*SiLi_HighY_Center, 0.5*SiLiThickness); + G4Box* solidSiLi_LB = new G4Box("SiLi_LB", 0.5*SiLi_WidthX_Left, 0.5*SiLi_HighY_Upper, 0.5*SiLiThickness); + G4Box* solidSiLi_RB = new G4Box("SiLi_RB", 0.5*SiLi_WidthX_Right, 0.5*SiLi_HighY_Upper, 0.5*SiLiThickness); + G4Box* solidSiLi_LC2 = new G4Box("SiLi_LC2", 0.5*SiLi_WidthX_Left, 0.5*SiLi_HighY_Center, 0.5*SiLiThickness); + G4Box* solidSiLi_RC2 = new G4Box("SiLi_RC2", 0.5*SiLi_WidthX_Right, 0.5*SiLi_HighY_Center, 0.5*SiLiThickness); + + G4LogicalVolume* logicSiLi_LT = new G4LogicalVolume(solidSiLi_LT , m_MaterialSilicon, "SiLi_LT" , 0, 0, 0); + G4LogicalVolume* logicSiLi_RT = new G4LogicalVolume(solidSiLi_RT , m_MaterialSilicon, "SiLi_RT" , 0, 0, 0); + G4LogicalVolume* logicSiLi_LC1 = new G4LogicalVolume(solidSiLi_LC1, m_MaterialSilicon, "SiLi_LC1", 0, 0, 0); + G4LogicalVolume* logicSiLi_RC1 = new G4LogicalVolume(solidSiLi_RC1, m_MaterialSilicon, "SiLi_RC1", 0, 0, 0); + G4LogicalVolume* logicSiLi_LB = new G4LogicalVolume(solidSiLi_LB , m_MaterialSilicon, "SiLi_LB" , 0, 0, 0); + G4LogicalVolume* logicSiLi_RB = new G4LogicalVolume(solidSiLi_RB , m_MaterialSilicon, "SiLi_RB" , 0, 0, 0); + G4LogicalVolume* logicSiLi_LC2 = new G4LogicalVolume(solidSiLi_LC2, m_MaterialSilicon, "SiLi_LC2", 0, 0, 0); + G4LogicalVolume* logicSiLi_RC2 = new G4LogicalVolume(solidSiLi_RC2, m_MaterialSilicon, "SiLi_RC2", 0, 0, 0); G4double interSiLi = 0.5 * mm; // Top - G4ThreeVector positionSiLi_LT_up = G4ThreeVector( -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX , - 0.5 * SiLi_HighY_Upper + SiLi_HighY_Center + 1.5 * interSiLi, - 0); + G4ThreeVector positionSiLi_LT_up = + G4ThreeVector( -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX , + 0.5 * SiLi_HighY_Upper + SiLi_HighY_Center + 1.5 * interSiLi, + 0); positionSiLi_LT_up += ShiftSiLiUp ; - G4ThreeVector positionSiLi_RT_up = G4ThreeVector( 0.5 * SiLi_WidthX_Right - SiLi_ShiftX, - 0.5 * SiLi_HighY_Upper + SiLi_HighY_Center + 1.5 * interSiLi, - 0); + G4ThreeVector positionSiLi_RT_up = + G4ThreeVector( 0.5 * SiLi_WidthX_Right - SiLi_ShiftX, + 0.5 * SiLi_HighY_Upper + SiLi_HighY_Center + 1.5 * interSiLi, + 0); positionSiLi_RT_up += ShiftSiLiUp ; - G4ThreeVector positionSiLi_LC1_up = G4ThreeVector( -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX , - 0.5 * SiLi_HighY_Center + 0.5 * interSiLi, - 0); + G4ThreeVector positionSiLi_LC1_up = + G4ThreeVector( -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX , + 0.5 * SiLi_HighY_Center + 0.5 * interSiLi, + 0); positionSiLi_LC1_up += ShiftSiLiUp ; - G4ThreeVector positionSiLi_RC1_up = G4ThreeVector( 0.5 * SiLi_WidthX_Right - SiLi_ShiftX, - 0.5 * SiLi_HighY_Center + 0.5 * interSiLi, - 0); + G4ThreeVector positionSiLi_RC1_up = + G4ThreeVector( 0.5 * SiLi_WidthX_Right - SiLi_ShiftX, + 0.5 * SiLi_HighY_Center + 0.5 * interSiLi, + 0); positionSiLi_RC1_up += ShiftSiLiUp ; - G4ThreeVector positionSiLi_LB_up = G4ThreeVector( -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX , - -0.5 * SiLi_HighY_Upper - SiLi_HighY_Center - 1.5 * interSiLi , - 0); + G4ThreeVector positionSiLi_LB_up = + G4ThreeVector( -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX , + -0.5 * SiLi_HighY_Upper - SiLi_HighY_Center - 1.5 * interSiLi , + 0); positionSiLi_LB_up += ShiftSiLiUp ; - G4ThreeVector positionSiLi_RB_up = G4ThreeVector( 0.5 * SiLi_WidthX_Right - SiLi_ShiftX , - -0.5 * SiLi_HighY_Upper - SiLi_HighY_Center - 1.5 * interSiLi , - 0); + G4ThreeVector positionSiLi_RB_up = + G4ThreeVector( 0.5 * SiLi_WidthX_Right - SiLi_ShiftX , + -0.5 * SiLi_HighY_Upper - SiLi_HighY_Center - 1.5 * interSiLi , + 0); positionSiLi_RB_up += ShiftSiLiUp ; - G4ThreeVector positionSiLi_LC2_up = G4ThreeVector( -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX , - -0.5 * SiLi_HighY_Center - 0.5 * interSiLi, - 0); + G4ThreeVector positionSiLi_LC2_up = + G4ThreeVector( -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX , + -0.5 * SiLi_HighY_Center - 0.5 * interSiLi, + 0); positionSiLi_LC2_up += ShiftSiLiUp ; - G4ThreeVector positionSiLi_RC2_up = G4ThreeVector( 0.5 * SiLi_WidthX_Right - SiLi_ShiftX , - -0.5 * SiLi_HighY_Center - 0.5 * interSiLi , - 0); + G4ThreeVector positionSiLi_RC2_up = + G4ThreeVector( 0.5 * SiLi_WidthX_Right - SiLi_ShiftX , + -0.5 * SiLi_HighY_Center - 0.5 * interSiLi , + 0); positionSiLi_RC2_up += ShiftSiLiUp ; // Down - G4ThreeVector positionSiLi_LT_down = G4ThreeVector( -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX, - 0.5 * SiLi_HighY_Upper + SiLi_HighY_Center + 1.5 * interSiLi, - 0); + G4ThreeVector positionSiLi_LT_down = + G4ThreeVector( -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX, + 0.5 * SiLi_HighY_Upper + SiLi_HighY_Center + 1.5 * interSiLi, + 0); positionSiLi_LT_down += ShiftSiLiDown ; - G4ThreeVector positionSiLi_RT_down = G4ThreeVector( 0.5 * SiLi_WidthX_Right - SiLi_ShiftX, - 0.5 * SiLi_HighY_Upper + SiLi_HighY_Center + 1.5 * interSiLi, - 0); + G4ThreeVector positionSiLi_RT_down = + G4ThreeVector( 0.5 * SiLi_WidthX_Right - SiLi_ShiftX, + 0.5 * SiLi_HighY_Upper + SiLi_HighY_Center + 1.5 * interSiLi, + 0); positionSiLi_RT_down += ShiftSiLiDown ; - G4ThreeVector positionSiLi_LC1_down = G4ThreeVector( -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX, - 0.5 * SiLi_HighY_Center + 0.5 * interSiLi, - 0); + G4ThreeVector positionSiLi_LC1_down = + G4ThreeVector( -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX, + 0.5 * SiLi_HighY_Center + 0.5 * interSiLi, + 0); positionSiLi_LC1_down += ShiftSiLiDown ; - G4ThreeVector positionSiLi_RC1_down = G4ThreeVector( 0.5 * SiLi_WidthX_Right - SiLi_ShiftX, - 0.5 * SiLi_HighY_Center + 0.5 * interSiLi , - 0); + G4ThreeVector positionSiLi_RC1_down = + G4ThreeVector( 0.5 * SiLi_WidthX_Right - SiLi_ShiftX, + 0.5 * SiLi_HighY_Center + 0.5 * interSiLi , + 0); positionSiLi_RC1_down += ShiftSiLiDown ; - G4ThreeVector positionSiLi_LB_down = G4ThreeVector( -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX, - -0.5 * SiLi_HighY_Upper - SiLi_HighY_Center - 1.5 * interSiLi, - 0); + G4ThreeVector positionSiLi_LB_down = + G4ThreeVector( -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX, + -0.5 * SiLi_HighY_Upper - SiLi_HighY_Center - 1.5 * interSiLi, + 0); positionSiLi_LB_down += ShiftSiLiDown ; - G4ThreeVector positionSiLi_RB_down = G4ThreeVector( 0.5 * SiLi_WidthX_Right - SiLi_ShiftX, - -0.5 * SiLi_HighY_Upper - SiLi_HighY_Center - 1.5 * interSiLi, - 0); + G4ThreeVector positionSiLi_RB_down = + G4ThreeVector( 0.5 * SiLi_WidthX_Right - SiLi_ShiftX, + -0.5 * SiLi_HighY_Upper - SiLi_HighY_Center - 1.5 * interSiLi, + 0); positionSiLi_RB_down += ShiftSiLiDown ; - G4ThreeVector positionSiLi_LC2_down = G4ThreeVector( -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX, - -0.5 * SiLi_HighY_Center - 0.5 * interSiLi, - 0); + G4ThreeVector positionSiLi_LC2_down = + G4ThreeVector( -0.5 * SiLi_WidthX_Left - interSiLi - SiLi_ShiftX, + -0.5 * SiLi_HighY_Center - 0.5 * interSiLi, + 0); positionSiLi_LC2_down += ShiftSiLiDown ; - G4ThreeVector positionSiLi_RC2_down = G4ThreeVector( 0.5 * SiLi_WidthX_Right - SiLi_ShiftX, - -0.5 * SiLi_HighY_Center - 0.5 * interSiLi, - 0); + G4ThreeVector positionSiLi_RC2_down = + G4ThreeVector( 0.5 * SiLi_WidthX_Right - SiLi_ShiftX, + -0.5 * SiLi_HighY_Center - 0.5 * interSiLi, + 0); positionSiLi_RC2_down += ShiftSiLiDown ; + new G4PVPlacement(0 , positionSiLi_RT_down , logicSiLi_RT , Name + "_SiLi_Pad1" , logicSiLi , false ,1); + new G4PVPlacement(0 , positionSiLi_LT_down , logicSiLi_LT , Name + "_SiLi_Pad2" , logicSiLi , false ,2); + new G4PVPlacement(0 , positionSiLi_RC1_down , logicSiLi_RC1 , Name + "_SiLi_Pad3" , logicSiLi , false ,3); + new G4PVPlacement(0 , positionSiLi_LC1_down , logicSiLi_LC1 , Name + "_SiLi_Pad4" , logicSiLi , false ,4); + new G4PVPlacement(0 , positionSiLi_LC2_down , logicSiLi_LC2 , Name + "_SiLi_Pad5" , logicSiLi , false ,5); + new G4PVPlacement(0 , positionSiLi_RC2_down , logicSiLi_RC2 , Name + "_SiLi_Pad6" , logicSiLi , false ,6); + new G4PVPlacement(0 , positionSiLi_LB_down , logicSiLi_LB , Name + "_SiLi_Pad7" , logicSiLi , false ,7); + new G4PVPlacement(0 , positionSiLi_RB_down , logicSiLi_RB , Name + "_SiLi_Pad8" , logicSiLi , false ,8); + new G4PVPlacement(0 , positionSiLi_LT_up , logicSiLi_LT , Name + "_SiLi_Pad9" , logicSiLi , false ,9); + new G4PVPlacement(0 , positionSiLi_RT_up , logicSiLi_RT , Name + "_SiLi_Pad10" , logicSiLi , false ,10); + new G4PVPlacement(0 , positionSiLi_LC1_up , logicSiLi_LC1 , Name + "_SiLi_Pad11" , logicSiLi , false ,11); + new G4PVPlacement(0 , positionSiLi_RC1_up , logicSiLi_RC1 , Name + "_SiLi_Pad12" , logicSiLi , false ,12); + new G4PVPlacement(0 , positionSiLi_RC2_up , logicSiLi_RC2 , Name + "_SiLi_Pad13" , logicSiLi , false ,13); + new G4PVPlacement(0 , positionSiLi_LC2_up , logicSiLi_LC2 , Name + "_SiLi_Pad14" , logicSiLi , false ,14); + new G4PVPlacement(0 , positionSiLi_RB_up , logicSiLi_RB , Name + "_SiLi_Pad15" , logicSiLi , false ,15); + new G4PVPlacement(0 , positionSiLi_LB_up , logicSiLi_LB , Name + "_SiLi_Pad16" , logicSiLi , false ,16); - // up - new G4PVPlacement(0 , positionSiLi_LT_up , logicSiLi_LT , Name + "_SiLi_Pad9" , logicSiLi , false , 0) ; - new G4PVPlacement(0 , positionSiLi_RT_up , logicSiLi_RT , Name + "_SiLi_Pad10" , logicSiLi , false , 0) ; - new G4PVPlacement(0 , positionSiLi_LC1_up , logicSiLi_LC1 , Name + "_SiLi_Pad11" , logicSiLi , false , 0); - new G4PVPlacement(0 , positionSiLi_RC1_up , logicSiLi_RC1 , Name + "_SiLi_Pad12" , logicSiLi , false , 0); - - new G4PVPlacement(0 , positionSiLi_LB_up , logicSiLi_LB , Name + "_SiLi_Pad16" , logicSiLi , false , 0) ; - new G4PVPlacement(0 , positionSiLi_RB_up , logicSiLi_RB , Name + "_SiLi_Pad15" , logicSiLi , false , 0) ; - new G4PVPlacement(0 , positionSiLi_LC2_up , logicSiLi_LC2 , Name + "_SiLi_Pad14" , logicSiLi , false , 0); - new G4PVPlacement(0 , positionSiLi_RC2_up , logicSiLi_RC2 , Name + "_SiLi_Pad13" , logicSiLi , false , 0); - - - // down - new G4PVPlacement(0 , positionSiLi_LT_down , logicSiLi_LT , Name + "_SiLi_Pad2" , logicSiLi , false , 0) ; - new G4PVPlacement(0 , positionSiLi_RT_down , logicSiLi_RT , Name + "_SiLi_Pad1" , logicSiLi , false , 0) ; - new G4PVPlacement(0 , positionSiLi_LC1_down , logicSiLi_LC1 , Name + "_SiLi_Pad4" , logicSiLi , false , 0) ; - new G4PVPlacement(0 , positionSiLi_RC1_down , logicSiLi_RC1 , Name + "_SiLi_Pad3" , logicSiLi , false , 0) ; - - new G4PVPlacement(0 , positionSiLi_LB_down , logicSiLi_LB , Name + "_SiLi_Pad7" , logicSiLi , false , 0) ; - new G4PVPlacement(0 , positionSiLi_RB_down , logicSiLi_RB , Name + "_SiLi_Pad8" , logicSiLi , false , 0) ; - new G4PVPlacement(0 , positionSiLi_LC2_down , logicSiLi_LC2 , Name + "_SiLi_Pad5" , logicSiLi , false , 0) ; - new G4PVPlacement(0 , positionSiLi_RC2_down , logicSiLi_RC2 , Name + "_SiLi_Pad6" , logicSiLi , false , 0) ; // Set SiLi sensible logicSiLi_LT->SetSensitiveDetector(m_SiLiScorer); @@ -563,13 +573,13 @@ void MUST2Array::ReadConfiguration(NPL::InputParser parser){ cout << "//// " << blocks.size() << " telescope found" << endl; for(unsigned int i = 0 ; i < blocks.size() ; i++){ if(NPOptionManager::getInstance()->GetVerboseLevel()) - cout << endl << "//// Must 2 Telecope " << i+1 << endl; + cout << endl << "//// Must 2 Telecope " << i+1 << endl; // Cartesian Case vector<string> cart = {"X1_Y1","X1_Y128","X128_Y1","X128_Y128","SI","SILI","CSI"}; // Spherical Case vector<string> sphe= {"R","THETA","PHI","BETA","SI","SILI","CSI"}; - if(blocks[i]->HasTokenList(cart)){ + if(blocks[i]->HasTokenList(cart)){ G4ThreeVector A = NPS::ConvertVector( blocks[i]->GetTVector3("X1_Y1","mm")); G4ThreeVector B = NPS::ConvertVector( blocks[i]->GetTVector3("X128_Y1","mm")); G4ThreeVector C = NPS::ConvertVector( blocks[i]->GetTVector3("X1_Y128","mm")); @@ -598,7 +608,7 @@ void MUST2Array::ReadConfiguration(NPL::InputParser parser){ } if(blocks[i]->GetString("VIS")=="all") - m_non_sensitive_part_visiualisation = true; + m_non_sensitive_part_visiualisation = true; } } @@ -609,13 +619,13 @@ void MUST2Array::ReadConfiguration(NPL::InputParser parser){ void MUST2Array::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 MMu = G4ThreeVector(0, 0, 0) ; + G4ThreeVector MMv = G4ThreeVector(0, 0, 0) ; + G4ThreeVector MMw = G4ThreeVector(0, 0, 0) ; G4ThreeVector MMCenter = G4ThreeVector(0, 0, 0) ; - bool Si = true ; - bool SiLi = true ; - bool CsI = true ; + bool Si = true ; + bool SiLi = true ; + bool CsI = true ; G4int NumberOfTelescope = m_DefinitionType.size() ; @@ -708,320 +718,184 @@ void MUST2Array::InitializeRootOutput(){ // Read sensitive part and fill the Root tree. // Called at in the EventAction::EndOfEventAvtion void MUST2Array::ReadSensitive(const G4Event* event){ - G4String DetectorNumber ; - m_Event->Clear() ; + G4String DetectorNumber; + m_Event->Clear(); ////////////////////////////////////////////////////////////////////////////////////// //////////////////////// Used to Read Event Map of detector ////////////////////////// ////////////////////////////////////////////////////////////////////////////////////// - // Si - std::map<G4int, G4int*>::iterator DetectorNumber_itr; - std::map<G4int, G4double*>::iterator Energy_itr; - std::map<G4int, G4double*>::iterator Time_itr; - std::map<G4int, G4int*>::iterator X_itr; - std::map<G4int, G4int*>::iterator Y_itr; - std::map<G4int, G4double*>::iterator Pos_X_itr; - std::map<G4int, G4double*>::iterator Pos_Y_itr; - std::map<G4int, G4double*>::iterator Pos_Z_itr; - std::map<G4int, G4double*>::iterator Ang_Theta_itr; - std::map<G4int, G4double*>::iterator Ang_Phi_itr; - - NPS::HitsMap<G4int>* DetectorNumberHitMap; - NPS::HitsMap<G4double>* EnergyHitMap; - NPS::HitsMap<G4double>* TimeHitMap; - NPS::HitsMap<G4int>* XHitMap; - NPS::HitsMap<G4int>* YHitMap; - NPS::HitsMap<G4double>* PosXHitMap; - NPS::HitsMap<G4double>* PosYHitMap; - NPS::HitsMap<G4double>* PosZHitMap; - NPS::HitsMap<G4double>* AngThetaHitMap; - NPS::HitsMap<G4double>* AngPhiHitMap; - - // Si(Li) - std::map<G4int, G4double*>::iterator SiLiEnergy_itr; - std::map<G4int, G4int*>::iterator SiLiPadNbr_itr; - NPS::HitsMap<G4double>* SiLiEnergyHitMap; - NPS::HitsMap<G4int>* SiLiPadNbrHitMap; - - // CsI - std::map<G4int, G4double*>::iterator CsIEnergy_itr; - std::map<G4int, G4int*>::iterator CsICristalNbr_itr; - NPS::HitsMap<G4double>* CsIEnergyHitMap; - NPS::HitsMap<G4int>* CsICristalNbrHitMap; - ////////////////////////////////////////////////////////////////////////////////////// - ////////////////////////////////////////////////////////////////////////////////////// - - // Read the Scorer associate to the Silicon Strip - - //Detector Number - G4int StripDetCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/DetectorNumber"); - DetectorNumberHitMap = (NPS::HitsMap<G4int>*)(event->GetHCofThisEvent()->GetHC(StripDetCollectionID)); - DetectorNumber_itr = DetectorNumberHitMap->GetMap()->begin(); - - //Energy - G4int StripEnergyCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/StripEnergy") ; - EnergyHitMap = (NPS::HitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(StripEnergyCollectionID)) ; - Energy_itr = EnergyHitMap->GetMap()->begin(); - - //Time of Flight - G4int StripTimeCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/StripTime"); - TimeHitMap = (NPS::HitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(StripTimeCollectionID)); - Time_itr = TimeHitMap->GetMap()->begin(); - - //Strip Number X - G4int StripXCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/StripNumberX") ; - XHitMap = (NPS::HitsMap<G4int>*)(event->GetHCofThisEvent()->GetHC(StripXCollectionID)); - X_itr = XHitMap->GetMap()->begin(); - - //Strip Number Y - G4int StripYCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/StripNumberY"); - YHitMap = (NPS::HitsMap<G4int>*)(event->GetHCofThisEvent()->GetHC(StripYCollectionID)); - Y_itr = YHitMap->GetMap()->begin(); - - //Interaction Coordinate X - G4int InterCoordXCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/InterCoordX"); - PosXHitMap = (NPS::HitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordXCollectionID)); - Pos_X_itr = PosXHitMap->GetMap()->begin(); - - //Interaction Coordinate Y - G4int InterCoordYCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/InterCoordY"); - PosYHitMap = (NPS::HitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordYCollectionID)); - Pos_Y_itr = PosYHitMap->GetMap()->begin(); - - //Interaction Coordinate Z - G4int InterCoordZCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/InterCoordZ"); - PosZHitMap = (NPS::HitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordZCollectionID)); - Pos_Z_itr = PosXHitMap->GetMap()->begin(); - - //Interaction Coordinate Angle Theta - G4int InterCoordAngThetaCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/InterCoordAngTheta"); - AngThetaHitMap = (NPS::HitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordAngThetaCollectionID)); - Ang_Theta_itr = AngThetaHitMap->GetMap()->begin(); - - //Interaction Coordinate Angle Phi - G4int InterCoordAngPhiCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_StripScorer/InterCoordAngPhi"); - AngPhiHitMap = (NPS::HitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(InterCoordAngPhiCollectionID)); - Ang_Phi_itr = AngPhiHitMap->GetMap()->begin(); - - // Read the Scorer associate to the SiLi - //Energy - G4int SiLiEnergyCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_SiLiScorer/SiLiEnergy"); - SiLiEnergyHitMap = (NPS::HitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(SiLiEnergyCollectionID)); - SiLiEnergy_itr = SiLiEnergyHitMap->GetMap()->begin(); - - G4int SiLiPadNbrCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_SiLiScorer/SiLiPadNbr"); - SiLiPadNbrHitMap = (NPS::HitsMap<G4int>*)(event->GetHCofThisEvent()->GetHC(SiLiPadNbrCollectionID)); - SiLiPadNbr_itr = SiLiPadNbrHitMap->GetMap()->begin(); - - // Read the Scorer associate to the CsI crystal - //Energy - G4int CsIEnergyCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_CsIScorer/CsIEnergy"); - CsIEnergyHitMap = (NPS::HitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(CsIEnergyCollectionID)); - CsIEnergy_itr = CsIEnergyHitMap->GetMap()->begin(); - - G4int CsICristalNbrCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_CsIScorer/CsICristalNbr"); - CsICristalNbrHitMap = (NPS::HitsMap<G4int>*)(event->GetHCofThisEvent()->GetHC(CsICristalNbrCollectionID)); - CsICristalNbr_itr = CsICristalNbrHitMap->GetMap()->begin(); - - ///////////////////// - - G4int sizeN = DetectorNumberHitMap->entries(); - G4int sizeE = EnergyHitMap->entries(); - G4int sizeT = TimeHitMap->entries(); - G4int sizeX = XHitMap->entries(); - G4int sizeY = YHitMap->entries(); - - // Loop on Telescope Number entry - for (G4int l = 0 ; l < sizeN ; l++) { - G4int N = *(DetectorNumber_itr->second); - G4int NTrackID = DetectorNumber_itr->first - N; - - - if (N > 0) { - - m_Event->SetMMStripXEDetectorNbr(N) ; - m_Event->SetMMStripYEDetectorNbr(N) ; - m_Event->SetMMStripXTDetectorNbr(N) ; - m_Event->SetMMStripYTDetectorNbr(N) ; - - // Energy - Energy_itr = EnergyHitMap->GetMap()->begin(); - for (G4int h = 0 ; h < sizeE ; h++) { - G4int ETrackID = Energy_itr->first - N; - G4double E = *(Energy_itr->second); - - if (ETrackID == NTrackID) { - m_Event->SetMMStripXEEnergy(RandGauss::shoot(E, ResoStrip)); - m_Event->SetMMStripYEEnergy(RandGauss::shoot(E, ResoStrip)); - } - - Energy_itr++; - } - - - // Time - Time_itr = TimeHitMap->GetMap()->begin(); - for (G4int h = 0 ; h < sizeT ; h++) { - G4int TTrackID = Time_itr->first - N; - G4double T = *(Time_itr->second); - - if (TTrackID == NTrackID) { - m_Event->SetMMStripXTTime(RandGauss::shoot(T, ResoTimeMust)) ; - m_Event->SetMMStripYTTime(RandGauss::shoot(T, ResoTimeMust)) ; - } - - Time_itr++; - } - - - // X - X_itr = XHitMap->GetMap()->begin(); - for (G4int h = 0 ; h < sizeX ; h++) { - G4int XTrackID = X_itr->first - N; - G4int X = *(X_itr->second); - if (XTrackID == NTrackID) { - m_Event->SetMMStripXEStripNbr(X); - m_Event->SetMMStripXTStripNbr(X); - } - - X_itr++; + // Read the Scorer associate to the Silicon Strip + SILICONSCORERS::PS_Silicon_Images* SiScorer = (SILICONSCORERS::PS_Silicon_Images*) m_StripScorer->GetPrimitive(0); + + set<int> trig; // list of telescope that got a Si trigger + vector<unsigned int> indexes = SiScorer->GetIndexes(); + unsigned int size = indexes.size(); + for(unsigned int i = 0 ;i<size;i++){ + unsigned int index = indexes[i]; + double energy = SiScorer->GetEnergy(index); + double energyX = RandGauss::shoot(energy, ResoStrip); + double energyY= RandGauss::shoot(energy, ResoStrip); + int detectorNbr = SiScorer->GetDetectorNbr(index); + double time = SiScorer->GetTime(index); + // X + if(energyX>0.1*keV){ // above threshold + // Pixel value at interaction point + unsigned int a,r,g,b; + // pixel + SiScorer->GetARGBFront(indexes[i],a,r,g,b); + if(r==0){ + trig.insert(detectorNbr); + // Energy + m_Event->SetMMStripXEDetectorNbr(detectorNbr); + m_Event->SetMMStripXEStripNbr(b+1); + m_Event->SetMMStripXEEnergy(energyX); + + // Time + m_Event->SetMMStripXTDetectorNbr(detectorNbr); + m_Event->SetMMStripXTStripNbr(b+1); + m_Event->SetMMStripXTTime(RandGauss::shoot(time, ResoTimeMust)); } - - // Y - Y_itr = YHitMap->GetMap()->begin() ; - for (G4int h = 0 ; h < sizeY ; h++) { - G4int YTrackID = Y_itr->first - N ; - G4int Y = *(Y_itr->second); - if (YTrackID == NTrackID) { - m_Event->SetMMStripYEStripNbr(Y); - m_Event->SetMMStripYTStripNbr(Y); + else{ // Interstrip X, keep maximum shared energy + double rand = G4UniformRand(); + if(rand>0.5){ + energyX = rand*energyX; + if(energyX>0.1*keV){ + trig.insert(detectorNbr); + // Energy + m_Event->SetMMStripXEDetectorNbr(detectorNbr); + m_Event->SetMMStripXEStripNbr(b+1); + m_Event->SetMMStripXEEnergy(energyX); + + // Time + m_Event->SetMMStripXTDetectorNbr(detectorNbr); + m_Event->SetMMStripXTStripNbr(b+1); + m_Event->SetMMStripXTTime(RandGauss::shoot(time, ResoTimeMust)); + } } - - Y_itr++; - } - - // Pos X - Pos_X_itr = PosXHitMap->GetMap()->begin(); - for (G4int h = 0 ; h < PosXHitMap->entries() ; h++) { - G4int PosXTrackID = Pos_X_itr->first - N ; - G4double PosX = *(Pos_X_itr->second) ; - if (PosXTrackID == NTrackID) { - ms_InterCoord->SetDetectedPositionX(PosX) ; + else{ + energyX = (1-rand)*energyX; + if(energyX>0.1*keV){ + trig.insert(detectorNbr); + + // Energy + m_Event->SetMMStripXEDetectorNbr(detectorNbr); + m_Event->SetMMStripXEStripNbr(g+1); + m_Event->SetMMStripXEEnergy(energyX); + + // Time + m_Event->SetMMStripXTDetectorNbr(detectorNbr); + m_Event->SetMMStripXTStripNbr(g+1); + m_Event->SetMMStripXTTime(RandGauss::shoot(time, ResoTimeMust)); + } } - Pos_X_itr++; } - - // Pos Y - Pos_Y_itr = PosYHitMap->GetMap()->begin(); - for (G4int h = 0 ; h < PosYHitMap->entries() ; h++) { - G4int PosYTrackID = Pos_Y_itr->first - N ; - G4double PosY = *(Pos_Y_itr->second) ; - if (PosYTrackID == NTrackID) { - ms_InterCoord->SetDetectedPositionY(PosY) ; - } - Pos_Y_itr++; + } + // Y + if(energyY>0.1*keV){ // above threshold + // Pixel value at interaction point + unsigned int a,r,g,b; + // pixel + SiScorer->GetARGBBack(indexes[i],a,r,g,b); + if(r==0){ + trig.insert(detectorNbr); + // Energy + m_Event->SetMMStripYEDetectorNbr(detectorNbr); + m_Event->SetMMStripYEStripNbr(b+1); + m_Event->SetMMStripYEEnergy(energyY); + + // Time + m_Event->SetMMStripYTDetectorNbr(detectorNbr); + m_Event->SetMMStripYTStripNbr(b+1); + m_Event->SetMMStripYTTime(RandGauss::shoot(time, ResoTimeMust)); } - - // Pos Z - Pos_Z_itr = PosZHitMap->GetMap()->begin(); - for (G4int h = 0 ; h < PosZHitMap->entries() ; h++) { - G4int PosZTrackID = Pos_Z_itr->first - N ; - G4double PosZ = *(Pos_Z_itr->second) ; - if (PosZTrackID == NTrackID) { - ms_InterCoord->SetDetectedPositionZ(PosZ) ; + else{ // Interstrip Y, keep both strip with shared energy + double rand = G4UniformRand(); + double energyY1 = rand*energyY; + if(energyY1>0.1*keV){ + trig.insert(detectorNbr); + + // Energy + m_Event->SetMMStripYEDetectorNbr(detectorNbr); + m_Event->SetMMStripYEStripNbr(b+1); + m_Event->SetMMStripYEEnergy(energyY1); + + // Time + m_Event->SetMMStripYTDetectorNbr(detectorNbr); + m_Event->SetMMStripYTStripNbr(b+1); + m_Event->SetMMStripYTTime(RandGauss::shoot(time, ResoTimeMust)); } - Pos_Z_itr++; - } - // Angle Theta - Ang_Theta_itr = AngThetaHitMap->GetMap()->begin(); - for (G4int h = 0 ; h < AngThetaHitMap->entries(); h++) { - G4int AngThetaTrackID = Ang_Theta_itr->first - N ; - G4double AngTheta = *(Ang_Theta_itr->second) ; - if (AngThetaTrackID == NTrackID) { - ms_InterCoord->SetDetectedAngleTheta(AngTheta) ; + if(energyY1>0.1*keV){ + trig.insert(detectorNbr); + double energyY2 = (1-rand)*energyY; + // Energy + m_Event->SetMMStripYEDetectorNbr(detectorNbr); + m_Event->SetMMStripYEStripNbr(g+1); + m_Event->SetMMStripYEEnergy(energyY2); + + // Time + m_Event->SetMMStripYTDetectorNbr(detectorNbr); + m_Event->SetMMStripYTStripNbr(g+1); + m_Event->SetMMStripYTTime(RandGauss::shoot(time, ResoTimeMust)); } - Ang_Theta_itr++; } + } + } - // Angle Phi - Ang_Phi_itr = AngPhiHitMap->GetMap()->begin(); - for (G4int h = 0 ; h < AngPhiHitMap->entries() ; h++) { - G4int AngPhiTrackID = Ang_Phi_itr->first - N ; - G4double AngPhi = *(Ang_Phi_itr->second) ; - if (AngPhiTrackID == NTrackID) { - ms_InterCoord->SetDetectedAnglePhi(AngPhi) ; - } - Ang_Phi_itr++; - } - - // Si(Li) - SiLiEnergy_itr = SiLiEnergyHitMap->GetMap()->begin() ; - SiLiPadNbr_itr = SiLiPadNbrHitMap->GetMap()->begin() ; - - for (G4int h = 0 ; h < SiLiEnergyHitMap->entries() ; h++) { - G4int SiLiEnergyTrackID = SiLiEnergy_itr->first -N ; - G4double SiLiEnergy = *(SiLiEnergy_itr->second) ; - - G4int PadNbr = *(SiLiPadNbr_itr->second) ; + // Si(Li) + NPS::HitsMap<G4double*>* SiLiHitMap; + std::map<G4int, G4double**>::iterator SiLi_itr; - if (SiLiEnergyTrackID == NTrackID) { - m_Event->SetMMSiLiEEnergy(RandGauss::shoot(SiLiEnergy, ResoSiLi)) ; - m_Event->SetMMSiLiEPadNbr(PadNbr); - m_Event->SetMMSiLiTPadNbr(PadNbr); - m_Event->SetMMSiLiTTime(1); - m_Event->SetMMSiLiTDetectorNbr(N); - m_Event->SetMMSiLiEDetectorNbr(N); - } + G4int SiLiCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_SiLiScorer/SiLiScorer"); + SiLiHitMap = (NPS::HitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(SiLiCollectionID)); - SiLiEnergy_itr++ ; - SiLiPadNbr_itr++ ; + // CsI + NPS::HitsMap<G4double*>* CsIHitMap; + std::map<G4int, G4double**>::iterator CsI_itr; + + G4int CsICollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("MUST2_CsIScorer/CsIScorer"); + CsIHitMap = (NPS::HitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(CsICollectionID)); + + + // Look for SiLi data in Trigg Telescope + std::set<int>::iterator itr; + for(itr=trig.begin();itr!=trig.end();itr++){ + for(SiLi_itr = SiLiHitMap->GetMap()->begin(); SiLi_itr!=SiLiHitMap->GetMap()->end() ; SiLi_itr++){ + G4double* Info = *(SiLi_itr->second); + if(Info[7]==*itr){//matching telescope number + m_Event->SetMMSiLiEDetectorNbr(Info[7]); + m_Event->SetMMSiLiEEnergy(RandGauss::shoot(Info[0],ResoSiLi)); + m_Event->SetMMSiLiEPadNbr(Info[8]); + m_Event->SetMMSiLiTDetectorNbr(Info[7]); + m_Event->SetMMSiLiTTime(RandGauss::shoot(Info[1],ResoTimeMust)); + m_Event->SetMMSiLiTPadNbr(Info[8]); } + } + } - // CsI - CsIEnergy_itr = CsIEnergyHitMap->GetMap()->begin() ; - CsICristalNbr_itr = CsICristalNbrHitMap->GetMap()->begin() ; - - for (G4int h = 0 ; h < CsIEnergyHitMap->entries() ; h++) { - G4int CsIEnergyTrackID = CsIEnergy_itr->first-N ; - G4double CsIEnergy = *(CsIEnergy_itr->second) ; - - G4int CristalNumber = *(CsICristalNbr_itr->second) ; - if (CsIEnergyTrackID == NTrackID) { - m_Event->SetMMCsIEEnergy(RandGauss::shoot(CsIEnergy, ResoCsI*sqrt(CsIEnergy))); - m_Event->SetMMCsIECristalNbr(CristalNumber); - m_Event->SetMMCsITCristalNbr(CristalNumber); - m_Event->SetMMCsITTime(1); - m_Event->SetMMCsITDetectorNbr(N); - m_Event->SetMMCsIEDetectorNbr(N); - } - - CsIEnergy_itr++ ; - CsICristalNbr_itr++ ; + // Look for CsI data in Trigg Telescope + for(itr=trig.begin();itr!=trig.end();itr++){ + for(CsI_itr = CsIHitMap->GetMap()->begin(); CsI_itr!=CsIHitMap->GetMap()->end() ; CsI_itr++){ + G4double* Info = *(CsI_itr->second); + + if(Info[7]==*itr){//matching telescope number + m_Event->SetMMCsIEDetectorNbr(Info[7]); + m_Event->SetMMCsIEEnergy(RandGauss::shoot(Info[0],ResoCsI)); + m_Event->SetMMCsIECristalNbr(Info[8]); + m_Event->SetMMCsITDetectorNbr(Info[7]); + m_Event->SetMMCsITTime(RandGauss::shoot(Info[1],ResoTimeMust)); + m_Event->SetMMCsITCristalNbr(Info[8]); } - } - - DetectorNumber_itr++; } + + SiScorer->clear(); // clear map for next event - DetectorNumberHitMap ->clear(); - EnergyHitMap ->clear() ; - TimeHitMap ->clear() ; - XHitMap ->clear() ; - YHitMap ->clear() ; - SiLiEnergyHitMap ->clear() ; - SiLiPadNbrHitMap ->clear() ; - CsIEnergyHitMap ->clear() ; - CsICristalNbrHitMap ->clear() ; - PosXHitMap ->clear() ; - PosYHitMap ->clear() ; - PosZHitMap ->clear() ; - AngThetaHitMap ->clear() ; - AngPhiHitMap ->clear() ; + SiLiHitMap->clear() ; + CsIHitMap->clear() ; } @@ -1037,49 +911,26 @@ void MUST2Array::InitializeScorers() { // if the scorer were created previously nothing else need to be made if(already_exist) return; - G4VPrimitiveScorer* DetNbr = new OBSOLETEGENERALSCORERS::PSDetectorNumber("DetectorNumber","MUST2Telescope", 0); - G4VPrimitiveScorer* Energy = new OBSOLETEGENERALSCORERS::PSEnergy("StripEnergy","MUST2Telescope", 0); - G4VPrimitiveScorer* TOF = new OBSOLETEGENERALSCORERS::PSTOF("StripTime","MUST2Telescope", 0); - - G4VPrimitiveScorer* StripPositionX = new PSStripNumberX("StripNumberX", 0, SiliconFace, 128); - G4VPrimitiveScorer* StripPositionY = new PSStripNumberY("StripNumberY", 0, SiliconFace, 128); - - G4VPrimitiveScorer* InteractionCoordinatesX = new OBSOLETEGENERALSCORERS::PSInteractionCoordinatesX("InterCoordX","MUST2Telescope", 0); - G4VPrimitiveScorer* InteractionCoordinatesY = new OBSOLETEGENERALSCORERS::PSInteractionCoordinatesY("InterCoordY","MUST2Telescope", 0); - G4VPrimitiveScorer* InteractionCoordinatesZ = new OBSOLETEGENERALSCORERS::PSInteractionCoordinatesZ("InterCoordZ","MUST2Telescope", 0); - - G4VPrimitiveScorer* InteractionCoordinatesAngleTheta = new OBSOLETEGENERALSCORERS::PSInteractionCoordinatesAngleTheta("InterCoordAngTheta","MUST2Telescope", 0); - G4VPrimitiveScorer* InteractionCoordinatesAnglePhi = new OBSOLETEGENERALSCORERS::PSInteractionCoordinatesAnglePhi("InterCoordAngPhi","MUST2Telescope", 0) ; - + G4VPrimitiveScorer* SiScorer = new SILICONSCORERS::PS_Silicon_Images("SiScorer","/scratch/nptool/NPLib/Detectors/MUST2/maskFront.png","/scratch/nptool/NPLib/Detectors/MUST2/maskBack.png",0.01,0.01,0,0,0xffff0000,0); //and register it to the multifunctionnal detector - m_StripScorer->RegisterPrimitive(DetNbr); - m_StripScorer->RegisterPrimitive(Energy); - m_StripScorer->RegisterPrimitive(TOF); - m_StripScorer->RegisterPrimitive(StripPositionX); - m_StripScorer->RegisterPrimitive(StripPositionY); - m_StripScorer->RegisterPrimitive(InteractionCoordinatesX); - m_StripScorer->RegisterPrimitive(InteractionCoordinatesY); - m_StripScorer->RegisterPrimitive(InteractionCoordinatesZ); - m_StripScorer->RegisterPrimitive(InteractionCoordinatesAngleTheta); - m_StripScorer->RegisterPrimitive(InteractionCoordinatesAnglePhi); - + m_StripScorer->RegisterPrimitive(SiScorer); // SiLi Associate Scorer - G4VPrimitiveScorer* SiLiEnergy = new OBSOLETEGENERALSCORERS::PSEnergy("SiLiEnergy","MUST2Telescope", 0) ; - G4VPrimitiveScorer* SiLiPadNbr = new PSPadOrCristalNumber("SiLiPadNbr",0) ; - m_SiLiScorer->RegisterPrimitive(SiLiEnergy); - m_SiLiScorer->RegisterPrimitive(SiLiPadNbr); + vector<int> SiLi_nesting={3,0}; + G4VPrimitiveScorer* SiLiScorer= + new CALORIMETERSCORERS::PS_CalorimeterWithInteraction("SiLiScorer",SiLi_nesting) ; + m_SiLiScorer->RegisterPrimitive(SiLiScorer); // CsI Associate Scorer - G4VPrimitiveScorer* CsIEnergy = new OBSOLETEGENERALSCORERS::PSEnergy("CsIEnergy","MUST2Telescope", 0) ; - G4VPrimitiveScorer* CsICristalNbr = new PSPadOrCristalNumber("CsICristalNbr",0) ; - m_CsIScorer->RegisterPrimitive(CsIEnergy) ; - m_CsIScorer->RegisterPrimitive(CsICristalNbr) ; + vector<int> CsI_nesting = {2,0}; + G4VPrimitiveScorer* CsIScorer= + new CALORIMETERSCORERS::PS_CalorimeterWithInteraction("CsIScorer",CsI_nesting, 0) ; + m_CsIScorer->RegisterPrimitive(CsIScorer) ; // Add All Scorer to the Global Scorer Manager - G4SDManager::GetSDMpointer()->AddNewDetector(m_StripScorer) ; - G4SDManager::GetSDMpointer()->AddNewDetector(m_SiLiScorer) ; - G4SDManager::GetSDMpointer()->AddNewDetector(m_CsIScorer) ; + G4SDManager::GetSDMpointer()->AddNewDetector(m_StripScorer); + G4SDManager::GetSDMpointer()->AddNewDetector(m_SiLiScorer); + G4SDManager::GetSDMpointer()->AddNewDetector(m_CsIScorer); } //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... diff --git a/NPSimulation/Detectors/MUST2/MUST2Array.hh b/NPSimulation/Detectors/MUST2/MUST2Array.hh index ff06606ae..68914a94e 100644 --- a/NPSimulation/Detectors/MUST2/MUST2Array.hh +++ b/NPSimulation/Detectors/MUST2/MUST2Array.hh @@ -47,7 +47,7 @@ namespace MUST2 const G4double AluStripThickness = 0.4*micrometer ; const G4double SiliconThickness = 300*micrometer ; - const G4double SiliconFace = 98*mm ; + const G4double SiliconFace = 100.42*mm ; const G4double VacBoxThickness = 3*cm ; const G4double SiLiThickness = 5.1*mm; // Must be checked diff --git a/NPSimulation/Scorers/CalorimeterScorers.cc b/NPSimulation/Scorers/CalorimeterScorers.cc index c892f401e..ef102b9ce 100644 --- a/NPSimulation/Scorers/CalorimeterScorers.cc +++ b/NPSimulation/Scorers/CalorimeterScorers.cc @@ -126,7 +126,6 @@ G4bool PS_CalorimeterWithInteraction::ProcessHits(G4Step* aStep, G4TouchableHist Infos[5] = m_Position.theta(); Infos[6] = m_Position.phi(); - for(unsigned int i = 0 ; i < mysize ; i++){ Infos[i+7] = aStep->GetPreStepPoint()->GetTouchableHandle()->GetCopyNumber(m_NestingLevel[i]); } diff --git a/NPSimulation/Scorers/SiliconScorers.cc b/NPSimulation/Scorers/SiliconScorers.cc index acc039beb..f3e176108 100644 --- a/NPSimulation/Scorers/SiliconScorers.cc +++ b/NPSimulation/Scorers/SiliconScorers.cc @@ -22,7 +22,159 @@ #include "SiliconScorers.hh" #include "G4UnitsTable.hh" using namespace SILICONSCORERS ; +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +PS_Silicon_Images::PS_Silicon_Images(G4String name, string imageFront,string imageBack,double scalingFront, double scalingBack, double centerOffsetX,double centerOffsetY,unsigned int ignoreValue, G4int depth) :G4VPrimitiveScorer(name, depth),HCID(-1){ + m_ImageFront = new NPL::Image(imageFront,scalingFront,scalingFront); + m_ImageBack = new NPL::Image(imageBack,scalingBack,scalingBack); + m_ScalingFront = scalingFront; + m_ScalingBack = scalingBack; + m_CenterOffsetX = centerOffsetX; + m_CenterOffsetY = centerOffsetY; + m_IgnoreValue = ignoreValue; + m_Level = depth; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +G4bool PS_Silicon_Images::ProcessHits(G4Step* aStep, G4TouchableHistory*){ + // contain Energy Time, DetNbr, PixelFront and PixelBack + t_Energy = aStep->GetTotalEnergyDeposit(); + t_Time = aStep->GetPreStepPoint()->GetGlobalTime(); + + t_DetectorNbr = aStep->GetPreStepPoint()->GetTouchableHandle()->GetCopyNumber(m_Level); + t_Position = aStep->GetPreStepPoint()->GetPosition(); + + // Interaction coordinates (used to fill the InteractionCoordinates branch) + t_X = t_Position.x(); + t_Y = t_Position.y(); + t_Z = t_Position.z(); + t_Theta = t_Position.theta(); + t_Phi = t_Position.phi(); + + t_Position = aStep->GetPreStepPoint()->GetTouchableHandle()->GetHistory()->GetTopTransform().TransformPoint(t_Position); + + t_PixelFront = m_ImageFront->GetPixelAtCoordinate(t_Position.x(),t_Position.y()); + t_PixelBack = m_ImageBack->GetPixelAtCoordinate(t_Position.x(),t_Position.y()); + + unsigned int front = (m_ImageFront->GetPixelAtCoordinate(t_Position.x(),t_Position.y()))&0xff; + unsigned int back = (m_ImageBack->GetPixelAtCoordinate(t_Position.x(),t_Position.y()))&0xff; + + + // If front and back are in inactive part of the wafer, + // nothing is added to the map + if(t_PixelFront == m_IgnoreValue && t_PixelBack == m_IgnoreValue) + return FALSE; + + t_Index = aStep->GetTrack()->GetTrackID() + t_DetectorNbr * 1e3 ; + // Check if the particle has interact before, if yes, add up the energies. + map<unsigned int, double>::iterator it; + it= m_Energy.find(t_Index); + if(it!=m_Energy.end()){ + double dummy = it->second; + t_Energy+=dummy; + } + + m_Energy[t_Index] = t_Energy; + m_Time[t_Index] = t_Time; + m_DetectorNbr[t_Index] = t_DetectorNbr; + m_PixelFront[t_Index] = t_PixelFront; + m_PixelBack[t_Index] = t_PixelBack; + m_X[t_Index] = t_X; + m_Y[t_Index] = t_Y; + m_Z[t_Index] = t_Z; + m_Theta[t_Index] = t_Theta; + m_Phi[t_Index] = t_Phi; + + + return TRUE; +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void PS_Silicon_Images::Initialize(G4HCofThisEvent* HCE){ +} +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void PS_Silicon_Images::EndOfEvent(G4HCofThisEvent*){ +} + +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void PS_Silicon_Images::clear(){ + m_Energy.clear(); + m_Time.clear(); + m_DetectorNbr.clear(); + m_PixelFront.clear(); + m_PixelBack.clear(); + m_X.clear(); + m_Y.clear(); + m_Z.clear(); + m_Theta.clear(); + m_Phi.clear(); +} +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +vector<unsigned int> PS_Silicon_Images::GetIndexes(){ + vector<unsigned int > indexes; + map<unsigned int , double>::iterator it; + for(it=m_Energy.begin(); it!=m_Energy.end();it++) + indexes.push_back(it->first); + + return indexes; +} +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +unsigned int PS_Silicon_Images::GetPixelFront(unsigned int index){ + return m_PixelFront[index]; +} +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +unsigned int PS_Silicon_Images::GetPixelBack(unsigned int index){ + return m_PixelBack[index]; +} +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void PS_Silicon_Images::GetARGBFront(unsigned int index,unsigned int& a,unsigned int& r,unsigned int& g,unsigned int& b){ + unsigned int Info =m_PixelFront[index]; + a = (Info>>24)&0xff; + r = (Info>>16)&0xff; + g = (Info>>8)&0xff; + b = (Info>>0)&0xff; +} +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +void PS_Silicon_Images::GetARGBBack(unsigned int index,unsigned int& a,unsigned int& r,unsigned int& g,unsigned int& b){ + unsigned int Info =m_PixelBack[index]; + + a = (Info>>24)&0xff; + r = (Info>>16)&0xff; + g = (Info>>8)&0xff; + b = (Info>>0)&0xff; +} +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +double PS_Silicon_Images::GetEnergy(unsigned int index){ + return m_Energy[index]; +} +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +double PS_Silicon_Images::GetTime(unsigned int index){ + return m_Time[index]; +} +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +unsigned int PS_Silicon_Images::GetDetectorNbr(unsigned int index){ + return m_DetectorNbr[index]; +} +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +double PS_Silicon_Images::GetX(unsigned int index){ + return m_X[index]; +} +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +double PS_Silicon_Images::GetY(unsigned int index){ + return m_Y[index]; +} +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +double PS_Silicon_Images::GetZ(unsigned int index){ + return m_Z[index]; +} +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +double PS_Silicon_Images::GetTheta(unsigned int index){ + return m_Theta[index]; +} +//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... +double PS_Silicon_Images::GetPhi(unsigned int index){ + return m_Phi[index]; +} //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... PS_Silicon_Rectangle::PS_Silicon_Rectangle(G4String name,G4int Level, G4double StripPlaneLength, G4double StripPlaneWidth, G4int NumberOfStripLength,G4int NumberOfStripWidth,G4int depth,G4String axis) :G4VPrimitiveScorer(name, depth),HCID(-1){ @@ -192,7 +344,7 @@ G4bool PS_Silicon_Annular::ProcessHits(G4Step* aStep, G4TouchableHistory*){ phi+=2*M_PI; m_StripSectorNumber = (int) ((phi - m_PhiStart) / m_StripPitchSector ) + 1 ; m_StripQuadrantNumber = (int) ((phi - m_PhiStart) /m_StripPitchQuadrant) + 1 ; - + //Rare case where particle is close to edge of silicon plan if (m_StripRingNumber > m_NumberOfStripRing) m_StripRingNumber = m_NumberOfStripRing; if (m_StripSectorNumber > m_NumberOfStripSector) m_StripSectorNumber = m_NumberOfStripSector; diff --git a/NPSimulation/Scorers/SiliconScorers.hh b/NPSimulation/Scorers/SiliconScorers.hh index 01b4fbffc..ccbc133f0 100644 --- a/NPSimulation/Scorers/SiliconScorers.hh +++ b/NPSimulation/Scorers/SiliconScorers.hh @@ -26,13 +26,87 @@ *****************************************************************************/ #include "G4VPrimitiveScorer.hh" #include "NPSHitsMap.hh" - +#include "NPImage.h" #include <map> using namespace std; using namespace CLHEP; namespace SILICONSCORERS { -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + class PS_Silicon_Images : public G4VPrimitiveScorer{ + + public: // with description + PS_Silicon_Images(G4String name, string imageFront,string imageBack,double scalingFront, double scalingBack, double centerOffsetX,double centerOffsetY,unsigned int ignoreValue, G4int depth=0); + ~PS_Silicon_Images(){}; + + protected: // with description + G4bool ProcessHits(G4Step*, G4TouchableHistory*); + + public: + void Initialize(G4HCofThisEvent*); + void EndOfEvent(G4HCofThisEvent*); + void clear(); + void DrawAll(){}; + void PrintAll(){}; + + private: // Geometry of the detector + NPL::Image* m_ImageFront; + NPL::Image* m_ImageBack; + double m_ScalingFront; + double m_ScalingBack; + double m_CenterOffsetX; + double m_CenterOffsetY; + unsigned int m_IgnoreValue; + + // Level at which to find the copy number linked to the detector number + G4int m_Level; + + private: // inherited from G4VPrimitiveScorer + G4int HCID; + map<unsigned int,double> m_Energy; + map<unsigned int,double> m_Time; + map<unsigned int,unsigned int> m_DetectorNbr; + map<unsigned int,unsigned int> m_PixelFront; + map<unsigned int,unsigned int> m_PixelBack; + map<unsigned int,double> m_X; + map<unsigned int,double> m_Y; + map<unsigned int,double> m_Z; + map<unsigned int,double> m_Theta; + map<unsigned int,double> m_Phi; + + private: // Needed for intermediate calculation (avoid multiple instantiation in Processing Hit) + G4ThreeVector t_Position; + unsigned int t_Index; + double t_Energy; + double t_Time; + unsigned int t_DetectorNbr; + unsigned int t_PixelFront; + unsigned int t_PixelBack; + double t_X; + double t_Y; + double t_Z; + double t_Theta; + double t_Phi; + + public: // information accessor + vector<unsigned int> GetIndexes(); + unsigned int GetPixelFront(unsigned int index); + unsigned int GetPixelBack(unsigned int index); + void GetARGBFront(unsigned int index,unsigned int& a,unsigned int& r,unsigned int& g,unsigned int& b); + void GetARGBBack(unsigned int index,unsigned int& a,unsigned int& r,unsigned int& g,unsigned int& b); + + double GetEnergy(unsigned int index); + double GetTime(unsigned int index); + unsigned int GetDetectorNbr(unsigned int index); + double GetX(unsigned int index); + double GetY(unsigned int index); + double GetZ(unsigned int index); + double GetTheta(unsigned int index); + double GetPhi(unsigned int index); + + }; + + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... struct RectangularOutput { G4double totalEnergy; @@ -48,46 +122,46 @@ namespace SILICONSCORERS { }; class PS_Silicon_Rectangle : public G4VPrimitiveScorer{ - - public: // with description - PS_Silicon_Rectangle(G4String name, G4int Level, G4double StripPlaneLength, G4double StripPlaneWidth, G4int NumberOfStripLength,G4int NumberOfStripWidth,G4int depth=0,G4String axis="xy"); - ~PS_Silicon_Rectangle(); - - protected: // with description - G4bool ProcessHits(G4Step*, G4TouchableHistory*); - - public: - void Initialize(G4HCofThisEvent*); - void EndOfEvent(G4HCofThisEvent*); - void clear(); - void DrawAll(); - void PrintAll(); - - private: // Geometry of the detector - G4double m_StripPlaneLength; - G4double m_StripPlaneWidth; - G4int m_NumberOfStripLength; - G4int m_NumberOfStripWidth; - G4double m_StripPitchLength; - G4double m_StripPitchWidth; - G4String m_Axis; - // Level at which to find the copy number linked to the detector number - G4int m_Level; - - private: // inherited from G4VPrimitiveScorer - G4int HCID; - NPS::HitsMap<G4double*>* EvtMap; - - private: // Needed for intermediate calculation (avoid multiple instantiation in Processing Hit) - G4ThreeVector m_Position ; - G4int m_DetectorNumber ; - G4int m_StripLengthNumber ; - G4int m_StripWidthNumber ; - G4int m_Index ; - + + public: // with description + PS_Silicon_Rectangle(G4String name, G4int Level, G4double StripPlaneLength, G4double StripPlaneWidth, G4int NumberOfStripLength,G4int NumberOfStripWidth,G4int depth=0,G4String axis="xy"); + ~PS_Silicon_Rectangle(); + + protected: // with description + G4bool ProcessHits(G4Step*, G4TouchableHistory*); + + public: + void Initialize(G4HCofThisEvent*); + void EndOfEvent(G4HCofThisEvent*); + void clear(); + void DrawAll(); + void PrintAll(); + + private: // Geometry of the detector + G4double m_StripPlaneLength; + G4double m_StripPlaneWidth; + G4int m_NumberOfStripLength; + G4int m_NumberOfStripWidth; + G4double m_StripPitchLength; + G4double m_StripPitchWidth; + G4String m_Axis; + // Level at which to find the copy number linked to the detector number + G4int m_Level; + + private: // inherited from G4VPrimitiveScorer + G4int HCID; + NPS::HitsMap<G4double*>* EvtMap; + + private: // Needed for intermediate calculation (avoid multiple instantiation in Processing Hit) + G4ThreeVector m_Position ; + G4int m_DetectorNumber ; + G4int m_StripLengthNumber ; + G4int m_StripWidthNumber ; + G4int m_Index ; + }; - -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... struct AnnularOutput { G4double totalEnergy; @@ -104,51 +178,51 @@ namespace SILICONSCORERS { }; class PS_Silicon_Annular : public G4VPrimitiveScorer{ - - public: // with description - PS_Silicon_Annular(G4String name,G4int Level, G4double StripPlaneInnerRadius, G4double StripPlaneOuterRadius, G4double PhiStart,G4double PhiStop, G4int NumberOfStripRing,G4int NumberOfStripSector=1, G4int NumberOfQuadrant=1,G4int depth=0); - ~PS_Silicon_Annular(); - - protected: // with description - G4bool ProcessHits(G4Step*, G4TouchableHistory*); - - public: - void Initialize(G4HCofThisEvent*); - void EndOfEvent(G4HCofThisEvent*); - void clear(); - void DrawAll(); - void PrintAll(); - - private: // Geometry of the detector - G4double m_StripPlaneInnerRadius; - G4double m_StripPlaneOuterRadius; - G4double m_PhiStart; - G4double m_PhiStop; - G4int m_NumberOfStripRing; - G4int m_NumberOfStripSector; - G4int m_NumberOfStripQuadrant; - G4double m_StripPitchRing; - G4double m_StripPitchSector; - G4double m_StripPitchQuadrant; - G4String m_Axis; - // Level at which to find the copy number linked to the detector number - G4int m_Level; - - private: // inherited from G4VPrimitiveScorer - G4int HCID; - NPS::HitsMap<G4double*>* EvtMap; - - private: // Needed for intermediate calculation (avoid multiple instantiation in Processing Hit) - G4ThreeVector m_Position ; - G4ThreeVector m_uz ; - G4int m_DetectorNumber ; - G4int m_StripRingNumber ; - G4int m_StripSectorNumber ; - G4int m_StripQuadrantNumber ; - G4int m_Index ; - + + public: // with description + PS_Silicon_Annular(G4String name,G4int Level, G4double StripPlaneInnerRadius, G4double StripPlaneOuterRadius, G4double PhiStart,G4double PhiStop, G4int NumberOfStripRing,G4int NumberOfStripSector=1, G4int NumberOfQuadrant=1,G4int depth=0); + ~PS_Silicon_Annular(); + + protected: // with description + G4bool ProcessHits(G4Step*, G4TouchableHistory*); + + public: + void Initialize(G4HCofThisEvent*); + void EndOfEvent(G4HCofThisEvent*); + void clear(); + void DrawAll(); + void PrintAll(); + + private: // Geometry of the detector + G4double m_StripPlaneInnerRadius; + G4double m_StripPlaneOuterRadius; + G4double m_PhiStart; + G4double m_PhiStop; + G4int m_NumberOfStripRing; + G4int m_NumberOfStripSector; + G4int m_NumberOfStripQuadrant; + G4double m_StripPitchRing; + G4double m_StripPitchSector; + G4double m_StripPitchQuadrant; + G4String m_Axis; + // Level at which to find the copy number linked to the detector number + G4int m_Level; + + private: // inherited from G4VPrimitiveScorer + G4int HCID; + NPS::HitsMap<G4double*>* EvtMap; + + private: // Needed for intermediate calculation (avoid multiple instantiation in Processing Hit) + G4ThreeVector m_Position ; + G4ThreeVector m_uz ; + G4int m_DetectorNumber ; + G4int m_StripRingNumber ; + G4int m_StripSectorNumber ; + G4int m_StripQuadrantNumber ; + G4int m_Index ; + }; -//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... + //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... struct ResistiveOutput { G4double upstreamEnergy; G4double downstreamEnergy; @@ -163,42 +237,42 @@ namespace SILICONSCORERS { }; class PS_Silicon_Resistive : public G4VPrimitiveScorer{ - - public: // with description - PS_Silicon_Resistive(G4String name, G4int Level, - G4double StripPlaneLength, G4double StripPlaneWidth, - G4int NumberOfStripWidth,G4int depth=0); - - ~PS_Silicon_Resistive(); - - protected: // with description - G4bool ProcessHits(G4Step*, G4TouchableHistory*); - - public: - void Initialize(G4HCofThisEvent*); - void EndOfEvent(G4HCofThisEvent*); - void clear(); - void DrawAll(); - void PrintAll(); - - private: // Geometry of the detector - G4double m_StripPlaneLength; - G4double m_StripPlaneWidth; - G4int m_NumberOfStripWidth; - G4double m_StripPitchWidth; - // Level at which to find the copy number linked to the detector number - G4int m_Level; - - private: // inherited from G4VPrimitiveScorer - G4int HCID; - NPS::HitsMap<G4double*>* EvtMap; - - private: // Needed for intermediate calculation (avoid multiple instantiation in Processing Hit) - G4ThreeVector m_Position ; - G4int m_DetectorNumber ; - G4int m_StripWidthNumber ; - G4int m_Index ; - + + public: // with description + PS_Silicon_Resistive(G4String name, G4int Level, + G4double StripPlaneLength, G4double StripPlaneWidth, + G4int NumberOfStripWidth,G4int depth=0); + + ~PS_Silicon_Resistive(); + + protected: // with description + G4bool ProcessHits(G4Step*, G4TouchableHistory*); + + public: + void Initialize(G4HCofThisEvent*); + void EndOfEvent(G4HCofThisEvent*); + void clear(); + void DrawAll(); + void PrintAll(); + + private: // Geometry of the detector + G4double m_StripPlaneLength; + G4double m_StripPlaneWidth; + G4int m_NumberOfStripWidth; + G4double m_StripPitchWidth; + // Level at which to find the copy number linked to the detector number + G4int m_Level; + + private: // inherited from G4VPrimitiveScorer + G4int HCID; + NPS::HitsMap<G4double*>* EvtMap; + + private: // Needed for intermediate calculation (avoid multiple instantiation in Processing Hit) + G4ThreeVector m_Position ; + G4int m_DetectorNumber ; + G4int m_StripWidthNumber ; + G4int m_Index ; + }; } -- GitLab