#include "AliESDkink.h"
#include "AliESDv0.h"
#include "AliV0.h"
+#include "AliKFParticle.h"
+#include "AliKFVertex.h"
//
#include "AliTreeDraw.h"
#include "AliMCInfo.h"
AliESDRecV0Info:: AliESDRecV0Info():
TObject(),
- fT1(), //track1
- fT2(), //track2
- fDist1(0), //info about closest distance according closest MC - linear DCA
- fDist2(0), //info about closest distance parabolic DCA
- fInvMass(0), //reconstructed invariant mass -
+ fT1(), //track1
+ fT2(), //track2
+ fDist1(0), //info about closest distance according closest MC - linear DCA
+ fDist2(0), //info about closest distance parabolic DCA
+ fInvMass(0), //reconstructed invariant mass -
//
- fDistMinR(0), // distance at minimal radius
- fRr(0), // rec position of the vertex
- fPointAngleFi(0), //point angle fi
- fPointAngleTh(0), //point angle theta
- fPointAngle(0), //point angle full
- fV0Status(0), // status of the kink
+ fDistMinR(0), // distance at minimal radius
+ fRr(0), // rec position of the vertex
+ fPointAngleFi(0), //point angle fi
+ fPointAngleTh(0), //point angle theta
+ fPointAngle(0), //point angle full
+ fV0Status(0), // status of the kink
fV0tpc(0), // Vo information from reconsturction according TPC
fV0its(0), // Vo information from reconsturction according ITS
fV0rec(0), // V0 information form the reconstruction
- fMultiple(0), // how man times V0 was recostructed
- fV0Multiple(0), // how man times was V0 reconstucted
- fRecStatus(0) // status form the reconstuction
+ fV0recOff(0), // V0 information form the reconstruction - OFFLINE
+ fMultiple(0), // how man times V0 was recostructed
+ fRecStatus(0), // status form the reconstuction
+ fV0MultipleOn(0), // how man times was V0 reconstucted
+ fV0MultipleOff(0), // how man times was V0 reconstucted
+ //
+ fKFrecChi2NC(0), // ONLINE V0 finder non constrained chi2
+ fKFrecChi2C(0), // ONLINE V0 finder constrained chi2 - prim vertex
+ fKFrecChi2CM(0), // ONLINE V0 finder constrained chi2 - prim vertex+mass
+ fKFRecNC(0), // non constrained
+ fKFRecC(0), // constrained vertex
+ fKFRecCM(0), // constrained vertex+mass
+ fKFrecOffChi2NC(0), // OFFLINE V0 finder - non constrained chi2
+ fKFrecOffChi2C(0), // OFFLINE V0 finder - constrained chi2 - prim vertex
+ fKFrecOffChi2CM(0), // OFFLINE V0 finder - constrained chi2 - prim vertex+mass
+ fKFOffRecNC(0), // non constrained
+ fKFOffRecC(0), // constrained vertex
+ fKFOffRecCM(0) // constrained vertex+mass
{
//
// default constructor
//
- fV0tpc = new AliV0();
- fV0its = new AliV0();
+ fV0tpc = new AliV0();
+ fV0its = new AliV0();
+ fV0rec = new AliV0();
+ fV0recOff = new AliV0();
}
}
}
+void AliESDRecV0Info::UpdateKF(const AliESDVertex &vertex, Int_t pdg0, Int_t pdg1, Float_t mass){
+ //
+ // Calculate properties of V0 vertex using different type of constraints
+ //
+ fKFrecChi2NC=0; // ONLINE V0 finder non constrained chi2
+ fKFrecChi2C=0; // ONLINE V0 finder constrained chi2 - prim vertex
+ fKFrecChi2CM=0; // ONLINE V0 finder constrained chi2 - prim vertex+mass
+ if (fKFRecNC) {delete fKFRecNC; fKFRecNC=0;}
+ if (fKFRecC) {delete fKFRecC; fKFRecC=0;}
+ if (fKFRecCM) {delete fKFRecCM; fKFRecCM=0;}
+ //
+ fKFrecOffChi2NC=0; // OFFLINE V0 finder - non constrained chi2
+ fKFrecOffChi2C=0; // OFFLINE V0 finder - constrained chi2 - prim vertex
+ fKFrecOffChi2CM=0; // OFFLINE V0 finder - constrained chi2 - prim vertex+mass
+ if (fKFOffRecNC) {delete fKFOffRecNC; fKFOffRecNC=0;}
+ if (fKFOffRecC) {delete fKFOffRecC; fKFOffRecC=0;}
+ if (fKFOffRecCM) {delete fKFOffRecCM; fKFOffRecCM=0;}
+ if (fV0Status==0) return; //
+ //
+ AliKFVertex primVtx(vertex);
+ //
+ if (fV0rec &&
+ TMath::Abs(fV0rec->GetParamN()->GetSigmaY2())>0.000000001&&
+ TMath::Abs(fV0rec->GetParamP()->GetSigmaY2())>0.000000001
+ ){
+ //
+ Double_t x, y, z;
+ AliKFParticle p1( *(fV0rec->GetParamN()), pdg0 );
+ AliKFParticle p2( *(fV0rec->GetParamP()), pdg1 );
+ //
+ fKFRecNC = new AliKFParticle;
+ fV0rec->GetXYZ(x,y,z);
+ fKFRecNC->SetVtxGuess(x,y,z);
+ *(fKFRecNC)+=p1;
+ *(fKFRecNC)+=p2;
+ fKFrecChi2NC =fKFRecNC->GetChi2() ;
+ //
+ fKFRecC = new AliKFParticle;
+ fV0rec->GetXYZ(x,y,z);
+ fKFRecC->SetVtxGuess(x,y,z);
+ *(fKFRecC)+=p1;
+ *(fKFRecC)+=p2;
+ fKFRecC->SetProductionVertex(primVtx);
+ fKFrecChi2C =fKFRecC->GetChi2();
+ //
+ fKFRecCM = new AliKFParticle;
+ fV0rec->GetXYZ(x,y,z);
+ fKFRecCM->SetVtxGuess(x,y,z);
+ *(fKFRecCM)+=p1;
+ *(fKFRecCM)+=p2;
+ fKFRecCM->SetProductionVertex(primVtx);
+ fKFRecCM->SetMassConstraint(mass);
+ fKFrecChi2CM =fKFRecCM->GetChi2();
+ }
+
+ if (fV0recOff &&
+ TMath::Abs(fV0recOff->GetParamN()->GetSigmaY2())>0.000000001&&
+ TMath::Abs(fV0recOff->GetParamP()->GetSigmaY2())>0.000000001
+ ){
+ //
+ Double_t x, y, z;
+ AliKFParticle p1( *(fV0recOff->GetParamN()), pdg0 );
+ AliKFParticle p2( *(fV0recOff->GetParamP()), pdg1 );
+ //
+ fKFOffRecNC = new AliKFParticle;
+ fV0recOff->GetXYZ(x,y,z);
+ fKFOffRecNC->SetVtxGuess(x,y,z);
+ *(fKFOffRecNC)+=p1;
+ *(fKFOffRecNC)+=p2;
+ fKFrecOffChi2NC =fKFOffRecNC->GetChi2() ;
+ //
+ fKFOffRecC = new AliKFParticle;
+ fV0recOff->GetXYZ(x,y,z);
+ fKFOffRecC->SetVtxGuess(x,y,z);
+ *(fKFOffRecC)+=p1;
+ *(fKFOffRecC)+=p2;
+ fKFOffRecC->SetProductionVertex(primVtx);
+ fKFrecOffChi2C =fKFOffRecC->GetChi2();
+ //
+ fKFOffRecCM = new AliKFParticle;
+ fV0recOff->GetXYZ(x,y,z);
+ fKFOffRecCM->SetVtxGuess(x,y,z);
+ *(fKFOffRecCM)+=p1;
+ *(fKFOffRecCM)+=p2;
+ fKFOffRecCM->SetProductionVertex(primVtx);
+ fKFOffRecCM->SetMassConstraint(mass);
+ fKFrecOffChi2CM =fKFOffRecCM->GetChi2();
+ }
+
+
+}
+
+
#include "TObject.h"
#include "AliESDRecInfo.h"
-
+class AliESDvertex;
+class AliKFParticle;
public:
AliESDRecV0Info();
void Update(Float_t vertex[3]);
+ void UpdateKF(const AliESDVertex &vertex, Int_t pdg0, Int_t pdg1, Float_t mass);
protected:
AliESDRecInfo fT1; //track1
AliESDRecInfo fT2; //track2
Float_t fPointAngleFi; //point angle fi
Float_t fPointAngleTh; //point angle theta
Float_t fPointAngle; //point angle full
- Int_t fV0Status; // status of the kink
+ //
+ Int_t fV0Status; // status of the V0
AliV0* fV0tpc; // Vo information from reconsturction according TPC
AliV0* fV0its; // Vo information from reconsturction according ITS
AliV0* fV0rec; // V0 information form the reconstruction
+ AliV0* fV0recOff; // V0 information form the reconstruction - OFFLINE
Int_t fMultiple; // how man times V0 was recostructed
- Int_t fV0Multiple; // how man times was V0 reconstucted
- Int_t fRecStatus; // status form the reconstuction
+ Int_t fRecStatus; // status form the reconstuction - 1 reconstructed - -1 fake
+ Int_t fV0MultipleOn; // how man times was V0 reconstucted - onfly
+ Int_t fV0MultipleOff; // how man times was V0 reconstucted - offline
+ //
+ // AliKF variables - variables to make a selection + resoluton study
+ //
+ Float_t fKFrecChi2NC; // ONLINE V0 finder non constrained chi2
+ Float_t fKFrecChi2C; // ONLINE V0 finder constrained chi2 - prim vertex
+ Float_t fKFrecChi2CM; // ONLINE V0 finder constrained chi2 - prim vertex+mass
+ AliKFParticle* fKFRecNC; // non constrained
+ AliKFParticle* fKFRecC; // constrained vertex
+ AliKFParticle* fKFRecCM; // constrained vertex+mass
+ //
+ Float_t fKFrecOffChi2NC; // OFFLINE V0 finder - non constrained chi2
+ Float_t fKFrecOffChi2C; // OFFLINE V0 finder - constrained chi2 - prim vertex
+ Float_t fKFrecOffChi2CM; // OFFLINE V0 finder - constrained chi2 - prim vertex+mass
+ AliKFParticle* fKFOffRecNC; // non constrained
+ AliKFParticle* fKFOffRecC; // constrained vertex
+ AliKFParticle* fKFOffRecCM; // constrained vertex+mass
+
ClassDef(AliESDRecV0Info,2) // container for
};
void Update(Float_t vertex[3]);
AliMCInfo & GetPlus() {return fMCd;}
AliMCInfo & GetMinus() {return fMCm;}
- TParticle & GetMopther() {return fMotherP;}
+ TParticle & GetMother() {return fMotherP;}
Double_t GetMCDist1() const { return fMCDist1;}
Double_t GetMCDist2() const {return fMCDist2;}
const Double_t* GetMCPdr() const {return fMCPdr;}
}
// --sort reconstructed V0
//
-// AliV0 * v0MI=0;
-// for (Int_t iEntry=0; iEntry<nV0MIs;iEntry++){
-// v0MI = (AliV0*)fEvent->GetV0(iEntry);
-// if (!v0MI) continue;
-// //
-// Int_t label0 = TMath::Abs(v0MI->GetLabel(0));
-// Int_t label1 = TMath::Abs(v0MI->GetLabel(1));
-// //
-// for (Int_t i=0;i<2;i++){
-// Int_t absLabel = TMath::Abs(v0MI->GetLabel(i));
-// if (absLabel < fNParticles) {
-// if (fMultiRecV0[absLabel]>0){
-// if (fMultiRecV0[absLabel]<20)
-// fIndexRecV0[absLabel*20+fMultiRecV0[absLabel]] = iEntry;
-// }
-// else
-// fIndexRecV0[absLabel*20] = iEntry;
-// fMultiRecV0[absLabel]++;
-// }
-// }
-// }
+ AliV0 * v0MI=0;
+ for (Int_t iEntry=0; iEntry<nV0MIs;iEntry++){
+ v0MI = (AliV0*)fEvent->GetV0(iEntry);
+ if (!v0MI) continue;
+ //
+ //
+ //
+ //Int_t label0 = TMath::Abs(v0MI->GetLabel(0));
+ //Int_t label1 = TMath::Abs(v0MI->GetLabel(1));
+ AliESDtrack * trackn = fEvent->GetTrack((v0MI->GetNindex()));
+ AliESDtrack * trackp = fEvent->GetTrack((v0MI->GetPindex()));
+ Int_t labels[2]={-1,-1};
+ labels[0] = (trackn==0) ? -1 : trackn->GetLabel();
+ labels[1] = (trackp==0) ? -1 : trackp->GetLabel();
+ //
+ for (Int_t i=0;i<2;i++){
+ Int_t absLabel = labels[i];
+ if (absLabel < fNParticles) {
+ if (fMultiRecV0[absLabel]>0){
+ if (fMultiRecV0[absLabel]<20)
+ fIndexRecV0[absLabel*20+fMultiRecV0[absLabel]] = iEntry;
+ }
+ else
+ fIndexRecV0[absLabel*20] = iEntry;
+ fMultiRecV0[absLabel]++;
+ }
+ }
+ }
printf("Time spended in TreeTLoop\n");
// loop over all entries for a given event, find corresponding
// rec. track and store in the fTreeCmp
//
+ static TDatabasePDG pdgtable;
+
TStopwatch timer;
timer.Start();
Int_t entry = fNextV0ToRead;
fRecV0Info->fV0its->Update(vertex);
}
}
+ //
+ // ????
+ //
if (TMath::Abs(fGenV0Info->GetMinus().fPdg)==11 &&TMath::Abs(fGenV0Info->GetPlus().fPdg)==11){
if (fRecV0Info->fDist2>10){
fRecV0Info->Update(vertex);
Int_t label = TMath::Min(fGenV0Info->GetMinus().fLabel,fGenV0Info->GetPlus().fLabel);
Int_t label2 = TMath::Max(fGenV0Info->GetMinus().fLabel,fGenV0Info->GetPlus().fLabel);
AliV0 *v0MI=0;
+ AliV0 *v0MIOff=0;
fRecV0Info->fRecStatus =0;
fRecV0Info->fMultiple = fMultiRecV0[label];
- fRecV0Info->fV0Multiple=0;
+ fRecV0Info->fV0MultipleOn=0;
+ fRecV0Info->fV0MultipleOff=0;
//
if (fMultiRecV0[label]>0 || fMultiRecV0[label2]>0){
Int_t vlabelp = (trackp==0) ? -1 : trackp->GetLabel();
//
if (TMath::Abs(vlabeln)==label &&TMath::Abs(vlabelp)==label2) {
- v0MI =v0MI2;
- fRecV0Info->fV0Multiple++;
+ if (v0MI2->GetOnFlyStatus()) {
+ v0MI =v0MI2;
+ fRecV0Info->fV0MultipleOn++;
+ }else {
+ v0MIOff = v0MI2;
+ fRecV0Info->fV0MultipleOff++;
+ }
fSignedV0[index]=1;
}
if (TMath::Abs(vlabelp)==label &&TMath::Abs(vlabeln)==label2) {
- v0MI =v0MI2;
- fRecV0Info->fV0Multiple++;
+ if (v0MI2->GetOnFlyStatus()){
+ v0MI =v0MI2;
+ fRecV0Info->fV0MultipleOn++;
+ }else {
+ v0MIOff = v0MI2;
+ fRecV0Info->fV0MultipleOff++;
+ }
fSignedV0[index]=1;
}
}
}
if (v0MI){
- fRecV0Info->fV0rec = v0MI;
+ new (fRecV0Info->fV0rec) AliV0(*v0MI);
fRecV0Info->fRecStatus=1;
}
-
+ if (v0MIOff){
+ new (fRecV0Info->fV0recOff) AliV0(*v0MIOff);
+ fRecV0Info->fRecStatus=1;
+ }
+ Int_t mpdg = fGenV0Info->GetMother().GetPdgCode();
+ Float_t mass = ( pdgtable.GetParticle(mpdg)==0) ? 0 :pdgtable.GetParticle(mpdg)->Mass();
+ fRecV0Info->UpdateKF(*esdvertex,
+ fGenV0Info->GetPlus().GetPdg(),
+ fGenV0Info->GetMinus().GetPdg(),
+ mass);
fTreeCmpV0->Fill();
}
//
// write fake v0s
//
- // Int_t nV0MIs = fEvent->GetNumberOfV0s();
-// for (Int_t i=0;i<nV0MIs;i++){
-// if (fSignedV0[i]==0){
-// AliV0 *v0MI = (AliV0*)fEvent->GetV0(i);
-// if (!v0MI) continue;
-// //
-// fRecV0Info->fV0rec = v0MI;
-// fRecV0Info->fV0Status =-10;
-// fRecV0Info->fRecStatus =-2;
-// //
-// AliESDRecInfo* fRecInfo1 = (AliESDRecInfo*)fRecArray->At(TMath::Abs(v0MI->GetLabel(0)));
-// AliESDRecInfo* fRecInfo2 = (AliESDRecInfo*)fRecArray->At(TMath::Abs(v0MI->GetLabel(1)));
-// if (fRecInfo1 && fRecInfo2){
-// fRecV0Info->fT1 = (*fRecInfo1);
-// fRecV0Info->fT2 = (*fRecInfo2);
-// fRecV0Info->fRecStatus =-1;
-// }
-// fRecV0Info->Update(vertex);
-// fTreeCmpV0->Fill();
-// }
-// }
+ Int_t nV0MIs = fEvent->GetNumberOfV0s();
+ for (Int_t i=0;i<nV0MIs;i++){
+ if (fSignedV0[i]==0){
+ AliV0 *v0MI = (AliV0*)fEvent->GetV0(i);
+ if (!v0MI) continue;
+ //
+ new (fRecV0Info->fV0rec) AliV0(*v0MI);
+ fRecV0Info->fV0Status =-10;
+ fRecV0Info->fRecStatus =-2;
+ //
+ AliESDtrack * trackn = fEvent->GetTrack((v0MI->GetNindex()));
+ AliESDtrack * trackp = fEvent->GetTrack((v0MI->GetPindex()));
+ Int_t vlabeln = (trackn==0) ? -1 : trackn->GetLabel();
+ Int_t vlabelp = (trackp==0) ? -1 : trackp->GetLabel();
+
+ AliESDRecInfo* fRecInfo1 = (AliESDRecInfo*)fRecArray->At(TMath::Abs(vlabeln));
+ AliESDRecInfo* fRecInfo2 = (AliESDRecInfo*)fRecArray->At(TMath::Abs(vlabelp));
+ if (fRecInfo1 && fRecInfo2){
+ fRecV0Info->fT1 = (*fRecInfo1);
+ fRecV0Info->fT2 = (*fRecInfo2);
+ fRecV0Info->fRecStatus =-1;
+ }
+ fRecV0Info->Update(vertex);
+ fRecV0Info->UpdateKF(*esdvertex,211,211,0.49767);
+ fTreeCmpV0->Fill();
+ }
+ }