244 NcJob* parent=(
NcJob*)(gROOT->GetListOfTasks()->FindObject(name.Data()));
255 if (seldev->
GetSignal(
"Select") < 0.1)
return;
260 params.SetNameTitle(
"IceChi2",
"IceChi2 processor parameters");
269 fEvt->AddDevice(params);
284 cout <<
" *IceChi2* First guess selections to be processed (-1=all)." << endl;
285 for (Int_t i=0; i<nclasses; i++)
289 str=strx->GetString();
291 cout <<
" Maximally " << ntkmax <<
" track(s) per event for procedure : " << str.Data() << endl;
293 cout <<
" *IceChi2* Hit selection mode : " <<
fSelhits << endl;
294 cout <<
" *IceChi2* Penalty value for psi evaluation outside range : " <<
fPenalty << endl;
302 const Double_t pi=acos(-1.);
305 Double_t arglist[100];
309 Int_t ntkreco=
fEvt->GetNtracks(1);
313 fHits=
new TObjArray();
327 TObjArray* hits=
fEvt->GetHits(
"IceGOM");
330 fTkfit->SetNameTitle(trackname.Data(),
"IceChi2 Combined fit result");
331 for (Int_t ih=0; ih<hits->GetEntries(); ih++)
348 fFitstats->SetNameTitle(
"Fitstats",
"TFitter stats for Chi2 fit");
360 Float_t x,y,z,theta,phi,t0;
361 Double_t amin,edm,errdef;
362 Int_t ierfit,iererr,nvpar,nparx;
368 for (Int_t iclass=0; iclass<nclasses; iclass++)
372 str=strx->GetString();
374 TObjArray* tracks=
fEvt->GetTracks(str);
376 if (tracks) ntk=tracks->GetEntries();
377 if (ntkmax>0 && ntk>ntkmax) ntk=ntkmax;
379 for (Int_t jtk=0; jtk<ntk; jtk++)
381 track=(
NcTrack*)tracks->At(jtk);
382 if (!track)
continue;
398 for (Int_t is=1; is<=nsig; is++)
402 if (!sx->
GetDevice()->InheritsFrom(
"IceGOM"))
continue;
403 if (sx->
GetDevice()->InheritsFrom(
"IceAOM")) amanda=1;
404 if (sx->
GetDevice()->InheritsFrom(
"IceIDOM")) inice=1;
413 hits=
fEvt->GetHits(
"IceGOM");
415 fTkfit->SetNameTitle(trackname.Data(),
"IceChi2 Combined fit result");
417 if (amanda && !inice)
419 hits=
fEvt->GetHits(
"IceAOM");
421 fTkfit->SetNameTitle(trackname.Data(),
"IceChi2 Amanda fit result");
423 if (inice && !amanda)
425 hits=
fEvt->GetHits(
"IceIDOM");
427 fTkfit->SetNameTitle(trackname.Data(),
"IceChi2 InIce fit result");
430 for (Int_t is2=0; is2<hits->GetEntries(); is2++)
441 if (
fHits->GetEntries()<7)
continue;
456 t0=
fEvt->GetDifference(tt0,
"ns");
463 if (
fPrint==-2) arglist[0]=-1;
464 fFitter->ExecuteCommand(
"SET PRINT",arglist,1);
465 if (
fPrint==-2)
fFitter->ExecuteCommand(
"SET NOWARNINGS",arglist,0);
467 fFitter->SetFitMethod(
"chisquare");
469 fFitter->SetParameter(0,
"r0x",x,0.1,0,0);
470 fFitter->SetParameter(1,
"r0y",y,0.1,0,0);
471 fFitter->SetParameter(2,
"r0z",z,0.1,0,0);
472 fFitter->SetParameter(3,
"theta",theta,0.001,0,pi);
473 fFitter->SetParameter(4,
"phi",phi,0.001,0,2.*pi);
474 fFitter->SetParameter(5,
"t0",t0,1.,0,32000);
481 ierfit=
fFitter->ExecuteCommand(
"SIMPLEX",arglist,0);
483 fFitter->GetStats(amin,edm,errdef,nvpar,nparx);
490 iererr=
fFitter->ExecuteCommand(
"HESSE",arglist,0);
495 vec[0]=
fFitter->GetParameter(0);
496 vec[1]=
fFitter->GetParameter(1);
497 vec[2]=
fFitter->GetParameter(2);
498 err[0]=
fFitter->GetParError(0);
499 err[1]=
fFitter->GetParError(1);
500 err[2]=
fFitter->GetParError(2);
505 vec[1]=
fFitter->GetParameter(3);
506 vec[2]=
fFitter->GetParameter(4);
508 err[1]=
fFitter->GetParError(3);
509 err[2]=
fFitter->GetParError(4);
515 t0fit.
Add(0,0,
int(t0));
521 fTkfit->SetParentTrack(track);
523 fTkfit->SetTimestamp(t0fit);
524 fTkfit->SetReferencePoint(pos);
526 for (Int_t ihit=0; ihit<
fHits->GetEntries(); ihit++)
529 if (sx)
fTkfit->AddSignal(*sx);
777 const Float_t c=0.299792458;
778 const Float_t npice=1.31768387;
779 const Float_t ngice=1.35075806;
780 const Float_t thetac=acos(1./npice);
781 const Float_t lambda=33.3;
782 const Float_t labs=98;
783 const Float_t cice=c/ngice;
784 const Float_t tau=557;
785 const Double_t rho=((1./tau)+(cice/labs));
786 const Double_t pi=acos(-1.);
790 if (
fVgroup) alphac=atan((1.-npice/ngice)/sqrt(npice*npice-1.));
793 const Double_t sigma=10;
803 if (!ref || p.
GetNorm()<=0)
return psi;
809 if (!nhits || !tstamp)
return psi;
812 Float_t t0=
fEvt->GetDifference(tstamp,
"ns");
816 Float_t d,dist,thit,tgeo;
817 Double_t tres,ksi,eta,pandel;
818 Double_t cpandel1,cpandel2,cpandel3,cpandel;
819 Double_t z,k,alpha,beta,phi,n1,n2,n3,u;
824 for (Int_t i=1; i<=nhits; i++)
834 dist=p.
Dot(r12)+d/tan(pi/2.-thetac-alphac);
862 eta=(rho*sigma)-(tres/sigma);
866 cpandel=exp(-tres*tres/(2.*sigma*sigma))/(sigma*sqrt(2.*pi));
868 else if (ksi<=5 && tres>=-5.*sigma && tres<=30.*sigma)
870 cpandel1=pow(rho,ksi)*pow(sigma,ksi-1.)*exp(-tres*tres/(2.*sigma*sigma))/pow(2.,0.5*(1.+ksi));
871 cpandel2=ROOT::Math::conf_hyperg(ksi/2.,0.5,eta*eta/2.)/TMath::Gamma((ksi+1.)/2.);
872 cpandel3=sqrt(2.)*eta*ROOT::Math::conf_hyperg((ksi+1.)/2.,1.5,eta*eta/2.)/TMath::Gamma(ksi/2.);
874 cpandel=cpandel1*(cpandel2-cpandel3);
876 else if (ksi<=1 && tres>30.*sigma && tres<=3500)
878 pandel=pow(rho,ksi)*pow(tres,(ksi-1.))*exp(-rho*tres)/TMath::Gamma(ksi);
880 cpandel=exp(rho*rho*sigma*sigma/2.)*pandel;
882 else if (ksi<=1 && tres<-5.*sigma && tres>=-25.*sigma)
884 cpandel=pow(rho*sigma,ksi)*pow(eta,-ksi)*exp(-tres*tres/(2.*sigma*sigma))/(sigma*sqrt(2.*pi));
886 else if (ksi<=50 && tres>=0 && tres<=3500)
888 z=-eta/sqrt(4.*ksi-2.);
889 k=0.5*(z*sqrt(1.+z*z)+log(z+sqrt(1.+z*z)));
890 alpha=-tres*tres/(2.*sigma*sigma)+eta*eta/4.-ksi/2.+0.25+k*(2.*ksi-1.);
891 alpha+=-log(1.+z*z)/4.-ksi*log(2.)/2.+(ksi-1.)*log(2.*ksi-1.)/2.+ksi*log(rho)+(ksi-1.)*log(sigma);
892 beta=0.5*(z/sqrt(1.+z*z)-1.);
893 n1=beta*(20.*beta*beta+30.*beta+9.)/12.;
894 n2=pow(beta,2.)*(6160.*pow(beta,4.)+18480.*pow(beta,3.)+19404.*pow(beta,2.)+8028.*beta+945.)/288.;
895 n3=27227200.*pow(beta,6.)+122522400.*pow(beta,5.)+220540320.*pow(beta,4.);
896 n3+=200166120.*pow(beta,3.)+94064328.*pow(beta,2.)+20546550.*beta+1403325.;
897 n3*=pow(beta,3.)/51840.;
898 phi=1.-n1/(2.*ksi-1.)+n2/pow(2.*ksi-1.,2.)-n3/pow(2.*ksi-1.,3.);
899 cpandel=exp(alpha)*phi/TMath::Gamma(ksi);
901 else if (ksi<=50 && tres<0 && tres>=-25.*sigma)
903 z=eta/sqrt(4.*ksi-2.);
904 k=0.5*(z*sqrt(1.+z*z)+log(z+sqrt(1.+z*z)));
905 u=exp(ksi/2.-0.25)*pow(2.*ksi-1.,-ksi/2.)*pow(2.,(ksi-1.)/2.);
906 beta=0.5*(z/sqrt(1.+z*z)-1.);
907 n1=beta*(20.*beta*beta+30.*beta+9.)/12.;
908 n2=pow(beta,2.)*(6160.*pow(beta,4.)+18480.*pow(beta,3.)+19404.*pow(beta,2.)+8028.*beta+945.)/288.;
909 n3=27227200.*pow(beta,6.)+122522400.*pow(beta,5.)+220540320.*pow(beta,4.);
910 n3+=200166120.*pow(beta,3.)+94064328.*pow(beta,2.)+20546550.*beta+1403325.;
911 n3*=pow(beta,3.)/51840.;
912 phi=1.+n1/(2.*ksi-1.)+n2/pow(2.*ksi-1.,2.)+n3/pow(2.*ksi-1.,3.);
913 cpandel=pow(rho,ksi)*pow(sigma,ksi-1.)*exp(-pow(tres,2.)/(2.*pow(sigma,2.))+pow(eta,2.)/4.)/sqrt(2.*pi);
914 cpandel*=u*phi*exp(-k*(2.*ksi-1.))*pow(1.+z*z,-0.25);
919 cout <<
" *IceChi2::GetPsi* Outside rectangle. We should never get here." << endl;
925 if (cpandel>0) psihit=-10.*log10(cpandel);