12#include "GaudiKernel/MsgStream.h"
13#include "GaudiKernel/Bootstrap.h"
14#include "GaudiKernel/PropertyMgr.h"
15#include "GaudiKernel/IJobOptionsSvc.h"
16#include "GaudiKernel/ISvcLocator.h"
17#include "GaudiKernel/IDataProviderSvc.h"
18#include "G4SystemOfUnits.hh"
19#include "G4PhysicalConstants.hh"
22#include "G4HCofThisEvent.hh"
24#include "G4ThreeVector.hh"
25#include "G4SDManager.hh"
27#include "G4UnitsTable.hh"
29#include "GaudiKernel/ISvcLocator.h"
30#include "GaudiKernel/Bootstrap.h"
31#include "GaudiKernel/MsgStream.h"
32#include "G4LossTableManager.hh"
33#include "G4ElectronIonPair.hh"
38 collectionName.insert(
"BesTofHitsCollection");
39 collectionName.insert(
"BesTofHitsList");
40 elIonPair =
new G4ElectronIonPair(1);
42 PropertyMgr m_propMgr;
43 m_propMgr.declareProperty(
"FanoFactor", m_fanoFactor = 0.2);
44 m_propMgr.declareProperty(
"nionOff", m_nionOff = 0.5);
46 IJobOptionsSvc* jobSvc;
47 Gaudi::svcLocator()->service(
"JobOptionsSvc", jobSvc);
48 jobSvc->setMyProperties(
"BesTofSD", &m_propMgr);
50 cout<<
"BesTofSD Property:"<<endl
51 <<
" FanoFactor= "<<m_fanoFactor
52 <<
" nionOff= "<<m_nionOff
70 m_event = evt->GetEventID();
72 m_trackIndexes.clear();
79 HLID = G4SDManager::GetSDMpointer()->GetCollectionID( collectionName[1] );
81 G4HCofThisEvent* HCE = evt->GetHCofThisEvent();
82 HCE->AddHitsCollection( HLID, m_besTofList );
89 G4double chg=aStep->GetTrack()->GetDefinition()->GetPDGCharge();
90 G4double edep = aStep->GetTotalEnergyDeposit();
91 G4double stepL=aStep->GetStepLength();
92 G4double deltaT=aStep->GetDeltaTime();
93 G4StepPoint* preStep = aStep->GetPreStepPoint();
94 G4ThreeVector pDirection=preStep->GetMomentumDirection();
95 G4String particleName = aStep->GetTrack()->GetDefinition()->GetParticleName();
96 G4Material* scinMaterial = aStep->GetTrack()->GetMaterial();
97 G4double
charge = aStep->GetTrack()->GetDefinition()->GetPDGCharge();
98 G4int pdgcode = aStep->GetTrack()->GetDefinition()->GetPDGEncoding();
100 if( chg==0 && edep==0 && stepL==0 ) {
return false; }
103 G4int trackId = aStep->GetTrack()->GetTrackID();
107 newHit->
SetG4Index(aStep->GetTrack()->GetTrackID());
111 newHit->
SetTrackL(aStep->GetTrack()->GetTrackLength());
112 G4ThreeVector pos=preStep->GetPosition();
114 G4double globalTime=preStep->GetGlobalTime();
124 G4ThreeVector locPos(0,0,0);
125 G4TouchableHistory* theTouchable = (G4TouchableHistory*)( preStep->GetTouchable() );
136 name = theTouchable->GetVolume(0)->GetName();
138 G4int partId=-1, scinNb=-1, gapNb=-1, number=-1;
140 gapNb = theTouchable->GetReplicaNumber(0);
141 number = theTouchable->GetReplicaNumber(2);
144 if(name.contains(
"physical_gasLayer"))
146 locPos = theTouchable->GetHistory()->GetTopTransform().TransformPoint(pos);
147 number = theTouchable->GetReplicaNumber(3);
150 G4String name1 = theTouchable->GetVolume(4)->GetName();
151 if(name1 ==
"physicalEcTofEast") partId=3;
152 else if(name1 ==
"physicalEcTofWest") partId=4;
156 else if(name==
"logical_gasLayer")
158 locPos = theTouchable->GetHistory()->GetTopTransform().TransformPoint(pos);
159 number = theTouchable->GetReplicaNumber(3);
162 G4String name1 = theTouchable->GetVolume(4)->GetName();
163 if(name1 ==
"logicalEcTofEast") partId=3;
164 else if(name1 ==
"logicalEcTofWest") partId=4;
170 else if( name==
"physicalScinBr1" ) {
175 else if( name==
"physicalScinBr2" ) {
180 else if( name==
"physicalScinEcWest" ) {
185 else if( name==
"physicalScinEcEast" ) {
193 else if( name==
"logicalScinBr1" || name==
"logicalScinBr2" ) {
195 scinNb = (527-number)/3;
198 else if( name==
"logicalScinEcEast" ) {
200 scinNb = (95-number)/2;
202 else if( name==
"logicalScinEcWest" ) {
204 scinNb = (95-number)/2;
206 else {
return false; }
209 if(name.contains(
"physical_gasLayer") || name.contains(
"logical_gasLayer"))
211 G4double zz = locPos.z()-0.5*mm+(24+3)*mm*6;
216 else if(zz>0 && zz<12*27*mm)
218 for(G4int i=0; i<12; i++)
220 if(zz>i*27*mm && zz<=(i+1)*27*mm)
233 if(strip>11) strip=11;
247 G4int trackIndex, g4TrackId;
252 m_besTofCollection->insert( newHit );
257 G4int trackIndex, g4TrackId;
260 if( m_trackIndex != trackIndex ) {
261 m_trackIndex = trackIndex;
272 G4int pdg =
abs(aStep->GetTrack()->GetDefinition()->GetPDGEncoding());
273 if( pdg==12 || pdg==14 || pdg==16 ) {
flag=0; }
274 if(
flag && aStep->GetTrack()->GetTrackID()==g4TrackId ) {
275 m_trackIndexes.push_back(trackIndex);
278 m_besTofList->insert(truHit);
282 if( edep<=0 ) {
delete newHit; }
291 static G4int HCID=-1;
293 HCID = G4SDManager::GetSDMpointer()->GetCollectionID(collectionName[0]);
295 HCE->AddHitsCollection(HCID,m_besTofCollection);
301 G4double FanoFactor = m_fanoFactor;
302 G4double meanion = eipair->MeanNumberOfIonsAlongStep(step);
303 G4double sig = std::sqrt(FanoFactor*meanion);
304 G4int nion = G4int(G4RandGauss::shoot(meanion,sig) + m_nionOff);
G4THitsCollection< BesTofHit > BesTofHitsCollection
void GetCurrentTrackIndex(G4int &trackIndex, G4int &g4TrackId) const
void SetEvent(G4double event)
void SetModule(G4int module)
void SetPos(G4ThreeVector pos)
void SetDeltaT(G4double deltaT)
void SetCharge(G4double charge)
void SetPDGcode(G4int pdgcode)
void SetTrackIndex(G4int trackIndex)
void SetPDirection(G4ThreeVector pDirection)
void SetPartId(G4int partId)
void SetLocPos(G4ThreeVector locPos)
void SetScinNb(G4int scinNb)
void SetGapNb(G4int gapNb)
void SetStrip(G4int strip)
void SetStepL(G4double stepL)
void SetTrackL(G4double length)
void SetTime(G4double time)
void SetEdep(G4double edep)
void SetMomentum(G4ThreeVector momentum)
void SetG4Index(G4int index)
void BeginOfTruthEvent(const G4Event *)
virtual void Initialize(G4HCofThisEvent *HCE)
virtual void EndOfEvent(G4HCofThisEvent *HCE)
void EndOfTruthEvent(const G4Event *)
G4int SampleNumberOfIonsAlongStep(const G4Step *, G4ElectronIonPair *)
virtual G4bool ProcessHits(G4Step *aStep, G4TouchableHistory *)