// are reconstructed using the AliAODv0 class. \r
//\r
// authors: Matthew Steinpreis (matthew.steinpreis@cern.ch)\r
+// \r
+// Major changes:\r
+// - TOF mismatch function calls changed (3/28/13)\r
+// - added minimum decay length cut (3/28/13)\r
//\r
+// Minor changes:\r
+// - K0 multiplicity histogram now filled with "unskippedCount" instead\r
+// of k0Count (which included skipped k0s with shared daughters) (3/25/13)\r
+// - added hists for 3D mom. in LF and PRF (3/28/13) \r
+// - changed calling of PIDResponse (should be same actions) (3/28/13)\r
////////////////////////////////////////////////////////////////////////////////\r
\r
\r
+\r
#include <iostream>\r
#include <math.h>\r
#include "TMath.h"\r
fFieldPos(kTRUE),\r
fOnlineCase(kTRUE),\r
fMeritCase(kTRUE),\r
+ fMinDecayLength(0.0),\r
fEventCount(0),\r
fEC(0x0),\r
fEvt(0X0),\r
fAOD(0x0),\r
fOutputList(0x0),\r
fPidAOD(0x0),\r
- fPidESD(0x0),\r
fPosDaughter1(0x0), \r
fPosDaughter2(0x0),\r
fNegDaughter1(0x0),\r
{\r
}\r
//________________________________________________________________________\r
-AliFemtoK0Analysis::AliFemtoK0Analysis(const char *name, bool FieldPositive, bool OnlineCase, bool MeritCase) \r
+AliFemtoK0Analysis::AliFemtoK0Analysis(const char *name, bool FieldPositive, bool OnlineCase, bool MeritCase, float MinDL) \r
: AliAnalysisTaskSE(name), \r
fFieldPos(FieldPositive),\r
fOnlineCase(OnlineCase),\r
fMeritCase(MeritCase),\r
+ fMinDecayLength(MinDL),\r
fEventCount(0),\r
fEC(0x0),\r
fEvt(0X0),\r
fAOD(0x0),\r
fOutputList(0x0),\r
fPidAOD(0x0),\r
- fPidESD(0x0),\r
fPosDaughter1(0x0), \r
fPosDaughter2(0x0),\r
fNegDaughter1(0x0),\r
fFieldPos = FieldPositive;\r
fOnlineCase = OnlineCase;\r
fMeritCase = MeritCase;\r
+ fMinDecayLength = MinDL;\r
+\r
// Define output slots here \r
// Output slot #1\r
DefineOutput(1, TList::Class());\r
fFieldPos(obj.fFieldPos),\r
fOnlineCase(obj.fOnlineCase),\r
fMeritCase(obj.fMeritCase),\r
+ fMinDecayLength(obj.fMinDecayLength),\r
fEventCount(obj.fEventCount),\r
fEC(obj.fEC),\r
fEvt(obj.fEvt),\r
fAOD(obj.fAOD),\r
fOutputList(obj.fOutputList),\r
fPidAOD(obj.fPidAOD),\r
- fPidESD(obj.fPidESD),\r
fPosDaughter1(obj.fPosDaughter1), \r
fPosDaughter2(obj.fPosDaughter2),\r
fNegDaughter1(obj.fNegDaughter1),\r
fFieldPos = obj.fFieldPos;\r
fOnlineCase = obj.fOnlineCase;\r
fMeritCase = obj.fMeritCase;\r
+ fMinDecayLength= obj.fMinDecayLength;\r
fEventCount = obj.fEventCount;\r
fEC = obj.fEC;\r
fEvt = obj.fEvt;\r
fAOD = obj.fAOD;\r
fOutputList = obj.fOutputList;\r
fPidAOD = obj.fPidAOD;\r
- fPidESD = obj.fPidESD;\r
fPosDaughter1 = obj.fPosDaughter1; \r
fPosDaughter2 = obj.fPosDaughter2;\r
fNegDaughter1 = obj.fNegDaughter1;\r
if(fAOD) delete fAOD;\r
if(fOutputList) delete fOutputList;\r
if(fPidAOD) delete fPidAOD;\r
- if(fPidESD) delete fPidESD;\r
if(fPosDaughter1) delete fPosDaughter1;\r
if(fPosDaughter2) delete fPosDaughter2;\r
if(fNegDaughter1) delete fNegDaughter1;\r
}\r
}\r
\r
- //fPidAOD = new AliAODpidUtil();\r
AliAODInputHandler *aodH = dynamic_cast<AliAODInputHandler*>(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());\r
- fPidAOD = aodH->GetAODpidUtil();\r
- //fPidAOD = aodH->GetPIDResponse();\r
- fPidESD = new AliESDpid();\r
+ fPidAOD = aodH->GetPIDResponse();\r
\r
fPosDaughter1 = new AliESDtrack();\r
fPosDaughter2 = new AliESDtrack();\r
fOutputList->Add(fHistSepDPC);\r
fOutputList->Add(fHistSepDPCBkg);\r
\r
+ TH1F* fHistPx = new TH1F("fHistPx","",200,0,2);\r
+ TH1F* fHistPy = new TH1F("fHistPy","",200,0,2);\r
+ TH1F* fHistPz = new TH1F("fHistPz","",200,0,2);\r
+ TH1F* fHistPxCM = new TH1F("fHistPxCM","",200,0,2);\r
+ TH1F* fHistPyCM = new TH1F("fHistPyCM","",200,0,2);\r
+ TH1F* fHistPzCM = new TH1F("fHistPzCM","",200,0,2);\r
+ TH1F* fHistKsCM = new TH1F("fHistKsCM","",200,0,2);\r
+ fOutputList->Add(fHistPx);\r
+ fOutputList->Add(fHistPy);\r
+ fOutputList->Add(fHistPz);\r
+ fOutputList->Add(fHistPxCM);\r
+ fOutputList->Add(fHistPyCM);\r
+ fOutputList->Add(fHistPzCM);\r
+ fOutputList->Add(fHistKsCM);\r
+\r
/////////Signal Distributions///////////////////\r
\r
//1D Q invariant\r
const float kMaxDCADaughtersK0 = 0.3; //maximum dca of pions to each other - 3D\r
const float kMaxDCAK0 = 0.3; //maximum dca of K0 to primary\r
const float kMaxDLK0 = 30.0; //maximum decay length of K0\r
+ const float kMinDLK0 = fMinDecayLength; //minimum decay length of K0\r
const float kEtaCut = 0.8; //maximum |pseudorapidity|\r
const float kMinCosAngle = 0.99; //minimum cosine of K0 pointing angle \r
\r
if(fabs(fPidAOD->NumberOfSigmasTPC(prongTrackNeg,AliPID::kPion)) < kMaxTPCSigmaPion) goodPiMinus = kTRUE;\r
\r
//Positive daughter identification TOF\r
+ //float probMis;\r
+ //AliPIDResponse::EDetPidStatus statusPosTOF = fPidAOD->CheckPIDStatus(AliPIDResponse::kTOF, prongTrackPos);\r
double Ppos = v0->PProng(pos0or1);\r
if(Ppos > kTOFLow) //PiPlus\r
{\r
if( (statusPos&AliESDtrack::kTOFpid)!=0 && (statusPos&AliESDtrack::kTIME)!=0 && (statusPos&AliESDtrack::kTOFout)!=0 && (statusPos&AliESDtrack::kTOFmismatch)<=0)\r
+ //if(AliPIDResponse::kDetPidOk == statusPosTOF)\r
{\r
- if(fabs(fPidAOD->NumberOfSigmasTOF(prongTrackPos,AliPID::kPion)) < kMaxTOFSigmaPion) goodPiPlus = kTRUE;\r
- else goodPiPlus = kFALSE;\r
- } \r
+ //probMis = fPidAOD->GetTOFMismatchProbability(prongTrackPos);\r
+ //if(probMis < 0.01) //avoid TOF-TPC mismatch\r
+ //{\r
+ if(fabs(fPidAOD->NumberOfSigmasTOF(prongTrackPos,AliPID::kPion)) < kMaxTOFSigmaPion) goodPiPlus = kTRUE;\r
+ else goodPiPlus = kFALSE;\r
+ //} \r
+ }\r
}\r
//Negative daughter identification TOF\r
+ //AliPIDResponse::EDetPidStatus statusNegTOF = fPidAOD->CheckPIDStatus(AliPIDResponse::kTOF, prongTrackNeg);\r
double Pneg = v0->PProng(neg0or1);\r
if(Pneg > kTOFLow) //PiMinus\r
{\r
if( (statusNeg&AliESDtrack::kTOFpid)!=0 && (statusNeg&AliESDtrack::kTIME)!=0 && (statusNeg&AliESDtrack::kTOFout)!=0 && (statusNeg&AliESDtrack::kTOFmismatch)<=0)\r
+ //if(AliPIDResponse::kDetPidOk == statusNegTOF)\r
{\r
- if(fabs(fPidAOD->NumberOfSigmasTOF(prongTrackNeg,AliPID::kPion)) < kMaxTOFSigmaPion) goodPiMinus = kTRUE;\r
- else goodPiMinus = kFALSE;\r
- }\r
+ //probMis = fPidAOD->GetTOFMismatchProbability(prongTrackPos);\r
+ //if(probMis < 0.01) //avoid TOF-TPC mismatch\r
+ //{\r
+ if(fabs(fPidAOD->NumberOfSigmasTOF(prongTrackNeg,AliPID::kPion)) < kMaxTOFSigmaPion) goodPiMinus = kTRUE;\r
+ else goodPiMinus = kFALSE;\r
+ //}\r
+ }\r
}\r
\r
//K0 cuts\r
if(v0->DcaNegToPrimVertex() < kMinDCAPrimaryPion) continue;\r
if(v0->DcaPosToPrimVertex() < kMinDCAPrimaryPion) continue; \r
if(v0->DecayLength(primaryVertex) > kMaxDLK0) continue;\r
+ if(v0->DecayLength(primaryVertex) < kMinDLK0) continue;\r
if(v0->DcaV0Daughters() > kMaxDCADaughtersK0) continue;\r
double v0Dca = v0->DcaV0ToPrimVertex();\r
if(v0Dca > kMaxDCAK0) continue; \r
{\r
tempK0[v0Count].fK0 = kTRUE;\r
//else tempK0[v0Count].fK0 = kFALSE; //in case I include v0s that arent "good" K0s \r
- k0Count++; \r
+ k0Count++; //same as v0count right now (continue if not in mass range, above)\r
\r
//if(v0->MassK0Short() > .45 && v0->MassK0Short() < .48) tempK0[v0Count].fSideLeft = kTRUE;\r
//else tempK0[v0Count].fSideLeft = kFALSE;\r
//if(v0->MassK0Short() > .515 && v0->MassK0Short() < .545) tempK0[v0Count].fSideRight = kTRUE;\r
//else tempK0[v0Count].fSideRight = kFALSE;\r
- if(!goodK0) continue; //no sides, speed up analysis \r
+ if(!goodK0) continue; //no sides, speed up analysis (REDUNDANT RIGHT NOW)\r
\r
tempK0[v0Count].fDaughterID1 = prongTrackPos->GetID();\r
tempK0[v0Count].fDaughterID2 = prongTrackNeg->GetID();\r
//Printf("Number of K0s: %d", k0Count);\r
tempK0->~AliFemtoK0Particle();\r
\r
- ((TH1F*)fOutputList->FindObject("fHistMultK0"))->Fill(k0Count);\r
+ ((TH1F*)fOutputList->FindObject("fHistMultK0"))->Fill(unskippedCount); // changed 3/25, used to be "k0Count"\r
\r
//Printf("Reconstruction Finished. Starting pair studies.");\r
\r
float qinv, q0, qx, qy, qz, qLong, qSide, qOut; //pair q values\r
float qLength, thetaSH, thetaSHCos, phiSH; //Spherical Harmonics values\r
//float pt1, pt2; //single kaon pt\r
+ float am12, epm, h1, p12, p112, ppx, ppy, ppz, ks; //PRF\r
\r
for(int i=0; i<(fEvt)->fNumV0s; i++) // Current event V0\r
{\r
//single particle histograms (done here to avoid "skipped" v0s\r
- ((TH1F*)fOutputList->FindObject("fHistDCADaughters"))->Fill((fEvt)->fK0Particle[i].fDDDca);\r
- ((TH1F*)fOutputList->FindObject("fHistDecayLengthK0"))->Fill((fEvt)->fK0Particle[i].fDecayLength);\r
- ((TH1F*)fOutputList->FindObject("fHistDCAK0"))->Fill((fEvt)->fK0Particle[i].fV0Dca);\r
- ((TH1F*)fOutputList->FindObject("fHistDCAPiMinus"))->Fill((fEvt)->fK0Particle[i].fNegDca);\r
- ((TH1F*)fOutputList->FindObject("fHistDCAPiPlus"))->Fill((fEvt)->fK0Particle[i].fPosDca);\r
- ((TH2F*)fOutputList->FindObject("fHistPtK0"))->Fill(centBin+1, (fEvt)->fK0Particle[i].fPt);\r
- ((TH2F*)fOutputList->FindObject("fHistK0PiPlusPt"))->Fill(centBin+1, (fEvt)->fK0Particle[i].fPosPt);\r
- ((TH2F*)fOutputList->FindObject("fHistK0PiMinusPt"))->Fill(centBin+1, (fEvt)->fK0Particle[i].fNegPt);\r
- ((TH1F*)fOutputList->FindObject("fHistDaughterPhi"))->Fill((fEvt)->fK0Particle[i].fPosPhi);\r
- ((TH1F*)fOutputList->FindObject("fHistDaughterPhi"))->Fill((fEvt)->fK0Particle[i].fNegPhi);\r
+ ((TH1F*)fOutputList->FindObject("fHistDCADaughters")) ->Fill((fEvt)->fK0Particle[i].fDDDca);\r
+ ((TH1F*)fOutputList->FindObject("fHistDecayLengthK0")) ->Fill((fEvt)->fK0Particle[i].fDecayLength);\r
+ ((TH1F*)fOutputList->FindObject("fHistDCAK0")) ->Fill((fEvt)->fK0Particle[i].fV0Dca);\r
+ ((TH1F*)fOutputList->FindObject("fHistDCAPiMinus")) ->Fill((fEvt)->fK0Particle[i].fNegDca);\r
+ ((TH1F*)fOutputList->FindObject("fHistDCAPiPlus")) ->Fill((fEvt)->fK0Particle[i].fPosDca);\r
+ ((TH2F*)fOutputList->FindObject("fHistPtK0")) ->Fill(centBin+1, (fEvt)->fK0Particle[i].fPt);\r
+ ((TH2F*)fOutputList->FindObject("fHistK0PiPlusPt")) ->Fill(centBin+1, (fEvt)->fK0Particle[i].fPosPt);\r
+ ((TH2F*)fOutputList->FindObject("fHistK0PiMinusPt")) ->Fill(centBin+1, (fEvt)->fK0Particle[i].fNegPt);\r
+ ((TH1F*)fOutputList->FindObject("fHistDaughterPhi")) ->Fill((fEvt)->fK0Particle[i].fPosPhi);\r
+ ((TH1F*)fOutputList->FindObject("fHistDaughterPhi")) ->Fill((fEvt)->fK0Particle[i].fNegPhi);\r
+ \r
+ ((TH1F*)fOutputList->FindObject("fHistPx")) ->Fill((fEvt)->fK0Particle[i].fMomentum[0]);\r
+ ((TH1F*)fOutputList->FindObject("fHistPy")) ->Fill((fEvt)->fK0Particle[i].fMomentum[1]);\r
+ ((TH1F*)fOutputList->FindObject("fHistPz")) ->Fill((fEvt)->fK0Particle[i].fMomentum[2]);\r
\r
for(int evnum=0; evnum<kEventsToMix+1; evnum++)// Event buffer loop: evnum=0 is the current event, all other evnum's are past events\r
{\r
\r
qinv = sqrt(pow(px1-px2,2) + pow(py1-py2,2) + pow(pz1-pz2,2) - pow(en1-en2,2));\r
\r
+ //PRF\r
+ p12 = sqrt(pow(pairPx,2)+pow(pairPy,2)+pow(pairPz,2)); //pair momentum length\r
+ am12 = sqrt(pow(en1+en2,2)-p12*p12); //sqrt(s), |p1+p2| (4vec)\r
+ epm = en1+en2+am12; //"energy plus mass"\r
+ p112 = px1*pairPx+py1*pairPy+pz1*pairPz; //proj. of p1 on pairP\r
+ h1 = (p112/epm - en1)/am12;\r
+ ppx = px1+pairPx*h1; //px in PRF\r
+ ppy = py1+pairPy*h1; //py in PRF \r
+ ppz = pz1+pairPz*h1; //pz in PRF\r
+ ks = sqrt(ppx*ppx+ppy*ppy+ppz*ppz); //k*\r
+ ((TH1F*)fOutputList->FindObject("fHistPxCM"))->Fill(ppx);\r
+ ((TH1F*)fOutputList->FindObject("fHistPyCM"))->Fill(ppy);\r
+ ((TH1F*)fOutputList->FindObject("fHistPzCM"))->Fill(ppz);\r
+ ((TH1F*)fOutputList->FindObject("fHistKsCM"))->Fill(ks);\r
+ \r
+\r
//out-side-long\r
pairP0 = en1 + en2;\r
q0 = en1 - en2;\r