782 if(nseg<=0)
return 0;
792 float dPb = 0.,
p = 0., m = 0.13957, e = 0.13957, de = 0., pa = 0., pn = 0.;
794 float eTPb = 1000./1300.;
801 VtVector *par[260], *parpred[260], *pars[260], *meas[260];
802 VtSqMatrix *pred[260];
803 VtSymMatrix *cov[260], *covpred[260], *covpredinv[260], *covs[260], *dmeas[260];
812 segf.SetErrorP (
SP() );
816 segf.SetPID(
s->
PID() );
823 if(nseg>259)
return -1;
862 par[istart] =
new VtVector( (
double)(seg0->
X()),
864 (
double)(seg0->
TX()),
865 (
double)(seg0->
TY()) );
866 meas[istart] =
new VtVector(*par[istart]);
867 pred[iend] =
new VtSqMatrix(4);
873 cov[istart] =
new VtSymMatrix(4);
874 for(
int k=0; k<4; k++)
875 for(
int l=0; l<4; l++) (*cov[istart])(k,l) = (seg0->
COV())(k,l);
876 dmeas[istart] =
new VtSymMatrix(*cov[istart]);
883 if (
p < pcut)
p = pcut;
884 e = TMath::Sqrt((
double)
p*(
double)
p + (
double)m*(
double)m);
886 while( (i+=step) != iend+step ) {
893 dz = seg->
Z()-seg0->
Z();
894 ptx = (*par[i-step])(2);
895 pty = (*par[i-step])(3);
896 dPb =
dz*TMath::Sqrt(1.+ptx*ptx+pty*pty);
897 if ((
design != 0) && (
p > pcut))
900 if (de < 0.) de = 0.;
907 pn = TMath::Sqrt((
double)e*(
double)e - (
double)m*(
double)m);
908 if (pn <= pcut) pn = pcut;
917 dms(0,0) = teta0sq*
dz*
dz/3.;
922 dms(2,0) = teta0sq*
dz/2.;
927 pred[i-step] =
new VtSqMatrix(4);
928 pred[i-step]->clear();
930 (*pred[i-step])(0,0) = 1.;
931 (*pred[i-step])(1,1) = 1.;
932 (*pred[i-step])(2,2) = 1.;
933 (*pred[i-step])(3,3) = 1.;
934 (*pred[i-step])(0,2) =
dz;
935 (*pred[i-step])(1,3) =
dz;
937 parpred[i] =
new VtVector(4);
938 *parpred[i] = (*pred[i-step])*(*par[i-step]);
940 covpred[i] =
new VtSymMatrix(4);
941 *covpred[i] = (*pred[i-step])*((*cov[i-step])*((*pred[i-step]).T()))+dms;
943 dmeas[i] =
new VtSymMatrix(4);
944 for(
int k=0; k<4; k++)
945 for(
int l=0; l<4; l++) (*dmeas[i])(k,l) = (seg->
COV())(k,l);
947 covpredinv[i] =
new VtSymMatrix(4);
948 (*covpredinv[i]) = (*covpred[i]).dsinv();
949 VtSymMatrix dmeasinv(4);
950 dmeasinv = (*dmeas[i]).dsinv();
951 cov[i] =
new VtSymMatrix(4);
952 (*cov[i]) = (*covpredinv[i]) + dmeasinv;
953 (*cov[i]) = (*cov[i]).dsinv();
955 meas[i] =
new VtVector( (
double)(seg->
X()),
958 (
double)(seg->
TY()) );
960 par[i] =
new VtVector(4);
961 (*par[i]) = (*cov[i])*((*covpredinv[i])*(*parpred[i]) + dmeasinv*(*meas[i]));
966 VtSymMatrix dresid(4);
967 dresid = (*dmeas[i]) - (*cov[i]);
968 dresid = dresid.dsinv();
970 chi2 += ((*par[i])-(*meas[i]))*(dresid*((*par[i])-(*meas[i])));
975 Set(
ID(),(
float)(*par[iend])(0),(
float)(*par[iend])(1),
976 (
float)(*par[iend])(2),(
float)(*par[iend])(3),1.,
Flag());
979 SetCOV( (*cov[iend]).array(), 4 );
988 pars[iend] =
new VtVector(*par[iend]);
989 covs[iend] =
new VtSymMatrix(*cov[iend]);
990 VtSymMatrix dresid(4);
991 dresid = (*dmeas[iend]) - (*covs[iend]);
992 dresid = dresid.dsinv();
993 chi2p = ((*pars[iend])-(*meas[iend]))*(dresid*((*pars[iend])-(*meas[iend])));
996 segf.
Set(
ID(),(float)(*pars[iend])(0),(
float)(*pars[iend])(1),
997 (float)(*pars[iend])(2),(
float)(*pars[iend])(3),1.,
Flag());
999 segf.
SetCOV( (*covs[iend]).array(), 4 );
1003 segf.
SetW( (
float)nseg );
1014 while( (i-=step) != istart-step ) {
1015 VtSqMatrix BackTr(4);
1016 BackTr = (*cov[i])*(((*pred[i]).T())*(*covpredinv[i+step]));
1017 pars[i] =
new VtVector(4);
1018 covs[i] =
new VtSymMatrix(4);
1019 (*pars[i]) = (*par[i]) + BackTr*((*pars[i+step])-(*parpred[i+step]));
1020 (*covs[i]) = (*cov[i]) + BackTr*(((*covs[i+step])-(*covpred[i+step]))*BackTr.T());
1021 dresid = (*dmeas[i]) - (*covs[i]);
1022 dresid = dresid.dsinv();
1023 chi2p = ((*pars[i])-(*meas[i]))*(dresid*((*pars[i])-(*meas[i])));
1026 segf.
Set(
ID(),(float)(*pars[i])(0),(
float)(*pars[i])(1),
1027 (float)(*pars[i])(2),(
float)(*pars[i])(3),1.,
Flag());
1029 segf.
SetCOV( (*covs[i]).array(), 4 );
1033 segf.
SetW( (
float)nseg );
1039 dPb =
dz*TMath::Sqrt(1.+(*pars[i])(2)*(*pars[i])(2)+(*pars[i])(3)*(*pars[i])(3));
1044 SetW( (
float)nseg );
1056 delete meas[istart];
1058 delete dmeas[istart];
1060 delete pred[istart];
1062 delete pars[istart];
1064 delete covs[istart];
1067 while( (i+=step) != iend+step ) {
1074 delete covpredinv[i];
T Prob(const T &rhs, int n)
Definition: Prob.hh:37
int design
Definition: RecDispMC.C:90
static double DeAveragePb(float p, float mass, float dx)
Definition: EdbPhys.cxx:131
static double DeAveragePbFast(float p, float mass, float dx)
Definition: EdbPhys.cxx:217
static double ThetaMS2(float p, float mass, float dx, float X0)
Definition: EdbPhys.cxx:50
static void DeAveragePbFastSet(float p, float mass)
Definition: EdbPhys.cxx:185
void SetPID(int pid)
Definition: EdbSegP.h:126
void SetProb(float prob)
Definition: EdbSegP.h:131
TMatrixD & COV() const
Definition: EdbSegP.h:120
Float_t P() const
Definition: EdbSegP.h:149
Float_t SP() const
Definition: EdbSegP.h:163
void SetW(float w)
Definition: EdbSegP.h:129
void SetCOV(TMatrixD &cov)
Definition: EdbSegP.h:98
void SetChi2(float chi2)
Definition: EdbSegP.h:132
void SetP(float p)
Definition: EdbSegP.h:130
void SetDZ(float dz)
Definition: EdbSegP.h:123
void SetErrorP(float sp2)
Definition: EdbSegP.h:93
Int_t NF() const
Definition: EdbPattern.h:183
Float_t M() const
Definition: EdbPattern.h:160
Float_t DE() const
Definition: EdbPattern.h:171
float X0
Definition: emthickness.cpp:69
p
Definition: testBGReduction_AllMethods.C:8