source: trunk/source/processes/electromagnetic/standard/test/test90Ne10CO2pai.cc @ 1282

Last change on this file since 1282 was 1199, checked in by garnier, 15 years ago

nvx fichiers dans CVS

File size: 27.2 KB
Line 
1//
2// ********************************************************************
3// * License and Disclaimer                                           *
4// *                                                                  *
5// * The  Geant4 software  is  copyright of the Copyright Holders  of *
6// * the Geant4 Collaboration.  It is provided  under  the terms  and *
7// * conditions of the Geant4 Software License,  included in the file *
8// * LICENSE and available at  http://cern.ch/geant4/license .  These *
9// * include a list of copyright holders.                             *
10// *                                                                  *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work  make  any representation or  warranty, express or implied, *
14// * regarding  this  software system or assume any liability for its *
15// * use.  Please see the license in the file  LICENSE  and URL above *
16// * for the full disclaimer and the limitation of liability.         *
17// *                                                                  *
18// * This  code  implementation is the result of  the  scientific and *
19// * technical work of the GEANT4 collaboration.                      *
20// * By using,  copying,  modifying or  distributing the software (or *
21// * any work based  on the software)  you  agree  to acknowledge its *
22// * use  in  resulting  scientific  publications,  and indicate your *
23// * acceptance of all terms of the Geant4 Software license.          *
24// ********************************************************************
25//
26//
27// $Id: test90Ne10CO2pai.cc,v 1.6 2008/12/18 13:01:40 gunter Exp $
28// GEANT4 tag $Name: geant4-09-03-cand-01 $
29//
30//
31//
32// 
33//
34//  Test routine for G4PAIxSection class code
35//
36// History:
37//
38// 11.04.08, V. Grichine test of PAI predictions for 90% Ne + 10% CO2
39//                       ALICE TPC gas mixture
40
41#include "G4ios.hh"
42#include <fstream>
43#include <cmath>
44
45
46#include "globals.hh"
47#include "Randomize.hh"
48
49#include "G4Isotope.hh"
50#include "G4Element.hh"
51#include "G4Material.hh"
52#include "G4MaterialTable.hh"
53#include "G4SandiaTable.hh"
54
55// #include "G4PAIonisation.hh"
56#include "G4PAIxSection.hh"
57
58// Peter:
59// From the AliRoot code in $ALICE_ROOT/TPC/AliTPCv2.cxx:
60//  const Float_t kprim = 14.35; // number of primary collisions per 1 cm
61//  const Float_t kpoti = 20.77e-9; // first ionization potential for Ne/CO2
62//  const Float_t kwIon = 35.97e-9; // energy for the ion-electron pair creation
63//
64// kprim is the number of primary collisions per cm for a MIP!
65// kpoti = I.
66// kwIon = W.
67
68G4double FitALICE(G4double bg)
69{
70  //
71  // Bethe-Bloch energy loss formula from ALICE TPC TRD
72  //
73  const G4double kp1 = 0.76176e-1;
74  const G4double kp2 = 10.632;
75  const G4double kp3 = 0.13279e-4;
76  const G4double kp4 = 1.8631;
77  const G4double kp5 = 1.9479;
78  const G4double dn1 = 14.35;
79
80  G4double dbg  = (G4double) bg;
81
82  G4double beta = dbg/std::sqrt(1.+dbg*dbg);
83
84  G4double aa   = std::pow(beta,kp4);
85  G4double bb   = std::pow(1./dbg,kp5);
86
87
88  bb  = std::log(kp3 + bb);
89
90  G4double result = ( kp2 - aa - bb)*kp1/aa;
91
92  result *= dn1;
93
94  return result;
95}
96
97
98G4double FitBichsel(G4double bg)
99{
100  //
101  // Primary ionisation from Hans Bichsel fit
102  //
103  const G4double kp1 = 0.686e-1;
104  const G4double kp2 = 11.714;
105  const G4double kp3 = 0.218e-4;
106  const G4double kp4 = 1.997;
107  const G4double kp5 = 2.133;
108  const G4double dn1 = 13.32;
109
110  G4double dbg  = (G4double) bg;
111
112  G4double beta = dbg/std::sqrt(1.+dbg*dbg);
113
114  G4double aa   = std::pow(beta,kp4);
115  G4double bb   = std::pow(1./dbg,kp5);
116
117
118  bb=std::log(kp3 + bb);
119
120  G4double result = ( kp2 - aa - bb)*kp1/aa;
121
122  result *= dn1;
123
124  return result;
125 
126}
127
128////////////////////////////////////////////////////////////
129
130
131G4double GetIonisation(G4double transfer)
132{
133  G4double W  = 34.75*eV;
134  G4double I1 = 13.62*eV; // first ionisation potential in mixture
135  I1 *= 0.9;
136
137  G4double       result = W;
138
139  // result /= 1.-I1/transfer;
140
141  return transfer/result;
142
143}
144
145
146/////////////////////////////////////////////////
147
148
149
150int main()
151{
152   std::ofstream outFile("90Ne10CO2pai.dat", std::ios::out );
153   outFile.setf( std::ios::scientific, std::ios::floatfield );
154
155   std::ofstream fileOut("PAICerPlasm90Ne10CO2.dat", std::ios::out );
156   fileOut.setf( std::ios::scientific, std::ios::floatfield );
157
158   //  std::ifstream fileRead("exp.dat", std::ios::out );
159   //  fileRead.setf( std::ios::scientific, std::ios::floatfield );
160
161   std::ofstream fileWrite("exp.dat", std::ios::out );
162   fileWrite.setf( std::ios::scientific, std::ios::floatfield );
163
164   std::ofstream fileWrite1("mprrpai.dat", std::ios::out );
165   fileWrite1.setf( std::ios::scientific, std::ios::floatfield );
166
167// Create materials 
168   
169
170  G4int iz , n,  nel, ncomponents;
171  G4double a, z, ez, density , temperature, pressure, fractionmass;
172  G4State state;
173  G4String name, symbol;
174
175
176  a = 12.01*g/mole;
177  G4Element* elC = new G4Element(name="Carbon",symbol="C", ez=6., a);
178
179  a = 14.01*g/mole;
180  G4Element* elN = new G4Element(name="Nitrogen", symbol="N", ez=7., a);
181
182  a = 16.00*g/mole;
183  G4Element* elO = new G4Element(name="Oxygen",symbol="O", ez=8., a);
184
185 
186
187  // Neon as detector gas, STP
188
189  density = 0.900*mg/cm3;
190  a = 20.179*g/mole;
191  G4Material* Ne  = new G4Material(name="Ne",z=10., a, density );
192
193  // Carbone dioxide, CO2 STP
194
195  density = 1.977*mg/cm3;
196  G4Material* CarbonDioxide = new G4Material(name="CO2", density, nel=2);
197  CarbonDioxide->AddElement(elC,1);
198  CarbonDioxide->AddElement(elO,2);
199
200 
201
202  // 90% Ne + 10% CO2, STP
203
204  density = 1.0077*mg/cm3;     
205  G4Material* Ne10CO2 = new G4Material(name="Ne10CO2"  , density, 
206                          ncomponents=2);
207  Ne10CO2->AddMaterial( Ne,           fractionmass = 0.8038 );
208  Ne10CO2->AddMaterial( CarbonDioxide,   fractionmass = 0.1962 );
209
210  density *= 273./293.;
211
212  G4Material* Ne10CO2T293 = new G4Material(name="Ne10CO2T293"  , density, 
213                           ncomponents=2);
214  Ne10CO2T293->AddMaterial( Ne,              fractionmass = 0.8038 );
215  Ne10CO2T293->AddMaterial( CarbonDioxide,   fractionmass = 0.1962 );
216
217
218  density = 1.25053*mg/cm3;       // STP
219  G4Material* Nitrogen = new G4Material(name="N2"  , density, ncomponents=1);
220  Nitrogen->AddElement(elN, 2);
221
222  // 85.7% Ne + 9.5% CO2 +4.8% N2, STP
223
224  density = 1.0191*mg/cm3;     
225  G4Material* Ne857CO295N2 = new G4Material(name="Ne857CO295N2"  , density, 
226                             ncomponents=3);
227  Ne857CO295N2->AddMaterial( Ne,            fractionmass = 0.7568 );
228  Ne857CO295N2->AddMaterial( CarbonDioxide, fractionmass = 0.1843 );
229  Ne857CO295N2->AddMaterial( Nitrogen,      fractionmass = 0.0589 );
230
231  density *= 273./292.;
232  density *= 0.966/1.01325;
233
234  G4cout<<"density of Ne857CO295N2T292 = "<<density*cm3/mg<<"  mg/cm3"<<G4endl;
235
236  G4Material* Ne857CO295N2T292 = new G4Material(name="Ne857CO295N2T292"  , density, 
237                             ncomponents=3);
238  Ne857CO295N2T292->AddMaterial( Ne,            fractionmass = 0.76065 );
239  Ne857CO295N2T292->AddMaterial( CarbonDioxide, fractionmass = 0.18140 );
240  Ne857CO295N2T292->AddMaterial( Nitrogen,      fractionmass = 0.05795 );
241
242
243  G4int i, j, jMax, k, numOfMaterials, iSan, nbOfElements, sanIndex, row;
244  G4double maxEnergyTransfer, kineticEnergy;
245  G4double tau, gamma, bg2, bg, beta2, rateMass, Tmax, Tmin, Tkin;
246
247  const G4MaterialTable* theMaterialTable = G4Material::GetMaterialTable();
248
249  numOfMaterials = theMaterialTable->size();
250
251  G4cout<<"Available materials under test : "<< G4endl<<G4endl;
252  // outFile<<"Available materials under test : "<< G4endl<<G4endl;
253
254  for( k = 0; k < numOfMaterials; k++ )
255  {
256    G4cout <<k<<"\t"<< "  Material : " <<(*theMaterialTable)[k]->GetName() << G4endl;
257    // outFile <<k<<"\t"<< "  Material : " <<(*theMaterialTable)[k]->GetName() << G4endl;
258  }
259
260
261
262  // G4String testName = "N2";
263  G4String testName = "Ne10CO2";
264  // G4String testName = "Ne10CO2T293";
265  // G4String testName = "Ne857CO295N2T292";
266
267
268  // G4cout<<"Enter material name for test : "<<std::flush;
269  //  G4cin>>testName;
270
271
272
273  for( k = 0; k < numOfMaterials; k++ )
274  {
275    if((*theMaterialTable)[k]->GetName() != testName) continue;
276
277    // outFile << "Material : " <<(*theMaterialTable)[k]->GetName() << G4endl;
278     G4cout << "Material : " <<(*theMaterialTable)[k]->GetName() << G4endl;
279
280     nbOfElements = (*theMaterialTable)[k]->GetNumberOfElements();
281
282     G4cout<<"Sandia cof according old PAI stuff"<<G4endl<<G4endl;
283     // outFile<<"Sandia cof according old PAI stuff"<<G4endl<<G4endl;
284
285     G4int* thisMaterialZ = new G4int[nbOfElements];
286
287     for( iSan = 0; iSan < nbOfElements; iSan++ )
288     {
289        thisMaterialZ[iSan] = (G4int)(*theMaterialTable)[k]->
290                                      GetElement(iSan)->GetZ();
291     }
292     G4SandiaTable sandia(k);
293     sanIndex = sandia.SandiaIntervals(thisMaterialZ,nbOfElements);   
294     sanIndex = sandia.SandiaMixing( thisMaterialZ ,
295                             (*theMaterialTable)[k]->GetFractionVector(),
296                                     nbOfElements,sanIndex);
297
298     for(row = 0; row < sanIndex-1; row++ )
299     {
300       G4cout<<row+1<<"\t"<<sandia.GetPhotoAbsorpCof(row+1,0)/keV;
301       // outFile<<row+1<<"  "<<sandia.GetPhotoAbsorpCof(row+1,0)/keV;
302
303       for( iSan = 1; iSan < 5; iSan++ )
304       {
305         G4cout<<"\t"<<sandia.GetPhotoAbsorpCof(row+1,iSan);
306         // *(*theMaterialTable)[k]->GetDensity();
307
308         // outFile<<"  "<<sandia.GetPhotoAbsorpCof(row+1,iSan);
309         // *(*theMaterialTable)[k]->GetDensity();
310       }
311       G4cout<<G4endl;
312       // outFile<<G4endl;
313     }
314     G4cout<<G4endl;
315     // outFile<<G4endl;
316
317
318     // outFile<<G4endl;
319     maxEnergyTransfer = 100*keV;
320     gamma             = 4.0;
321     bg2               = gamma*gamma - 1;
322
323     G4PAIxSection testPAI( k, maxEnergyTransfer, bg2);
324
325     G4cout<<"Interval no."<<"\t"<<"Energy interval"<<G4endl<<G4endl;
326     // outFile<<"Interval no."<<"\t"<<"Energy interval"<<G4endl<<G4endl;
327
328     for( j = 1; j <= testPAI.GetIntervalNumber(); j++ )
329     {
330       G4cout<<j<<"\t\t"<<testPAI.GetEnergyInterval(j)/keV<<G4endl;
331       // outFile<<j<<"\t\t"<<testPAI.GetEnergyInterval(j)/keV<<G4endl;
332     }
333     G4cout<<G4endl;
334     // outFile<<G4endl;
335
336     G4cout << "Actual spline size = "<<testPAI.GetSplineSize()<<G4endl;
337     G4cout <<"Normalization Cof = "<<testPAI.GetNormalizationCof()<<G4endl;
338     G4cout << G4endl;
339
340     // outFile<<"Actual spline size = "<<testPAI.GetSplineSize()<<G4endl;
341     // outFile<<"Normalization Cof = "<<testPAI.GetNormalizationCof()<<G4endl;
342     // outFile<<G4endl;
343
344
345     Tmin     = sandia.GetPhotoAbsorpCof(1,0);  // 0.02*keV;
346     G4cout<<"Tmin = "<<Tmin/eV<<" eV"<<G4endl;
347   
348     G4cout
349       //     <<"Tkin, keV"<<"\t"
350            << "bg"<<"\t\t"
351       //   <<"Max E transfer, kev"<<"\t"
352            << "<dN/dxC>, 1/cm"<<"\t"
353            << "<dN/dxMM>, 1/cm"<<"\t"
354            << "<dN/dxP>, 1/cm"<<"\t"
355       //    << "<dN/dxC+dN/dxP>"<<"\t"
356            <<"<dN/dx>, 1/cm"<<G4endl<<G4endl;
357   
358     /*
359     outFile
360       //     <<"Tkin, keV"<<"\t"
361            <<"gamma"<<"\t\t"
362       //   <<"Max E transfer, kev"<<"\t"
363            <<"<dN/dxC>, 1/cm"<<"\t"
364            << "<dN/dxP>, 1/cm"<<"\t"
365            <<"<dN/dxC+dN/dxP>"<<"\t"
366            <<"<dN/dx>, 1/cm"<<G4endl<<G4endl;
367     */
368     //   G4PAIxSection testPAIproton(k,maxEnergyTransfer);
369
370
371
372
373
374     kineticEnergy = 10.0*keV; // 100.*GeV;    // 10.0*keV;  // 110*MeV; // for proton
375
376     //     for(j=1;j<testPAIproton.GetNumberOfGammas();j++)
377
378     jMax = 70; // 70;
379
380     outFile<<jMax<<G4endl;
381
382     for( j = 0; j < jMax; j++ )
383     {
384       tau      = kineticEnergy/proton_mass_c2;
385       gamma    = tau +1.0;
386       bg2      = tau*(tau + 2.0);
387       bg = std::sqrt(bg2);
388       beta2    = bg2/(gamma*gamma);
389       // G4cout<<"bg = "<<bg<<";  b2 = "<<beta2<<G4endl<<G4endl;
390       rateMass = electron_mass_c2/proton_mass_c2;
391
392       Tmax     = 2.0*electron_mass_c2*bg2
393                   /(1.0+2.0*gamma*rateMass+rateMass*rateMass);
394
395       Tkin = maxEnergyTransfer;
396
397       if ( maxEnergyTransfer > Tmax)         
398       {
399          Tkin = Tmax;
400       }
401       if ( Tmax <= Tmin + 0.5*eV )         
402       {
403          Tkin = Tmin + 0.5*eV;
404       }
405       G4PAIxSection testPAIproton(k,Tkin,bg2);
406       
407       G4cout 
408         //      << kineticEnergy/keV<<"\t\t"
409         //      << gamma << "\t\t"
410               << bg << "\t\t"
411         //    << Tkin/keV<<"\t\t"     
412               << testPAIproton.GetIntegralCerenkov(1)*cm << "\t"
413               << testPAIproton.GetIntegralMM(1)*cm << "\t"
414               << testPAIproton.GetIntegralPlasmon(1)*cm << "\t"
415               << testPAIproton.GetIntegralResonance(1)*cm << "\t"
416         // << testPAIproton.GetIntegralCerenkov(1)*cm +
417         //      testPAIproton.GetIntegralPlasmon(1)*cm << "\t"
418         //      << FitALICE(bg) << "\t"
419         //      << FitBichsel(bg) << "\t"
420               << testPAIproton.GetIntegralPAIxSection(1)*cm << "\t\t" 
421          << G4endl;
422
423
424               
425       outFile
426         //      << kineticEnergy/keV<<"\t"
427         //       << gamma << "\t"
428               << bg << "\t\t"
429         //      << Tkin/keV<<"\t"
430               << testPAIproton.GetIntegralCerenkov(1)*cm << "\t"
431               << testPAIproton.GetIntegralMM(1)*cm << "\t"
432              << testPAIproton.GetIntegralPlasmon(1)*cm << "\t"
433               << testPAIproton.GetIntegralResonance(1)*cm << "\t"
434         //      << testPAIproton.GetIntegralCerenkov(1)*cm +
435         //      testPAIproton.GetIntegralPlasmon(1)*cm << "\t"
436         //      << FitALICE(bg) << "\t"
437         //      << FitBichsel(bg) << "\t"
438               << testPAIproton.GetIntegralPAIxSection(1)*cm << "\t" 
439               << G4endl;
440
441       //   outFile<<testPAIproton.GetLorentzFactor(j)<<"\t"
442       //          <<maxEnergyTransfer/keV<<"\t\t"
443       //          <<testPAIproton.GetPAItable(0,j)*cm/keV<<"\t\t"
444       //             <<testPAIproton.GetPAItable(1,j)*cm<<"\t\t"<<G4endl;
445
446             
447       /*
448       outFile<<testPAIproton.GetSplineSize()-1<<G4endl;
449
450       for( i = 1; i < testPAIproton.GetSplineSize(); i++)
451       {
452       outFile
453               << testPAIproton.GetSplineEnergy(i)/keV       << "\t"
454               << testPAIproton.GetIntegralCerenkov(i)*cm    << "\t"
455               << testPAIproton.GetIntegralMM(i)*cm    << "\t"
456               << testPAIproton.GetIntegralPlasmon(i)*cm     << "\t"
457               << testPAIproton.GetIntegralResonance(i)*cm   << "\t"
458               << testPAIproton.GetIntegralPAIxSection(i)*cm << "\t"
459               << G4endl;
460       }
461       
462       */
463
464       
465       /*
466       G4double position, transfer, lambda, range, r2cer=0., r2res=0., r2ruth=0., r2tot=0.;
467       G4int nCer = 0, nRes = 0, nRuth = 0, nTot = 0;
468       G4double rBin[100], rDistr[100], rTemp, rTemp2, sumDistr = 0., rSum = 0;
469       G4double ionBin[100], ionDistr[100], ionMean, ionRand, F = 0.19, ionSum=0., ionSigma;
470
471
472       for( i = 0; i < 100; i++)
473       {
474         ionBin[i] = i*1.;
475         ionDistr[i] = 0.;
476         rBin[i] = i/200.;
477         rDistr[i] = 0.;
478       }
479       for( i = 0; i < 10000; i++)
480       {
481         
482         position = testPAIproton.GetIntegralPAIxSection(1)*G4UniformRand();
483
484         if( position < testPAIproton.GetIntegralCerenkov(1) )
485         {
486           transfer = testPAIproton.GetCerenkovEnergyTransfer();
487           lambda   = testPAIproton.GetPhotonRange(transfer);
488           range    = testPAIproton.GetElectronRange(transfer);
489           r2cer   += 0.67*(lambda+range)*(lambda+range);
490           r2tot   += 0.67*(lambda+range)*(lambda+range);
491           rTemp2   = 0.67*(lambda+range)*(lambda+range);
492           nCer++;           
493         }
494         else if( position < (testPAIproton.GetIntegralCerenkov(1)+
495                              testPAIproton.GetIntegralResonance(1) ))
496         {
497           transfer = testPAIproton.GetResonanceEnergyTransfer();         
498           range    = testPAIproton.GetElectronRange(transfer);
499           r2res   += 0.67*range*range;
500           r2tot   += 0.67*range*range;           
501           rTemp2   = 0.67*range*range;           
502           nRes++;           
503         }
504         else
505         {
506           transfer = testPAIproton.GetRutherfordEnergyTransfer();         
507           range    = testPAIproton.GetElectronRange(transfer);
508           r2ruth  += range*range;
509           r2tot   += range*range;           
510           rTemp2   = range*range;           
511           nRuth++;           
512         }
513         nTot++;
514
515         rTemp = std::sqrt(rTemp2);
516         rSum += rTemp;
517
518         // rTemp = rTemp2;
519
520         for( j = 0; j < 100; j++ )
521         {
522           if( rTemp <= rBin[j] )
523           {
524             rDistr[j] += 1.;
525             break;
526           }
527         }
528         
529
530         transfer = testPAIproton.GetEnergyTransfer();         
531         ionMean  = GetIonisation(transfer);
532         ionSigma = std::sqrt(F*ionMean);
533
534         // ionRand  = G4RandGauss::shoot(ionMean, ionSigma);
535         ionRand  = ionMean;
536
537         if( ionRand < 0.) ionRand =0.;
538
539         ionSum += ionRand;
540         nTot++;
541 
542         for( j = 0; j < 100; j++ )
543         {
544           if( ionRand <= ionBin[j] )
545           {
546             ionDistr[j] += 1.;
547             break;
548           }
549         }
550       }
551       
552       if(nCer >0)  r2cer  /= nCer;
553       if(nRes >0)  r2res  /= nRes;
554       if(nRuth >0) r2ruth /= nRuth;
555                    r2tot /= nTot;
556                    rSum  /= nTot;
557       G4cout<<"nCer = "<<nCer<<"; nRes = "<<nRes<<"; nRuth = "<<nRuth<<G4endl;
558       G4cout<<"sum of n = "<<nCer+nRes+nRuth<<"; nTot = "<<nTot<<G4endl;
559       G4cout<<"rCer = "<<std::sqrt(r2cer)<<" mm; rRes = "<<std::sqrt(r2res)<<" mm"<<G4endl;
560       G4cout<<"rRuth = "<<std::sqrt(r2ruth)<<" mm; rTot = "<<std::sqrt(r2tot)<<" mm"<<G4endl;
561       G4cout<<"rSum = "<<rSum<<" mm; "<<G4endl;
562       
563                    ionSum  /= nTot;
564       G4cout<<"ionSum = "<<ionSum<<" electrons"<<G4endl;
565
566       outFile<<100<<G4endl;
567
568       for( j = 0; j < 100; j++ )
569       {
570         // outFile<<rBin[j]<<"\t"<<rDistr[j]<<G4endl;
571         outFile<<ionBin[j]<<"\t"<<ionDistr[j]<<G4endl;
572         sumDistr += rDistr[j];
573       }
574       G4cout<<"sumDistr = "<<sumDistr<<G4endl;
575       */
576       
577
578
579       kineticEnergy *= 1.41;        // was 1.4; 1.5;
580     }
581
582     G4cout<<G4endl;
583     // outFile<<G4endl;
584  }
585
586
587  return 1;  // end of test
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603  G4String confirm;
604  G4cout<<"Enter 'y' , if you would like to get dE/dx-distribution : "
605        <<std::flush;
606
607  G4cin>>confirm;
608  if(confirm != "y" ) return 1;
609  G4cout<<G4endl;
610
611  for(k=0;k<numOfMaterials;k++)
612  {
613    G4cout <<k<< "  Material : " <<(*theMaterialTable)[k]->GetName() << G4endl;
614  } 
615  G4cout<<"Enter material name for dE/dx-distribution : "<<std::flush;
616  G4cin>>testName;
617  G4cout<<G4endl;
618
619  G4int    iLoss, iStat, iStatMax, nGamma;
620  G4double energyLoss[50], Ebin, delta, delta1, delta2, delta3, step, y, pos;
621  G4double intProb[200], colDist, sum, fact, GF, lambda, aaa;
622
623  G4double alphaCrossTalk = -0.055, betaS = 0.2*0.4*keV;
624  G4int    spectrum[50];
625
626  G4cout << " Enter nGamma 1<nGamma<10 : "  <<std::flush;
627  G4cin>>nGamma;
628  G4cout<<G4endl;
629
630  for(k=0;k<numOfMaterials;k++)
631  {
632     if((*theMaterialTable)[k]->GetName() != testName) continue;
633
634     G4cout << "Material : " <<(*theMaterialTable)[k]->GetName() << G4endl<<G4endl;
635
636
637     G4cout << " Enter Lorentz factor : "  <<std::flush;
638     G4cin>>gamma;
639     G4cout<<G4endl;
640
641     G4cout << " Enter step in mm : " <<std::flush;
642     G4cin>>step;
643     G4cout<<G4endl;
644     step *= mm;
645
646     G4cout << " Enter energy bin in keV : " <<std::flush;
647     G4cin>>Ebin;
648     G4cout<<G4endl;
649     Ebin *= keV;
650
651     G4cout << " Enter number of events : " <<std::flush;
652     G4cin>>iStatMax;
653
654     G4cout<<G4endl<<"Start dE/dx distribution"<<G4endl<<G4endl;
655
656     maxEnergyTransfer = 100*keV;
657     bg2               = gamma*gamma - 1;
658     rateMass          = electron_mass_c2/proton_mass_c2;
659
660     Tmax              = 2.0*electron_mass_c2*bg2
661                          /(1.0+2.0*gamma*rateMass+rateMass*rateMass);
662
663     if ( maxEnergyTransfer > Tmax)         maxEnergyTransfer = Tmax;
664       
665     G4PAIxSection testPAIenergyLoss(k,maxEnergyTransfer,bg2);
666 
667     for( iLoss = 0; iLoss < 50; iLoss++ )
668     {
669        energyLoss[iLoss] = Ebin*iLoss;
670        spectrum[iLoss] = 0;
671     }
672     for(iStat=0;iStat<iStatMax;iStat++)
673     {
674
675       //   aaa = (G4double)nGamma;
676       //   lambda = aaa/step;
677       //   colDist = RandGamma::shoot(aaa,lambda);
678
679       //  delta = testPAIenergyLoss.GetStepEnergyLoss(colDist);
680
681       //  delta = testPAIenergyLoss.GetStepEnergyLoss(step);
682
683          delta1 = testPAIenergyLoss.GetStepEnergyLoss(step);
684
685          delta = G4RandGauss::shoot(delta1,0.3*delta1);
686          if( delta < 0.0 ) delta = 0.0;
687
688       //   delta2 = testPAIenergyLoss.GetStepEnergyLoss(step);
689       //   delta3 = testPAIenergyLoss.GetStepEnergyLoss(step);
690 
691       //   delta = alphaCrossTalk*delta1 +
692       //         delta2 + alphaCrossTalk*delta3 - betaS;
693
694       for(iLoss=0;iLoss<50;iLoss++)
695       {
696         if(delta <= energyLoss[iLoss]) break;
697       }
698       spectrum[iLoss-1]++;
699     }
700     G4double meanLoss = 0.0;
701
702     outFile<<"E, keV"<<"\t\t"<<"Distribution"<<G4endl<<G4endl;
703     G4cout<<"E, keV"<<"\t\t"<<"Distribution"<<G4endl<<G4endl;
704     G4cout<<G4endl;
705     for(iLoss=0;iLoss<50;iLoss++) // with last bin
706     {
707       fileOut<<energyLoss[iLoss]/keV<<"\t\t"<<spectrum[iLoss]<<G4endl;
708       G4cout<<energyLoss[iLoss]/keV<<"\t\t"<<spectrum[iLoss]<<G4endl;
709       meanLoss +=energyLoss[iLoss]*spectrum[iLoss];
710     }
711     G4cout<<G4endl;
712     G4cout<<"Mean loss over spectrum = "<<meanLoss/keV/iStatMax<<" keV"<<G4endl;
713  }
714
715  G4int exit = 1;
716
717  while(exit)
718  {
719     G4cout<<"Enter 'y' , if you would like to compare with exp. data : "<<std::flush;
720     G4cin>>confirm;
721     if(confirm != "y" ) break;
722     G4cout<<G4endl;
723
724     // Read experimental data file
725
726     G4double delExp[200], distr[200], deltaBin, sumPAI, sumExp;
727     G4int numberOfExpPoints;
728
729     G4cout<<G4endl;
730     G4cout << " Enter number of experimental points : " <<std::flush;
731     G4cin>>numberOfExpPoints;
732     G4cout<<G4endl;
733     G4cout << " Enter energy bin in keV : " <<std::flush;
734     G4cin>>deltaBin;
735     G4cout<<G4endl;
736     deltaBin *= keV;
737
738     std::ifstream fileRead;
739     fileRead.open("input.dat");
740     for(i=0;i<numberOfExpPoints;i++)
741     {
742       fileRead>>delExp[i]>>distr[i];
743       delExp[i] *= keV;
744       G4cout<<i<<"\t"<<delExp[i]<<"\t"<<distr[i]<<G4endl;
745     }
746     fileRead.close();
747
748     // Adjust statistics of experiment to PAI simulation
749
750     sumExp = 0.0;
751     for(i=0;i<numberOfExpPoints;i++) sumExp +=distr[i];
752     sumExp *= deltaBin;
753
754     sumPAI = 0.0;
755     for(i=0;i<49;i++) sumPAI +=spectrum[i];
756     sumPAI *= Ebin;
757
758     for(i=0;i<numberOfExpPoints;i++) distr[i] *= sumPAI/sumExp;
759
760     for(i=0;i<numberOfExpPoints;i++)
761     {
762       fileWrite<<delExp[i]/keV<<"\t"<<distr[i]<<G4endl;
763       G4cout<<delExp[i]/keV<<"\t"<<distr[i]<<G4endl;
764     }
765     exit = 0;
766  }
767
768  G4cout<<"Enter 'y' , if you would like to get most probable delta : "<<std::flush;
769  G4cin>>confirm;
770  if(confirm != "y" ) return 1;
771  G4cout<<G4endl;
772
773  G4int kGamma, iMPLoss, maxSpectrum, iMax;
774  G4double mpDelta[50], meanDelta[50], rrMP[50], rrMean[50]; 
775  G4double mpLoss, tmRatio, mpSum, mpStat;
776
777  G4double aGamma[33] = 
778  {
779    4.0, 1.5, 1.8, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 6.0, 8.0, 10.0, // 13
780    20., 40.0, 60.0, 80.0, 100.0, 200.0, 400.0, 600.0, 800.0, 1000.0, // 23
781    2000.0, 4000.0, 6000.0, 8000.0, 100000.0, 20000.0,                // 29
782    40000.0, 60000.0, 80000.0, 100000.0                               // 33
783  };
784
785  for(k=0;k<numOfMaterials;k++)
786  {
787    G4cout <<k<< "  Material : " <<(*theMaterialTable)[k]->GetName() << G4endl;
788  } 
789  G4cout<<"Enter material name for dE/dx-distribution : "<<std::flush;
790  G4cin>>testName;
791  G4cout<<G4endl;
792
793
794  for(k=0;k<numOfMaterials;k++)
795  {
796     if((*theMaterialTable)[k]->GetName() != testName) continue;
797
798     G4cout << "Material : " <<(*theMaterialTable)[k]->GetName() << G4endl<<G4endl;
799
800     G4cout << " Enter nGamma 1<nGamma<10 : "  <<std::flush;
801     G4cin>>nGamma;
802     G4cout<<G4endl;
803
804
805     G4cout << " Enter step in mm : " <<std::flush;
806     G4cin>>step;
807     G4cout<<G4endl;
808     step *= mm;
809
810     G4cout << " Enter energy bin in keV : " <<std::flush;
811     G4cin>>Ebin;
812     G4cout<<G4endl;
813     Ebin *= keV;
814
815     G4cout << " Enter trancated mean ration <1.0 : "  <<std::flush;
816     G4cin>>tmRatio;
817     G4cout<<G4endl;
818
819
820     G4cout << " Enter number of events : " <<std::flush;
821     G4cin>>iStatMax;
822     G4cout<<G4endl;
823
824     G4cout<<"no."<<"\t"<<"Gamma"<<"\t"<<"Rel. rise"<<"\t"<<"M.P. loss, keV"
825           <<"\t"<<"Mean loss, keV"<<G4endl<<G4endl;
826     //   outFile<<"no."<<"\t"<<"Gamma"<<"\t"<<"M.P. loss, keV"
827     //      <<"\t"<<"Mean loss, keV"<<G4endl<<G4endl;
828     
829
830     // gamma = 1.1852;
831
832     for(kGamma=0;kGamma<33;kGamma++)
833     {
834       //    G4cout<<G4endl<<"Start dE/dx distribution"<<G4endl<<G4endl;
835
836       gamma = aGamma[kGamma];
837       maxEnergyTransfer = 100*keV;
838       bg2               = gamma*gamma - 1;
839       rateMass          = electron_mass_c2/proton_mass_c2;
840
841       Tmax              = 2.0*electron_mass_c2*bg2
842                          /(1.0+2.0*gamma*rateMass+rateMass*rateMass);
843
844       if ( maxEnergyTransfer > Tmax)         maxEnergyTransfer = Tmax;
845       
846       G4PAIxSection testPAIenergyLoss(k,maxEnergyTransfer,bg2);
847 
848       for( iLoss = 0; iLoss < 50; iLoss++ )
849       {
850         energyLoss[iLoss] = Ebin*iLoss;
851         spectrum[iLoss] = 0;
852       }
853       for(iStat=0;iStat<iStatMax;iStat++)
854       {
855
856         //   aaa = (G4double)nGamma;
857         //   lambda = aaa/step;
858         //   colDist = RandGamma::shoot(aaa,lambda);
859
860         //  delta = testPAIenergyLoss.GetStepEnergyLoss(colDist);
861
862         delta = testPAIenergyLoss.GetStepEnergyLoss(step);
863
864         //   delta1 = testPAIenergyLoss.GetStepEnergyLoss(step);
865         //   delta2 = testPAIenergyLoss.GetStepEnergyLoss(step);
866         //   delta3 = testPAIenergyLoss.GetStepEnergyLoss(step);
867 
868         //   delta = alphaCrossTalk*delta1 +
869         //         delta2 + alphaCrossTalk*delta3 - betaS;
870
871         for(iLoss=0;iLoss<50;iLoss++)
872         {
873           if(delta <= energyLoss[iLoss]) break;
874         }
875         spectrum[iLoss-1]++;
876       }
877       G4int sumStat = 0;
878       for(iLoss=0;iLoss<49;iLoss++) // without last bin
879       {
880         sumStat += spectrum[iLoss];
881         if( sumStat > tmRatio*iStatMax  ) break;
882       }
883       if(iLoss == 50) iLoss--;
884       iMPLoss = iLoss;
885       G4double meanLoss = 0.0;
886       maxSpectrum = 0;
887
888       for(iLoss=0;iLoss<iMPLoss;iLoss++) // without last bin
889       {
890         // fileOut<<energyLoss[iLoss]/keV<<"\t\t"<<spectrum[iLoss]<<G4endl;
891         //  G4cout<<energyLoss[iLoss]/keV<<"\t\t"<<spectrum[iLoss]<<G4endl;
892
893         meanLoss += energyLoss[iLoss]*spectrum[iLoss];
894
895         if( spectrum[iLoss] > maxSpectrum )
896         {
897           maxSpectrum = spectrum[iLoss]  ;
898           mpLoss      = energyLoss[iLoss];
899           iMax = iLoss;
900         }
901       }
902       mpSum  = 0.;
903       mpStat = 0;
904       for(iLoss = iMax-5;iLoss<=iMax+5;iLoss++)
905       {
906         mpSum += energyLoss[iLoss]*spectrum[iLoss];
907         mpStat += spectrum[iLoss];
908       }
909       mpLoss = mpSum/mpStat;
910       mpLoss /= keV;
911       meanLoss /= keV*sumStat;
912       meanDelta[kGamma] = meanLoss;
913       mpDelta[kGamma] = mpLoss;
914
915       if(kGamma > 0)
916       {
917         rrMP[kGamma] = mpLoss/mpDelta[0];
918         G4cout<<kGamma<<"\t"<<gamma<<"\t"<<rrMP[kGamma]<<"\t"<<mpLoss<<G4endl;
919         //  outFile<<gamma<<"\t"<<rrMP[kGamma]<<G4endl;
920         fileWrite1<<gamma<<"\t"<<rrMP[kGamma]<<G4endl;
921       }
922
923       //  gamma *= 1.5;
924    }
925    G4cout<<G4endl;
926    outFile<<G4endl; 
927  }   
928
929   return EXIT_SUCCESS;
930
931}
932
933
934
935
936
937
938
939
940
941
Note: See TracBrowser for help on using the repository browser.