53 #include "TStopwatch.h"
66 TPWALikelihoodC::TPWALikelihoodC() : _rank(1),_dim(0),_nposrefl(0),_nnegrefl(0), _nevents(0),_nwaves(0),_ncalls(0), _Ltime(0), _Ntime(0), _quiet(false),_useNorm(true),_Vflat(
"flat__+",0),_NumNullConstraints(0)
78 for(
unsigned int i=0;
i<
_data.size();++
i){
92 const TString& acceptance,
94 const TString constraints){
95 cout<<
"Reading Integrals "<<endl;
96 ifstream file(norm.Data());
101 list<string> normwaves=
_I.
files();
103 file.open(acceptance.Data());
111 cout<<
"Reading amplitude names from wavelist "<<wavelist<<endl;
118 for(
unsigned int ir=0;ir<rank;++ir){
119 _V.push_back(
new vector<TPWAAmp>);
126 file.open(wavelist.Data());
130 unsigned int pos=line.find(
" ");
131 string name=line.substr(0,pos);
133 if(pos<line.length()){
134 thres=atof(line.substr(pos,line.length()).c_str());
138 cout << name <<
" thresh=" << thres << endl;
142 if(find(normwaves.begin(),normwaves.end(),name)==normwaves.end()){
143 cout <<
"Wave " << name
144 <<
" not in normalization integrals! Aborting!" << endl;
147 unsigned int normindex=
_I.
index(name);
148 if(find(accwaves.begin(),accwaves.end(),name)==accwaves.end()){
149 cout <<
"Wave " << name
150 <<
" not in acceptance integrals! Aborting!" << endl;
158 for(
unsigned int ir=0;ir<
_rank;++ir){
160 TPWAAmp amp(name,ir,thres,normindex,accindex);
164 if(ir==_rank-1)++npos;
168 if(ir==_rank-1)++nneg;
175 _V[ir]->push_back(amp);
178 cout << amp.
name() <<
" rank" << ir <<
" " << amp.
type() << endl;
188 if(constraints.Length()>1){
189 cout <<
"Loading Constraint Config: "<< constraints << endl;
194 for(
unsigned int iamp=0;iamp<
_nwaves; ++iamp){
195 for(
unsigned int ir=0;ir<
_rank;++ir){
196 _dim+=(*
_V[ir])[iamp].npar();
197 for(
int ipar=0;ipar<(*
_V[ir])[iamp].npar();++ipar){
217 for(
unsigned int ir=0;ir<
_rank;++ir){
218 _dL.push_back(
new vector<complex<double> >(_nwaves,complex<double>(0,0)));
219 _dl.push_back(
new vector<complex<double> >(_nwaves,complex<double>(0,0)));
220 _dLN.push_back(
new vector<complex<double> >(_nwaves,complex<double>(0,0)));
229 cout <<
"Normalization integrals have to be loaded before amplitudes! "
230 <<
" ABORTING!" << endl;
234 ProcInfo_t info1, info2;
235 gSystem->GetProcInfo(&info1);
237 cout <<
"Memory before: " << info1.fMemResident << endl;
238 cout<<
"Loading amplitudes"<<endl;
247 ifstream ampfile(
_V[0]->at(
i).name().c_str());
249 cout<<
" File not found! Aborting!"<<endl;
253 unsigned int index=
_V[0]->at(
i).normindex();
254 complex<double> I=
_mat.
el(index,index);
256 vector<complex<double> >* amps=
new vector<complex<double> >();
258 _data.push_back(amps);
261 while (ampfile.read((
char*) &a1,
sizeof(complex<double>))){
270 if(!
_quiet)cout<<amps->size()<<
" events"<<endl;
276 gSystem->GetProcInfo(&info2);
277 cout <<
"Memory after: " << info2.fMemResident << endl;
278 cout <<
"Memory used for amplitudes: "
279 << info2.fMemResident-info1.fMemResident << endl;
287 if(!
_quiet)cout <<
"Renormalizing Integrals ... ";
290 unsigned int index1=
_V[0]->at(
i).normindex();
291 double Ni=sqrt(
_mat.
el(index1,index1).real());
292 for(
unsigned int j=0;j<
_nwaves;++j){
294 unsigned int index2=
_V[0]->at(j).normindex();
295 double Nj=sqrt(
_mat.
el(index2,index2).real());
296 _mat.
el(index1,index2)/=(Ni*Nj);
299 if(!
_quiet)cout <<
"Renormalizing Acceptance Integrals ... " << endl;
300 if(!
_quiet)cout <<
"Note: Diagonal Terms of Renorm.Integrals are not = 1 here!";
305 unsigned int index1=
_V[0]->at(
i).normindex();
306 unsigned int accindex1=
_V[0]->at(
i).accindex();
307 double Ni=sqrt(
_mat.
el(index1,index1).real());
308 for(
unsigned int j=0;j<
_nwaves;++j){
309 unsigned int index2=
_V[0]->at(j).normindex();
310 unsigned int accindex2=
_V[0]->at(j).accindex();
311 double Nj=sqrt(
_mat.
el(index2,index2).real());
312 _accmat.
el(accindex1,accindex2)/=(Ni*Nj);
313 if(!
_quiet) cout <<
" Norm("<<
i<<j<<
"): "
315 <<
" Acc("<<
i<<j<<
"): "
316 <<
_accmat.
el(accindex1,accindex2)<< endl;
322 if(!
_quiet)cout <<
"Renormalizing Diagonal terms ... " << endl;
324 unsigned int index1=
_V[0]->at(
i).normindex();
326 if(!
_quiet) cout <<
" Norm("<<
i<<
i<<
"): "
327 <<
_mat.
el(index1,index1) << endl;
329 if(!
_quiet)cout <<
"...finished." << endl;
340 for(
unsigned int r=0;r<
_rank;++r){
341 vector<TPWAAmp>* V=
_V[r];
342 unsigned int nwaves=V->size();
343 for(
unsigned int i=0;
i<nwaves;++
i){
344 unsigned int npar=(*V)[
i].npar();
345 for(
unsigned int ipar=0;ipar<npar;++ipar){
352 for(
unsigned int r=0;r<
_rank;++r){
354 (*
_V[r])[
i].updateAmp();
358 par[0]=x[k];par[1]=0;
366 for(
unsigned int r=0;r<
_rank;++r){
367 unsigned int nwaves=
_V[r]->size();
368 for(
unsigned int i=0;
i<nwaves;++
i){
369 unsigned int npar=(*
_V[r])[
i].npar();
370 for(
unsigned int ipar=0;ipar<npar;++ipar){
371 x[k++]=(*
_V[r])[
i].par(ipar);
380 for(
unsigned int r=0;r<
_rank;++r){
381 unsigned int nwaves=
_V[r]->size();
382 for(
unsigned int i=0;
i<nwaves;++
i){
383 cout << (*
_V[r])[
i] << endl;
394 if(!
_quiet)cout <<
" Calling FdF !!!!!!!!!!! " << endl;
403 for(
unsigned int ix=0;ix<_dim;++ix)(*const_cast<vector<double>*>(&
_parcache))[ix]=x[ix];
415 for(
unsigned int ir=0;ir<
_rank;++ir){
416 for(
unsigned int ia=0;ia<
_nwaves;++ia){
417 (*
_dL[ir])[ia]=complex<double>(0,0);
418 (*
_dl[ir])[ia]=complex<double>(0,0);
419 (*
_dLN[ir])[ia]=complex<double>(0,0);
426 complex<double> Aplus(0,0);
427 complex<double> Aminus(0,0);
430 for(
unsigned int ievt=0;ievt<
_nevents;++ievt){
434 for(
unsigned int r=0;r<
_rank;++r){
435 for(
unsigned int iamp=0;iamp<
_nwaves;++iamp){
437 complex<double>
a=(*
_V[r])[iamp] * ((*
_data[iamp])[ievt]);
438 int thisrefl=(*
_V[r])[iamp].reflectivity();
439 if(thisrefl==-1)Aminus+=
a;
443 for(
unsigned int k=0;k<
_nwaves; ++k){
445 if(thisrefl==(*
_V[r])[k].reflectivity())(*
_dl[r])[k]+=
a;
450 l+=std::norm(Aminus);
451 Aplus.real()=0;Aplus.imag()=0;Aminus.real()=0;Aminus.imag()=0;
453 for(
unsigned int k=0;k<
_nwaves; ++k){
463 for(
unsigned int ir=0;ir<
_rank;++ir){
464 for(
unsigned int id=0;
id<
_nwaves; ++id){
465 (*
_dL[ir])[
id]-=(*
_dl[ir])[id]*g;
466 (*
_dl[ir])[
id].real()=0;
467 (*
_dl[ir])[
id].imag()=0;
474 double t1=timer.RealTime();
478 complex<double> N(0,0);
479 unsigned int outcount=0;
485 nevt=(double)_nevents;
493 for(
unsigned int r=0; r<
_rank;++r){
495 for(
unsigned int iamp=0;iamp<
_nwaves;++iamp){
497 for(
unsigned int jamp=0;jamp<
_nwaves;++jamp){
512 (*
_dL[r])[iamp]+=(*
_dLN[r])[iamp]*n2;
515 unsigned int npar=ampi.
npar();
516 for(
unsigned int ipar=0;ipar<npar;++ipar){
518 std::complex<double> deriv=ampi.
dampdpar(ipar);
519 _dLcache[outcount]=(*
_dL[r])[iamp].real()*deriv.real()+(*
_dL[r])[iamp].imag()*deriv.imag();
529 df[outcount]=dLdflat+n2*
_Vflat.
amp().real();
534 double t2=timer.RealTime();
541 cout <<
"LikelihoodC: "<<L<<endl;
542 cout <<
"Normalization: "<< N.real() << endl;
543 cout <<
"Normalized: "<<L + nevt*N.real() << endl;
544 cout <<
"Time for LikelihoodC: "<< t1 <<endl;
545 cout <<
"Time for Normalization: "<< t2 <<endl;
661 for(
unsigned int i=0;
i<
_dim; ++
i){
688 vector<pair<int,int> >& indices,
689 vector<string>& names,
690 const TMatrixD& errpar,
706 erramp.ResizeTo(m,m);
709 TMatrixD T(m,
NDim());
712 unsigned int parcount=0;
713 for(
unsigned int r=0;r<
_rank;++r){
716 string wavename=(*
_V[r])[
i].name();
717 V.push_back((*
_V[r])[
i].amp());
719 name <<
"V" << r <<
"_" << wavename;
720 names.push_back(name.str());
723 unsigned int npar=(*
_V[r])[
i].npar();
724 for(
unsigned int ipar=0;ipar<npar;++ipar){
725 complex<double> dAdp=(*
_V[r])[
i].dampdpar(ipar);
726 T[r*2*_nwaves+2*
i][parcount]=dAdp.real();
727 T[r*2*_nwaves+2*
i+1][parcount]=dAdp.imag();
730 indices.push_back(pair<int,int>(r*2*_nwaves+2*
i,r*2*_nwaves+2*
i+1));
735 V.push_back(complex<double>(x[parcount],0));
736 T[_rank*2*
_nwaves][parcount]=1;
737 T[_rank*2*
_nwaves+1][parcount]=0;
738 indices.push_back(pair<int,int>(_rank*2*
_nwaves,_rank*2*_nwaves+1));
739 names.push_back(
"V_flat");
742 TMatrixD TT(TMatrixD::kTransposed,T);
743 TMatrixD CTT=errpar*TT;
756 if(wavename[0] ==
'V') {
760 if(wavename[i] ==
'-') eps= -1;
761 else if(wavename[i] ==
'+') eps= 1;
763 cout<<
"Wrong wavename format. "
764 <<
"Could not determine reflectivity! Aborting!"<<endl;
775 for(
unsigned int j=0;j<
_nwaves;++j){
776 integr.
set(
i,j,
_mat.
el((*
_V[0])[
i].normindex(),(*
_V[0])[j].normindex()));
777 acceptance.
set(
i,j,
_mat.
el((*
_V[0])[
i].accindex(),(*
_V[0])[j].accindex()));
781 integr.
set(_nwaves,_nwaves,complex<double>(1,0));
782 acceptance.
set(_nwaves,_nwaves,complex<double>(1,0));
805 ifstream cfile(ConstraintsFile.Data());
806 unsigned int ccounter=0;
809 cout <<
"Invalid constraint file " << ConstraintsFile << endl;
814 cfile.getline(line,256);
816 if(strchr(line,
'{')!=NULL){
819 if(strstr(line,
"Phase")){
821 cfile.getline(line,256);
822 string slavewave(line);
823 cfile.getline(line,256);
824 string masterwave(line);
825 cfile.getline(line,256);
826 double phase=atof(line);
828 unsigned int imaster=
_nwaves+1;
830 for(
unsigned int iamp=0;iamp<
_nwaves; ++iamp){
831 if((*
_V[0])[iamp].name()==masterwave)imaster=iamp;
832 else if((*
_V[0])[iamp].name()==slavewave)islave=iamp;
834 if(imaster>=_nwaves){
835 cout <<
"Master wave " << masterwave <<
" not in waveset. Skipping phase constraint of " << slavewave << endl;
838 cout <<
"Constraint wave " << slavewave <<
" not in waveset. Skipping phase constraint to " << masterwave << endl;
841 cout <<
"Constraining " << slavewave
842 <<
" to " << masterwave
843 <<
" with relative phase dPhi=" << phase << endl;
845 for(
unsigned int ir=0; ir<
_rank; ++ir){
852 cout <<
"Unknown constraint" << line <<
" Aborting." << endl;
855 cfile.getline(line,256);
859 cout <<
"Installed "<<ccounter<<
" contraints."<<endl;