#include <stdio.h>
#include <string.h>
#include "Rtypes.h"
#include "AliESDtrack.h"
#include "AliTPCParam.h"
#include "AliTrackReference.h"
#include "AliTPCParamSR.h"
#include "AliESD.h"
#include "AliESDfriend.h"
#include "AliESDtrack.h"
#include "AliTPCseed.h"
#include "AliITStrackMI.h"
#include "AliHelix.h"
#include "AliESDVertex.h"
#include "AliExternalTrackParam.h"
#include "AliESDkink.h"
#include "AliESDv0.h"
#include "AliV0.h"
#include "AliKFParticle.h"
#include "AliKFVertex.h"
#include "AliTreeDraw.h"
#include "AliMCInfo.h"
#include "AliGenKinkInfo.h"
#include "AliGenV0Info.h"
#include "AliESDRecV0Info.h"
ClassImp(AliESDRecV0Info)
AliESDRecV0Info:: AliESDRecV0Info():
TObject(),
fT1(),
fT2(),
fDist1(0),
fDist2(0),
fInvMass(0),
fDistMinR(0),
fRr(0),
fPointAngleFi(0),
fPointAngleTh(0),
fPointAngle(0),
fV0Status(0),
fV0tpc(0),
fV0its(0),
fV0rec(0),
fV0recOff(0),
fMultiple(0),
fRecStatus(0),
fV0MultipleOn(0),
fV0MultipleOff(0),
fKFrecChi2NC(0),
fKFrecChi2C(0),
fKFrecChi2CM(0),
fKFRecNC(0),
fKFRecC(0),
fKFRecCM(0),
fKFrecOffChi2NC(0),
fKFrecOffChi2C(0),
fKFrecOffChi2CM(0),
fKFOffRecNC(0),
fKFOffRecC(0),
fKFOffRecCM(0)
{
for (Int_t i=0; i<3; i++) {
fPdr[i] = 0;
fXr[i] = 0;
fPm[i] = 0;
fAngle[i] = 0;
}
for (Int_t i=0; i<2; i++) {
fRs[i] = 0;
fLab[i] = 0;
}
fV0tpc = new AliV0();
fV0its = new AliV0();
fV0rec = new AliV0();
fV0recOff = new AliV0();
}
void AliESDRecV0Info::Update(Float_t vertex[3])
{
if ( (fT1.fStatus[1]>0)&& (fT2.fStatus[1]>0)){
Float_t distance1,distance2;
Double_t xx[3],pp[3];
Double_t xd[3],pd[3],signd;
Double_t xm[3],pm[3],signm;
if (fT1.fITSOn&&fT2.fITSOn){
for (Int_t i=0;i<3;i++){
xd[i] = fT2.fITSinR1[i];
pd[i] = fT2.fITSinP1[i];
xm[i] = fT1.fITSinR1[i];
pm[i] = fT1.fITSinP1[i];
}
}
else{
for (Int_t i=0;i<3;i++){
xd[i] = fT2.fTPCinR1[i];
pd[i] = fT2.fTPCinP1[i];
xm[i] = fT1.fTPCinR1[i];
pm[i] = fT1.fTPCinP1[i];
}
}
signd = fT2.fSign<0 ? -1:1;
signm = fT1.fSign<0 ? -1:1;
AliHelix dhelix1(xd,pd,signd);
dhelix1.GetMomentum(0,pp,0);
dhelix1.Evaluate(0,xx);
AliHelix mhelix(xm,pm,signm);
Double_t phase[2][2] = { {0,0},{0,0} };
Double_t radius[2] = {0};
Int_t points = dhelix1.GetRPHIintersections(mhelix, phase, radius,200);
Double_t delta1=10000,delta2=10000;
if (points==1){
fRs[0] = TMath::Sqrt(radius[0]);
fRs[1] = TMath::Sqrt(radius[0]);
}
if (points==2){
fRs[0] =TMath::Min(TMath::Sqrt(radius[0]),TMath::Sqrt(radius[1]));
fRs[1] =TMath::Max(TMath::Sqrt(radius[0]),TMath::Sqrt(radius[1]));
}
if (points>0){
dhelix1.LinearDCA(mhelix,phase[0][0],phase[0][1],radius[0],delta1);
dhelix1.LinearDCA(mhelix,phase[0][0],phase[0][1],radius[0],delta1);
dhelix1.LinearDCA(mhelix,phase[0][0],phase[0][1],radius[0],delta1);
}
if (points==2){
dhelix1.LinearDCA(mhelix,phase[1][0],phase[1][1],radius[1],delta2);
dhelix1.LinearDCA(mhelix,phase[1][0],phase[1][1],radius[1],delta2);
dhelix1.LinearDCA(mhelix,phase[1][0],phase[1][1],radius[1],delta2);
}
if (points==1){
fRs[0] = TMath::Sqrt(radius[0]);
fRs[1] = TMath::Sqrt(radius[0]);
fDistMinR = delta1;
}
if (points==2){
if (radius[0]<radius[1]){
fRs[0] = TMath::Sqrt(radius[0]);
fRs[1] = TMath::Sqrt(radius[1]);
fDistMinR = delta1;
}
else{
fRs[0] = TMath::Sqrt(radius[1]);
fRs[1] = TMath::Sqrt(radius[0]);
fDistMinR = delta2;
}
}
distance1 = TMath::Min(delta1,delta2);
points = dhelix1.GetRPHIintersections(mhelix, phase, radius);
delta1=10000,delta2=10000;
if (points>0){
dhelix1.ParabolicDCA(mhelix,phase[0][0],phase[0][1],radius[0],delta1);
}
if (points==2){
dhelix1.ParabolicDCA(mhelix,phase[1][0],phase[1][1],radius[1],delta2);
}
distance2 = TMath::Min(delta1,delta2);
if (distance2>100) fDist2 =100;
Bool_t checkAll = 0;
if(checkAll) {
if (delta1<delta2){
dhelix1.Evaluate(phase[0][0],fXr);
dhelix1.GetMomentum(phase[0][0],fPdr);
mhelix.GetMomentum(phase[0][1],fPm);
dhelix1.GetAngle(phase[0][0],mhelix,phase[0][1],fAngle);
fRr = TMath::Sqrt(radius[0]);
}
else{
dhelix1.Evaluate(phase[1][0],fXr);
dhelix1.GetMomentum(phase[1][0], fPdr);
mhelix.GetMomentum(phase[1][1], fPm);
dhelix1.GetAngle(phase[1][0],mhelix,phase[1][1],fAngle);
fRr = TMath::Sqrt(radius[1]);
}
fDist1 = TMath::Sqrt(distance1);
fDist2 = TMath::Sqrt(distance2);
if (fDist2<10.5){
Double_t x,alpha,param[5],cov[15];
fT1.GetESDtrack()->GetInnerExternalParameters(alpha,x,param);
fT1.GetESDtrack()->GetInnerExternalCovariance(cov);
AliExternalTrackParam paramm(x,alpha,param,cov);
fT2.GetESDtrack()->GetInnerExternalParameters(alpha,x,param);
fT2.GetESDtrack()->GetInnerExternalCovariance(cov);
AliExternalTrackParam paramd(x,alpha,param,cov);
}
Float_t v[3] = {static_cast<Float_t>(fXr[0]-vertex[0]),static_cast<Float_t>(fXr[1]-vertex[1]),static_cast<Float_t>(fXr[2]-vertex[2])};
Float_t p[3] = {static_cast<Float_t>(fPdr[0]+fPm[0]), static_cast<Float_t>(fPdr[1]+fPm[1]),static_cast<Float_t>(fPdr[2]+fPm[2])};
Float_t vnorm2 = v[0]*v[0]+v[1]*v[1];
Float_t vnorm3 = TMath::Sqrt(v[2]*v[2]+vnorm2);
vnorm2 = TMath::Sqrt(vnorm2);
Float_t pnorm2 = p[0]*p[0]+p[1]*p[1];
Float_t pnorm3 = TMath::Sqrt(p[2]*p[2]+pnorm2);
pnorm2 = TMath::Sqrt(pnorm2);
fPointAngleFi = (v[0]*p[0]+v[1]*p[1])/(vnorm2*pnorm2);
fPointAngleTh = (v[2]*p[2]+vnorm2*pnorm2)/(vnorm3*pnorm3);
fPointAngle = (v[0]*p[0]+v[1]*p[1]+v[2]*p[2])/(vnorm3*pnorm3);
}
}
}
void AliESDRecV0Info::Reset(){
fDist1=-1;
fDist2=-1;
fInvMass=-1;
fDistMinR=-1;
fRr=-1;
fLab[0]=-20;
fLab[1]=-10;
fPointAngleFi=0;
fPointAngleTh=0;
fPointAngle=0;
fV0Status= -100;
fMultiple=0;
fRecStatus=0;
fV0MultipleOn=0;
fV0MultipleOff=0;
fKFrecChi2NC=0;
fKFrecChi2C=0;
fKFrecChi2CM=0;
fKFrecOffChi2NC=0;
fKFrecOffChi2C=0;
fKFrecOffChi2CM=0;
}
void AliESDRecV0Info::UpdateKF(const AliESDVertex &vertex, Int_t pdg0, Int_t pdg1, Float_t mass){
fKFrecChi2NC=0;
fKFrecChi2C=0;
fKFrecChi2CM=0;
if (fKFRecNC) {delete fKFRecNC; fKFRecNC=0;}
if (fKFRecC) {delete fKFRecC; fKFRecC=0;}
if (fKFRecCM) {delete fKFRecCM; fKFRecCM=0;}
fKFrecOffChi2NC=0;
fKFrecOffChi2C=0;
fKFrecOffChi2CM=0;
if (fKFOffRecNC) {delete fKFOffRecNC; fKFOffRecNC=0;}
if (fKFOffRecC) {delete fKFOffRecC; fKFOffRecC=0;}
if (fKFOffRecCM) {delete fKFOffRecCM; fKFOffRecCM=0;}
if (fV0Status==0) return;
AliKFVertex primVtx(vertex);
if (fV0rec &&
TMath::Abs(fV0rec->GetParamN()->GetSigmaY2())>0.000000001&&
TMath::Abs(fV0rec->GetParamP()->GetSigmaY2())>0.000000001
){
Double_t x, y, z;
AliKFParticle p1( *(fV0rec->GetParamN()), pdg0 );
AliKFParticle p2( *(fV0rec->GetParamP()), pdg1 );
fKFRecNC = new AliKFParticle;
fV0rec->GetXYZ(x,y,z);
fKFRecNC->SetVtxGuess(x,y,z);
*(fKFRecNC)+=p1;
*(fKFRecNC)+=p2;
fKFrecChi2NC =fKFRecNC->GetChi2() ;
fKFRecC = new AliKFParticle;
fV0rec->GetXYZ(x,y,z);
fKFRecC->SetVtxGuess(x,y,z);
*(fKFRecC)+=p1;
*(fKFRecC)+=p2;
fKFRecC->SetProductionVertex(primVtx);
fKFrecChi2C =fKFRecC->GetChi2();
fKFRecCM = new AliKFParticle;
fV0rec->GetXYZ(x,y,z);
fKFRecCM->SetVtxGuess(x,y,z);
*(fKFRecCM)+=p1;
*(fKFRecCM)+=p2;
fKFRecCM->SetProductionVertex(primVtx);
fKFRecCM->SetMassConstraint(mass);
fKFrecChi2CM =fKFRecCM->GetChi2();
}
if (fV0recOff &&
TMath::Abs(fV0recOff->GetParamN()->GetSigmaY2())>0.000000001&&
TMath::Abs(fV0recOff->GetParamP()->GetSigmaY2())>0.000000001
){
Double_t x, y, z;
AliKFParticle p1( *(fV0recOff->GetParamN()), pdg0 );
AliKFParticle p2( *(fV0recOff->GetParamP()), pdg1 );
fKFOffRecNC = new AliKFParticle;
fV0recOff->GetXYZ(x,y,z);
fKFOffRecNC->SetVtxGuess(x,y,z);
*(fKFOffRecNC)+=p1;
*(fKFOffRecNC)+=p2;
fKFrecOffChi2NC =fKFOffRecNC->GetChi2() ;
fKFOffRecC = new AliKFParticle;
fV0recOff->GetXYZ(x,y,z);
fKFOffRecC->SetVtxGuess(x,y,z);
*(fKFOffRecC)+=p1;
*(fKFOffRecC)+=p2;
fKFOffRecC->SetProductionVertex(primVtx);
fKFrecOffChi2C =fKFOffRecC->GetChi2();
fKFOffRecCM = new AliKFParticle;
fV0recOff->GetXYZ(x,y,z);
fKFOffRecCM->SetVtxGuess(x,y,z);
*(fKFOffRecCM)+=p1;
*(fKFOffRecCM)+=p2;
fKFOffRecCM->SetProductionVertex(primVtx);
fKFOffRecCM->SetMassConstraint(mass);
fKFrecOffChi2CM =fKFOffRecCM->GetChi2();
}
}