Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/parameterisations/gflash/src/GFlashShowerModel.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /parameterisations/gflash/src/GFlashShowerModel.cc (Version 11.3.0) and /parameterisations/gflash/src/GFlashShowerModel.cc (Version 9.4.p3)


  1 //                                                  1 //
  2 // *******************************************      2 // ********************************************************************
  3 // * License and Disclaimer                         3 // * License and Disclaimer                                           *
  4 // *                                                4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of th      5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided      6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License      7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/      8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.           9 // * include a list of copyright holders.                             *
 10 // *                                               10 // *                                                                  *
 11 // * Neither the authors of this software syst     11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing fin     12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warran     13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assum     14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file      15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitatio     16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                               17 // *                                                                  *
 18 // * This  code  implementation is the result      18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboratio     19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distri     20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  ag     21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publicati     22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Sof     23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // *******************************************     24 // ********************************************************************
 25 //                                                 25 //
                                                   >>  26 // $Id: GFlashShowerModel.cc,v 1.13 2006-06-29 19:14:22 gunter Exp $
                                                   >>  27 // GEANT4 tag $Name: not supported by cvs2svn $
 26 //                                                 28 //
 27 //                                                 29 //
 28 // -------------------------------------------     30 // ------------------------------------------------------------
 29 // GEANT 4 class implementation                    31 // GEANT 4 class implementation
 30 //                                                 32 //
 31 //      ---------------- GFlashShowerModel ---     33 //      ---------------- GFlashShowerModel ----------------
 32 //                                                 34 //
 33 // Authors: E.Barberio & Joanna Weng - 9.11.20     35 // Authors: E.Barberio & Joanna Weng - 9.11.2004
 34 // -------------------------------------------     36 // ------------------------------------------------------------
 35                                                    37 
 36 #include "G4Electron.hh"                           38 #include "G4Electron.hh"
 37 #include "G4Positron.hh"                           39 #include "G4Positron.hh"
 38 #include "G4NeutrinoE.hh"                          40 #include "G4NeutrinoE.hh"
 39 #include "G4NeutrinoMu.hh"                         41 #include "G4NeutrinoMu.hh"
 40 #include "G4NeutrinoTau.hh"                        42 #include "G4NeutrinoTau.hh"
 41 #include "G4AntiNeutrinoE.hh"                      43 #include "G4AntiNeutrinoE.hh"
 42 #include "G4AntiNeutrinoMu.hh"                     44 #include "G4AntiNeutrinoMu.hh"
 43 #include "G4AntiNeutrinoTau.hh"                    45 #include "G4AntiNeutrinoTau.hh"
 44 #include "G4PionZero.hh"                           46 #include "G4PionZero.hh"
 45 #include "G4VProcess.hh"                           47 #include "G4VProcess.hh"
 46 #include "G4ios.hh"                                48 #include "G4ios.hh"
 47 #include "G4LogicalVolume.hh"                      49 #include "G4LogicalVolume.hh"
 48 #include "geomdefs.hh"                             50 #include "geomdefs.hh"
 49                                                    51 
 50 #include "GFlashShowerModel.hh"                    52 #include "GFlashShowerModel.hh"
 51 #include "GFlashHomoShowerParameterisation.hh"     53 #include "GFlashHomoShowerParameterisation.hh"
 52 #include "GFlashSamplingShowerParameterisation     54 #include "GFlashSamplingShowerParameterisation.hh"
 53 #include "GFlashEnergySpot.hh"                     55 #include "GFlashEnergySpot.hh"
 54                                                    56 
 55 GFlashShowerModel::GFlashShowerModel(G4String  <<  57 
 56   : G4VFastSimulationModel(modelName, envelope <<  58 GFlashShowerModel::GFlashShowerModel(G4String modelName,
                                                   >>  59                                      G4Envelope* envelope)
                                                   >>  60   : G4VFastSimulationModel(modelName, envelope),
                                                   >>  61     PBound(0), Parameterisation(0), HMaker(0)
 57 {                                                  62 {
 58   FlagParamType = 0;                           <<  63   FlagParamType           = 0;
 59   FlagParticleContainment = 1;                 <<  64   FlagParticleContainment = 1;  
 60   StepInX0 = 0.1;                                  65   StepInX0 = 0.1;
 61   EnergyStop = 0.0;                            <<  66   Messenger       = new GFlashShowerModelMessenger(this);
 62   Messenger = new GFlashShowerModelMessenger(t << 
 63 }                                                  67 }
 64                                                    68 
 65 GFlashShowerModel::GFlashShowerModel(G4String      69 GFlashShowerModel::GFlashShowerModel(G4String modelName)
 66   : G4VFastSimulationModel(modelName), PBound( <<  70   : G4VFastSimulationModel(modelName),
                                                   >>  71     PBound(0), Parameterisation(0), HMaker(0)
 67 {                                                  72 {
 68   FlagParamType = 1;                           <<  73   FlagParamType           =1;
 69   FlagParticleContainment = 1;                 <<  74   FlagParticleContainment = 1;  
 70   StepInX0 = 0.1;                              <<  75   StepInX0 = 0.1; 
 71   EnergyStop = 0.0;                            <<  76   Messenger       = new GFlashShowerModelMessenger(this); 
 72   Messenger = new GFlashShowerModelMessenger(t << 
 73 }                                                  77 }
 74                                                    78 
 75 GFlashShowerModel::~GFlashShowerModel()            79 GFlashShowerModel::~GFlashShowerModel()
 76 {                                                  80 {
 77   delete Messenger;                                81   delete Messenger;
 78 }                                                  82 }
 79                                                    83 
 80 G4bool GFlashShowerModel::IsApplicable(const G <<  84 G4bool
 81 {                                              <<  85 GFlashShowerModel::IsApplicable(const G4ParticleDefinition& particleType)
 82   return &particleType == G4Electron::Electron <<  86 { 
 83          || &particleType == G4Positron::Posit <<  87   return 
                                                   >>  88   &particleType == G4Electron::ElectronDefinition() ||
                                                   >>  89   &particleType == G4Positron::PositronDefinition(); 
 84 }                                                  90 }
 85                                                    91 
 86 /*********************************************     92 /**********************************************************************/
 87 /* Checks whether conditions of fast parameter     93 /* Checks whether conditions of fast parameterisation  are fullfilled */
 88 /*********************************************     94 /**********************************************************************/
 89                                                    95 
 90 G4bool GFlashShowerModel::ModelTrigger(const G <<  96 G4bool GFlashShowerModel::ModelTrigger(const G4FastTrack & fastTrack )
 91                                                    97 
 92 {                                                  98 {
 93   G4bool select = false;                           99   G4bool select = false;
 94   if (FlagParamType != 0) {                    << 100   if(FlagParamType != 0)                  
 95     G4double ParticleEnergy = fastTrack.GetPri << 101   {
 96     G4ParticleDefinition& ParticleType = *(fas << 102     G4double  ParticleEnergy = fastTrack.GetPrimaryTrack()->GetKineticEnergy(); 
 97     if (ParticleEnergy > PBound->GetMinEneToPa << 103     G4ParticleDefinition &ParticleType =
 98         && ParticleEnergy < PBound->GetMaxEneT << 104       *(fastTrack.GetPrimaryTrack()->GetDefinition()); 
                                                   >> 105     if(ParticleEnergy > PBound->GetMinEneToParametrise(ParticleType) &&
                                                   >> 106        ParticleEnergy < PBound->GetMaxEneToParametrise(ParticleType) )
 99     {                                             107     {
100       // check conditions depending on particl    108       // check conditions depending on particle flavour
101       // performance to be optimized @@@@@@@      109       // performance to be optimized @@@@@@@
102       Parameterisation->GenerateLongitudinalPr    110       Parameterisation->GenerateLongitudinalProfile(ParticleEnergy);
103       select = CheckParticleDefAndContainment( << 111       select     = CheckParticleDefAndContainment(fastTrack);  
104       if (select) EnergyStop = PBound->GetEneT << 112       if (select) EnergyStop= PBound->GetEneToKill(ParticleType);
105     }                                             113     }
106   }                                               114   }
107                                                   115 
108   return select;                               << 116   return select; 
109 }                                                 117 }
110                                                   118 
111 G4bool GFlashShowerModel::CheckParticleDefAndC << 
112 {                                              << 
113   G4bool filter = false;                       << 
114   G4ParticleDefinition* ParticleType = fastTra << 
115                                                   119 
116   if (ParticleType == G4Electron::ElectronDefi << 120 G4bool
117       || ParticleType == G4Positron::PositronD << 121 GFlashShowerModel::CheckParticleDefAndContainment(const G4FastTrack& fastTrack)
                                                   >> 122 {  
                                                   >> 123   G4bool filter=false;
                                                   >> 124   G4ParticleDefinition * ParticleType =
                                                   >> 125     fastTrack.GetPrimaryTrack()->GetDefinition(); 
                                                   >> 126   
                                                   >> 127   if(  ParticleType == G4Electron::ElectronDefinition() || 
                                                   >> 128     ParticleType == G4Positron::PositronDefinition() )
118   {                                               129   {
119     filter = true;                             << 130     filter=true;
120     if (FlagParticleContainment == 1) {        << 131     if(FlagParticleContainment == 1)  
121       filter = CheckContainment(fastTrack);    << 132     {
                                                   >> 133       filter=CheckContainment(fastTrack); 
122     }                                             134     }
123   }                                               135   }
124   return filter;                               << 136   return filter;  
125 }                                                 137 }
126                                                   138 
127 G4bool GFlashShowerModel::CheckContainment(con    139 G4bool GFlashShowerModel::CheckContainment(const G4FastTrack& fastTrack)
128 {                                                 140 {
129   G4bool filter = false;                       << 141   G4bool filter=false;
130   // track informations                           142   // track informations
131   G4ThreeVector DirectionShower = fastTrack.Ge << 143   G4ThreeVector DirectionShower=fastTrack.GetPrimaryTrackLocalDirection();
132   G4ThreeVector InitialPositionShower = fastTr << 144   G4ThreeVector InitialPositionShower=fastTrack.GetPrimaryTrackLocalPosition();
133                                                   145 
134   G4ThreeVector OrthoShower, CrossShower;      << 146   G4ThreeVector OrthoShower, CrossShower; 
135   // Returns orthogonal vector                 << 147   // Returns orthogonal vector 
136   OrthoShower = DirectionShower.orthogonal();     148   OrthoShower = DirectionShower.orthogonal();
137   // Shower in direction perpendicular to Orth    149   // Shower in direction perpendicular to OrthoShower and DirectionShower
138   CrossShower = DirectionShower.cross(OrthoSho    150   CrossShower = DirectionShower.cross(OrthoShower);
139                                                << 151   
140   G4double R = Parameterisation->GetAveR90();  << 152   G4double  R     = Parameterisation->GetAveR90();
141   G4double Z = Parameterisation->GetAveT90();  << 153   G4double  Z     = Parameterisation->GetAveT90();
142   G4int CosPhi[4] = {1, 0, -1, 0};             << 154   G4int CosPhi[4] = {1,0,-1,0};
143   G4int SinPhi[4] = {0, 1, 0, -1};             << 155   G4int SinPhi[4] = {0,1,0,-1};
144                                                << 156   
145   G4ThreeVector Position;                         157   G4ThreeVector Position;
146   G4int NlateralInside = 0;                    << 158   G4int NlateralInside=0;
147   // pointer to solid we're in                    159   // pointer to solid we're in
148   G4VSolid* SolidCalo = fastTrack.GetEnvelopeS << 160   G4VSolid *SolidCalo = fastTrack.GetEnvelopeSolid();
149   for (int i = 0; i < 4; i++) {                << 161   for(int i=0; i<4 ;i++)
                                                   >> 162   {
150     // polar coordinates                          163     // polar coordinates
151     Position = InitialPositionShower + Z * Dir << 164     Position = InitialPositionShower       + 
152                + R * SinPhi[i] * CrossShower;  << 165     Z*DirectionShower           +
153                                                << 166     R*CosPhi[i]*OrthoShower     +
154     if (SolidCalo->Inside(Position) != kOutsid << 167     R*SinPhi[i]*CrossShower     ;
                                                   >> 168     
                                                   >> 169     if(SolidCalo->Inside(Position) != kOutside) 
                                                   >> 170       NlateralInside++;
155   }                                               171   }
156                                                << 172   
157   // choose to parameterise or flag when all i    173   // choose to parameterise or flag when all inetc...
158   if (NlateralInside == 4) filter = true;      << 174   if(NlateralInside==4) filter=true;
159   // std::cout << " points =   " <<NlateralIns    175   // std::cout << " points =   " <<NlateralInside << std::endl;
160   return filter;                                  176   return filter;
161 }                                                 177 }
162                                                   178 
163 void GFlashShowerModel::DoIt(const G4FastTrack << 179 
                                                   >> 180 void
                                                   >> 181 GFlashShowerModel::DoIt(const G4FastTrack& fastTrack, G4FastStep& fastStep)
164 {                                                 182 {
165   // parametrise electrons                        183   // parametrise electrons
166   if (fastTrack.GetPrimaryTrack()->GetDefiniti << 184   if(fastTrack.GetPrimaryTrack()->GetDefinition()
167       || fastTrack.GetPrimaryTrack()->GetDefin << 185      == G4Electron::ElectronDefinition() || 
168     ElectronDoIt(fastTrack, fastStep);         << 186      fastTrack.GetPrimaryTrack()->GetDefinition()
                                                   >> 187      == G4Positron::PositronDefinition() ) 
                                                   >> 188   ElectronDoIt(fastTrack,fastStep);
169 }                                                 189 }
170                                                   190 
171 void GFlashShowerModel::ElectronDoIt(const G4F << 191 void
                                                   >> 192 GFlashShowerModel::ElectronDoIt(const G4FastTrack& fastTrack,
                                                   >> 193                                       G4FastStep&  fastStep)
172 {                                                 194 {
173   // std::cout<<"--- ElectronDoit --- "<<std::    195   // std::cout<<"--- ElectronDoit --- "<<std::endl;
174                                                << 196   
175   fastStep.KillPrimaryTrack();                    197   fastStep.KillPrimaryTrack();
176   fastStep.ProposePrimaryTrackPathLength(0.0); << 198   fastStep.SetPrimaryTrackPathLength(0.0);
177   fastStep.ProposeTotalEnergyDeposited(fastTra << 199   fastStep.SetTotalEnergyDeposited(fastTrack.GetPrimaryTrack()->
178                                                << 200                                    GetKineticEnergy());
179   //-----------------------------              << 201   
180   // Get track parameters                      << 
181   //-----------------------------                 202   //-----------------------------
182   // E,vect{p} and t,vec(x)                    << 203   // Get track parameters 
                                                   >> 204   //-----------------------------  
                                                   >> 205   //E,vect{p} and t,vec(x)
183   G4double Energy = fastTrack.GetPrimaryTrack(    206   G4double Energy = fastTrack.GetPrimaryTrack()->GetKineticEnergy();
184                                                << 207   
185   // axis of the shower, in global reference f    208   // axis of the shower, in global reference frame:
186   G4ThreeVector DirectionShower = fastTrack.Ge << 209   G4ThreeVector DirectionShower =
                                                   >> 210     fastTrack.GetPrimaryTrack()->GetMomentumDirection();
187   G4ThreeVector OrthoShower, CrossShower;         211   G4ThreeVector OrthoShower, CrossShower;
188   OrthoShower = DirectionShower.orthogonal();     212   OrthoShower = DirectionShower.orthogonal();
189   CrossShower = DirectionShower.cross(OrthoSho    213   CrossShower = DirectionShower.cross(OrthoShower);
190                                                << 214   
191   //--------------------------------              215   //--------------------------------
192   /// Generate longitudinal profile            << 216   ///Generate longitudinal profile
193   //--------------------------------              217   //--------------------------------
194   Parameterisation->GenerateLongitudinalProfil    218   Parameterisation->GenerateLongitudinalProfile(Energy);
195   // performance iteration @@@@@@@             << 219     // performance iteration @@@@@@@
196                                                << 220   
197   /// Initialisation of long. loop variables   << 221   ///Initialisation of long. loop variables
198   G4VSolid* SolidCalo = fastTrack.GetEnvelopeS << 222   G4VSolid *SolidCalo = fastTrack.GetEnvelopeSolid();
199   G4ThreeVector pos = fastTrack.GetPrimaryTrac << 223   G4ThreeVector pos   = fastTrack.GetPrimaryTrackLocalPosition();
200   G4ThreeVector dir = fastTrack.GetPrimaryTrac << 224   G4ThreeVector dir   = fastTrack.GetPrimaryTrackLocalDirection();
201   G4double Bound = SolidCalo->DistanceToOut(po << 225   G4double Bound      = SolidCalo->DistanceToOut(pos,dir); 
202                                                << 226   
203   G4double Dz = 0.00;                          << 227   G4double Dz       = 0.00;     
204   G4double ZEndStep = 0.00;                       228   G4double ZEndStep = 0.00;
205                                                << 229   
206   G4double EnergyNow = Energy;                 << 230   G4double EnergyNow        = Energy;
207   G4double EneIntegral = 0.00;                 << 231   G4double EneIntegral      = 0.00;   
208   G4double LastEneIntegral = 0.00;             << 232   G4double LastEneIntegral  = 0.00;   
209   G4double DEne = 0.00;                        << 233   G4double DEne             = 0.00;
210                                                << 234   
211   G4double NspIntegral = 0.00;                 << 235   G4double NspIntegral      = 0.00;   
212   G4double LastNspIntegral = 0.00;             << 236   G4double LastNspIntegral  = 0.00;   
213   G4double DNsp = 0.00;                        << 237   G4double DNsp             = 0.00;
214                                                << 238   
215   // starting point of the shower:                239   // starting point of the shower:
216   G4ThreeVector PositionShower = fastTrack.Get << 240   G4ThreeVector PositionShower  = fastTrack.GetPrimaryTrack()->GetPosition();
217   G4ThreeVector NewPositionShower = PositionSh << 241   G4ThreeVector NewPositionShower    = PositionShower;   
218   G4double StepLenght = 0.00;                  << 242   G4double      StepLenght           = 0.00;
219                                                << 243   
                                                   >> 244   G4int NSpotDeposited =0;
                                                   >> 245   
220   //--------------------------                    246   //--------------------------
221   /// Begin Longitudinal Loop                     247   /// Begin Longitudinal Loop
222   //-------------------------                     248   //-------------------------
223                                                << 249   
224   do {                                         << 250   do
225     // determine step size=min(1Xo,next bounda << 251   {  
226     G4double stepLength = StepInX0 * Parameter << 252     //determine step size=min(1Xo,next boundary)
227     if (Bound < stepLength) {                  << 253     G4double stepLength = StepInX0*Parameterisation->GetX0();
228       Dz = Bound;                              << 254     if(Bound < stepLength)
                                                   >> 255     { 
                                                   >> 256       Dz    = Bound;
229       Bound = 0.00;                               257       Bound = 0.00;
230     }                                             258     }
231     else {                                     << 259     else
232       Dz = stepLength;                         << 260     { 
233       Bound = Bound - Dz;                      << 261       Dz    = stepLength;
                                                   >> 262       Bound = Bound-Dz;
234     }                                             263     }
235     ZEndStep = ZEndStep + Dz;                  << 264     ZEndStep=ZEndStep+Dz;
236                                                << 265     
237     // Determine Energy Release in Step           266     // Determine Energy Release in Step
238     if (EnergyNow > EnergyStop) {              << 267     if(EnergyNow > EnergyStop)
239       LastEneIntegral = EneIntegral;           << 268     {
240       EneIntegral = Parameterisation->Integrat << 269       LastEneIntegral  = EneIntegral;
241       DEne = std::min(EnergyNow, (EneIntegral  << 270       EneIntegral      = Parameterisation->IntegrateEneLongitudinal(ZEndStep);
242       LastNspIntegral = NspIntegral;           << 271       DEne             = std::min( EnergyNow,
243       NspIntegral = Parameterisation->Integrat << 272                                    (EneIntegral-LastEneIntegral)*Energy);
244       DNsp =                                   << 273       LastNspIntegral  = NspIntegral;
245         std::max(1., std::floor((NspIntegral - << 274       NspIntegral      = Parameterisation->IntegrateNspLongitudinal(ZEndStep);
                                                   >> 275       DNsp             = std::max(1., std::floor( (NspIntegral-LastNspIntegral)
                                                   >> 276                                                  *Parameterisation->GetNspot() ));
246     }                                             277     }
247     // end of the shower                          278     // end of the shower
248     else {                                     << 279     else
                                                   >> 280     {    
249       DEne = EnergyNow;                           281       DEne = EnergyNow;
250       DNsp = std::max(1., std::floor((1. - Nsp << 282       DNsp = std::max(1., std::floor( (1.- NspIntegral)
251     }                                          << 283                                      *Parameterisation->GetNspot() ));
252     EnergyNow = EnergyNow - DEne;              << 284     } 
253                                                << 285     EnergyNow  = EnergyNow - DEne;
                                                   >> 286     
254     // Apply sampling fluctuation - only in sa    287     // Apply sampling fluctuation - only in sampling calorimeters
255     //                                            288     //
256     GFlashSamplingShowerParameterisation* sp =    289     GFlashSamplingShowerParameterisation* sp =
257       dynamic_cast<GFlashSamplingShowerParamet    290       dynamic_cast<GFlashSamplingShowerParameterisation*>(Parameterisation);
258     if (sp) {                                  << 291     if (sp)
259       G4double DEneSampling = sp->ApplySamplin << 292     {
                                                   >> 293       G4double DEneSampling = sp->ApplySampling(DEne,Energy);
260       DEne = DEneSampling;                        294       DEne = DEneSampling;
261     }                                             295     }
262                                                   296 
263     // move particle in the middle of the step << 297     //move particle in the middle of the step
264     StepLenght = StepLenght + Dz / 2.00;       << 298     StepLenght        = StepLenght + Dz/2.00;  
265     NewPositionShower = NewPositionShower + St << 299     NewPositionShower = NewPositionShower + 
266     StepLenght = Dz / 2.00;                    << 300     StepLenght*DirectionShower;
267                                                << 301     StepLenght        = Dz/2.00;
268     // generate spots & hits:                  << 302     
269     for (G4int i = 0; i < DNsp; ++i) {         << 303     //generate spots & hits:
270       GFlashEnergySpot Spot;                   << 304     for (int i = 0; i < DNsp; i++)
271                                                << 305     { 
272       // Spot energy: the same for all spots   << 306       NSpotDeposited++;
273       Spot.SetEnergy(DEne / DNsp);             << 307       GFlashEnergySpot Spot;      
274       G4double PhiSpot = Parameterisation->Gen << 308       
275       G4double RSpot = Parameterisation  // ra << 309       //Spot energy: the same for all spots
276                          ->GenerateRadius(i, E << 310       Spot.SetEnergy( DEne / DNsp );
                                                   >> 311       G4double PhiSpot = Parameterisation->GeneratePhi(); // phi of spot
                                                   >> 312       G4double RSpot   = Parameterisation                 // radius of spot
                                                   >> 313                          ->GenerateRadius(i,Energy,ZEndStep-Dz/2.);
277                                                   314 
278       // check reference-> may be need to intr    315       // check reference-> may be need to introduce rot matrix @@@
279       // Position: equally spaced in z            316       // Position: equally spaced in z
280                                                << 317       
281       G4ThreeVector SpotPosition =             << 318       G4ThreeVector SpotPosition = NewPositionShower  +
282         NewPositionShower + Dz / DNsp * Direct << 319             Dz/DNsp*DirectionShower*(i+1/2.-DNsp/2.)  +
283         + RSpot * std::cos(PhiSpot) * OrthoSho << 320             RSpot*std::cos(PhiSpot)*OrthoShower       +  
                                                   >> 321             RSpot*std::sin(PhiSpot)*CrossShower;      
284       Spot.SetPosition(SpotPosition);             322       Spot.SetPosition(SpotPosition);
285                                                << 323       
286       // Generate Hits of this spot            << 324       //Generate Hits of this spot      
287       HMaker->make(&Spot, &fastTrack);            325       HMaker->make(&Spot, &fastTrack);
288     }                                             326     }
289   } while (EnergyNow > 0.0 && Bound > 0.0);    << 327   }
290                                                << 328   while(EnergyNow > 0.0 && Bound> 0.0);     
                                                   >> 329   
291   //---------------                               330   //---------------
292   /// End Loop                                    331   /// End Loop
293   //---------------                            << 332   //--------------- 
294 }                                                 333 }
295                                                   334 
296 /*                                                335 /*
297                                                   336 
298 void                                              337 void
299 GFlashShowerModel::GammaDoIt(const G4FastTrack    338 GFlashShowerModel::GammaDoIt(const G4FastTrack& fastTrack,
300                                    G4FastStep&    339                                    G4FastStep&  fastStep)
301 {                                              << 340 { 
302                                                << 341   
303   if( fastTrack.GetPrimaryTrack()->GetKineticE    342   if( fastTrack.GetPrimaryTrack()->GetKineticEnergy() > EnergyStop )
304     return;                                       343     return;
305                                                << 344   
306   //deposita in uno spot unico l'energia       << 345   //deposita in uno spot unico l'energia 
307   //con andamento exp decrescente.             << 346   //con andamento exp decrescente. 
308                                                << 347   
309   // Kill the particle to be parametrised         348   // Kill the particle to be parametrised
310   fastStep.KillPrimaryTrack();                    349   fastStep.KillPrimaryTrack();
311   fastStep.SetPrimaryTrackPathLength(0.0);        350   fastStep.SetPrimaryTrackPathLength(0.0);
312   fastStep.SetTotalEnergyDeposited(fastTrack.G    351   fastStep.SetTotalEnergyDeposited(fastTrack.GetPrimaryTrack()
313                                    ->GetKineti    352                                    ->GetKineticEnergy());
314   // other settings????                           353   // other settings????
315   feSpotList.clear();                          << 354   feSpotList.clear(); 
316                                                << 355   
317   //-----------------------------                 356   //-----------------------------
318   // Get track parameters                      << 357   // Get track parameters 
319   //-----------------------------                 358   //-----------------------------
320                                                   359 
321   // E,vect{p} and t,vec(x)                       360   // E,vect{p} and t,vec(x)
322   G4double Energy =                            << 361   G4double Energy = 
323     fastTrack.GetPrimaryTrack()->GetKineticEne    362     fastTrack.GetPrimaryTrack()->GetKineticEnergy();
324   // axis of the shower, in global reference f    363   // axis of the shower, in global reference frame:
325   G4ThreeVector DirectionShower =                 364   G4ThreeVector DirectionShower =
326     fastTrack.GetPrimaryTrack()->GetMomentumDi    365     fastTrack.GetPrimaryTrack()->GetMomentumDirection();
327   // starting point of the shower:                366   // starting point of the shower:
328   G4ThreeVector PositionShower =                  367   G4ThreeVector PositionShower =
329     fastTrack.GetPrimaryTrack()->GetPosition()    368     fastTrack.GetPrimaryTrack()->GetPosition();
330                                                << 369   
331   //G4double DEneSampling = Parameterisation->    370   //G4double DEneSampling = Parameterisation->ApplySampling(Energy,Energy);
332   //if(DEneSampling <= 0.00) DEneSampling=Ener << 371   //if(DEneSampling <= 0.00) DEneSampling=Energy;  
333                                                << 372   
334   if(Energy > 0.0)                                373   if(Energy > 0.0)
335   {                                               374   {
336     G4double dist = Parameterisation->Generate << 375     G4double dist = Parameterisation->GenerateExponential(Energy);      
337                                                << 376     
338     GFlashEnergySpot Spot;                        377     GFlashEnergySpot Spot;
339     Spot.SetEnergy( Energy );                     378     Spot.SetEnergy( Energy );
340     G4ThreeVector SpotPosition = PositionShowe << 379     G4ThreeVector SpotPosition = PositionShower + dist*DirectionShower;  
341     Spot.SetPosition(SpotPosition);               380     Spot.SetPosition(SpotPosition);
342                                                << 381     
343     // Record the Spot:                           382     // Record the Spot:
344     feSpotList.push_back(Spot);                   383     feSpotList.push_back(Spot);
345                                                << 384     
346     //Generate Hits of this spot               << 385     //Generate Hits of this spot      
347     HMaker->make(Spot);                           386     HMaker->make(Spot);
348   }                                               387   }
349 }                                                 388 }
350                                                   389 
351 */                                                390 */
352                                                   391