13#include "ReadBoostRoot.hh"
14#include "G4HCofThisEvent.hh"
16#include "G4ThreeVector.hh"
17#include "G4SDManager.hh"
19#include "G4UnitsTable.hh"
21#include "GaudiKernel/ISvcLocator.h"
22#include "GaudiKernel/Bootstrap.h"
23#include "GaudiKernel/MsgStream.h"
24#include "G4LossTableManager.hh"
25#include "G4ElectronIonPair.hh"
30 collectionName.insert(
"BesTofHitsCollection");
31 collectionName.insert(
"BesTofHitsList");
32 elIonPair =
new G4ElectronIonPair();
49 m_event = evt->GetEventID();
51 m_trackIndexes.clear();
58 HLID = G4SDManager::GetSDMpointer()->GetCollectionID( collectionName[1] );
60 G4HCofThisEvent* HCE = evt->GetHCofThisEvent();
61 HCE->AddHitsCollection( HLID, m_besTofList );
68 G4double chg=aStep->GetTrack()->GetDefinition()->GetPDGCharge();
69 G4double edep = aStep->GetTotalEnergyDeposit();
70 G4double stepL=aStep->GetStepLength();
71 G4double deltaT=aStep->GetDeltaTime();
72 G4StepPoint* preStep = aStep->GetPreStepPoint();
73 G4ThreeVector pDirection=preStep->GetMomentumDirection();
74 G4String particleName = aStep->GetTrack()->GetDefinition()->GetParticleName();
75 G4Material* scinMaterial = aStep->GetTrack()->GetMaterial();
76 G4double charge = aStep->GetTrack()->GetDefinition()->GetPDGCharge();
77 G4int pdgcode = aStep->GetTrack()->GetDefinition()->GetPDGEncoding();
79 if( chg==0 && edep==0 && stepL==0 ) {
return false; }
82 G4int trackId = aStep->GetTrack()->GetTrackID();
86 newHit->
SetG4Index(aStep->GetTrack()->GetTrackID());
90 newHit->
SetTrackL(aStep->GetTrack()->GetTrackLength());
91 G4ThreeVector pos=preStep->GetPosition();
93 G4double globalTime=preStep->GetGlobalTime();
103 G4ThreeVector locPos(0,0,0);
104 G4TouchableHistory* theTouchable = (G4TouchableHistory*)( preStep->GetTouchable() );
115 name = theTouchable->GetVolume(0)->GetName();
117 G4int partId=-1, scinNb=-1, gapNb=-1, number=-1;
119 gapNb = theTouchable->GetReplicaNumber(0);
120 number = theTouchable->GetReplicaNumber(2);
123 if(name.contains(
"physical_gasLayer"))
125 locPos = theTouchable->GetHistory()->GetTopTransform().TransformPoint(pos);
126 number = theTouchable->GetReplicaNumber(3);
129 G4String name1 = theTouchable->GetVolume(4)->GetName();
130 if(name1 ==
"physicalEcTofEast") partId=3;
131 else if(name1 ==
"physicalEcTofWest") partId=4;
135 else if(name==
"logical_gasLayer")
137 locPos = theTouchable->GetHistory()->GetTopTransform().TransformPoint(pos);
138 number = theTouchable->GetReplicaNumber(3);
141 G4String name1 = theTouchable->GetVolume(4)->GetName();
142 if(name1 ==
"logicalEcTofEast") partId=3;
143 else if(name1 ==
"logicalEcTofWest") partId=4;
149 else if( name==
"physicalScinBr1" ) {
154 else if( name==
"physicalScinBr2" ) {
159 else if( name==
"physicalScinEcWest" ) {
164 else if( name==
"physicalScinEcEast" ) {
172 else if( name==
"logicalScinBr1" || name==
"logicalScinBr2" ) {
174 scinNb = (527-number)/3;
177 else if( name==
"logicalScinEcEast" ) {
179 scinNb = (95-number)/2;
181 else if( name==
"logicalScinEcWest" ) {
183 scinNb = (95-number)/2;
185 else {
return false; }
188 if(name.contains(
"physical_gasLayer") || name.contains(
"logical_gasLayer"))
190 G4double zz = locPos.z()-0.5*mm+(24+3)*mm*6;
195 else if(zz>0 && zz<12*27*mm)
197 for(G4int i=0; i<12; i++)
199 if(zz>i*27*mm && zz<=(i+1)*27*mm)
212 if(strip>11) strip=11;
226 G4int trackIndex, g4TrackId;
231 m_besTofCollection->insert( newHit );
236 G4int trackIndex, g4TrackId;
239 if( m_trackIndex != trackIndex ) {
240 m_trackIndex = trackIndex;
251 G4int pdg =
abs(aStep->GetTrack()->GetDefinition()->GetPDGEncoding());
252 if( pdg==12 || pdg==14 || pdg==16 ) {
flag=0; }
253 if(
flag && aStep->GetTrack()->GetTrackID()==g4TrackId ) {
254 m_trackIndexes.push_back(trackIndex);
257 m_besTofList->insert(truHit);
261 if( edep<=0 ) {
delete newHit; }
270 static G4int HCID=-1;
272 HCID = G4SDManager::GetSDMpointer()->GetCollectionID(collectionName[0]);
274 HCE->AddHitsCollection(HCID,m_besTofCollection);
280 G4double FanoFactor = 0.2;
281 G4double meanion = eipair->MeanNumberOfIonsAlongStep(step);
282 G4double sig = std::sqrt(FanoFactor*meanion);
283 G4int nion = G4int(G4RandGauss::shoot(meanion,sig) + 0.5);
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 *)