#include <Riostream.h>
#include "AliStack.h"
#include "AliGenEventHeader.h"
#include "AliAODMCHeader.h"
#include "AliRsnEvent.h"
#include "AliRsnCutManager.h"
#include "AliRsnDaughterDef.h"
#include "AliRsnPairDef.h"
#include "AliRsnLoopEffPair.h"
ClassImp(AliRsnLoopEffPair)
AliRsnLoopEffPair::AliRsnLoopEffPair(const char *name, AliRsnPairDef *def) :
AliRsnLoopEff(name, 1),
fDef(def),
fMother()
{
}
AliRsnLoopEffPair::AliRsnLoopEffPair(const AliRsnLoopEffPair ©) :
AliRsnLoopEff(copy),
fDef(copy.fDef),
fMother(copy.fMother)
{
}
AliRsnLoopEffPair &AliRsnLoopEffPair::operator=(const AliRsnLoopEffPair ©)
{
AliRsnLoopEff::operator=(copy);
if (this == ©)
return *this;
fDef = copy.fDef;
return (*this);
}
Bool_t AliRsnLoopEffPair::AssignMotherAndDaughters(AliRsnEvent *rsnEvent, Int_t ipart)
{
fMother.SetDaughter(0, &fDaughter[0]);
fMother.SetDaughter(1, &fDaughter[1]);
fMother.SetRefEvent(rsnEvent);
fDaughter[0].SetOwnerEvent(rsnEvent);
fDaughter[1].SetOwnerEvent(rsnEvent);
if (rsnEvent->IsESD())
return AssignMotherAndDaughtersESD(rsnEvent, ipart);
else if (rsnEvent->IsAOD())
return AssignMotherAndDaughtersAOD(rsnEvent, ipart);
else {
AliError("Unrecognized input event");
return kFALSE;
}
}
Bool_t AliRsnLoopEffPair::AssignMotherAndDaughtersESD(AliRsnEvent *rsnEvent, Int_t ipart)
{
AliMCEvent *mc = rsnEvent->GetRefMCESD();
AliStack *stack = mc->Stack();
AliMCParticle *mother = (AliMCParticle *)mc->GetTrack(ipart);
TParticle *motherP = mother->Particle();
Int_t ntracks = stack->GetNtrack();
if (TMath::Abs(motherP->GetPdgCode()) != fDef->GetMotherPDG()) return kFALSE;
if (motherP->GetNDaughters() < 2) return kFALSE;
TLorentzVector vprod;
motherP->ProductionVertex(vprod);
if (!CheckDistanceFromPV(vprod.X(), vprod.Y(), vprod.Z())) {
AliDebugClass(1, "Distant production vertex");
return kFALSE;
}
fDaughter[0].Reset();
fDaughter[1].Reset();
Int_t index[2] = {motherP->GetFirstDaughter(), motherP->GetLastDaughter()};
Int_t i, pdg;
Short_t charge;
AliMCParticle *daughter = 0x0;
for (i = 0; i < 2; i++) {
if (index[i] < 0 || index[i] > ntracks) {
AliError(Form("Index %d overflow: value = %d, max = %d", i, index[i], ntracks));
return kFALSE;
}
daughter = (AliMCParticle *)mc->GetTrack(index[i]);
pdg = TMath::Abs(daughter->Particle()->GetPdgCode());
charge = (Short_t)(daughter->Particle()->GetPDG()->Charge() / 3);
if (fDef->GetDef1().MatchesPDG(pdg) && fDef->GetDef1().MatchesChargeS(charge)) {
fDaughter[0].SetGood();
fDaughter[0].SetRefMC(daughter);
fDaughter[0].SetLabel(index[i]);
} else if (fDef->GetDef2().MatchesPDG(pdg) && fDef->GetDef2().MatchesChargeS(charge)) {
fDaughter[1].SetGood();
fDaughter[1].SetRefMC(daughter);
fDaughter[1].SetLabel(index[i]);
}
}
if (fDaughter[0].IsOK() && fDaughter[1].IsOK()) {
return kTRUE;
} else {
fDaughter[0].Reset();
fDaughter[1].Reset();
return kFALSE;
}
}
Bool_t AliRsnLoopEffPair::AssignMotherAndDaughtersAOD(AliRsnEvent *rsnEvent, Int_t ipart)
{
AliAODEvent *aod = rsnEvent->GetRefAOD();
TClonesArray *listAOD = (TClonesArray *)(aod->GetList()->FindObject(AliAODMCParticle::StdBranchName()));
AliAODMCParticle *mother = (AliAODMCParticle *)listAOD->At(ipart);
Int_t ntracks = listAOD->GetEntries();
if (TMath::Abs(mother->GetPdgCode()) != fDef->GetMotherPDG()) return kFALSE;
if (mother->GetNDaughters() < 2) return kFALSE;
Double_t vprod[3] = {(Double_t)mother->Xv(), (Double_t)mother->Yv(), (Double_t)mother->Zv()};
Double_t dv = DistanceFromPV(vprod[0], vprod[1], vprod[2]);
if (dv > fMaxDistPV) {
AliDebugClass(1, "Distant production vertex");
return kFALSE;
}
fDaughter[0].Reset();
fDaughter[1].Reset();
Int_t index[2] = {(Int_t)mother->GetDaughter(0), (Int_t)mother->GetDaughter(1)};
Int_t i, pdg;
Short_t charge;
AliAODMCParticle *daughter = 0x0;
for (i = 0; i < 2; i++) {
if (index[i] < 0 || index[i] > ntracks) {
AliError(Form("Index %d overflow: value = %d, max = %d", i, index[i], ntracks));
return kFALSE;
}
daughter = (AliAODMCParticle *)listAOD->At(index[i]);
pdg = TMath::Abs(daughter->GetPdgCode());
charge = (Short_t)(daughter->Charge() / 3);
if (fDef->GetDef1().MatchesPDG(pdg) && fDef->GetDef1().MatchesChargeS(charge)) {
fDaughter[0].SetGood();
fDaughter[0].SetRefMC(daughter);
fDaughter[0].SetLabel(index[i]);
} else if (fDef->GetDef2().MatchesPDG(pdg) && fDef->GetDef2().MatchesChargeS(charge)) {
fDaughter[1].SetGood();
fDaughter[1].SetRefMC(daughter);
fDaughter[1].SetLabel(index[i]);
}
}
if (fDaughter[0].IsOK() && fDaughter[1].IsOK()) {
return kTRUE;
} else {
fDaughter[0].Reset();
fDaughter[1].Reset();
return kFALSE;
}
}
Int_t AliRsnLoopEffPair::DoLoop(AliRsnEvent *rsn, AliRsnDaughterSelector *, AliRsnEvent *, AliRsnDaughterSelector *)
{
if (!OkEvent(rsn)) return 0;
fOutput = (AliRsnListOutput *)fOutputs[0];
if (!rsn->GetRefMC()) {
AliError("Need a MC to compute efficiency");
return 0;
}
if (!rsn->GetRef()) {
AliError("Need an event to compute efficiency");
return 0;
}
if (!rsn->IsESD() && !rsn->IsAOD()) {
AliError("Need to process ESD or AOD input");
return 0;
}
Int_t i, npart = 0;
if (rsn->IsESD()) {
TArrayF mcVertex(3);
AliGenEventHeader *genEH = rsn->GetRefMCESD()->GenEventHeader();
genEH->PrimaryVertex(mcVertex);
for (i = 0; i < 3; i++) fVertex[i] = (Double_t)mcVertex[i];
npart = rsn->GetRefMCESD()->GetNumberOfTracks();
} else {
for (i = 0; i < 3; i++) fVertex[i] = 0.0;
AliAODEvent *aod = rsn->GetRefMCAOD();
TClonesArray *listAOD = (TClonesArray *)(aod->GetList()->FindObject(AliAODMCParticle::StdBranchName()));
if (listAOD) npart = listAOD->GetEntries();
AliAODMCHeader *mcH = static_cast<AliAODMCHeader *>(aod->FindListObject(AliAODMCHeader::StdBranchName()));
if (mcH) mcH->GetVertex(fVertex);
}
if (!npart) {
AliInfo("Empty event");
return 0;
}
Int_t ipart, istep, count = 0, nsteps = fSteps.GetEntries();
Int_t ntracks = rsn->GetAbsoluteSum();
AliRsnDaughter check;
for (ipart = 0; ipart < npart; ipart++) {
if (!AssignMotherAndDaughters(rsn, ipart)) continue;
fDaughter[0].SetRef(fDaughter[0].GetRefMC());
fDaughter[1].SetRef(fDaughter[1].GetRefMC());
fMother.SetRefEvent(rsn);
fMother.ComputeSum(fDef->GetDef1().GetMass(), fDef->GetDef2().GetMass(), fDef->GetMotherMass());
fOutput->Fill(&fMother, 0);
count++;
for (istep = 0; istep < nsteps; istep++) {
AliRsnCutManager *cuts = (AliRsnCutManager *)fSteps[istep];
fDaughter[0].SetBad();
fDaughter[1].SetBad();
for (i = 0; i < ntracks; i++) {
rsn->SetDaughter(check, i);
if (!cuts->PassCommonDaughterCuts(&check)) continue;
if (TMath::Abs(check.GetLabel()) == fDaughter[0].GetLabel()) {
if (!cuts->PassDaughter1Cuts(&check)) continue;
fDaughter[0].SetRef(check.GetRef());
fDaughter[0].SetGood();
} else if (TMath::Abs(check.GetLabel()) == fDaughter[1].GetLabel()) {
if (!cuts->PassDaughter2Cuts(&check)) continue;
fDaughter[1].SetRef(check.GetRef());
fDaughter[1].SetGood();
}
if (fDaughter[0].IsOK() && fDaughter[1].IsOK()) {
fMother.ComputeSum(fDef->GetDef1().GetMass(), fDef->GetDef2().GetMass(), fDef->GetMotherMass());
if (cuts->PassMotherCuts(&fMother)) {
fOutput->Fill(&fMother, 1 + istep);
break;
}
}
}
}
}
return count;
}
AliRsnLoopEffPair.cxx:100 AliRsnLoopEffPair.cxx:101 AliRsnLoopEffPair.cxx:102 AliRsnLoopEffPair.cxx:103 AliRsnLoopEffPair.cxx:104 AliRsnLoopEffPair.cxx:105 AliRsnLoopEffPair.cxx:106 AliRsnLoopEffPair.cxx:107 AliRsnLoopEffPair.cxx:108 AliRsnLoopEffPair.cxx:109 AliRsnLoopEffPair.cxx:110 AliRsnLoopEffPair.cxx:111 AliRsnLoopEffPair.cxx:112 AliRsnLoopEffPair.cxx:113 AliRsnLoopEffPair.cxx:114 AliRsnLoopEffPair.cxx:115 AliRsnLoopEffPair.cxx:116 AliRsnLoopEffPair.cxx:117 AliRsnLoopEffPair.cxx:118 AliRsnLoopEffPair.cxx:119 AliRsnLoopEffPair.cxx:120 AliRsnLoopEffPair.cxx:121 AliRsnLoopEffPair.cxx:122 AliRsnLoopEffPair.cxx:123 AliRsnLoopEffPair.cxx:124 AliRsnLoopEffPair.cxx:125 AliRsnLoopEffPair.cxx:126 AliRsnLoopEffPair.cxx:127 AliRsnLoopEffPair.cxx:128 AliRsnLoopEffPair.cxx:129 AliRsnLoopEffPair.cxx:130 AliRsnLoopEffPair.cxx:131 AliRsnLoopEffPair.cxx:132 AliRsnLoopEffPair.cxx:133 AliRsnLoopEffPair.cxx:134 AliRsnLoopEffPair.cxx:135 AliRsnLoopEffPair.cxx:136 AliRsnLoopEffPair.cxx:137 AliRsnLoopEffPair.cxx:138 AliRsnLoopEffPair.cxx:139 AliRsnLoopEffPair.cxx:140 AliRsnLoopEffPair.cxx:141 AliRsnLoopEffPair.cxx:142 AliRsnLoopEffPair.cxx:143 AliRsnLoopEffPair.cxx:144 AliRsnLoopEffPair.cxx:145 AliRsnLoopEffPair.cxx:146 AliRsnLoopEffPair.cxx:147 AliRsnLoopEffPair.cxx:148 AliRsnLoopEffPair.cxx:149 AliRsnLoopEffPair.cxx:150 AliRsnLoopEffPair.cxx:151 AliRsnLoopEffPair.cxx:152 AliRsnLoopEffPair.cxx:153 AliRsnLoopEffPair.cxx:154 AliRsnLoopEffPair.cxx:155 AliRsnLoopEffPair.cxx:156 AliRsnLoopEffPair.cxx:157 AliRsnLoopEffPair.cxx:158 AliRsnLoopEffPair.cxx:159 AliRsnLoopEffPair.cxx:160 AliRsnLoopEffPair.cxx:161 AliRsnLoopEffPair.cxx:162 AliRsnLoopEffPair.cxx:163 AliRsnLoopEffPair.cxx:164 AliRsnLoopEffPair.cxx:165 AliRsnLoopEffPair.cxx:166 AliRsnLoopEffPair.cxx:167 AliRsnLoopEffPair.cxx:168 AliRsnLoopEffPair.cxx:169 AliRsnLoopEffPair.cxx:170 AliRsnLoopEffPair.cxx:171 AliRsnLoopEffPair.cxx:172 AliRsnLoopEffPair.cxx:173 AliRsnLoopEffPair.cxx:174 AliRsnLoopEffPair.cxx:175 AliRsnLoopEffPair.cxx:176 AliRsnLoopEffPair.cxx:177 AliRsnLoopEffPair.cxx:178 AliRsnLoopEffPair.cxx:179 AliRsnLoopEffPair.cxx:180 AliRsnLoopEffPair.cxx:181 AliRsnLoopEffPair.cxx:182 AliRsnLoopEffPair.cxx:183 AliRsnLoopEffPair.cxx:184 AliRsnLoopEffPair.cxx:185 AliRsnLoopEffPair.cxx:186 AliRsnLoopEffPair.cxx:187 AliRsnLoopEffPair.cxx:188 AliRsnLoopEffPair.cxx:189 AliRsnLoopEffPair.cxx:190 AliRsnLoopEffPair.cxx:191 AliRsnLoopEffPair.cxx:192 AliRsnLoopEffPair.cxx:193 AliRsnLoopEffPair.cxx:194 AliRsnLoopEffPair.cxx:195 AliRsnLoopEffPair.cxx:196 AliRsnLoopEffPair.cxx:197 AliRsnLoopEffPair.cxx:198 AliRsnLoopEffPair.cxx:199 AliRsnLoopEffPair.cxx:200 AliRsnLoopEffPair.cxx:201 AliRsnLoopEffPair.cxx:202 AliRsnLoopEffPair.cxx:203 AliRsnLoopEffPair.cxx:204 AliRsnLoopEffPair.cxx:205 AliRsnLoopEffPair.cxx:206 AliRsnLoopEffPair.cxx:207 AliRsnLoopEffPair.cxx:208 AliRsnLoopEffPair.cxx:209 AliRsnLoopEffPair.cxx:210 AliRsnLoopEffPair.cxx:211 AliRsnLoopEffPair.cxx:212 AliRsnLoopEffPair.cxx:213 AliRsnLoopEffPair.cxx:214 AliRsnLoopEffPair.cxx:215 AliRsnLoopEffPair.cxx:216 AliRsnLoopEffPair.cxx:217 AliRsnLoopEffPair.cxx:218 AliRsnLoopEffPair.cxx:219 AliRsnLoopEffPair.cxx:220 AliRsnLoopEffPair.cxx:221 AliRsnLoopEffPair.cxx:222 AliRsnLoopEffPair.cxx:223 AliRsnLoopEffPair.cxx:224 AliRsnLoopEffPair.cxx:225 AliRsnLoopEffPair.cxx:226 AliRsnLoopEffPair.cxx:227 AliRsnLoopEffPair.cxx:228 AliRsnLoopEffPair.cxx:229 AliRsnLoopEffPair.cxx:230 AliRsnLoopEffPair.cxx:231 AliRsnLoopEffPair.cxx:232 AliRsnLoopEffPair.cxx:233 AliRsnLoopEffPair.cxx:234 AliRsnLoopEffPair.cxx:235 AliRsnLoopEffPair.cxx:236 AliRsnLoopEffPair.cxx:237 AliRsnLoopEffPair.cxx:238 AliRsnLoopEffPair.cxx:239 AliRsnLoopEffPair.cxx:240 AliRsnLoopEffPair.cxx:241 AliRsnLoopEffPair.cxx:242 AliRsnLoopEffPair.cxx:243 AliRsnLoopEffPair.cxx:244 AliRsnLoopEffPair.cxx:245 AliRsnLoopEffPair.cxx:246 AliRsnLoopEffPair.cxx:247 AliRsnLoopEffPair.cxx:248 AliRsnLoopEffPair.cxx:249 AliRsnLoopEffPair.cxx:250 AliRsnLoopEffPair.cxx:251 AliRsnLoopEffPair.cxx:252 AliRsnLoopEffPair.cxx:253 AliRsnLoopEffPair.cxx:254 AliRsnLoopEffPair.cxx:255 AliRsnLoopEffPair.cxx:256 AliRsnLoopEffPair.cxx:257 AliRsnLoopEffPair.cxx:258 AliRsnLoopEffPair.cxx:259 AliRsnLoopEffPair.cxx:260 AliRsnLoopEffPair.cxx:261 AliRsnLoopEffPair.cxx:262 AliRsnLoopEffPair.cxx:263 AliRsnLoopEffPair.cxx:264 AliRsnLoopEffPair.cxx:265 AliRsnLoopEffPair.cxx:266 AliRsnLoopEffPair.cxx:267 AliRsnLoopEffPair.cxx:268 AliRsnLoopEffPair.cxx:269 AliRsnLoopEffPair.cxx:270 AliRsnLoopEffPair.cxx:271 AliRsnLoopEffPair.cxx:272 AliRsnLoopEffPair.cxx:273 AliRsnLoopEffPair.cxx:274 AliRsnLoopEffPair.cxx:275 AliRsnLoopEffPair.cxx:276 AliRsnLoopEffPair.cxx:277 AliRsnLoopEffPair.cxx:278 AliRsnLoopEffPair.cxx:279 AliRsnLoopEffPair.cxx:280 AliRsnLoopEffPair.cxx:281 AliRsnLoopEffPair.cxx:282 AliRsnLoopEffPair.cxx:283 AliRsnLoopEffPair.cxx:284 AliRsnLoopEffPair.cxx:285 AliRsnLoopEffPair.cxx:286 AliRsnLoopEffPair.cxx:287 AliRsnLoopEffPair.cxx:288 AliRsnLoopEffPair.cxx:289 AliRsnLoopEffPair.cxx:290 AliRsnLoopEffPair.cxx:291 AliRsnLoopEffPair.cxx:292 AliRsnLoopEffPair.cxx:293 AliRsnLoopEffPair.cxx:294 AliRsnLoopEffPair.cxx:295 AliRsnLoopEffPair.cxx:296 AliRsnLoopEffPair.cxx:297 AliRsnLoopEffPair.cxx:298 AliRsnLoopEffPair.cxx:299 AliRsnLoopEffPair.cxx:300 AliRsnLoopEffPair.cxx:301 AliRsnLoopEffPair.cxx:302 AliRsnLoopEffPair.cxx:303 AliRsnLoopEffPair.cxx:304 AliRsnLoopEffPair.cxx:305 AliRsnLoopEffPair.cxx:306 AliRsnLoopEffPair.cxx:307 AliRsnLoopEffPair.cxx:308 AliRsnLoopEffPair.cxx:309 AliRsnLoopEffPair.cxx:310 AliRsnLoopEffPair.cxx:311 AliRsnLoopEffPair.cxx:312 AliRsnLoopEffPair.cxx:313 AliRsnLoopEffPair.cxx:314 AliRsnLoopEffPair.cxx:315 AliRsnLoopEffPair.cxx:316 AliRsnLoopEffPair.cxx:317 AliRsnLoopEffPair.cxx:318 AliRsnLoopEffPair.cxx:319 AliRsnLoopEffPair.cxx:320 AliRsnLoopEffPair.cxx:321 AliRsnLoopEffPair.cxx:322 AliRsnLoopEffPair.cxx:323 AliRsnLoopEffPair.cxx:324 AliRsnLoopEffPair.cxx:325 AliRsnLoopEffPair.cxx:326 AliRsnLoopEffPair.cxx:327 AliRsnLoopEffPair.cxx:328 AliRsnLoopEffPair.cxx:329 AliRsnLoopEffPair.cxx:330 AliRsnLoopEffPair.cxx:331 AliRsnLoopEffPair.cxx:332 AliRsnLoopEffPair.cxx:333