if (fRecoCandidate->GetPrimaryVtx()) AliDebug(4,"fReco Candidate has a pointer to PrimVtx\n");
- AliAODRecoCascadeHF* lcV0bachelor = (AliAODRecoCascadeHF*)fRecoCandidate;
- if ( !(lcV0bachelor->Getv0()) ) {
- AliDebug(1,"It is not a Lc->V0+bachelor candidate");
+ AliAODRecoCascadeHF* lcV0bachelor = dynamic_cast<AliAODRecoCascadeHF*>(fRecoCandidate);
+ if (!lcV0bachelor) {
+ AliDebug(2,"cascade doesn't exist, skipped!");
+ return bSignAssoc;
+ }
+
+ if (!lcV0bachelor->GetSecondaryVtx()) {
+ AliDebug(2,"No secondary vertex for cascade");
+ return bSignAssoc;
+ }
+
+ if (lcV0bachelor->GetNDaughters()!=2) {
+ AliDebug(2,Form("No 2 daughters for current cascade (nDaughters=%d)",lcV0bachelor->GetNDaughters()));
+ return bSignAssoc;
+ }
+
+ AliVTrack *cascTrk0 = dynamic_cast<AliVTrack*>(lcV0bachelor->GetDaughter(0));
+ AliVTrack *cascTrk1 = dynamic_cast<AliVTrack*>(lcV0bachelor->GetDaughter(1));
+ if (!cascTrk0 || !cascTrk1) {
+ AliDebug(2,"At least one of V0daughters doesn't exist");
+ return bSignAssoc;
+ }
+
+ AliAODv0 * v0part = dynamic_cast<AliAODv0*>(lcV0bachelor->Getv0());
+ AliAODTrack * bachPart = dynamic_cast<AliAODTrack*>(lcV0bachelor->GetBachelor());
+ if (!v0part || !bachPart) {
+ AliDebug(2,"No V0 or no bachelor for current cascade");
+ return bSignAssoc;
+ }
+
+ if (bachPart->GetID()<0) {
+ AliDebug(2,Form("Bachelor has negative ID %d",bachPart->GetID()));
+ return bSignAssoc;
+ }
+
+ if (!v0part->GetSecondaryVtx()) {
+ AliDebug(2,"No secondary vertex for V0 by cascade");
+ return bSignAssoc;
+ }
+
+ if (v0part->GetNDaughters()!=2) {
+ AliDebug(2,Form("No 2 daughters for V0 of current cascade (onTheFly=%d, nDaughters=%d)",v0part->GetOnFlyStatus(),v0part->GetNDaughters()));
+ return bSignAssoc;
+ }
+
+ AliVTrack *trk0 = dynamic_cast<AliVTrack*>(v0part->GetDaughter(0));
+ AliVTrack *trk1 = dynamic_cast<AliVTrack*>(v0part->GetDaughter(1));
+ if (!trk0 || !trk1) {
+ AliDebug(2,"At least one of V0daughters doesn't exist");
+ return bSignAssoc;
+ }
+
+ //if (trk0->GetLabel()<0 || trk1->GetLabel()<0) {
+ //AliDebug(2,Form("At least one of V0daughters has label negative (%d %d)",trk0->GetLabel(),trk1->GetLabel()));
+ //return bSignAssoc;
+ //}
+
+ if (trk0->GetID()<0 || trk1->GetID()<0) {
+ AliDebug(2,Form("At least one of V0 daughters has negative ID %d %d",trk0->GetID(),trk1->GetID()));
return bSignAssoc;
}
if (mcLabelK0S!=-1 && mcLabelLambda!=-1)
AliDebug(2,"Strange: current Lc->V0+bachelor candidate has two MC different labels!");
- if (fGenLcOption==kCountAllLctoV0) {
- if (mcLabelK0S!=-1) mcLabel=mcLabelK0S;
- if (mcLabelLambda!=-1) mcLabel=mcLabelLambda;
- }
- else if (fGenLcOption==kCountK0Sp) {
+ if (fGenLcOption==kCountK0Sp) {
if (mcLabelK0S!=-1) mcLabel=mcLabelK0S;
if (mcLabelLambda!=-1) {
mcLabel=-1;
AliDebug(4,"No mcLabel found for current candidate");
return bSignAssoc;
}
- AliDebug(1,Form("Found mcLabel (%d) for current candidate",mcLabel));
+ AliDebug(1,Form("Found mcLabel (%d) for current candidate (onTheFly=%1d)",mcLabel,v0part->GetOnFlyStatus()));
if (fRecoCandidate->NumberOfFakeDaughters()>0){
fFake = 0; // fake candidate
Int_t daughter0lc = fmcPartCandidate->GetDaughter(0);
Int_t daughter1lc = fmcPartCandidate->GetDaughter(1);
- if (daughter0lc<0 || daughter1lc<0) {
+ if (daughter0lc<=0 || daughter1lc<=0) {
AliDebug(2,"Lc daughters are not in MC array");
return bGenValues;
}
Bool_t bFillRecoValues = kFALSE;
//Get the Lc and the V0 from Lc
- AliAODRecoCascadeHF* lcV0bachelor = (AliAODRecoCascadeHF*)fRecoCandidate;
+ AliAODRecoCascadeHF* lcV0bachelor = dynamic_cast<AliAODRecoCascadeHF*>(fRecoCandidate);
- AliAODTrack* bachelor = (AliAODTrack*)lcV0bachelor->GetBachelor();
- AliAODv0* v0toDaughters = (AliAODv0*)lcV0bachelor->Getv0();
- if (!lcV0bachelor || !bachelor || !v0toDaughters) {
+ if (!lcV0bachelor) {
+ AliDebug(2,"Current cascade doesn't exist, skipped");
+ return bFillRecoValues;
+ }
+
+ if (!lcV0bachelor->GetSecondaryVtx()) {
+ AliDebug(2,"No secondary vertex for cascade");
+ return bFillRecoValues;
+ }
+
+ if (lcV0bachelor->GetNDaughters()!=2) {
+ AliDebug(2,Form("No 2 daughters for current cascade (nDaughters=%d)",lcV0bachelor->GetNDaughters()));
+ return bFillRecoValues;
+ }
+
+ AliAODTrack* bachelor = dynamic_cast<AliAODTrack*>(lcV0bachelor->GetBachelor());
+ AliAODv0* v0toDaughters = dynamic_cast<AliAODv0*>(lcV0bachelor->Getv0());
+ if (!bachelor || !v0toDaughters) {
AliDebug(2,"No V0 or bachelor in this reco candidate, skipping!");
return bFillRecoValues;
}
+ if (!v0toDaughters->GetSecondaryVtx()) {
+ AliDebug(2,"No secondary vertex for V0 by cascade");
+ return bFillRecoValues;
+ }
+
+ if (v0toDaughters->GetNDaughters()!=2) {
+ AliDebug(2,Form("current V0 has not 2 daughters (onTheFly=%d, nDaughters=%d)",v0toDaughters->GetOnFlyStatus(),v0toDaughters->GetNDaughters()));
+ return bFillRecoValues;
+ }
+
Bool_t onTheFlyStatus = v0toDaughters->GetOnFlyStatus();
- AliAODTrack* v0positiveTrack = (AliAODTrack*)lcV0bachelor->Getv0PositiveTrack();
- AliAODTrack* v0negativeTrack = (AliAODTrack*)lcV0bachelor->Getv0NegativeTrack();
+ AliAODTrack* v0positiveTrack;
+ AliAODTrack* v0negativeTrack;
+ if (onTheFlyStatus) {
+ v0positiveTrack = dynamic_cast<AliAODTrack*>(lcV0bachelor->Getv0NegativeTrack());
+ v0negativeTrack = dynamic_cast<AliAODTrack*>(lcV0bachelor->Getv0PositiveTrack());
+ } else {
+ v0positiveTrack = dynamic_cast<AliAODTrack*>(lcV0bachelor->Getv0PositiveTrack());
+ v0negativeTrack = dynamic_cast<AliAODTrack*>(lcV0bachelor->Getv0NegativeTrack());
+ }
+
if (!v0positiveTrack || !v0negativeTrack) {
AliDebug(2,"No V0daughters in this reco candidate, skipping!");
return bFillRecoValues;
Double_t cosPAwrtPrimVtxV0 = lcV0bachelor->CosV0PointingAngle();
- Double_t pTbachelor = bachelor->Pt();
- Double_t pTV0pos = v0positiveTrack->Pt();
- Double_t pTV0neg = v0negativeTrack->Pt();
+ //Double_t pTbachelor = bachelor->Pt();
+ Double_t pbachelor = bachelor->P();
+ //Double_t pTV0pos = v0positiveTrack->Pt();
+ //Double_t pTV0neg = v0negativeTrack->Pt();
Double_t phi = lcV0bachelor->Phi();
Double_t dcaV0 = v0toDaughters->GetDCA();
- Double_t cTLc = lcV0bachelor->Ct(4122); // wrt PrimVtx
+ //Double_t cTLc = lcV0bachelor->Ct(4122); // wrt PrimVtx
//Double_t dcaLc = lcV0bachelor->GetDCA();
Double_t cosPointingAngleLc = lcV0bachelor->CosPointingAngle();
+ /*
Double_t cTV0 = 0.;
AliAODVertex *vtx0 = (AliAODVertex*)lcV0bachelor->GetPrimaryVtx();
if (!vtx0) {
cTV0 = v0toDaughters->Ct(3122,primVtxPos);
}
}
+ */
Double_t invMassV0 = 0.;
if (fGenLcOption==kCountLambdapi) {
vectorReco[0] = pt;
vectorReco[1] = rapidity;
vectorReco[2] = phi;
- vectorReco[3] = cosPAwrtPrimVtxV0;
- vectorReco[4] = onTheFlyStatus;
+ vectorReco[3] = onTheFlyStatus;
+ vectorReco[4] = fzPrimVertex;
vectorReco[5] = fCentValue;
vectorReco[6] = fFake; // whether the reconstructed candidate was a fake (fFake = 0) or not (fFake = 2)
vectorReco[7] = fMultiplicity;
if (fConfiguration==AliCFTaskVertexingHF::kSnail) {
- vectorReco[8] = pTbachelor;
- vectorReco[9] = pTV0pos;
- vectorReco[10] = pTV0neg;
- vectorReco[11] = invMassV0;
- vectorReco[12] = dcaV0;
- vectorReco[13] = cTV0*1.E4; // in micron
- vectorReco[14] = cTLc*1.E4; // in micron
+ //vectorReco[8] = pTbachelor;
+ vectorReco[8] = pbachelor;
+ vectorReco[9] = v0toDaughters->Pt();
+ if (fGenLcOption==kCountLambdapi) {
+ vectorReco[10] = v0toDaughters->Y(3122);
+ } else if (fGenLcOption==kCountK0Sp) {
+ vectorReco[10] = v0toDaughters->Y(310);
+ }
+ vectorReco[11] = v0toDaughters->Phi();
+ vectorReco[12] = invMassV0;
+ vectorReco[13] = dcaV0;
+ vectorReco[14] = cosPAwrtPrimVtxV0;
vectorReco[15] = cosPointingAngleLc;
+ //vectorReco[16] = cTV0*1.E4; // in micron
+ //vectorReco[17] = cTLc*1.E4; // in micron
}
bFillRecoValues = kTRUE;
// check the required decay channel
Bool_t checkCD = kFALSE;
-
+ Double_t sumPxDau=0.;
+ Double_t sumPyDau=0.;
+ Double_t sumPzDau=0.;
+
+
if (fmcPartCandidate->GetNDaughters()!=2) {
AliDebug(2, Form("The MC particle doesn't decay in 2 particles, skipping!!"));
return checkCD;
Int_t daughter0 = fmcPartCandidate->GetDaughter(0);
Int_t daughter1 = fmcPartCandidate->GetDaughter(1);
- if (daughter0<0 || daughter1<0){
+ if (daughter0<=0 || daughter1<=0){
AliDebug(2, Form("The MC particle doesn't have correct daughters, skipping!!"));
return checkCD;
}
mcPartDaughter0 = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daughter1)); // the bachelor
mcPartDaughter1 = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daughter0)); // the V0
}
+ if (!mcPartDaughter0 || !mcPartDaughter1) {
+ AliDebug(2,"Problems in the MC Daughters\n");
+ return checkCD;
+ }
+ // momentum of the bachelor
+ sumPxDau+=mcPartDaughter0->Px();
+ sumPyDau+=mcPartDaughter0->Py();
+ sumPzDau+=mcPartDaughter0->Pz();
if (mcPartDaughter1->GetNDaughters()!=2) {
AliDebug(2, "The Lambda MC particle doesn't decay in 2 particles, skipping!!");
Int_t daughter1D0 = mcPartDaughter1->GetDaughter(0);
Int_t daughter1D1 = mcPartDaughter1->GetDaughter(1);
- if (daughter1D0<0 || daughter1D1<0) {
+ if (daughter1D0<=0 || daughter1D1<=0) {
AliDebug(2, Form("The Lambda MC particle doesn't have correct daughters, skipping!!"));
return checkCD;
}
return checkCD;
}
+ // momentum of the V0 daughters
+ sumPxDau+=mcPartDaughter1D0->Px();
+ sumPyDau+=mcPartDaughter1D0->Py();
+ sumPzDau+=mcPartDaughter1D0->Pz();
+ sumPxDau+=mcPartDaughter1D1->Px();
+ sumPyDau+=mcPartDaughter1D1->Py();
+ sumPzDau+=mcPartDaughter1D1->Pz();
+
} else if (fGenLcOption==kCountK0Sp) { // Lc -> K0bar + proton AND cc
if (!(TMath::Abs(mcPartDaughter0->GetPdgCode())==311 &&
mcPartDaughter0 = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daughter1)); // the bachelor
mcPartDaughter1 = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daughter0)); // the V0
}
+ if (!mcPartDaughter0 || !mcPartDaughter1) {
+ AliDebug(2,"Problems in the MC Daughters after swapping V0 and bachelor\n");
+ return checkCD;
+ }
+
+ // momentum of the bachelor
+ sumPxDau+=mcPartDaughter0->Px();
+ sumPyDau+=mcPartDaughter0->Py();
+ sumPzDau+=mcPartDaughter0->Pz();
+
+ if (mcPartDaughter1->GetNDaughters()!=1) {
+ AliDebug(2, "The K0/K0bar MC particle doesn't decay in 1 particles, skipping!!");
+ return checkCD;
+ }
Int_t daughter = mcPartDaughter1->GetDaughter(0);
- if (daughter<0) {
+ if (daughter<=0) {
AliDebug(2, Form("The K0/K0bar MC particle doesn't have correct daughter, skipping!!"));
return checkCD;
}
Int_t daughterD0 = mcPartDaughter->GetDaughter(0);
Int_t daughterD1 = mcPartDaughter->GetDaughter(1);
- if (daughterD0<0 || daughterD1<0) {
+ if (daughterD0<=0 || daughterD1<=0) {
AliDebug(2, Form("The K0S MC particle doesn't have correct daughters, skipping!!"));
return checkCD;
}
return checkCD;
}
+ // momentum of the V0 daughters
+ sumPxDau+=mcPartDaughterD0->Px();
+ sumPyDau+=mcPartDaughterD0->Py();
+ sumPzDau+=mcPartDaughterD0->Pz();
+ sumPxDau+=mcPartDaughterD1->Px();
+ sumPyDau+=mcPartDaughterD1->Py();
+ sumPzDau+=mcPartDaughterD1->Pz();
+
}
+ Double_t pxMother=fmcPartCandidate->Px();
+ Double_t pyMother=fmcPartCandidate->Py();
+ Double_t pzMother=fmcPartCandidate->Pz();
+ if(TMath::Abs(pxMother-sumPxDau)/(TMath::Abs(pxMother)+1.e-13)>0.00001 ||
+ TMath::Abs(pyMother-sumPyDau)/(TMath::Abs(pyMother)+1.e-13)>0.00001 ||
+ TMath::Abs(pzMother-sumPzDau)/(TMath::Abs(pzMother)+1.e-13)>0.00001){
+ AliDebug(2, "Momentum conservation violated, skipping!!");
+ return checkCD;
+ }
+
checkCD = kTRUE;
return checkCD;
Int_t daughterD0 = mcPartCandidate->GetDaughter(0);
Int_t daughterD1 = mcPartCandidate->GetDaughter(1);
- if (daughterD0<0 || daughterD1<0) {
+ if (daughterD0<=0 || daughterD1<=0) {
AliDebug(2, Form("The Lc MC particle doesn't have correct daughters, skipping!!"));
return cTau;
}
- AliAODMCParticle *mcPartDaughter0 = (AliAODMCParticle*)fmcArray->At(mcPartCandidate->GetDaughter(0));
- AliAODMCParticle *mcPartDaughter1 = (AliAODMCParticle*)fmcArray->At(mcPartCandidate->GetDaughter(1));
+ AliAODMCParticle *mcPartDaughter0 = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daughterD0));
+ AliAODMCParticle *mcPartDaughter1 = dynamic_cast<AliAODMCParticle*>(fmcArray->At(daughterD1));
if (!mcPartDaughter0 || !mcPartDaughter1) {
AliDebug(2,"The candidate daughter particles not found in MC array");
return cTau;
Bool_t checkCD = kFALSE;
if (fmcPartCandidate->GetNDaughters()!=2) {
- AliDebug(2, Form("The MC particle doesn't have 2 daughters, skipping!!"));
+ AliDebug(2, Form("The MC particle have %d daughters (not 2), skipping!!",fmcPartCandidate->GetNDaughters()));
+ // fmcPartCandidate->Print();
return checkCD;
}
Int_t daughter0 = fmcPartCandidate->GetDaughter(0);
Int_t daughter1 = fmcPartCandidate->GetDaughter(1);
- if (daughter0<0 || daughter1<0){
+ if (daughter0<=0 || daughter1<=0){
AliDebug(2, Form("The MC particle doesn't have correct daughters, skipping!!"));
return checkCD;
}
Int_t daughter1D0 = mcPartDaughter1->GetDaughter(0);
Int_t daughter1D1 = mcPartDaughter1->GetDaughter(1);
- if (daughter1D0<0 || daughter1D1<0) {
+ if (daughter1D0<=0 || daughter1D1<=0) {
AliDebug(2, Form("The Lambda MC particle doesn't have correct daughters, skipping!!"));
delete [] fLabelArray;
fLabelArray = 0x0;
daughter1 = daughterTemp; // the V0 label
}
+ if (mcPartDaughter1->GetNDaughters()!=1) {
+ AliDebug(2, "The K0/K0bar MC particle doesn't decay in 1 particles, skipping!!");
+ delete [] fLabelArray;
+ fLabelArray = 0x0;
+ return checkCD;
+ }
+
Int_t daughter = mcPartDaughter1->GetDaughter(0);
- if (daughter<0) {
+ if (daughter<=0) {
AliDebug(2, Form("The K0/K0bar MC particle doesn't have correct daughter, skipping!!"));
delete [] fLabelArray;
fLabelArray = 0x0;
Int_t daughterD0 = mcPartDaughter->GetDaughter(0);
Int_t daughterD1 = mcPartDaughter->GetDaughter(1);
- if (daughterD0<0 || daughterD1<0) {
+ if (daughterD0<=0 || daughterD1<=0) {
AliDebug(2, Form("The K0S MC particle doesn't have correct daughters, skipping!!"));
delete [] fLabelArray;
fLabelArray = 0x0;
AliAODMCParticle *mcPartV0DaughterNeg = dynamic_cast<AliAODMCParticle*>(fmcArray->At(fLabelArray[2]));
AliAODMCParticle *mcPartDaughterV0 = 0x0;
- if(!mcPartV0DaughterPos && !mcPartV0DaughterNeg) return bGenValues;
+ if(!mcPartV0DaughterPos || !mcPartV0DaughterNeg) return bGenValues;
if (TMath::Abs(mcPartDaughterK0->GetPdgCode())==311) {
Int_t daughterK0 = mcPartDaughterK0->GetDaughter(0);
- if (daughterK0<0) {
+ if (daughterK0<=0) {
AliDebug(2, Form("The K0/K0bar particle doesn't have correct daughter, skipping!!"));
return bGenValues;
}
}
}
+ if (!mcPartDaughterV0) {
+ AliDebug(2,"V0 particle not found in MC array");
+ return bGenValues;
+ }
- Double_t cTLc = Ctau(fmcPartCandidate); // by default wrt Primary Vtx
- Double_t pTbach = mcPartDaughterBachelor->Pt(); // get the bachelor pT
+ //Double_t cTLc = Ctau(fmcPartCandidate); // by default wrt Primary Vtx
+ //Double_t pTbach = mcPartDaughterBachelor->Pt(); // get the bachelor pT
+ Double_t pbach = mcPartDaughterBachelor->P(); // get the bachelor p
Double_t vtx1[3] = {0,0,0}; // primary vertex
Bool_t hasPrimVtx = fmcPartCandidate->XvYvZv(vtx1); // cm
charge = 0;
AliAODRecoDecayHF* decay = new AliAODRecoDecayHF(vtx1,vtx2daughter0,nprongs,charge,px,py,pz,d0);
Double_t cosPAwrtPrimVtxV0 = decay->CosPointingAngle();
+ /*
Double_t cTV0 = 0.; //ct
if (fGenLcOption==kCountK0Sp) {
cTV0 = decay->Ct(310); // by default wrt Primary Vtx
} else if (fGenLcOption==kCountLambdapi) {
cTV0 = decay->Ct(3122); // by default wrt Primary Vtx
}
+ */
Double_t invMass = 0.; //invMass
if (fGenLcOption==kCountK0Sp) {
vectorMC[0] = fmcPartCandidate->Pt();
vectorMC[1] = fmcPartCandidate->Y() ;
vectorMC[2] = fmcPartCandidate->Phi();
- vectorMC[3] = cosPAwrtPrimVtxV0;
- vectorMC[4] = 0; // dummy value x MC, onTheFlyStatus
+ vectorMC[3] = 0; // dummy value x MC, onTheFlyStatus
+ vectorMC[4] = fzMCVertex;
vectorMC[5] = fCentValue; // reconstructed centrality
vectorMC[6] = 1; // dummy value x MC, fFake
vectorMC[7] = fMultiplicity; // reconstructed multiplicity
if (fConfiguration==AliCFTaskVertexingHF::kSnail) {
- vectorMC[8] = pTbach;
- vectorMC[9] = mcPartV0DaughterPos->Pt();
- vectorMC[10] = mcPartV0DaughterNeg->Pt();
- vectorMC[11] = invMass;
- vectorMC[12] = 0; // dummy value x MC, V0 DCA
- vectorMC[13] = cTV0*1.E4; // in micron
- vectorMC[14] = cTLc*1.E4; // in micron
+ //vectorMC[8] = pTbach;
+ vectorMC[8] = pbach;
+ vectorMC[9] = mcPartDaughterV0->Pt();
+ vectorMC[10] = mcPartDaughterV0->Y();
+ vectorMC[11] = mcPartDaughterV0->Phi();
+ vectorMC[12] = invMass;
+ vectorMC[13] = 0; // dummy value x MC, V0 DCA
+ vectorMC[14] = cosPAwrtPrimVtxV0;
vectorMC[15] = cosPAwrtPrimVtxLc;
+ //vectorMC[16] = cTV0*1.E4; // in micron
+ //vectorMC[17] = cTLc*1.E4; // in micron
}
bGenValues = kTRUE;