From: morsch Date: Wed, 29 Jul 2009 08:22:06 +0000 (+0000) Subject: I improved (by a factor 2.5) the speed of the MatchToMC method X-Git-Url: http://git.uio.no/git/?p=u%2Fmrichter%2FAliRoot.git;a=commitdiff_plain;h=8862e6bf480ad04e4d406aad3fac1480bed26c75;ds=inline I improved (by a factor 2.5) the speed of the MatchToMC method (there were unnecessary new/delete). I changed accordingly also the class PWG3/vertexingHF/AliAODRecoCascadeHF.cxx) [A. Dainese] --- diff --git a/PWG3/vertexingHF/AliAODRecoCascadeHF.cxx b/PWG3/vertexingHF/AliAODRecoCascadeHF.cxx index 38c92f117c8..4316981f8ce 100644 --- a/PWG3/vertexingHF/AliAODRecoCascadeHF.cxx +++ b/PWG3/vertexingHF/AliAODRecoCascadeHF.cxx @@ -133,7 +133,8 @@ Int_t AliAODRecoCascadeHF::MatchToMC(Int_t pdgabs,Int_t pdgabs2prong, return -1; } - if(!GetNDaughters()) { + Int_t ndg=GetNDaughters(); + if(!ndg) { AliError("No daughters available"); return -1; } @@ -143,10 +144,10 @@ Int_t AliAODRecoCascadeHF::MatchToMC(Int_t pdgabs,Int_t pdgabs2prong, if(lab2Prong<0) return -1; - Int_t *dgLabels = new Int_t[GetNDaughters()]; + Int_t dgLabels[10]; // loop on daughters and write labels - for(Int_t i=0; iGetLabel(); if(lab==-1) { // this daughter is the 2prong @@ -158,11 +159,7 @@ Int_t AliAODRecoCascadeHF::MatchToMC(Int_t pdgabs,Int_t pdgabs2prong, dgLabels[i] = lab; } - Int_t labMother = AliAODRecoDecay::MatchToMC(pdgabs,mcArray,dgLabels); - - delete [] dgLabels; dgLabels=NULL; - - return labMother; + return AliAODRecoDecay::MatchToMC(pdgabs,mcArray,dgLabels,ndg); } //----------------------------------------------------------------------------- Bool_t AliAODRecoCascadeHF::SelectDstar(const Double_t *cutsDstar, diff --git a/STEER/AliAODRecoDecay.cxx b/STEER/AliAODRecoDecay.cxx index 6037574daba..0c5c4fc17fb 100644 --- a/STEER/AliAODRecoDecay.cxx +++ b/STEER/AliAODRecoDecay.cxx @@ -483,28 +483,29 @@ Int_t AliAODRecoDecay::MatchToMC(Int_t pdgabs,TClonesArray *mcArray) const // If yes, return label (>=0) of the AliAODMCParticle // - if(!GetNDaughters()) { + Int_t ndg=GetNDaughters(); + if(!ndg) { AliError("No daughters available"); return -1; } + if(ndg>10) { + AliError("Only decays with <10 daughters supported"); + return -1; + } - Int_t *dgLabels = new Int_t[GetNDaughters()]; + Int_t dgLabels[10]; // loop on daughters and write the labels - for(Int_t i=0; iGetLabel(); } - Int_t labMother = MatchToMC(pdgabs,mcArray,dgLabels); - - delete [] dgLabels; dgLabels=NULL; - - return labMother; + return MatchToMC(pdgabs,mcArray,dgLabels,ndg); } //---------------------------------------------------------------------------- Int_t AliAODRecoDecay::MatchToMC(Int_t pdgabs,TClonesArray *mcArray, - Int_t *dgLabels) const + Int_t dgLabels[10],Int_t ndg) const { // // Check if this candidate is matched to a MC signal @@ -512,78 +513,79 @@ Int_t AliAODRecoDecay::MatchToMC(Int_t pdgabs,TClonesArray *mcArray, // If yes, return label (>=0) of the AliAODMCParticle // - if(!GetNDaughters()) { - AliError("No daughters available"); - return -1; - } - - Int_t *labMom = new Int_t[GetNDaughters()]; + Int_t labMom[10]; Int_t i,lab,labMother,pdgMother; AliAODMCParticle *part=0; + AliAODMCParticle *mother=0; Double_t pxSumDgs=0.,pySumDgs=0.,pzSumDgs=0.; // loop on daughter labels - for(i=0; iAt(lab); if(!part) { printf("no MC particle\n"); - continue; + return -1; } - // keep sum of daughters' momenta, to check for mom conservation - pxSumDgs += part->Px(); - pySumDgs += part->Py(); - pzSumDgs += part->Pz(); + // for the J/psi, check that the daughters are electrons - if(pdgabs==443 && TMath::Abs(part->GetPdgCode())!=11) continue; + if(pdgabs==443) { + if(TMath::Abs(part->GetPdgCode())!=11) return -1; + } - while(part->GetMother()>=0) { - labMother=part->GetMother(); - part = (AliAODMCParticle*)mcArray->At(labMother); - if(!part) { + mother = part; + while(mother->GetMother()>=0) { + labMother=mother->GetMother(); + mother = (AliAODMCParticle*)mcArray->At(labMother); + if(!mother) { printf("no MC mother particle\n"); break; } - pdgMother = TMath::Abs(part->GetPdgCode()); + pdgMother = TMath::Abs(mother->GetPdgCode()); if(pdgMother==pdgabs) { labMom[i]=labMother; + // keep sum of daughters' momenta, to check for mom conservation + pxSumDgs += part->Px(); + pySumDgs += part->Py(); + pzSumDgs += part->Pz(); + break; + } else if(pdgMother>pdgabs || pdgMother<10) { break; } } - } + if(labMom[i]==-1) return -1; // mother PDG not ok for this daughter + } // end loop on daughters // check if the candidate is signal - Bool_t isSignal=kTRUE; labMother=labMom[0]; // all labels have to be the same and !=-1 - for(i=0; i prongs - Int_t ndg = TMath::Abs(part->GetDaughter(1)-part->GetDaughter(0))+1; - if(ndg!=GetNDaughters()) return -1; - AliAODMCParticle* p1=(AliAODMCParticle*)(mcArray->At(part->GetDaughter(1))); - AliAODMCParticle* p0=(AliAODMCParticle*)(mcArray->At(part->GetDaughter(0))); - printf("pdg %d %d %d %d %d %d\n",part->GetDaughter(1),part->GetDaughter(0),dgLabels[0],dgLabels[1],p0->GetPdgCode(),p1->GetPdgCode()); + Int_t ndg2 = TMath::Abs(mother->GetDaughter(1)-mother->GetDaughter(0))+1; + printf(" MC daughters %d\n",ndg2); + //if(ndg!=GetNDaughters()) return -1; + AliAODMCParticle* p1=(AliAODMCParticle*)(mcArray->At(mother->GetDaughter(1))); + AliAODMCParticle* p0=(AliAODMCParticle*)(mcArray->At(mother->GetDaughter(0))); + printf(">>>>>>>> pdg %d %d %d %d %d %d\n",mother->GetDaughter(0),mother->GetDaughter(1),dgLabels[0],dgLabels[1],p0->GetPdgCode(),p1->GetPdgCode()); */ // the above works only for non-resonant decays, // it's better to check for mom conservation - part = (AliAODMCParticle*)mcArray->At(labMother); - Double_t pxMother = part->Px(); - Double_t pyMother = part->Py(); - Double_t pzMother = part->Pz(); + mother = (AliAODMCParticle*)mcArray->At(labMother); + Double_t pxMother = mother->Px(); + Double_t pyMother = mother->Py(); + Double_t pzMother = mother->Pz(); // within 0.1% if((TMath::Abs(pxMother-pxSumDgs)/(TMath::Abs(pxMother)+1.e-13)) > 0.001 && (TMath::Abs(pyMother-pySumDgs)/(TMath::Abs(pyMother)+1.e-13)) > 0.001 && diff --git a/STEER/AliAODRecoDecay.h b/STEER/AliAODRecoDecay.h index a711d0ff34b..9bc67860740 100644 --- a/STEER/AliAODRecoDecay.h +++ b/STEER/AliAODRecoDecay.h @@ -52,7 +52,6 @@ class AliAODRecoDecay : public AliVTrack { // If no, return -1 // If yes, return label (>=0) of the AliAODMCParticle Int_t MatchToMC(Int_t pdgabs,TClonesArray *mcArray) const; - Int_t MatchToMC(Int_t pdgabs,TClonesArray *mcArray,Int_t *dgLabels) const; // PID void SetPID(Int_t nprongs,Double_t *pid); @@ -171,6 +170,9 @@ class AliAODRecoDecay : public AliVTrack { Int_t GetLabel() const {return -1;} protected: + Int_t MatchToMC(Int_t pdgabs,TClonesArray *mcArray,Int_t dgLabels[10],Int_t ndg) const; + Int_t MatchToMC(Int_t pdgabs,TClonesArray *mcArray,Int_t dgLabels[10]) const { return MatchToMC(pdgabs,mcArray,dgLabels,GetNDaughters()); } + TRef fSecondaryVtx; // decay vertex AliAODVertex *fOwnSecondaryVtx; // temporary solution (to work outside AliAODEvent) Short_t fCharge; // charge, use this convention for prongs charges: