Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/hadronic/models/qmd/src/G4QMDCollision.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 /processes/hadronic/models/qmd/src/G4QMDCollision.cc (Version 11.3.0) and /processes/hadronic/models/qmd/src/G4QMDCollision.cc (Version 5.0)


  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 // 080602 Fix memory leaks by T. Koi              
 27 // 081120 Add deltaT in signature of CalKinema    
 28 //        Add several required updating of Mea    
 29 //        Modified handling of absorption case    
 30 // 090126 Fix in absorption case by T. Koi        
 31 // 090331 Fix for gamma participant by T. Koi     
 32 //                                                
 33 #include "G4QMDCollision.hh"                      
 34 #include "G4Scatterer.hh"                         
 35 #include "G4Pow.hh"                               
 36 #include "G4Exp.hh"                               
 37 #include "G4Log.hh"                               
 38 #include "G4PhysicalConstants.hh"                 
 39 #include "G4SystemOfUnits.hh"                     
 40 #include "Randomize.hh"                           
 41                                                   
 42 G4QMDCollision::G4QMDCollision()                  
 43 : fdeltar ( 4.0 )                                 
 44 , fbcmax0 ( 1.323142 ) // NN maximum impact pa    
 45 , fbcmax1 ( 2.523 )    // others maximum impac    
 46 // , sig0 ( 55 )   // NN cross section            
 47 //110617 fix for gcc 4.6 compilation warnings     
 48 //, sig1 ( 200 )  // others cross section         
 49 , fepse ( 0.0001 )                                
 50 {                                                 
 51    //These two pointers will be set through Se    
 52    theSystem=NULL;                                
 53    theMeanField=NULL;                             
 54    theScatterer = new G4Scatterer();              
 55 }                                                 
 56                                                   
 57 /*                                                
 58 G4QMDCollision::G4QMDCollision( const G4QMDCol    
 59 : fdeltar ( obj.fdeltar )                         
 60 , fbcmax0 ( obj.fbcmax0 ) // NN maximum impact    
 61 , fbcmax1 ( obj.fbcmax1 )    // others maximum    
 62 , fepse ( obj.fepse )                             
 63 {                                                 
 64                                                   
 65    if ( obj.theSystem != NULL ) {                 
 66       theSystem = new G4QMDSystem;                
 67       *theSystem = *obj.theSystem;                
 68    } else {                                       
 69       theSystem = NULL;                           
 70    }                                              
 71    if ( obj.theMeanField != NULL ) {              
 72       theMeanField = new G4QMDMeanField;          
 73       *theMeanField = *obj.theMeanField;          
 74    } else {                                       
 75       theMeanField = NULL;                        
 76    }                                              
 77    theScatterer = new G4Scatterer();              
 78    *theScatterer = *obj.theScatterer;             
 79 }                                                 
 80                                                   
 81 G4QMDCollision & G4QMDCollision::operator= ( c    
 82 {                                                 
 83    fdeltar = obj.fdeltar;                         
 84    fbcmax0 = obj.fbcmax1;                         
 85    fepse = obj.fepse;                             
 86                                                   
 87    if ( obj.theSystem != NULL ) {                 
 88       delete theSystem;                           
 89       theSystem = new G4QMDSystem;                
 90       *theSystem = *obj.theSystem;                
 91    } else {                                       
 92       theSystem = NULL;                           
 93    }                                              
 94    if ( obj.theMeanField != NULL ) {              
 95       delete theMeanField;                        
 96       theMeanField = new G4QMDMeanField;          
 97       *theMeanField = *obj.theMeanField;          
 98    } else {                                       
 99       theMeanField = NULL;                        
100    }                                              
101    delete theScatterer;                           
102    theScatterer = new G4Scatterer();              
103    *theScatterer = *obj.theScatterer;             
104                                                   
105    return *this;                                  
106 }                                                 
107 */                                                
108                                                   
109                                                   
110 G4QMDCollision::~G4QMDCollision()                 
111 {                                                 
112    //if ( theSystem != NULL ) delete theSystem    
113    //if ( theMeanField != NULL ) delete theMea    
114    delete theScatterer;                           
115 }                                                 
116                                                   
117                                                   
118 void G4QMDCollision::CalKinematicsOfBinaryColl    
119 {                                                 
120    G4double deltaT = dt;                          
121                                                   
122    G4int n = theSystem->GetTotalNumberOfPartic    
123 //081118                                          
124    //G4int nb = 0;                                
125    for ( G4int i = 0 ; i < n ; i++ )              
126    {                                              
127       theSystem->GetParticipant( i )->UnsetHit    
128       theSystem->GetParticipant( i )->UnsetHit    
129       //nb += theSystem->GetParticipant( i )->    
130    }                                              
131    //G4cout << "nb = " << nb << " n = " << n <    
132                                                   
133                                                   
134 //071101                                          
135    for ( G4int i = 0 ; i < n ; i++ )              
136    {                                              
137                                                   
138       //std::cout << i << " " << theSystem->Ge    
139                                                   
140       if ( theSystem->GetParticipant( i )->Get    
141       {                                           
142                                                   
143          G4bool decayed = false;                  
144                                                   
145          const G4ParticleDefinition* pd0 = the    
146          G4ThreeVector p0 = theSystem->GetPart    
147          G4ThreeVector r0 = theSystem->GetPart    
148                                                   
149          G4LorentzVector p40 = theSystem->GetP    
150                                                   
151          G4double eini = theMeanField->GetTota    
152                                                   
153          G4int n0 = theSystem->GetTotalNumberO    
154          G4int i0 = 0;                            
155                                                   
156          G4bool isThisEnergyOK = false;           
157                                                   
158          G4int maximumNumberOfTrial=4;            
159          for ( G4int ii = 0 ; ii < maximumNumb    
160          {                                        
161                                                   
162             //G4LorentzVector p4 = theSystem->    
163             G4LorentzVector p400 = p40;           
164                                                   
165             p400 *= GeV;                          
166             //G4KineticTrack kt( theSystem->Ge    
167             G4KineticTrack kt( pd0 , 0.0 , r0*    
168             //std::cout << "G4KineticTrack " <    
169             G4KineticTrackVector* secs = NULL;    
170             secs = kt.Decay();                    
171             G4int id = 0;                         
172             G4double et = 0;                      
173             if ( secs )                           
174             {                                     
175                for ( G4KineticTrackVector::ite    
176                      = secs->begin() ; it != s    
177                {                                  
178 /*                                                
179                   G4cout << "G4KineticTrack"      
180                   << " " << (*it)->GetDefiniti    
181                   << " " << (*it)->Get4Momentu    
182                   << " " << (*it)->GetPosition    
183                   << G4endl;                      
184 */                                                
185                    if ( id == 0 )                 
186                    {                              
187                       theSystem->GetParticipan    
188                       theSystem->GetParticipan    
189                       theSystem->GetParticipan    
190                       //theMeanField->Cal2Body    
191                       et += (*it)->Get4Momentu    
192                    }                              
193                    if ( id > 0 )                  
194                    {                              
195                       // Append end;              
196                       theSystem->SetParticipan    
197                       et += (*it)->Get4Momentu    
198                       if ( id > 1 )               
199                       {                           
200                          //081118                 
201                          //G4cout << "G4QMDCol    
202                       }                           
203                    }                              
204                    id++; // number of daughter    
205                                                   
206                    delete *it;                    
207                }                                  
208                                                   
209                theMeanField->Update();            
210                i0 = id-1; // 0 enter to i         
211                                                   
212                delete secs;                       
213             }                                     
214                                                   
215 //          EnergyCheck                           
216                                                   
217             G4double efin = theMeanField->GetT    
218             //std::cout <<  std::abs ( eini -     
219 //            std::cout <<  std::abs ( eini -     
220 //                                           *    
221             if ( std::abs ( eini - efin ) < fe    
222             {                                     
223                // Energy OK                       
224                isThisEnergyOK = true;             
225                break;                             
226             }                                     
227             else                                  
228             {                                     
229                                                   
230                theSystem->GetParticipant( i )-    
231                theSystem->GetParticipant( i )-    
232                theSystem->GetParticipant( i )-    
233                                                   
234                //for ( G4int i0i = 0 ; i0i < i    
235                //160210 deletion must be done     
236                for ( G4int i0i = id-2 ; 0 <= i    
237                   //081118                        
238                   //std::cout << "Decay Energi    
239                   theSystem->DeleteParticipant    
240                }                                  
241                //081103                           
242                theMeanField->Update();            
243             }                                     
244                                                   
245          }                                        
246                                                   
247                                                   
248 //       Pauli Check                              
249          if ( isThisEnergyOK == true )            
250          {                                        
251             if ( theMeanField->IsPauliBlocked     
252             {                                     
253                                                   
254                G4bool allOK = true;               
255                for ( G4int i0i = 0 ; i0i < i0     
256                {                                  
257                   if ( theMeanField->IsPauliBl    
258                   {                               
259                      allOK = false;               
260                      break;                       
261                   }                               
262                }                                  
263                                                   
264                if ( allOK )                       
265                {                                  
266                   decayed = true; //Decay Succ    
267                }                                  
268             }                                     
269                                                   
270          }                                        
271 //                                                
272                                                   
273          if ( decayed )                           
274          {                                        
275             //081119                              
276             //G4cout << "Decay Suceeded! " <<     
277             theSystem->GetParticipant( i )->Se    
278             for ( G4int i0i = 0 ; i0i < i0 ; i    
279             {                                     
280                 theSystem->GetParticipant( i0i    
281             }                                     
282                                                   
283          }                                        
284          else                                     
285          {                                        
286                                                   
287 //          Decay Blocked and re-enter orginal    
288                                                   
289             if ( isThisEnergyOK == true )  //     
290             {                                     
291                                                   
292                theSystem->GetParticipant( i )-    
293                theSystem->GetParticipant( i )-    
294                theSystem->GetParticipant( i )-    
295                                                   
296                for ( G4int i0i = 0 ; i0i < i0     
297                {                                  
298                   //081118                        
299                   //std::cout << "Decay Blocke    
300                   //160210 adding commnet: del    
301                   theSystem->DeleteParticipant    
302                }                                  
303                //081103                           
304                theMeanField->Update();            
305             }                                     
306                                                   
307          }                                        
308                                                   
309       }  //shortlive                              
310    }  // go next participant                      
311 //071101                                          
312                                                   
313                                                   
314    n = theSystem->GetTotalNumberOfParticipant(    
315                                                   
316 //081118                                          
317    //for ( G4int i = 1 ; i < n ; i++ )            
318    for ( G4int i = 1 ; i < theSystem->GetTotal    
319    {                                              
320                                                   
321       //std::cout << "Collision i " << i << st    
322       if ( theSystem->GetParticipant( i )->IsT    
323                                                   
324       G4ThreeVector ri =  theSystem->GetPartic    
325       G4LorentzVector p4i =  theSystem->GetPar    
326       G4double rmi =  theSystem->GetParticipan    
327       const G4ParticleDefinition* pdi =  theSy    
328 //090331 gamma                                    
329       if ( pdi->GetPDGMass() == 0.0 ) continue    
330                                                   
331       //std::cout << " p4i00 " << p4i << std::    
332       for ( G4int j = 0 ; j < i ; j++ )           
333       {                                           
334                                                   
335                                                   
336 /*                                                
337          G4cout << "Collision " << i << " " <<    
338          G4cout << "Collision " << j << " " <<    
339          G4cout << "Collision " << i << " " <<    
340          G4cout << "Collision " << j << " " <<    
341 */                                                
342                                                   
343          // Only 1 Collision allowed for each     
344          //081119                                 
345          if ( theSystem->GetParticipant( i )->    
346          if ( theSystem->GetParticipant( j )->    
347                                                   
348          //std::cout << "Collision " << i << "    
349                                                   
350          // Do not allow collision between nuc    
351          if ( theSystem->GetParticipant( i )->    
352          {                                        
353             if ( theSystem->GetParticipant( j     
354          }                                        
355          else if ( theSystem->GetParticipant(     
356          {                                        
357             if ( theSystem->GetParticipant( j     
358          }                                        
359                                                   
360                                                   
361          G4ThreeVector rj =  theSystem->GetPar    
362          G4LorentzVector p4j =  theSystem->Get    
363          G4double rmj =  theSystem->GetPartici    
364          const G4ParticleDefinition* pdj =  th    
365 //090331 gamma                                    
366          if ( pdj->GetPDGMass() == 0.0 ) conti    
367                                                   
368          G4double rr2 = theMeanField->GetRR2(     
369                                                   
370 //       Here we assume elab (beam momentum le    
371          if ( rr2 > fdeltar*fdeltar ) continue    
372                                                   
373          //G4double s = (p4i+p4j)*(p4i+p4j);      
374          //G4double srt = std::sqrt ( s );        
375                                                   
376          G4double srt = std::sqrt( (p4i+p4j)*(    
377                                                   
378          G4double cutoff = 0.0;                   
379          G4double fbcmax = 0.0;                   
380          //110617 fix for gcc 4.6 compilation     
381          //G4double sig = 0.0;                    
382                                                   
383          if ( rmi < 0.94 && rmj < 0.94 )          
384          {                                        
385 //          nucleon or pion case                  
386             cutoff = rmi + rmj + 0.02;            
387             fbcmax = fbcmax0;                     
388             //110617 fix for gcc 4.6 compilati    
389             //sig = sig0;                         
390          }                                        
391          else                                     
392          {                                        
393             cutoff = rmi + rmj;                   
394             fbcmax = fbcmax1;                     
395             //110617 fix for gcc compilation w    
396             //sig = sig1;                         
397          }                                        
398                                                   
399          //std::cout << "Collision cutoff " <<    
400          if ( srt < cutoff ) continue;            
401                                                   
402          G4ThreeVector dr = ri - rj;              
403          G4double rsq = dr*dr;                    
404                                                   
405          G4double pij = p4i*p4j;                  
406          G4double pidr = p4i.vect()*dr;           
407          G4double pjdr = p4j.vect()*dr;           
408                                                   
409          G4double aij = 1.0 - ( rmi*rmj /pij )    
410          G4double bij = pidr / rmi - pjdr*rmi/    
411          G4double cij = rsq + ( pidr / rmi ) *    
412          G4double brel = std::sqrt ( std::abs     
413                                                   
414          if ( brel > fbcmax ) continue;           
415          //std::cout << "collisions3 " << std:    
416                                                   
417          G4double bji = -pjdr/rmj + pidr * rmj    
418                                                   
419          G4double ti = ( pidr/rmi - bij / aij     
420          G4double tj = (-pjdr/rmj - bji / aij     
421                                                   
422                                                   
423 /*                                                
424          G4cout << "collisions4  p4i " << p4i     
425          G4cout << "collisions4  ri " << ri <<    
426          G4cout << "collisions4  p4j " << p4j     
427          G4cout << "collisions4  rj " << rj <<    
428          G4cout << "collisions4  dr " << dr <<    
429          G4cout << "collisions4  pij " << pij     
430          G4cout << "collisions4  aij " << aij     
431          G4cout << "collisions4  bij bji " <<     
432          G4cout << "collisions4  pidr pjdr " <    
433          G4cout << "collisions4  p4i.e() p4j.e    
434          G4cout << "collisions4  rmi rmj " <<     
435          G4cout << "collisions4 " << ti << " "    
436 */                                                
437          if ( std::abs ( ti + tj ) > deltaT )     
438          //std::cout << "collisions4 " << std:    
439                                                   
440          G4ThreeVector beta = ( p4i + p4j ).bo    
441                                                   
442          G4LorentzVector p = p4i;                 
443          G4LorentzVector p4icm = p.boost( p.fi    
444          G4ThreeVector pcm = p4icm.vect();        
445                                                   
446          G4double prcm = pcm.mag();               
447                                                   
448          if ( prcm <= 0.00001 ) continue;         
449          //std::cout << "collisions5 " << std:    
450                                                   
451          G4bool energetically_forbidden = !( C    
452          //G4bool energetically_forbidden = !(    
453                                                   
454 /*                                                
455          G4bool pauli_blocked = false;            
456          if ( energetically_forbidden == false    
457          {                                        
458             if ( theMeanField->IsPauliBlocked     
459             {                                     
460                pauli_blocked = true;              
461                //std::cout << "G4QMDRESULT Col    
462             }                                     
463          }                                        
464          else                                     
465          {                                        
466             if ( theMeanField->IsPauliBlocked     
467                pauli_blocked = false;             
468             //std::cout << "G4QMDRESULT Collsi    
469          }                                        
470 */                                                
471                                                   
472 /*                                                
473             G4cout << "G4QMDRESULT Collsion in    
474                       << p4i << " " << p4j        
475                       << G4endl;                  
476 */                                                
477 //       081118                                   
478          //if ( energetically_forbidden == tru    
479          if ( energetically_forbidden == true     
480          {                                        
481                                                   
482             //G4cout << " energetically_forbid    
483 //          Collsion not allowed then re enter    
484 //          Now only momentum, becasuse we onl    
485                                                   
486             theSystem->GetParticipant( i )->Se    
487             theSystem->GetParticipant( i )->Se    
488             theSystem->GetParticipant( i )->Se    
489                                                   
490             theSystem->GetParticipant( j )->Se    
491             theSystem->GetParticipant( j )->Se    
492             theSystem->GetParticipant( j )->Se    
493                                                   
494             theMeanField->Cal2BodyQuantities(     
495             theMeanField->Cal2BodyQuantities(     
496                                                   
497          }                                        
498          else                                     
499          {                                        
500                                                   
501                                                   
502            G4bool absorption = false;             
503            if ( n == theSystem->GetTotalNumber    
504            if ( absorption )                      
505            {                                      
506               //G4cout << "Absorption happend     
507               i = i-1;                            
508               n = n-1;                            
509            }                                      
510                                                   
511 //          Collsion allowed (really happened)    
512                                                   
513             // Unset Projectile/Target flag       
514             theSystem->GetParticipant( i )->Un    
515             if ( !absorption ) theSystem->GetP    
516                                                   
517             theSystem->GetParticipant( i )->Se    
518             if ( !absorption ) theSystem->GetP    
519                                                   
520             theSystem->IncrementCollisionCount    
521                                                   
522 /*                                                
523             G4cout << "G4QMDRESULT Collsion Re    
524                       << i << " and " << j        
525                       << G4endl;                  
526             G4cout << "G4QMDRESULT Collsion in    
527                       << p4i << " " << p4j        
528                       << G4endl;                  
529             G4cout << "G4QMDRESULT Collsion af    
530                       << theSystem->GetPartici    
531                       << " "                      
532                       << theSystem->GetPartici    
533                       << G4endl;                  
534             G4cout << "G4QMDRESULT Collsion Di    
535                       << p4i + p4j - theSystem    
536                       << G4endl;                  
537             G4cout << "G4QMDRESULT Collsion in    
538                       << ri << " " << rj          
539                       << G4endl;                  
540             G4cout << "G4QMDRESULT Collsion af    
541                       << theSystem->GetPartici    
542                       << " "                      
543                       << theSystem->GetPartici    
544                       << G4endl;                  
545 */                                                
546                                                   
547                                                   
548          }                                        
549                                                   
550       }                                           
551                                                   
552    }                                              
553                                                   
554                                                   
555 }                                                 
556                                                   
557                                                   
558                                                   
559 G4bool G4QMDCollision::CalFinalStateOfTheBinar    
560 {                                                 
561                                                   
562 //081103                                          
563    //G4cout << "CalFinalStateOfTheBinaryCollis    
564                                                   
565    G4bool result = false;                         
566    G4bool energyOK = false;                       
567    G4bool pauliOK = false;                        
568    G4bool abs = false;                            
569    G4QMDParticipant* absorbed = NULL;             
570                                                   
571    G4LorentzVector p4i = theSystem->GetPartici    
572    G4LorentzVector p4j = theSystem->GetPartici    
573                                                   
574 //071031                                          
575                                                   
576    G4double epot = theMeanField->GetTotalPoten    
577                                                   
578    G4double eini = epot + p4i.e() + p4j.e();      
579                                                   
580 //071031                                          
581    // will use KineticTrack                       
582    const G4ParticleDefinition* pdi0 =theSystem    
583    const G4ParticleDefinition* pdj0 =theSystem    
584    G4LorentzVector p4i0 = p4i*GeV;                
585    G4LorentzVector p4j0 = p4j*GeV;                
586    G4ThreeVector ri0 = ( theSystem->GetPartici    
587    G4ThreeVector rj0 = ( theSystem->GetPartici    
588                                                   
589    for ( G4int iitry = 0 ; iitry < 4 ; iitry++    
590    {                                              
591                                                   
592       abs = false;                                
593                                                   
594       G4KineticTrack kt1( pdi0 , 0.0 , ri0 , p    
595       G4KineticTrack kt2( pdj0 , 0.0 , rj0 , p    
596                                                   
597       G4LorentzVector p4ix_new;                   
598       G4LorentzVector p4jx_new;                   
599       G4KineticTrackVector* secs = NULL;          
600       secs = theScatterer->Scatter( kt1 , kt2     
601                                                   
602       //std::cout << "G4QMDSCATTERER BEFORE "     
603       //std::cout << "G4QMDSCATTERER BEFORE "     
604       //std::cout << "THESCATTERER " << theSca    
605                                                   
606                                                   
607       if ( secs )                                 
608       {                                           
609          G4int iti = 0;                           
610          if (  secs->size() == 2 )                
611          {                                        
612             for ( G4KineticTrackVector::iterat    
613                 = secs->begin() ; it != secs->    
614             {                                     
615                if ( iti == 0 )                    
616                {                                  
617                   theSystem->GetParticipant( i    
618                   p4ix_new = (*it)->Get4Moment    
619                   //std::cout << "THESCATTERER    
620                   theSystem->GetParticipant( i    
621                }                                  
622                if ( iti == 1 )                    
623                {                                  
624                   theSystem->GetParticipant( j    
625                   p4jx_new = (*it)->Get4Moment    
626                   //std::cout << "THESCATTERER    
627                   theSystem->GetParticipant( j    
628                }                                  
629                //std::cout << "G4QMDSCATTERER     
630                iti++;                             
631             }                                     
632          }                                        
633          else if ( secs->size() == 1 )            
634          {                                        
635 //081118                                          
636             abs = true;                           
637             //G4cout << "G4QMDCollision pion a    
638             //secs->front()->Decay();             
639             theSystem->GetParticipant( i )->Se    
640             p4ix_new = secs->front()->Get4Mome    
641             theSystem->GetParticipant( i )->Se    
642                                                   
643          }                                        
644                                                   
645 //081118                                          
646          if ( secs->size() > 2 )                  
647          {                                        
648                                                   
649             G4cout << "G4QMDCollision secs siz    
650                                                   
651             for ( G4KineticTrackVector::iterat    
652                 = secs->begin() ; it != secs->    
653             {                                     
654                G4cout << "G4QMDSCATTERER AFTER    
655             }                                     
656                                                   
657          }                                        
658                                                   
659          // deleteing KineticTrack                
660          for ( G4KineticTrackVector::iterator     
661                = secs->begin() ; it != secs->e    
662          {                                        
663             delete *it;                           
664          }                                        
665                                                   
666          delete secs;                             
667       }                                           
668 //071031                                          
669                                                   
670       if ( !abs )                                 
671       {                                           
672          theMeanField->Cal2BodyQuantities( i )    
673          theMeanField->Cal2BodyQuantities( j )    
674       }                                           
675       else                                        
676       {                                           
677          absorbed = theSystem->EraseParticipan    
678          theMeanField->Update();                  
679       }                                           
680                                                   
681       epot = theMeanField->GetTotalPotential()    
682                                                   
683       G4double efin = epot + p4ix_new.e() + p4    
684                                                   
685       //std::cout << "Collision NEW epot " <<     
686                                                   
687 /*                                                
688       G4cout << "Collision efin " << i << " "     
689       G4cout << "Collision " << i << " " << j     
690       G4cout << "Collision " << std::abs ( ein    
691 */                                                
692                                                   
693 //071031                                          
694       if ( std::abs ( eini - efin ) < fepse )     
695       {                                           
696          // Collison OK                           
697          //std::cout << "collisions6" << std::    
698          //std::cout << "collisions before " <    
699          //std::cout << "collisions after " <<    
700          //std::cout << "collisions dif " << (    
701          //std::cout << "collisions before " <    
702          //std::cout << "collisions after " <<    
703          energyOK = true;                         
704          break;                                   
705       }                                           
706       else                                        
707       {                                           
708          //G4cout << "Energy Not OK " << G4end    
709          if ( abs )                               
710          {                                        
711             //G4cout << "TKDB reinsert j " <<     
712             theSystem->InsertParticipant( abso    
713             theMeanField->Update();               
714          }                                        
715          // do not need reinsert in no absropt    
716       }                                           
717 //071031                                          
718    }                                              
719                                                   
720 // Energetically forbidden collision              
721                                                   
722    if ( energyOK )                                
723    {                                              
724       // Pauli Check                              
725       //G4cout << "Pauli Checking " << theSyst    
726       if ( !abs )                                 
727       {                                           
728          if ( !( theMeanField->IsPauliBlocked     
729          {                                        
730             //G4cout << "Binary Collision Happ    
731             pauliOK = true;                       
732          }                                        
733       }                                           
734       else                                        
735       {                                           
736          //if ( theMeanField->IsPauliBlocked (    
737          //090126                            i    
738          if ( theMeanField->IsPauliBlocked ( i    
739          {                                        
740             //G4cout << "Absorption Happen " <    
741             delete absorbed;                      
742             pauliOK = true;                       
743          }                                        
744       }                                           
745                                                   
746                                                   
747       if ( pauliOK )                              
748       {                                           
749          result = true;                           
750       }                                           
751       else                                        
752       {                                           
753          //G4cout << "Pauli Blocked" << G4endl    
754          if ( abs )                               
755          {                                        
756             //G4cout << "TKDB reinsert j pauli    
757             theSystem->InsertParticipant( abso    
758             theMeanField->Update();               
759          }                                        
760       }                                           
761    }                                              
762                                                   
763    return result;                                 
764                                                   
765 }                                                 
766                                                   
767                                                   
768                                                   
769 G4bool G4QMDCollision::CalFinalStateOfTheBinar    
770 {                                                 
771                                                   
772    //G4cout << "CalFinalStateOfTheBinaryCollis    
773                                                   
774    G4bool result = true;                          
775                                                   
776    G4LorentzVector p4i =  theSystem->GetPartic    
777    G4double rmi =  theSystem->GetParticipant(     
778    G4int zi =  theSystem->GetParticipant( i )-    
779                                                   
780    G4LorentzVector p4j =  theSystem->GetPartic    
781    G4double rmj =  theSystem->GetParticipant(     
782    G4int zj =  theSystem->GetParticipant( j )-    
783                                                   
784    G4double pr = prcm;                            
785                                                   
786    G4double c2  = pcm.z()/pr;                     
787                                                   
788    G4double csrt = srt - cutoff;                  
789                                                   
790    //G4double pri = prcm;                         
791    //G4double prf = sqrt ( 0.25 * srt*srt -rm2    
792                                                   
793    G4double asrt = srt - rmi - rmj;               
794    G4double pra = prcm;                           
795                                                   
796                                                   
797                                                   
798    G4double elastic = 0.0;                        
799                                                   
800    if ( zi == zj )                                
801    {                                              
802       if ( csrt < 0.4286 )                        
803       {                                           
804          elastic = 35.0 / ( 1. + csrt * 100.0     
805       }                                           
806       else                                        
807       {                                           
808          elastic = ( - std::atan( ( csrt - 0.4    
809                  *   2. / pi + 1.0 ) * 9.65 +     
810       }                                           
811    }                                              
812    else                                           
813    {                                              
814       if ( csrt < 0.4286 )                        
815       {                                           
816          elastic = 28.0 / ( 1. + csrt * 100.0     
817       }                                           
818       else                                        
819       {                                           
820          elastic = ( - std::atan( ( csrt - 0.4    
821                  *   2. / pi + 1.0 ) * 12.34 +    
822       }                                           
823    }                                              
824                                                   
825 //   std::cout << "Collision csrt " << i << "     
826 //   std::cout << "Collision elstic " << i <<     
827                                                   
828                                                   
829 //   std::cout << "Collision sig " << i << " "    
830    if ( G4UniformRand() > elastic / sig )         
831    {                                              
832       //std::cout << "Inelastic " << std::endl    
833       //std::cout << "elastic/sig " << elastic    
834       return result;                              
835    }                                              
836    else                                           
837    {                                              
838       //std::cout << "Elastic " << std::endl;     
839    }                                              
840 //   std::cout << "Collision ELSTIC " << i <<     
841                                                   
842                                                   
843    G4double as = G4Pow::GetInstance()->powN (     
844    G4double a = 6.0 * as / (1.0 + as);            
845    G4double ta = -2.0 * pra*pra;                  
846    G4double x = G4UniformRand();                  
847    G4double t1 = G4Log( (1-x) * G4Exp(2.*a*ta)    
848    G4double c1 = 1.0 - t1/ta;                     
849                                                   
850    if( std::abs(c1) > 1.0 ) c1 = 2.0 * x - 1.0    
851                                                   
852 /*                                                
853    G4cout << "Collision as " << i << " " << j     
854    G4cout << "Collision a " << i << " " << j <    
855    G4cout << "Collision ta " << i << " " << j     
856    G4cout << "Collision x " << i << " " << j <    
857    G4cout << "Collision t1 " << i << " " << j     
858    G4cout << "Collision c1 " << i << " " << j     
859 */                                                
860    t1 = 2.0*pi*G4UniformRand();                   
861 //   std::cout << "Collision t1 " << i << " "     
862    G4double t2 = 0.0;                             
863    if ( pcm.x() == 0.0 && pcm.y() == 0 )          
864    {                                              
865       t2 = 0.0;                                   
866    }                                              
867    else                                           
868    {                                              
869       t2 = std::atan2( pcm.y() , pcm.x() );       
870    }                                              
871 //      std::cout << "Collision t2 " << i << "    
872                                                   
873    G4double s1 = std::sqrt ( 1.0 - c1*c1 );       
874    G4double s2 = std::sqrt ( 1.0 - c2*c2 );       
875                                                   
876    G4double ct1 = std::cos(t1);                   
877    G4double st1 = std::sin(t1);                   
878                                                   
879    G4double ct2 = std::cos(t2);                   
880    G4double st2 = std::sin(t2);                   
881                                                   
882    G4double ss = c2*s1*ct1 + s2*c1;               
883                                                   
884    pcm.setX( pr * ( ss*ct2 - s1*st1*st2) );       
885    pcm.setY( pr * ( ss*st2 + s1*st1*ct2) );       
886    pcm.setZ( pr * ( c1*c2 - s1*s2*ct1) );         
887                                                   
888 // std::cout << "Collision pcm " << i << " " <    
889                                                   
890    G4double epot = theMeanField->GetTotalPoten    
891                                                   
892    G4double eini = epot + p4i.e() + p4j.e();      
893    G4double etwo = p4i.e() + p4j.e();             
894                                                   
895 /*                                                
896    G4cout << "Collision epot " << i << " " <<     
897    G4cout << "Collision eini " << i << " " <<     
898    G4cout << "Collision etwo " << i << " " <<     
899 */                                                
900                                                   
901                                                   
902    for ( G4int itry = 0 ; itry < 4 ; itry++ )     
903    {                                              
904                                                   
905       G4double eicm = std::sqrt ( rmi*rmi + pc    
906       G4double pibeta = pcm*beta;                 
907                                                   
908       G4double trans = gamma * ( gamma * pibet    
909                                                   
910       G4ThreeVector pi_new = beta*trans + pcm;    
911                                                   
912       G4double ejcm = std::sqrt ( rmj*rmj + pc    
913       trans = gamma * ( gamma * pibeta / ( gam    
914                                                   
915       G4ThreeVector pj_new = beta*trans - pcm;    
916                                                   
917 //                                                
918 // Delete old                                     
919 // Add new Particitipants                         
920 //                                                
921 // Now only change momentum ( Beacuse we only     
922 // In future Definition also will be change       
923 //                                                
924                                                   
925       theSystem->GetParticipant( i )->SetMomen    
926       theSystem->GetParticipant( j )->SetMomen    
927                                                   
928       G4double pi_new_e = (theSystem->GetParti    
929       G4double pj_new_e = (theSystem->GetParti    
930                                                   
931       theMeanField->Cal2BodyQuantities( i );      
932       theMeanField->Cal2BodyQuantities( j );      
933                                                   
934       epot = theMeanField->GetTotalPotential()    
935                                                   
936       G4double efin = epot + pi_new_e + pj_new    
937                                                   
938       //std::cout << "Collision NEW epot " <<     
939 /*                                                
940       G4cout << "Collision efin " << i << " "     
941       G4cout << "Collision " << i << " " << j     
942       G4cout << "Collision " << std::abs ( ein    
943 */                                                
944                                                   
945 //071031                                          
946       if ( std::abs ( eini - efin ) < fepse )     
947       {                                           
948    // Collison OK                                 
949          //std::cout << "collisions6" << std::    
950          //std::cout << "collisions before " <    
951          //std::cout << "collisions after " <<    
952          //std::cout << "collisions dif " << (    
953          //std::cout << "collisions before " <    
954          //std::cout << "collisions after " <<    
955       }                                           
956 //071031                                          
957                                                   
958          if ( std::abs ( eini - efin ) < fepse    
959                                                   
960          G4double cona = ( eini - efin + etwo     
961          G4double fac2 = 1.0 / ( 4.0 * cona*co    
962                        ( ( cona*cona - ( rmi*r    
963                        - 4.0 * rmi*rmi * rmj*r    
964                                                   
965          if ( fac2 > 0 )                          
966          {                                        
967             G4double fact = std::sqrt ( fac2 )    
968             pcm = fact*pcm;                       
969          }                                        
970                                                   
971                                                   
972    }                                              
973                                                   
974 // Energetically forbidden collision              
975    result = false;                                
976                                                   
977    return result;                                 
978                                                   
979 }                                                 
980