ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

//-------------------------------------------------------------------------
//
//    Implementation of the V0 vertex class
//    Numerical part - AliHelix functionality used             
//
//    Origin: Marian Ivanov marian.ivanov@cern.ch
//-------------------------------------------------------------------------
#include <TMath.h>

#include "AliV0.h"
#include "AliHelix.h"


ClassImp(AliV0)

void  AliV0::Update(Float_t vertex[3])
{
  //
  // updates Kink Info
  //
  //  Float_t distance1,distance2;
  Float_t distance2;
  //
  AliHelix phelix(fParamP);
  AliHelix mhelix(fParamN);    
  //
  //find intersection linear
  //
  Double_t phase[2][2]={{0}},radius[2]={0};
  Int_t  points = phelix.GetRPHIintersections(mhelix, phase, radius,200);
  Double_t delta1=10000,delta2=10000;  
  /*
  if (points<=0) return;
  if (points>0){
    phelix.LinearDCA(mhelix,phase[0][0],phase[0][1],radius[0],delta1);
    phelix.LinearDCA(mhelix,phase[0][0],phase[0][1],radius[0],delta1);
    phelix.LinearDCA(mhelix,phase[0][0],phase[0][1],radius[0],delta1);
  }
  if (points==2){    
    phelix.LinearDCA(mhelix,phase[1][0],phase[1][1],radius[1],delta2);
    phelix.LinearDCA(mhelix,phase[1][0],phase[1][1],radius[1],delta2);
    phelix.LinearDCA(mhelix,phase[1][0],phase[1][1],radius[1],delta2);
  }
  distance1 = TMath::Min(delta1,delta2);
  */
  //
  //find intersection parabolic
  //
  points = phelix.GetRPHIintersections(mhelix, phase, radius);
  delta1=10000,delta2=10000;  
  Double_t d1=1000.,d2=10000.;
  Double_t err[3],angles[3];
  if (points<=0) return;
  if (points>0){
    phelix.ParabolicDCA(mhelix,phase[0][0],phase[0][1],radius[0],delta1);
    phelix.ParabolicDCA(mhelix,phase[0][0],phase[0][1],radius[0],delta1);
    if (TMath::Abs(fParamP.GetX()-TMath::Sqrt(radius[0])<3) && TMath::Abs(fParamN.GetX()-TMath::Sqrt(radius[0])<3)){
      // if we are close to vertex use error parama
      //
      err[1] = fParamP.GetCovariance()[0]+fParamN.GetCovariance()[0]+0.05*0.05
	+0.3*(fParamP.GetCovariance()[2]+fParamN.GetCovariance()[2]);
      err[2] = fParamP.GetCovariance()[2]+fParamN.GetCovariance()[2]+0.05*0.05
	+0.3*(fParamP.GetCovariance()[0]+fParamN.GetCovariance()[0]);
      
      phelix.GetAngle(phase[0][0],mhelix,phase[0][1],angles);
      Double_t tfi  = TMath::Abs(TMath::Tan(angles[0]));
      Double_t tlam = TMath::Abs(TMath::Tan(angles[1]));
      err[0] = err[1]/((0.2+tfi)*(0.2+tfi))+err[2]/((0.2+tlam)*(0.2+tlam));
      err[0] = ((err[1]*err[2]/((0.2+tfi)*(0.2+tfi)*(0.2+tlam)*(0.2+tlam))))/err[0];
      phelix.ParabolicDCA2(mhelix,phase[0][0],phase[0][1],radius[0],delta1,err);
    }
    Double_t xd[3],xm[3];
    phelix.Evaluate(phase[0][0],xd);
    mhelix.Evaluate(phase[0][1],xm);
    d1 = (xd[0]-xm[0])*(xd[0]-xm[0])+(xd[1]-xm[1])*(xd[1]-xm[1])+(xd[2]-xm[2])*(xd[2]-xm[2]);
  }
  if (points==2){    
    phelix.ParabolicDCA(mhelix,phase[1][0],phase[1][1],radius[1],delta2);
    phelix.ParabolicDCA(mhelix,phase[1][0],phase[1][1],radius[1],delta2);
    if (TMath::Abs(fParamP.GetX()-TMath::Sqrt(radius[1])<3) && TMath::Abs(fParamN.GetX()-TMath::Sqrt(radius[1])<3)){
      // if we are close to vertex use error paramatrization
      //
      err[1] = fParamP.GetCovariance()[0]+fParamN.GetCovariance()[0]+0.05*0.05
	+0.3*(fParamP.GetCovariance()[2]+fParamN.GetCovariance()[2]);
      err[2] = fParamP.GetCovariance()[2]+fParamN.GetCovariance()[2]+0.05*0.05
	+0.3*(fParamP.GetCovariance()[0]+fParamN.GetCovariance()[0]);
      
      phelix.GetAngle(phase[1][0],mhelix,phase[1][1],angles);
      Double_t tfi  = TMath::Abs(TMath::Tan(angles[0]));
      Double_t tlam = TMath::Abs(TMath::Tan(angles[1]));
      err[0] = err[1]/((0.2+tfi)*(0.2+tfi))+err[2]/((0.2+tlam)*(0.2+tlam));     
      err[0] = ((err[1]*err[2]/((0.2+tfi)*(0.2+tfi)*(0.2+tlam)*(0.2+tlam))))/err[0];
      phelix.ParabolicDCA2(mhelix,phase[1][0],phase[1][1],radius[1],delta2,err);
    }
    Double_t xd[3],xm[3];
    phelix.Evaluate(phase[1][0],xd);
    mhelix.Evaluate(phase[1][1],xm);
    d2 = (xd[0]-xm[0])*(xd[0]-xm[0])+(xd[1]-xm[1])*(xd[1]-xm[1])+(xd[2]-xm[2])*(xd[2]-xm[2]);
  }
  //
  distance2 = TMath::Min(delta1,delta2);
  if (delta1<delta2){
    //get V0 info
    Double_t xd[3],xm[3];
    phelix.Evaluate(phase[0][0],xd);
    mhelix.Evaluate(phase[0][1], xm);
    fPos[0] = 0.5*(xd[0]+xm[0]);
    fPos[1] = 0.5*(xd[1]+xm[1]);
    fPos[2] = 0.5*(xd[2]+xm[2]);

    Float_t wy = fParamP.GetCovariance()[0]/(fParamP.GetCovariance()[0]+fParamN.GetCovariance()[0]);
    Float_t wz = fParamP.GetCovariance()[2]/(fParamP.GetCovariance()[2]+fParamN.GetCovariance()[2]);
    fPos[0] = 0.5*( (1.-wy)*xd[0]+ wy*xm[0] + (1.-wz)*xd[0]+ wz*xm[0] );
    fPos[1] = (1.-wy)*xd[1]+ wy*xm[1];
    fPos[2] = (1.-wz)*xd[2]+ wz*xm[2];
    //
    phelix.GetMomentum(phase[0][0],fPmom);
    mhelix.GetMomentum(phase[0][1],fNmom);
    phelix.GetAngle(phase[0][0],mhelix,phase[0][1],fAngle);
    fRr = TMath::Sqrt(fPos[0]*fPos[0]+fPos[1]*fPos[1]);
  }
  else{
    Double_t xd[3],xm[3];
    phelix.Evaluate(phase[1][0],xd);
    mhelix.Evaluate(phase[1][1], xm);
    fPos[0] = 0.5*(xd[0]+xm[0]);
    fPos[1] = 0.5*(xd[1]+xm[1]);
    fPos[2] = 0.5*(xd[2]+xm[2]);
    Float_t wy = fParamP.GetCovariance()[0]/(fParamP.GetCovariance()[0]+fParamN.GetCovariance()[0]);
    Float_t wz = fParamP.GetCovariance()[2]/(fParamP.GetCovariance()[2]+fParamN.GetCovariance()[2]);
    fPos[0] = 0.5*( (1.-wy)*xd[0]+ wy*xm[0] + (1.-wz)*xd[0]+ wz*xm[0] );
    fPos[1] = (1.-wy)*xd[1]+ wy*xm[1];
    fPos[2] = (1.-wz)*xd[2]+ wz*xm[2];
    //
    phelix.GetMomentum(phase[1][0], fPmom);
    mhelix.GetMomentum(phase[1][1], fNmom);
    phelix.GetAngle(phase[1][0],mhelix,phase[1][1],fAngle);
    fRr = TMath::Sqrt(fPos[0]*fPos[0]+fPos[1]*fPos[1]);
  }
  //Bo:  fDist1 = TMath::Sqrt(TMath::Min(d1,d2));
  //Bo:  fDist2 = TMath::Sqrt(distance2);
  fDcaV0Daughters = TMath::Sqrt(distance2);//Bo:
  //            
  //
  Double_t v[3] = {fPos[0]-vertex[0],fPos[1]-vertex[1],fPos[2]-vertex[2]};
  Double_t p[3] = {fPmom[0]+fNmom[0], fPmom[1]+fNmom[1],fPmom[2]+fNmom[2]};
  Double_t vnorm2 = v[0]*v[0]+v[1]*v[1];
  if (TMath::Abs(v[2])>100000) return;
  Double_t vnorm3 = TMath::Sqrt(TMath::Abs(v[2]*v[2]+vnorm2));
  vnorm2 = TMath::Sqrt(vnorm2);
  Double_t pnorm2 = p[0]*p[0]+p[1]*p[1];
  Double_t pnorm3 = TMath::Sqrt(p[2]*p[2]+pnorm2);
  pnorm2 = TMath::Sqrt(pnorm2);  
  if (vnorm2*pnorm2>0) {
    fPointAngleFi = (v[0]*p[0]+v[1]*p[1])/(vnorm2*pnorm2);
  }
  if (vnorm3*pnorm3>0) {
    fPointAngleTh = (v[2]*p[2]+vnorm2*pnorm2)/(vnorm3*pnorm3);  
    fPointAngle   = (v[0]*p[0]+v[1]*p[1]+v[2]*p[2])/(vnorm3*pnorm3);
  }
  //
}

 AliV0.cxx:1
 AliV0.cxx:2
 AliV0.cxx:3
 AliV0.cxx:4
 AliV0.cxx:5
 AliV0.cxx:6
 AliV0.cxx:7
 AliV0.cxx:8
 AliV0.cxx:9
 AliV0.cxx:10
 AliV0.cxx:11
 AliV0.cxx:12
 AliV0.cxx:13
 AliV0.cxx:14
 AliV0.cxx:15
 AliV0.cxx:16
 AliV0.cxx:17
 AliV0.cxx:18
 AliV0.cxx:19
 AliV0.cxx:20
 AliV0.cxx:21
 AliV0.cxx:22
 AliV0.cxx:23
 AliV0.cxx:24
 AliV0.cxx:25
 AliV0.cxx:26
 AliV0.cxx:27
 AliV0.cxx:28
 AliV0.cxx:29
 AliV0.cxx:30
 AliV0.cxx:31
 AliV0.cxx:32
 AliV0.cxx:33
 AliV0.cxx:34
 AliV0.cxx:35
 AliV0.cxx:36
 AliV0.cxx:37
 AliV0.cxx:38
 AliV0.cxx:39
 AliV0.cxx:40
 AliV0.cxx:41
 AliV0.cxx:42
 AliV0.cxx:43
 AliV0.cxx:44
 AliV0.cxx:45
 AliV0.cxx:46
 AliV0.cxx:47
 AliV0.cxx:48
 AliV0.cxx:49
 AliV0.cxx:50
 AliV0.cxx:51
 AliV0.cxx:52
 AliV0.cxx:53
 AliV0.cxx:54
 AliV0.cxx:55
 AliV0.cxx:56
 AliV0.cxx:57
 AliV0.cxx:58
 AliV0.cxx:59
 AliV0.cxx:60
 AliV0.cxx:61
 AliV0.cxx:62
 AliV0.cxx:63
 AliV0.cxx:64
 AliV0.cxx:65
 AliV0.cxx:66
 AliV0.cxx:67
 AliV0.cxx:68
 AliV0.cxx:69
 AliV0.cxx:70
 AliV0.cxx:71
 AliV0.cxx:72
 AliV0.cxx:73
 AliV0.cxx:74
 AliV0.cxx:75
 AliV0.cxx:76
 AliV0.cxx:77
 AliV0.cxx:78
 AliV0.cxx:79
 AliV0.cxx:80
 AliV0.cxx:81
 AliV0.cxx:82
 AliV0.cxx:83
 AliV0.cxx:84
 AliV0.cxx:85
 AliV0.cxx:86
 AliV0.cxx:87
 AliV0.cxx:88
 AliV0.cxx:89
 AliV0.cxx:90
 AliV0.cxx:91
 AliV0.cxx:92
 AliV0.cxx:93
 AliV0.cxx:94
 AliV0.cxx:95
 AliV0.cxx:96
 AliV0.cxx:97
 AliV0.cxx:98
 AliV0.cxx:99
 AliV0.cxx:100
 AliV0.cxx:101
 AliV0.cxx:102
 AliV0.cxx:103
 AliV0.cxx:104
 AliV0.cxx:105
 AliV0.cxx:106
 AliV0.cxx:107
 AliV0.cxx:108
 AliV0.cxx:109
 AliV0.cxx:110
 AliV0.cxx:111
 AliV0.cxx:112
 AliV0.cxx:113
 AliV0.cxx:114
 AliV0.cxx:115
 AliV0.cxx:116
 AliV0.cxx:117
 AliV0.cxx:118
 AliV0.cxx:119
 AliV0.cxx:120
 AliV0.cxx:121
 AliV0.cxx:122
 AliV0.cxx:123
 AliV0.cxx:124
 AliV0.cxx:125
 AliV0.cxx:126
 AliV0.cxx:127
 AliV0.cxx:128
 AliV0.cxx:129
 AliV0.cxx:130
 AliV0.cxx:131
 AliV0.cxx:132
 AliV0.cxx:133
 AliV0.cxx:134
 AliV0.cxx:135
 AliV0.cxx:136
 AliV0.cxx:137
 AliV0.cxx:138
 AliV0.cxx:139
 AliV0.cxx:140
 AliV0.cxx:141
 AliV0.cxx:142
 AliV0.cxx:143
 AliV0.cxx:144
 AliV0.cxx:145
 AliV0.cxx:146
 AliV0.cxx:147
 AliV0.cxx:148
 AliV0.cxx:149
 AliV0.cxx:150
 AliV0.cxx:151
 AliV0.cxx:152
 AliV0.cxx:153
 AliV0.cxx:154
 AliV0.cxx:155
 AliV0.cxx:156
 AliV0.cxx:157
 AliV0.cxx:158
 AliV0.cxx:159
 AliV0.cxx:160
 AliV0.cxx:161
 AliV0.cxx:162
 AliV0.cxx:163
 AliV0.cxx:164
 AliV0.cxx:165
 AliV0.cxx:166
 AliV0.cxx:167
 AliV0.cxx:168
 AliV0.cxx:169
 AliV0.cxx:170
 AliV0.cxx:171
 AliV0.cxx:172
 AliV0.cxx:173
 AliV0.cxx:174
 AliV0.cxx:175
 AliV0.cxx:176
 AliV0.cxx:177
 AliV0.cxx:178