Skip to content
Snippets Groups Projects
Commit 40a76fa5 authored by matta's avatar matta
Browse files

* Scorer working for Sharc DSSD

 - Basic Test indicate that the logic work well
 - Still requiered a real analysis to be all check
parent 39889cec
No related branches found
No related tags found
No related merge requests found
......@@ -24,7 +24,7 @@ TwoBodyReaction
Heavy= 25Na
ExcitationEnergyLight= 0.0
ExcitationEnergyHeavy= 2.2
CrossSectionPath= 11Li(d,3He)10He.txt CSR
CrossSectionPath= flat.txt CSR
ShootLight= 1
ShootHeavy= 1
......
......@@ -37,7 +37,7 @@
#include "VDetector.hh"
// NPLib
//#include "TSharcData.h"
#include "TSharcData.h"
using namespace std;
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
......@@ -45,8 +45,8 @@ namespace SHARC
{
// Energy and time Resolution
const G4double ResoTime = 0 ;
const G4double ResoEnergy = 0.035 ;// = zzkeV of Resolution // Unit is MeV/2.35
const G4double ResoEnergy = 0.035*MeV ;// = zzkeV of Resolution // Unit is MeV/2.35
const G4double EnergyThreshold = 0.4*MeV;
// Geometry
// BOX //
......@@ -67,8 +67,8 @@ namespace SHARC
const G4double BOX_Wafer_Length = 76.20*mm;
const G4double BOX_Wafer_DeadLayer_Thickness = 0.1*um;
const G4int BOX_Wafer_Front_NumberOfStrip = 16 ;
const G4int BOX_Wafer_Back_NumberOfStrip = 16 ;
const G4int BOX_Wafer_Front_NumberOfStrip = 48 ;
const G4int BOX_Wafer_Back_NumberOfStrip = 24 ;
// Compute
const G4double BOX_LeftOver1 = BOX_PCB_Length - BOX_PCB_Border_ShortSide - BOX_Wafer_Length - BOX_PCB_Slot_Border1 - BOX_PCB_Slot_Width1 ;
......@@ -141,7 +141,7 @@ class Sharc : public VDetector
////////////////////////////////////////////////////
public:
Sharc() ;
virtual ~Sharc() ;
~Sharc() ;
////////////////////////////////////////////////////
//////// Specific Function of this Class ///////////
......@@ -181,7 +181,7 @@ public:
///////////Event class to store Data////////////////
////////////////////////////////////////////////////
private:
//TSharcData* m_Event ;
TSharcData* m_Event ;
////////////////////////////////////////////////////
///////////////// Scorer Related ///////////////////
......@@ -192,7 +192,7 @@ private:
void InitializeScorers() ;
// Scorer Associate to the Silicon
G4MultiFunctionalDetector* m_StripScorer ;
G4MultiFunctionalDetector* m_DSSDScorer ;
private:
// Initialize material used in detector definition
......
......@@ -35,17 +35,17 @@ namespace SHARC {
public: // with description
PS_Silicon_Rectangle(G4String name, G4double StripPlaneLength, G4double StripPlaneWidth, G4int NumberOfStripLength,G4int NumberOfStripWidth,G4double TriggerThreshold,G4int depth=0);
virtual ~PS_Silicon_Rectangle();
~PS_Silicon_Rectangle();
protected: // with description
virtual G4bool ProcessHits(G4Step*, G4TouchableHistory*);
G4bool ProcessHits(G4Step*, G4TouchableHistory*);
public:
virtual void Initialize(G4HCofThisEvent*);
virtual void EndOfEvent(G4HCofThisEvent*);
virtual void clear();
virtual void DrawAll();
virtual void PrintAll();
void Initialize(G4HCofThisEvent*);
void EndOfEvent(G4HCofThisEvent*);
void clear();
void DrawAll();
void PrintAll();
private: // Threshold
G4double m_TriggerThreshold;
......
......@@ -43,7 +43,7 @@
// NPS
#include "Sharc.hh"
#include "GeneralScorers.hh"
#include "SharcScorers.hh"
// NPL
#include "NPOptionManager.h"
......@@ -62,7 +62,7 @@ using namespace CLHEP;
// Sharc Specific Method
Sharc::Sharc(){
InitializeMaterial();
// m_Event = new TSSSDData();
m_Event = new TSharcData();
// Dark Grey
SiliconVisAtt = new G4VisAttributes(G4Colour(0.3, 0.3, 0.3)) ;
// Green
......@@ -136,7 +136,7 @@ void Sharc::ReadConfiguration(string Path){
bool ReadingStatusBOX = false ;
bool ReadingStatus = false ;
while (!ConfigFile.eof()){
int VerboseLevel = NPOptionManager::getInstance()->GetVerboseLevel();
int VerboseLevel = NPOptionManager::getInstance()->GetVerboseLevel();
getline(ConfigFile, LineBuffer);
// cout << LineBuffer << endl;
......@@ -409,6 +409,9 @@ void Sharc::ConstructBOXDetector(G4LogicalVolume* world){
Box_Wafer_Offset+G4ThreeVector(0,0,0.5*BOX_PCB_Thickness-0.5*m_ThicknessBOX[i][j]),
logicWafer,"Box_Wafer",logicBoxDetector,false,i*4+j+1);
logicWafer->SetSensitiveDetector(m_DSSDScorer);
// create the PAD
// Make a single detector geometry
G4LogicalVolume* logicPADDetector;
......@@ -470,17 +473,17 @@ void Sharc::ConstructBOXDetector(G4LogicalVolume* world){
G4ThreeVector DetectorPosition;
if(m_ThicknessPAD[i][j]>0){ //PAD Case
DetectorPosition = G4ThreeVector(-BOX_CenterOffset2,-Box_Wafer_Offset.y(),0);
DetectorPosition = G4ThreeVector(-BOX_CenterOffset2,-Box_Wafer_Offset.y(),0);
}
else{ // No Pad Case
DetectorPosition = G4ThreeVector(-BOX_CenterOffset1,-Box_Wafer_Offset.y(),0);
}
// Distance of the PCB to the target
G4ThreeVector DetectorSpacing =
-G4ThreeVector(0, 0,BOX_DetectorSpacing);
-G4ThreeVector(0, 0,BOX_DetectorSpacing);
DetectorPosition+=DetectorSpacing;
......@@ -598,142 +601,72 @@ void Sharc::ConstructQQQDetector(G4LogicalVolume* world){
// Add Detector branch to the EventTree.
// Called After DetecorConstruction::AddDetector Method
void Sharc::InitializeRootOutput(){
/* RootOutput *pAnalysis = RootOutput::getInstance();
RootOutput *pAnalysis = RootOutput::getInstance();
TTree *pTree = pAnalysis->GetTree();
pTree->Branch("SSSD", "TSSSDData", &m_Event) ;*/
pTree->Branch("Sharc", "TSharcData", &m_Event) ;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
// Read sensitive part and fill the Root tree.
// Called at in the EventAction::EndOfEventAvtion
void Sharc::ReadSensitive(const G4Event* event){
/* m_Event->Clear();
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////// Used to Read Event Map of detector //////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
// Si
G4THitsMap<G4int>* DetNbrHitMap;
G4THitsMap<G4int>* StripNbrHitMap;
G4THitsMap<G4double>* EnergyHitMap;
G4THitsMap<G4double>* TimeHitMap;
std::map<G4int, G4int*>::iterator DetNbr_itr ;
std::map<G4int, G4int*>::iterator StripNbr_itr ;
std::map<G4int, G4double*>::iterator Energy_itr ;
std::map<G4int, G4double*>::iterator Time_itr ;
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
// Read the Scorer associate to the Silicon Strip
//DetectorNumber
G4int DetNbrCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("Sharc_StripScorer/DetectorNumber");
DetNbrHitMap = (G4THitsMap<G4int>*)(event->GetHCofThisEvent()->GetHC(DetNbrCollectionID));
DetNbr_itr = DetNbrHitMap->GetMap()->begin();
//StripNumber
G4int StripNbrCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("Sharc_StripScorer/StripNumber");
StripNbrHitMap = (G4THitsMap<G4int>*)(event->GetHCofThisEvent()->GetHC(StripNbrCollectionID));
//Energy
G4int StripEnergyCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("Sharc_StripScorer/StripEnergy");
EnergyHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(StripEnergyCollectionID));
//Time
G4int StripTimeCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("Sharc_StripScorer/StripTime");
TimeHitMap = (G4THitsMap<G4double>*)(event->GetHCofThisEvent()->GetHC(StripTimeCollectionID));
G4int sizeN = DetNbrHitMap ->entries();
G4int sizeS = StripNbrHitMap ->entries();
G4int sizeE = EnergyHitMap ->entries();
G4int sizeT = TimeHitMap ->entries();
// Loop on Det Number
for (G4int l = 0 ; l < sizeN ; l++)
{
G4int N = *(DetNbr_itr->second);
G4int NTrackID = DetNbr_itr->first - N;
if (N > 0)
{
m_Event->SetEnergyDetectorNbr(N);
m_Event->SetTimeDetectorNbr(N);
// Strip Number
StripNbr_itr = StripNbrHitMap->GetMap()->begin();
for (G4int h = 0 ; h < sizeS ; h++) {
G4int STrackID = StripNbr_itr->first - N ;
G4int S = *(StripNbr_itr->second);
if (STrackID == NTrackID) {
m_Event->SetEnergyStripNbr(S);
m_Event->SetTimeStripNbr(S);
}
StripNbr_itr++;
}
// 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->SetEnergy( RandGauss::shoot(E, ResoEnergy ) );
}
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->SetTime( RandGauss::shoot(T, ResoTime ) );
}
Time_itr++;
}
}
DetNbr_itr++;
}
// clear map for next event
DetNbrHitMap ->clear();
StripNbrHitMap ->clear();
EnergyHitMap ->clear();
TimeHitMap ->clear();*/
m_Event->Clear();
// DSSD
G4THitsMap<G4double*>* DSSDHitMap;
std::map<G4int, G4double**>::iterator DSSD_itr;
G4int DSSDCollectionID = G4SDManager::GetSDMpointer()->GetCollectionID("Sharc_DSSDScorer/SharcDSSD");
DSSDHitMap = (G4THitsMap<G4double*>*)(event->GetHCofThisEvent()->GetHC(DSSDCollectionID));
// Loop on the map
for (DSSD_itr = DSSDHitMap->GetMap()->begin() ; DSSD_itr != DSSDHitMap->GetMap()->end() ; DSSD_itr++){
G4double* Info = *(DSSD_itr->second);
double Energy = Info[0];
double Time = Info[1];
int DetNbr = (int) Info[2];
int StripFront = (int) Info[3];
int StripBack = (int) Info[4];
m_Event->SetFront_DetectorNbr(DetNbr);
m_Event->SetFront_StripNbr(StripFront);
m_Event->SetFront_Energy(RandGauss::shoot(Energy, ResoEnergy));
m_Event->SetFront_TimeCFD(RandGauss::shoot(Time, ResoTime));
m_Event->SetFront_TimeLED(RandGauss::shoot(Time, ResoTime));
m_Event->SetBack_DetectorNbr(DetNbr);
m_Event->SetBack_StripNbr(StripBack);
m_Event->SetBack_Energy(RandGauss::shoot(Energy, ResoEnergy));
m_Event->SetBack_TimeCFD(RandGauss::shoot(Time, ResoTime));
m_Event->SetBack_TimeLED(RandGauss::shoot(Time, ResoTime));
}
// clear map for next event
DSSDHitMap->clear();
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void Sharc::InitializeScorers(){
/*
// Silicon Associate Scorer
m_StripScorer = new G4MultiFunctionalDetector("Sharc_StripScorer");
G4VPrimitiveScorer* DetNbr = new GENERALSCORERS::PSDetectorNumber("DetectorNumber","Sharc_", 0);
G4VPrimitiveScorer* StripNbr = new PSStripNumber("StripNumber",0,SiliconSize, NumberOfStrip);
G4VPrimitiveScorer* Energy = new GENERALSCORERS::PSEnergy("StripEnergy","Sharc_", 0);
G4VPrimitiveScorer* TOF = new GENERALSCORERS::PSTOF("StripTime","Sharc_", 0);
//and register it to the multifunctionnal detector
m_StripScorer->RegisterPrimitive(DetNbr);
m_StripScorer->RegisterPrimitive(StripNbr);
m_StripScorer->RegisterPrimitive(Energy);
m_StripScorer->RegisterPrimitive(TOF);
// Add All Scorer to the Global Scorer Manager
G4SDManager::GetSDMpointer()->AddNewDetector(m_StripScorer) ;*/
// Silicon Associate Scorer
m_DSSDScorer = new G4MultiFunctionalDetector("Sharc_DSSDScorer");
G4VPrimitiveScorer* DSSDScorer =
new SHARC::PS_Silicon_Rectangle("SharcDSSD",
BOX_Wafer_Length,
BOX_Wafer_Width,
BOX_Wafer_Back_NumberOfStrip ,
BOX_Wafer_Front_NumberOfStrip,
EnergyThreshold);
//and register it to the multifunctionnal detector
m_DSSDScorer->RegisterPrimitive(DSSDScorer);
// Add All Scorer to the Global Scorer Manager
G4SDManager::GetSDMpointer()->AddNewDetector(m_DSSDScorer) ;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
......
......@@ -46,8 +46,7 @@ PS_Silicon_Rectangle::~PS_Silicon_Rectangle(){
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
G4bool PS_Silicon_Rectangle::ProcessHits(G4Step* aStep, G4TouchableHistory*){
G4double* EnergyAndTime = new G4double[2];
G4double* EnergyAndTime = new G4double[5];
EnergyAndTime[0] = aStep->GetTotalEnergyDeposit();
// If the energy deposit is below the threshold, the deposit is ignored
......@@ -62,9 +61,13 @@ G4bool PS_Silicon_Rectangle::ProcessHits(G4Step* aStep, G4TouchableHistory*){
m_Position = aStep->GetPreStepPoint()->GetPosition();
m_Position = aStep->GetPreStepPoint()->GetTouchableHandle()->GetHistory()->GetTopTransform().TransformPoint(m_Position);
m_StripLengthNumber = (int)((m_Position(1) + m_StripPlaneLength / 2.) / m_StripPitchLength ) + 1 ;
m_StripWidthNumber = (int)((m_Position(2) + m_StripPlaneWidth / 2.) / m_StripPitchWidth ) + 1 ;
m_StripLengthNumber = (int)((m_Position.x() + m_StripPlaneLength / 2.) / m_StripPitchLength ) + 1 ;
m_StripWidthNumber = (int)((m_Position.y() + m_StripPlaneWidth / 2.) / m_StripPitchWidth ) + 1 ;
EnergyAndTime[2] = m_DetectorNumber;
EnergyAndTime[3] = m_StripLengthNumber;
EnergyAndTime[4] = m_StripWidthNumber;
//Rare case where particle is close to edge of silicon plan
if (m_StripLengthNumber == m_NumberOfStripLength+1) m_StripLengthNumber = m_StripLengthNumber;
if (m_StripWidthNumber == m_NumberOfStripWidth+1) m_StripWidthNumber = m_StripWidthNumber;
......@@ -72,7 +75,6 @@ G4bool PS_Silicon_Rectangle::ProcessHits(G4Step* aStep, G4TouchableHistory*){
m_Index = aStep->GetTrack()->GetTrackID() + m_DetectorNumber * 1e3 + m_StripLengthNumber * 1e6 + m_StripWidthNumber * 1e9;
EvtMap->set(m_Index, EnergyAndTime);
return TRUE;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment