ROOT logo
/**************************************************************************
 * Copyright(c) 1998-2010, 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.                  *
 **************************************************************************/

/////////////////////////////////////////////////////////////
//
// AliHFAfterBurner introduces a v2 modulation in MC for 
// the D mesons v2 analysis with event plane method
// Authors: Giacomo Ortona, ortona@to.infn.it
// 
/////////////////////////////////////////////////////////////

/* $Id$ */

#include <TDatabasePDG.h>
#include <TVector3.h>
#include <TRandom.h>
#include <TRandom3.h>
#include <AliAODEvent.h>
#include <AliAODMCParticle.h>
#include "AliAODRecoDecay.h"
#include "AliAODRecoDecayHF.h"
#include "AliHFAfterBurner.h"

ClassImp(AliHFAfterBurner)

//________________________________________________
AliHFAfterBurner::AliHFAfterBurner():
  fSigv2(0),
  fBkgv2(0),
  fUseNewton(kTRUE),
  fPrecisionNewton(0),
  fDecChannel(0),
  fSignal(0),
  fEventPlane(0.),
  fMethodEP(0)
{
  //empty constructor
}
//________________________________________________
AliHFAfterBurner::AliHFAfterBurner(Int_t decChannel):
  fSigv2(0.1),
  fBkgv2(0.2),
  fUseNewton(kTRUE),
  fPrecisionNewton(0.0005),
  fDecChannel(decChannel),
  fSignal(0),
  fEventPlane(0.),
  fMethodEP(0)
{
  //default constructor
}
//______________________________________________________________________________
AliHFAfterBurner::AliHFAfterBurner(const AliHFAfterBurner &source):
  TObject(source),
  fSigv2(source.fSigv2),
  fBkgv2(source.fBkgv2),
  fUseNewton(source.fUseNewton),
  fPrecisionNewton(source.fPrecisionNewton),
  fDecChannel(source.fDecChannel),
  fSignal(source.fSignal),
  fEventPlane(source.fEventPlane),
  fMethodEP(source.fMethodEP)
{
  //copy constructor
}
//______________________________________________________________________________
AliHFAfterBurner &AliHFAfterBurner::operator=(const AliHFAfterBurner &source)
{
  //assignment operator
  if(&source == this) return *this;

  TObject::operator=(source);
  fSigv2 = source.fSigv2;
  fBkgv2=source.fBkgv2;
  fUseNewton=source.fUseNewton;
  fPrecisionNewton=source.fPrecisionNewton;
  fDecChannel=source.fDecChannel;
  fSignal=source.fSignal;
  fEventPlane=source.fEventPlane;
  fMethodEP=source.fMethodEP;
  return *this;
}
//______________________________________________________________________________
AliHFAfterBurner::~AliHFAfterBurner(){
  // destructor
}
//______________________________________________________________________________
Double_t AliHFAfterBurner::GetNewAngle(AliAODRecoDecayHF *d,TClonesArray *mcArray){
  // modify the phi angle of teh tracks
  Int_t lab=-1;
  Int_t *pdgdaughters=0x0;
  Int_t pdgmother=0;
  Int_t nProngs=0;
  switch(fDecChannel){
  case 0:
    //D+
    nProngs=3;
    pdgmother=411;
    pdgdaughters=new Int_t[3];
    pdgdaughters[0]=211;//pi
    pdgdaughters[1]=321;//K
    pdgdaughters[2]=211;//pi
    break;
  case 1:
    //D0
    nProngs=2;
    pdgmother=421;
    pdgdaughters=new Int_t[2];
    pdgdaughters[0]=211;//pi 
    pdgdaughters[1]=321;//K
    break;
  case 2:
    //D*
    nProngs=3;
    pdgmother=413;
    pdgdaughters=new Int_t[3];
    pdgdaughters[1]=211;//pi
    pdgdaughters[0]=321;//K
    pdgdaughters[2]=211;//pi (soft?)
    break;
  }
  if(!pdgdaughters) return 0.;

  lab = d->MatchToMC(pdgmother,mcArray,nProngs,pdgdaughters);
  delete [] pdgdaughters;

  Double_t phi=-999.;
  if(lab>=0){
    fSignal=kTRUE;
    phi=GetPhi(d->Phi(),fSigv2);
  }
  else {//phi=NewtonMethodv2(phi,fBkgv2,eventplane);
    //background
    fSignal=kFALSE;
    //const Int_t nProngs=d->GetNProngs();
    Float_t phidau[nProngs];
    for(Int_t ipr=0;ipr<nProngs;ipr++){
      phidau[ipr]=(Float_t)d->PhiProng(ipr);
      //AliAODTrack *trk = (AliAODTrack*)d->GetDaughter(ipr);
      Int_t labdau=(Int_t)d->GetProngID(ipr);
      if(labdau<0)continue;
      AliAODMCParticle *mcpart= (AliAODMCParticle*)mcArray->At(labdau);
      if(!mcpart)continue;
      Int_t laborig=TMath::Abs(CheckOrigin(mcpart,mcArray));
      if(laborig>=0){//charm
	mcpart= (AliAODMCParticle*)mcArray->At(laborig);
	if(mcpart)phidau[ipr]=GetPhi(mcpart->Phi(),fSigv2);
      }else{//not charm
	phidau[ipr]=GetPhi(phidau[ipr],fBkgv2);
      }
    }
    Float_t py=0,px=0;
    for(Int_t ipr=0;ipr<nProngs;ipr++){
      py+=d->PtProng(ipr)*TMath::Sin(phidau[ipr]);
      px+=d->PtProng(ipr)*TMath::Cos(phidau[ipr]);
    }
    phi=TMath::Pi()+TMath::ATan2(-py,-px);
  }
  return GetPhi02Pi(phi);
}
//______________________________________________________________________________
Double_t AliHFAfterBurner::GetPhi(Double_t phi,Float_t v2){
  // modifies the phi angle to after-burn the given v2
  Double_t evplane = fEventPlane;
  if(fUseNewton){
    return NewtonMethodv2(phi,v2);
  }else{
    return phi-v2*TMath::Sin(2*(phi-evplane));
  }
}
//______________________________________________________________________________
Double_t AliHFAfterBurner::NewtonMethodv2(Double_t phi,Double_t v2,Double_t phi0){
  // modifies the phi angle to after-burn the given v2 using newton method
  Double_t eventplane = fEventPlane;
  Double_t phi1 = phi-(phi+v2*TMath::Sin(2.*(phi-eventplane))-phi0)/(1.+2.*v2*TMath::Cos(2.*(phi-eventplane)));
  if(TMath::Abs(phi/phi1-1.)<fPrecisionNewton){
    return phi1;
  }else {
    return NewtonMethodv2(phi1,v2,phi0);
  }
}
//______________________________________________________________________________
void AliHFAfterBurner::SetMCv2(Float_t v2sig,Float_t v2bkg){
  // SetMCv2
  if(v2sig>=0)fSigv2=v2sig;
  if(v2bkg>=0)fBkgv2=v2bkg;
}
//______________________________________________________________________________
Int_t AliHFAfterBurner::CheckOrigin(const AliAODMCParticle* mcPart,TClonesArray *arrayMC)const{
  
  //
  // checking whether the mother of the particle is a charm
  //
  Float_t charmmother=kFALSE;
  Int_t pdgGranma = 0;
  Int_t mother = -1;
  mother = mcPart->GetMother();
  Int_t istep = 0;
  while (mother >=0 ){
    istep++;
    AliAODMCParticle* mcGranma = dynamic_cast<AliAODMCParticle*>(arrayMC->At(mother));
    if(!mcGranma) break;
    pdgGranma = mcGranma->GetPdgCode();
    Int_t abspdgGranma = TMath::Abs(pdgGranma);
    if ((abspdgGranma > 400 && abspdgGranma < 500) || (abspdgGranma > 4000 && abspdgGranma < 5000)) {
      charmmother=kTRUE;
    }
    mother = mcGranma->GetMother();
  }
  if(!charmmother)mother=-1;
  return mother;
}
//________________________________________________________________________
Float_t AliHFAfterBurner::GetPhi02Pi(Float_t phi){
  // get phi angle in the range 0 - 2*pi
  Float_t result=phi;
  while(result<0){
    result=result+2.*TMath::Pi();
  }
  while(result>TMath::Pi()*2.){
    result=result-2.*TMath::Pi();
  }
  return result;
}
//________________________________________________________________________
void AliHFAfterBurner::SetDecChannel(Int_t decch){
  // set the decay channel
  if(decch>2){
    AliWarning("Invalid decay channel");
    return;
  }
  fDecChannel=decch;
}
//________________________________________________________________________
void AliHFAfterBurner::SetEventPlaneMethod(Int_t method){
  //Only Random EP supported by now, feature to generate EP from histos to be added
  fMethodEP=method;
  return;
}
//________________________________________________________________________
void AliHFAfterBurner::SetEventPlane(){
  //Only Random EP supported by now, feature to generate EP from histos to be added
  TRandom3 *g = new TRandom3(0);
  fEventPlane=g->Rndm()*TMath::Pi();
  delete g;g=0x0;
  return;
}
 AliHFAfterBurner.cxx:1
 AliHFAfterBurner.cxx:2
 AliHFAfterBurner.cxx:3
 AliHFAfterBurner.cxx:4
 AliHFAfterBurner.cxx:5
 AliHFAfterBurner.cxx:6
 AliHFAfterBurner.cxx:7
 AliHFAfterBurner.cxx:8
 AliHFAfterBurner.cxx:9
 AliHFAfterBurner.cxx:10
 AliHFAfterBurner.cxx:11
 AliHFAfterBurner.cxx:12
 AliHFAfterBurner.cxx:13
 AliHFAfterBurner.cxx:14
 AliHFAfterBurner.cxx:15
 AliHFAfterBurner.cxx:16
 AliHFAfterBurner.cxx:17
 AliHFAfterBurner.cxx:18
 AliHFAfterBurner.cxx:19
 AliHFAfterBurner.cxx:20
 AliHFAfterBurner.cxx:21
 AliHFAfterBurner.cxx:22
 AliHFAfterBurner.cxx:23
 AliHFAfterBurner.cxx:24
 AliHFAfterBurner.cxx:25
 AliHFAfterBurner.cxx:26
 AliHFAfterBurner.cxx:27
 AliHFAfterBurner.cxx:28
 AliHFAfterBurner.cxx:29
 AliHFAfterBurner.cxx:30
 AliHFAfterBurner.cxx:31
 AliHFAfterBurner.cxx:32
 AliHFAfterBurner.cxx:33
 AliHFAfterBurner.cxx:34
 AliHFAfterBurner.cxx:35
 AliHFAfterBurner.cxx:36
 AliHFAfterBurner.cxx:37
 AliHFAfterBurner.cxx:38
 AliHFAfterBurner.cxx:39
 AliHFAfterBurner.cxx:40
 AliHFAfterBurner.cxx:41
 AliHFAfterBurner.cxx:42
 AliHFAfterBurner.cxx:43
 AliHFAfterBurner.cxx:44
 AliHFAfterBurner.cxx:45
 AliHFAfterBurner.cxx:46
 AliHFAfterBurner.cxx:47
 AliHFAfterBurner.cxx:48
 AliHFAfterBurner.cxx:49
 AliHFAfterBurner.cxx:50
 AliHFAfterBurner.cxx:51
 AliHFAfterBurner.cxx:52
 AliHFAfterBurner.cxx:53
 AliHFAfterBurner.cxx:54
 AliHFAfterBurner.cxx:55
 AliHFAfterBurner.cxx:56
 AliHFAfterBurner.cxx:57
 AliHFAfterBurner.cxx:58
 AliHFAfterBurner.cxx:59
 AliHFAfterBurner.cxx:60
 AliHFAfterBurner.cxx:61
 AliHFAfterBurner.cxx:62
 AliHFAfterBurner.cxx:63
 AliHFAfterBurner.cxx:64
 AliHFAfterBurner.cxx:65
 AliHFAfterBurner.cxx:66
 AliHFAfterBurner.cxx:67
 AliHFAfterBurner.cxx:68
 AliHFAfterBurner.cxx:69
 AliHFAfterBurner.cxx:70
 AliHFAfterBurner.cxx:71
 AliHFAfterBurner.cxx:72
 AliHFAfterBurner.cxx:73
 AliHFAfterBurner.cxx:74
 AliHFAfterBurner.cxx:75
 AliHFAfterBurner.cxx:76
 AliHFAfterBurner.cxx:77
 AliHFAfterBurner.cxx:78
 AliHFAfterBurner.cxx:79
 AliHFAfterBurner.cxx:80
 AliHFAfterBurner.cxx:81
 AliHFAfterBurner.cxx:82
 AliHFAfterBurner.cxx:83
 AliHFAfterBurner.cxx:84
 AliHFAfterBurner.cxx:85
 AliHFAfterBurner.cxx:86
 AliHFAfterBurner.cxx:87
 AliHFAfterBurner.cxx:88
 AliHFAfterBurner.cxx:89
 AliHFAfterBurner.cxx:90
 AliHFAfterBurner.cxx:91
 AliHFAfterBurner.cxx:92
 AliHFAfterBurner.cxx:93
 AliHFAfterBurner.cxx:94
 AliHFAfterBurner.cxx:95
 AliHFAfterBurner.cxx:96
 AliHFAfterBurner.cxx:97
 AliHFAfterBurner.cxx:98
 AliHFAfterBurner.cxx:99
 AliHFAfterBurner.cxx:100
 AliHFAfterBurner.cxx:101
 AliHFAfterBurner.cxx:102
 AliHFAfterBurner.cxx:103
 AliHFAfterBurner.cxx:104
 AliHFAfterBurner.cxx:105
 AliHFAfterBurner.cxx:106
 AliHFAfterBurner.cxx:107
 AliHFAfterBurner.cxx:108
 AliHFAfterBurner.cxx:109
 AliHFAfterBurner.cxx:110
 AliHFAfterBurner.cxx:111
 AliHFAfterBurner.cxx:112
 AliHFAfterBurner.cxx:113
 AliHFAfterBurner.cxx:114
 AliHFAfterBurner.cxx:115
 AliHFAfterBurner.cxx:116
 AliHFAfterBurner.cxx:117
 AliHFAfterBurner.cxx:118
 AliHFAfterBurner.cxx:119
 AliHFAfterBurner.cxx:120
 AliHFAfterBurner.cxx:121
 AliHFAfterBurner.cxx:122
 AliHFAfterBurner.cxx:123
 AliHFAfterBurner.cxx:124
 AliHFAfterBurner.cxx:125
 AliHFAfterBurner.cxx:126
 AliHFAfterBurner.cxx:127
 AliHFAfterBurner.cxx:128
 AliHFAfterBurner.cxx:129
 AliHFAfterBurner.cxx:130
 AliHFAfterBurner.cxx:131
 AliHFAfterBurner.cxx:132
 AliHFAfterBurner.cxx:133
 AliHFAfterBurner.cxx:134
 AliHFAfterBurner.cxx:135
 AliHFAfterBurner.cxx:136
 AliHFAfterBurner.cxx:137
 AliHFAfterBurner.cxx:138
 AliHFAfterBurner.cxx:139
 AliHFAfterBurner.cxx:140
 AliHFAfterBurner.cxx:141
 AliHFAfterBurner.cxx:142
 AliHFAfterBurner.cxx:143
 AliHFAfterBurner.cxx:144
 AliHFAfterBurner.cxx:145
 AliHFAfterBurner.cxx:146
 AliHFAfterBurner.cxx:147
 AliHFAfterBurner.cxx:148
 AliHFAfterBurner.cxx:149
 AliHFAfterBurner.cxx:150
 AliHFAfterBurner.cxx:151
 AliHFAfterBurner.cxx:152
 AliHFAfterBurner.cxx:153
 AliHFAfterBurner.cxx:154
 AliHFAfterBurner.cxx:155
 AliHFAfterBurner.cxx:156
 AliHFAfterBurner.cxx:157
 AliHFAfterBurner.cxx:158
 AliHFAfterBurner.cxx:159
 AliHFAfterBurner.cxx:160
 AliHFAfterBurner.cxx:161
 AliHFAfterBurner.cxx:162
 AliHFAfterBurner.cxx:163
 AliHFAfterBurner.cxx:164
 AliHFAfterBurner.cxx:165
 AliHFAfterBurner.cxx:166
 AliHFAfterBurner.cxx:167
 AliHFAfterBurner.cxx:168
 AliHFAfterBurner.cxx:169
 AliHFAfterBurner.cxx:170
 AliHFAfterBurner.cxx:171
 AliHFAfterBurner.cxx:172
 AliHFAfterBurner.cxx:173
 AliHFAfterBurner.cxx:174
 AliHFAfterBurner.cxx:175
 AliHFAfterBurner.cxx:176
 AliHFAfterBurner.cxx:177
 AliHFAfterBurner.cxx:178
 AliHFAfterBurner.cxx:179
 AliHFAfterBurner.cxx:180
 AliHFAfterBurner.cxx:181
 AliHFAfterBurner.cxx:182
 AliHFAfterBurner.cxx:183
 AliHFAfterBurner.cxx:184
 AliHFAfterBurner.cxx:185
 AliHFAfterBurner.cxx:186
 AliHFAfterBurner.cxx:187
 AliHFAfterBurner.cxx:188
 AliHFAfterBurner.cxx:189
 AliHFAfterBurner.cxx:190
 AliHFAfterBurner.cxx:191
 AliHFAfterBurner.cxx:192
 AliHFAfterBurner.cxx:193
 AliHFAfterBurner.cxx:194
 AliHFAfterBurner.cxx:195
 AliHFAfterBurner.cxx:196
 AliHFAfterBurner.cxx:197
 AliHFAfterBurner.cxx:198
 AliHFAfterBurner.cxx:199
 AliHFAfterBurner.cxx:200
 AliHFAfterBurner.cxx:201
 AliHFAfterBurner.cxx:202
 AliHFAfterBurner.cxx:203
 AliHFAfterBurner.cxx:204
 AliHFAfterBurner.cxx:205
 AliHFAfterBurner.cxx:206
 AliHFAfterBurner.cxx:207
 AliHFAfterBurner.cxx:208
 AliHFAfterBurner.cxx:209
 AliHFAfterBurner.cxx:210
 AliHFAfterBurner.cxx:211
 AliHFAfterBurner.cxx:212
 AliHFAfterBurner.cxx:213
 AliHFAfterBurner.cxx:214
 AliHFAfterBurner.cxx:215
 AliHFAfterBurner.cxx:216
 AliHFAfterBurner.cxx:217
 AliHFAfterBurner.cxx:218
 AliHFAfterBurner.cxx:219
 AliHFAfterBurner.cxx:220
 AliHFAfterBurner.cxx:221
 AliHFAfterBurner.cxx:222
 AliHFAfterBurner.cxx:223
 AliHFAfterBurner.cxx:224
 AliHFAfterBurner.cxx:225
 AliHFAfterBurner.cxx:226
 AliHFAfterBurner.cxx:227
 AliHFAfterBurner.cxx:228
 AliHFAfterBurner.cxx:229
 AliHFAfterBurner.cxx:230
 AliHFAfterBurner.cxx:231
 AliHFAfterBurner.cxx:232
 AliHFAfterBurner.cxx:233
 AliHFAfterBurner.cxx:234
 AliHFAfterBurner.cxx:235
 AliHFAfterBurner.cxx:236
 AliHFAfterBurner.cxx:237
 AliHFAfterBurner.cxx:238
 AliHFAfterBurner.cxx:239
 AliHFAfterBurner.cxx:240
 AliHFAfterBurner.cxx:241
 AliHFAfterBurner.cxx:242
 AliHFAfterBurner.cxx:243
 AliHFAfterBurner.cxx:244
 AliHFAfterBurner.cxx:245
 AliHFAfterBurner.cxx:246
 AliHFAfterBurner.cxx:247
 AliHFAfterBurner.cxx:248
 AliHFAfterBurner.cxx:249
 AliHFAfterBurner.cxx:250
 AliHFAfterBurner.cxx:251
 AliHFAfterBurner.cxx:252
 AliHFAfterBurner.cxx:253
 AliHFAfterBurner.cxx:254
 AliHFAfterBurner.cxx:255
 AliHFAfterBurner.cxx:256
 AliHFAfterBurner.cxx:257
 AliHFAfterBurner.cxx:258
 AliHFAfterBurner.cxx:259