ROOT logo
//
// This object is used as lightweight temporary container
// of all information needed from any input object and
// useful for resonance analysis.
// Lists of such objects are stored in a buffer, in order
// to allow an event mixing.
//

#include <TDatabasePDG.h>
#include <TParticlePDG.h>

#include "AliAODEvent.h"
#include "AliMCEvent.h"
#include "AliRsnEvent.h"
#include "AliRsnMiniEvent.h"
#include "AliRsnMiniParticle.h"

ClassImp(AliRsnMiniParticle)

//__________________________________________________________________________________________________
void AliRsnMiniParticle::CopyDaughter(AliRsnDaughter *daughter)
{
//
// Sets data members from the passed object
//

   // reset what could not be initialized
   fDCA = 0.0;  //typically used for D0 analysis
   fPDG = 0;
   fMother = -1;
   fMotherPDG = 0;
   fNTotSisters = -1;
   fIsFromB = kFALSE;
   fIsQuarkFound = kFALSE;
   fCutBits = 0x0;
   fPsim[0] = fPrec[0] = fPmother[0] = fPsim[1] = fPrec[1] = fPmother[1] = fPsim[2] = fPrec[2] = fPmother[2] = 0.0;

   // charge
   if (daughter->IsPos())
      fCharge = '+';
   else if (daughter->IsNeg())
      fCharge = '-';
   else
      fCharge = '0';

   // rec info
   if (daughter->GetRef()) {
      fPrec[0] = daughter->GetRef()->Px();
      fPrec[1] = daughter->GetRef()->Py();
      fPrec[2] = daughter->GetRef()->Pz();
   }

   // MC info
   if (daughter->GetRefMC()) {
      fPsim[0] = daughter->GetRefMC()->Px();
      fPsim[1] = daughter->GetRefMC()->Py();
      fPsim[2] = daughter->GetRefMC()->Pz();
      fPDG = daughter->GetPDG();
      fMother = daughter->GetMother();
      fMotherPDG = daughter->GetMotherPDG();
   }
   
   AliRsnEvent *event = (AliRsnEvent *) daughter->GetOwnerEvent();
   if (!event) {
     AliWarning("Invalid reference event: cannot copy DCA nor Nsisters.");
     return;
   }
   if (event->IsAOD()){
     // DCA to Primary Vertex for AOD
     AliAODTrack *track = (AliAODTrack*) daughter->Ref2AODtrack();   
     AliAODEvent *aodEvent = (AliAODEvent*) event->GetRefAOD();
     if (track && aodEvent) {
       AliVVertex *vertex = (AliVVertex*) aodEvent->GetPrimaryVertex();
       Double_t b[2], cov[3]; 
       if (vertex) {
	 if ( !((track->GetStatus() & AliESDtrack::kTPCin) == 0) && !((track->GetStatus() & AliESDtrack::kTPCrefit) == 0) && !((track->GetStatus() & AliESDtrack::kITSrefit) == 0) ){
	   if (track->PropagateToDCA(vertex, aodEvent->GetMagneticField(), kVeryBig, b, cov))
	     fDCA = b[0];
	 }
       }
     }
     // Number of Daughters from MC and Momentum of the Mother
     if (event->GetRefMC()) {
       TClonesArray * list = event->GetAODList();
       AliAODMCParticle *part = (AliAODMCParticle *)list->At(fMother);
       if (part) {
	 fNTotSisters = part->GetNDaughters();
	 fPmother[0]  = part->Px();
	 fPmother[1]  = part->Py();
	 fPmother[2]  = part->Pz();
	 Int_t istep = 0;
	 Int_t pdgGranma = 0;
	 Int_t abspdgGranma =0;
	 Int_t mother_temp = daughter->GetMother();
	 while (mother_temp >=0 ){
	       istep++;
	       AliDebug(2,Form("mother at step %d = %d", istep, mother_temp));
	       AliAODMCParticle* mcGranma = dynamic_cast<AliAODMCParticle*>(list->At(mother_temp));
	       if (mcGranma){
	               pdgGranma = mcGranma->GetPdgCode();
	               AliDebug(2,Form("Pdg mother at step %d = %d", istep, pdgGranma));
	               abspdgGranma = TMath::Abs(pdgGranma);
	               if ((abspdgGranma > 500 && abspdgGranma < 600) || (abspdgGranma > 5000 && abspdgGranma < 6000)){
	        	 fIsFromB=kTRUE;
	               }
	               if(abspdgGranma==4 || abspdgGranma==5) fIsQuarkFound=kTRUE;
	               mother_temp = mcGranma->GetMother();
	       }else{
	               AliError("Failed casting the mother particle!");
	               break;
	       }
	 }
       }
     }
   } else {
     if (event->IsESD()){
       //DCA to Primary Vertex for ESD
       AliESDtrack *track = (AliESDtrack*) daughter->Ref2ESDtrack();   
       AliESDEvent *esdEvent = (AliESDEvent*) event->GetRefESD();
       if (track && esdEvent) {
	 AliVVertex *vertex = (AliVVertex*) esdEvent->GetPrimaryVertex();
	 Double_t b[2], cov[3]; 
	 if (vertex) {
	   if ( !((track->GetStatus() & AliESDtrack::kTPCin) == 0) && !((track->GetStatus() & AliESDtrack::kTPCrefit) == 0) && !((track->GetStatus() & AliESDtrack::kITSrefit) == 0) ){
	     if (track->PropagateToDCA(vertex, esdEvent->GetMagneticField(), kVeryBig, b, cov))
	       fDCA = b[0];
	   }
	 }
       }
       // Number of Daughters from MC and Momentum of the Mother
       if (event->GetRefMC()) {
	 AliMCParticle *part = (AliMCParticle *)event->GetRefMC()->GetTrack(fMother);
	 AliMCEvent * MCEvent = event->GetRefMCESD();
	 if(part){
	   fNTotSisters = part->Particle()->GetNDaughters();
	   fPmother[0]  = part->Px();
	   fPmother[1]  = part->Py();
	   fPmother[2]  = part->Pz();
	   Int_t istep = 0;
	   Int_t pdgGranma = 0;
	   Int_t abspdgGranma =0;
	   Int_t mother_temp = daughter->GetMother();
	   while (mother_temp >=0 ){
		 istep++;
		 AliDebug(2,Form("mother at step %d = %d", istep, mother_temp));
		 AliMCParticle* mcGranma = dynamic_cast<AliMCParticle*>(MCEvent->GetTrack(mother_temp));
		 if (mcGranma){
		 	 pdgGranma = mcGranma->PdgCode();
		 	 AliDebug(2,Form("Pdg mother at step %d = %d", istep, pdgGranma));
		 	 abspdgGranma = TMath::Abs(pdgGranma);
		 	 if ((abspdgGranma > 500 && abspdgGranma < 600) || (abspdgGranma > 5000 && abspdgGranma < 6000)){
		 	   fIsFromB=kTRUE;
		 	 }
		 	 if(abspdgGranma==4 || abspdgGranma==5) fIsQuarkFound=kTRUE;
		 	 mother_temp = mcGranma->GetMother();
		 }else{
		 	 AliError("Failed casting the mother particle!");
		 	 break;
		 }
	   }
	 }
       }
     }
   }
}

//__________________________________________________________________________________________________
Double_t AliRsnMiniParticle::Mass()
{
   //
   // return mass of particle
   //

   TDatabasePDG *db   = TDatabasePDG::Instance();
   TParticlePDG *part = db->GetParticle(PDG());
   return part->Mass();
}

//__________________________________________________________________________________________________
void AliRsnMiniParticle::Set4Vector(TLorentzVector &v, Float_t mass, Bool_t mc)
{
   //
   // return 4 vector of particle
   //

   if (mass<0.0) mass = Mass();
   v.SetXYZM(Px(mc), Py(mc), Pz(mc),mass);
}
 AliRsnMiniParticle.cxx:1
 AliRsnMiniParticle.cxx:2
 AliRsnMiniParticle.cxx:3
 AliRsnMiniParticle.cxx:4
 AliRsnMiniParticle.cxx:5
 AliRsnMiniParticle.cxx:6
 AliRsnMiniParticle.cxx:7
 AliRsnMiniParticle.cxx:8
 AliRsnMiniParticle.cxx:9
 AliRsnMiniParticle.cxx:10
 AliRsnMiniParticle.cxx:11
 AliRsnMiniParticle.cxx:12
 AliRsnMiniParticle.cxx:13
 AliRsnMiniParticle.cxx:14
 AliRsnMiniParticle.cxx:15
 AliRsnMiniParticle.cxx:16
 AliRsnMiniParticle.cxx:17
 AliRsnMiniParticle.cxx:18
 AliRsnMiniParticle.cxx:19
 AliRsnMiniParticle.cxx:20
 AliRsnMiniParticle.cxx:21
 AliRsnMiniParticle.cxx:22
 AliRsnMiniParticle.cxx:23
 AliRsnMiniParticle.cxx:24
 AliRsnMiniParticle.cxx:25
 AliRsnMiniParticle.cxx:26
 AliRsnMiniParticle.cxx:27
 AliRsnMiniParticle.cxx:28
 AliRsnMiniParticle.cxx:29
 AliRsnMiniParticle.cxx:30
 AliRsnMiniParticle.cxx:31
 AliRsnMiniParticle.cxx:32
 AliRsnMiniParticle.cxx:33
 AliRsnMiniParticle.cxx:34
 AliRsnMiniParticle.cxx:35
 AliRsnMiniParticle.cxx:36
 AliRsnMiniParticle.cxx:37
 AliRsnMiniParticle.cxx:38
 AliRsnMiniParticle.cxx:39
 AliRsnMiniParticle.cxx:40
 AliRsnMiniParticle.cxx:41
 AliRsnMiniParticle.cxx:42
 AliRsnMiniParticle.cxx:43
 AliRsnMiniParticle.cxx:44
 AliRsnMiniParticle.cxx:45
 AliRsnMiniParticle.cxx:46
 AliRsnMiniParticle.cxx:47
 AliRsnMiniParticle.cxx:48
 AliRsnMiniParticle.cxx:49
 AliRsnMiniParticle.cxx:50
 AliRsnMiniParticle.cxx:51
 AliRsnMiniParticle.cxx:52
 AliRsnMiniParticle.cxx:53
 AliRsnMiniParticle.cxx:54
 AliRsnMiniParticle.cxx:55
 AliRsnMiniParticle.cxx:56
 AliRsnMiniParticle.cxx:57
 AliRsnMiniParticle.cxx:58
 AliRsnMiniParticle.cxx:59
 AliRsnMiniParticle.cxx:60
 AliRsnMiniParticle.cxx:61
 AliRsnMiniParticle.cxx:62
 AliRsnMiniParticle.cxx:63
 AliRsnMiniParticle.cxx:64
 AliRsnMiniParticle.cxx:65
 AliRsnMiniParticle.cxx:66
 AliRsnMiniParticle.cxx:67
 AliRsnMiniParticle.cxx:68
 AliRsnMiniParticle.cxx:69
 AliRsnMiniParticle.cxx:70
 AliRsnMiniParticle.cxx:71
 AliRsnMiniParticle.cxx:72
 AliRsnMiniParticle.cxx:73
 AliRsnMiniParticle.cxx:74
 AliRsnMiniParticle.cxx:75
 AliRsnMiniParticle.cxx:76
 AliRsnMiniParticle.cxx:77
 AliRsnMiniParticle.cxx:78
 AliRsnMiniParticle.cxx:79
 AliRsnMiniParticle.cxx:80
 AliRsnMiniParticle.cxx:81
 AliRsnMiniParticle.cxx:82
 AliRsnMiniParticle.cxx:83
 AliRsnMiniParticle.cxx:84
 AliRsnMiniParticle.cxx:85
 AliRsnMiniParticle.cxx:86
 AliRsnMiniParticle.cxx:87
 AliRsnMiniParticle.cxx:88
 AliRsnMiniParticle.cxx:89
 AliRsnMiniParticle.cxx:90
 AliRsnMiniParticle.cxx:91
 AliRsnMiniParticle.cxx:92
 AliRsnMiniParticle.cxx:93
 AliRsnMiniParticle.cxx:94
 AliRsnMiniParticle.cxx:95
 AliRsnMiniParticle.cxx:96
 AliRsnMiniParticle.cxx:97
 AliRsnMiniParticle.cxx:98
 AliRsnMiniParticle.cxx:99
 AliRsnMiniParticle.cxx:100
 AliRsnMiniParticle.cxx:101
 AliRsnMiniParticle.cxx:102
 AliRsnMiniParticle.cxx:103
 AliRsnMiniParticle.cxx:104
 AliRsnMiniParticle.cxx:105
 AliRsnMiniParticle.cxx:106
 AliRsnMiniParticle.cxx:107
 AliRsnMiniParticle.cxx:108
 AliRsnMiniParticle.cxx:109
 AliRsnMiniParticle.cxx:110
 AliRsnMiniParticle.cxx:111
 AliRsnMiniParticle.cxx:112
 AliRsnMiniParticle.cxx:113
 AliRsnMiniParticle.cxx:114
 AliRsnMiniParticle.cxx:115
 AliRsnMiniParticle.cxx:116
 AliRsnMiniParticle.cxx:117
 AliRsnMiniParticle.cxx:118
 AliRsnMiniParticle.cxx:119
 AliRsnMiniParticle.cxx:120
 AliRsnMiniParticle.cxx:121
 AliRsnMiniParticle.cxx:122
 AliRsnMiniParticle.cxx:123
 AliRsnMiniParticle.cxx:124
 AliRsnMiniParticle.cxx:125
 AliRsnMiniParticle.cxx:126
 AliRsnMiniParticle.cxx:127
 AliRsnMiniParticle.cxx:128
 AliRsnMiniParticle.cxx:129
 AliRsnMiniParticle.cxx:130
 AliRsnMiniParticle.cxx:131
 AliRsnMiniParticle.cxx:132
 AliRsnMiniParticle.cxx:133
 AliRsnMiniParticle.cxx:134
 AliRsnMiniParticle.cxx:135
 AliRsnMiniParticle.cxx:136
 AliRsnMiniParticle.cxx:137
 AliRsnMiniParticle.cxx:138
 AliRsnMiniParticle.cxx:139
 AliRsnMiniParticle.cxx:140
 AliRsnMiniParticle.cxx:141
 AliRsnMiniParticle.cxx:142
 AliRsnMiniParticle.cxx:143
 AliRsnMiniParticle.cxx:144
 AliRsnMiniParticle.cxx:145
 AliRsnMiniParticle.cxx:146
 AliRsnMiniParticle.cxx:147
 AliRsnMiniParticle.cxx:148
 AliRsnMiniParticle.cxx:149
 AliRsnMiniParticle.cxx:150
 AliRsnMiniParticle.cxx:151
 AliRsnMiniParticle.cxx:152
 AliRsnMiniParticle.cxx:153
 AliRsnMiniParticle.cxx:154
 AliRsnMiniParticle.cxx:155
 AliRsnMiniParticle.cxx:156
 AliRsnMiniParticle.cxx:157
 AliRsnMiniParticle.cxx:158
 AliRsnMiniParticle.cxx:159
 AliRsnMiniParticle.cxx:160
 AliRsnMiniParticle.cxx:161
 AliRsnMiniParticle.cxx:162
 AliRsnMiniParticle.cxx:163
 AliRsnMiniParticle.cxx:164
 AliRsnMiniParticle.cxx:165
 AliRsnMiniParticle.cxx:166
 AliRsnMiniParticle.cxx:167
 AliRsnMiniParticle.cxx:168
 AliRsnMiniParticle.cxx:169
 AliRsnMiniParticle.cxx:170
 AliRsnMiniParticle.cxx:171
 AliRsnMiniParticle.cxx:172
 AliRsnMiniParticle.cxx:173
 AliRsnMiniParticle.cxx:174
 AliRsnMiniParticle.cxx:175
 AliRsnMiniParticle.cxx:176
 AliRsnMiniParticle.cxx:177
 AliRsnMiniParticle.cxx:178
 AliRsnMiniParticle.cxx:179
 AliRsnMiniParticle.cxx:180
 AliRsnMiniParticle.cxx:181
 AliRsnMiniParticle.cxx:182
 AliRsnMiniParticle.cxx:183
 AliRsnMiniParticle.cxx:184
 AliRsnMiniParticle.cxx:185
 AliRsnMiniParticle.cxx:186
 AliRsnMiniParticle.cxx:187
 AliRsnMiniParticle.cxx:188