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


////////////////////////////////////////////////////////////////////////////
//                                                                        //
//  TRD tracker systematic                                                //
//
//
//  Authors:                                                              //
//    Alexandru Bercuci <A.Bercuci@gsi.de>                                //
//                                                                        //
////////////////////////////////////////////////////////////////////////////

#include "TROOT.h"
#include "TAxis.h"
#include "TH1.h"
#include "TH2.h"
#include "TH3.h"
#include "TObjArray.h"
#include "THnSparse.h"

#include "AliLog.h"

#include "AliTRDcluster.h"
#include "AliTRDseedV1.h"
#include "AliTRDtrackletOflHelper.h"
#include "AliTRDtrackV1.h"
#include "AliTRDtrackerV1.h"
#include "AliTRDtransform.h"

#include "AliTRDcheckTRK.h"

ClassImp(AliTRDcheckTRK)

UChar_t AliTRDcheckTRK::fgSteer= 0;
Float_t AliTRDcheckTRK::fgKalmanStep = 2.;
//__________________________________________________________________________
AliTRDcheckTRK::AliTRDcheckTRK()
  : AliTRDresolution()
{
// Default constructor
  SetNameTitle("TRDtrackerSys", "TRD Tracker Systematic");
}

//__________________________________________________________________________
AliTRDcheckTRK::AliTRDcheckTRK(char* name)
  : AliTRDresolution(name, kFALSE)
{
// User constructor
  SetTitle("TRD Tracker Systematic");
  MakePtCalib();
  InitFunctorList();
}

//__________________________________________________________________________
AliTRDcheckTRK::~AliTRDcheckTRK()
{
// Destructor
}


//__________________________________________________________________________
TObjArray* AliTRDcheckTRK::Histos()
{
// Build extra calibration plots
  if(!(fContainer = AliTRDresolution::Histos())) return NULL;
  //fContainer->Expand(AliTRDresolution::kNclasses+1);

  THnSparse *H(NULL);
  if(!(H = (THnSparseI*)gROOT->FindObject("hRoads"))){
    const Char_t *title[kNdim] = {"layer", "charge", fgkTitle[kPt], fgkTitle[kYrez], fgkTitle[kPrez], "#sigma^{*}/<#sigma_{y}> [a.u.]", "n_{cl}"};
    const Int_t nbins[kNdim]   = {AliTRDgeometry::kNlayer, 2, kNptBins, fgkNbins[kYrez], fgkNbins[kPrez], kNSigmaBins, kNclusters};
    const Double_t min[kNdim]  = {-0.5, -0.5, -0.5, -1., -5., 0., 8.5},
                   max[kNdim]  = {AliTRDgeometry::kNlayer-0.5, 1.5, kNptBins-0.5, 1., 5., 5., min[6]+kNclusters};
    TString st("Tracking Roads Calib;");
    // define minimum info to be saved in non debug mode
    for(Int_t idim(0); idim<kNdim; idim++){ st += title[idim]; st+=";";}
    H = new THnSparseI("hRoads", st.Data(), kNdim, nbins, min, max);
  } else H->Reset();
  fContainer->AddAt(H, fContainer->GetEntries()/*AliTRDresolution::kNclasses*/);
  return fContainer;
}

//__________________________________________________________________________
TH1* AliTRDcheckTRK::PlotTrack(const AliTRDtrackV1 *track)
{
// comment needed

  if(track) fkTrack = track;
  if(!fkTrack){
    AliDebug(4, "No Track defined.");
    return NULL;
  }
  // make a local copy of current track
  AliTRDtrackV1 lt(*fkTrack);
  if(!PropagateKalman(lt, UseITS()?fkESD->GetITSoutParam():fkESD->GetTPCoutParam())) return NULL;
  PlotCluster(&lt);
  PlotTracklet(&lt);
  PlotTrackIn(&lt);
  DoRoads(&lt);
  return NULL;
}

//________________________________________________________
void AliTRDcheckTRK::MakePtCalib(Float_t pt0, Float_t dpt)
{
// Build pt segments
  for(Int_t j(0); j<=kNptBins; j++){
    pt0+=(TMath::Exp(j*j*dpt)-1.);
    fPtBinCalib[j]=pt0;
  }
}

//__________________________________________________________________________
Int_t AliTRDcheckTRK::GetPtBinCalib(Float_t pt)
{
// Find pt bin according to local pt segmentation
  Int_t ipt(-1);
  while(ipt<kNptBins){
    if(pt<fPtBinCalib[ipt+1]) break;
    ipt++;
  }
  return ipt;
}


//__________________________________________________________________________
TH1* AliTRDcheckTRK::DoRoads(const AliTRDtrackV1 *track)
{
// comment needed
  if(track) fkTrack = track;
  if(!fkTrack){
    AliDebug(4, "No Track defined.");
    return NULL;
  }
  if(TMath::Abs(fkESD->GetTOFbc())>1){
    AliDebug(4, Form("Track with BC_index[%d] not used.", fkESD->GetTOFbc()));
    return NULL;
  }
  THnSparse *H(NULL);
  if(!fContainer || !(H = (THnSparse*)fContainer->At(3))){
    AliWarning("No output container defined.");
    return NULL;
  }
//  return NULL;
  Double_t val[kNdim];
  AliTRDseedV1 *fTracklet(NULL);
  AliTRDtrackletOflHelper helper; TObjArray cl(AliTRDseedV1::kNclusters); cl.SetOwner(kFALSE);
  for(Int_t il(0); il<AliTRDgeometry::kNlayer; il++){
    if(!(fTracklet = fkTrack->GetTracklet(il))) continue;
    if(!fTracklet->IsOK() || !fTracklet->IsChmbGood()) continue;
    Int_t ipt(GetPtBinCalib(fTracklet->GetPt()));
    if(ipt<0) continue;
    val[0] = il;
    val[1] = fkTrack->Charge()<0?0:1;
    val[2] = ipt;
    Double_t dyt(fTracklet->GetYfit(0) - fTracklet->GetYref(0)),
             dzt(fTracklet->GetZfit(0) - fTracklet->GetZref(0)),
             dydx(fTracklet->GetYfit(1)),
             tilt(fTracklet->GetTilt());
    // correct for tilt rotation
    val[3] = dyt - dzt*tilt;
    dydx+= tilt*fTracklet->GetZref(1);
    val[4] = TMath::ATan((dydx - fTracklet->GetYref(1))/(1.+ fTracklet->GetYref(1)*dydx)) * TMath::RadToDeg();
    fTracklet->ResetClusterIter(kTRUE); AliTRDcluster *c(NULL);
    while((c = fTracklet->NextCluster())) cl.AddLast(c);
    helper.Init(AliTRDtransform::Geometry().GetPadPlane(fTracklet->GetDetector()), &cl);
    Double_t r, y, s; helper.GetRMS(r, y, s, fTracklet->GetX0());
    val[5] = s/helper.GetSyMean();
    val[6] = fTracklet->GetN();
    H->Fill(val);
  }
  return NULL;
}

//___________________________________________________
Bool_t AliTRDcheckTRK::PropagateKalman(AliTRDtrackV1 &t, AliExternalTrackParam *ref)
{
// Propagate Back Kalman from the TPC input parameter to the last tracklet attached to track.
// On the propagation recalibration of clusters, tracklet refit and material budget are recalculated (on demand)
// On output the track is updated with the new info
//
// A.Bercuci@gsi.de

//  printf("PropagateKalman()\n");
  Int_t ntracklets(t.GetNumberOfTracklets());
  if(!ntracklets){
    printf("E - AliTRDcheckTRK::PropagateKalman :: No tracklets attached to track.\n");
    return kFALSE;
  }

  AliTRDseedV1 *tr(NULL);
  if(!t.GetTrackIn()){
    printf("E - AliTRDcheckTRK::PropagateKalman :: Track did not entered TRD fiducial volume.\n");
    return kFALSE;
  }
  if(!ref){
    //printf("W - AliTRDcheckTRK::PropagateKalman :: Missing starting param.\n");
    return kFALSE;
  }
  if(ref->Pt()<1.e-3) return kFALSE;
  Float_t prod(t.GetBz()*t.Charge());

  // Initialize TRD track to the reference
  AliTRDtrackV1 tt;
  tt.Set(ref->GetX(), ref->GetAlpha(), ref->GetParameter(), ref->GetCovariance());
  tt.SetMass(t.GetMass());
  tt.SetTrackOut(t.GetTrackOut());
  if(UseITS()){
    if(!tt.Rotate((Int_t(ref->GetAlpha()/AliTRDgeometry::GetAlpha()) +(ref->GetAlpha()>0.?1:-1)* 0.5)*AliTRDgeometry::GetAlpha()-ref->GetAlpha())) return kFALSE;
  }
  for(Int_t ily(0); ily<AliTRDgeometry::kNlayer; ily++){
    if(!(tr = t.GetTracklet(ily))) continue;
    Int_t det(tr->GetDetector());
    if(HasClRecalibrate()){
      AliTRDtransform trans(det);
      AliTRDcluster *c(NULL);
      Float_t exb, vd, t0, s2, dl, dt; tr->GetCalibParam(exb, vd, t0, s2, dl, dt);
      tr->ResetClusterIter(kFALSE);
      while((c = tr->PrevCluster())){
        if(!trans.Transform(c/*, GetCalib(det)*/)){
          printf("W - AliTRDcheckTRK::PropagateKalman :: Transform() failed for Det[%03d %02d_%d_%d]\n", det,
            AliTRDgeometry::GetSector(det), AliTRDgeometry::GetStack(det), AliTRDgeometry::GetLayer(det));
          break;
        }
      }
    }
    if(HasTrkltRefit()){
      //      if(!tr->FitRobust(tt.Charge()>0.)) printf("W - AliTRDcheckTRK::PropagateKalman :: FitRobust() failed for Det[%03d]\n", det);
      TGeoHMatrix *matrix = AliTRDgeometry::GetClusterMatrix(det);
      if(!tr->FitRobust(AliTRDgeometry::GetPadPlane(det), matrix, tt.GetBz(), tt.Charge())) printf("W - AliTRDcheckTRK::PropagateKalman :: FitRobust() failed for Det[%03d]\n", det);
      else tr->SetXYZ(matrix);
    }
    if(!AliTRDtrackerV1::PropagateToX(tt, tr->GetX0(), fgKalmanStep)) continue;
    if(!tt.GetTrackIn()) tt.SetTrackIn();
    tr->Update(&tt);
    if(HasKalmanUpdate()){
      Double_t x(tr->GetX0()),
               p[2] = { tr->GetYfit(0), tr->GetZfit(0)},
               covTrklt[3];
      tr->GetCovAt(x, covTrklt);
      if(!((AliExternalTrackParam&)tt).Update(p, covTrklt)) continue;
      tt.SetTracklet(tr, 0);
      tt.SetNumberOfClusters();
      tt.UpdateChi2(((AliExternalTrackParam)tt).GetPredictedChi2(p, covTrklt));
    }
  }
  //tt.Print("a");
  t.~AliTRDtrackV1();
  new(&t) AliTRDtrackV1(tt);
  return kTRUE;
}


 AliTRDcheckTRK.cxx:1
 AliTRDcheckTRK.cxx:2
 AliTRDcheckTRK.cxx:3
 AliTRDcheckTRK.cxx:4
 AliTRDcheckTRK.cxx:5
 AliTRDcheckTRK.cxx:6
 AliTRDcheckTRK.cxx:7
 AliTRDcheckTRK.cxx:8
 AliTRDcheckTRK.cxx:9
 AliTRDcheckTRK.cxx:10
 AliTRDcheckTRK.cxx:11
 AliTRDcheckTRK.cxx:12
 AliTRDcheckTRK.cxx:13
 AliTRDcheckTRK.cxx:14
 AliTRDcheckTRK.cxx:15
 AliTRDcheckTRK.cxx:16
 AliTRDcheckTRK.cxx:17
 AliTRDcheckTRK.cxx:18
 AliTRDcheckTRK.cxx:19
 AliTRDcheckTRK.cxx:20
 AliTRDcheckTRK.cxx:21
 AliTRDcheckTRK.cxx:22
 AliTRDcheckTRK.cxx:23
 AliTRDcheckTRK.cxx:24
 AliTRDcheckTRK.cxx:25
 AliTRDcheckTRK.cxx:26
 AliTRDcheckTRK.cxx:27
 AliTRDcheckTRK.cxx:28
 AliTRDcheckTRK.cxx:29
 AliTRDcheckTRK.cxx:30
 AliTRDcheckTRK.cxx:31
 AliTRDcheckTRK.cxx:32
 AliTRDcheckTRK.cxx:33
 AliTRDcheckTRK.cxx:34
 AliTRDcheckTRK.cxx:35
 AliTRDcheckTRK.cxx:36
 AliTRDcheckTRK.cxx:37
 AliTRDcheckTRK.cxx:38
 AliTRDcheckTRK.cxx:39
 AliTRDcheckTRK.cxx:40
 AliTRDcheckTRK.cxx:41
 AliTRDcheckTRK.cxx:42
 AliTRDcheckTRK.cxx:43
 AliTRDcheckTRK.cxx:44
 AliTRDcheckTRK.cxx:45
 AliTRDcheckTRK.cxx:46
 AliTRDcheckTRK.cxx:47
 AliTRDcheckTRK.cxx:48
 AliTRDcheckTRK.cxx:49
 AliTRDcheckTRK.cxx:50
 AliTRDcheckTRK.cxx:51
 AliTRDcheckTRK.cxx:52
 AliTRDcheckTRK.cxx:53
 AliTRDcheckTRK.cxx:54
 AliTRDcheckTRK.cxx:55
 AliTRDcheckTRK.cxx:56
 AliTRDcheckTRK.cxx:57
 AliTRDcheckTRK.cxx:58
 AliTRDcheckTRK.cxx:59
 AliTRDcheckTRK.cxx:60
 AliTRDcheckTRK.cxx:61
 AliTRDcheckTRK.cxx:62
 AliTRDcheckTRK.cxx:63
 AliTRDcheckTRK.cxx:64
 AliTRDcheckTRK.cxx:65
 AliTRDcheckTRK.cxx:66
 AliTRDcheckTRK.cxx:67
 AliTRDcheckTRK.cxx:68
 AliTRDcheckTRK.cxx:69
 AliTRDcheckTRK.cxx:70
 AliTRDcheckTRK.cxx:71
 AliTRDcheckTRK.cxx:72
 AliTRDcheckTRK.cxx:73
 AliTRDcheckTRK.cxx:74
 AliTRDcheckTRK.cxx:75
 AliTRDcheckTRK.cxx:76
 AliTRDcheckTRK.cxx:77
 AliTRDcheckTRK.cxx:78
 AliTRDcheckTRK.cxx:79
 AliTRDcheckTRK.cxx:80
 AliTRDcheckTRK.cxx:81
 AliTRDcheckTRK.cxx:82
 AliTRDcheckTRK.cxx:83
 AliTRDcheckTRK.cxx:84
 AliTRDcheckTRK.cxx:85
 AliTRDcheckTRK.cxx:86
 AliTRDcheckTRK.cxx:87
 AliTRDcheckTRK.cxx:88
 AliTRDcheckTRK.cxx:89
 AliTRDcheckTRK.cxx:90
 AliTRDcheckTRK.cxx:91
 AliTRDcheckTRK.cxx:92
 AliTRDcheckTRK.cxx:93
 AliTRDcheckTRK.cxx:94
 AliTRDcheckTRK.cxx:95
 AliTRDcheckTRK.cxx:96
 AliTRDcheckTRK.cxx:97
 AliTRDcheckTRK.cxx:98
 AliTRDcheckTRK.cxx:99
 AliTRDcheckTRK.cxx:100
 AliTRDcheckTRK.cxx:101
 AliTRDcheckTRK.cxx:102
 AliTRDcheckTRK.cxx:103
 AliTRDcheckTRK.cxx:104
 AliTRDcheckTRK.cxx:105
 AliTRDcheckTRK.cxx:106
 AliTRDcheckTRK.cxx:107
 AliTRDcheckTRK.cxx:108
 AliTRDcheckTRK.cxx:109
 AliTRDcheckTRK.cxx:110
 AliTRDcheckTRK.cxx:111
 AliTRDcheckTRK.cxx:112
 AliTRDcheckTRK.cxx:113
 AliTRDcheckTRK.cxx:114
 AliTRDcheckTRK.cxx:115
 AliTRDcheckTRK.cxx:116
 AliTRDcheckTRK.cxx:117
 AliTRDcheckTRK.cxx:118
 AliTRDcheckTRK.cxx:119
 AliTRDcheckTRK.cxx:120
 AliTRDcheckTRK.cxx:121
 AliTRDcheckTRK.cxx:122
 AliTRDcheckTRK.cxx:123
 AliTRDcheckTRK.cxx:124
 AliTRDcheckTRK.cxx:125
 AliTRDcheckTRK.cxx:126
 AliTRDcheckTRK.cxx:127
 AliTRDcheckTRK.cxx:128
 AliTRDcheckTRK.cxx:129
 AliTRDcheckTRK.cxx:130
 AliTRDcheckTRK.cxx:131
 AliTRDcheckTRK.cxx:132
 AliTRDcheckTRK.cxx:133
 AliTRDcheckTRK.cxx:134
 AliTRDcheckTRK.cxx:135
 AliTRDcheckTRK.cxx:136
 AliTRDcheckTRK.cxx:137
 AliTRDcheckTRK.cxx:138
 AliTRDcheckTRK.cxx:139
 AliTRDcheckTRK.cxx:140
 AliTRDcheckTRK.cxx:141
 AliTRDcheckTRK.cxx:142
 AliTRDcheckTRK.cxx:143
 AliTRDcheckTRK.cxx:144
 AliTRDcheckTRK.cxx:145
 AliTRDcheckTRK.cxx:146
 AliTRDcheckTRK.cxx:147
 AliTRDcheckTRK.cxx:148
 AliTRDcheckTRK.cxx:149
 AliTRDcheckTRK.cxx:150
 AliTRDcheckTRK.cxx:151
 AliTRDcheckTRK.cxx:152
 AliTRDcheckTRK.cxx:153
 AliTRDcheckTRK.cxx:154
 AliTRDcheckTRK.cxx:155
 AliTRDcheckTRK.cxx:156
 AliTRDcheckTRK.cxx:157
 AliTRDcheckTRK.cxx:158
 AliTRDcheckTRK.cxx:159
 AliTRDcheckTRK.cxx:160
 AliTRDcheckTRK.cxx:161
 AliTRDcheckTRK.cxx:162
 AliTRDcheckTRK.cxx:163
 AliTRDcheckTRK.cxx:164
 AliTRDcheckTRK.cxx:165
 AliTRDcheckTRK.cxx:166
 AliTRDcheckTRK.cxx:167
 AliTRDcheckTRK.cxx:168
 AliTRDcheckTRK.cxx:169
 AliTRDcheckTRK.cxx:170
 AliTRDcheckTRK.cxx:171
 AliTRDcheckTRK.cxx:172
 AliTRDcheckTRK.cxx:173
 AliTRDcheckTRK.cxx:174
 AliTRDcheckTRK.cxx:175
 AliTRDcheckTRK.cxx:176
 AliTRDcheckTRK.cxx:177
 AliTRDcheckTRK.cxx:178
 AliTRDcheckTRK.cxx:179
 AliTRDcheckTRK.cxx:180
 AliTRDcheckTRK.cxx:181
 AliTRDcheckTRK.cxx:182
 AliTRDcheckTRK.cxx:183
 AliTRDcheckTRK.cxx:184
 AliTRDcheckTRK.cxx:185
 AliTRDcheckTRK.cxx:186
 AliTRDcheckTRK.cxx:187
 AliTRDcheckTRK.cxx:188
 AliTRDcheckTRK.cxx:189
 AliTRDcheckTRK.cxx:190
 AliTRDcheckTRK.cxx:191
 AliTRDcheckTRK.cxx:192
 AliTRDcheckTRK.cxx:193
 AliTRDcheckTRK.cxx:194
 AliTRDcheckTRK.cxx:195
 AliTRDcheckTRK.cxx:196
 AliTRDcheckTRK.cxx:197
 AliTRDcheckTRK.cxx:198
 AliTRDcheckTRK.cxx:199
 AliTRDcheckTRK.cxx:200
 AliTRDcheckTRK.cxx:201
 AliTRDcheckTRK.cxx:202
 AliTRDcheckTRK.cxx:203
 AliTRDcheckTRK.cxx:204
 AliTRDcheckTRK.cxx:205
 AliTRDcheckTRK.cxx:206
 AliTRDcheckTRK.cxx:207
 AliTRDcheckTRK.cxx:208
 AliTRDcheckTRK.cxx:209
 AliTRDcheckTRK.cxx:210
 AliTRDcheckTRK.cxx:211
 AliTRDcheckTRK.cxx:212
 AliTRDcheckTRK.cxx:213
 AliTRDcheckTRK.cxx:214
 AliTRDcheckTRK.cxx:215
 AliTRDcheckTRK.cxx:216
 AliTRDcheckTRK.cxx:217
 AliTRDcheckTRK.cxx:218
 AliTRDcheckTRK.cxx:219
 AliTRDcheckTRK.cxx:220
 AliTRDcheckTRK.cxx:221
 AliTRDcheckTRK.cxx:222
 AliTRDcheckTRK.cxx:223
 AliTRDcheckTRK.cxx:224
 AliTRDcheckTRK.cxx:225
 AliTRDcheckTRK.cxx:226
 AliTRDcheckTRK.cxx:227
 AliTRDcheckTRK.cxx:228
 AliTRDcheckTRK.cxx:229
 AliTRDcheckTRK.cxx:230
 AliTRDcheckTRK.cxx:231
 AliTRDcheckTRK.cxx:232
 AliTRDcheckTRK.cxx:233
 AliTRDcheckTRK.cxx:234
 AliTRDcheckTRK.cxx:235
 AliTRDcheckTRK.cxx:236
 AliTRDcheckTRK.cxx:237
 AliTRDcheckTRK.cxx:238
 AliTRDcheckTRK.cxx:239
 AliTRDcheckTRK.cxx:240
 AliTRDcheckTRK.cxx:241
 AliTRDcheckTRK.cxx:242
 AliTRDcheckTRK.cxx:243
 AliTRDcheckTRK.cxx:244
 AliTRDcheckTRK.cxx:245
 AliTRDcheckTRK.cxx:246
 AliTRDcheckTRK.cxx:247
 AliTRDcheckTRK.cxx:248
 AliTRDcheckTRK.cxx:249
 AliTRDcheckTRK.cxx:250
 AliTRDcheckTRK.cxx:251
 AliTRDcheckTRK.cxx:252
 AliTRDcheckTRK.cxx:253
 AliTRDcheckTRK.cxx:254
 AliTRDcheckTRK.cxx:255
 AliTRDcheckTRK.cxx:256
 AliTRDcheckTRK.cxx:257
 AliTRDcheckTRK.cxx:258
 AliTRDcheckTRK.cxx:259
 AliTRDcheckTRK.cxx:260
 AliTRDcheckTRK.cxx:261
 AliTRDcheckTRK.cxx:262
 AliTRDcheckTRK.cxx:263
 AliTRDcheckTRK.cxx:264
 AliTRDcheckTRK.cxx:265
 AliTRDcheckTRK.cxx:266
 AliTRDcheckTRK.cxx:267