Logo coherent WaveBurst  
Library Reference Guide
Logo
GNGen.cc
Go to the documentation of this file.
1 /*
2 # Copyright (C) 2019 Sergey Klimenko, Valentin Necula, Vaibhav Tiwari
3 #
4 # This program is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation, either version 3 of the License, or
7 # (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program. If not, see <https://www.gnu.org/licenses/>.
16 */
17 
18 
19 #include "GNGen.hh"
20 
21 #include "TF1.h"
22 
23 #include "math.h"
24 
25 static const double G = 6.67384e-11;
26 static const double SM = 1.9891e30;
27 static const double PC = 3.08567758e16;
28 static const double C = 299792458;
29 static const double Pi = 3.14159265358979312;
30 
31 static const double DistUnit = G*SM/C/C;
32 static const double TimeUnit = G*SM/C/C/C;
33 
34 // work in units G=c=SM=1
35 
36 
37 GNGen::GNGen(double mSMBH, double mmin, double mmax, double beta): rnd(0)
38 {
39  this->beta = beta;
40  smbhM = mSMBH;
41 
42  minM = mmin;
43  maxM = mmax;
44  freqCutoff = 20.;
45 
46  double normm = (beta-1)/(1./pow(minM, beta-1) - 1./pow(maxM, beta-1));
47 
48  int nBins = 100;
49  double dm = (maxM - minM)/nBins;
50 
51  double rmin = 0.001; // pc
52  double rmax = 1; // pc
53  double rrmin = rmin*PC/DistUnit;
54  double rrmax = rmax*PC/DistUnit;
55 
56  double dr = (rmax - rmin)/nBins;
57  double r = rmin + dr/2;
58 
59  double p0 = 0.5;
60  double const bmaxc = pow(340*Pi/3, 1./7);
61  double totrate = 0;
62  dGammadmdMdr = new TH3F("d", "", nBins, mmin, mmax, nBins, mmin, mmax, nBins, rmin, rmax);
63 
64  for(int i=0; i<nBins; ++i){
65  double rr = r*PC/DistUnit; // r in the chosen units
66  double vofr = sqrt(mSMBH/rr);
67  //printf("Sanity check: %lf vs %lf\n", vofr, sqrt(G*mSMBH*SM/r/PC)/C);
68 
69  for(int j=0; j<nBins-1; ++j){
70  double m1 = mmin + (j+0.5)*dm;
71  double tmp = 3./2 - p0*m1/maxM;
72  double norm1 = tmp/( pow(rrmax, tmp) - pow(rrmin, tmp) )/4/Pi ;
73 
74  for(int k=j+1; k<nBins; ++k){
75  double m2 = mmin + (k+0.5)*dm;
76  double M = m1 + m2;
77  double eta = m1*m2/M/M;
78 
79  double bmax = bmaxc*M*pow(eta, 1./7)/pow(vofr, 9./7); // eq. 17
80  double sigmaC = Pi*bmax*bmax;
81 
82  tmp = 3./2 - p0*m2/maxM;
83  double norm2 = tmp/( pow(rrmax, tmp) - pow(rrmin, tmp) )/4/Pi ;
84  double bhDensityProd = normm*normm*norm1*norm2/pow(rr, 3 + p0*M/maxM)/pow(m1*m2, beta); // n1(r)*n2(r)
85 
86  double rate = bhDensityProd*sigmaC*vofr*4*Pi*rr*rr;
87 
88  totrate += rate;
89  dGammadmdMdr->Fill(m1, m2, r, rate/1e-48); //4Pi ignored
90  //dGammadmdMdr->Fill(m1, m2, r, 1./pow(m1, beta)/pow(m2, beta));
91  }
92  }
93  r+= dr;
94  }
95 
96  //printf("totrate (yr) = %le\n", totrate*dm*dm*dr*PC/DistUnit/TimeUnit*365.*24*3600);
97 }
98 
99 GNGen::GNGen(const GNGen& x) : rnd(0)
100 { minM = x.minM;
101  maxM = x.minM;
102  beta = x.beta;
103  smbhM = x.smbhM;
104  dGammadmdMdr = (TH3F*)x.dGammadmdMdr->Clone();
106 }
107 
109 { delete dGammadmdMdr;
110 }
111 
113 { freqCutoff = f;
114 }
115 
116 static double g(double e) // used in a(e)
117 { const double c1 = 12./19;
118  const double c2 = 121./304;
119  const double c3 = 870./2299;
120  double e2 = e*e;
121  return exp(c1*log(e)+c3*log(1+c2*e2))/(1-e2);
122  //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);
123 
124 }
125 
126 static double Duration(double m1, double m2, double rp, double ra)
127 {
128  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);
129 
130  double tM = (m1+m2)*SM;
131  double rM = m1*m2/(m1+m2)*SM;
132  double e = (ra-rp)/(ra+rp);
133  double a = (ra+rp)*(m1+m2)*DistUnit/2;
134 
135 
136  double aux = C*a/g(e)/G/sqrt(tM);
137  aux *= aux;
138  aux *= aux;
139  return F.Integral(0, e)*aux*15./304*C*G/rM;
140 
141 }
142 
143 double HT()
144 { double tM = 2.8, rM = 0.7;
145  double T0 = 7.75*3600;
146  double e = 0.617;
147  double a0 = exp( log( G*tM*SM/(4*Pi*Pi/T0/T0) )/3 );
148  // e = 1- rp/a
149  a0 /= tM*DistUnit;
150  double rp = (1-e)*a0;
151  double ra = 2*a0 - rp;
152  return Duration(1.4, 1.4, rp, ra);
153 }
154 
155 double DiffEq( double ee, double aa)
156 {
157  double dade = ((12*aa*(1. + (73./24)*ee*ee + (37./96)*pow(ee,4.)))/(19.*ee*(1-ee*ee)*(1. + (121./304)*ee*ee)));
158  return dade;
159 }
160 
161 void GNGen::EvolveRa(double m1, double m2, double& rp, double& ra)
162 {
163 
164  double a = (ra + rp)/2.;
165  double e = (ra- rp)/(ra + rp);
166  double totMass = m1+m2;
167  double da, de=.1;
168  double k1, k2, k3, k4, k5, K=1.e10;
169 
170  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) {
171  k1 = de * DiffEq(e, a);
172  k2 = de * DiffEq(e + de/3., a + k1/3.);
173  k3 = de * DiffEq(e + de/3., a + k1/6. + k2/6.);
174  k4 = de * DiffEq(e + de/2., a + k1/8. + 3.*k3/8.);
175  k5 = de * DiffEq(e + de, a - k1/2. -3*k3/2. + 2*k4);
176  da = (k1 + 4.*k4 + k5)/6.;
177  de /= 2.;
178  K = (k1 + k2 + k3 +k4 +k5)/5.;
179  }
180 
181  while(rp>10.) {
182  k1 = de * DiffEq(e, a);
183  k2 = de * DiffEq(e + de/3., a + k1/3.);
184  k3 = de * DiffEq(e + de/3., a + k1/6. + k2/6.);
185  k4 = de * DiffEq(e + de/2., a + k1/8. + 3.*k3/8.);
186  k5 = de * DiffEq(e + de, a - k1/2. -3*k3/2. + 2*k4);
187  da = (k1 + 4.*k4 + k5)/6.;
188  a -= da;
189  e -= de;
190  rp = (1. - e) * a;
191  ra = (1. + e) * a;
192  if(da/a>.01) de /=2.;
193  if(da/a<.001) de *=2.;
194 
195  double freq = sqrt(0.5/rp)/(rp*Pi*totMass*TimeUnit);
196  if(freq>freqCutoff) break;
197  }
198 }
199 
200 
201 double GNGen::generateEvent(double& m1, double& m2, double &rp, double& e)
202 { const double dE_const = 85*Pi/12/sqrt(2);
203  double r, ra, vra;
204  double M , m, eta, rr, vofr, E0, rpm;
205 
206  do{
207  dGammadmdMdr->GetRandom3(m1, m2, r);
208 
209  M = m1 + m2;
210  m = m1*m2/M;
211  eta = m/M;
212 
213  rr = r*PC/DistUnit; // r in G=c=SM=1 units
214  vofr = sqrt(smbhM/rr); // v(r)
215  E0 = m*vofr*vofr/2;
216 
217  rpm = pow(dE_const*eta*m/E0, 2./7)*M;
218  }
219  while(rpm<7.5*M);
220  do{
221  double rndnr = rnd.Uniform(); //printf("random nr = %lf\n", rndnr);
222  rp = rndnr*rpm;
223  //std::cout<<"m1: "<<m1<<" m2:"<<m2<<" rp/M:"<<rp/M<<" rndnr: "<<rndnr<<std::endl;
224  }
225  while(rp<7.5*M);
226 
227  double L0 = m*sqrt(2*rp*M + pow(vofr*rp, 2)); // bmw ; b = rp*sqrt(1 + 2GM/w^2rp)
228 
229  double deltaE = -dE_const*eta*m*pow(M/rp, 3.5);
230  double deltaL = -6*Pi*pow(M*m/rp, 2);
231 
232  //accounting for both energy and angular momentum losses:
233  double lom = (L0 + deltaL)/m;
234  double aux = M/lom;
235  double aux2 = sqrt( aux*aux + 2*(E0+deltaE)/m );
236 
237  ra = lom/(aux - aux2);
238  vra = lom/ra;
239  rp = lom/(aux + aux2);
240  //double e0 = (ra - rp)(ra+rp);
241 
242  rp /= M; // in units of total M
243  ra /= M; // in units of total M
244 
245  EvolveRa(m1, m2, rp, ra);
246 
247  //t = HT()/365.25/24./3600;
248  e = (ra-rp)/(ra+rp);
249  return Duration(m1, m2, rp, ra);
250 }
251 
252 void GNGen::generateEvents(int n, char* fn)
253 { double m1, m2, rp, e;
254  FILE* f = stdout;
255  if(fn)f=fopen(fn, "w");
256  for(int i=0; i<n; ++i){
257 
258  generateEvent(m1, m2, rp, e);
259  //double q = m1/m2;
260  //if(q>1) q = 1./q;
261 
262  fprintf(f, "%d %lf %lf %lf %.8lf\n", i, m1, m2, rp, e);
263  //printf("%d %lf %lf %lf %lf %le %.8lf\n", i, m1, m2, ra, rp, vra, (ra-rp)/(ra+rp));
264  }
265  if(fn)fclose(f);
266 }
static const double C
Definition: GNGen.cc:28
double aux
Definition: testWDM_5.C:14
static double g(double e)
Definition: GNGen.cc:116
double M
Definition: DrawEBHH.C:13
TCanvas * c2
double m1
wavearray< double > a(hp.size())
int n
Definition: cwb_net.C:28
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<< "\ layers : "<< nLAYERS<< "\ dF(hz) : "<< dF<< "\ 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:252
static const double Pi
Definition: GNGen.cc:29
static const double DistUnit
Definition: GNGen.cc:31
int m
Definition: cwb_net.C:28
int j
Definition: cwb_net.C:28
i drho i
TRandom3 rnd(1)
TH3F * dGammadmdMdr
Definition: GNGen.hh:44
static const double PC
Definition: GNGen.cc:27
cout<< "SNR "<< xsnr<< endl;wavearray< double > f
Definition: ComputeSNR.C:75
fprintf(stdout,"start=%f duration=%f rate=%f\, x.start(), x.size()/x.rate(), x.rate())
TRandom3 rnd
Definition: GNGen.hh:45
double ra
Definition: ConvertGWGC.C:46
wavearray< double > freq
Definition: Regression_H1.C:79
~GNGen()
Definition: GNGen.cc:108
TCanvas * c1
static const double SM
Definition: GNGen.cc:26
bool log
Definition: WaveMDC.C:41
double * tmp
Definition: testWDM_5.C:31
double rp
void setFreqCutoff(double f)
Definition: GNGen.cc:112
static const double TimeUnit
Definition: GNGen.cc:32
int k
double F
double minM
Definition: GNGen.hh:43
double e
static const double G
Definition: GNGen.cc:25
Definition: GNGen.hh:25
double maxM
Definition: GNGen.hh:43
regression r
Definition: Regression_H1.C:44
static double Duration(double m1, double m2, double rp, double ra)
Definition: GNGen.cc:126
GNGen(double mSMBH, double mmin, double mmax, double beta=2)
Definition: GNGen.cc:37
double beta
Definition: GNGen.hh:43
double smbhM
Definition: GNGen.hh:43
double generateEvent(double &m1, double &m2, double &rp, double &e)
Definition: GNGen.cc:201
double HT()
Definition: GNGen.cc:143
double fabs(const Complex &x)
Definition: numpy.cc:55
double m2
double DiffEq(double ee, double aa)
Definition: GNGen.cc:155
double mmax
void EvolveRa(double m1, double m2, double &rp, double &ra)
Definition: GNGen.cc:161
fclose(ftrig)
double mmin
char c3[8]
double freqCutoff
Definition: GNGen.hh:46