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"
21#include "G4HCofThisEvent.hh"
23#include "G4ThreeVector.hh"
24#include "G4SDManager.hh"
26#include "G4UnitsTable.hh"
28#include "GaudiKernel/ISvcLocator.h"
29#include "GaudiKernel/Bootstrap.h"
30#include "GaudiKernel/MsgStream.h"
31#include "G4LossTableManager.hh"
32#include "G4ElectronIonPair.hh"
37 collectionName.insert(
"BesTofHitsCollection");
38 collectionName.insert(
"BesTofHitsList");
39 elIonPair =
new G4ElectronIonPair();
41 PropertyMgr m_propMgr;
42 m_propMgr.declareProperty(
"FanoFactor", m_fanoFactor = 0.2);
43 m_propMgr.declareProperty(
"nionOff", m_nionOff = 0.5);
45 IJobOptionsSvc* jobSvc;
46 Gaudi::svcLocator()->service(
"JobOptionsSvc", jobSvc);
47 jobSvc->setMyProperties(
"BesTofSD", &m_propMgr);
49 cout<<
"BesTofSD Property:"<<endl
50 <<
" FanoFactor= "<<m_fanoFactor
51 <<
" nionOff= "<<m_nionOff
69 m_event = evt->GetEventID();
71 m_trackIndexes.clear();
78 HLID = G4SDManager::GetSDMpointer()->GetCollectionID( collectionName[1] );
80 G4HCofThisEvent* HCE = evt->GetHCofThisEvent();
81 HCE->AddHitsCollection( HLID, m_besTofList );
88 G4double chg=aStep->GetTrack()->GetDefinition()->GetPDGCharge();
89 G4double edep = aStep->GetTotalEnergyDeposit();
90 G4double stepL=aStep->GetStepLength();
91 G4double deltaT=aStep->GetDeltaTime();
92 G4StepPoint* preStep = aStep->GetPreStepPoint();
93 G4ThreeVector pDirection=preStep->GetMomentumDirection();
94 G4String particleName = aStep->GetTrack()->GetDefinition()->GetParticleName();
95 G4Material* scinMaterial = aStep->GetTrack()->GetMaterial();
96 G4double
charge = aStep->GetTrack()->GetDefinition()->GetPDGCharge();
97 G4int pdgcode = aStep->GetTrack()->GetDefinition()->GetPDGEncoding();
99 if( chg==0 && edep==0 && stepL==0 ) {
return false; }
102 G4int trackId = aStep->GetTrack()->GetTrackID();
106 newHit->
SetG4Index(aStep->GetTrack()->GetTrackID());
110 newHit->
SetTrackL(aStep->GetTrack()->GetTrackLength());
111 G4ThreeVector pos=preStep->GetPosition();
113 G4double globalTime=preStep->GetGlobalTime();
123 G4ThreeVector locPos(0,0,0);
124 G4TouchableHistory* theTouchable = (G4TouchableHistory*)( preStep->GetTouchable() );
135 name = theTouchable->GetVolume(0)->GetName();
137 G4int partId=-1, scinNb=-1, gapNb=-1, number=-1;
139 gapNb = theTouchable->GetReplicaNumber(0);
140 number = theTouchable->GetReplicaNumber(2);
143 if(name.contains(
"physical_gasLayer"))
145 locPos = theTouchable->GetHistory()->GetTopTransform().TransformPoint(pos);
146 number = theTouchable->GetReplicaNumber(3);
149 G4String name1 = theTouchable->GetVolume(4)->GetName();
150 if(name1 ==
"physicalEcTofEast") partId=3;
151 else if(name1 ==
"physicalEcTofWest") partId=4;
155 else if(name==
"logical_gasLayer")
157 locPos = theTouchable->GetHistory()->GetTopTransform().TransformPoint(pos);
158 number = theTouchable->GetReplicaNumber(3);
161 G4String name1 = theTouchable->GetVolume(4)->GetName();
162 if(name1 ==
"logicalEcTofEast") partId=3;
163 else if(name1 ==
"logicalEcTofWest") partId=4;
169 else if( name==
"physicalScinBr1" ) {
174 else if( name==
"physicalScinBr2" ) {
179 else if( name==
"physicalScinEcWest" ) {
184 else if( name==
"physicalScinEcEast" ) {
192 else if( name==
"logicalScinBr1" || name==
"logicalScinBr2" ) {
194 scinNb = (527-number)/3;
197 else if( name==
"logicalScinEcEast" ) {
199 scinNb = (95-number)/2;
201 else if( name==
"logicalScinEcWest" ) {
203 scinNb = (95-number)/2;
205 else {
return false; }
208 if(name.contains(
"physical_gasLayer") || name.contains(
"logical_gasLayer"))
210 G4double zz = locPos.z()-0.5*mm+(24+3)*mm*6;
215 else if(zz>0 && zz<12*27*mm)
217 for(G4int i=0; i<12; i++)
219 if(zz>i*27*mm && zz<=(i+1)*27*mm)
232 if(strip>11) strip=11;
246 G4int trackIndex, g4TrackId;
251 m_besTofCollection->insert( newHit );
256 G4int trackIndex, g4TrackId;
259 if( m_trackIndex != trackIndex ) {
260 m_trackIndex = trackIndex;
271 G4int pdg =
abs(aStep->GetTrack()->GetDefinition()->GetPDGEncoding());
272 if( pdg==12 || pdg==14 || pdg==16 ) {
flag=0; }
273 if(
flag && aStep->GetTrack()->GetTrackID()==g4TrackId ) {
274 m_trackIndexes.push_back(trackIndex);
277 m_besTofList->insert(truHit);
281 if( edep<=0 ) {
delete newHit; }
290 static G4int HCID=-1;
292 HCID = G4SDManager::GetSDMpointer()->GetCollectionID(collectionName[0]);
294 HCE->AddHitsCollection(HCID,m_besTofCollection);
300 G4double FanoFactor = m_fanoFactor;
301 G4double meanion = eipair->MeanNumberOfIonsAlongStep(step);
302 G4double sig = std::sqrt(FanoFactor*meanion);
303 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 *)