Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 // 27 // 28 29 // ------------------------------------------- 30 // GEANT 4 class implementation file 31 // 32 // ---------------- G4FTFParticipants---- 33 // by Gunter Folger, June 1998. 34 // class finding colliding particles in 35 // Changed in a part by V. Uzhinsky in oder t 36 // with original FRITIOF mode. November 37 // Ajusted for (anti) nucleus - nucleus inter 38 // (February 2011) 39 // ------------------------------------------- 40 41 #include <utility> 42 #include <vector> 43 #include <algorithm> 44 45 #include "G4FTFParticipants.hh" 46 #include "G4ios.hh" 47 #include "Randomize.hh" 48 #include "G4SystemOfUnits.hh" 49 #include "G4FTFParameters.hh" 50 #include "G4DiffractiveSplitableHadron.hh" 51 #include "G4VSplitableHadron.hh" 52 #include "G4PhysicalConstants.hh" 53 54 55 //============================================ 56 57 //#define debugFTFparticipant 58 59 60 //============================================ 61 62 G4FTFParticipants::G4FTFParticipants() : Bimpa 63 Bmin2 64 curre 65 {} 66 67 68 //============================================ 69 70 G4FTFParticipants::~G4FTFParticipants() {} 71 72 //============================================ 73 74 void G4FTFParticipants::GetList( const G4React 75 G4FTFParamete 76 77 #ifdef debugFTFparticipant 78 G4cout << "Participants::GetList" << G4endl 79 << "thePrimary " << thePrimary.GetMom 80 #endif 81 82 G4double betta_z = thePrimary.GetMomentum(). 83 if ( betta_z < 1.0e-10 ) betta_z = 1.0e-10; 84 85 StartLoop(); // reset Loop over Interactions 86 87 for ( unsigned int i = 0; i < theInteraction 88 theInteractions.clear(); 89 90 G4double deltaxy = 2.0 * fermi; // Extra nu 91 92 if ( theProjectileNucleus == nullptr ) { // 93 94 G4double impactX( 0.0 ), impactY( 0.0 ); 95 G4double B( 0.0 ), B2( 0.0 ); 96 97 G4VSplitableHadron* primarySplitable = new 98 99 #ifdef debugFTFparticipant 100 G4cout << "Hadron-nucleus or anti-baryon-n 101 #endif 102 103 G4double xyradius = theNucleus->GetOuterRa 104 105 const G4int maxNumberOfLoops = 1000; 106 G4int loopCounter = 0; 107 do { 108 109 std::pair< G4double, G4double > theImpac 110 if ( SampleBinInterval() ) { 111 B2 = GetBmin2() + G4UniformRand() * ( 112 B = B2 > 0.0 ? std::sqrt( B2 ) : 0.0; 113 G4double Phi = twopi * G4UniformRand() 114 impactX = B * std::cos( Phi ); 115 impactY = B * std::sin( Phi ); 116 SetImpactParameter( B ); 117 } else { 118 theImpactParameter = theNucleus->Choos 119 impactX = theImpactParameter.first; 120 impactY = theImpactParameter.second; 121 SetImpactParameter( std::sqrt( sqr(imp 122 } 123 124 #ifdef debugFTFparticipant 125 G4cout << "New interaction list," << " b 126 << std::sqrt( sqr(impactX ) + sqr 127 #endif 128 129 G4ThreeVector thePosition( impactX, impa 130 primarySplitable->SetPosition( thePositi 131 132 theNucleus->StartLoop(); 133 G4Nucleon* nucleon; 134 135 #ifdef debugFTFparticipant 136 G4int TrN( 0 ); 137 #endif 138 139 while ( ( nucleon = theNucleus->GetNextN 140 141 G4double impact2 = sqr( impactX - nucl 142 sqr( impactY - nucl 143 144 if ( theParameters->GetProbabilityOfIn 145 G4UniformRand() ) { 146 primarySplitable->SetStatus( 1 ); / 147 G4VSplitableHadron* targetSplitable 148 if ( ! nucleon->AreYouHit() ) { 149 targetSplitable = new G4Diffractiv 150 nucleon->Hit( targetSplitable ); 151 targetSplitable->SetStatus( 1 ); / 152 153 #ifdef debugFTFparticipant 154 G4cout << "Participated nucleons # 155 << primarySplitable << " " 156 #endif 157 158 } 159 G4InteractionContent* aInteraction = 160 G4Nucleon* PrNucleon = 0; 161 aInteraction->SetProjectileNucleon( 162 aInteraction->SetTarget( targetSplit 163 aInteraction->SetTargetNucleon( nucl 164 aInteraction->SetStatus( 1 ); 165 aInteraction->SetInteractionTime( ( 166 167 theInteractions.push_back( aInteract 168 } 169 170 #ifdef debugFTFparticipant 171 TrN++; 172 #endif 173 174 } 175 176 } while ( ( theInteractions.size() == 0 ) 177 ++loopCounter < maxNumberOfLoops 178 if ( loopCounter >= maxNumberOfLoops ) { 179 #ifdef debugFTFparticipant 180 G4cout << "BAD situation: forced exit fr 181 #endif 182 return; 183 } 184 185 #ifdef debugFTFparticipant 186 G4cout << "Number of Hit nucleons " << the 187 << "\t By[fm] " << impactY/fermi << 188 << std::sqrt( sqr( impactX ) + sqr( 189 #endif 190 191 //SortInteractionsIncT(); // Not need beca 192 ShiftInteractionTime(); // To put correct 193 return; 194 195 } // end of if ( theProjectileNucleus == 0 196 197 // Projectile and target are nuclei 198 199 #ifdef debugFTFparticipant 200 G4cout << "Projectile and target are nuclei" 201 #endif 202 203 //G4cout<<theProjectileNucleus->GetOuterRadi 204 205 // Range of impact parameter sampling 206 G4double xyradius = theProjectileNucleus->Ge 207 208 G4double impactX( 0.0 ), impactY( 0.0 ); 209 G4double B( 0.0 ), B2( 0.0 ); 210 211 const G4int maxNumberOfLoops = 1000; 212 G4int loopCounter = 0; 213 do { 214 215 std::pair< G4double, G4double > theImpactP 216 if ( SampleBinInterval() ) { 217 B2 = GetBmin2() + G4UniformRand() * ( Ge 218 B = B2 > 0.0 ? std::sqrt( B2 ) : 0.0; 219 G4double Phi = twopi * G4UniformRand(); 220 impactX = B * std::cos( Phi ); 221 impactY = B * std::sin( Phi ); 222 SetImpactParameter( B ); 223 } else { 224 theImpactParameter = theNucleus->ChooseI 225 impactX = theImpactParameter.first; 226 impactY = theImpactParameter.second; 227 SetImpactParameter( std::sqrt( sqr(impac 228 } 229 230 #ifdef debugFTFparticipant 231 G4cout << "New interaction list, " << "b[f 232 << std::sqrt( sqr( impactX ) + sqr( 233 #endif 234 235 G4ThreeVector theBeamPosition( impactX, im 236 237 theProjectileNucleus->StartLoop(); 238 G4Nucleon* ProjectileNucleon; 239 240 #ifdef debugFTFparticipant 241 G4int PrNuclN( 0 ); 242 #endif 243 244 while ( ( ProjectileNucleon = theProjectil 245 246 G4VSplitableHadron* ProjectileSplitable 247 theNucleus->StartLoop(); 248 G4Nucleon* TargetNucleon = 0; 249 250 #ifdef debugFTFparticipant 251 G4int TrNuclN( 0 ); 252 #endif 253 254 while ( ( TargetNucleon = theNucleus->Ge 255 256 G4double impact2 = sqr( impactX + Proj 257 TargetNucleon- 258 sqr( impactY + Proj 259 TargetNucleon- 260 G4VSplitableHadron* TargetSplitable = 261 if ( theParameters->GetProbabilityOfIn 262 G4UniformRand() ) { // An intera 263 264 #ifdef debugFTFparticipant 265 G4cout << G4endl << "An Interaction 266 << " " << ProjectileNucleon-> 267 << "Targ N mom " << TrNuclN < 268 << "PrN TrN Z coords [fm]" << 269 << " " << TargetNucleon->GetP 270 << " " << ProjectileNucleon-> 271 TargetNucleon->GetP 272 #endif 273 274 if ( ! ProjectileNucleon->AreYouHit( 275 // Projectile nucleon was not invo 276 ProjectileSplitable = new G4Diffra 277 ProjectileNucleon->Hit( Projectile 278 ProjectileSplitable->SetStatus( 1 279 } else { // Projectile nucleon was 280 ProjectileSplitable = ProjectileNu 281 } 282 283 if ( ! TargetNucleon->AreYouHit() ) 284 TargetSplitable = new G4Diffractiv 285 TargetNucleon->Hit( TargetSplitabl 286 TargetSplitable->SetStatus( 1 ); 287 } else { // Target nucleon was invo 288 TargetSplitable = TargetNucleon->G 289 } 290 291 G4InteractionContent* anInteraction 292 anInteraction->SetTarget( TargetSpli 293 anInteraction->SetProjectileNucleon( 294 anInteraction->SetTargetNucleon( Tar 295 anInteraction->SetInteractionTime( ( 296 297 anInteraction->SetStatus( 1 ); 298 299 #ifdef debugFTFparticipant 300 G4cout << "Part anInteraction->GetIn 301 << anInteraction->GetInteract 302 << "Splitable Pr* Tr* " << Pr 303 << TargetSplitable << G4endl; 304 #endif 305 306 theInteractions.push_back( anInterac 307 308 } // End of an Interaction has happend 309 310 #ifdef debugFTFparticipant 311 TrNuclN++; 312 #endif 313 314 } // End of while ( ( TargetNucleon = t 315 316 #ifdef debugFTFparticipant 317 PrNuclN++; 318 #endif 319 320 } // End of while ( ( ProjectileNucleon = 321 322 if ( theInteractions.size() != 0 ) theProj 323 324 } while ( ( theInteractions.size() == 0 ) && 325 ++loopCounter < maxNumberOfLoops ) 326 if ( loopCounter >= maxNumberOfLoops ) { 327 #ifdef debugFTFparticipant 328 G4cout << "BAD situation: forced exit from 329 #endif 330 return; 331 } 332 333 SortInteractionsIncT(); 334 ShiftInteractionTime(); 335 336 #ifdef debugFTFparticipant 337 G4cout << G4endl << "Number of primary colli 338 << "\t Bx[fm] " << impactX/fermi << " 339 << "\t B[fm] " << std::sqrt( sqr( imp 340 << "FTF participant End. ############ 341 #endif 342 return; 343 } 344 345 346 //============================================ 347 348 bool G4FTFPartHelperForSortInT( const G4Intera 349 const G4Intera 350 return Int1->GetInteractionTime() < Int2->Ge 351 } 352 353 354 //============================================ 355 356 void G4FTFParticipants::SortInteractionsIncT() 357 if ( theInteractions.size() < 2 ) return; / 358 std::sort( theInteractions.begin(), theInter 359 } 360 361 362 //============================================ 363 364 void G4FTFParticipants::ShiftInteractionTime() 365 G4double InitialTime = theInteractions[0]->G 366 for ( unsigned int i = 1; i < theInteraction 367 G4double InterTime = theInteractions[i]->G 368 theInteractions[i]->SetInteractionTime( In 369 G4InteractionContent* aCollision = theInte 370 G4VSplitableHadron* projectile = aCollisio 371 G4VSplitableHadron* target = aCollision->G 372 G4ThreeVector prPosition = projectile->Get 373 prPosition.setZ( target->GetPosition().z() 374 projectile->SetPosition( prPosition ); 375 projectile->SetTimeOfCreation( InterTime ) 376 target->SetTimeOfCreation( InterTime ); 377 } 378 return; 379 } 380 381 382 //============================================ 383 384 void G4FTFParticipants::Clean() { 385 for ( size_t i = 0; i < theInteractions.size 386 if ( theInteractions[ i ] ) { 387 delete theInteractions[ i ]; 388 theInteractions[ i ] = 0; 389 } 390 } 391 theInteractions.clear(); 392 currentInteraction = -1; 393 } 394 395