LCOV - code coverage report
Current view: top level - STEER/ESD - AliCascadeVertexer.cxx (source / functions) Hit Total Coverage
Test: coverage.info Lines: 85 113 75.2 %
Date: 2016-06-14 17:26:59 Functions: 5 5 100.0 %

          Line data    Source code
       1             : /**************************************************************************
       2             :  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
       3             :  *                                                                        *
       4             :  * Author: The ALICE Off-line Project.                                    *
       5             :  * Contributors are mentioned in the code where appropriate.              *
       6             :  *                                                                        *
       7             :  * Permission to use, copy, modify and distribute this software and its   *
       8             :  * documentation strictly for non-commercial purposes is hereby granted   *
       9             :  * without fee, provided that the above copyright notice appears in all   *
      10             :  * copies and that both the copyright notice and this permission notice   *
      11             :  * appear in the supporting documentation. The authors make no claims     *
      12             :  * about the suitability of this software for any purpose. It is          *
      13             :  * provided "as is" without express or implied warranty.                  *
      14             :  **************************************************************************/
      15             : 
      16             : //-------------------------------------------------------------------------
      17             : //               Implementation of the cascade vertexer class
      18             : //          Reads V0s and tracks, writes out cascade vertices
      19             : //                     Fills the ESD with the cascades 
      20             : //    Origin: Christian Kuhn, IReS, Strasbourg, christian.kuhn@ires.in2p3.fr
      21             : //-------------------------------------------------------------------------
      22             : 
      23             : //modified by R. Vernet 30/6/2006 : daughter label
      24             : //modified by R. Vernet  3/7/2006 : causality
      25             : //modified by I. Belikov 24/11/2006 : static setter for the default cuts
      26             : 
      27             : #include "AliESDEvent.h"
      28             : #include "AliESDcascade.h"
      29             : #include "AliCascadeVertexer.h"
      30             : 
      31         172 : ClassImp(AliCascadeVertexer)
      32             : 
      33             : //A set of loose cuts
      34             : Double_t 
      35             :   AliCascadeVertexer::fgChi2max=33.;   //maximal allowed chi2 
      36             : Double_t 
      37             :   AliCascadeVertexer::fgDV0min=0.01;   //min V0 impact parameter
      38             : Double_t 
      39             :   AliCascadeVertexer::fgMassWin=0.008; //"window" around the Lambda mass
      40             : Double_t 
      41             :   AliCascadeVertexer::fgDBachMin=0.01; //min bachelor impact parameter
      42             : Double_t 
      43             :   AliCascadeVertexer::fgDCAmax=2.0;    //max DCA between the V0 and the track 
      44             : Double_t 
      45             :   AliCascadeVertexer::fgCPAmin=0.98; //min cosine of the cascade pointing angle
      46             : Double_t 
      47             :   AliCascadeVertexer::fgRmin=0.2;      //min radius of the fiducial volume
      48             : Double_t 
      49             :   AliCascadeVertexer::fgRmax=100.;     //max radius of the fiducial volume
      50             :   
      51             : 
      52             : Int_t AliCascadeVertexer::V0sTracks2CascadeVertices(AliESDEvent *event) {
      53             :   //--------------------------------------------------------------------
      54             :   // This function reconstructs cascade vertices
      55             :   //      Adapted to the ESD by I.Belikov (Jouri.Belikov@cern.ch)
      56             :   //--------------------------------------------------------------------
      57          16 :    const AliESDVertex *vtxT3D=event->GetPrimaryVertex();
      58             : 
      59           8 :    Double_t xPrimaryVertex=vtxT3D->GetX();
      60           8 :    Double_t yPrimaryVertex=vtxT3D->GetY();
      61           8 :    Double_t zPrimaryVertex=vtxT3D->GetZ();
      62             : 
      63           8 :    Double_t b=event->GetMagneticField();
      64           8 :    Int_t nV0=(Int_t)event->GetNumberOfV0s();
      65             : 
      66             :    //stores relevant V0s in an array
      67           8 :    TObjArray vtcs(nV0);
      68             :    Int_t i;
      69          72 :    for (i=0; i<nV0; i++) {
      70          28 :        AliESDv0 *v=event->GetV0(i);
      71          42 :        if (v->GetOnFlyStatus()) continue;
      72          28 :        if (v->GetD(xPrimaryVertex,yPrimaryVertex,zPrimaryVertex)<fDV0min) continue;
      73          14 :        vtcs.AddLast(v);
      74          14 :    }
      75           8 :    nV0=vtcs.GetEntriesFast();
      76             : 
      77             :    // stores relevant tracks in another array
      78           8 :    Int_t nentr=(Int_t)event->GetNumberOfTracks();
      79           8 :    int trk[nentr], ntr=0;
      80         320 :    for (i=0; i<nentr; i++) {
      81         152 :      AliESDtrack *esdtr=event->GetTrack(i);
      82         152 :      ULong_t status=esdtr->GetStatus();
      83         152 :      if (status&AliESDtrack::kITSpureSA) continue;
      84         152 :      if ((status&AliESDtrack::kITSrefit)==0)
      85          60 :        if ((status&AliESDtrack::kTPCrefit)==0) continue;
      86             : 
      87         376 :        if (TMath::Abs(esdtr->GetD(xPrimaryVertex,yPrimaryVertex,b))<fDBachMin) continue;
      88             : 
      89          80 :        trk[ntr++]=i;
      90          80 :    }   
      91             : 
      92             :    Double_t massLambda=1.11568;
      93             :    Int_t ncasc=0;
      94             : 
      95             :    // Looking for the cascades...
      96             : 
      97          44 :    for (i=0; i<nV0; i++) { //loop on V0s
      98             : 
      99          14 :       AliESDv0 *v=(AliESDv0*)vtcs.UncheckedAt(i);
     100          14 :       AliESDv0 v0(*v);
     101          14 :       v0.ChangeMassHypothesis(kLambda0); // the v0 must be Lambda 
     102          26 :       if (TMath::Abs(v0.GetEffMass()-massLambda)>fMassWin) continue; 
     103             : 
     104          28 :       for (Int_t j=0; j<ntr; j++) {//loop on tracks
     105          12 :          Int_t bidx=trk[j];
     106             :          //Bo:   if (bidx==v->GetNindex()) continue; //bachelor and v0's negative tracks must be different
     107          14 :          if (bidx==v0.GetIndex(0)) continue; //Bo:  consistency 0 for neg
     108          10 :          AliESDtrack *btrk=event->GetTrack(bidx);
     109          26 :          if (btrk->GetSign()>0) continue;  // bachelor's charge 
     110             :           
     111             :          AliESDv0 *pv0=&v0;
     112           4 :          AliExternalTrackParam bt(*btrk), *pbt=&bt;
     113             : 
     114           4 :          Double_t dca=PropagateToDCA(pv0,pbt,b);
     115           4 :          if (dca > fDCAmax) continue;
     116             : 
     117           4 :          AliESDcascade cascade(*pv0,*pbt,bidx);//constucts a cascade candidate
     118             :          //PH        if (cascade.GetChi2Xi() > fChi2max) continue;
     119             : 
     120           4 :          Double_t x,y,z; cascade.GetXYZcascade(x,y,z); // Bo: bug correction
     121           4 :          Double_t r2=x*x + y*y; 
     122           6 :          if (r2 > fRmax2) continue;   // condition on fiducial zone
     123           2 :          if (r2 < fRmin2) continue;
     124             : 
     125           2 :          Double_t pxV0,pyV0,pzV0;
     126           2 :          pv0->GetPxPyPz(pxV0,pyV0,pzV0);
     127           2 :          if (x*pxV0+y*pyV0+z*pzV0 < 0) continue; //causality
     128             : 
     129           2 :          Double_t x1,y1,z1; pv0->GetXYZ(x1,y1,z1);
     130           2 :          if (r2 > (x1*x1+y1*y1)) continue;
     131             : 
     132           6 :          if (cascade.GetCascadeCosineOfPointingAngle(xPrimaryVertex,yPrimaryVertex,zPrimaryVertex) <fCPAmin) continue; //condition on the cascade pointing angle 
     133             :          
     134           0 :          cascade.SetDcaXiDaughters(dca);
     135           0 :          event->AddCascade(&cascade);
     136           0 :          ncasc++;
     137          12 :       } // end loop tracks
     138          16 :    } // end loop V0s
     139             : 
     140             :    // Looking for the anti-cascades...
     141             : 
     142          44 :    for (i=0; i<nV0; i++) { //loop on V0s
     143          14 :       AliESDv0 *v=(AliESDv0*)vtcs.UncheckedAt(i);
     144          14 :       AliESDv0 v0(*v);
     145          14 :       v0.ChangeMassHypothesis(kLambda0Bar); //the v0 must be anti-Lambda 
     146          28 :       if (TMath::Abs(v0.GetEffMass()-massLambda)>fMassWin) continue; 
     147             : 
     148           0 :       for (Int_t j=0; j<ntr; j++) {//loop on tracks
     149           0 :          Int_t bidx=trk[j];
     150             :          //Bo:   if (bidx==v->GetPindex()) continue; //bachelor and v0's positive tracks must be different
     151           0 :          if (bidx==v0.GetIndex(1)) continue; //Bo:  consistency 1 for pos
     152           0 :          AliESDtrack *btrk=event->GetTrack(bidx);
     153           0 :          if (btrk->GetSign()<0) continue;  // bachelor's charge 
     154             :           
     155             :          AliESDv0 *pv0=&v0;
     156           0 :          AliExternalTrackParam bt(*btrk), *pbt=&bt;
     157             : 
     158           0 :          Double_t dca=PropagateToDCA(pv0,pbt,b);
     159           0 :          if (dca > fDCAmax) continue;
     160             : 
     161           0 :          AliESDcascade cascade(*pv0,*pbt,bidx); //constucts a cascade candidate
     162             :          //PH         if (cascade.GetChi2Xi() > fChi2max) continue;
     163             : 
     164           0 :          Double_t x,y,z; cascade.GetXYZcascade(x,y,z); // Bo: bug correction
     165           0 :          Double_t r2=x*x + y*y; 
     166           0 :          if (r2 > fRmax2) continue;   // condition on fiducial zone
     167           0 :          if (r2 < fRmin2) continue;
     168             : 
     169           0 :          Double_t pxV0,pyV0,pzV0;
     170           0 :          pv0->GetPxPyPz(pxV0,pyV0,pzV0);
     171           0 :          if (x*pxV0+y*pyV0+z*pzV0 < 0) continue; //causality
     172             : 
     173           0 :          Double_t x1,y1,z1; pv0->GetXYZ(x1,y1,z1);
     174           0 :          if (r2 > (x1*x1+y1*y1)) continue;
     175             : 
     176           0 :          if (cascade.GetCascadeCosineOfPointingAngle(xPrimaryVertex,yPrimaryVertex,zPrimaryVertex) < fCPAmin) continue; //condition on the cascade pointing angle 
     177             : 
     178           0 :          cascade.SetDcaXiDaughters(dca);
     179           0 :          event->AddCascade(&cascade);
     180           0 :          ncasc++;
     181             : 
     182           0 :       } // end loop tracks
     183          14 :    } // end loop V0s
     184             : 
     185           8 : Info("V0sTracks2CascadeVertices","Number of reconstructed cascades: %d",ncasc);
     186             : 
     187             :    return 0;
     188           8 : }
     189             : 
     190             : 
     191             : Double_t AliCascadeVertexer::Det(Double_t a00, Double_t a01, Double_t a10, Double_t a11) const {
     192             :   //--------------------------------------------------------------------
     193             :   // This function calculates locally a 2x2 determinant
     194             :   //--------------------------------------------------------------------
     195          96 :   return a00*a11 - a01*a10;
     196             : }
     197             : 
     198             : Double_t AliCascadeVertexer::Det(Double_t a00,Double_t a01,Double_t a02,
     199             :                                  Double_t a10,Double_t a11,Double_t a12,
     200             :                                  Double_t a20,Double_t a21,Double_t a22) const {
     201             :   //--------------------------------------------------------------------
     202             :   // This function calculates locally a 3x3 determinant
     203             :   //--------------------------------------------------------------------
     204          24 :   return  a00*Det(a11,a12,a21,a22)-a01*Det(a10,a12,a20,a22)+a02*Det(a10,a11,a20,a21);
     205             : }
     206             : 
     207             : 
     208             : 
     209             : 
     210             : Double_t AliCascadeVertexer::PropagateToDCA(AliESDv0 *v, AliExternalTrackParam *t, Double_t b) {
     211             :   //--------------------------------------------------------------------
     212             :   // This function returns the DCA between the V0 and the track
     213             :   //--------------------------------------------------------------------
     214           8 :   Double_t alpha=t->GetAlpha(), cs1=TMath::Cos(alpha), sn1=TMath::Sin(alpha);
     215           4 :   Double_t r[3]; t->GetXYZ(r);
     216           4 :   Double_t x1=r[0], y1=r[1], z1=r[2];
     217           4 :   Double_t p[3]; t->GetPxPyPz(p);
     218           4 :   Double_t px1=p[0], py1=p[1], pz1=p[2];
     219             :   
     220           4 :   Double_t x2,y2,z2;     // position and momentum of V0
     221           4 :   Double_t px2,py2,pz2;
     222             :   
     223           4 :   v->GetXYZ(x2,y2,z2);
     224           4 :   v->GetPxPyPz(px2,py2,pz2);
     225             :  
     226             : // calculation dca
     227             :    
     228           4 :   Double_t dd= Det(x2-x1,y2-y1,z2-z1,px1,py1,pz1,px2,py2,pz2);
     229           4 :   Double_t ax= Det(py1,pz1,py2,pz2);
     230           4 :   Double_t ay=-Det(px1,pz1,px2,pz2);
     231           4 :   Double_t az= Det(px1,py1,px2,py2);
     232             : 
     233           4 :   Double_t dca=TMath::Abs(dd)/TMath::Sqrt(ax*ax + ay*ay + az*az);
     234           4 :   if (dca > fDCAmax) return 1.e+33;
     235             : 
     236             : //points of the DCA
     237           8 :   Double_t t1 = Det(x2-x1,y2-y1,z2-z1,px2,py2,pz2,ax,ay,az)/
     238           4 :                 Det(px1,py1,pz1,px2,py2,pz2,ax,ay,az);
     239             :   
     240           4 :   x1 += px1*t1; y1 += py1*t1; //z1 += pz1*t1;
     241             :   
     242           4 :   if (x1*x1+y1*y1 > fRmaxMargin2) return 1.e+33;
     243             : 
     244             :   //propagate track to the points of DCA
     245             : 
     246           4 :   x1=x1*cs1 + y1*sn1;
     247             : 
     248           4 :   if (!t->PropagateTo(x1,b)) {
     249           0 :     AliError("Propagation failed");
     250             :     //    AliErrorF("Propagation failed for X=%f | V0: %f %f %f",x1,x2,y2,z2);
     251             :     //    t->Print();
     252             :     //
     253           0 :     return 1.e+33;
     254             :   }  
     255             : 
     256           4 :   return dca;
     257           4 : }
     258             : 
     259             : 
     260             : 
     261             : 
     262             : 
     263             : 
     264             : 
     265             : 
     266             : 
     267             : 
     268             : 

Generated by: LCOV version 1.11