ROOT logo
#include "AliVEvent.h"
#include "AliESDEvent.h"
#include "AliAODEvent.h"
#include "AliVVertex.h"
#include "AliLog.h"
#include "AliAODVertex.h"
#include "AliVTrack.h"
#include "AliVEvent.h"
#include <TMatrixDSym.h>
#include <TMath.h>
#include "AliVMultiplicity.h"
#include "AliPPVsMultUtils.h"

#include "AliAnalysisUtils.h"

ClassImp(AliAnalysisUtils)

//______________________________________________________________________
AliAnalysisUtils::AliAnalysisUtils():TObject(),
  fisAOD(kTRUE),
  fMinVtxContr(0),
  fMaxVtxZ(10.),
  fCutOnZVertexSPD(kTRUE),
  fUseMVPlpSelection(kFALSE),
  fUseOutOfBunchPileUp(kFALSE),
  fMinPlpContribMV(5),
  fMaxPlpChi2MV(5.),
  fMinWDistMV(15.),
  fCheckPlpFromDifferentBCMV(kFALSE),
  fMinPlpContribSPD(5),
  fMinPlpZdistSPD(0.8),
  fnSigmaPlpZdistSPD(3.),
  fnSigmaPlpDiamXYSPD(2.),
  fnSigmaPlpDiamZSPD(5.),
  fUseSPDCutInMultBins(kFALSE),
  fASPDCvsTCut(65.),
  fBSPDCvsTCut(4.),
  fPPVsMultUtils(0x0)
{
  // Default contructor
}

//______________________________________________________________________
Bool_t AliAnalysisUtils::IsVertexSelected2013pA(AliVEvent *event)
{
  Bool_t accept = kFALSE;
  
  // Check whether the event is of AOD or ESD type
  AliAODEvent *aod = 0x0;
  AliESDEvent *esd = 0x0;
  aod = dynamic_cast<AliAODEvent*>(event);
  esd = dynamic_cast<AliESDEvent*>(event);

  if(aod) { 
    fisAOD = kTRUE; 
  } else {
    fisAOD = kFALSE;
    if(!esd) {
      AliFatal("Event is neither of AOD nor ESD type");
      return accept;
    }
  }

  const AliVVertex *trkVtx = fisAOD ? 
    dynamic_cast<const AliVVertex*>(aod->GetPrimaryVertex()) : 
    dynamic_cast<const AliVVertex*>(esd->GetPrimaryVertex()) ;
  if(!trkVtx || trkVtx->GetNContributors()<=fMinVtxContr){
    accept = kFALSE;
    return accept;
  }

  TString vtxTtl = trkVtx->GetTitle();
  if (!vtxTtl.Contains("VertexerTracks")) return accept;

  Float_t zvtx = trkVtx->GetZ();
  const AliVVertex* spdVtx = fisAOD ? 
    dynamic_cast<const AliVVertex*>(aod->GetPrimaryVertexSPD()) : 
    dynamic_cast<const AliVVertex*>(esd->GetPrimaryVertexSPD()) ;
  if (spdVtx->GetNContributors()<=fMinVtxContr) return accept;

  TString vtxTyp = spdVtx->GetTitle();
  Double_t cov[6]={0};
  spdVtx->GetCovarianceMatrix(cov);
  Double_t zRes = TMath::Sqrt(cov[5]);
  if (vtxTyp.Contains("vertexer:Z") && (zRes>0.25)) return accept;
  if (fCutOnZVertexSPD && TMath::Abs(spdVtx->GetZ() - trkVtx->GetZ())>0.5) return accept;

  if (TMath::Abs(zvtx) > fMaxVtxZ) return accept;

  return kTRUE;
}

//______________________________________________________________________
Bool_t AliAnalysisUtils::IsFirstEventInChunk(AliVEvent *event)
{

  Bool_t accept = kFALSE;

  // Check whether the event is of AOD or ESD type
  AliAODEvent *aod = 0x0;
  AliESDEvent *esd = 0x0;
  aod = dynamic_cast<AliAODEvent*>(event);
  esd = dynamic_cast<AliESDEvent*>(event);

  if(aod) { 
    fisAOD = kTRUE; 
  } else {
    fisAOD = kFALSE;
    if(!esd) {
      AliFatal("Event is neither of AOD nor ESD type");
      return accept;
    }
  }

  if(fisAOD){
    AliAODHeader *aodheader = 0x0;
    aodheader = dynamic_cast<AliAODHeader*>(aod->GetHeader());
    if(!aodheader) AliFatal("Not a standard AOD");
    if(!aodheader){
      AliFatal("AOD header not there ?!");
      return kFALSE;
    }
    if(aodheader->GetEventNumberESDFile()==0) accept = kTRUE;
  } else {
    if(esd->GetEventNumberInFile()==0) accept = kTRUE;
  }
  
  return accept;
}

//______________________________________________________________________
Bool_t AliAnalysisUtils::IsPileUpEvent(AliVEvent *event)
{
  Bool_t isPileUp=kFALSE;
  //check for multiple vertices
  if(fUseMVPlpSelection)isPileUp=IsPileUpMV(event);
  else isPileUp=IsPileUpSPD(event);
  //check for different BC 
  if(fUseOutOfBunchPileUp && IsOutOfBunchPileUp(event))isPileUp=kTRUE;
  
  return isPileUp;
}

//______________________________________________________________________
Bool_t AliAnalysisUtils::IsPileUpMV(AliVEvent *event)
{
  // check for multi-vertexer pile-up
  const AliAODEvent *aod = dynamic_cast<const AliAODEvent*>(event);
  const AliESDEvent *esd = dynamic_cast<const AliESDEvent*>(event);
  //
  if (!aod && !esd) {
    AliFatal("Event is neither of AOD nor ESD type");
    return kFALSE;
  }
  //
  const AliVVertex* vtPrm = 0;
  const AliVVertex* vtPlp = 0;
  Int_t nPlp = 0;
  //
  if (aod) {
    if ( !(nPlp=aod->GetNumberOfPileupVerticesTracks()) ) return kFALSE;
    vtPrm = aod->GetPrimaryVertex();
    if (vtPrm == aod->GetPrimaryVertexSPD()) return kTRUE; // there are pile-up vertices but no primary
  }
  else {
    if ( !(nPlp=esd->GetNumberOfPileupVerticesTracks())) return kFALSE;
    vtPrm = esd->GetPrimaryVertexTracks();
    if (((AliESDVertex*)vtPrm)->GetStatus()!=1) return kTRUE; // there are pile-up vertices but no primary
  }
  Int_t bcPrim = vtPrm->GetBC();
  //
  for (Int_t ipl=0;ipl<nPlp;ipl++) {
    vtPlp = aod ? (const AliVVertex*)aod->GetPileupVertexTracks(ipl) : (const AliVVertex*)esd->GetPileupVertexTracks(ipl);
    //
    if (vtPlp->GetNContributors() < fMinPlpContribMV) continue;
    if (vtPlp->GetChi2perNDF() > fMaxPlpChi2MV) continue;
    if(fCheckPlpFromDifferentBCMV)
      {
	Int_t bcPlp = vtPlp->GetBC();
	if (bcPlp!=AliVTrack::kTOFBCNA && TMath::Abs(bcPlp-bcPrim)>2) return kTRUE; // pile-up from other BC
      }
    //
    Double_t wDst = GetWDist(vtPrm,vtPlp);
    if (wDst<fMinWDistMV) continue;
    //
    return kTRUE; // pile-up: well separated vertices
  }
  //
  return kFALSE;
  //
}

//______________________________________________________________________
Bool_t AliAnalysisUtils::IsPileUpSPD(AliVEvent *event)
{
  // check for SPD pile-up
  const AliAODEvent *aod = dynamic_cast<const AliAODEvent*>(event);
  const AliESDEvent *esd = dynamic_cast<const AliESDEvent*>(event);
  //
  if (!aod && !esd) {
    AliFatal("Event is neither of AOD nor ESD type");
    return kFALSE;
  }
  //
  if (aod) return (fUseSPDCutInMultBins)?aod->IsPileupFromSPDInMultBins():aod->IsPileupFromSPD(fMinPlpContribSPD,fMinPlpZdistSPD,fnSigmaPlpZdistSPD,fnSigmaPlpDiamXYSPD,fnSigmaPlpDiamZSPD);
  else return (fUseSPDCutInMultBins)?esd->IsPileupFromSPDInMultBins():esd->IsPileupFromSPD(fMinPlpContribSPD,fMinPlpZdistSPD,fnSigmaPlpZdistSPD,fnSigmaPlpDiamXYSPD,fnSigmaPlpDiamZSPD);
}

//______________________________________________________________________
Bool_t AliAnalysisUtils::IsOutOfBunchPileUp(AliVEvent *event)
{
  // check for SPD pile-up
  const AliAODEvent *aod = dynamic_cast<const AliAODEvent*>(event);
  const AliESDEvent *esd = dynamic_cast<const AliESDEvent*>(event);
  //
  if (!aod && !esd) {
    AliFatal("Event is neither of AOD nor ESD type");
    return kFALSE;
  }
  Int_t bc2 = (aod)?((AliVAODHeader*)aod->GetHeader())->GetIRInt2ClosestInteractionMap():esd->GetHeader()->GetIRInt2ClosestInteractionMap();
  if (bc2 != 0)
    return kTRUE;
  
  Int_t bc1 = (aod)?((AliVAODHeader*)aod->GetHeader())->GetIRInt1ClosestInteractionMap():esd->GetHeader()->GetIRInt1ClosestInteractionMap();
  if (bc1 != 0)
    return kTRUE;
  
  return kFALSE;
}


//______________________________________________________________________
Bool_t AliAnalysisUtils::IsSPDClusterVsTrackletBG(AliVEvent *event){
  Int_t nClustersLayer0 = event->GetNumberOfITSClusters(0);
  Int_t nClustersLayer1 = event->GetNumberOfITSClusters(1);
  Int_t nTracklets      = event->GetMultiplicity()->GetNumberOfTracklets();
  if (nClustersLayer0 + nClustersLayer1 > fASPDCvsTCut + nTracklets*fBSPDCvsTCut) return kTRUE;
  return kFALSE;
}


//______________________________________________________________________
Double_t AliAnalysisUtils::GetWDist(const AliVVertex* v0, const AliVVertex* v1)
{
  // calculate sqrt of weighted distance to other vertex
  if (!v0 || !v1) {
    printf("One of vertices is not valid\n");
    return 0;
  }
  static TMatrixDSym vVb(3);
  Double_t dist = -1;
  Double_t dx = v0->GetX()-v1->GetX();
  Double_t dy = v0->GetY()-v1->GetY();
  Double_t dz = v0->GetZ()-v1->GetZ();
  Double_t cov0[6],cov1[6];
  v0->GetCovarianceMatrix(cov0);
  v1->GetCovarianceMatrix(cov1);
  vVb(0,0) = cov0[0]+cov1[0];
  vVb(1,1) = cov0[2]+cov1[2];
  vVb(2,2) = cov0[5]+cov1[5];
  vVb(1,0) = vVb(0,1) = cov0[1]+cov1[1];
  vVb(0,2) = vVb(1,2) = vVb(2,0) = vVb(2,1) = 0.;
  vVb.InvertFast();
  if (!vVb.IsValid()) {printf("Singular Matrix\n"); return dist;}
  dist = vVb(0,0)*dx*dx + vVb(1,1)*dy*dy + vVb(2,2)*dz*dz
    +    2*vVb(0,1)*dx*dy + 2*vVb(0,2)*dx*dz + 2*vVb(1,2)*dy*dz;
  return dist>0 ? TMath::Sqrt(dist) : -1; 

}

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