| 1 |
From Cecilia.Pizzolotto@ts.infn.it Fri Apr 10 09:30:53 2009 |
| 2 |
Date: Fri, 10 Apr 2009 09:30:35 +0200 |
| 3 |
From: Cecilia Pizzolotto <Cecilia.Pizzolotto@ts.infn.it> |
| 4 |
To: Emiliano Mocchiutti <Emiliano.Mocchiutti@ts.infn.it> |
| 5 |
Subject: spherical distribution |
| 6 |
|
| 7 |
// Spherical distribution -- Test by Cecilia P march 2009 |
| 8 |
-----------------------------/// |
| 9 |
-25 25 -25 25 108 108 |
| 10 |
void PamVMCPrimaryGenerator::GenSphPhiThe(Double_t xmin, Double_t xmax, |
| 11 |
Double_t ymin, Double_t ymax, |
| 12 |
Double_t zmin, Double_t zmax) |
| 13 |
{ |
| 14 |
Bool_t trkGood = kFALSE; |
| 15 |
Double_t theta = 999.; |
| 16 |
Double_t phi = 0.; |
| 17 |
Double_t x2,y2,x3,y3; |
| 18 |
|
| 19 |
//static const Double_t rad2deg = 57.2958; |
| 20 |
|
| 21 |
//static const Double_t s1_xmax=20.4, s1_ymax=16.5, s1_pz=102.8866; |
| 22 |
// calo cavity 8.07x6.57 with z2=71.6 z3=27.4 circa |
| 23 |
static const Double_t s2_xmax=7.8, s2_ymax=6.0, s2_z=73.489; |
| 24 |
static const Double_t s3_xmax=8.0, s3_ymax=6.0, s3_z=25.3159; |
| 25 |
|
| 26 |
// Generate random position unif. distr. |
| 27 |
// GenPosition(-25.,25., 25.,25., 108.0,108.0); |
| 28 |
// Double_t x0= fprim.fX0; |
| 29 |
// Double_t y0= fprim.fY0; |
| 30 |
// Double_t z0= fprim.fZ0; |
| 31 |
Double_t x0= frnd->Uniform(xmin,xmax); |
| 32 |
Double_t y0= frnd->Uniform(ymin,ymax); |
| 33 |
Double_t z0= frnd->Uniform(zmin,zmax); |
| 34 |
Int_t posGood = 0; |
| 35 |
|
| 36 |
|
| 37 |
while (trkGood!=kTRUE) |
| 38 |
{ |
| 39 |
// Generate phi theta |
| 40 |
theta=999.; // init |
| 41 |
while (theta>=0.82) //take only theta smaller than 30deg=0.52rad |
| 42 |
{ |
| 43 |
Double_t xcos = sqrt( frnd->Uniform(0.,1.) ); |
| 44 |
theta = acos(xcos); //RAD |
| 45 |
} |
| 46 |
phi = frnd->Uniform(0.,2.*Pi()); |
| 47 |
|
| 48 |
// Calculate xy at beginning/end of magnet cavity |
| 49 |
Double_t fact2 = (s2_z-z0)/cos(theta); |
| 50 |
x2 = x0 + fabs(fact2) * sin(theta) * cos(phi); |
| 51 |
y2 = y0 + fabs(fact2) * sin(theta) * sin(phi); |
| 52 |
Double_t fact3 = (s3_z-z0)/cos(theta); |
| 53 |
x3 = x0 + fabs(fact3) * sin(theta) * cos(phi); |
| 54 |
y3 = y0 + fabs(fact3) * sin(theta) * sin(phi); |
| 55 |
|
| 56 |
// Test condition on the direction |
| 57 |
if ( Abs(x2) <= Abs(s2_xmax) && Abs(y2) <= Abs(s2_ymax) && |
| 58 |
Abs(x3) <= Abs(s3_xmax) && Abs(y3) <= Abs(s3_ymax) ) { |
| 59 |
trkGood = kTRUE; |
| 60 |
//cout<<" x/y0= "<<x0<<" "<<y0<<" x/y2= "<<fact2*sin(theta)*cos(phi)<<" "<<x2<<" xy3= "<< |
| 61 |
// fact3*sin(theta)*cos(phi)<<" "<<x3<<endl; |
| 62 |
} |
| 63 |
|
| 64 |
//if from current x0y0z0 the condition are not satysfied for any angle => def new start position |
| 65 |
posGood++; |
| 66 |
if ( posGood == 100 ) |
| 67 |
{ |
| 68 |
x0= frnd->Uniform(xmin,xmax); |
| 69 |
y0= frnd->Uniform(ymin,ymax); |
| 70 |
z0= frnd->Uniform(zmin,zmax); |
| 71 |
posGood = 0; |
| 72 |
} |
| 73 |
|
| 74 |
} |
| 75 |
|
| 76 |
// Set direction and position: |
| 77 |
SetDirection(theta, phi); |
| 78 |
SetPosition(x0, y0, z0); |
| 79 |
|
| 80 |
return; |
| 81 |
} |
| 82 |
//--- end Test by Cecilia ------------------------------------/// |
| 83 |
|