8 #include "HEPParticle.H"
11 #include "TObjArray.h"
16 int L[6] = { 5000000,5000000,2000000,2000000,1000000,1000000 };
19 inline void fillUserHisto(
char *name,
double val,
double weight=1.0,
20 double min=Setup::bin_min[0][0],
21 double max=Setup::bin_max[0][0])
23 TH1D *h=(TH1D*)(Setup::user_histograms->FindObject(name));
25 h=
new TH1D(name,name,Setup::nbins[0][0],min,max);
27 Setup::user_histograms->Add(h);
33 double normalised_cross_product(
double * v1,
double * v2,
double * result)
35 result[0] = v1[1]*v2[2] - v1[2]*v2[1];
36 result[1] = v1[2]*v2[0] - v1[0]*v2[2];
37 result[2] = v1[0]*v2[1] - v1[1]*v2[0];
39 double normalisation = sqrt(result[0]*result[0]
41 +result[2]*result[2]);
44 result[i]=result[i]/normalisation;
49 double dot_product(
double *v1,
double *v2)
51 return v1[0]*v2[0]+v1[1]*v2[1]+v1[2]*v2[2];
54 double dot_product(MC4Vector v1, MC4Vector v2)
56 return v1.GetX1()*v2.GetX1()+v1.GetX2()*v2.GetX2()+v1.GetX3()*v2.GetX3();
59 double magnitude(
double *v)
61 return sqrt(dot_product(v,v));
68 int RhoRhoPHOTOSUserTreeAnalysis(HEPParticle *mother,HEPParticleList *stableDaughters,
int nparams,
double *params)
71 assert(stableDaughters!=0);
73 HEPParticleListIterator daughters(*stableDaughters);
76 double pi_plus[4]={0};
77 double pi_minus[4]={0};
78 double pi0_plus[4]={0};
79 double pi0_minus[4]={0};
82 MC4Vector d_pi0_minus;
99 for (HEPParticle *part=daughters.first(); part!=0; part=daughters.next())
101 temp = part->GetP4();
102 if(part->GetPDGId()!=16&&part->GetPDGId()!=-16)
105 cm_px+=part->GetPx();
106 cm_py+=part->GetPy();
107 cm_pz+=part->GetPz();
112 switch(part->GetPDGId())
115 d_pi_plus.Set(&temp);
116 d_pi_plus.SetM(part->GetM());
119 d_pi_minus.Set(&temp);
120 d_pi_minus.SetM(part->GetM());
123 if(d_pi0_minus.GetX1()==0&&d_pi0_minus.GetX2()==0&&d_pi0_minus.GetX3()==0)
125 d_pi0_minus.Set(&temp);
126 d_pi0_minus.SetM(part->GetM());
130 d_pi0_plus.Set(&temp);
131 d_pi0_plus.SetM(part->GetM());
138 if(photon_e>d_gamma.GetX0())
return 0;
139 photon_e=d_gamma.GetX0();
141 if(photon_e<0.01) photon_e=0;
150 double costheta1 = dot_product(d_pi_plus,d_pi0_plus)/(d_pi_plus.Length()*d_pi0_plus.Length());
151 double costheta2 = dot_product(d_pi_minus,d_pi0_plus)/(d_pi_minus.Length()*d_pi0_plus.Length());
154 if(costheta1<costheta2)
157 temp.Set(&d_pi0_plus);
158 temp.SetM(d_pi0_plus.GetM());
159 d_pi0_plus.Set(&d_pi0_minus);
160 d_pi0_plus.SetM(d_pi0_minus.GetM());
161 d_pi0_minus.Set(&temp);
162 d_pi0_minus.SetM(temp.GetM());
166 double cm_mass = sqrt(cm_e*cm_e-cm_px*cm_px-cm_py*cm_py-cm_pz*cm_pz);
168 d_pi0_plus.Boost(cm_px,cm_py,cm_pz,cm_e,cm_mass);
169 d_pi0_minus.Boost(cm_px,cm_py,cm_pz,cm_e,cm_mass);
170 d_pi_plus.Boost(cm_px,cm_py,cm_pz,cm_e,cm_mass);
171 d_pi_minus.Boost(cm_px,cm_py,cm_pz,cm_e,cm_mass);
172 d_gamma.Boost(cm_px,cm_py,cm_pz,cm_e,cm_mass);
174 pi0_plus[0]=d_pi0_plus.GetX1();
175 pi0_plus[1]=d_pi0_plus.GetX2();
176 pi0_plus[2]=d_pi0_plus.GetX3();
177 pi0_plus[3]=d_pi0_plus.GetM();
179 pi_plus[0]=d_pi_plus.GetX1();
180 pi_plus[1]=d_pi_plus.GetX2();
181 pi_plus[2]=d_pi_plus.GetX3();
182 pi_plus[3]=d_pi_plus.GetM();
184 pi0_minus[0]=d_pi0_minus.GetX1();
185 pi0_minus[1]=d_pi0_minus.GetX2();
186 pi0_minus[2]=d_pi0_minus.GetX3();
187 pi0_minus[3]=d_pi0_minus.GetM();
189 pi_minus[0]=d_pi_minus.GetX1();
190 pi_minus[1]=d_pi_minus.GetX2();
191 pi_minus[2]=d_pi_minus.GetX3();
192 pi_minus[3]=d_pi_minus.GetM();
198 normalised_cross_product(pi_plus,pi0_plus,n_plus);
202 normalised_cross_product(pi_minus,pi0_minus,n_minus);
205 double theta = acos(dot_product(n_plus,n_minus));
208 double pi_minus_n_plus = dot_product(pi_minus,n_plus)/magnitude(pi_minus);
209 if(pi_minus_n_plus>0)
215 d_pi0_plus.Boost(-cm_px,-cm_py,-cm_pz,cm_e,cm_mass);
216 d_pi_plus.Boost(-cm_px,-cm_py,-cm_pz,cm_e,cm_mass);
217 d_pi0_minus.Boost(-cm_px,-cm_py,-cm_pz,cm_e,cm_mass);
218 d_pi_minus.Boost(-cm_px,-cm_py,-cm_pz,cm_e,cm_mass);
221 double e_tau = 120.0/2.0;
223 double p_mag_tau = sqrt(e_tau*e_tau - m_tau*m_tau);
225 MC4Vector p_tau_plus = d_pi_plus + d_pi0_plus;
226 MC4Vector p_tau_minus = d_pi_minus + d_pi0_minus;
228 double norm_plus = p_mag_tau/p_tau_plus.Length();
229 double norm_minus = p_mag_tau/p_tau_minus.Length();
231 p_tau_plus.SetX0(e_tau);
232 p_tau_plus.SetX1(norm_plus*p_tau_plus.GetX1());
233 p_tau_plus.SetX2(norm_plus*p_tau_plus.GetX2());
234 p_tau_plus.SetX3(norm_plus*p_tau_plus.GetX3());
235 p_tau_plus.SetM(m_tau);
237 p_tau_minus.SetX0(e_tau);
238 p_tau_minus.SetX1(norm_minus*p_tau_minus.GetX1());
239 p_tau_minus.SetX2(norm_minus*p_tau_minus.GetX2());
240 p_tau_minus.SetX3(norm_minus*p_tau_minus.GetX3());
241 p_tau_minus.SetM(m_tau);
244 d_pi0_plus.BoostP(p_tau_plus);
245 d_pi_plus.BoostP(p_tau_plus);
246 d_pi0_minus.BoostP(p_tau_minus);
247 d_pi_minus.BoostP(p_tau_minus);
250 double y1=(d_pi_plus.GetX0()-d_pi0_plus.GetX0())/(d_pi_plus.GetX0()+d_pi0_plus.GetX0());
251 double y2=(d_pi_minus.GetX0()-d_pi0_minus.GetX0())/(d_pi_minus.GetX0()+d_pi0_minus.GetX0());
258 if(L[0]<=0)
return 0;
260 char name[] =
"acoplanarity-angle-C-no-photon";
261 fillUserHisto(name,theta,1.0,0,2*M_PI);
265 if(L[1]<=0)
return 0;
267 char name[] =
"acoplanarity-angle-D-no-photon";
268 fillUserHisto(name,theta,1.0,0,2*M_PI);
272 if(photon_e>0&&photon_e<1.0)
276 if(L[2]<=0)
return 0;
278 char name[] =
"acoplanarity-angle-C-photon-up-to-1-GeV";
279 fillUserHisto(name,theta,1.0,0,2*M_PI);
283 if(L[3]<=0)
return 0;
285 char name[] =
"acoplanarity-angle-D-photon-up-to-1-GeV";
286 fillUserHisto(name,theta,1.0,0,2*M_PI);
293 if(L[4]<=0)
return 0;
295 char name[] =
"acoplanarity-angle-C-photon-over-1-GeV";
296 fillUserHisto(name,theta,1.0,0,2*M_PI);
300 if(L[5]<=0)
return 0;
302 char name[] =
"acoplanarity-angle-D-photon-over-1-GeV";
303 fillUserHisto(name,theta,1.0,0,2*M_PI);