15 #include "G4FastSimulationManager.hh"
16 #include "G4TransportationManager.hh"
17 #include "G4TouchableHandle.hh"
18 #include "G4VSensitiveDetector.hh"
19 #include "G4VPhysicalVolume.hh"
21 #include "G4PionMinus.hh"
22 #include "G4PionPlus.hh"
23 #include "G4KaonMinus.hh"
24 #include "G4KaonPlus.hh"
25 #include "G4Proton.hh"
26 #include "G4AntiProton.hh"
27 #include "G4VProcess.hh"
32 : G4VFastSimulationModel(modelName, envelope), theParSet(parSet)
57 &particleType == G4PionMinus::PionMinusDefinition() ||
58 &particleType == G4PionPlus::PionPlusDefinition() ||
59 &particleType == G4KaonMinus::KaonMinusDefinition() ||
60 &particleType == G4KaonPlus::KaonPlusDefinition() ||
61 &particleType == G4AntiProton::AntiProtonDefinition() ||
62 &particleType == G4Proton::ProtonDefinition() ;
75 G4bool trigger =
false;
81 if(fastTrack.GetPrimaryTrack()->GetTrackStatus() == fPostponeToNextEvent ) {
99 fastStep.KillPrimaryTrack();
100 fastStep.ProposePrimaryTrackPathLength(0.0);
101 fastStep.ProposeTotalEnergyDeposited(fastTrack.GetPrimaryTrack()->GetKineticEnergy());
104 G4ParticleDefinition* particleType = fastTrack.GetPrimaryTrack()->GetDefinition();
113 G4double
energy = fastTrack.GetPrimaryTrack()->GetKineticEnergy()/GeV;
114 G4double globalTime = fastTrack.GetPrimaryTrack()->GetStep()->GetPostStepPoint()->GetGlobalTime();
115 G4double
charge = fastTrack.GetPrimaryTrack()->GetStep()->GetPreStepPoint()->GetCharge();
116 G4ThreeVector
position = fastTrack.GetPrimaryTrack()->GetPosition()/cm;
117 G4ThreeVector momentum = fastTrack.GetPrimaryTrack()->GetMomentum()/GeV;
133 theGflashStep->SetTrack(const_cast<G4Track*>(fastTrack.GetPrimaryTrack()));
134 theGflashStep->GetPostStepPoint()->SetProcessDefinedStep(const_cast<G4VProcess*>
135 (fastTrack.GetPrimaryTrack()->GetStep()->GetPostStepPoint()->GetProcessDefinedStep()));
136 theGflashNavigator->SetWorldVolume(G4TransportationManager::GetTransportationManager()->GetNavigatorForTracking()->GetWorldVolume());
138 std::vector<GflashHit>::const_iterator spotIter = gflashHitList.begin();
139 std::vector<GflashHit>::const_iterator spotIterEnd = gflashHitList.end();
141 for( ; spotIter != spotIterEnd; spotIter++){
143 theGflashNavigator->LocateGlobalPointAndUpdateTouchableHandle(spotIter->getPosition(),G4ThreeVector(0,0,0),
147 G4VPhysicalVolume* aCurrentVolume =
theGflashStep->GetPreStepPoint()->GetPhysicalVolume();
148 if( aCurrentVolume == 0 )
continue;
150 G4LogicalVolume* lv = aCurrentVolume->GetLogicalVolume();
151 if(lv->GetRegion()->GetName() !=
"CaloRegion")
continue;
153 theGflashStep->GetPreStepPoint()->SetSensitiveDetector(aCurrentVolume->GetLogicalVolume()->GetSensitiveDetector());
154 G4VSensitiveDetector* aSensitive =
theGflashStep->GetPreStepPoint()->GetSensitiveDetector();
156 if( aSensitive == 0 )
continue;
158 G4String nameCalor = aCurrentVolume->GetName();
159 nameCalor.assign(nameCalor,0,2);
160 G4double samplingWeight = 1.0;
161 if(nameCalor ==
"HB" ) {
164 else if(nameCalor==
"HE" || nameCalor ==
"HT") {
167 theGflashStep->SetTotalEnergyDeposit(spotIter->getEnergy()*samplingWeight);
176 theGflashStep->GetPostStepPoint()->SetGlobalTime(timeGlobal);
178 theGflashStep->GetPostStepPoint()->SetPosition(spotPosition);
186 G4StepPoint* preStep = fastTrack.GetPrimaryTrack()->GetStep()->GetPreStepPoint();
187 G4StepPoint* postStep = fastTrack.GetPrimaryTrack()->GetStep()->GetPostStepPoint();
189 G4String procName = postStep->GetProcessDefinedStep()->GetProcessName();
190 G4ParticleDefinition* particleType = fastTrack.GetPrimaryTrack()->GetDefinition();
194 if((particleType == G4PionPlus::PionPlusDefinition() && procName ==
"WrappedPionPlusInelastic") ||
195 (particleType == G4PionMinus::PionMinusDefinition() && procName ==
"WrappedPionMinusInelastic") ||
196 (particleType == G4KaonPlus::KaonPlusDefinition() && procName ==
"WrappedKaonPlusInelastic") ||
197 (particleType == G4KaonMinus::KaonMinusDefinition() && procName ==
"WrappedKaonMinusInelastic") ||
198 (particleType == G4AntiProton::AntiProtonDefinition() && procName ==
"WrappedAntiProtonInelastic") ||
199 (particleType == G4Proton::ProtonDefinition() && procName ==
"WrappedProtonInelastic")) {
204 const G4TrackVector* fSecondaryVector = fastTrack.GetPrimaryTrack()->GetStep()->GetSecondary();
205 G4double leadingEnergy = 0.0;
211 for (
unsigned int isec = 0 ; isec < fSecondaryVector->size() ; isec++) {
212 G4Track* fSecondaryTrack = (*fSecondaryVector)[isec];
213 G4double secondaryEnergy = fSecondaryTrack->GetKineticEnergy();
215 if(secondaryEnergy > leadingEnergy ) {
216 leadingEnergy = secondaryEnergy;
220 if((preStep->GetTotalEnergy()!=0) &&
229 theHisto->
deltaStep->Fill((postStep->GetPosition() - preStep->GetPosition()).getRho()/cm);
231 theHisto->
energyLoss->Fill(fabs(fastTrack.GetPrimaryTrack()->GetStep()->GetDeltaEnergy()/GeV));
241 G4bool isExcluded=
false;
246 G4double
eta = fastTrack.GetPrimaryTrack()->GetPosition().pseudoRapidity() ;
247 if(std::fabs(eta) > 1.392 && std::fabs(eta) < 1.566) {
249 edm::LogInfo(
"SimGeneralGFlash") <<
"GflashHadronShowerModel: excluding region of eta = " <<
eta;
254 G4StepPoint* postStep = fastTrack.GetPrimaryTrack()->GetStep()->GetPostStepPoint();
257 G4double distOut = 9999.0;
279 if(isExcluded && verbosity > 0) {
280 std::cout <<
"GflashHadronShowerModel: skipping kCalor = " << kCalor <<
281 " DistanceToOut " << distOut <<
" from (" << (postStep->GetPosition()).getRho()/cm <<
282 ":" << (postStep->GetPosition()).getZ()/cm <<
") of KE = " << fastTrack.GetPrimaryTrack()->GetKineticEnergy()/GeV << std::endl;
T getUntrackedParameter(std::string const &, T const &) const
const double MinDistanceToOut
static GflashHistogram * instance()
void updateGflashStep(G4ThreeVector position, G4double time)
G4bool ModelTrigger(const G4FastTrack &)
const double Zmax[kNumberCalorimeter]
GflashKaonMinusShowerProfile * theKaonMinusProfile
GflashAntiProtonShowerProfile * theAntiProtonProfile
~GflashHadronShowerModel()
GflashHadronShowerModel(G4String modelName, G4Region *envelope, edm::ParameterSet parSet)
void makeHits(const G4FastTrack &fastTrack)
G4Navigator * theGflashNavigator
static int position[TOTALCHAMBERS][3]
void DoIt(const G4FastTrack &, G4FastStep &)
GflashHadronShowerProfile * theProfile
virtual void loadParameters()
int findShowerType(const Gflash3Vector position)
const double energyCutOff
const double EtaMin[kNumberCalorimeter]
G4TouchableHandle theGflashTouchableHandle
void hadronicParameterization()
G4bool isFirstInelasticInteraction(const G4FastTrack &fastTrack)
const double Zmin[kNumberCalorimeter]
const double QuasiElasticLike
const double scaleSensitiveHE
G4bool excludeDetectorRegion(const G4FastTrack &fastTrack)
CalorimeterNumber getCalorimeterNumber(const Gflash3Vector position)
GflashHistogram * theHisto
GflashKaonPlusShowerProfile * theKaonPlusProfile
edm::ParameterSet theParSet
GflashPiKShowerProfile * thePiKProfile
std::vector< GflashHit > & getGflashHitList()
GflashProtonShowerProfile * theProtonProfile
const double Rmax[kNumberCalorimeter]
const double scaleSensitiveHB
G4bool IsApplicable(const G4ParticleDefinition &)
void initialize(int showerType, double energy, double globalTime, double charge, Gflash3Vector &position, Gflash3Vector &momentum)