Search kink and make a plot.
882 {
884
885 float Rthreshold = 3;
886
888 printf(
"Track %d nseg=%d, too short for kink search\n", trk->
ID(), trk->
N());
890 }
891
892 char ntname[20];
893 sprintf(ntname,
"ntKinkDT%d", trk->
ID());
894 TNtuple *tree = (TNtuple *) gROOT->FindObject(ntname);
895 if(tree) tree->Delete();
896
897 tree = new TNtuple(ntname, "InTrack Decay Search","itrk:ipl1:ipl2:P:dtt:dtl:dt:Pt:rmst:rmsl:rms:dxt:dxl");
898
899 TObjArray *kinks = new TObjArray;
900
902
904
905
906
907
908 for(
int i=0;i<
t->N();i++)
t->GetSegment(i)->SetPID(
t->GetSegment(i)->Plate());
909 }
910
911
912 double angle = sqrt(
t->TX()*
t->TX()+
t->TY()*
t->TY());
913 double resT = 0.0015*sqrt(2.0);
914 double resL = 0.0015*(1+angle*5)*sqrt(2.0);
915
916
918 for(int j=0;j<n-1;j++){
919
922
925 if(ipl2>=57) continue;
926
927
928 double rms,rmst,rmsl;
930
931
932 rmst = rmst>resT ? rmst : resT;
933 rmsl = rmsl>resL ? rmsl : resL;
934
935
936 double dtt, dtl;
938 double dt = sqrt(dtt*dtt+dtl*dtl);
939 double dxt, dxl;
941
942
945
946
947 double Pt =
p>0 ?
p*dt : -1.;
948
949
950 tree->Fill(
t->ID(), ipl1, ipl2,
p, dtt, dtl, dt,
Pt, rmst, rmsl, rms, dxt, dxl);
951
952
953
954 if(
fabs(dtt)>rmst*Rthreshold ||
fabs(dtl)>rmsl*Rthreshold ) {
955
956
957 TObjArray segs;
962
963 int ndau = n-j-1;
964
965 EdbEDASmallKink *kink =
new EdbEDASmallKink(v,
t,
s1,
s2, dtt, dtl, dxt, dxl, ndau,
p, pmin, pmax,
Pt, rmst, rmsl);
966 kinks->Add(kink);
967
968 printf("Kink candidate. itrk %d plate %d - %d kink angle %.4lf P %.3lf Pt %.3lf\n",
969 t->ID(), ipl1, ipl2, dt,
p,
Pt);
970 printf(" (Transverse, Longitudinal) = ( %.4lf, %.4lf ) threshold ( %.4lf, %.4lf ), R = %.2f %.2f\n",
971 dtt, dtl, rmst*Rthreshold, rmsl*Rthreshold, dtt/rmst, dtl/rmsl);
972 printf(" rms=%.4lf rms_transvers=%.4lf rms_longitudinal=%.4lf\n", rms, rmst, rmsl);
973 printf(
" kinkpoint %.1f %.1f %.1f\n", v->
X(), v->
Y(), v->
Z());
974
975
976 }
977 }
978
979 printf("%d kink candidates are found.\n", kinks->GetEntries());
980
981
982 tree->SetMarkerStyle(20);
983 TText *
text =
new TText();
984 text->SetTextSize(0.035);
985 text->SetTextAngle(20);
986
987 double iplmin = tree->GetMinimum("ipl1");
988 double iplmax = tree->GetMaximum("ipl2")+1;
989
990
991 double dt6[6];
992 dt6[0] =
fabs(tree->GetMaximum(
"dtt"));
993 dt6[1] =
fabs(tree->GetMinimum(
"dtt"));
994 dt6[2] =
fabs(tree->GetMaximum(
"dtl"));
995 dt6[3] =
fabs(tree->GetMinimum(
"dtl"));
996 dt6[4] = tree->GetMaximum("rmst") * Rthreshold;
997 dt6[5] = tree->GetMaximum("rmsl") * Rthreshold;
998 double dtmax = TMath::MaxElement(6,dt6) * 1.15 * 1e3;
999
1000 double rmst = tree->GetMinimum("rmst");
1001 double rmsl = tree->GetMinimum("rmsl");
1002
1003 TText *textrms = new TText();
1004 textrms->SetTextSize(0.035);
1005
1006
1009
1011
1012 TString hname = Form(
"hrmst%d",trk->
ID());
1013 TH1F *
h1 = (TH1F *) gROOT->FindObject(hname);
1014 if(
h1)
h1->Delete();
1015 h1 =
new TH1F(hname,Form(
"#delta#theta^{RMS}Transverse itrk=%d",trk->
ID()), (
int)(iplmax-iplmin+1), iplmin-0.5, iplmax+0.5);
1016 h1->SetLineColor(kGray);
1017 h1->SetFillColor(kGray);
1018 tree->Draw("ipl2 >>"+hname,"rmst*1e3");
1019
1020 hname+="_5";
1021 TH1F *h15 = (TH1F *) gROOT->FindObject(hname);
1022 if(h15) h15->Delete();
1023 h15 =
new TH1F(hname,Form(
"#delta#theta^{RMS}Transverse itrk=%d",trk->
ID()), (
int)(iplmax-iplmin+1), iplmin-0.5, iplmax+0.5);
1024 tree->Draw("ipl2 >>"+hname,Form("rmst*1e3*%f",Rthreshold));
1025 h15->SetLineColor(kCyan-10);
1026 h15->SetFillColor(kCyan-10);
1027 h15->SetXTitle("Plate number");
1028 h15->SetYTitle("Kink angle (mrad)");
1029 h15->SetMaximum(dtmax);
1030 h15->SetStats(0);
1031
1032 h15->Draw();
1034 tree->Draw("abs(dtt)*1e3:ipl2","","same");
1035
1036 TLine *l = new TLine();
1037 double xmin =
h1->GetXaxis()->GetXmin();
1038 double xmax =
h1->GetXaxis()->GetXmax();
1039 l->DrawLine(xmin, rmst*1e3, xmax, rmst*1e3);
1040 l->SetLineColor(kCyan);
1041 l->DrawLine(xmin, rmst*Rthreshold*1e3, xmax, rmst*Rthreshold*1e3);
1042
1043 textrms->DrawText(xmin+0.8*(xmax-xmin), rmst*1e3, Form("%.1lfmrad",rmst*1e3));
1044 textrms->DrawText(xmin+0.8*(xmax-xmin), Rthreshold*rmst*1e3, Form("%.1lfmrad",Rthreshold*rmst*1e3));
1045
1046 if(kinks->GetEntries()){
1047 for(int i=0;i<kinks->GetEntries();i++){
1050 }
1051 }
1052
1054
1055 hname = Form(
"hrmsl%d",trk->
ID());
1056 h1 = (TH1F *) gROOT->FindObject(hname);
1057 if(
h1)
h1->Delete();
1058 h1 =
new TH1F(hname,Form(
"#delta#theta^{RMS}Transverse itrk=%d",trk->
ID()), (
int)(iplmax-iplmin+1), iplmin-0.5, iplmax+0.5);
1059 h1->SetLineColor(kGray);
1060 h1->SetFillColor(kGray);
1061 tree->Draw("ipl2 >>"+hname,"rmsl*1e3");
1062
1063 hname+="_5";
1064 h15 = (TH1F *) gROOT->FindObject(hname);
1065 if(h15) h15->Delete();
1066 h15 =
new TH1F(hname,Form(
"#delta#theta^{RMS}Longitudinal itrk=%d",trk->
ID()), (
int)(iplmax-iplmin+1), iplmin-0.5, iplmax+0.5);
1067 tree->Draw("ipl2 >>"+hname,Form("rmsl*1e3*%f",Rthreshold));
1068 h15->SetLineColor(kCyan-10);
1069 h15->SetFillColor(kCyan-10);
1070 h15->SetXTitle("Plate number");
1071 h15->SetYTitle("Kink angle (mrad)");
1072 h15->SetMaximum(dtmax);
1073 h15->SetStats(0);
1074
1075 h15->Draw();
1077 tree->Draw("abs(dtl)*1e3:ipl2","","same");
1078
1079 l = new TLine();
1080 l->DrawLine(xmin, rmsl*1e3, xmax, rmsl*1e3);
1081 l->SetLineColor(kCyan);
1082 l->DrawLine(xmin, rmsl*Rthreshold*1e3, xmax, rmsl*Rthreshold*1e3);
1083
1084 textrms->DrawText(xmin+0.8*(xmax-xmin), rmsl*1e3, Form("%.1lfmrad",rmsl*1e3));
1085 textrms->DrawText(xmin+0.8*(xmax-xmin), Rthreshold*rmsl*1e3, Form("%.1lfmrad",Rthreshold*rmsl*1e3));
1086
1087 if(kinks->GetEntries()){
1088 for(int i=0;i<kinks->GetEntries();i++){
1091
1092 }
1093 }
1094
1095
1097 TH2F *h = (TH2F *) gROOT->FindObject(Form(
"hdxt%d",trk->
ID()));
1098 if(h) h->Delete();
1099 double dxmin = tree->GetMinimum("dxt");
1100 double dxmax = tree->GetMaximum("dxt");
1101 h =
new TH2F(Form(
"hdxt%d",trk->
ID()),Form(
"#deltax Transverse itrk=%d", trk->
ID()), 10, iplmin, iplmax, 10, dxmin,dxmax);
1102 h->SetXTitle("Plate number");
1103 h->SetYTitle("#deltax (#mum)");
1104 h->SetStats(0);
1105 h->Draw();
1106 tree->Draw("dxt:ipl2","","same");
1107 if(kinks->GetEntries()){
1108 for(int i=0;i<kinks->GetEntries();i++){
1110 text->DrawText(kink->
IPL2()+0.5, kink->
DXT(), Form(
"%.1lfmrad pl%d-%d pt%.3lf",
fabs(kink->
DTT()*1e3), kink->
IPL1(), kink->
IPL2(), kink->
PT()));
1111 }
1112 }
1113
1114
1116 h = (TH2F *) gROOT->FindObject(Form(
"hdxl%d",trk->
ID()));
1117 if(h) h->Delete();
1118 dxmin = tree->GetMinimum("dxl");
1119 dxmax = tree->GetMaximum("dxl");
1120 h =
new TH2F(Form(
"hdxl%d",trk->
ID()),Form(
"#deltax Longitudinal itrk=%d", trk->
ID()), 10, iplmin, iplmax, 10, dxmin,dxmax);
1121 h->SetXTitle("Plate number");
1122 h->SetYTitle("#deltax (#mum)");
1123 h->SetStats(0);
1124 h->Draw();
1125 tree->Draw("dxl:ipl2","","same");
1126
1127 if(kinks->GetEntries()){
1128 for(int i=0;i<kinks->GetEntries();i++){
1130 text->DrawText(kink->
IPL2()+0.5, kink->
DXL(), Form(
"%.1lfmrad pl%d-%d pt%.3lf",
fabs(kink->
DTL()*1e3), kink->
IPL1(), kink->
IPL2(), kink->
PT()));
1131 }
1132 }
1133
1134 return kinks;
1135}
TText * text
Definition: Canv_SYSTEMATICS_ALLCOMBINED__RMSEnergy__vs__Energy__ELECTRON.C:164
float Pt[500]
Definition: RecDispNU.C:99
Expr< UnaryOp< Fabs< T >, Expr< A, T, D >, T >, T, D > fabs(const Expr< A, T, D > &rhs)
Definition: UnaryOperators.hh:96
EdbVertex * CalcVertex(TObjArray *segments)
Definition: ShowRec.cpp:9043
Definition: EdbEDADecaySearch.h:161
double DXL()
Definition: EdbEDADecaySearch.h:185
double DTT()
Definition: EdbEDADecaySearch.h:182
int IPL2()
Definition: EdbEDADecaySearch.C:104
double PT()
Definition: EdbEDADecaySearch.h:190
double DXT()
Definition: EdbEDADecaySearch.h:184
double DTL()
Definition: EdbEDADecaySearch.h:183
void AddVertex(EdbVertex *v)
Definition: EdbEDA.h:661
Int_t ID() const
Definition: EdbSegP.h:147
Int_t N() const
Definition: EdbPattern.h:177
Definition: EdbVertex.h:69
Float_t X() const
Definition: EdbVertex.h:130
Float_t Z() const
Definition: EdbVertex.h:132
Float_t Y() const
Definition: EdbVertex.h:131
TH1F * h1
Definition: energy.C:16
void CalcDXTransLongi(EdbSegP *s1, EdbSegP *s2, double *dxt, double *dxl)
Definition: EdbEDAUtil.C:665
double DTRMSTLGiven1Kink(EdbTrackP *t, int iKink, double *rmsspace, double *rmstransverse, double *rmslongitudinal, int *NKinkAngleUsed=NULL)
Definition: EdbEDAUtil.C:790
void CalcDTTransLongi(EdbSegP *s1, EdbSegP *s2, double *dtTransverse, double *dtLongitudinal)
Definition: EdbEDAUtil.C:648
EdbTrackP * CleanTrack(EdbTrackP *t)
Definition: EdbEDAUtil.C:499
void CalcPPartial(EdbTrackP *t, EdbSegP *s1st, EdbSegP *slast, double &p, double &pmin, double &pmax, bool print=kTRUE)
Definition: EdbEDAUtil.C:344
p
Definition: testBGReduction_AllMethods.C:8