Ignore:
Timestamp:
Apr 6, 2009, 12:21:12 PM (16 years ago)
Author:
garnier
Message:

update processes

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/processes/electromagnetic/standard/src/G4PAIxSection.cc

    r819 r961  
    2525//
    2626//
    27 // $Id: G4PAIxSection.cc,v 1.21 2006/06/29 19:53:20 gunter Exp $
    28 // GEANT4 tag $Name: $
     27// $Id: G4PAIxSection.cc,v 1.24 2008/05/30 16:04:40 grichine Exp $
     28// GEANT4 tag $Name: geant4-09-02-ref-02 $
    2929//
    3030//
     
    7070         70.0 ,   100.0 , 300.0 , 600.0 , 1000.0 , 3000.0 ,
    7171      10000.0 , 50000.0
    72 } ;
     72};
    7373
    7474const G4int G4PAIxSection::
    75 fRefGammaNumber = 29 ;         // The number of gamma for creation of
     75fRefGammaNumber = 29;         // The number of gamma for creation of
    7676                               // spline (9)
    7777
     
    8080// Local class constants
    8181
    82 const G4double G4PAIxSection::fDelta = 0.005 ; // energy shift from interval border
    83 const G4double G4PAIxSection::fError = 0.005 ; // error in lin-log approximation
    84 
    85 const G4int G4PAIxSection::fMaxSplineSize = 500 ;  // Max size of output spline
     82const G4double G4PAIxSection::fDelta = 0.005; // energy shift from interval border
     83const G4double G4PAIxSection::fError = 0.005; // error in lin-log approximation
     84
     85const G4int G4PAIxSection::fMaxSplineSize = 500;  // Max size of output spline
    8686                                                    // arrays
    8787
     
    9595  fDensity       = matCC->GetMaterial()->GetDensity();
    9696  G4int matIndex = matCC->GetMaterial()->GetIndex();
     97  fMaterialIndex = matIndex;   
    9798  fSandia        = new G4SandiaTable(matIndex);
    9899
     
    108109    (*(*fMatSandiaMatrix)[i])[0] = fSandia->GetSandiaMatTable(i,0);
    109110
    110     for(j = 1; j < 5 ; j++)
     111    for(j = 1; j < 5; j++)
    111112    {
    112113      (*(*fMatSandiaMatrix)[i])[j] = fSandia->GetSandiaMatTable(i,j)*fDensity;
    113114    }     
    114115  }                     
    115 
    116 
    117 
    118116}
     117
     118////////////////////////////////////////////////////////////////
    119119
    120120G4PAIxSection::G4PAIxSection(G4int materialIndex,
    121121                             G4double maxEnergyTransfer)
    122122{
    123    const G4MaterialTable* theMaterialTable = G4Material::GetMaterialTable() ;
    124    G4int i, j ;   
    125 
    126       fDensity                = (*theMaterialTable)[materialIndex]->GetDensity() ;
     123   const G4MaterialTable* theMaterialTable = G4Material::GetMaterialTable();
     124   G4int i, j;   
     125
     126      fMaterialIndex   = materialIndex;   
     127      fDensity                = (*theMaterialTable)[materialIndex]->GetDensity();
    127128      fElectronDensity        = (*theMaterialTable)[materialIndex]->
    128                              GetElectronDensity() ;
     129                             GetElectronDensity();
    129130      fIntervalNumber         = (*theMaterialTable)[materialIndex]->
    130                              GetSandiaTable()->GetMatNbOfIntervals() ;
     131                             GetSandiaTable()->GetMatNbOfIntervals();
    131132      fIntervalNumber--;     
    132       // G4cout<<fDensity<<"\t"<<fElectronDensity<<"\t"<<fIntervalNumber<<G4endl ;
    133 
    134       fEnergyInterval = new G4double[fIntervalNumber+2] ;
    135       fA1             = new G4double[fIntervalNumber+2] ;
    136       fA2             = new G4double[fIntervalNumber+2] ;
    137       fA3             = new G4double[fIntervalNumber+2] ;
    138       fA4             = new G4double[fIntervalNumber+2] ;
    139 
    140       for(i = 1 ; i <= fIntervalNumber ; i++ )
     133      // G4cout<<fDensity<<"\t"<<fElectronDensity<<"\t"<<fIntervalNumber<<G4endl;
     134
     135      fEnergyInterval = new G4double[fIntervalNumber+2];
     136      fA1             = new G4double[fIntervalNumber+2];
     137      fA2             = new G4double[fIntervalNumber+2];
     138      fA3             = new G4double[fIntervalNumber+2];
     139      fA4             = new G4double[fIntervalNumber+2];
     140
     141      for(i = 1; i <= fIntervalNumber; i++ )
    141142      {
    142143         if(((*theMaterialTable)[materialIndex]->
     
    144145              i > fIntervalNumber               )
    145146         {
    146             fEnergyInterval[i] = maxEnergyTransfer ;
    147             fIntervalNumber = i ;
     147            fEnergyInterval[i] = maxEnergyTransfer;
     148            fIntervalNumber = i;
    148149            break;
    149150         }
     
    159160                              GetSandiaTable()->GetSandiaCofForMaterial(i-1,4);
    160161         // G4cout<<i<<"\t"<<fEnergyInterval[i]<<"\t"<<fA1[i]<<"\t"<<fA2[i]<<"\t"
    161          //                               <<fA3[i]<<"\t"<<fA4[i]<<"\t"<<G4endl ;
     162         //                               <<fA3[i]<<"\t"<<fA4[i]<<"\t"<<G4endl;
    162163      }   
    163164      if(fEnergyInterval[fIntervalNumber] != maxEnergyTransfer)
    164165      {
    165166         fIntervalNumber++;
    166          fEnergyInterval[fIntervalNumber] = maxEnergyTransfer ;
     167         fEnergyInterval[fIntervalNumber] = maxEnergyTransfer;
    167168      }
    168169
     
    174175           1.5*fDelta*(fEnergyInterval[i+1]+fEnergyInterval[i]))
    175176        {
    176           continue ;
     177          continue;
    177178        }
    178179        else
     
    180181          for(j=i;j<fIntervalNumber;j++)
    181182          {
    182             fEnergyInterval[j] = fEnergyInterval[j+1] ;
    183                         fA1[j] = fA1[j+1] ;
    184                         fA2[j] = fA2[j+1] ;
    185                         fA3[j] = fA3[j+1] ;
    186                         fA4[j] = fA4[j+1] ;
     183            fEnergyInterval[j] = fEnergyInterval[j+1];
     184                        fA1[j] = fA1[j+1];
     185                        fA2[j] = fA2[j+1];
     186                        fA3[j] = fA3[j+1];
     187                        fA4[j] = fA4[j+1];
    187188          }
    188           fIntervalNumber-- ;
    189           i-- ;
     189          fIntervalNumber--;
     190          i--;
    190191        }
    191192      }
     
    194195      /* *********************************
    195196
    196       fSplineEnergy          = new G4double[fMaxSplineSize] ;   
    197       fRePartDielectricConst = new G4double[fMaxSplineSize] ;   
    198       fImPartDielectricConst = new G4double[fMaxSplineSize] ;   
    199       fIntegralTerm          = new G4double[fMaxSplineSize] ;   
    200       fDifPAIxSection        = new G4double[fMaxSplineSize] ;   
    201       fIntegralPAIxSection   = new G4double[fMaxSplineSize] ;   
     197      fSplineEnergy          = new G4double[fMaxSplineSize];   
     198      fRePartDielectricConst = new G4double[fMaxSplineSize];   
     199      fImPartDielectricConst = new G4double[fMaxSplineSize];   
     200      fIntegralTerm          = new G4double[fMaxSplineSize];   
     201      fDifPAIxSection        = new G4double[fMaxSplineSize];   
     202      fIntegralPAIxSection   = new G4double[fMaxSplineSize];   
    202203     
    203204      for(i=0;i<fMaxSplineSize;i++)
    204205      {
    205          fSplineEnergy[i]          = 0.0 ;   
    206          fRePartDielectricConst[i] = 0.0 ;   
    207          fImPartDielectricConst[i] = 0.0 ;   
    208          fIntegralTerm[i]          = 0.0 ;   
    209          fDifPAIxSection[i]        = 0.0 ;   
    210          fIntegralPAIxSection[i]   = 0.0 ;   
     206         fSplineEnergy[i]          = 0.0;   
     207         fRePartDielectricConst[i] = 0.0;   
     208         fImPartDielectricConst[i] = 0.0;   
     209         fIntegralTerm[i]          = 0.0;   
     210         fDifPAIxSection[i]        = 0.0;   
     211         fIntegralPAIxSection[i]   = 0.0;   
    211212      }
    212213      **************************************************  */   
    213214
    214       InitPAI() ;  // create arrays allocated above
     215      InitPAI();  // create arrays allocated above
    215216     
    216       delete[] fEnergyInterval ;
    217       delete[] fA1 ;
    218       delete[] fA2 ;
    219       delete[] fA3 ;
    220       delete[] fA4 ;   
     217      delete[] fEnergyInterval;
     218      delete[] fA1;
     219      delete[] fA2;
     220      delete[] fA3;
     221      delete[] fA4;   
    221222}
    222223
     
    232233{
    233234   const G4MaterialTable* theMaterialTable = G4Material::GetMaterialTable();
    234    G4int i, j ;   
    235    
     235   G4int i, j;
     236 
     237      fMaterialIndex   = materialIndex;     
    236238      fDensity                = (*theMaterialTable)[materialIndex]->GetDensity();
    237239      fElectronDensity        = (*theMaterialTable)[materialIndex]->
    238                              GetElectronDensity() ;
    239 
    240       fIntervalNumber         = intNumber ;
     240                             GetElectronDensity();
     241
     242      fIntervalNumber         = intNumber;
    241243      fIntervalNumber--;
    242       //   G4cout<<fDensity<<"\t"<<fElectronDensity<<"\t"<<fIntervalNumber<<G4endl ;
     244      //   G4cout<<fDensity<<"\t"<<fElectronDensity<<"\t"<<fIntervalNumber<<G4endl;
    243245 
    244       fEnergyInterval = new G4double[fIntervalNumber+2] ;
    245       fA1             = new G4double[fIntervalNumber+2] ;
    246       fA2             = new G4double[fIntervalNumber+2] ;
    247       fA3             = new G4double[fIntervalNumber+2] ;
    248       fA4             = new G4double[fIntervalNumber+2] ;
    249 
    250       for( i = 1 ; i <= fIntervalNumber ; i++ )
     246      fEnergyInterval = new G4double[fIntervalNumber+2];
     247      fA1             = new G4double[fIntervalNumber+2];
     248      fA2             = new G4double[fIntervalNumber+2];
     249      fA3             = new G4double[fIntervalNumber+2];
     250      fA4             = new G4double[fIntervalNumber+2];
     251
     252      for( i = 1; i <= fIntervalNumber; i++ )
    251253      {
    252254         if( ( photoAbsCof[i-1][0] >= maxEnergyTransfer ) ||
    253255             i > fIntervalNumber )
    254256         {
    255             fEnergyInterval[i] = maxEnergyTransfer ;
    256             fIntervalNumber = i ;
     257            fEnergyInterval[i] = maxEnergyTransfer;
     258            fIntervalNumber = i;
    257259            break;
    258260         }
    259          fEnergyInterval[i] = photoAbsCof[i-1][0] ;
    260          fA1[i]             = photoAbsCof[i-1][1] ;
    261          fA2[i]             = photoAbsCof[i-1][2] ;
    262          fA3[i]             = photoAbsCof[i-1][3] ;
    263          fA4[i]             = photoAbsCof[i-1][4] ;
     261         fEnergyInterval[i] = photoAbsCof[i-1][0];
     262         fA1[i]             = photoAbsCof[i-1][1];
     263         fA2[i]             = photoAbsCof[i-1][2];
     264         fA3[i]             = photoAbsCof[i-1][3];
     265         fA4[i]             = photoAbsCof[i-1][4];
    264266         // G4cout<<i<<"\t"<<fEnergyInterval[i]<<"\t"<<fA1[i]<<"\t"<<fA2[i]<<"\t"
    265          //        <<fA3[i]<<"\t"<<fA4[i]<<"\t"<<G4endl ;
     267         //        <<fA3[i]<<"\t"<<fA4[i]<<"\t"<<G4endl;
    266268      }
    267269  // G4cout<<"i last = "<<i<<"; "<<"fIntervalNumber = "<<fIntervalNumber<<G4endl;   
     
    269271      {
    270272         fIntervalNumber++;
    271          fEnergyInterval[fIntervalNumber] = maxEnergyTransfer ;
     273         fEnergyInterval[fIntervalNumber] = maxEnergyTransfer;
    272274      }
    273275      for(i=1;i<=fIntervalNumber;i++)
    274276      {
    275277        //  G4cout<<i<<"\t"<<fEnergyInterval[i]<<"\t"<<fA1[i]<<"\t"<<fA2[i]<<"\t"
    276         //    <<fA3[i]<<"\t"<<fA4[i]<<"\t"<<G4endl ;
     278        //    <<fA3[i]<<"\t"<<fA4[i]<<"\t"<<G4endl;
    277279      }
    278280      // Now checking, if two borders are too close together
    279281
    280       for( i = 1 ; i < fIntervalNumber ; i++ )
     282      for( i = 1; i < fIntervalNumber; i++ )
    281283      {
    282284        if(fEnergyInterval[i+1]-fEnergyInterval[i] >
    283285           1.5*fDelta*(fEnergyInterval[i+1]+fEnergyInterval[i]))
    284286        {
    285           continue ;
     287          continue;
    286288        }
    287289        else
     
    289291          for(j=i;j<fIntervalNumber;j++)
    290292          {
    291             fEnergyInterval[j] = fEnergyInterval[j+1] ;
    292                         fA1[j] = fA1[j+1] ;
    293                         fA2[j] = fA2[j+1] ;
    294                         fA3[j] = fA3[j+1] ;
    295                         fA4[j] = fA4[j+1] ;
     293            fEnergyInterval[j] = fEnergyInterval[j+1];
     294                        fA1[j] = fA1[j+1];
     295                        fA2[j] = fA2[j+1];
     296                        fA3[j] = fA3[j+1];
     297                        fA4[j] = fA4[j+1];
    296298          }
    297           fIntervalNumber-- ;
    298           i-- ;
     299          fIntervalNumber--;
     300          i--;
    299301        }
    300302      }
     
    305307      fLorentzFactor[fRefGammaNumber]*fLorentzFactor[fRefGammaNumber] - 1;
    306308
    307       NormShift(betaGammaSqRef) ;             
    308       SplainPAI(betaGammaSqRef) ;
     309      NormShift(betaGammaSqRef);             
     310      SplainPAI(betaGammaSqRef);
    309311     
    310312      // Preparation of integral PAI cross section for input betaGammaSq
    311313   
    312       for(i = 1 ; i <= fSplineNumber ; i++)
     314      for(i = 1; i <= fSplineNumber; i++)
    313315      {
    314316         fdNdxCerenkov[i]   = PAIdNdxCerenkov(i,betaGammaSq);
     317         fdNdxMM[i]   = PAIdNdxMM(i,betaGammaSq);
    315318         fdNdxPlasmon[i]    = PAIdNdxPlasmon(i,betaGammaSq);
     319         fdNdxResonance[i]  = PAIdNdxResonance(i,betaGammaSq);
    316320         fDifPAIxSection[i] = DifPAIxSection(i,betaGammaSq);
     321
    317322         // G4cout<<i<<"; dNdxC = "<<fdNdxCerenkov[i]<<"; dNdxP = "<<fdNdxPlasmon[i]
    318323         //    <<"; dNdxPAI = "<<fDifPAIxSection[i]<<G4endl;
    319324      }
    320       IntegralCerenkov() ;
    321       IntegralPlasmon() ;
    322       IntegralPAIxSection() ;
     325      IntegralCerenkov();
     326      IntegralMM();
     327      IntegralPlasmon();
     328      IntegralResonance();
     329      IntegralPAIxSection();
    323330     
    324       delete[] fEnergyInterval ;
    325       delete[] fA1 ;
    326       delete[] fA2 ;
    327       delete[] fA3 ;
    328       delete[] fA4 ;   
     331      delete[] fEnergyInterval;
     332      delete[] fA1;
     333      delete[] fA2;
     334      delete[] fA3;
     335      delete[] fA4;   
    329336}
    330337
     
    339346   const G4MaterialTable* theMaterialTable = G4Material::GetMaterialTable();
    340347
    341    G4int i, j, numberOfElements ;   
    342    
     348   G4int i, j, numberOfElements;   
     349
     350   fMaterialIndex   = materialIndex;   
    343351   fDensity         = (*theMaterialTable)[materialIndex]->GetDensity();
    344    fElectronDensity = (*theMaterialTable)[materialIndex]->GetElectronDensity() ;
    345    numberOfElements = (*theMaterialTable)[materialIndex]->GetNumberOfElements() ;
    346 
    347    G4int* thisMaterialZ = new G4int[numberOfElements] ;
    348    
    349    for( i = 0 ; i < numberOfElements ; i++ )
     352   fElectronDensity = (*theMaterialTable)[materialIndex]->GetElectronDensity();
     353   numberOfElements = (*theMaterialTable)[materialIndex]->GetNumberOfElements();
     354
     355   G4int* thisMaterialZ = new G4int[numberOfElements];
     356   
     357   for( i = 0; i < numberOfElements; i++ )
    350358   {
    351359         thisMaterialZ[i] = (G4int)(*theMaterialTable)[materialIndex]->
    352                                       GetElement(i)->GetZ() ;
    353    }
    354    G4SandiaTable     thisMaterialSandiaTable(materialIndex) ;
     360                                      GetElement(i)->GetZ();
     361   }
     362   // fSandia = new G4SandiaTable(materialIndex);
     363   fSandia = (*theMaterialTable)[materialIndex]->
     364     GetSandiaTable();
     365   G4SandiaTable     thisMaterialSandiaTable(materialIndex);
    355366   fIntervalNumber = thisMaterialSandiaTable.SandiaIntervals
    356                            (thisMaterialZ,numberOfElements) ;   
     367                           (thisMaterialZ,numberOfElements);   
    357368   fIntervalNumber = thisMaterialSandiaTable.SandiaMixing
    358369                           ( thisMaterialZ ,
    359370                      (*theMaterialTable)[materialIndex]->GetFractionVector() ,
    360                              numberOfElements,fIntervalNumber) ;
     371                             numberOfElements,fIntervalNumber);
    361372
    362373   fIntervalNumber--;
    363374
    364       fEnergyInterval = new G4double[fIntervalNumber+2] ;
    365       fA1             = new G4double[fIntervalNumber+2] ;
    366       fA2             = new G4double[fIntervalNumber+2] ;
    367       fA3             = new G4double[fIntervalNumber+2] ;
    368       fA4             = new G4double[fIntervalNumber+2] ;
    369 
    370       for(i=1;i<=fIntervalNumber;i++)
     375      fEnergyInterval = new G4double[fIntervalNumber+2];
     376      fA1             = new G4double[fIntervalNumber+2];
     377      fA2             = new G4double[fIntervalNumber+2];
     378      fA3             = new G4double[fIntervalNumber+2];
     379      fA4             = new G4double[fIntervalNumber+2];
     380
     381      for( i = 1; i <= fIntervalNumber; i++ )
    371382      {
    372383  if((thisMaterialSandiaTable.GetPhotoAbsorpCof(i,0) >= maxEnergyTransfer) ||
    373384          i > fIntervalNumber)
    374385         {
    375             fEnergyInterval[i] = maxEnergyTransfer ;
    376             fIntervalNumber = i ;
     386            fEnergyInterval[i] = maxEnergyTransfer;
     387            fIntervalNumber = i;
    377388            break;
    378389         }
    379    fEnergyInterval[i] = thisMaterialSandiaTable.GetPhotoAbsorpCof(i,0) ;
    380    fA1[i]             = thisMaterialSandiaTable.GetPhotoAbsorpCof(i,1)*fDensity ;
    381    fA2[i]             = thisMaterialSandiaTable.GetPhotoAbsorpCof(i,2)*fDensity ;
    382    fA3[i]             = thisMaterialSandiaTable.GetPhotoAbsorpCof(i,3)*fDensity ;
    383    fA4[i]             = thisMaterialSandiaTable.GetPhotoAbsorpCof(i,4)*fDensity ;
     390   fEnergyInterval[i] = thisMaterialSandiaTable.GetPhotoAbsorpCof(i,0);
     391   fA1[i]             = thisMaterialSandiaTable.GetPhotoAbsorpCof(i,1)*fDensity;
     392   fA2[i]             = thisMaterialSandiaTable.GetPhotoAbsorpCof(i,2)*fDensity;
     393   fA3[i]             = thisMaterialSandiaTable.GetPhotoAbsorpCof(i,3)*fDensity;
     394   fA4[i]             = thisMaterialSandiaTable.GetPhotoAbsorpCof(i,4)*fDensity;
    384395
    385396      }   
     
    387398      {
    388399         fIntervalNumber++;
    389          fEnergyInterval[fIntervalNumber] = maxEnergyTransfer ;
    390          fA1[fIntervalNumber] = fA1[fIntervalNumber-1] ;
    391          fA2[fIntervalNumber] = fA2[fIntervalNumber-1] ;
    392          fA3[fIntervalNumber] = fA3[fIntervalNumber-1] ;
    393          fA4[fIntervalNumber] = fA4[fIntervalNumber-1] ;
     400         fEnergyInterval[fIntervalNumber] = maxEnergyTransfer;
     401         fA1[fIntervalNumber] = fA1[fIntervalNumber-1];
     402         fA2[fIntervalNumber] = fA2[fIntervalNumber-1];
     403         fA3[fIntervalNumber] = fA3[fIntervalNumber-1];
     404         fA4[fIntervalNumber] = fA4[fIntervalNumber-1];
    394405      }
    395406      for(i=1;i<=fIntervalNumber;i++)
    396407      {
    397408        // G4cout<<fEnergyInterval[i]<<"\t"<<fA1[i]<<"\t"<<fA2[i]<<"\t"
    398         //   <<fA3[i]<<"\t"<<fA4[i]<<"\t"<<G4endl ;
     409        //   <<fA3[i]<<"\t"<<fA4[i]<<"\t"<<G4endl;
    399410      }
    400411      // Now checking, if two borders are too close together
    401412
    402       for(i=1;i<fIntervalNumber;i++)
     413      for( i = 1; i < fIntervalNumber; i++ )
    403414      {
    404415        if(fEnergyInterval[i+1]-fEnergyInterval[i] >
    405416           1.5*fDelta*(fEnergyInterval[i+1]+fEnergyInterval[i]))
    406417        {
    407           continue ;
     418          continue;
    408419        }
    409420        else
    410421        {
    411           for(j=i;j<fIntervalNumber;j++)
     422          for( j = i; j < fIntervalNumber; j++ )
    412423          {
    413             fEnergyInterval[j] = fEnergyInterval[j+1] ;
    414                         fA1[j] = fA1[j+1] ;
    415                         fA2[j] = fA2[j+1] ;
    416                         fA3[j] = fA3[j+1] ;
    417                         fA4[j] = fA4[j+1] ;
     424            fEnergyInterval[j] = fEnergyInterval[j+1];
     425                        fA1[j] = fA1[j+1];
     426                        fA2[j] = fA2[j+1];
     427                        fA3[j] = fA3[j+1];
     428                        fA4[j] = fA4[j+1];
    418429          }
    419           fIntervalNumber-- ;
    420           i-- ;
     430          fIntervalNumber--;
     431          i--;
    421432        }
    422433      }
    423434
    424435      /* *********************************
    425       fSplineEnergy          = new G4double[fMaxSplineSize] ;   
    426       fRePartDielectricConst = new G4double[fMaxSplineSize] ;   
    427       fImPartDielectricConst = new G4double[fMaxSplineSize] ;   
    428       fIntegralTerm          = new G4double[fMaxSplineSize] ;   
    429       fDifPAIxSection        = new G4double[fMaxSplineSize] ;   
    430       fIntegralPAIxSection   = new G4double[fMaxSplineSize] ;   
     436      fSplineEnergy          = new G4double[fMaxSplineSize];   
     437      fRePartDielectricConst = new G4double[fMaxSplineSize];   
     438      fImPartDielectricConst = new G4double[fMaxSplineSize];   
     439      fIntegralTerm          = new G4double[fMaxSplineSize];   
     440      fDifPAIxSection        = new G4double[fMaxSplineSize];   
     441      fIntegralPAIxSection   = new G4double[fMaxSplineSize];   
    431442     
    432443      for(i=0;i<fMaxSplineSize;i++)
    433444      {
    434          fSplineEnergy[i]          = 0.0 ;   
    435          fRePartDielectricConst[i] = 0.0 ;   
    436          fImPartDielectricConst[i] = 0.0 ;   
    437          fIntegralTerm[i]          = 0.0 ;   
    438          fDifPAIxSection[i]        = 0.0 ;   
    439          fIntegralPAIxSection[i]   = 0.0 ;   
     445         fSplineEnergy[i]          = 0.0;   
     446         fRePartDielectricConst[i] = 0.0;   
     447         fImPartDielectricConst[i] = 0.0;   
     448         fIntegralTerm[i]          = 0.0;   
     449         fDifPAIxSection[i]        = 0.0;   
     450         fIntegralPAIxSection[i]   = 0.0;   
    440451      }
    441452      */ ////////////////////////
     
    446457      fLorentzFactor[fRefGammaNumber]*fLorentzFactor[fRefGammaNumber] - 1;
    447458
    448       NormShift(betaGammaSqRef) ;             
    449       SplainPAI(betaGammaSqRef) ;
     459      NormShift(betaGammaSqRef);             
     460      SplainPAI(betaGammaSqRef);
    450461     
    451462      // Preparation of integral PAI cross section for input betaGammaSq
    452463   
    453       for(i = 1 ; i <= fSplineNumber ; i++)
     464      for(i = 1; i <= fSplineNumber; i++)
    454465      {
    455466         fDifPAIxSection[i] = DifPAIxSection(i,betaGammaSq);
    456467         fdNdxCerenkov[i]   = PAIdNdxCerenkov(i,betaGammaSq);
     468         fdNdxMM[i]   = PAIdNdxMM(i,betaGammaSq);
    457469         fdNdxPlasmon[i]    = PAIdNdxPlasmon(i,betaGammaSq);
    458       }
    459       IntegralPAIxSection() ;
    460       IntegralCerenkov() ;
    461       IntegralPlasmon() ;
     470         fdNdxResonance[i]  = PAIdNdxResonance(i,betaGammaSq);
     471      }
     472      IntegralPAIxSection();
     473      IntegralCerenkov();
     474      IntegralMM();
     475      IntegralPlasmon();
     476      IntegralResonance();
    462477     
    463       //   delete[] fEnergyInterval ;
    464       delete[] fA1 ;
    465       delete[] fA2 ;
    466       delete[] fA3 ;
    467       delete[] fA4 ;   
     478      //   delete[] fEnergyInterval;
     479      delete[] fA1;
     480      delete[] fA2;
     481      delete[] fA3;
     482      delete[] fA4;   
    468483}
    469484
     
    476491{
    477492   /* ************************
    478    delete[] fSplineEnergy          ;   
    479    delete[] fRePartDielectricConst ;   
    480    delete[] fImPartDielectricConst ;   
    481    delete[] fIntegralTerm          ;   
    482    delete[] fDifPAIxSection        ;   
    483    delete[] fIntegralPAIxSection   ;
     493   delete[] fSplineEnergy         ;   
     494   delete[] fRePartDielectricConst;   
     495   delete[] fImPartDielectricConst;   
     496   delete[] fIntegralTerm         ;   
     497   delete[] fDifPAIxSection       ;   
     498   delete[] fIntegralPAIxSection  ;
    484499   */ ////////////////////////
    485500}
     
    492507void G4PAIxSection::InitPAI()
    493508{   
    494    G4int i ;
     509   G4int i;
    495510   G4double betaGammaSq = fLorentzFactor[fRefGammaNumber]*
    496511                          fLorentzFactor[fRefGammaNumber] - 1;
     
    498513   // Preparation of integral PAI cross section for reference gamma
    499514   
    500    NormShift(betaGammaSq) ;             
    501    SplainPAI(betaGammaSq) ;
    502 
    503    IntegralPAIxSection() ;
    504    IntegralCerenkov() ;
    505    IntegralPlasmon() ;
    506 
    507    for(i = 0 ; i<=fSplineNumber ; i++)
    508    {
    509       fPAItable[i][fRefGammaNumber] = fIntegralPAIxSection[i] ;
     515   NormShift(betaGammaSq);             
     516   SplainPAI(betaGammaSq);
     517
     518   IntegralPAIxSection();
     519   IntegralCerenkov();
     520   IntegralMM();
     521   IntegralPlasmon();
     522   IntegralResonance();
     523
     524   for(i = 0; i<= fSplineNumber; i++)
     525   {
     526      fPAItable[i][fRefGammaNumber] = fIntegralPAIxSection[i];
    510527      if(i != 0)
    511528      {
    512          fPAItable[i][0] = fSplineEnergy[i] ;
    513       }
    514    }
    515    fPAItable[0][0] = fSplineNumber ;
    516    
    517    for(G4int j = 1 ; j < 112 ; j++)       // for other gammas
    518    {
    519       if( j == fRefGammaNumber ) continue ;
     529         fPAItable[i][0] = fSplineEnergy[i];
     530      }
     531   }
     532   fPAItable[0][0] = fSplineNumber;
     533   
     534   for(G4int j = 1; j < 112; j++)       // for other gammas
     535   {
     536      if( j == fRefGammaNumber ) continue;
    520537     
    521       betaGammaSq = fLorentzFactor[j]*fLorentzFactor[j] - 1 ;
     538      betaGammaSq = fLorentzFactor[j]*fLorentzFactor[j] - 1;
    522539     
    523       for(i = 1 ; i <= fSplineNumber ; i++)
     540      for(i = 1; i <= fSplineNumber; i++)
    524541      {
    525542         fDifPAIxSection[i] = DifPAIxSection(i,betaGammaSq);
    526543         fdNdxCerenkov[i]   = PAIdNdxCerenkov(i,betaGammaSq);
     544         fdNdxMM[i]   = PAIdNdxMM(i,betaGammaSq);
    527545         fdNdxPlasmon[i]    = PAIdNdxPlasmon(i,betaGammaSq);
    528       }
    529       IntegralPAIxSection() ;
    530       IntegralCerenkov() ;
    531       IntegralPlasmon() ;
     546         fdNdxResonance[i]  = PAIdNdxResonance(i,betaGammaSq);
     547      }
     548      IntegralPAIxSection();
     549      IntegralCerenkov();
     550      IntegralMM();
     551      IntegralPlasmon();
     552      IntegralResonance();
    532553     
    533       for(i = 0 ; i <= fSplineNumber ; i++)
    534       {
    535          fPAItable[i][j] = fIntegralPAIxSection[i] ;
     554      for(i = 0; i <= fSplineNumber; i++)
     555      {
     556         fPAItable[i][j] = fIntegralPAIxSection[i];
    536557      }
    537558   }
     
    546567void G4PAIxSection::NormShift(G4double betaGammaSq)
    547568{
    548   G4int i, j ;
    549 
    550   for( i = 1 ; i <= fIntervalNumber-1 ; i++ )
    551   {
    552     for( j = 1 ; j <= 2 ; j++ )
     569  G4int i, j;
     570
     571  for( i = 1; i <= fIntervalNumber-1; i++ )
     572  {
     573    for( j = 1; j <= 2; j++ )
    553574    {
    554       fSplineNumber = (i-1)*2 + j ;
     575      fSplineNumber = (i-1)*2 + j;
    555576
    556577      if( j == 1 ) fSplineEnergy[fSplineNumber] = fEnergyInterval[i  ]*(1+fDelta);
     
    562583  fIntegralTerm[1]=RutherfordIntegral(1,fEnergyInterval[1],fSplineEnergy[1]);
    563584
    564   j = 1 ;
    565 
    566   for(i=2;i<=fSplineNumber;i++)
     585  j = 1;
     586
     587  for( i = 2; i <= fSplineNumber; i++ )
    567588  {
    568589    if(fSplineEnergy[i]<fEnergyInterval[j+1])
     
    570591         fIntegralTerm[i] = fIntegralTerm[i-1] +
    571592                            RutherfordIntegral(j,fSplineEnergy[i-1],
    572                                                  fSplineEnergy[i]   ) ;
     593                                                 fSplineEnergy[i]   );
    573594    }
    574595    else
    575596    {
    576597       G4double x = RutherfordIntegral(j,fSplineEnergy[i-1],
    577                                            fEnergyInterval[j+1]   ) ;
     598                                           fEnergyInterval[j+1]   );
    578599         j++;
    579600         fIntegralTerm[i] = fIntegralTerm[i-1] + x +
    580601                            RutherfordIntegral(j,fEnergyInterval[j],
    581                                                  fSplineEnergy[i]    ) ;
     602                                                 fSplineEnergy[i]    );
    582603    }
    583604    // G4cout<<i<<"\t"<<fSplineEnergy[i]<<"\t"<<fIntegralTerm[i]<<"\n"<<G4endl;
    584605  }
    585   fNormalizationCof = 2*pi*pi*hbarc*hbarc*fine_structure_const/electron_mass_c2 ;
    586   fNormalizationCof *= fElectronDensity/fIntegralTerm[fSplineNumber] ;
    587 
    588   // G4cout<<"fNormalizationCof = "<<fNormalizationCof<<G4endl ;
     606  fNormalizationCof = 2*pi*pi*hbarc*hbarc*fine_structure_const/electron_mass_c2;
     607  fNormalizationCof *= fElectronDensity/fIntegralTerm[fSplineNumber];
     608
     609  // G4cout<<"fNormalizationCof = "<<fNormalizationCof<<G4endl;
    589610
    590611          // Calculation of PAI differrential cross-section (1/(keV*cm))
    591612          // in the energy points near borders of energy intervals
    592613
    593    for(G4int k=1;k<=fIntervalNumber-1;k++)
    594    {
    595       for(j=1;j<=2;j++)
    596       {
    597          i = (k-1)*2 + j ;
     614   for(G4int k = 1; k <= fIntervalNumber-1; k++ )
     615   {
     616      for( j = 1; j <= 2; j++ )
     617      {
     618         i = (k-1)*2 + j;
    598619         fImPartDielectricConst[i] = fNormalizationCof*
    599620                                     ImPartDielectricConst(k,fSplineEnergy[i]);
     
    604625         fDifPAIxSection[i] = DifPAIxSection(i,betaGammaSq);
    605626         fdNdxCerenkov[i]   = PAIdNdxCerenkov(i,betaGammaSq);
     627         fdNdxMM[i]   = PAIdNdxMM(i,betaGammaSq);
    606628         fdNdxPlasmon[i]    = PAIdNdxPlasmon(i,betaGammaSq);
     629         fdNdxResonance[i]    = PAIdNdxResonance(i,betaGammaSq);
    607630      }
    608631   }
     
    616639// linear approximation would be smaller than 'fError'
    617640
    618 void
    619    G4PAIxSection::SplainPAI(G4double betaGammaSq)
     641void G4PAIxSection::SplainPAI(G4double betaGammaSq)
    620642{
    621    G4int k = 1 ;
    622    G4int i = 1 ;
     643   G4int k = 1;
     644   G4int i = 1;
    623645
    624646   while ( (i < fSplineNumber) && (fSplineNumber < fMaxSplineSize-1) )
     
    626648      if(fSplineEnergy[i+1] > fEnergyInterval[k+1])
    627649      {
    628           k++ ;   // Here next energy point is in next energy interval
     650          k++;   // Here next energy point is in next energy interval
    629651          i++;
    630652          continue;
     
    634656      fSplineNumber++;
    635657
    636       for(G4int j = fSplineNumber; j >= i+2 ; j-- )
     658      for(G4int j = fSplineNumber; j >= i+2; j-- )
    637659      {
    638660         fSplineEnergy[j]          = fSplineEnergy[j-1];
     
    643665         fDifPAIxSection[j] = fDifPAIxSection[j-1];
    644666         fdNdxCerenkov[j]   = fdNdxCerenkov[j-1];
     667         fdNdxMM[j]   = fdNdxMM[j-1];
    645668         fdNdxPlasmon[j]    = fdNdxPlasmon[j-1];
     669         fdNdxResonance[j]  = fdNdxResonance[j-1];
    646670      }
    647671      G4double x1  = fSplineEnergy[i];
     
    658682      G4double a = log10(y2/yy1)/log10(x2/x1);
    659683      G4double b = log10(yy1) - a*log10(x1);
    660       G4double y = a*log10(en1) + b ;
     684      G4double y = a*log10(en1) + b;
    661685      y = pow(10.,y);
    662686
     
    673697      fDifPAIxSection[i+1] = DifPAIxSection(i+1,betaGammaSq);
    674698      fdNdxCerenkov[i+1]   = PAIdNdxCerenkov(i+1,betaGammaSq);
     699      fdNdxMM[i+1]   = PAIdNdxMM(i+1,betaGammaSq);
    675700      fdNdxPlasmon[i+1]    = PAIdNdxPlasmon(i+1,betaGammaSq);
     701      fdNdxResonance[i+1]  = PAIdNdxResonance(i+1,betaGammaSq);
    676702
    677703                  // Condition for next division of this segment or to pass
     
    682708      if( x < 0 )
    683709      {
    684          x = -x ;
     710         x = -x;
    685711      }
    686712      if( x > fError && fSplineNumber < fMaxSplineSize-1 )
     
    704730                                            G4double x2   )
    705731{
    706    G4double  c1, c2, c3 ;
     732   G4double  c1, c2, c3;
    707733   // G4cout<<"RI: x1 = "<<x1<<"; "<<"x2 = "<<x2<<G4endl;   
    708    c1 = (x2 - x1)/x1/x2 ;
    709    c2 = (x2 - x1)*(x2 + x1)/x1/x1/x2/x2 ;
    710    c3 = (x2 - x1)*(x1*x1 + x1*x2 + x2*x2)/x1/x1/x1/x2/x2/x2 ;
     734   c1 = (x2 - x1)/x1/x2;
     735   c2 = (x2 - x1)*(x2 + x1)/x1/x1/x2/x2;
     736   c3 = (x2 - x1)*(x1*x1 + x1*x2 + x2*x2)/x1/x1/x1/x2/x2/x2;
    711737   // G4cout<<" RI: c1 = "<<c1<<"; "<<"c2 = "<<c2<<"; "<<"c3 = "<<c3<<G4endl;   
    712738   
    713    return  fA1[k]*log(x2/x1) + fA2[k]*c1 + fA3[k]*c2/2 + fA4[k]*c3/3 ;
     739   return  fA1[k]*log(x2/x1) + fA2[k]*c1 + fA3[k]*c2/2 + fA4[k]*c3/3;
    714740
    715741}   // end of RutherfordIntegral
     
    730756   energy4 = energy3*energy1;
    731757   
    732    result = fA1[k]/energy1+fA2[k]/energy2+fA3[k]/energy3+fA4[k]/energy4 
    733    result *=hbarc/energy1 ;
    734    
    735    return result ;
     758   result = fA1[k]/energy1+fA2[k]/energy2+fA3[k]/energy3+fA4[k]/energy4
     759   result *=hbarc/energy1;
     760   
     761   return result;
    736762
    737763}  // end of ImPartDielectricConst
    738764
     765/////////////////////////////////////////////////////////////////
     766//
     767// Returns lambda of photon with energy1 in current material
     768
     769G4double G4PAIxSection::GetPhotonRange( G4double energy1 )
     770{
     771  G4int i;
     772  G4double energy2, energy3, energy4, result, lambda;
     773
     774  energy2 = energy1*energy1;
     775  energy3 = energy2*energy1;
     776  energy4 = energy3*energy1;
     777
     778  // G4double* SandiaCof = fSandia->GetSandiaCofForMaterialPAI(energy1);
     779  // result = SandiaCof[0]/energy1+SandiaCof[1]/energy2+SandiaCof[2]/energy3+SandiaCof[3]/energy4;
     780  // result *= fDensity;
     781
     782  for( i = 1; i <= fIntervalNumber; i++ )
     783  {
     784     if( energy1 < fEnergyInterval[i]) break;
     785  }
     786  i--;
     787  if(i == 0) i = 1;
     788
     789  result = fA1[i]/energy1+fA2[i]/energy2+fA3[i]/energy3+fA4[i]/energy4; 
     790
     791  if( result > DBL_MIN ) lambda = 1./result;
     792  else                   lambda = DBL_MAX;
     793   
     794  return lambda;
     795
     796
     797/////////////////////////////////////////////////////////////////
     798//
     799// Return lambda of electron with energy1 in current material
     800// parametrisation from NIM A554(2005)474-493
     801
     802G4double G4PAIxSection::GetElectronRange( G4double energy )
     803{
     804  G4double range;
     805  /*
     806  const G4MaterialTable* theMaterialTable = G4Material::GetMaterialTable();
     807
     808  G4double Z = (*theMaterialTable)[fMaterialIndex]->GetIonisation()->GetZeffective();
     809  G4double A = (*theMaterialTable)[fMaterialIndex]->GetA();
     810
     811  energy /= keV; // energy in keV in parametrised formula
     812
     813  if (energy < 10.)
     814  {
     815    range = 3.872e-3*A/Z;
     816    range *= pow(energy,1.492);
     817  }
     818  else
     819  {
     820    range = 6.97e-3*pow(energy,1.6);
     821  }
     822  */
     823  // Blum&Rolandi Particle Detection with Drift Chambers, p. 7
     824
     825  G4double cofA = 5.37e-4*g/cm2/keV;
     826  G4double cofB = 0.9815;
     827  G4double cofC = 3.123e-3/keV;
     828  // energy /= keV;
     829
     830  range = cofA*energy*( 1 - cofB/(1 + cofC*energy) );
     831
     832  // range *= g/cm2;
     833  range /= fDensity;
     834
     835  return range;
     836}
    739837
    740838//////////////////////////////////////////////////////////////////////////////
     
    747845{       
    748846   G4double x0, x02, x03, x04, x05, x1, x2, xx1 ,xx2 , xx12,
    749             c1, c2, c3, cof1, cof2, xln1, xln2, xln3, result ;
    750 
    751    x0 = enb ;
    752    result = 0 ;
     847            c1, c2, c3, cof1, cof2, xln1, xln2, xln3, result;
     848
     849   x0 = enb;
     850   result = 0;
    753851   
    754852   for(G4int i=1;i<=fIntervalNumber-1;i++)
    755853   {
    756       x1 = fEnergyInterval[i] ;
    757       x2 = fEnergyInterval[i+1] ;
    758       xx1 = x1 - x0 ;
    759       xx2 = x2 - x0 ;
    760       xx12 = xx2/xx1 ;
     854      x1 = fEnergyInterval[i];
     855      x2 = fEnergyInterval[i+1];
     856      xx1 = x1 - x0;
     857      xx2 = x2 - x0;
     858      xx12 = xx2/xx1;
    761859     
    762860      if(xx12<0)
     
    764862         xx12 = -xx12;
    765863      }
    766       xln1 = log(x2/x1) ;
    767       xln2 = log(xx12) ;
    768       xln3 = log((x2 + x0)/(x1 + x0)) ;
    769       x02 = x0*x0 ;
    770       x03 = x02*x0 ;
    771       x04 = x03*x0 ;
     864      xln1 = log(x2/x1);
     865      xln2 = log(xx12);
     866      xln3 = log((x2 + x0)/(x1 + x0));
     867      x02 = x0*x0;
     868      x03 = x02*x0;
     869      x04 = x03*x0;
    772870      x05 = x04*x0;
    773       c1  = (x2 - x1)/x1/x2 ;
    774       c2  = (x2 - x1)*(x2 +x1)/x1/x1/x2/x2 ;
    775       c3  = (x2 -x1)*(x1*x1 + x1*x2 + x2*x2)/x1/x1/x1/x2/x2/x2 ;
    776 
    777       result -= (fA1[i]/x02 + fA3[i]/x04)*xln1 ;
    778       result -= (fA2[i]/x02 + fA4[i]/x04)*c1 ;
    779       result -= fA3[i]*c2/2/x02 ;
    780       result -= fA4[i]*c3/3/x02 ;
    781 
    782       cof1 = fA1[i]/x02 + fA3[i]/x04 ;
    783       cof2 = fA2[i]/x03 + fA4[i]/x05 ;
    784 
    785       result += 0.5*(cof1 +cof2)*xln2 ;
    786       result += 0.5*(cof1 - cof2)*xln3 ;
     871      c1  = (x2 - x1)/x1/x2;
     872      c2  = (x2 - x1)*(x2 +x1)/x1/x1/x2/x2;
     873      c3  = (x2 -x1)*(x1*x1 + x1*x2 + x2*x2)/x1/x1/x1/x2/x2/x2;
     874
     875      result -= (fA1[i]/x02 + fA3[i]/x04)*xln1;
     876      result -= (fA2[i]/x02 + fA4[i]/x04)*c1;
     877      result -= fA3[i]*c2/2/x02;
     878      result -= fA4[i]*c3/3/x02;
     879
     880      cof1 = fA1[i]/x02 + fA3[i]/x04;
     881      cof2 = fA2[i]/x03 + fA4[i]/x05;
     882
     883      result += 0.5*(cof1 +cof2)*xln2;
     884      result += 0.5*(cof1 - cof2)*xln3;
    787885   }
    788    result *= 2*hbarc/pi ;
    789    
    790    return result ;
     886   result *= 2*hbarc/pi;
     887   
     888   return result;
    791889
    792890}   // end of RePartDielectricConst
     
    801899                                        G4double betaGammaSq  )
    802900{       
    803    G4double be2,cof,x1,x2,x3,x4,x5,x6,x7,x8,result ;
    804    //G4double beta, be4 ;
    805    G4double be4 ;
    806    G4double betaBohr2 = fine_structure_const*fine_structure_const ;
    807    G4double betaBohr4 = betaBohr2*betaBohr2*4.0 ;
    808    be2 = betaGammaSq/(1 + betaGammaSq) ;
    809    be4 = be2*be2 ;
    810    //  beta = sqrt(be2) ;
    811    cof = 1 ;
    812    x1 = log(2*electron_mass_c2/fSplineEnergy[i]) ;
    813 
    814    if( betaGammaSq < 0.01 ) x2 = log(be2) ;
     901   G4double be2,cof,x1,x2,x3,x4,x5,x6,x7,x8,result;
     902   //G4double beta, be4;
     903   G4double be4;
     904   G4double betaBohr2 = fine_structure_const*fine_structure_const;
     905   G4double betaBohr4 = betaBohr2*betaBohr2*4.0;
     906   be2 = betaGammaSq/(1 + betaGammaSq);
     907   be4 = be2*be2;
     908   //  beta = sqrt(be2);
     909   cof = 1;
     910   x1 = log(2*electron_mass_c2/fSplineEnergy[i]);
     911
     912   if( betaGammaSq < 0.01 ) x2 = log(be2);
    815913   else
    816914   {
    817915     x2 = -log( (1/betaGammaSq - fRePartDielectricConst[i])*
    818916                (1/betaGammaSq - fRePartDielectricConst[i]) +
    819                 fImPartDielectricConst[i]*fImPartDielectricConst[i] )/2 ;
     917                fImPartDielectricConst[i]*fImPartDielectricConst[i] )/2;
    820918   }
    821919   if( fImPartDielectricConst[i] == 0.0 ||betaGammaSq < 0.01 )
    822920   {
    823      x6=0 ;
     921     x6=0;
    824922   }
    825923   else
    826924   {
    827      x3 = -fRePartDielectricConst[i] + 1/betaGammaSq ;
     925     x3 = -fRePartDielectricConst[i] + 1/betaGammaSq;
    828926     x5 = -1 - fRePartDielectricConst[i] +
    829927          be2*((1 +fRePartDielectricConst[i])*(1 + fRePartDielectricConst[i]) +
    830           fImPartDielectricConst[i]*fImPartDielectricConst[i]) ;
    831 
    832      x7 = atan2(fImPartDielectricConst[i],x3) ;
    833      x6 = x5 * x7 ;
    834    }
    835     // if(fImPartDielectricConst[i] == 0) x6 = 0 ;
    836    
    837    x4 = ((x1 + x2)*fImPartDielectricConst[i] + x6)/hbarc ;
    838    //   if( x4 < 0.0 ) x4 = 0.0 ;
     928          fImPartDielectricConst[i]*fImPartDielectricConst[i]);
     929
     930     x7 = atan2(fImPartDielectricConst[i],x3);
     931     x6 = x5 * x7;
     932   }
     933    // if(fImPartDielectricConst[i] == 0) x6 = 0;
     934   
     935   x4 = ((x1 + x2)*fImPartDielectricConst[i] + x6)/hbarc;
     936   //   if( x4 < 0.0 ) x4 = 0.0;
    839937   x8 = (1 + fRePartDielectricConst[i])*(1 + fRePartDielectricConst[i]) +
    840         fImPartDielectricConst[i]*fImPartDielectricConst[i] ;
    841 
    842    result = (x4 + cof*fIntegralTerm[i]/fSplineEnergy[i]/fSplineEnergy[i]) ;
    843    if(result < 1.0e-8) result = 1.0e-8 ;
    844    result *= fine_structure_const/be2/pi ;
    845    //   result *= (1-exp(-beta/betaBohr))*(1-exp(-beta/betaBohr)) ;
    846    //  result *= (1-exp(-be2/betaBohr2)) ;
    847    result *= (1-exp(-be4/betaBohr4)) ;
     938        fImPartDielectricConst[i]*fImPartDielectricConst[i];
     939
     940   result = (x4 + cof*fIntegralTerm[i]/fSplineEnergy[i]/fSplineEnergy[i]);
     941   if(result < 1.0e-8) result = 1.0e-8;
     942   result *= fine_structure_const/be2/pi;
     943   //   result *= (1-exp(-beta/betaBohr))*(1-exp(-beta/betaBohr));
     944   //  result *= (1-exp(-be2/betaBohr2));
     945   result *= (1-exp(-be4/betaBohr4));
    848946   if(fDensity >= 0.1)
    849947   {
    850       result /= x8 ;
    851    }
    852    return result ;
     948      result /= x8;
     949   }
     950   return result;
    853951
    854952} // end of DifPAIxSection
     
    861959                                         G4double betaGammaSq  )
    862960{       
    863    G4double cof, logarithm, x3, x5, argument, modul2, dNdxC ;
    864    G4double be2, be4, betaBohr2,betaBohr4,cofBetaBohr ;
    865 
    866    cof         = 1.0 ;
    867    cofBetaBohr = 4.0 ;
    868    betaBohr2   = fine_structure_const*fine_structure_const ;
    869    betaBohr4   = betaBohr2*betaBohr2*cofBetaBohr ;
    870 
    871    be2 = betaGammaSq/(1 + betaGammaSq) ;
    872    be4 = be2*be2 ;
    873 
    874    if( betaGammaSq < 0.01 ) logarithm = log(1.0+betaGammaSq) ; // 0.0 ;
     961   G4double logarithm, x3, x5, argument, modul2, dNdxC;
     962   G4double be2, be4, betaBohr2,betaBohr4,cofBetaBohr;
     963
     964   cofBetaBohr = 4.0;
     965   betaBohr2   = fine_structure_const*fine_structure_const;
     966   betaBohr4   = betaBohr2*betaBohr2*cofBetaBohr;
     967
     968   be2 = betaGammaSq/(1 + betaGammaSq);
     969   be4 = be2*be2;
     970
     971   if( betaGammaSq < 0.01 ) logarithm = log(1.0+betaGammaSq); // 0.0;
    875972   else
    876973   {
    877974     logarithm  = -log( (1/betaGammaSq - fRePartDielectricConst[i])*
    878975                        (1/betaGammaSq - fRePartDielectricConst[i]) +
    879                         fImPartDielectricConst[i]*fImPartDielectricConst[i] )*0.5 ;
    880      logarithm += log(1+1.0/betaGammaSq) ;
     976                        fImPartDielectricConst[i]*fImPartDielectricConst[i] )*0.5;
     977     logarithm += log(1+1.0/betaGammaSq);
    881978   }
    882979
    883980   if( fImPartDielectricConst[i] == 0.0 || betaGammaSq < 0.01 )
    884981   {
    885      argument = 0.0 ;
     982     argument = 0.0;
    886983   }
    887984   else
    888985   {
    889      x3 = -fRePartDielectricConst[i] + 1.0/betaGammaSq ;
     986     x3 = -fRePartDielectricConst[i] + 1.0/betaGammaSq;
    890987     x5 = -1.0 - fRePartDielectricConst[i] +
    891988          be2*((1.0 +fRePartDielectricConst[i])*(1.0 + fRePartDielectricConst[i]) +
    892           fImPartDielectricConst[i]*fImPartDielectricConst[i]) ;
     989          fImPartDielectricConst[i]*fImPartDielectricConst[i]);
    893990     if( x3 == 0.0 ) argument = 0.5*pi;
    894      else            argument = atan2(fImPartDielectricConst[i],x3) ;
    895      argument *= x5  ;
     991     else            argument = atan2(fImPartDielectricConst[i],x3);
     992     argument *= x5 ;
    896993   }   
    897    dNdxC = ( logarithm*fImPartDielectricConst[i] + argument )/hbarc ;
     994   dNdxC = ( logarithm*fImPartDielectricConst[i] + argument )/hbarc;
    898995 
    899    if(dNdxC < 1.0e-8) dNdxC = 1.0e-8 ;
    900 
    901    dNdxC *= fine_structure_const/be2/pi ;
    902 
    903    dNdxC *= (1-exp(-be4/betaBohr4)) ;
     996   if(dNdxC < 1.0e-8) dNdxC = 1.0e-8;
     997
     998   dNdxC *= fine_structure_const/be2/pi;
     999
     1000   dNdxC *= (1-exp(-be4/betaBohr4));
    9041001
    9051002   if(fDensity >= 0.1)
    9061003   {
    9071004      modul2 = (1.0 + fRePartDielectricConst[i])*(1.0 + fRePartDielectricConst[i]) +
    908                     fImPartDielectricConst[i]*fImPartDielectricConst[i] ;
    909       dNdxC /= modul2 ;
    910    }
    911    return dNdxC ;
     1005                    fImPartDielectricConst[i]*fImPartDielectricConst[i];
     1006      dNdxC /= modul2;
     1007   }
     1008   return dNdxC;
    9121009
    9131010} // end of PAIdNdxCerenkov
     1011
     1012//////////////////////////////////////////////////////////////////////////
     1013//
     1014// Calculation od dN/dx of collisions of MM with creation of Cerenkov pseudo-photons
     1015
     1016G4double G4PAIxSection::PAIdNdxMM( G4int    i ,
     1017                                         G4double betaGammaSq  )
     1018{       
     1019   G4double logarithm, x3, x5, argument, dNdxC;
     1020   G4double be2, be4, betaBohr2,betaBohr4,cofBetaBohr;
     1021
     1022   cofBetaBohr = 4.0;
     1023   betaBohr2   = fine_structure_const*fine_structure_const;
     1024   betaBohr4   = betaBohr2*betaBohr2*cofBetaBohr;
     1025
     1026   be2 = betaGammaSq/(1 + betaGammaSq);
     1027   be4 = be2*be2;
     1028
     1029   if( betaGammaSq < 0.01 ) logarithm = log(1.0+betaGammaSq); // 0.0;
     1030   else
     1031   {
     1032     logarithm  = -log( (1/betaGammaSq - fRePartDielectricConst[i])*
     1033                        (1/betaGammaSq - fRePartDielectricConst[i]) +
     1034                        fImPartDielectricConst[i]*fImPartDielectricConst[i] )*0.5;
     1035     logarithm += log(1+1.0/betaGammaSq);
     1036   }
     1037
     1038   if( fImPartDielectricConst[i] == 0.0 || betaGammaSq < 0.01 )
     1039   {
     1040     argument = 0.0;
     1041   }
     1042   else
     1043   {
     1044     x3 = -fRePartDielectricConst[i] + 1.0/betaGammaSq;
     1045     x5 = be2*( 1.0 + fRePartDielectricConst[i] ) - 1.0;
     1046     if( x3 == 0.0 ) argument = 0.5*pi;
     1047     else            argument = atan2(fImPartDielectricConst[i],x3);
     1048     argument *= x5 ;
     1049   }   
     1050   dNdxC = ( logarithm*fImPartDielectricConst[i]*be2 + argument )/hbarc;
     1051 
     1052   if(dNdxC < 1.0e-8) dNdxC = 1.0e-8;
     1053
     1054   dNdxC *= fine_structure_const/be2/pi;
     1055
     1056   dNdxC *= (1-exp(-be4/betaBohr4));
     1057   return dNdxC;
     1058
     1059} // end of PAIdNdxMM
    9141060
    9151061//////////////////////////////////////////////////////////////////////////
     
    9211067                                        G4double betaGammaSq  )
    9221068{       
    923    G4double cof, resonance, modul2, dNdxP ;
    924    G4double be2, be4, betaBohr2, betaBohr4, cofBetaBohr ;
    925 
    926    cof = 1 ;
    927    cofBetaBohr = 4.0 ;
    928    betaBohr2   = fine_structure_const*fine_structure_const ;
    929    betaBohr4   = betaBohr2*betaBohr2*cofBetaBohr ;
    930 
    931    be2 = betaGammaSq/(1 + betaGammaSq) ;
    932    be4 = be2*be2 ;
     1069   G4double resonance, modul2, dNdxP, cof = 1.;
     1070   G4double be2, be4, betaBohr2, betaBohr4, cofBetaBohr;
     1071
     1072 
     1073   cofBetaBohr = 4.0;
     1074   betaBohr2   = fine_structure_const*fine_structure_const;
     1075   betaBohr4   = betaBohr2*betaBohr2*cofBetaBohr;
     1076
     1077   be2 = betaGammaSq/(1 + betaGammaSq);
     1078   be4 = be2*be2;
    9331079 
    934    resonance = log(2*electron_mass_c2*be2/fSplineEnergy[i]) 
    935    resonance *= fImPartDielectricConst[i]/hbarc ;
    936 
    937 
    938    dNdxP = ( resonance + cof*fIntegralTerm[i]/fSplineEnergy[i]/fSplineEnergy[i] ) ;
    939 
    940    if( dNdxP < 1.0e-8 ) dNdxP = 1.0e-8 ;
    941 
    942    dNdxP *= fine_structure_const/be2/pi ;
    943    dNdxP *= (1-exp(-be4/betaBohr4)) ;
     1080   resonance = log(2*electron_mass_c2*be2/fSplineEnergy[i])
     1081   resonance *= fImPartDielectricConst[i]/hbarc;
     1082
     1083
     1084   dNdxP = ( resonance + cof*fIntegralTerm[i]/fSplineEnergy[i]/fSplineEnergy[i] );
     1085
     1086   if( dNdxP < 1.0e-8 ) dNdxP = 1.0e-8;
     1087
     1088   dNdxP *= fine_structure_const/be2/pi;
     1089   dNdxP *= (1-exp(-be4/betaBohr4));
    9441090
    9451091   if( fDensity >= 0.1 )
    9461092   {
    9471093     modul2 = (1 + fRePartDielectricConst[i])*(1 + fRePartDielectricConst[i]) +
    948         fImPartDielectricConst[i]*fImPartDielectricConst[i] ;
    949      dNdxP /= modul2 ;
    950    }
    951    return dNdxP ;
     1094        fImPartDielectricConst[i]*fImPartDielectricConst[i];
     1095     dNdxP /= modul2;
     1096   }
     1097   return dNdxP;
    9521098
    9531099} // end of PAIdNdxPlasmon
     1100
     1101//////////////////////////////////////////////////////////////////////////
     1102//
     1103// Calculation od dN/dx of collisions with creation of longitudinal EM
     1104// resonance excitations (plasmons, delta-electrons)
     1105
     1106G4double G4PAIxSection::PAIdNdxResonance( G4int    i ,
     1107                                        G4double betaGammaSq  )
     1108{       
     1109   G4double resonance, modul2, dNdxP;
     1110   G4double be2, be4, betaBohr2, betaBohr4, cofBetaBohr;
     1111
     1112   cofBetaBohr = 4.0;
     1113   betaBohr2   = fine_structure_const*fine_structure_const;
     1114   betaBohr4   = betaBohr2*betaBohr2*cofBetaBohr;
     1115
     1116   be2 = betaGammaSq/(1 + betaGammaSq);
     1117   be4 = be2*be2;
     1118 
     1119   resonance = log(2*electron_mass_c2*be2/fSplineEnergy[i]); 
     1120   resonance *= fImPartDielectricConst[i]/hbarc;
     1121
     1122
     1123   dNdxP = resonance;
     1124
     1125   if( dNdxP < 1.0e-8 ) dNdxP = 1.0e-8;
     1126
     1127   dNdxP *= fine_structure_const/be2/pi;
     1128   dNdxP *= (1-exp(-be4/betaBohr4));
     1129
     1130   if( fDensity >= 0.1 )
     1131   {
     1132     modul2 = (1 + fRePartDielectricConst[i])*(1 + fRePartDielectricConst[i]) +
     1133        fImPartDielectricConst[i]*fImPartDielectricConst[i];
     1134     dNdxP /= modul2;
     1135   }
     1136   return dNdxP;
     1137
     1138} // end of PAIdNdxResonance
    9541139
    9551140////////////////////////////////////////////////////////////////////////
     
    9611146void G4PAIxSection::IntegralPAIxSection()
    9621147{
    963   fIntegralPAIxSection[fSplineNumber] = 0 ;
    964   fIntegralPAIdEdx[fSplineNumber]     = 0 ;
    965   fIntegralPAIxSection[0]             = 0 ;
    966   G4int k = fIntervalNumber -1 ;
    967 
    968   for(G4int i = fSplineNumber-1 ; i >= 1 ; i--)
     1148  fIntegralPAIxSection[fSplineNumber] = 0;
     1149  fIntegralPAIdEdx[fSplineNumber]     = 0;
     1150  fIntegralPAIxSection[0]             = 0;
     1151  G4int k = fIntervalNumber -1;
     1152
     1153  for(G4int i = fSplineNumber-1; i >= 1; i--)
    9691154  {
    9701155    if(fSplineEnergy[i] >= fEnergyInterval[k])
    9711156    {
    972       fIntegralPAIxSection[i] = fIntegralPAIxSection[i+1] + SumOverInterval(i) ;
    973       fIntegralPAIdEdx[i] = fIntegralPAIdEdx[i+1] + SumOverIntervaldEdx(i) ;
     1157      fIntegralPAIxSection[i] = fIntegralPAIxSection[i+1] + SumOverInterval(i);
     1158      fIntegralPAIdEdx[i] = fIntegralPAIdEdx[i+1] + SumOverIntervaldEdx(i);
    9741159    }
    9751160    else
    9761161    {
    9771162      fIntegralPAIxSection[i] = fIntegralPAIxSection[i+1] +
    978                                    SumOverBorder(i+1,fEnergyInterval[k]) ;
     1163                                   SumOverBorder(i+1,fEnergyInterval[k]);
    9791164      fIntegralPAIdEdx[i] = fIntegralPAIdEdx[i+1] +
    980                                    SumOverBorderdEdx(i+1,fEnergyInterval[k]) ;
    981       k-- ;
     1165                                   SumOverBorderdEdx(i+1,fEnergyInterval[k]);
     1166      k--;
    9821167    }
    9831168  }
     
    9921177void G4PAIxSection::IntegralCerenkov()
    9931178{
    994   G4int i, k ;
    995    fIntegralCerenkov[fSplineNumber] = 0 ;
    996    fIntegralCerenkov[0] = 0 ;
    997    k = fIntervalNumber -1 ;
    998 
    999    for( i = fSplineNumber-1 ; i >= 1 ; i-- )
     1179  G4int i, k;
     1180   fIntegralCerenkov[fSplineNumber] = 0;
     1181   fIntegralCerenkov[0] = 0;
     1182   k = fIntervalNumber -1;
     1183
     1184   for( i = fSplineNumber-1; i >= 1; i-- )
    10001185   {
    10011186      if(fSplineEnergy[i] >= fEnergyInterval[k])
    10021187      {
    1003         fIntegralCerenkov[i] = fIntegralCerenkov[i+1] + SumOverInterCerenkov(i) ;
     1188        fIntegralCerenkov[i] = fIntegralCerenkov[i+1] + SumOverInterCerenkov(i);
    10041189        // G4cout<<"int: i = "<<i<<"; sumC = "<<fIntegralCerenkov[i]<<G4endl;
    10051190      }
     
    10071192      {
    10081193        fIntegralCerenkov[i] = fIntegralCerenkov[i+1] +
    1009                                    SumOverBordCerenkov(i+1,fEnergyInterval[k]) ;
    1010         k-- ;
     1194                                   SumOverBordCerenkov(i+1,fEnergyInterval[k]);
     1195        k--;
    10111196        // G4cout<<"bord: i = "<<i<<"; sumC = "<<fIntegralCerenkov[i]<<G4endl;
    10121197      }
     
    10141199
    10151200}   // end of IntegralCerenkov
     1201
     1202////////////////////////////////////////////////////////////////////////
     1203//
     1204// Calculation of the PAI MM-Cerenkov integral cross-section
     1205// fIntegralMM[1] = specific MM-Cerenkov ionisation, 1/cm
     1206// and fIntegralMM[0] = mean MM-Cerenkov loss per cm  in keV/cm
     1207
     1208void G4PAIxSection::IntegralMM()
     1209{
     1210  G4int i, k;
     1211   fIntegralMM[fSplineNumber] = 0;
     1212   fIntegralMM[0] = 0;
     1213   k = fIntervalNumber -1;
     1214
     1215   for( i = fSplineNumber-1; i >= 1; i-- )
     1216   {
     1217      if(fSplineEnergy[i] >= fEnergyInterval[k])
     1218      {
     1219        fIntegralMM[i] = fIntegralMM[i+1] + SumOverInterMM(i);
     1220        // G4cout<<"int: i = "<<i<<"; sumC = "<<fIntegralMM[i]<<G4endl;
     1221      }
     1222      else
     1223      {
     1224        fIntegralMM[i] = fIntegralMM[i+1] +
     1225                                   SumOverBordMM(i+1,fEnergyInterval[k]);
     1226        k--;
     1227        // G4cout<<"bord: i = "<<i<<"; sumC = "<<fIntegralMM[i]<<G4endl;
     1228      }
     1229   }
     1230
     1231}   // end of IntegralMM
    10161232
    10171233////////////////////////////////////////////////////////////////////////
     
    10231239void G4PAIxSection::IntegralPlasmon()
    10241240{
    1025    fIntegralPlasmon[fSplineNumber] = 0 ;
    1026    fIntegralPlasmon[0] = 0 ;
    1027    G4int k = fIntervalNumber -1 ;
     1241   fIntegralPlasmon[fSplineNumber] = 0;
     1242   fIntegralPlasmon[0] = 0;
     1243   G4int k = fIntervalNumber -1;
    10281244   for(G4int i=fSplineNumber-1;i>=1;i--)
    10291245   {
    10301246      if(fSplineEnergy[i] >= fEnergyInterval[k])
    10311247      {
    1032         fIntegralPlasmon[i] = fIntegralPlasmon[i+1] + SumOverInterPlasmon(i) ;
     1248        fIntegralPlasmon[i] = fIntegralPlasmon[i+1] + SumOverInterPlasmon(i);
    10331249      }
    10341250      else
    10351251      {
    10361252        fIntegralPlasmon[i] = fIntegralPlasmon[i+1] +
    1037                                    SumOverBordPlasmon(i+1,fEnergyInterval[k]) ;
    1038         k-- ;
     1253                                   SumOverBordPlasmon(i+1,fEnergyInterval[k]);
     1254        k--;
    10391255      }
    10401256   }
    10411257
    10421258}   // end of IntegralPlasmon
     1259
     1260////////////////////////////////////////////////////////////////////////
     1261//
     1262// Calculation of the PAI resonance integral cross-section
     1263// fIntegralResonance[1] = resonance primary ionisation, 1/cm
     1264// and fIntegralResonance[0] = mean resonance loss per cm  in keV/cm
     1265
     1266void G4PAIxSection::IntegralResonance()
     1267{
     1268   fIntegralResonance[fSplineNumber] = 0;
     1269   fIntegralResonance[0] = 0;
     1270   G4int k = fIntervalNumber -1;
     1271   for(G4int i=fSplineNumber-1;i>=1;i--)
     1272   {
     1273      if(fSplineEnergy[i] >= fEnergyInterval[k])
     1274      {
     1275        fIntegralResonance[i] = fIntegralResonance[i+1] + SumOverInterResonance(i);
     1276      }
     1277      else
     1278      {
     1279        fIntegralResonance[i] = fIntegralResonance[i+1] +
     1280                                   SumOverBordResonance(i+1,fEnergyInterval[k]);
     1281        k--;
     1282      }
     1283   }
     1284
     1285}   // end of IntegralResonance
    10431286
    10441287//////////////////////////////////////////////////////////////////////
     
    10501293G4double G4PAIxSection::SumOverInterval( G4int i )
    10511294{         
    1052    G4double x0,x1,y0,yy1,a,b,c,result ;
    1053 
    1054    x0 = fSplineEnergy[i] ;
    1055    x1 = fSplineEnergy[i+1] ;
    1056    y0 = fDifPAIxSection[i] ;
     1295   G4double x0,x1,y0,yy1,a,b,c,result;
     1296
     1297   x0 = fSplineEnergy[i];
     1298   x1 = fSplineEnergy[i+1];
     1299   y0 = fDifPAIxSection[i];
    10571300   yy1 = fDifPAIxSection[i+1];
    10581301   c = x1/x0;
    1059    a = log10(yy1/y0)/log10(c) ;
    1060    // b = log10(y0) - a*log10(x0) ;
    1061    b = y0/pow(x0,a) ;
    1062    a += 1 ;
     1302   a = log10(yy1/y0)/log10(c);
     1303   // b = log10(y0) - a*log10(x0);
     1304   b = y0/pow(x0,a);
     1305   a += 1;
    10631306   if(a == 0)
    10641307   {
    1065       result = b*log(x1/x0) ;
     1308      result = b*log(x1/x0);
    10661309   }
    10671310   else
    10681311   {
    1069       result = y0*(x1*pow(c,a-1) - x0)/a ;
     1312      result = y0*(x1*pow(c,a-1) - x0)/a;
    10701313   }
    10711314   a++;
    10721315   if(a == 0)
    10731316   {
    1074       fIntegralPAIxSection[0] += b*log(x1/x0) ;
     1317      fIntegralPAIxSection[0] += b*log(x1/x0);
    10751318   }
    10761319   else
    10771320   {
    1078       fIntegralPAIxSection[0] += y0*(x1*x1*pow(c,a-2) - x0*x0)/a ;
    1079    }
    1080    return result ;
     1321      fIntegralPAIxSection[0] += y0*(x1*x1*pow(c,a-2) - x0*x0)/a;
     1322   }
     1323   return result;
    10811324
    10821325} //  end of SumOverInterval
     
    10861329G4double G4PAIxSection::SumOverIntervaldEdx( G4int i )
    10871330{         
    1088    G4double x0,x1,y0,yy1,a,b,c,result ;
    1089 
    1090    x0 = fSplineEnergy[i] ;
    1091    x1 = fSplineEnergy[i+1] ;
    1092    y0 = fDifPAIxSection[i] ;
     1331   G4double x0,x1,y0,yy1,a,b,c,result;
     1332
     1333   x0 = fSplineEnergy[i];
     1334   x1 = fSplineEnergy[i+1];
     1335   y0 = fDifPAIxSection[i];
    10931336   yy1 = fDifPAIxSection[i+1];
    10941337   c = x1/x0;
    1095    a = log10(yy1/y0)/log10(c) ;
    1096    // b = log10(y0) - a*log10(x0) ;
    1097    b = y0/pow(x0,a) ;
    1098    a += 2 ;
     1338   a = log10(yy1/y0)/log10(c);
     1339   // b = log10(y0) - a*log10(x0);
     1340   b = y0/pow(x0,a);
     1341   a += 2;
    10991342   if(a == 0)
    11001343   {
    1101      result = b*log(x1/x0) ;
     1344     result = b*log(x1/x0);
    11021345   }
    11031346   else
    11041347   {
    1105      result = y0*(x1*x1*pow(c,a-2) - x0*x0)/a ;
    1106    }
    1107    return result ;
     1348     result = y0*(x1*x1*pow(c,a-2) - x0*x0)/a;
     1349   }
     1350   return result;
    11081351
    11091352} //  end of SumOverInterval
     
    11171360G4double G4PAIxSection::SumOverInterCerenkov( G4int i )
    11181361{         
    1119    G4double x0,x1,y0,yy1,a,b,c,result ;
    1120 
    1121    x0  = fSplineEnergy[i] ;
    1122    x1  = fSplineEnergy[i+1] ;
    1123    y0  = fdNdxCerenkov[i] ;
     1362   G4double x0,x1,y0,yy1,a,b,c,result;
     1363
     1364   x0  = fSplineEnergy[i];
     1365   x1  = fSplineEnergy[i+1];
     1366   y0  = fdNdxCerenkov[i];
    11241367   yy1 = fdNdxCerenkov[i+1];
    11251368   // G4cout<<"SumC, i = "<<i<<"; x0 ="<<x0<<"; x1 = "<<x1
     
    11271370
    11281371   c = x1/x0;
    1129    a = log10(yy1/y0)/log10(c) ;
    1130    b = y0/pow(x0,a) ;
    1131 
    1132    a += 1.0 ;
    1133    if(a == 0) result = b*log(c) ;
    1134    else       result = y0*(x1*pow(c,a-1) - x0)/a ;   
    1135    a += 1.0 ;
    1136 
    1137    if( a == 0 ) fIntegralCerenkov[0] += b*log(x1/x0) ;
    1138    else         fIntegralCerenkov[0] += y0*(x1*x1*pow(c,a-2) - x0*x0)/a ;
     1372   a = log10(yy1/y0)/log10(c);
     1373   b = y0/pow(x0,a);
     1374
     1375   a += 1.0;
     1376   if(a == 0) result = b*log(c);
     1377   else       result = y0*(x1*pow(c,a-1) - x0)/a;   
     1378   a += 1.0;
     1379
     1380   if( a == 0 ) fIntegralCerenkov[0] += b*log(x1/x0);
     1381   else         fIntegralCerenkov[0] += y0*(x1*x1*pow(c,a-2) - x0*x0)/a;
    11391382   //  G4cout<<"a = "<<a<<"; b = "<<b<<"; result = "<<result<<G4endl;   
    1140    return result ;
     1383   return result;
    11411384
    11421385} //  end of SumOverInterCerenkov
     1386
     1387//////////////////////////////////////////////////////////////////////
     1388//
     1389// Calculation the PAI MM-Cerenkov integral cross-section inside
     1390// of interval of continuous values of photo-ionisation Cerenkov
     1391// cross-section. Parameter  'i' is the number of interval.
     1392
     1393G4double G4PAIxSection::SumOverInterMM( G4int i )
     1394{         
     1395   G4double x0,x1,y0,yy1,a,b,c,result;
     1396
     1397   x0  = fSplineEnergy[i];
     1398   x1  = fSplineEnergy[i+1];
     1399   y0  = fdNdxMM[i];
     1400   yy1 = fdNdxMM[i+1];
     1401   // G4cout<<"SumC, i = "<<i<<"; x0 ="<<x0<<"; x1 = "<<x1
     1402   //   <<"; y0 = "<<y0<<"; yy1 = "<<yy1<<G4endl;
     1403
     1404   c = x1/x0;
     1405   a = log10(yy1/y0)/log10(c);
     1406   b = y0/pow(x0,a);
     1407
     1408   a += 1.0;
     1409   if(a == 0) result = b*log(c);
     1410   else       result = y0*(x1*pow(c,a-1) - x0)/a;   
     1411   a += 1.0;
     1412
     1413   if( a == 0 ) fIntegralMM[0] += b*log(x1/x0);
     1414   else         fIntegralMM[0] += y0*(x1*x1*pow(c,a-2) - x0*x0)/a;
     1415   //  G4cout<<"a = "<<a<<"; b = "<<b<<"; result = "<<result<<G4endl;   
     1416   return result;
     1417
     1418} //  end of SumOverInterMM
    11431419
    11441420//////////////////////////////////////////////////////////////////////
     
    11501426G4double G4PAIxSection::SumOverInterPlasmon( G4int i )
    11511427{         
    1152    G4double x0,x1,y0,yy1,a,b,c,result ;
    1153 
    1154    x0  = fSplineEnergy[i] ;
    1155    x1  = fSplineEnergy[i+1] ;
    1156    y0  = fdNdxPlasmon[i] ;
     1428   G4double x0,x1,y0,yy1,a,b,c,result;
     1429
     1430   x0  = fSplineEnergy[i];
     1431   x1  = fSplineEnergy[i+1];
     1432   y0  = fdNdxPlasmon[i];
    11571433   yy1 = fdNdxPlasmon[i+1];
    11581434   c =x1/x0;
    1159    a = log10(yy1/y0)/log10(c) ;
    1160    // b = log10(y0) - a*log10(x0) ;
    1161    b = y0/pow(x0,a) ;
    1162 
    1163    a += 1.0 ;
    1164    if(a == 0) result = b*log(x1/x0) ;
    1165    else       result = y0*(x1*pow(c,a-1) - x0)/a ;   
    1166    a += 1.0 ;
    1167 
    1168    if( a == 0 ) fIntegralPlasmon[0] += b*log(x1/x0) ;
    1169    else         fIntegralPlasmon[0] += y0*(x1*x1*pow(c,a-2) - x0*x0)/a ;
    1170    
    1171    return result ;
     1435   a = log10(yy1/y0)/log10(c);
     1436   // b = log10(y0) - a*log10(x0);
     1437   b = y0/pow(x0,a);
     1438
     1439   a += 1.0;
     1440   if(a == 0) result = b*log(x1/x0);
     1441   else       result = y0*(x1*pow(c,a-1) - x0)/a;   
     1442   a += 1.0;
     1443
     1444   if( a == 0 ) fIntegralPlasmon[0] += b*log(x1/x0);
     1445   else         fIntegralPlasmon[0] += y0*(x1*x1*pow(c,a-2) - x0*x0)/a;
     1446   
     1447   return result;
    11721448
    11731449} //  end of SumOverInterPlasmon
     1450
     1451//////////////////////////////////////////////////////////////////////
     1452//
     1453// Calculation the PAI resonance integral cross-section inside
     1454// of interval of continuous values of photo-ionisation resonance
     1455// cross-section. Parameter  'i' is the number of interval.
     1456
     1457G4double G4PAIxSection::SumOverInterResonance( G4int i )
     1458{         
     1459   G4double x0,x1,y0,yy1,a,b,c,result;
     1460
     1461   x0  = fSplineEnergy[i];
     1462   x1  = fSplineEnergy[i+1];
     1463   y0  = fdNdxResonance[i];
     1464   yy1 = fdNdxResonance[i+1];
     1465   c =x1/x0;
     1466   a = log10(yy1/y0)/log10(c);
     1467   // b = log10(y0) - a*log10(x0);
     1468   b = y0/pow(x0,a);
     1469
     1470   a += 1.0;
     1471   if(a == 0) result = b*log(x1/x0);
     1472   else       result = y0*(x1*pow(c,a-1) - x0)/a;   
     1473   a += 1.0;
     1474
     1475   if( a == 0 ) fIntegralResonance[0] += b*log(x1/x0);
     1476   else         fIntegralResonance[0] += y0*(x1*x1*pow(c,a-2) - x0*x0)/a;
     1477   
     1478   return result;
     1479
     1480} //  end of SumOverInterResonance
    11741481
    11751482///////////////////////////////////////////////////////////////////////////////
     
    11811488                                       G4double en0    )
    11821489{               
    1183    G4double x0,x1,y0,yy1,a,b,c,d,e0,result ;
    1184 
    1185    e0 = en0 ;
    1186    x0 = fSplineEnergy[i] ;
    1187    x1 = fSplineEnergy[i+1] ;
    1188    y0 = fDifPAIxSection[i] ;
    1189    yy1 = fDifPAIxSection[i+1] ;
     1490   G4double x0,x1,y0,yy1,a,b,c,d,e0,result;
     1491
     1492   e0 = en0;
     1493   x0 = fSplineEnergy[i];
     1494   x1 = fSplineEnergy[i+1];
     1495   y0 = fDifPAIxSection[i];
     1496   yy1 = fDifPAIxSection[i+1];
    11901497
    11911498   c = x1/x0;
    11921499   d = e0/x0;   
    1193    a = log10(yy1/y0)/log10(x1/x0) ;
    1194    // b0 = log10(y0) - a*log10(x0) ;
    1195    b = y0/pow(x0,a);  // pow(10.,b) ;
    1196    
    1197    a += 1 ;
     1500   a = log10(yy1/y0)/log10(x1/x0);
     1501   // b0 = log10(y0) - a*log10(x0);
     1502   b = y0/pow(x0,a);  // pow(10.,b);
     1503   
     1504   a += 1;
    11981505   if(a == 0)
    11991506   {
    1200       result = b*log(x0/e0) ;
     1507      result = b*log(x0/e0);
    12011508   }
    12021509   else
    12031510   {
    1204       result = y0*(x0 - e0*pow(d,a-1))/a ;
    1205    }
    1206    a++ ;
     1511      result = y0*(x0 - e0*pow(d,a-1))/a;
     1512   }
     1513   a++;
    12071514   if(a == 0)
    12081515   {
    1209       fIntegralPAIxSection[0] += b*log(x0/e0) ;
     1516      fIntegralPAIxSection[0] += b*log(x0/e0);
    12101517   }
    12111518   else
    12121519   {
    1213       fIntegralPAIxSection[0] += y0*(x0*x0 - e0*e0*pow(d,a-2))/a ;
    1214    }
    1215    x0 = fSplineEnergy[i - 1] ;
    1216    x1 = fSplineEnergy[i - 2] ;
    1217    y0 = fDifPAIxSection[i - 1] ;
    1218    yy1 = fDifPAIxSection[i - 2] ;
     1520      fIntegralPAIxSection[0] += y0*(x0*x0 - e0*e0*pow(d,a-2))/a;
     1521   }
     1522   x0 = fSplineEnergy[i - 1];
     1523   x1 = fSplineEnergy[i - 2];
     1524   y0 = fDifPAIxSection[i - 1];
     1525   yy1 = fDifPAIxSection[i - 2];
    12191526
    12201527   c = x1/x0;
    12211528   d = e0/x0;   
    1222    a = log10(yy1/y0)/log10(x1/x0) ;
    1223    //  b0 = log10(y0) - a*log10(x0) ;
    1224    b = y0/pow(x0,a) ;
    1225    a += 1 ;
     1529   a = log10(yy1/y0)/log10(x1/x0);
     1530   //  b0 = log10(y0) - a*log10(x0);
     1531   b = y0/pow(x0,a);
     1532   a += 1;
    12261533   if(a == 0)
    12271534   {
    1228       result += b*log(e0/x0) ;
     1535      result += b*log(e0/x0);
    12291536   }
    12301537   else
    12311538   {
    1232       result += y0*(e0*pow(d,a-1) - x0)/a ;
    1233    }
    1234    a++ ;
     1539      result += y0*(e0*pow(d,a-1) - x0)/a;
     1540   }
     1541   a++;
    12351542   if(a == 0)
    12361543   {
    1237       fIntegralPAIxSection[0] += b*log(e0/x0) ;
     1544      fIntegralPAIxSection[0] += b*log(e0/x0);
    12381545   }
    12391546   else
    12401547   {
    1241       fIntegralPAIxSection[0] += y0*(e0*e0*pow(d,a-2) - x0*x0)/a ;
    1242    }
    1243    return result ;
     1548      fIntegralPAIxSection[0] += y0*(e0*e0*pow(d,a-2) - x0*x0)/a;
     1549   }
     1550   return result;
    12441551
    12451552}
     
    12501557                                       G4double en0    )
    12511558{               
    1252    G4double x0,x1,y0,yy1,a,b,c,d,e0,result ;
    1253 
    1254    e0 = en0 ;
    1255    x0 = fSplineEnergy[i] ;
    1256    x1 = fSplineEnergy[i+1] ;
    1257    y0 = fDifPAIxSection[i] ;
    1258    yy1 = fDifPAIxSection[i+1] ;
     1559   G4double x0,x1,y0,yy1,a,b,c,d,e0,result;
     1560
     1561   e0 = en0;
     1562   x0 = fSplineEnergy[i];
     1563   x1 = fSplineEnergy[i+1];
     1564   y0 = fDifPAIxSection[i];
     1565   yy1 = fDifPAIxSection[i+1];
    12591566
    12601567   c = x1/x0;
    12611568   d = e0/x0;   
    1262    a = log10(yy1/y0)/log10(x1/x0) ;
    1263    // b0 = log10(y0) - a*log10(x0) ;
    1264    b = y0/pow(x0,a);  // pow(10.,b) ;
    1265    
    1266    a += 2 ;
     1569   a = log10(yy1/y0)/log10(x1/x0);
     1570   // b0 = log10(y0) - a*log10(x0);
     1571   b = y0/pow(x0,a);  // pow(10.,b);
     1572   
     1573   a += 2;
    12671574   if(a == 0)
    12681575   {
    1269       result = b*log(x0/e0) ;
     1576      result = b*log(x0/e0);
    12701577   }
    12711578   else
    12721579   {
    1273       result = y0*(x0*x0 - e0*e0*pow(d,a-2))/a ;
    1274    }
    1275    x0 = fSplineEnergy[i - 1] ;
    1276    x1 = fSplineEnergy[i - 2] ;
    1277    y0 = fDifPAIxSection[i - 1] ;
    1278    yy1 = fDifPAIxSection[i - 2] ;
     1580      result = y0*(x0*x0 - e0*e0*pow(d,a-2))/a;
     1581   }
     1582   x0 = fSplineEnergy[i - 1];
     1583   x1 = fSplineEnergy[i - 2];
     1584   y0 = fDifPAIxSection[i - 1];
     1585   yy1 = fDifPAIxSection[i - 2];
    12791586
    12801587   c = x1/x0;
    12811588   d = e0/x0;   
    1282    a = log10(yy1/y0)/log10(x1/x0) ;
    1283    //  b0 = log10(y0) - a*log10(x0) ;
    1284    b = y0/pow(x0,a) ;
    1285    a += 2 ;
     1589   a = log10(yy1/y0)/log10(x1/x0);
     1590   //  b0 = log10(y0) - a*log10(x0);
     1591   b = y0/pow(x0,a);
     1592   a += 2;
    12861593   if(a == 0)
    12871594   {
    1288       result += b*log(e0/x0) ;
     1595      result += b*log(e0/x0);
    12891596   }
    12901597   else
    12911598   {
    1292       result += y0*(e0*e0*pow(d,a-2) - x0*x0)/a ;
    1293    }
    1294    return result ;
     1599      result += y0*(e0*e0*pow(d,a-2) - x0*x0)/a;
     1600   }
     1601   return result;
    12951602
    12961603}
     
    13041611                                             G4double en0    )
    13051612{               
    1306    G4double x0,x1,y0,yy1,a,b,e0,c,d,result ;
    1307 
    1308    e0 = en0 ;
    1309    x0 = fSplineEnergy[i] ;
    1310    x1 = fSplineEnergy[i+1] ;
    1311    y0 = fdNdxCerenkov[i] ;
    1312    yy1 = fdNdxCerenkov[i+1] ;
     1613   G4double x0,x1,y0,yy1,a,b,e0,c,d,result;
     1614
     1615   e0 = en0;
     1616   x0 = fSplineEnergy[i];
     1617   x1 = fSplineEnergy[i+1];
     1618   y0 = fdNdxCerenkov[i];
     1619   yy1 = fdNdxCerenkov[i+1];
    13131620
    13141621   //  G4cout<<G4endl;
    13151622   //  G4cout<<"SumBordC, i = "<<i<<"; en0 = "<<en0<<"; x0 ="<<x0<<"; x1 = "<<x1
    13161623   //     <<"; y0 = "<<y0<<"; yy1 = "<<yy1<<G4endl;
    1317    c = x1/x0 ;
    1318    d = e0/x0 ;
    1319    a = log10(yy1/y0)/log10(c) ;
    1320    // b0 = log10(y0) - a*log10(x0) ;
    1321    b = y0/pow(x0,a); // pow(10.,b0) ;   
    1322    
    1323    a += 1.0 ;
    1324    if( a == 0 ) result = b*log(x0/e0) ;
    1325    else         result = y0*(x0 - e0*pow(d,a-1))/a ;   
    1326    a += 1.0 ;
    1327 
    1328    if( a == 0 ) fIntegralCerenkov[0] += b*log(x0/e0) ;
    1329    else         fIntegralCerenkov[0] += y0*(x0*x0 - e0*e0*pow(d,a-2))/a ;
     1624   c = x1/x0;
     1625   d = e0/x0;
     1626   a = log10(yy1/y0)/log10(c);
     1627   // b0 = log10(y0) - a*log10(x0);
     1628   b = y0/pow(x0,a); // pow(10.,b0);   
     1629   
     1630   a += 1.0;
     1631   if( a == 0 ) result = b*log(x0/e0);
     1632   else         result = y0*(x0 - e0*pow(d,a-1))/a;   
     1633   a += 1.0;
     1634
     1635   if( a == 0 ) fIntegralCerenkov[0] += b*log(x0/e0);
     1636   else         fIntegralCerenkov[0] += y0*(x0*x0 - e0*e0*pow(d,a-2))/a;
    13301637
    13311638// G4cout<<"a = "<<a<<"; b0 = "<<b0<<"; b = "<<b<<"; result = "<<result<<G4endl;
    13321639   
    1333    x0  = fSplineEnergy[i - 1] ;
    1334    x1  = fSplineEnergy[i - 2] ;
    1335    y0  = fdNdxCerenkov[i - 1] ;
    1336    yy1 = fdNdxCerenkov[i - 2] ;
     1640   x0  = fSplineEnergy[i - 1];
     1641   x1  = fSplineEnergy[i - 2];
     1642   y0  = fdNdxCerenkov[i - 1];
     1643   yy1 = fdNdxCerenkov[i - 2];
    13371644
    13381645   // G4cout<<"x0 ="<<x0<<"; x1 = "<<x1
    13391646   //    <<"; y0 = "<<y0<<"; yy1 = "<<yy1<<G4endl;
    13401647
    1341    c = x1/x0 ;
    1342    d = e0/x0 ;
    1343    a  = log10(yy1/y0)/log10(x1/x0) ;
    1344    // b0 = log10(y0) - a*log10(x0) ;
    1345    b  =  y0/pow(x0,a);  // pow(10.,b0) ;
    1346 
    1347    a += 1.0 ;
    1348    if( a == 0 ) result += b*log(e0/x0) ;
    1349    else         result += y0*(e0*pow(d,a-1) - x0 )/a ;
    1350    a += 1.0 ;
    1351 
    1352    if( a == 0 )   fIntegralCerenkov[0] += b*log(e0/x0) ;
    1353    else           fIntegralCerenkov[0] += y0*(e0*e0*pow(d,a-2) - x0*x0)/a ;
     1648   c = x1/x0;
     1649   d = e0/x0;
     1650   a  = log10(yy1/y0)/log10(x1/x0);
     1651   // b0 = log10(y0) - a*log10(x0);
     1652   b  =  y0/pow(x0,a);  // pow(10.,b0);
     1653
     1654   a += 1.0;
     1655   if( a == 0 ) result += b*log(e0/x0);
     1656   else         result += y0*(e0*pow(d,a-1) - x0 )/a;
     1657   a += 1.0;
     1658
     1659   if( a == 0 )   fIntegralCerenkov[0] += b*log(e0/x0);
     1660   else           fIntegralCerenkov[0] += y0*(e0*e0*pow(d,a-2) - x0*x0)/a;
    13541661
    13551662   // G4cout<<"a = "<<a<<"; b0 = "<<b0<<"; b = "
    13561663   // <<b<<"; result = "<<result<<G4endl;   
    13571664
    1358    return result ;
     1665   return result;
     1666
     1667}
     1668
     1669///////////////////////////////////////////////////////////////////////////////
     1670//
     1671// Integration of MM-Cerenkov cross-section for the case of
     1672// passing across border between intervals
     1673
     1674G4double G4PAIxSection::SumOverBordMM( G4int      i ,
     1675                                             G4double en0    )
     1676{               
     1677   G4double x0,x1,y0,yy1,a,b,e0,c,d,result;
     1678
     1679   e0 = en0;
     1680   x0 = fSplineEnergy[i];
     1681   x1 = fSplineEnergy[i+1];
     1682   y0 = fdNdxMM[i];
     1683   yy1 = fdNdxMM[i+1];
     1684
     1685   //  G4cout<<G4endl;
     1686   //  G4cout<<"SumBordC, i = "<<i<<"; en0 = "<<en0<<"; x0 ="<<x0<<"; x1 = "<<x1
     1687   //     <<"; y0 = "<<y0<<"; yy1 = "<<yy1<<G4endl;
     1688   c = x1/x0;
     1689   d = e0/x0;
     1690   a = log10(yy1/y0)/log10(c);
     1691   // b0 = log10(y0) - a*log10(x0);
     1692   b = y0/pow(x0,a); // pow(10.,b0);   
     1693   
     1694   a += 1.0;
     1695   if( a == 0 ) result = b*log(x0/e0);
     1696   else         result = y0*(x0 - e0*pow(d,a-1))/a;   
     1697   a += 1.0;
     1698
     1699   if( a == 0 ) fIntegralMM[0] += b*log(x0/e0);
     1700   else         fIntegralMM[0] += y0*(x0*x0 - e0*e0*pow(d,a-2))/a;
     1701
     1702// G4cout<<"a = "<<a<<"; b0 = "<<b0<<"; b = "<<b<<"; result = "<<result<<G4endl;
     1703   
     1704   x0  = fSplineEnergy[i - 1];
     1705   x1  = fSplineEnergy[i - 2];
     1706   y0  = fdNdxMM[i - 1];
     1707   yy1 = fdNdxMM[i - 2];
     1708
     1709   // G4cout<<"x0 ="<<x0<<"; x1 = "<<x1
     1710   //    <<"; y0 = "<<y0<<"; yy1 = "<<yy1<<G4endl;
     1711
     1712   c = x1/x0;
     1713   d = e0/x0;
     1714   a  = log10(yy1/y0)/log10(x1/x0);
     1715   // b0 = log10(y0) - a*log10(x0);
     1716   b  =  y0/pow(x0,a);  // pow(10.,b0);
     1717
     1718   a += 1.0;
     1719   if( a == 0 ) result += b*log(e0/x0);
     1720   else         result += y0*(e0*pow(d,a-1) - x0 )/a;
     1721   a += 1.0;
     1722
     1723   if( a == 0 )   fIntegralMM[0] += b*log(e0/x0);
     1724   else           fIntegralMM[0] += y0*(e0*e0*pow(d,a-2) - x0*x0)/a;
     1725
     1726   // G4cout<<"a = "<<a<<"; b0 = "<<b0<<"; b = "
     1727   // <<b<<"; result = "<<result<<G4endl;   
     1728
     1729   return result;
    13591730
    13601731}
     
    13681739                                             G4double en0    )
    13691740{               
    1370    G4double x0,x1,y0,yy1,a,b,c,d,e0,result ;
    1371 
    1372    e0 = en0 ;
    1373    x0 = fSplineEnergy[i] ;
    1374    x1 = fSplineEnergy[i+1] ;
    1375    y0 = fdNdxPlasmon[i] ;
    1376    yy1 = fdNdxPlasmon[i+1] ;
    1377 
    1378    c = x1/x0 ;
    1379    d = e0/x0 ;   
    1380    a = log10(yy1/y0)/log10(c) ;
    1381    //  b0 = log10(y0) - a*log10(x0) ;
    1382    b = y0/pow(x0,a); //pow(10.,b) ;
    1383    
    1384    a += 1.0 ;
    1385    if( a == 0 ) result = b*log(x0/e0) ;
    1386    else         result = y0*(x0 - e0*pow(d,a-1))/a ;   
    1387    a += 1.0 ;
    1388 
    1389    if( a == 0 ) fIntegralPlasmon[0] += b*log(x0/e0) ;
    1390    else         fIntegralPlasmon[0] += y0*(x0*x0 - e0*e0*pow(d,a-2))/a ;
    1391    
    1392    x0 = fSplineEnergy[i - 1] ;
    1393    x1 = fSplineEnergy[i - 2] ;
    1394    y0 = fdNdxPlasmon[i - 1] ;
    1395    yy1 = fdNdxPlasmon[i - 2] ;
    1396 
    1397    c = x1/x0 ;
    1398    d = e0/x0 ;
    1399    a = log10(yy1/y0)/log10(c) ;
    1400    // b0 = log10(y0) - a*log10(x0) ;
    1401    b = y0/pow(x0,a);// pow(10.,b0) ;
    1402 
    1403    a += 1.0 ;
    1404    if( a == 0 ) result += b*log(e0/x0) ;
    1405    else         result += y0*(e0*pow(d,a-1) - x0)/a ;
    1406    a += 1.0 ;
    1407 
    1408    if( a == 0 )   fIntegralPlasmon[0] += b*log(e0/x0) ;
    1409    else           fIntegralPlasmon[0] += y0*(e0*e0*pow(d,a-2) - x0*x0)/a ;
    1410    
    1411    return result ;
     1741   G4double x0,x1,y0,yy1,a,b,c,d,e0,result;
     1742
     1743   e0 = en0;
     1744   x0 = fSplineEnergy[i];
     1745   x1 = fSplineEnergy[i+1];
     1746   y0 = fdNdxPlasmon[i];
     1747   yy1 = fdNdxPlasmon[i+1];
     1748
     1749   c = x1/x0;
     1750   d = e0/x0;   
     1751   a = log10(yy1/y0)/log10(c);
     1752   //  b0 = log10(y0) - a*log10(x0);
     1753   b = y0/pow(x0,a); //pow(10.,b);
     1754   
     1755   a += 1.0;
     1756   if( a == 0 ) result = b*log(x0/e0);
     1757   else         result = y0*(x0 - e0*pow(d,a-1))/a;   
     1758   a += 1.0;
     1759
     1760   if( a == 0 ) fIntegralPlasmon[0] += b*log(x0/e0);
     1761   else         fIntegralPlasmon[0] += y0*(x0*x0 - e0*e0*pow(d,a-2))/a;
     1762   
     1763   x0 = fSplineEnergy[i - 1];
     1764   x1 = fSplineEnergy[i - 2];
     1765   y0 = fdNdxPlasmon[i - 1];
     1766   yy1 = fdNdxPlasmon[i - 2];
     1767
     1768   c = x1/x0;
     1769   d = e0/x0;
     1770   a = log10(yy1/y0)/log10(c);
     1771   // b0 = log10(y0) - a*log10(x0);
     1772   b = y0/pow(x0,a);// pow(10.,b0);
     1773
     1774   a += 1.0;
     1775   if( a == 0 ) result += b*log(e0/x0);
     1776   else         result += y0*(e0*pow(d,a-1) - x0)/a;
     1777   a += 1.0;
     1778
     1779   if( a == 0 )   fIntegralPlasmon[0] += b*log(e0/x0);
     1780   else           fIntegralPlasmon[0] += y0*(e0*e0*pow(d,a-2) - x0*x0)/a;
     1781   
     1782   return result;
    14121783
    14131784}
    14141785
     1786///////////////////////////////////////////////////////////////////////////////
     1787//
     1788// Integration of resonance cross-section for the case of
     1789// passing across border between intervals
     1790
     1791G4double G4PAIxSection::SumOverBordResonance( G4int      i ,
     1792                                             G4double en0    )
     1793{               
     1794   G4double x0,x1,y0,yy1,a,b,c,d,e0,result;
     1795
     1796   e0 = en0;
     1797   x0 = fSplineEnergy[i];
     1798   x1 = fSplineEnergy[i+1];
     1799   y0 = fdNdxResonance[i];
     1800   yy1 = fdNdxResonance[i+1];
     1801
     1802   c = x1/x0;
     1803   d = e0/x0;   
     1804   a = log10(yy1/y0)/log10(c);
     1805   //  b0 = log10(y0) - a*log10(x0);
     1806   b = y0/pow(x0,a); //pow(10.,b);
     1807   
     1808   a += 1.0;
     1809   if( a == 0 ) result = b*log(x0/e0);
     1810   else         result = y0*(x0 - e0*pow(d,a-1))/a;   
     1811   a += 1.0;
     1812
     1813   if( a == 0 ) fIntegralResonance[0] += b*log(x0/e0);
     1814   else         fIntegralResonance[0] += y0*(x0*x0 - e0*e0*pow(d,a-2))/a;
     1815   
     1816   x0 = fSplineEnergy[i - 1];
     1817   x1 = fSplineEnergy[i - 2];
     1818   y0 = fdNdxResonance[i - 1];
     1819   yy1 = fdNdxResonance[i - 2];
     1820
     1821   c = x1/x0;
     1822   d = e0/x0;
     1823   a = log10(yy1/y0)/log10(c);
     1824   // b0 = log10(y0) - a*log10(x0);
     1825   b = y0/pow(x0,a);// pow(10.,b0);
     1826
     1827   a += 1.0;
     1828   if( a == 0 ) result += b*log(e0/x0);
     1829   else         result += y0*(e0*pow(d,a-1) - x0)/a;
     1830   a += 1.0;
     1831
     1832   if( a == 0 )   fIntegralResonance[0] += b*log(e0/x0);
     1833   else           fIntegralResonance[0] += y0*(e0*e0*pow(d,a-2) - x0*x0)/a;
     1834   
     1835   return result;
     1836
     1837}
     1838
    14151839/////////////////////////////////////////////////////////////////////////
    14161840//
    1417 //
     1841// Returns random PAI-total energy loss over step
    14181842
    14191843G4double G4PAIxSection::GetStepEnergyLoss( G4double step )
    14201844
    1421   G4int iTransfer  ;
    1422   G4long numOfCollisions ;
    1423   G4double loss = 0.0 ;
    1424   G4double meanNumber, position ;
    1425 
    1426   // G4cout<<" G4PAIxSection::GetStepEnergyLoss "<<G4endl ;
    1427 
    1428 
    1429 
    1430   meanNumber = fIntegralPAIxSection[1]*step ;
    1431   numOfCollisions = G4Poisson(meanNumber) ;
    1432 
    1433   //   G4cout<<"numOfCollisions = "<<numOfCollisions<<G4endl ;
     1845  G4long numOfCollisions;
     1846  G4double meanNumber, loss = 0.0;
     1847
     1848  // G4cout<<" G4PAIxSection::GetStepEnergyLoss "<<G4endl;
     1849
     1850  meanNumber = fIntegralPAIxSection[1]*step;
     1851  numOfCollisions = G4Poisson(meanNumber);
     1852
     1853  //   G4cout<<"numOfCollisions = "<<numOfCollisions<<G4endl;
    14341854
    14351855  while(numOfCollisions)
    14361856  {
    1437     position = fIntegralPAIxSection[1]*G4UniformRand() ;
    1438 
    1439     for( iTransfer=1 ; iTransfer<=fSplineNumber ; iTransfer++ )
    1440     {
    1441         if( position >= fIntegralPAIxSection[iTransfer] ) break ;
    1442     }
    1443     loss += fSplineEnergy[iTransfer]  ;
    1444     numOfCollisions-- ;
     1857   loss += GetEnergyTransfer();
     1858   numOfCollisions--;
    14451859  }
    1446   // G4cout<<"PAI energy loss = "<<loss/keV<<" keV"<<G4endl ;
    1447 
    1448   return loss ;
     1860  // G4cout<<"PAI energy loss = "<<loss/keV<<" keV"<<G4endl;
     1861
     1862  return loss;
    14491863}
    14501864
    14511865/////////////////////////////////////////////////////////////////////////
    14521866//
    1453 //
     1867// Returns random PAI-total energy transfer in one collision
     1868
     1869G4double G4PAIxSection::GetEnergyTransfer()
     1870
     1871  G4int iTransfer ;
     1872
     1873  G4double energyTransfer, position;
     1874
     1875  position = fIntegralPAIxSection[1]*G4UniformRand();
     1876
     1877  for( iTransfer = 1; iTransfer <= fSplineNumber; iTransfer++ )
     1878  {
     1879        if( position >= fIntegralPAIxSection[iTransfer] ) break;
     1880  }
     1881  if(iTransfer > fSplineNumber) iTransfer--;
     1882 
     1883  energyTransfer = fSplineEnergy[iTransfer];
     1884
     1885  if(iTransfer > 1)
     1886  {
     1887    energyTransfer -= (fSplineEnergy[iTransfer]-fSplineEnergy[iTransfer-1])*G4UniformRand();
     1888  }
     1889  return energyTransfer;
     1890}
     1891
     1892/////////////////////////////////////////////////////////////////////////
     1893//
     1894// Returns random Cerenkov energy loss over step
    14541895
    14551896G4double G4PAIxSection::GetStepCerenkovLoss( G4double step )
    14561897
    1457   G4int iTransfer  ;
    1458   G4long numOfCollisions ;
    1459   G4double loss = 0.0 ;
    1460   G4double meanNumber, position ;
    1461 
    1462   // G4cout<<" G4PAIxSection::GetStepCreLosnkovs "<<G4endl ;
    1463 
    1464 
    1465 
    1466   meanNumber = fIntegralCerenkov[1]*step ;
    1467   numOfCollisions = G4Poisson(meanNumber) ;
    1468 
    1469   //   G4cout<<"numOfCollisions = "<<numOfCollisions<<G4endl ;
     1898  G4long numOfCollisions;
     1899  G4double meanNumber, loss = 0.0;
     1900
     1901  // G4cout<<" G4PAIxSection::GetStepCerenkovLoss "<<G4endl;
     1902
     1903  meanNumber = fIntegralCerenkov[1]*step;
     1904  numOfCollisions = G4Poisson(meanNumber);
     1905
     1906  //   G4cout<<"numOfCollisions = "<<numOfCollisions<<G4endl;
    14701907
    14711908  while(numOfCollisions)
    14721909  {
    1473     position = fIntegralCerenkov[1]*G4UniformRand() ;
    1474 
    1475     for( iTransfer=1 ; iTransfer<=fSplineNumber ; iTransfer++ )
    1476     {
    1477         if( position >= fIntegralCerenkov[iTransfer] ) break ;
    1478     }
    1479     loss += fSplineEnergy[iTransfer]  ;
    1480     numOfCollisions-- ;
     1910    loss += GetCerenkovEnergyTransfer();
     1911    numOfCollisions--;
    14811912  }
    1482   // G4cout<<"PAI Cerenkov loss = "<<loss/keV<<" keV"<<G4endl ;
    1483 
    1484   return loss ;
     1913  // G4cout<<"PAI Cerenkov loss = "<<loss/keV<<" keV"<<G4endl;
     1914
     1915  return loss;
    14851916}
    14861917
    14871918/////////////////////////////////////////////////////////////////////////
    14881919//
    1489 //
     1920// Returns random MM-Cerenkov energy loss over step
     1921
     1922G4double G4PAIxSection::GetStepMMLoss( G4double step )
     1923
     1924  G4long numOfCollisions;
     1925  G4double meanNumber, loss = 0.0;
     1926
     1927  // G4cout<<" G4PAIxSection::GetStepMMLoss "<<G4endl;
     1928
     1929  meanNumber = fIntegralMM[1]*step;
     1930  numOfCollisions = G4Poisson(meanNumber);
     1931
     1932  //   G4cout<<"numOfCollisions = "<<numOfCollisions<<G4endl;
     1933
     1934  while(numOfCollisions)
     1935  {
     1936    loss += GetMMEnergyTransfer();
     1937    numOfCollisions--;
     1938  }
     1939  // G4cout<<"PAI MM-Cerenkov loss = "<<loss/keV<<" keV"<<G4endl;
     1940
     1941  return loss;
     1942}
     1943
     1944/////////////////////////////////////////////////////////////////////////
     1945//
     1946// Returns Cerenkov energy transfer in one collision
     1947
     1948G4double G4PAIxSection::GetCerenkovEnergyTransfer()
     1949
     1950  G4int iTransfer ;
     1951
     1952  G4double energyTransfer, position;
     1953
     1954  position = fIntegralCerenkov[1]*G4UniformRand();
     1955
     1956  for( iTransfer = 1; iTransfer <= fSplineNumber; iTransfer++ )
     1957  {
     1958        if( position >= fIntegralCerenkov[iTransfer] ) break;
     1959  }
     1960  if(iTransfer > fSplineNumber) iTransfer--;
     1961 
     1962  energyTransfer = fSplineEnergy[iTransfer];
     1963
     1964  if(iTransfer > 1)
     1965  {
     1966    energyTransfer -= (fSplineEnergy[iTransfer]-fSplineEnergy[iTransfer-1])*G4UniformRand();
     1967  }
     1968  return energyTransfer;
     1969}
     1970
     1971/////////////////////////////////////////////////////////////////////////
     1972//
     1973// Returns MM-Cerenkov energy transfer in one collision
     1974
     1975G4double G4PAIxSection::GetMMEnergyTransfer()
     1976
     1977  G4int iTransfer ;
     1978
     1979  G4double energyTransfer, position;
     1980
     1981  position = fIntegralMM[1]*G4UniformRand();
     1982
     1983  for( iTransfer = 1; iTransfer <= fSplineNumber; iTransfer++ )
     1984  {
     1985        if( position >= fIntegralMM[iTransfer] ) break;
     1986  }
     1987  if(iTransfer > fSplineNumber) iTransfer--;
     1988 
     1989  energyTransfer = fSplineEnergy[iTransfer];
     1990
     1991  if(iTransfer > 1)
     1992  {
     1993    energyTransfer -= (fSplineEnergy[iTransfer]-fSplineEnergy[iTransfer-1])*G4UniformRand();
     1994  }
     1995  return energyTransfer;
     1996}
     1997
     1998/////////////////////////////////////////////////////////////////////////
     1999//
     2000// Returns random plasmon energy loss over step
    14902001
    14912002G4double G4PAIxSection::GetStepPlasmonLoss( G4double step )
    14922003
    1493   G4int iTransfer  ;
    1494   G4long numOfCollisions ;
    1495   G4double loss = 0.0 ;
    1496   G4double meanNumber, position ;
    1497 
    1498   // G4cout<<" G4PAIxSection::GetStepCreLosnkovs "<<G4endl ;
    1499 
    1500 
    1501 
    1502   meanNumber = fIntegralPlasmon[1]*step ;
    1503   numOfCollisions = G4Poisson(meanNumber) ;
    1504 
    1505   //   G4cout<<"numOfCollisions = "<<numOfCollisions<<G4endl ;
     2004  G4long numOfCollisions;
     2005  G4double  meanNumber, loss = 0.0;
     2006
     2007  // G4cout<<" G4PAIxSection::GetStepPlasmonLoss "<<G4endl;
     2008
     2009  meanNumber = fIntegralPlasmon[1]*step;
     2010  numOfCollisions = G4Poisson(meanNumber);
     2011
     2012  //   G4cout<<"numOfCollisions = "<<numOfCollisions<<G4endl;
    15062013
    15072014  while(numOfCollisions)
    15082015  {
    1509     position = fIntegralPlasmon[1]*G4UniformRand() ;
    1510 
    1511     for( iTransfer=1 ; iTransfer<=fSplineNumber ; iTransfer++ )
    1512     {
    1513         if( position >= fIntegralPlasmon[iTransfer] ) break ;
    1514     }
    1515     loss += fSplineEnergy[iTransfer]  ;
    1516     numOfCollisions-- ;
     2016    loss += GetPlasmonEnergyTransfer();
     2017    numOfCollisions--;
    15172018  }
    1518   // G4cout<<"PAI Plasmon loss = "<<loss/keV<<" keV"<<G4endl ;
    1519 
    1520   return loss ;
     2019  // G4cout<<"PAI Plasmon loss = "<<loss/keV<<" keV"<<G4endl;
     2020
     2021  return loss;
    15212022}
    15222023
     2024/////////////////////////////////////////////////////////////////////////
     2025//
     2026// Returns plasmon energy transfer in one collision
     2027
     2028G4double G4PAIxSection::GetPlasmonEnergyTransfer()
     2029
     2030  G4int iTransfer ;
     2031
     2032  G4double energyTransfer, position;
     2033
     2034  position = fIntegralPlasmon[1]*G4UniformRand();
     2035
     2036  for( iTransfer = 1; iTransfer <= fSplineNumber; iTransfer++ )
     2037  {
     2038        if( position >= fIntegralPlasmon[iTransfer] ) break;
     2039  }
     2040  if(iTransfer > fSplineNumber) iTransfer--;
     2041 
     2042  energyTransfer = fSplineEnergy[iTransfer];
     2043
     2044  if(iTransfer > 1)
     2045  {
     2046    energyTransfer -= (fSplineEnergy[iTransfer]-fSplineEnergy[iTransfer-1])*G4UniformRand();
     2047  }
     2048  return energyTransfer;
     2049}
     2050
     2051/////////////////////////////////////////////////////////////////////////
     2052//
     2053// Returns random resonance energy loss over step
     2054
     2055G4double G4PAIxSection::GetStepResonanceLoss( G4double step )
     2056
     2057  G4long numOfCollisions;
     2058  G4double meanNumber, loss = 0.0;
     2059
     2060  // G4cout<<" G4PAIxSection::GetStepCreLosnkovs "<<G4endl;
     2061
     2062  meanNumber = fIntegralResonance[1]*step;
     2063  numOfCollisions = G4Poisson(meanNumber);
     2064
     2065  //   G4cout<<"numOfCollisions = "<<numOfCollisions<<G4endl;
     2066
     2067  while(numOfCollisions)
     2068  {
     2069    loss += GetResonanceEnergyTransfer();
     2070    numOfCollisions--;
     2071  }
     2072  // G4cout<<"PAI resonance loss = "<<loss/keV<<" keV"<<G4endl;
     2073
     2074  return loss;
     2075}
     2076
     2077
     2078/////////////////////////////////////////////////////////////////////////
     2079//
     2080// Returns resonance energy transfer in one collision
     2081
     2082G4double G4PAIxSection::GetResonanceEnergyTransfer()
     2083
     2084  G4int iTransfer ;
     2085
     2086  G4double energyTransfer, position;
     2087
     2088  position = fIntegralResonance[1]*G4UniformRand();
     2089
     2090  for( iTransfer = 1; iTransfer <= fSplineNumber; iTransfer++ )
     2091  {
     2092        if( position >= fIntegralResonance[iTransfer] ) break;
     2093  }
     2094  if(iTransfer > fSplineNumber) iTransfer--;
     2095 
     2096  energyTransfer = fSplineEnergy[iTransfer];
     2097
     2098  if(iTransfer > 1)
     2099  {
     2100    energyTransfer -= (fSplineEnergy[iTransfer]-fSplineEnergy[iTransfer-1])*G4UniformRand();
     2101  }
     2102  return energyTransfer;
     2103}
     2104
     2105
     2106/////////////////////////////////////////////////////////////////////////
     2107//
     2108// Returns Rutherford energy transfer in one collision
     2109
     2110G4double G4PAIxSection::GetRutherfordEnergyTransfer()
     2111
     2112  G4int iTransfer ;
     2113
     2114  G4double energyTransfer, position;
     2115
     2116  position = (fIntegralPlasmon[1]-fIntegralResonance[1])*G4UniformRand();
     2117
     2118  for( iTransfer = 1; iTransfer <= fSplineNumber; iTransfer++ )
     2119  {
     2120        if( position >= (fIntegralPlasmon[iTransfer]-fIntegralResonance[iTransfer]) ) break;
     2121  }
     2122  if(iTransfer > fSplineNumber) iTransfer--;
     2123 
     2124  energyTransfer = fSplineEnergy[iTransfer];
     2125
     2126  if(iTransfer > 1)
     2127  {
     2128    energyTransfer -= (fSplineEnergy[iTransfer]-fSplineEnergy[iTransfer-1])*G4UniformRand();
     2129  }
     2130  return energyTransfer;
     2131}
    15232132
    15242133
     
    15282137//
    15292138
    1530 G4int G4PAIxSection::fNumberOfGammas = 111 ;
     2139G4int G4PAIxSection::fNumberOfGammas = 111;
    15312140
    15322141const G4double G4PAIxSection::fLorentzFactor[112] =     // fNumberOfGammas+1
     
    155621655.658206e+04, 6.422112e+04, 7.289153e+04, 8.273254e+04, 9.390219e+04, // 110
    155721661.065799e+05
    1558 } ;
     2167};
    15592168
    15602169///////////////////////////////////////////////////////////////////////
     
    15642173
    15652174const
    1566 G4int G4PAIxSection::fRefGammaNumber = 29 ;
     2175G4int G4PAIxSection::fRefGammaNumber = 29;
    15672176
    15682177   
Note: See TracChangeset for help on using the changeset viewer.