if (zmax==true) track parameters are calculated at segment with max Z if (zmax==false) track parameters are calculated at segment with min Z tTODO: track parameters??
on the output: Chi2: the full chi-square (not divided by NDF); NDF = 4 Prob: is Chi2 probability (area of the tail of Chi2-distribution) If we accept events with Prob >= ProbMin then ProbMin is the probability to reject the good event
723{
736
737
739 if(nseg<=0) return 0;
742 }
743
745
746
747
748
749 float dPb = 0.,
p = 0., m = 0.13957, e = 0.13957, de = 0., pa = 0., pn = 0.;
750 float e0 = e;
751 float eTPb = 1000./1300.;
752 float pcut = 0.050;
753 double teta0sq;
755 int step;
756 int istart, iend;
757
758 VtVector *par[260], *parpred[260], *pars[260], *meas[260];
759 VtSqMatrix *pred[260];
760 VtSymMatrix *cov[260], *covpred[260], *covpredinv[260], *covs[260], *dmeas[260];
761
762 int i=0;
763 if(nseg == 1) {
766
767 segf.Set(
s->ID(),
s->X(),
s->Y(),
s->TX(),
s->TY(),1.,
s->Flag());
769 segf.SetErrorP (
SP() );
770 segf.SetChi2(0.);
771 segf.SetProb(1.);
773 segf.SetPID(
s->PID() );
775
777 return 0;
778 }
779
780 if(nseg>259) return -1;
781
784
786 {
787 if (zmax)
788 {
789 step=-1;
790 istart=nseg-1;
791 iend=0;
792 }
793 else
794 {
795 step=1;
796 istart=0;
797 iend=nseg-1;
798 }
799 }
800 else
801 {
802 if (!zmax)
803 {
804 step=-1;
805 istart=nseg-1;
806 iend=0;
807 }
808 else
809 {
810 step=1;
811 istart=0;
812 iend=nseg-1;
813 }
814
815 }
816
818
819 par[istart] =
new VtVector( (
double)(seg0->
X()),
821 (
double)(seg0->
TX()),
822 (
double)(seg0->
TY()) );
823 meas[istart] = new VtVector(*par[istart]);
824 pred[iend] = new VtSqMatrix(4);
825
826
827
828
829
830 cov[istart] = new VtSymMatrix(4);
831 for(int k=0; k<4; k++)
832 for(
int l=0; l<4; l++) (*cov[istart])(k,l) = (seg0->
COV())(k,l);
833 dmeas[istart] = new VtSymMatrix(*cov[istart]);
834
836
837 i = istart;
840 if (
p < pcut)
p = pcut;
841 e = TMath::Sqrt((
double)
p*(
double)
p + (
double)m*(
double)m);
842 e0 = e;
843 while( (i+=step) != iend+step ) {
844
846
847 VtSymMatrix dms(4);
848 dms.clear();
849
850 dz = seg->
Z()-seg0->
Z();
851 ptx = (*par[i-step])(2);
852 pty = (*par[i-step])(3);
853 dPb =
dz*TMath::Sqrt(1.+ptx*ptx+pty*pty);
854 if ((
design != 0) && (
p > pcut))
855 {
857 if (de < 0.) de = 0.;
860 e = e - de;
861 else
862 e = e + de;
863 if (e < m) e = m;
864 pn = TMath::Sqrt((double)e*(double)e - (double)m*(double)m);
865 if (pn <= pcut) pn = pcut;
868 }
869 else
870 {
872 }
874 dms(0,0) = teta0sq*
dz*
dz/3.;
875 dms(1,1) = dms(0,0);
876 dms(2,2) = teta0sq;
877 dms(3,3) = dms(2,2);
878
879 dms(2,0) = teta0sq*
dz/2.;
880 dms(3,1) = dms(2,0);
881 dms(0,2) = dms(2,0);
882 dms(1,3) = dms(2,0);
883
884 pred[i-step] = new VtSqMatrix(4);
885 pred[i-step]->clear();
886
887 (*pred[i-step])(0,0) = 1.;
888 (*pred[i-step])(1,1) = 1.;
889 (*pred[i-step])(2,2) = 1.;
890 (*pred[i-step])(3,3) = 1.;
891 (*pred[i-step])(0,2) =
dz;
892 (*pred[i-step])(1,3) =
dz;
893
894 parpred[i] = new VtVector(4);
895 *parpred[i] = (*pred[i-step])*(*par[i-step]);
896
897 covpred[i] = new VtSymMatrix(4);
898 *covpred[i] = (*pred[i-step])*((*cov[i-step])*((*pred[i-step]).T()))+dms;
899
900 dmeas[i] = new VtSymMatrix(4);
901 for(int k=0; k<4; k++)
902 for(
int l=0; l<4; l++) (*dmeas[i])(k,l) = (seg->
COV())(k,l);
903
904 covpredinv[i] = new VtSymMatrix(4);
905 (*covpredinv[i]) = (*covpred[i]).dsinv();
906 VtSymMatrix dmeasinv(4);
907 dmeasinv = (*dmeas[i]).dsinv();
908 cov[i] = new VtSymMatrix(4);
909 (*cov[i]) = (*covpredinv[i]) + dmeasinv;
910 (*cov[i]) = (*cov[i]).dsinv();
911
912 meas[i] =
new VtVector( (
double)(seg->
X()),
915 (
double)(seg->
TY()) );
916
917 par[i] = new VtVector(4);
918 (*par[i]) = (*cov[i])*((*covpredinv[i])*(*parpred[i]) + dmeasinv*(*meas[i]));
919
920
921
922
923 VtSymMatrix dresid(4);
924 dresid = (*dmeas[i]) - (*cov[i]);
925 dresid = dresid.dsinv();
926
927 chi2 += ((*par[i])-(*meas[i]))*(dresid*((*par[i])-(*meas[i])));
928
929 seg0 = seg;
930 }
931
932 Set(
ID(),(
float)(*par[iend])(0),(
float)(*par[iend])(1),
933 (
float)(*par[iend])(2),(
float)(*par[iend])(3),1.,
Flag());
936 SetCOV( (*cov[iend]).array(), 4 );
937
938
939
940
941
942
943 double chi2p=0;
944
945 pars[iend] = new VtVector(*par[iend]);
946 covs[iend] = new VtSymMatrix(*cov[iend]);
947 VtSymMatrix dresid(4);
948 dresid = (*dmeas[iend]) - (*covs[iend]);
949 dresid = dresid.dsinv();
950 chi2p = ((*pars[iend])-(*meas[iend]))*(dresid*((*pars[iend])-(*meas[iend])));
951
953 segf.
Set(
ID(),(float)(*pars[iend])(0),(
float)(*pars[iend])(1),
954 (float)(*pars[iend])(2),(
float)(*pars[iend])(3),1.,
Flag());
956 segf.
SetCOV( (*covs[iend]).array(), 4 );
960 segf.
SetW( (
float)nseg );
964
966
967 i=iend;
970
971 while( (i-=step) != istart-step ) {
972 VtSqMatrix BackTr(4);
973 BackTr = (*cov[i])*(((*pred[i]).T())*(*covpredinv[i+step]));
974 pars[i] = new VtVector(4);
975 covs[i] = new VtSymMatrix(4);
976 (*pars[i]) = (*par[i]) + BackTr*((*pars[i+step])-(*parpred[i+step]));
977 (*covs[i]) = (*cov[i]) + BackTr*(((*covs[i+step])-(*covpred[i+step]))*BackTr.T());
978 dresid = (*dmeas[i]) - (*covs[i]);
979 dresid = dresid.dsinv();
980 chi2p = ((*pars[i])-(*meas[i]))*(dresid*((*pars[i])-(*meas[i])));
981
982
983 segf.
Set(
ID(),(float)(*pars[i])(0),(
float)(*pars[i])(1),
984 (float)(*pars[i])(2),(
float)(*pars[i])(3),1.,
Flag());
986 segf.
SetCOV( (*covs[i]).array(), 4 );
990 segf.
SetW( (
float)nseg );
996 dPb =
dz*TMath::Sqrt(1.+(*pars[i])(2)*(*pars[i])(2)+(*pars[i])(3)*(*pars[i])(3));
998 }
1001 SetW( (
float)nseg );
1003
1004
1005
1006
1007
1008
1009 delete par[istart];
1010 par[istart] = 0;
1011 delete cov[istart];
1012 cov[istart] = 0;
1013 delete meas[istart];
1014 meas[istart] = 0;
1015 delete dmeas[istart];
1016 dmeas[istart] = 0;
1017 delete pred[istart];
1018 pred[istart] = 0;
1019 delete pars[istart];
1020 pars[istart] = 0;
1021 delete covs[istart];
1022 covs[istart] = 0;
1023 i=istart;
1024 while( (i+=step) != iend+step ) {
1025 delete pred[i];
1026 pred[i] = 0;
1027 delete parpred[i];
1028 parpred[i] = 0;
1029 delete covpred[i];
1030 covpred[i] = 0;
1031 delete covpredinv[i];
1032 covpredinv[i] = 0;
1033 delete par[i];
1034 par[i] = 0;
1035 delete cov[i];
1036 cov[i] = 0;
1037 delete meas[i];
1038 meas[i] = 0;
1039 delete dmeas[i];
1040 dmeas[i] = 0;
1041 delete pars[i];
1042 pars[i] = 0;
1043 delete covs[i];
1044 covs[i] = 0;
1045 }
1046 return 0;
1047}
T Prob(const T &rhs, int n)
Definition: Prob.hh:37
brick dz
Definition: RecDispMC.C:107
brick X0
Definition: RecDispMC.C:112
int design
Definition: RecDispMC.C:90
static double DeAveragePb(float p, float mass, float dx)
Definition: EdbPhys.cxx:132
static double DeAveragePbFast(float p, float mass, float dx)
Definition: EdbPhys.cxx:218
static double ThetaMS2(float p, float mass, float dx, float X0)
Definition: EdbPhys.cxx:51
static void DeAveragePbFastSet(float p, float mass)
Definition: EdbPhys.cxx:186
void SetPID(int pid)
Definition: EdbSegP.h:129
void SetProb(float prob)
Definition: EdbSegP.h:134
TMatrixD & COV() const
Definition: EdbSegP.h:123
Float_t P() const
Definition: EdbSegP.h:152
Float_t SP() const
Definition: EdbSegP.h:166
void SetW(float w)
Definition: EdbSegP.h:132
void SetCOV(TMatrixD &cov)
Definition: EdbSegP.h:99
void SetChi2(float chi2)
Definition: EdbSegP.h:135
void SetP(float p)
Definition: EdbSegP.h:133
void SetDZ(float dz)
Definition: EdbSegP.h:126
void SetErrorP(float sp2)
Definition: EdbSegP.h:94
Int_t NF() const
Definition: EdbPattern.h:178
Float_t M() const
Definition: EdbPattern.h:155
Float_t DE() const
Definition: EdbPattern.h:166
p
Definition: testBGReduction_AllMethods.C:8