source: trunk/examples/advanced/Rich/src/HpdSiEnergyLoss.cc @ 812

Last change on this file since 812 was 807, checked in by garnier, 16 years ago

update

File size: 5.4 KB
Line 
1//
2// ********************************************************************
3// * License and Disclaimer                                           *
4// *                                                                  *
5// * The  Geant4 software  is  copyright of the Copyright Holders  of *
6// * the Geant4 Collaboration.  It is provided  under  the terms  and *
7// * conditions of the Geant4 Software License,  included in the file *
8// * LICENSE and available at  http://cern.ch/geant4/license .  These *
9// * include a list of copyright holders.                             *
10// *                                                                  *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work  make  any representation or  warranty, express or implied, *
14// * regarding  this  software system or assume any liability for its *
15// * use.  Please see the license in the file  LICENSE  and URL above *
16// * for the full disclaimer and the limitation of liability.         *
17// *                                                                  *
18// * This  code  implementation is the result of  the  scientific and *
19// * technical work of the GEANT4 collaboration.                      *
20// * By using,  copying,  modifying or  distributing the software (or *
21// * any work based  on the software)  you  agree  to acknowledge its *
22// * use  in  resulting  scientific  publications,  and indicate your *
23// * acceptance of all terms of the Geant4 Software license.          *
24// ********************************************************************
25//
26// Rich advanced example for Geant4
27// HpdSiEnergyLoss.cc for Rich of LHCb
28// History:
29// Created: Sajan Easo (Sajan.Easo@cern.ch)
30// Revision: Patricia Mendez (Patricia.Mendez@cern.ch)
31/////////////////////////////////////////////////////////////////////////////
32#include "HpdSiEnergyLoss.hh"
33#include "G4Material.hh"
34#include "Randomize.hh"
35#include "RichTbMaterialParameters.hh"
36#include "RichTbAnalysisManager.hh"
37
38HpdSiEnergyLoss::HpdSiEnergyLoss(const G4String& materialName,
39                                 const G4String& processName)
40  : G4VEnergyLoss(processName),
41    MinKineticEnergy(1.*eV),MipEnergy(30000.0*eV),
42    finalRangeforStep(0.15*mm)  { 
43  ElossMaterialName= materialName;
44 
45  const G4MaterialTable* theMaterialTable = G4Material::GetMaterialTable();
46  G4int numberOfMat = G4Material::GetNumberOfMaterials();
47 
48  G4int iMat=0;
49  for(iMat=0;iMat<numberOfMat;iMat++) {
50    if ( materialName == (*theMaterialTable)[iMat]->GetName()){
51      fMatIndex=(*theMaterialTable)[iMat]->GetIndex();
52      break;
53    }
54   
55  }
56  if(iMat >= numberOfMat ) {
57    G4Exception("Invalid material Name in HpdSiEnergyLoss constructor" );
58  }
59}
60
61HpdSiEnergyLoss::~HpdSiEnergyLoss() { }
62
63G4bool HpdSiEnergyLoss::IsApplicable(const G4ParticleDefinition& 
64                                     aParticleType) {
65   return(aParticleType.GetPDGCharge()!= 0.);
66}
67
68G4double HpdSiEnergyLoss::GetContinuousStepLimit(const G4Track& track,
69                                 G4double,
70                                 G4double,
71                                 G4double& ){
72
73  G4double  RangeForStep =  finalRangeforStep;
74
75  if( fMatIndex != G4int(track.GetMaterial() -> GetIndex()) ) { 
76    RangeForStep = DBL_MAX;
77  }
78
79  return RangeForStep;
80}
81
82G4double  HpdSiEnergyLoss::GetMeanFreePath(const G4Track&,
83                         G4double,
84                         G4ForceCondition* condition) {
85  // return infinity so that it does nothing.
86  *condition = NotForced;
87  return DBL_MAX;
88
89}
90
91G4VParticleChange*  HpdSiEnergyLoss::PostStepDoIt(const G4Track& aTrack,
92                                 const G4Step& aStep) {
93  // Do nothing
94   aParticleChange.Initialize(aTrack) ;
95  return G4VContinuousDiscreteProcess::PostStepDoIt(aTrack,aStep);
96   
97}
98
99G4VParticleChange* HpdSiEnergyLoss::AlongStepDoIt(const G4Track& aTrack,
100                                 const G4Step&) {
101
102
103#ifdef G4ANALYSIS_USE
104  RichTbAnalysisManager * analysis = RichTbAnalysisManager::getInstance();
105#endif
106
107
108  aParticleChange.Initialize(aTrack);
109  G4int aMaterialIndex = aTrack.GetMaterial()->GetIndex();
110  if(fMatIndex != aMaterialIndex ) {
111    return &aParticleChange;
112  }
113
114  const G4DynamicParticle* aParticle = aTrack.GetDynamicParticle();
115  G4double aKinEnergyInit = aParticle->GetKineticEnergy();
116  G4double Eloss, aKinEnergyFinal;
117  if(aKinEnergyInit < MinKineticEnergy ) {  Eloss=0.0 ; }
118  else if( aKinEnergyInit < MipEnergy ) {Eloss= aKinEnergyInit ;}
119  else { Eloss = MipEnergy; }
120 
121  aKinEnergyFinal=aKinEnergyInit-Eloss;
122
123
124  //In the G4example the backscattering is implemented in
125  //an adhoc manner as done  below. It simply causes an
126  // efficiency loss.
127
128  G4double bckratio;
129  if( SignalToNoiseInData > 0.0 ){
130    bckratio =  NsigmaInPedCut/ SignalToNoiseInData ;
131
132  }
133  G4double Effs = 1.0 -  backscaprob * bckratio;
134  G4double Randbsk =  G4UniformRand();
135  if(Randbsk <= Effs && Eloss > 0.0 ) {
136           aParticleChange.ProposeLocalEnergyDeposit(Eloss);
137
138#ifdef G4ANALYSIS_USE
139 
140           analysis->bumpNumHitInSi();
141
142#endif
143
144    // G4StepPoint* pPreStepPoint  = aStep.GetPreStepPoint();
145    // G4String tpreVol = pPreStepPoint -> GetPhysicalVolume()->GetName();
146    // G4int tpreVP =  pPreStepPoint -> GetPhysicalVolume()->GetCopyNo();
147  }
148  if (aKinEnergyFinal <= MinKineticEnergy ) {
149       aParticleChange.ProposeTrackStatus(fStopAndKill);
150 
151   }else { 
152     aParticleChange.ProposeEnergy(aKinEnergyFinal);
153
154   }
155  return &aParticleChange;
156
157}
158
159
160
161
162
163
164
165
Note: See TracBrowser for help on using the repository browser.