Logo Coherent WaveBurst  
Reference Guide
Logo
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
GNGen.cc
Go to the documentation of this file.
1 #include "GNGen.hh"
2 
3 #include "TF1.h"
4 
5 #include "math.h"
6 
7 static const double G = 6.67384e-11;
8 static const double SM = 1.9891e30;
9 static const double PC = 3.08567758e16;
10 static const double C = 299792458;
11 static const double Pi = 3.14159265358979312;
12 
13 static const double DistUnit = G*SM/C/C;
14 static const double TimeUnit = G*SM/C/C/C;
15 
16 // work in units G=c=SM=1
17 
18 
19 GNGen::GNGen(double mSMBH, double mmin, double mmax, double beta): rnd(0)
20 {
21  this->beta = beta;
22  smbhM = mSMBH;
23 
24  minM = mmin;
25  maxM = mmax;
26  freqCutoff = 20.;
27 
28  double normm = (beta-1)/(1./pow(minM, beta-1) - 1./pow(maxM, beta-1));
29 
30  int nBins = 100;
31  double dm = (maxM - minM)/nBins;
32 
33  double rmin = 0.001; // pc
34  double rmax = 1; // pc
35  double rrmin = rmin*PC/DistUnit;
36  double rrmax = rmax*PC/DistUnit;
37 
38  double dr = (rmax - rmin)/nBins;
39  double r = rmin + dr/2;
40 
41  double p0 = 0.5;
42  double const bmaxc = pow(340*Pi/3, 1./7);
43  double totrate = 0;
44  dGammadmdMdr = new TH3F("d", "", nBins, mmin, mmax, nBins, mmin, mmax, nBins, rmin, rmax);
45 
46  for(int i=0; i<nBins; ++i){
47  double rr = r*PC/DistUnit; // r in the chosen units
48  double vofr = sqrt(mSMBH/rr);
49  //printf("Sanity check: %lf vs %lf\n", vofr, sqrt(G*mSMBH*SM/r/PC)/C);
50 
51  for(int j=0; j<nBins-1; ++j){
52  double m1 = mmin + (j+0.5)*dm;
53  double tmp = 3./2 - p0*m1/maxM;
54  double norm1 = tmp/( pow(rrmax, tmp) - pow(rrmin, tmp) )/4/Pi ;
55 
56  for(int k=j+1; k<nBins; ++k){
57  double m2 = mmin + (k+0.5)*dm;
58  double M = m1 + m2;
59  double eta = m1*m2/M/M;
60 
61  double bmax = bmaxc*M*pow(eta, 1./7)/pow(vofr, 9./7); // eq. 17
62  double sigmaC = Pi*bmax*bmax;
63 
64  tmp = 3./2 - p0*m2/maxM;
65  double norm2 = tmp/( pow(rrmax, tmp) - pow(rrmin, tmp) )/4/Pi ;
66  double bhDensityProd = normm*normm*norm1*norm2/pow(rr, 3 + p0*M/maxM)/pow(m1*m2, beta); // n1(r)*n2(r)
67 
68  double rate = bhDensityProd*sigmaC*vofr*4*Pi*rr*rr;
69 
70  totrate += rate;
71  dGammadmdMdr->Fill(m1, m2, r, rate/1e-48); //4Pi ignored
72  //dGammadmdMdr->Fill(m1, m2, r, 1./pow(m1, beta)/pow(m2, beta));
73  }
74  }
75  r+= dr;
76  }
77 
78  //printf("totrate (yr) = %le\n", totrate*dm*dm*dr*PC/DistUnit/TimeUnit*365.*24*3600);
79 }
80 
81 GNGen::GNGen(const GNGen& x) : rnd(0)
82 { minM = x.minM;
83  maxM = x.minM;
84  beta = x.beta;
85  smbhM = x.smbhM;
86  dGammadmdMdr = (TH3F*)x.dGammadmdMdr->Clone();
88 }
89 
91 { delete dGammadmdMdr;
92 }
93 
94 void GNGen::setFreqCutoff(double f)
95 { freqCutoff = f;
96 }
97 
98 static double g(double e) // used in a(e)
99 { const double c1 = 12./19;
100  const double c2 = 121./304;
101  const double c3 = 870./2299;
102  double e2 = e*e;
103  return exp(c1*log(e)+c3*log(1+c2*e2))/(1-e2);
104  //TF1 gG("gG4", "19./48*exp ( 4*0.631578947368421018*log(x) + 4*0.37842540234884730*log(1+0.398026315789473673*x*x) - 0.5*log(1-x*x))", 0, 1);
105 
106 }
107 
108 static double Duration(double m1, double m2, double rp, double ra)
109 {
110  static TF1 F("F", "exp(1.52631578947368429*log(x) + 0.513701609395389336*log(1+0.398026315789473673*x*x) - 1.5*log(1-x*x))", 0, 1);
111 
112  double tM = (m1+m2)*SM;
113  double rM = m1*m2/(m1+m2)*SM;
114  double e = (ra-rp)/(ra+rp);
115  double a = (ra+rp)*(m1+m2)*DistUnit/2;
116 
117 
118  double aux = C*a/g(e)/G/sqrt(tM);
119  aux *= aux;
120  aux *= aux;
121  return F.Integral(0, e)*aux*15./304*C*G/rM;
122 
123 }
124 
125 double HT()
126 { double tM = 2.8, rM = 0.7;
127  double T0 = 7.75*3600;
128  double e = 0.617;
129  double a0 = exp( log( G*tM*SM/(4*Pi*Pi/T0/T0) )/3 );
130  // e = 1- rp/a
131  a0 /= tM*DistUnit;
132  double rp = (1-e)*a0;
133  double ra = 2*a0 - rp;
134  return Duration(1.4, 1.4, rp, ra);
135 }
136 
137 double DiffEq( double ee, double aa)
138 {
139  double dade = ((12*aa*(1. + (73./24)*ee*ee + (37./96)*pow(ee,4.)))/(19.*ee*(1-ee*ee)*(1. + (121./304)*ee*ee)));
140  return dade;
141 }
142 
143 void GNGen::EvolveRa(double m1, double m2, double& rp, double& ra)
144 {
145 
146  double a = (ra + rp)/2.;
147  double e = (ra- rp)/(ra + rp);
148  double totMass = m1+m2;
149  double da, de=.1;
150  double k1, k2, k3, k4, k5, K=1.e10;
151 
152  while(fabs(1.-k1/K)>.01 || fabs(1.-k2/K)>.01 || fabs(1.-k3/K)>.01 || fabs(1-k4/K)>.01 || fabs(1.-k5/K)>.01) {
153  k1 = de * DiffEq(e, a);
154  k2 = de * DiffEq(e + de/3., a + k1/3.);
155  k3 = de * DiffEq(e + de/3., a + k1/6. + k2/6.);
156  k4 = de * DiffEq(e + de/2., a + k1/8. + 3.*k3/8.);
157  k5 = de * DiffEq(e + de, a - k1/2. -3*k3/2. + 2*k4);
158  da = (k1 + 4.*k4 + k5)/6.;
159  de /= 2.;
160  K = (k1 + k2 + k3 +k4 +k5)/5.;
161  }
162 
163  while(rp>10.) {
164  k1 = de * DiffEq(e, a);
165  k2 = de * DiffEq(e + de/3., a + k1/3.);
166  k3 = de * DiffEq(e + de/3., a + k1/6. + k2/6.);
167  k4 = de * DiffEq(e + de/2., a + k1/8. + 3.*k3/8.);
168  k5 = de * DiffEq(e + de, a - k1/2. -3*k3/2. + 2*k4);
169  da = (k1 + 4.*k4 + k5)/6.;
170  a -= da;
171  e -= de;
172  rp = (1. - e) * a;
173  ra = (1. + e) * a;
174  if(da/a>.01) de /=2.;
175  if(da/a<.001) de *=2.;
176 
177  double freq = sqrt(0.5/rp)/(rp*Pi*totMass*TimeUnit);
178  if(freq>freqCutoff) break;
179  }
180 }
181 
182 
183 double GNGen::generateEvent(double& m1, double& m2, double &rp, double& e)
184 { const double dE_const = 85*Pi/12/sqrt(2);
185  double r, ra, vra;
186  double M , m, eta, rr, vofr, E0, rpm;
187 
188  do{
189  dGammadmdMdr->GetRandom3(m1, m2, r);
190 
191  M = m1 + m2;
192  m = m1*m2/M;
193  eta = m/M;
194 
195  rr = r*PC/DistUnit; // r in G=c=SM=1 units
196  vofr = sqrt(smbhM/rr); // v(r)
197  E0 = m*vofr*vofr/2;
198 
199  rpm = pow(dE_const*eta*m/E0, 2./7)*M;
200  }
201  while(rpm<7.5*M);
202  do{
203  double rndnr = rnd.Uniform(); //printf("random nr = %lf\n", rndnr);
204  rp = rndnr*rpm;
205  //std::cout<<"m1: "<<m1<<" m2:"<<m2<<" rp/M:"<<rp/M<<" rndnr: "<<rndnr<<std::endl;
206  }
207  while(rp<7.5*M);
208 
209  double L0 = m*sqrt(2*rp*M + pow(vofr*rp, 2)); // bmw ; b = rp*sqrt(1 + 2GM/w^2rp)
210 
211  double deltaE = -dE_const*eta*m*pow(M/rp, 3.5);
212  double deltaL = -6*Pi*pow(M*m/rp, 2);
213 
214  //accounting for both energy and angular momentum losses:
215  double lom = (L0 + deltaL)/m;
216  double aux = M/lom;
217  double aux2 = sqrt( aux*aux + 2*(E0+deltaE)/m );
218 
219  ra = lom/(aux - aux2);
220  vra = lom/ra;
221  rp = lom/(aux + aux2);
222  //double e0 = (ra - rp)(ra+rp);
223 
224  rp /= M; // in units of total M
225  ra /= M; // in units of total M
226 
227  EvolveRa(m1, m2, rp, ra);
228 
229  //t = HT()/365.25/24./3600;
230  e = (ra-rp)/(ra+rp);
231  return Duration(m1, m2, rp, ra);
232 }
233 
234 void GNGen::generateEvents(int n, char* fn)
235 { double m1, m2, rp, e;
236  FILE* f = stdout;
237  if(fn)f=fopen(fn, "w");
238  for(int i=0; i<n; ++i){
239 
240  generateEvent(m1, m2, rp, e);
241  //double q = m1/m2;
242  //if(q>1) q = 1./q;
243 
244  fprintf(f, "%d %lf %lf %lf %.8lf\n", i, m1, m2, rp, e);
245  //printf("%d %lf %lf %lf %lf %le %.8lf\n", i, m1, m2, ra, rp, vra, (ra-rp)/(ra+rp));
246  }
247  if(fn)fclose(f);
248 }
static const double C
Definition: GNGen.cc:10
double aux
Definition: testWDM_5.C:14
static double g(double e)
Definition: GNGen.cc:98
tuple f
Definition: cwb_online.py:91
fprintf(stdout,"start=%f duration=%f rate=%f\n", x.start(), x.size()/x.rate(), x.rate())
wavearray< double > a(hp.size())
int n
Definition: cwb_net.C:10
double beta
int nBins
cout<< endl;cout<< "ts size = "<< ts.size()<< " ts rate = "<< ts.rate()<< endl;tf.Forward(ts, wdm);int levels=tf.getLevel();cout<< "tf size = "<< tf.size()<< endl;double dF=tf.resolution();double dT=1./(2 *dF);cout<< "rate(hz) : "<< RATE<< "\t layers : "<< nLAYERS<< "\t dF(hz) : "<< dF<< "\t dT(ms) : "<< dT *1000.<< endl;int itime=TIME_PIXEL_INDEX;int ifreq=FREQ_PIXEL_INDEX;int index=(levels+1)*itime+ifreq;double time=itime *dT;double freq=(ifreq >0)?ifreq *dF:dF/4;cout<< endl;cout<< "PIXEL TIME = "<< time<< " sec "<< endl;cout<< "PIXEL FREQ = "<< freq<< " Hz "<< endl;cout<< endl;wavearray< double > x
void generateEvents(int n, char *fn=0)
Definition: GNGen.cc:234
static const double Pi
Definition: GNGen.cc:11
static const double DistUnit
Definition: GNGen.cc:13
#define M
Definition: UniqSLagsList.C:3
int m
Definition: cwb_net.C:10
int j
Definition: cwb_net.C:10
i drho i
TRandom3 rnd(1)
TH3F * dGammadmdMdr
Definition: GNGen.hh:26
static const double PC
Definition: GNGen.cc:9
TRandom3 rnd
Definition: GNGen.hh:27
double ra
Definition: ConvertGWGC.C:46
~GNGen()
Definition: GNGen.cc:90
TCanvas * c1
static const double SM
Definition: GNGen.cc:8
bool log
Definition: WaveMDC.C:41
double * tmp
Definition: testWDM_5.C:31
double rp
void setFreqCutoff(double f)
Definition: GNGen.cc:94
static const double TimeUnit
Definition: GNGen.cc:14
int k
m1
Definition: cbc_plots.C:606
double F
double minM
Definition: GNGen.hh:25
double e
static const double G
Definition: GNGen.cc:7
Definition: GNGen.hh:7
double maxM
Definition: GNGen.hh:25
regression r
Definition: Regression_H1.C:44
static double Duration(double m1, double m2, double rp, double ra)
Definition: GNGen.cc:108
GNGen(double mSMBH, double mmin, double mmax, double beta=2)
Definition: GNGen.cc:19
double beta
Definition: GNGen.hh:25
double smbhM
Definition: GNGen.hh:25
double generateEvent(double &m1, double &m2, double &rp, double &e)
Definition: GNGen.cc:183
double HT()
Definition: GNGen.cc:125
double fabs(const Complex &x)
Definition: numpy.cc:37
double DiffEq(double ee, double aa)
Definition: GNGen.cc:137
TCanvas * c2
Definition: slag.C:207
double mmax
void EvolveRa(double m1, double m2, double &rp, double &ra)
Definition: GNGen.cc:143
fclose(ftrig)
double mmin
char c3[8]
double freqCutoff
Definition: GNGen.hh:28
m2
Definition: cbc_plots.C:607