EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
beambeamsystem.cpp
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file beambeamsystem.cpp
1 
2 //
3 // Copyright 2010
4 //
5 // This file is part of starlight.
6 //
7 // starlight is free software: you can redistribute it and/or modify
8 // it under the terms of the GNU General Public License as published by
9 // the Free Software Foundation, either version 3 of the License, or
10 // (at your option) any later version.
11 //
12 // starlight is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 // GNU General Public License for more details.
16 //
17 // You should have received a copy of the GNU General Public License
18 // along with starlight. If not, see <http://www.gnu.org/licenses/>.
19 //
21 //
22 // File and Version Information:
23 // $Rev:: 260 $: revision of last commit
24 // $Author:: butter $: author of last commit
25 // $Date:: 2016-05-03 04:07:34 +0100 #$: date of last commit
26 //
27 // Description:
28 //
29 //
30 //
32 
33 
34 #include <iostream>
35 #include <fstream>
36 #include <cmath>
37 
38 #include "inputParameters.h"
39 #include "reportingUtils.h"
40 #include "starlightconstants.h"
41 #include "bessel.h"
42 #include "beambeamsystem.h"
43 
44 
45 using namespace std;
46 using namespace starlightConstants;
47 
48 
49 //______________________________________________________________________________
50 beamBeamSystem::beamBeamSystem(const inputParameters& inputParametersInstance,
51  const beam& electronBeam,
52  const beam& targetBeam)
53  : _beamLorentzGamma(inputParametersInstance.beamLorentzGamma()),
54  _electronBeamLorentzGamma(inputParametersInstance.electronBeamLorentzGamma()),
55  _targetBeamLorentzGamma(inputParametersInstance.targetBeamLorentzGamma()),
56  _beamBreakupMode (inputParametersInstance.beamBreakupMode()),
57  _electronBeam (electronBeam),
58  _targetBeam (targetBeam),
59  _breakupProbabilities(0)
60 // _breakupImpactParameterStep(1.007),
61 // _breakupCutOff(10e-6)
62 {
63  init();
64 }
65 
66 
67 
68 
69 //______________________________________________________________________________
70 beamBeamSystem::beamBeamSystem(const inputParameters& inputParametersInstance)
71  : _beamLorentzGamma(inputParametersInstance.beamLorentzGamma()),
72  _electronBeamLorentzGamma(inputParametersInstance.electronBeamLorentzGamma()),
73  _targetBeamLorentzGamma(inputParametersInstance.targetBeamLorentzGamma()),
74  _beamBreakupMode (inputParametersInstance.beamBreakupMode()),
75  _electronBeam (1,
76  0,
77  inputParametersInstance.productionMode(),
78  inputParametersInstance.electronBeamLorentzGamma()),
79  _targetBeam (inputParametersInstance.targetBeamZ(),
80  inputParametersInstance.targetBeamA(),
81  inputParametersInstance.productionMode(),
82  inputParametersInstance.targetBeamLorentzGamma()),
83  _breakupProbabilities(0)
84 // _breakupImpactParameterStep(1.007),
85 // _breakupCutOff(10e-10)
86 {
87  init();
88 }
89 
90 
91 
92 //______________________________________________________________________________
94 { }
95 
97 {
98  // Calculate beam gamma in CMS frame
99  double rap1 = acosh(_electronBeamLorentzGamma);
100  double rap2 = -acosh(_targetBeamLorentzGamma);
101 
102  _cmsBoost = (rap1+rap2)/2.;
103 
104  _beamLorentzGamma = cosh((rap1-rap2)/2);
107 
109 }
110 //______________________________________________________________________________
111 double
113 {
114  cout << "D=" << D << " NOT SUPPORTED IN eX COLLISIONS" << endl;
115  return 1;
116 }
117 
118 
119 void
121 {
122 
123  /*
124  double bMin = (_beam1.nuclearRadius()+_beam2.nuclearRadius())/2.;
125 
126  // Do this only for nucleus-nucleus collisions.
127  // pp and pA are handled directly in probabilityOfBreakup
128 // if ((_beam1.Z() != 1) && (_beam1.A() != 1) && (_beam2.Z() != 1) && _beam2.A() != 1) {
129 // this change allows deuterium and tritium to be handled here
130  if ((_beam1.Z() != 1) && (_beam1.A() != 1) && _beam2.A() != 1) {
131 
132  if (_beamBreakupMode == 1)
133  printInfo << "Hard Sphere Break criteria. b > " << 2. * _beam1.nuclearRadius() << endl;
134  if (_beamBreakupMode == 2)
135  printInfo << "Requiring XnXn [Coulomb] breakup. " << endl;
136  if (_beamBreakupMode == 3)
137  printInfo << "Requiring 1n1n [Coulomb only] breakup. " << endl;
138  if (_beamBreakupMode == 4)
139  printInfo << "Requiring both nuclei to remain intact. " << endl;
140  if (_beamBreakupMode == 5)
141  printInfo << "Requiring no hadronic interactions. " << endl;
142  if (_beamBreakupMode == 6)
143  printInfo << "Requiring breakup of one or both nuclei. " << endl;
144  if (_beamBreakupMode == 7)
145  printInfo << "Requiring breakup of one nucleus (Xn,0n). " << endl;
146 
147  double pOfB = 0;
148  double b = bMin;
149  double totRad = _beam1.nuclearRadius()+_beam2.nuclearRadius();
150 
151  while(1)
152  {
153 
154  if(_beamBreakupMode != 5)
155  {
156  if(b > (totRad*1.5))
157  {
158  if(pOfB<_breakupCutOff)
159  {
160 // std::cout << "Break off b: " << b << std::endl;
161 // std::cout << "Number of PofB bins: " << _breakupProbabilities.size() << std::endl;
162  break;
163  }
164  }
165  }
166  else
167  {
168  if((1-pOfB)<_breakupCutOff)
169  {
170 // std::cout << "Break off b: " << b << std::endl;
171 // std::cout << "Number of PofB bins: " << _breakupProbabilities.size() << std::endl;
172  break;
173  }
174  }
175 // std::cout << 1-pOfBreakup << std::endl;
176 
177  probabilityOfHadronBreakup(b);
178  probabilityOfPhotonBreakup(b, _beamBreakupMode);
179 
180  //What was probability of photonbreakup depending upon mode selection,
181  // is now done in the photonbreakupfunction
182  if (_beamBreakupMode == 1) {
183  if (b >_beam1.nuclearRadius()+_beam2.nuclearRadius()) // symmetry
184  _pHadronBreakup = 0;
185  else
186  _pHadronBreakup = 999.;
187  }
188 
189  b *= _breakupImpactParameterStep;
190  pOfB = exp(-1 * _pHadronBreakup) * _pPhotonBreakup;
191  _breakupProbabilities.push_back(pOfB);
192  } // End while(1)
193  }
194  */
195 }
196 
197 //______________________________________________________________________________
198 double
199 beamBeamSystem::probabilityOfHadronBreakup(const double impactparameter)
200 {
201  //probability of hadron breakup,
202  //this is what is returned when the function is called
203  double gamma = _beamLorentzGamma;
204  //input for gamma_em
205  double b = impactparameter;
206  int a1 = 0;
207  int a2 = _targetBeam.A();
208 
209  static int IFIRSTH = 0;
210  static double DELL=0., DELR=0., SIGNN=0., R1=0., A1=0., A2=0., R2=0., RHO1=0.;
211  static double RHO2=0., NZ1=0., NZ2=0., NR1=0., NR2=0.,RR1=0., RR2=0., NY=0., NX=0.;
212  static double AN1=0., AN2=0.;
213  double RSQ=0.,Z1=0.,Z2=0.,Y=0.,X=0.,XB=0.,RPU=0.,IRUP=0.,RTU=0.;
214  double IRUT=0.,T1=0.,T2=0.;
215  static double DEN1[20002], DEN2[20002];
216  double energy,sigmainmb;
217  if (IFIRSTH != 0) goto L100;
218  //Initialize
219  //Integration delta x, delta z
220  IFIRSTH = 1;
221  DELL = .05;
222  DELR = .01;
223 
224  // replace this with a parameterization from the particle data book SRK 4/1025
225  //use two sigma_NN's. 52mb at rhic 100gev/beam, 88mb at LHC 2.9tev/beam, gamma is in cm system
226  //SIGNN = 5.2;
227  //if ( gamma > 500. ) SIGNN = 8.8;
228  energy=2*gamma*0.938; // center of mass energy, in GeV
229  // This equation is from section 50 of the particle data book, the subsection on "Total Hadronic Cross-Sections, using the parameterization for sqrt{s} > 7 GeV.
230  // only the first and second terms contribute significantly, but leave them all here for good measure
231  sigmainmb = 0.2838*pow(log(energy),2)+33.73+13.67*pow(energy,-0.412)-7.77*pow(energy,-0.5626);
232  SIGNN=sigmainmb/10.;
233 
234  //use parameter from Constants
235  R1 = ( 0 );
236  R2 = ( _targetBeam.nuclearRadius());
237  A1 = 0.535; //This is woodsaxonskindepth
238  A2 = 0.535;
239  //write(6,12)r1,a1,signn Here is where we could probably set this up asymmetrically R2=_beam2.nuclearRadius() and RHO2=ap2=_beam2.A()
240  // R2 = R1;
241  RHO1 = a1;
242  RHO2 = a2;
243  NZ1 = ((R1+5.)/DELR);
244  NR1 = NZ1;
245  NZ2 = ((R2+5.)/DELR);
246  NR2 = NZ2;
247  RR1 = -DELR;
248  RR2 = -DELR;
249  NY = ((R1+5.)/DELL);
250  NX = 2*NY;
251  // This calculates T_A(b) for beam 1 and stores it in DEN1[IR1]
252  for ( int IR1 = 1; IR1 <= NR1; IR1++) {
253  DEN1[IR1] = 0.;
254  RR1 = RR1+DELR;
255  Z1 = -DELR/2;
256 
257  for ( int IZ1 = 1; IZ1 <= NZ1; IZ1++) {
258  Z1 = Z1+DELR;
259  RSQ = RR1*RR1+Z1*Z1;
260  DEN1[IR1] = DEN1[IR1]+1./(1.+exp((sqrt(RSQ)-R1)/A1));
261  }
262 
263  DEN1[IR1] = DEN1[IR1]*2.*DELR;
264  }
265 
266  // This calculates T_A(b) for beam 2 and stores it in DEN2[IR2]
267  for ( int IR2 = 1; IR2 <= NR2; IR2++) {
268  DEN2[IR2] = 0.;
269  RR2 = RR2+DELR;
270  Z2 = -DELR/2;
271 
272  for ( int IZ2 = 1; IZ2 <= NZ2; IZ2++) {
273  Z2 = Z2+DELR;
274  RSQ = RR2*RR2+Z2*Z2;
275  DEN2[IR2] = DEN2[IR2]+1./(1.+exp((sqrt(RSQ)-R2)/A2));
276  }
277 
278  DEN2[IR2] = DEN2[IR2]*2.*DELR;
279  }
280 
281  AN1 = 0.;
282  RR1 = 0.;
283  RR2 = 0.;
284 
285  for ( int IR1 =1; IR1 <= NR1; IR1++) {
286  RR1 = RR1+DELR;
287  AN1 = AN1+RR1*DEN1[IR1]*DELR*2.*starlightConstants::pi;
288  }
289  for ( int IR2 =1; IR2 <= NR2; IR2++) {
290  RR2 = RR2+DELR;
291  AN2 = AN2+RR2*DEN2[IR2]*DELR*2.*starlightConstants::pi;
292  }
293 
294 
295  //.1 to turn mb into fm^2
296  //Calculate breakup probability here
297  L100:
298  _pHadronBreakup = 0.;
299  if ( b > 25. ) return _pHadronBreakup;
300  Y = -.5*DELL;
301  for ( int IY = 1; IY <= NY; IY++) {
302  Y = Y+DELL;
303  X = -DELL*float(NY+1);
304 
305  for ( int IX = 1; IX <=NX; IX++) {
306  X = X+DELL;
307  XB = b-X;
308  RPU = sqrt(X*X+Y*Y);
309  IRUP = (RPU/DELR)+1;
310  RTU = sqrt(XB*XB+Y*Y);
311  IRUT = (RTU/DELR)+1;
312  T1 = DEN2[(int)IRUT]*RHO2/AN2;
313  T2 = DEN1[(int)IRUP]*RHO1/AN1;
314  //Eq.6 BCW, Baltz, Chasman, White, Nucl. Inst. & Methods A 417, 1 (1998)
315  _pHadronBreakup=_pHadronBreakup+2.*T1*(1.-exp(-SIGNN*T2))*DELL*DELL;
316  }//for(IX)
317  }//for(IY)
318 
319  return _pHadronBreakup;
320 }
321 
322 
323 //______________________________________________________________________________
324 double
325 beamBeamSystem::probabilityOfPhotonBreakup(const double impactparameter, const int mode)
326 {
327  static double ee[10001], eee[162], se[10001];
328 
329  _pPhotonBreakup =0.; //Might default the probability with a different value?
330  double b = impactparameter;
331  int zp = 1; //What about _beam2? Generic approach?
332  int ap = 0;
333 
334  //Was initialized at the start of the function originally, been moved inward.
335  double pxn=0.;
336  double p1n=0.;
337 
338  //Used to be done prior to entering the function. Done properly for assymetric?
339  double gammatarg = 2.*_beamLorentzGamma*_beamLorentzGamma-1.;
340  double omaxx =0.;
341  //This was done prior entering the function as well
342  if (_beamLorentzGamma > 500.){
343  omaxx=1.E10;
344  }
345  else{
346  omaxx=1.E7;
347  }
348 
349 
350  double e1[23]= {0.,103.,106.,112.,119.,127.,132.,145.,171.,199.,230.,235.,
351  254.,280.,300.,320.,330.,333.,373.,390.,420.,426.,440.};
352  double s1[23]= {0.,12.0,11.5,12.0,12.0,12.0,15.0,17.0,28.0,33.0,
353  52.0,60.0,70.0,76.0,85.0,86.0,89.0,89.0,75.0,76.0,69.0,59.0,61.0};
354  double e2[12]={0.,2000.,3270.,4100.,4810.,6210.,6600.,
355  7790.,8400.,9510.,13600.,16400.};
356  double s2[12]={0.,.1266,.1080,.0805,.1017,.0942,.0844,.0841,.0755,.0827,
357  .0626,.0740};
358  double e3[29]={0.,26.,28.,30.,32.,34.,36.,38.,40.,44.,46.,48.,50.,52.,55.,
359  57.,62.,64.,66.,69.,72.,74.,76.,79.,82.,86.,92.,98.,103.};
360  double s3[29]={0.,30.,21.5,22.5,18.5,17.5,15.,14.5,19.,17.5,16.,14.,
361  20.,16.5,17.5,17.,15.5,18.,15.5,15.5,15.,13.5,18.,14.5,15.5,12.5,13.,
362  13.,12.};
363  static double sa[161]={0.,0.,.004,.008,.013,.017,.021,.025,.029,.034,.038,.042,.046,
364  .051,.055,.059,.063,.067,.072,.076,.08,.085,.09,.095,.1,.108,.116,
365  .124,.132,.14,.152,.164,.176,.188,.2,.22,.24,.26,.28,.3,.32,.34,
366  .36,.38,.4,.417,.433,.450,.467,.483,.5,.51,.516,.52,.523,.5245,
367  .525,.5242,
368  .5214,.518,.512,.505,.495,.482,.469,.456,.442,.428,.414,.4,.386,
369  .370,.355,.34,.325,.310,.295,.280,.265,.25,.236,.222,.208,.194,
370  .180,.166,
371  .152,.138,.124,.11,.101,.095,.09,.085,.08,.076,.072,.069,.066,
372  .063,.06,.0575,.055,.0525,.05,.04875,.0475,.04625,.045,.04375,
373  .0425,.04125,.04,.03875,.0375,.03625,.035,.03375,.0325,.03125,.03,
374  .02925,.0285,.02775,.027,.02625,.0255,.02475,.024,.02325,.0225,
375  .02175,.021,.02025,.0195,.01875,.018,.01725,.0165,.01575,.015,
376  .01425,.0135,.01275,.012,.01125,.0105,.00975,.009,.00825,.0075,
377  .00675,.006,.00525,.0045,.00375,.003,.00225,.0015,.00075,0.};
378 
379 
380 
381  double sen[161]={0.,0.,.012,.025,.038,.028,.028,.038,.035,.029,.039,.035,
382  .038,.032,.038,.041,.041,.049,.055,.061,.072,.076,.070,.067,
383  .080,.103,.125,.138,.118,.103,.129,.155,.170,.180,.190,.200,
384  .215,.250,.302,.310,.301,.315,.330,.355,.380,.400,.410,.420,
385  .438,.456,.474,.492,.510,.533,.556,.578,.6,.62,.63,.638,
386  .640,.640,.637,.631,.625,.618,.610,.600,.580,.555,.530,.505,
387  .480,.455,.435,.410,.385,.360,.340,.320,.300,.285,.270,.255,
388  .240,.225,.210,.180,.165,.150,.140,.132,.124,.116,.108,.100,
389  .092,.084,.077,.071,.066,.060,.055,.051,.048,.046,.044,.042,
390  .040,.038,.036,.034,.032,.030,.028,.027,.026,.025,.025,.025,
391  .024,.024,.024,.024,.024,.023,.023,.023,.023,.023,.022,.022,
392  .022,.022,.022,.021,.021,.021,.020,.020,
393  .020,.019,.018,.017,.016,.015,.014,.013,.012,.011,.010,.009,
394  .008,.007,.006,.005,.004,.003,.002,.001,0.};
395 
396  // gammay,p gamma,n of Armstrong begin at 265 incr 25
397 
398 
399  double sigt[160]={0.,.4245,.4870,.5269,.4778,.4066,.3341,.2444,.2245,.2005,
400  .1783,.1769,.1869,.1940,.2117,.2226,.2327,.2395,.2646,.2790,.2756,
401  .2607,.2447,.2211,.2063,.2137,.2088,.2017,.2050,.2015,.2121,.2175,
402  .2152,.1917,.1911,.1747,.1650,.1587,.1622,.1496,.1486,.1438,.1556,
403  .1468,.1536,.1544,.1536,.1468,.1535,.1442,.1515,.1559,.1541,.1461,
404  .1388,.1565,.1502,.1503,.1454,.1389,.1445,.1425,.1415,.1424,.1432,
405  .1486,.1539,.1354,.1480,.1443,.1435,.1491,.1435,.1380,.1317,.1445,
406  .1375,.1449,.1359,.1383,.1390,.1361,.1286,.1359,.1395,.1327,.1387,
407  .1431,.1403,.1404,.1389,.1410,.1304,.1363,.1241,.1284,.1299,.1325,
408  .1343,.1387,.1328,.1444,.1334,.1362,.1302,.1338,.1339,.1304,.1314,
409  .1287,.1404,.1383,.1292,.1436,.1280,.1326,.1321,.1268,.1278,.1243,
410  .1239,.1271,.1213,.1338,.1287,.1343,.1231,.1317,.1214,.1370,.1232,
411  .1301,.1348,.1294,.1278,.1227,.1218,.1198,.1193,.1342,.1323,.1248,
412  .1220,.1139,.1271,.1224,.1347,.1249,.1163,.1362,.1236,.1462,.1356,
413  .1198,.1419,.1324,.1288,.1336,.1335,.1266};
414 
415 
416  double sigtn[160]={0.,.3125,.3930,.4401,.4582,.3774,.3329,.2996,.2715,.2165,
417  .2297,.1861,.1551,.2020,.2073,.2064,.2193,.2275,.2384,.2150,.2494,
418  .2133,.2023,.1969,.1797,.1693,.1642,.1463,.1280,.1555,.1489,.1435,
419  .1398,.1573,.1479,.1493,.1417,.1403,.1258,.1354,.1394,.1420,.1364,
420  .1325,.1455,.1326,.1397,.1286,.1260,.1314,.1378,.1353,.1264,.1471,
421  .1650,.1311,.1261,.1348,.1277,.1518,.1297,.1452,.1453,.1598,.1323,
422  .1234,.1212,.1333,.1434,.1380,.1330,.12,.12,.12,.12,.12,.12,.12,.12,
423  .12,.12,.12,.12,.12,.12,.12,.12,.12,.12,.12,.12,.12,.12,.12,.12,.12,
424  .12,.12,.12,.12,.12,.12,.12,.12,.12,.12,.12,.12,.12,.12,.12,.12,.12,
425  .12,.12,.12,.12,.12,.12,.12,.12,.12,.12,.12,.12,.12,.12,.12,.12,.12,
426  .12,.12,.12,.12,.12,.12,.12,.12,.12,.12,.12,.12,.12,.12,.12,.12,.12,
427  .12,.12,.12,.12,.12,.12,.12,.12,.12,.12,.12,.12,.12};
428 
429 
430 
431  static int IFIRSTP=0;
432 
433 
434  double si1=0, g1 =0, o1=0;
435  int ne = 0, ij =0;
436  double delo=0, omax =0, gk1m=0;
437  static double scon=0., zcon=0.,o0=0.;
438 
439 
440  double x=0,y=0,eps=0,eta=0,em=0,exx=0,s=0,ictr=0,pom=0,vec=0,gk1=0;
441 
442  // maximum energy for GDR dissocation (in target frame, in MeV)
443 
444  double omax1n=24.01;
445 
446  if (IFIRSTP != 0) goto L100;
447 
448  IFIRSTP=1;
449 
450 
451  //This is dependenant on gold or lead....Might need to expand
452  if (zp == 79)
453  {
454 
455 
456  ap=197;
457  si1=540.;
458  g1=4.75;
459 
460  // peak and minimum energies for GDR excitation (in MeV)
461  o1=13.70;
462  o0=8.1;
463  }
464  else
465  {
466  zp=82; //assumed to be lead
467  ap=208;
468  si1=640.;
469  g1=4.05;
470  o1=13.42;
471  o0=7.4;
472  for(int j=1;j<=160;j++)
473  {
474 
475  sa[j]=sen[j];
476  }
477  }
478  //Part II of initialization
479  delo = .05;
480  //.1 to turn mb into fm^2
481  scon = .1*g1*g1*si1;
482  zcon = zp/(gammatarg*( pi)*(
483  hbarcmev))*zp/(gammatarg*( pi)*
484  ( hbarcmev))/137.04;//alpha?
485 
486  //single neutron from GDR, Veyssiere et al. Nucl. Phys. A159, 561 (1970)
487  for ( int i = 1; i <= 160; i++) {
488  eee[i] = o0+.1*(i-1);
489  sa[i] = 100.*sa[i];
490  }
491  //See Baltz, Rhoades-Brown, and Weneser, Phys. Rev. E 54, 4233 (1996)
492  //for details of the following photo cross-sections
493  eee[161]=24.1;
494  ne=int((25.-o0)/delo)+1;
495  //GDR any number of neutrons, Veyssiere et al., Nucl. Phys. A159, 561 (1970)
496  for ( int i = 1; i <= ne; i++ ) {
497  ee[i] = o0+(i-1)*delo;
498  //cout<<" ee 1 "<<ee[i]<<" "<<i<<endl;
499 
500  se[i] = scon*ee[i]*ee[i]/(((o1*o1-ee[i]*ee[i])*(o1*o1-ee[i]*ee[i]))
501  +ee[i]*ee[i]*g1*g1);
502  }
503  ij = ne; //Risky?
504  //25-103 MeV, Lepretre, et al., Nucl. Phys. A367, 237 (1981)
505  for ( int j = 1; j <= 27; j++ ) {
506  ij = ij+1;
507  ee[ij] = e3[j];
508  //cout<<" ee 2 "<<ee[ij]<<" "<<ij<<endl;
509 
510  se[ij] = .1*ap*s3[j]/208.;
511  }
512  //103-440 MeV, Carlos, et al., Nucl. Phys. A431, 573 (1984)
513  for ( int j = 1; j <= 22; j++ ) {
514  ij = ij+1;
515  ee[ij] = e1[j];
516  //cout<<" ee 3 "<<ee[ij]<<" "<<ij<<endl;
517  se[ij] = .1*ap*s1[j]/208.;
518  }
519  //440 MeV-2 GeV Armstrong et al.
520  for ( int j = 9; j <= 70; j++) {
521  ij = ij+1;
522  ee[ij] = ee[ij-1]+25.;
523  //cout<<" ee 4 "<<ee[ij]<<" "<<ij<<endl;
524  se[ij] = .1*(zp*sigt[j]+(ap-zp)*sigtn[j]);
525  }
526  //2-16.4 GeV Michalowski; Caldwell
527  for ( int j = 1; j <= 11; j++) {
528  ij = ij+1;
529  ee[ij] = e2[j];
530  //cout<<" ee 5 "<<ee[ij]<<" "<<ij<<endl;
531  se[ij] = .1*ap*s2[j];
532  }
533  //Regge paramteres
534  x = .0677;
535  y = .129;
536  eps = .0808;
537  eta = .4525;
538  em = .94;
539  exx = pow(10,.05);
540 
541  //Regge model for high energy
542  s = .002*em*ee[ij];
543  //make sure we reach LHC energies
544  ictr = 100;
545  if ( gammatarg > (2.*150.*150.)) ictr = 150;
546  for ( int j = 1; j <= ictr; j++ ) {
547  ij = ij+1;
548  s = s*exx;
549  ee[ij] = 1000.*.5*(s-em*em)/em;
550  //cout<<" ee 6 "<<ee[ij]<<" "<<ij<<endl;
551  pom = x*pow(s,eps);
552  vec = y*pow(s,(-eta));
553  se[ij] = .1*.65*ap*(pom+vec);
554  }
555  ee[ij+1] = 99999999999.;
556  //done with initaliation
557  //clear counters for 1N, XN
558  L100:
559 
560  p1n = 0.;
561  pxn = 0.;
562  //start XN calculation
563  //what's the b-dependent highest energy of interest?
564 
565  omax = min(omaxx,4.*gammatarg*( hbarcmev)/b);
566  if ( omax < o0 ) return _pPhotonBreakup;
567  gk1m = bessel::dbesk1(ee[1]*b/(( hbarcmev)*gammatarg));
568  int k = 2;
569  L212:
570  if (ee[k] < omax ) {
571  gk1 = bessel::dbesk1(ee[k]*b/(( hbarcmev)*gammatarg));
572  //Eq. 3 of BCW--NIM in Physics Research A 417 (1998) pp1-8:
573  pxn=pxn+zcon*(ee[k]-ee[k-1])*.5*(se[k-1]*ee[k-1]*gk1m*gk1m+se[k]*ee[k]*gk1*gk1);
574  k = k + 1;
575  gk1m = gk1;
576  goto L212;
577  }
578  //one neutron dissociation
579  omax = min(omax1n,4.*gammatarg*( hbarcmev)/b);
580  gk1m = bessel::dbesk1(eee[1]*b/(( hbarcmev)*gammatarg));
581  k = 2;
582  L102:
583  if (eee[k] < omax ) {
584  gk1 = bessel::dbesk1(eee[k]*b/(( hbarcmev)*gammatarg));
585  //Like Eq3 but with only the one neutron out GDR photo cross section input
586  p1n = p1n+zcon*(eee[k]-eee[k-1])*.5*(sa[k-1]*eee[k-1]*gk1m*gk1m+sa[k]*eee[k]*gk1*gk1);
587  k = k+1;
588  gk1m = gk1;
589  goto L102;
590  }
591 
592 
593  if (( mode) == 1) _pPhotonBreakup = 1.;
594  if (( mode) == 2) _pPhotonBreakup = (1-exp(-1*pxn))*(1-exp(-1*pxn));
595  if (( mode) == 3) _pPhotonBreakup = (p1n*exp(-1*pxn))*(p1n*exp(-1*pxn));
596  if (( mode) == 4) _pPhotonBreakup = exp(-2*pxn);
597  if (( mode) == 5) _pPhotonBreakup = 1.;
598  if (( mode) == 6) _pPhotonBreakup = (1. - exp(-2.*pxn));
599  if (( mode) == 7) _pPhotonBreakup = 2.*exp(-pxn)*(1.-exp(-pxn));
600 
601  //cout<<pxn<<" "<<zcon<<" "<<ee[k]<<" "<<se[k-1]<<" "<<gk1m<<" "<<gk1<<" "<<k<<" "<<ee[k+1]<< " "<<b<< endl;
602 
603  return _pPhotonBreakup;
604 }