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.                  *
 **************************************************************************/


///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// Redo primary vertex on the fly, using the diamond constraint              //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

#include <TSystem.h>
#include "AliESDEvent.h"
#include "AliTender.h"
#include "AliVParticle.h"
#include "AliLog.h"
#include "AliOADBContainer.h"
#include "AliAnalysisManager.h"
#include "AliTrackFixTenderSupply.h"
#include "AliOADBTrackFix.h"

ClassImp(AliTrackFixTenderSupply)

AliTrackFixTenderSupply::AliTrackFixTenderSupply() :
fDebug(0),
  fBz(0),
  fParams(0),
  fOADBObjPath("$OADB/PWGPP/data/CorrPTInv.root"),
  fOADBObjName("CorrPTInv"),
  fOADBCont(0)
{
  // default ctor
}

//_____________________________________________________
AliTrackFixTenderSupply::AliTrackFixTenderSupply(const char *name, const AliTender *tender) :
  AliTenderSupply(name,tender),
  fDebug(0),
  fBz(0),
  fParams(0),
  fOADBObjPath("$OADB/PWGPP/data/CorrPTInv.root"),
  fOADBObjName("CorrPTInv"),
  fOADBCont(0)
{
  // named ctor
  //
}

//_____________________________________________________
AliTrackFixTenderSupply::~AliTrackFixTenderSupply()
{
  // d-tor
  delete fOADBCont;
}


//_____________________________________________________
void AliTrackFixTenderSupply::ProcessEvent()
{
  //
  // Fix track kinematics
  //
  AliESDEvent *event=fTender->GetEvent();
  if (!event) return;
  //
  if (fTender->RunChanged() && !GetRunCorrections(fTender->GetRun())) return;
  //
  int nTracks = event->GetNumberOfTracks();
  fBz = event->GetMagneticField();
  if (TMath::Abs(fBz) < kAlmost0Field) return;
  //
  const AliESDVertex *vtx = 0, *vtxTPC = 0;
  //
  vtx = event->GetPrimaryVertexTracks(); // vertex to be used for update via RelateToVertex
  if (!vtx || vtx->GetStatus()<1) {
    vtx = event->GetPrimaryVertexSPD();
    if (vtx && vtx->GetStatus()<1) vtx = 0;
  }
  vtxTPC = event->GetPrimaryVertexTPC(); // vertex to be used for update via RelateToVertexTPC
  if (vtxTPC && vtxTPC->GetStatus()<1) vtxTPC = 0;
  //  
  AliExternalTrackParam* extPar = 0;
  double xOrig = 0;
  double xyzTPCInner[3] = {0,0,0};
  for (int itr=0;itr<nTracks;itr++) {
    //
    AliESDtrack* trc = event->GetTrack(itr);
    if (!trc->IsOn(AliESDtrack::kTPCin)) continue;
    //
    double sideAfraction = GetSideAFraction(trc);
    // correct the main parameterization
    int cormode = trc->IsOn(AliESDtrack::kITSin) ? AliOADBTrackFix::kCorModeGlob : AliOADBTrackFix::kCorModeTPCInner;
    xOrig = trc->GetX();
    double xIniCor = fParams->GetXIniPtInvCorr(cormode);
    const AliExternalTrackParam* parInner = trc->GetInnerParam();
    if (!parInner) {
      AliError("Failed to extract inner param");
      continue;
    }
    parInner->GetXYZ(xyzTPCInner);
    double phi = TMath::ATan2(xyzTPCInner[1],xyzTPCInner[0]);
    if (phi<0) phi += 2*TMath::Pi();
    //
    if (fDebug>1) {
      AliInfo(Form("Tr:%4d kITSin:%d Phi=%+5.2f at X=%+7.2f | SideA fraction: %.3f",itr,trc->IsOn(AliESDtrack::kITSin),phi,parInner->GetX(),sideAfraction));
      AliInfo(Form("Main Param before corr. in mode %s, xIni:%.1f",cormode== AliOADBTrackFix::kCorModeGlob ?  "Glo":"TPC",xIniCor));
      trc->AliExternalTrackParam::Print();
    }
    //
    if (xIniCor>0) trc->PropagateTo(xIniCor,fBz);
    CorrectTrackPtInv(trc, cormode, sideAfraction, phi);
    if (xIniCor>0) {                             // full update is requested
      if (vtx) trc->RelateToVertex(vtx, fBz, kVeryBig); // redo DCA if vtx is available
      else     trc->PropagateTo(xOrig, fBz);            // otherwise bring to original point
    }
    // 
    if (fDebug>1) {
      AliInfo("Main Param after corr.");
      trc->AliExternalTrackParam::Print();
    }
    // correct TPCinner param
    if ( (extPar=(AliExternalTrackParam*)trc->GetTPCInnerParam()) ) {
      cormode = AliOADBTrackFix::kCorModeTPCInner;
      xOrig = extPar->GetX();
      xIniCor = fParams->GetXIniPtInvCorr(cormode);
      if (fDebug>1) {
	AliInfo(Form("TPCinner Param before corr. in mode %s, xIni:%.1f",cormode== AliOADBTrackFix::kCorModeGlob ?  "Glo":"TPC",xIniCor));
	extPar->AliExternalTrackParam::Print();
      }
      //
      if (xIniCor>0) extPar->PropagateTo(xIniCor,fBz);
      CorrectTrackPtInv(extPar,cormode,sideAfraction, phi);
      if (xIniCor>0) {                              // full update is requested
	if (vtxTPC) trc->RelateToVertexTPC(vtxTPC, fBz, kVeryBig);  // redo DCA if vtx is available
	else        extPar->PropagateTo(xOrig, fBz);                // otherwise bring to original point
      }
      //
      if (fDebug>1) {
	AliInfo("TPCinner Param after corr.");
	extPar->AliExternalTrackParam::Print();
      }      
    }
    //
  }
  //
}

//_____________________________________________________
void AliTrackFixTenderSupply::CorrectTrackPtInv(AliExternalTrackParam* trc, Int_t mode, double sideAfraction, double phi) const
{
  // fix track kinematics
  if (!trc) return;
  double *param = (double*)trc->GetParameter();
  param[4] += fParams->GetPtInvCorr(mode,sideAfraction,phi);
  //
}

//_____________________________________________________
Bool_t AliTrackFixTenderSupply::LoadOADBObjects()
{
  // Load OADB parameters
  TString fileName = fOADBObjPath;
  if (fileName.BeginsWith("$OADB")) fileName.ReplaceAll("$OADB",Form("%s/",AliAnalysisManager::GetOADBPath()));
  gSystem->ExpandPathName(fileName);
  AliInfo(Form("Loading correction parameters %s from %s",fOADBObjName.Data(),fileName.Data()));
  //
  fOADBCont = new AliOADBContainer("OADB");
  if (fOADBCont->InitFromFile(fileName.Data(),fOADBObjName.Data())) {
    AliError("Failed to load OADB Container");
    delete fOADBCont;
    fOADBCont = 0;
    return kFALSE;
  }
  //
  return kTRUE;
}

//_____________________________________________________
Bool_t AliTrackFixTenderSupply::GetRunCorrections(int run)
{
  // extract corrections for given run
  fParams = 0;
  if (!fOADBCont) if (!LoadOADBObjects()) return kFALSE;
  fParams = dynamic_cast<AliOADBTrackFix*>(fOADBCont->GetObject(run,"default"));
  if (!fParams) {AliError(Form("No correction parameters for found for run %d",run)); return kFALSE;}
  AliInfo(Form("Loaded correction parameters for run %d",run));
  //
  return kTRUE;
}

//_____________________________________________________
Double_t AliTrackFixTenderSupply::GetSideAFraction(const AliESDtrack* track) const
{
  // decide A-side fraction of trajectory length in TPC 
  // for the moment just a placeholder...
  //
  const AliExternalTrackParam *trIn = track->GetInnerParam();
  if (!trIn) {AliError("Failed to onbtain InnerParam"); return 0.5;}
  //
  // easy cases:
  double sideAfrac = 0.5;
  if      (trIn->GetZ()>0) { sideAfrac = 1.; if (trIn->GetTgl()>-kAlmost0) return sideAfrac;}
  else if (trIn->GetZ()<0) { sideAfrac = 0.; if (trIn->GetTgl()< kAlmost0) return sideAfrac;}
  //
  // track may cross the membrane
  // convert to usual helix param: 
  // x(t)=(dca+R)*cos(phi0) -R*cos(t+phi0);
  // y(t)=(dca+R)*sin(phi0) -R*sin(t+phi0);
  // z(t)=z0 - R*t*tgl
  //
  int sqb = fBz<0 ? -trIn->Charge() : trIn->Charge();
  double radq = TMath::Abs(trIn->GetC(fBz));
  radq = radq>kAlmost0 ? 1./radq : 1e4; // track radius
  if (sqb<0) radq = -radq;
  double cstCphi0 =  trIn->GetSnp(); // tC is current t
  double sntCphi0 = -TMath::Sqrt((1.-cstCphi0)*(1+cstCphi0));
  double xc0 = trIn->GetX() + radq*cstCphi0; // circle center
  double yc0 = trIn->GetY() + radq*sntCphi0;
  double phi0 = TMath::ATan2( yc0, xc0);
  if (sqb<0) phi0 += TMath::Pi();
  if      (phi0 > TMath::Pi()) phi0 -= 2.*TMath::Pi();
  else if (phi0 <-TMath::Pi()) phi0 += 2.*TMath::Pi();
  //
  double csphi0 = TMath::Cos(phi0);
  double snphi0 = TMath::Sin(phi0);
  double dca    = xc0*csphi0 + yc0*snphi0 - radq;
  double tC     = TMath::ATan2(sntCphi0,cstCphi0) - phi0;
  double tglR   = radq*trIn->GetTgl();
  double z0     = trIn->GetZ() + tglR*tC;
  Double_t tCross = z0/tglR;  // Z=0 is crossed at this t
  // t is changed withing tCross:2pi range for the track moving forward
  if (tCross<tC || tCross>TMath::Pi()) return sideAfrac;  // on the way forward does not cross the membrane
  //
  // find max t reached by the track in the TPC
  const double kROutTPC2 = 250.*250.;
  // find t at which the outer radius is crossed
  // r^2 = (dca+R)^2 + R^2 - 2R(R+dca)*cos(t)
  double dcaR = dca+radq;
  double rmax2 = dcaR*dcaR + radq*radq + 2*radq*dcaR; // max rad at t=pi
  double tmax = TMath::Pi();
  if (rmax2>kROutTPC2) { // traverses full TPC
    double ct = 0.5*(dcaR/radq + radq/dcaR - kROutTPC2/radq/dcaR);    
    if (TMath::Abs(ct)<1-kAlmost0) tmax = TMath::ACos(ct);
  }
  if (tmax<tCross) return sideAfrac;  // does not cross z=0
  sideAfrac = sideAfrac>0.5 ? (tCross-tC)/(tmax-tC) : 1.-(tCross-tC)/(tmax-tC);
  return sideAfrac;
}
 AliTrackFixTenderSupply.cxx:1
 AliTrackFixTenderSupply.cxx:2
 AliTrackFixTenderSupply.cxx:3
 AliTrackFixTenderSupply.cxx:4
 AliTrackFixTenderSupply.cxx:5
 AliTrackFixTenderSupply.cxx:6
 AliTrackFixTenderSupply.cxx:7
 AliTrackFixTenderSupply.cxx:8
 AliTrackFixTenderSupply.cxx:9
 AliTrackFixTenderSupply.cxx:10
 AliTrackFixTenderSupply.cxx:11
 AliTrackFixTenderSupply.cxx:12
 AliTrackFixTenderSupply.cxx:13
 AliTrackFixTenderSupply.cxx:14
 AliTrackFixTenderSupply.cxx:15
 AliTrackFixTenderSupply.cxx:16
 AliTrackFixTenderSupply.cxx:17
 AliTrackFixTenderSupply.cxx:18
 AliTrackFixTenderSupply.cxx:19
 AliTrackFixTenderSupply.cxx:20
 AliTrackFixTenderSupply.cxx:21
 AliTrackFixTenderSupply.cxx:22
 AliTrackFixTenderSupply.cxx:23
 AliTrackFixTenderSupply.cxx:24
 AliTrackFixTenderSupply.cxx:25
 AliTrackFixTenderSupply.cxx:26
 AliTrackFixTenderSupply.cxx:27
 AliTrackFixTenderSupply.cxx:28
 AliTrackFixTenderSupply.cxx:29
 AliTrackFixTenderSupply.cxx:30
 AliTrackFixTenderSupply.cxx:31
 AliTrackFixTenderSupply.cxx:32
 AliTrackFixTenderSupply.cxx:33
 AliTrackFixTenderSupply.cxx:34
 AliTrackFixTenderSupply.cxx:35
 AliTrackFixTenderSupply.cxx:36
 AliTrackFixTenderSupply.cxx:37
 AliTrackFixTenderSupply.cxx:38
 AliTrackFixTenderSupply.cxx:39
 AliTrackFixTenderSupply.cxx:40
 AliTrackFixTenderSupply.cxx:41
 AliTrackFixTenderSupply.cxx:42
 AliTrackFixTenderSupply.cxx:43
 AliTrackFixTenderSupply.cxx:44
 AliTrackFixTenderSupply.cxx:45
 AliTrackFixTenderSupply.cxx:46
 AliTrackFixTenderSupply.cxx:47
 AliTrackFixTenderSupply.cxx:48
 AliTrackFixTenderSupply.cxx:49
 AliTrackFixTenderSupply.cxx:50
 AliTrackFixTenderSupply.cxx:51
 AliTrackFixTenderSupply.cxx:52
 AliTrackFixTenderSupply.cxx:53
 AliTrackFixTenderSupply.cxx:54
 AliTrackFixTenderSupply.cxx:55
 AliTrackFixTenderSupply.cxx:56
 AliTrackFixTenderSupply.cxx:57
 AliTrackFixTenderSupply.cxx:58
 AliTrackFixTenderSupply.cxx:59
 AliTrackFixTenderSupply.cxx:60
 AliTrackFixTenderSupply.cxx:61
 AliTrackFixTenderSupply.cxx:62
 AliTrackFixTenderSupply.cxx:63
 AliTrackFixTenderSupply.cxx:64
 AliTrackFixTenderSupply.cxx:65
 AliTrackFixTenderSupply.cxx:66
 AliTrackFixTenderSupply.cxx:67
 AliTrackFixTenderSupply.cxx:68
 AliTrackFixTenderSupply.cxx:69
 AliTrackFixTenderSupply.cxx:70
 AliTrackFixTenderSupply.cxx:71
 AliTrackFixTenderSupply.cxx:72
 AliTrackFixTenderSupply.cxx:73
 AliTrackFixTenderSupply.cxx:74
 AliTrackFixTenderSupply.cxx:75
 AliTrackFixTenderSupply.cxx:76
 AliTrackFixTenderSupply.cxx:77
 AliTrackFixTenderSupply.cxx:78
 AliTrackFixTenderSupply.cxx:79
 AliTrackFixTenderSupply.cxx:80
 AliTrackFixTenderSupply.cxx:81
 AliTrackFixTenderSupply.cxx:82
 AliTrackFixTenderSupply.cxx:83
 AliTrackFixTenderSupply.cxx:84
 AliTrackFixTenderSupply.cxx:85
 AliTrackFixTenderSupply.cxx:86
 AliTrackFixTenderSupply.cxx:87
 AliTrackFixTenderSupply.cxx:88
 AliTrackFixTenderSupply.cxx:89
 AliTrackFixTenderSupply.cxx:90
 AliTrackFixTenderSupply.cxx:91
 AliTrackFixTenderSupply.cxx:92
 AliTrackFixTenderSupply.cxx:93
 AliTrackFixTenderSupply.cxx:94
 AliTrackFixTenderSupply.cxx:95
 AliTrackFixTenderSupply.cxx:96
 AliTrackFixTenderSupply.cxx:97
 AliTrackFixTenderSupply.cxx:98
 AliTrackFixTenderSupply.cxx:99
 AliTrackFixTenderSupply.cxx:100
 AliTrackFixTenderSupply.cxx:101
 AliTrackFixTenderSupply.cxx:102
 AliTrackFixTenderSupply.cxx:103
 AliTrackFixTenderSupply.cxx:104
 AliTrackFixTenderSupply.cxx:105
 AliTrackFixTenderSupply.cxx:106
 AliTrackFixTenderSupply.cxx:107
 AliTrackFixTenderSupply.cxx:108
 AliTrackFixTenderSupply.cxx:109
 AliTrackFixTenderSupply.cxx:110
 AliTrackFixTenderSupply.cxx:111
 AliTrackFixTenderSupply.cxx:112
 AliTrackFixTenderSupply.cxx:113
 AliTrackFixTenderSupply.cxx:114
 AliTrackFixTenderSupply.cxx:115
 AliTrackFixTenderSupply.cxx:116
 AliTrackFixTenderSupply.cxx:117
 AliTrackFixTenderSupply.cxx:118
 AliTrackFixTenderSupply.cxx:119
 AliTrackFixTenderSupply.cxx:120
 AliTrackFixTenderSupply.cxx:121
 AliTrackFixTenderSupply.cxx:122
 AliTrackFixTenderSupply.cxx:123
 AliTrackFixTenderSupply.cxx:124
 AliTrackFixTenderSupply.cxx:125
 AliTrackFixTenderSupply.cxx:126
 AliTrackFixTenderSupply.cxx:127
 AliTrackFixTenderSupply.cxx:128
 AliTrackFixTenderSupply.cxx:129
 AliTrackFixTenderSupply.cxx:130
 AliTrackFixTenderSupply.cxx:131
 AliTrackFixTenderSupply.cxx:132
 AliTrackFixTenderSupply.cxx:133
 AliTrackFixTenderSupply.cxx:134
 AliTrackFixTenderSupply.cxx:135
 AliTrackFixTenderSupply.cxx:136
 AliTrackFixTenderSupply.cxx:137
 AliTrackFixTenderSupply.cxx:138
 AliTrackFixTenderSupply.cxx:139
 AliTrackFixTenderSupply.cxx:140
 AliTrackFixTenderSupply.cxx:141
 AliTrackFixTenderSupply.cxx:142
 AliTrackFixTenderSupply.cxx:143
 AliTrackFixTenderSupply.cxx:144
 AliTrackFixTenderSupply.cxx:145
 AliTrackFixTenderSupply.cxx:146
 AliTrackFixTenderSupply.cxx:147
 AliTrackFixTenderSupply.cxx:148
 AliTrackFixTenderSupply.cxx:149
 AliTrackFixTenderSupply.cxx:150
 AliTrackFixTenderSupply.cxx:151
 AliTrackFixTenderSupply.cxx:152
 AliTrackFixTenderSupply.cxx:153
 AliTrackFixTenderSupply.cxx:154
 AliTrackFixTenderSupply.cxx:155
 AliTrackFixTenderSupply.cxx:156
 AliTrackFixTenderSupply.cxx:157
 AliTrackFixTenderSupply.cxx:158
 AliTrackFixTenderSupply.cxx:159
 AliTrackFixTenderSupply.cxx:160
 AliTrackFixTenderSupply.cxx:161
 AliTrackFixTenderSupply.cxx:162
 AliTrackFixTenderSupply.cxx:163
 AliTrackFixTenderSupply.cxx:164
 AliTrackFixTenderSupply.cxx:165
 AliTrackFixTenderSupply.cxx:166
 AliTrackFixTenderSupply.cxx:167
 AliTrackFixTenderSupply.cxx:168
 AliTrackFixTenderSupply.cxx:169
 AliTrackFixTenderSupply.cxx:170
 AliTrackFixTenderSupply.cxx:171
 AliTrackFixTenderSupply.cxx:172
 AliTrackFixTenderSupply.cxx:173
 AliTrackFixTenderSupply.cxx:174
 AliTrackFixTenderSupply.cxx:175
 AliTrackFixTenderSupply.cxx:176
 AliTrackFixTenderSupply.cxx:177
 AliTrackFixTenderSupply.cxx:178
 AliTrackFixTenderSupply.cxx:179
 AliTrackFixTenderSupply.cxx:180
 AliTrackFixTenderSupply.cxx:181
 AliTrackFixTenderSupply.cxx:182
 AliTrackFixTenderSupply.cxx:183
 AliTrackFixTenderSupply.cxx:184
 AliTrackFixTenderSupply.cxx:185
 AliTrackFixTenderSupply.cxx:186
 AliTrackFixTenderSupply.cxx:187
 AliTrackFixTenderSupply.cxx:188
 AliTrackFixTenderSupply.cxx:189
 AliTrackFixTenderSupply.cxx:190
 AliTrackFixTenderSupply.cxx:191
 AliTrackFixTenderSupply.cxx:192
 AliTrackFixTenderSupply.cxx:193
 AliTrackFixTenderSupply.cxx:194
 AliTrackFixTenderSupply.cxx:195
 AliTrackFixTenderSupply.cxx:196
 AliTrackFixTenderSupply.cxx:197
 AliTrackFixTenderSupply.cxx:198
 AliTrackFixTenderSupply.cxx:199
 AliTrackFixTenderSupply.cxx:200
 AliTrackFixTenderSupply.cxx:201
 AliTrackFixTenderSupply.cxx:202
 AliTrackFixTenderSupply.cxx:203
 AliTrackFixTenderSupply.cxx:204
 AliTrackFixTenderSupply.cxx:205
 AliTrackFixTenderSupply.cxx:206
 AliTrackFixTenderSupply.cxx:207
 AliTrackFixTenderSupply.cxx:208
 AliTrackFixTenderSupply.cxx:209
 AliTrackFixTenderSupply.cxx:210
 AliTrackFixTenderSupply.cxx:211
 AliTrackFixTenderSupply.cxx:212
 AliTrackFixTenderSupply.cxx:213
 AliTrackFixTenderSupply.cxx:214
 AliTrackFixTenderSupply.cxx:215
 AliTrackFixTenderSupply.cxx:216
 AliTrackFixTenderSupply.cxx:217
 AliTrackFixTenderSupply.cxx:218
 AliTrackFixTenderSupply.cxx:219
 AliTrackFixTenderSupply.cxx:220
 AliTrackFixTenderSupply.cxx:221
 AliTrackFixTenderSupply.cxx:222
 AliTrackFixTenderSupply.cxx:223
 AliTrackFixTenderSupply.cxx:224
 AliTrackFixTenderSupply.cxx:225
 AliTrackFixTenderSupply.cxx:226
 AliTrackFixTenderSupply.cxx:227
 AliTrackFixTenderSupply.cxx:228
 AliTrackFixTenderSupply.cxx:229
 AliTrackFixTenderSupply.cxx:230
 AliTrackFixTenderSupply.cxx:231
 AliTrackFixTenderSupply.cxx:232
 AliTrackFixTenderSupply.cxx:233
 AliTrackFixTenderSupply.cxx:234
 AliTrackFixTenderSupply.cxx:235
 AliTrackFixTenderSupply.cxx:236
 AliTrackFixTenderSupply.cxx:237
 AliTrackFixTenderSupply.cxx:238
 AliTrackFixTenderSupply.cxx:239
 AliTrackFixTenderSupply.cxx:240
 AliTrackFixTenderSupply.cxx:241
 AliTrackFixTenderSupply.cxx:242
 AliTrackFixTenderSupply.cxx:243
 AliTrackFixTenderSupply.cxx:244
 AliTrackFixTenderSupply.cxx:245
 AliTrackFixTenderSupply.cxx:246
 AliTrackFixTenderSupply.cxx:247
 AliTrackFixTenderSupply.cxx:248
 AliTrackFixTenderSupply.cxx:249
 AliTrackFixTenderSupply.cxx:250
 AliTrackFixTenderSupply.cxx:251
 AliTrackFixTenderSupply.cxx:252
 AliTrackFixTenderSupply.cxx:253
 AliTrackFixTenderSupply.cxx:254
 AliTrackFixTenderSupply.cxx:255
 AliTrackFixTenderSupply.cxx:256
 AliTrackFixTenderSupply.cxx:257
 AliTrackFixTenderSupply.cxx:258
 AliTrackFixTenderSupply.cxx:259