Updated code/macros to be compliant with the current HEAD (from Y. Belikov)
authorbarbera <barbera@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 23 Jul 2002 16:42:40 +0000 (16:42 +0000)
committerbarbera <barbera@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 23 Jul 2002 16:42:40 +0000 (16:42 +0000)
ITS/AliCascadeComparison.C
ITS/AliCascadeFindVertices.C
ITS/AliCascadeVertex.cxx
ITS/AliCascadeVertex.h
ITS/AliITSrecoV2.h
ITS/AliITStestV2.C
ITS/AliV0Comparison.C
ITS/AliV0FindVertices.C
ITS/AliV0vertex.cxx
ITS/AliV0vertex.h

index bffb293..c7b33ed 100644 (file)
@@ -45,12 +45,26 @@ Int_t AliCascadeComparison(Int_t code=3312) {
    cerr<<"Doing comparison...\n";
 
    const Double_t cascadeWindow=0.05, cascadeWidth=0.015; 
-   Double_t cascadeMass=0.5;
+   Double_t ptncut=0.12, ptpcut=0.33, kine0cut=0.003;
+   Double_t ptbcut=0.11, kinecut=0.002;
+   Double_t cascadeMass=1.32131;
    switch (code) {
    case kXiMinus:
-   case kXiPlusBar:    cascadeMass=1.32131; break;
+        break;
+   case kXiPlusBar:
+        ptncut=0.33; ptpcut=0.12;
+        break;
    case kOmegaMinus: 
-   case kOmegaPlusBar: cascadeMass=1.67245; break;
+        cascadeMass=1.67245;
+        kine0cut=0.001;
+        ptbcut=0.22; kinecut=0.006;
+        break; 
+   case kOmegaPlusBar:
+        cascadeMass=1.67245; 
+        kine0cut=0.001;
+        ptncut=0.33; ptpcut=0.12;
+        ptbcut=0.22; kinecut=0.006;
+        break;
    default: cerr<<"Invalid PDG code !\n"; return 1;
    }
 
@@ -131,21 +145,38 @@ Int_t AliCascadeComparison(Int_t code=3312) {
 
    Double_t mmin=cascadeMass-cascadeWindow, mmax=cascadeMass+cascadeWindow;
    TH1F *cs =new TH1F("cs","Cascade Effective Mass",40, mmin, mmax);
-   cs->SetXTitle("(GeV)"); cs->SetFillColor(6);
+   cs->SetXTitle("(GeV)");
+   cs->SetLineColor(4); cs->SetLineWidth(4);
+   TH1F *csf =new TH1F("csf","Fake Cascade Effective Mass",40, mmin, mmax);
+   csf->SetXTitle("(GeV)"); csf->SetFillColor(6);
 
    Double_t pxg=0.,pyg=0.,ptg=0.;
    Int_t nlab=-1, plab=-1, blab=-1;
    Int_t i;
    for (i=0; i<nentr; i++) {
        AliCascadeVertex *cascade=(AliCascadeVertex*)carray.UncheckedAt(i);
-       cascade->GetV0labels(nlab,plab); 
-       nlab=TMath::Abs(nlab); plab=TMath::Abs(plab);
-       blab=TMath::Abs(cascade->GetBachelorLabel());
-
-       cascade->ChangeMassHypothesis(code);
+       nlab=TMath::Abs(cascade->GetNlabel()); 
+       plab=TMath::Abs(cascade->GetPlabel());
+       blab=TMath::Abs(cascade->GetBlabel());
+
+       /** Kinematical cuts **/
+       Double_t pxn,pyn,pzn; cascade->GetNPxPyPz(pxn,pyn,pzn); 
+       Double_t ptn=TMath::Sqrt(pxn*pxn + pyn*pyn);
+       if (ptn < ptncut) continue;
+       Double_t pxp,pyp,pzp; cascade->GetPPxPyPz(pxp,pyp,pzp); 
+       Double_t ptp=TMath::Sqrt(pxp*pxp + pyp*pyp);
+       if (ptp < ptpcut) continue;
+       Double_t pxb,pyb,pzb; cascade->GetBPxPyPz(pxb,pyb,pzb); 
+       Double_t ptb=TMath::Sqrt(pxb*pxb + pyb*pyb);
+       if (ptb < ptbcut) continue;
+       Double_t kine0;
+       Double_t kine=cascade->ChangeMassHypothesis(kine0,code);
+       if (TMath::Abs(kine0)>kine0cut) continue;
+       //if (TMath::Abs(kine)>kinecut) continue;
 
        Double_t mass=cascade->GetEffMass();
        cs->Fill(mass);
+       csf->Fill(mass);
 
        if (TMath::Abs(mass-cascadeMass)>cascadeWidth) continue;
 
@@ -165,6 +196,7 @@ Int_t AliCascadeComparison(Int_t code=3312) {
           cerr<<"Fake cascade: ("<<nlab<<","<<plab<<","<<blab<<")\n";
           continue;
        }
+       csf->Fill(mass,-1);
 
        pxg=gc[j].px; pyg=gc[j].py; ptg=TMath::Sqrt(pxg*pxg+pyg*pyg);
        Double_t phig=TMath::ATan2(pyg,pxg), phi=TMath::ATan2(py,px);
@@ -264,9 +296,9 @@ Int_t AliCascadeComparison(Int_t code=3312) {
 
    c2->cd(2);
    gPad->SetFillColor(42); gPad->SetFrameFillColor(10);
-   cs->SetXTitle("(GeV/c)"); 
    //cs->Fit("gaus","","",cascadeMass-cascadeWidth,cascadeMass+cascadeWidth);
    cs->Draw();
+   csf->Draw("same");
    Double_t max=cs->GetMaximum();
    TLine *line3 = 
       new TLine(cascadeMass-cascadeWidth,0.,cascadeMass-cascadeWidth,max);
index 44eb584..0ae2ae3 100644 (file)
@@ -19,14 +19,14 @@ Int_t AliCascadeFindVertices() {
    if (!file->IsOpen()) {
       cerr<<"Can't open AliV0vertices.root !\n";return 3;
    }
-   Double_t cuts[]={33.,  // max. allowed chi2
-                    0.015,// min. allowed V0 impact parameter 
-                    0.05, // window around the Lambda mass 
-                    0.015,// min. allowed track impact parameter 
-                    0.060,// max. allowed DCA between a V0 and a track
-                    0.997,// max. allowed cosine of the cascade pointing angle
-                    0.9,  // min. radius of the fiducial volume
-                    2.9   // max. radius of the fiducial volume
+   Double_t cuts[]={33.,    // max. allowed chi2
+                    0.05,   // min. allowed V0 impact parameter 
+                    0.008,  // window around the Lambda mass 
+                    0.035,  // min. allowed bachelor's impact parameter 
+                    0.10,   // max. allowed DCA between a V0 and a track
+                    0.9985, // max. allowed cosine of the cascade pointing angle
+                    0.9,    // min. radius of the fiducial volume
+                    2.9     // max. radius of the fiducial volume
                    };
    TStopwatch timer;
    AliCascadeVertexer *vertexer=new AliCascadeVertexer(cuts);
index d732940..96b8d6b 100644 (file)
@@ -97,13 +97,8 @@ AliCascadeVertex::AliCascadeVertex(const AliV0vertex &v,const AliITStrackV2 &t)
   // position of the cascade decay
   
   fPos[0]=0.5*(x1+xm); fPos[1]=0.5*(y1+ym); fPos[2]=0.5*(z1+zm);
-  
-  
-  // momenta of the bachelor and the V0
-  
-  fBachMom[0]=px1; fBachMom[1]=py1; fBachMom[2]=pz1; 
-  fV0mom[0]=px2; fV0mom[1]=py2; fV0mom[2]=pz2;
-  
+    
+
   // invariant mass of the cascade (default is Ximinus)
   
   Double_t e1=TMath::Sqrt(0.13957*0.13957 + px1*px1 + py1*py1 + pz1*pz1);
@@ -112,47 +107,165 @@ AliCascadeVertex::AliCascadeVertex(const AliV0vertex &v,const AliITStrackV2 &t)
   fEffMass=TMath::Sqrt((e1+e2)*(e1+e2)-
     (px1+px2)*(px1+px2)-(py1+py2)*(py1+py2)-(pz1+pz2)*(pz1+pz2));
 
+
+  // momenta of the bachelor and the V0
+  
+  fBachMom[0]=px1; fBachMom[1]=py1; fBachMom[2]=pz1; 
+  v.GetNPxPyPz(px2,py2,pz2);
+  fV0mom[0][0]=px2; fV0mom[0][1]=py2; fV0mom[0][2]=pz2;
+  v.GetPPxPyPz(px2,py2,pz2);
+  fV0mom[1][0]=px2; fV0mom[1][1]=py2; fV0mom[1][2]=pz2;
+
+
   fChi2=7.;   
 
 }
 
-void AliCascadeVertex::ChangeMassHypothesis(Int_t code) {
+/*
+Double_t AliCascadeVertex::ChangeMassHypothesis(Double_t &v0q, Int_t code) {
   //--------------------------------------------------------------------
   // This function changes the mass hypothesis for this cascade
+  // and returns the "kinematical quality" of this hypothesis
+  // together with the "quality" of associated V0 (argument v0q) 
   //--------------------------------------------------------------------
-  
-  // HOW TO DISTINGUISH BETWEEN A XIMINUS AND A XIPLUS ??????????
-  // SAME QUESTION FOR (ANTI-)OMEGA'S (here) ... AND FOR (ANTI-)LAMBDAS (in AliV0vertex) ??
-  // -> NEED ADDITIONAL CONDITION ON BACHELOR AND V0 PDGCODE !!!! BUT in the ANALYSIS MACROS !!!
-  
-  Double_t massBach, massV0;
+  Double_t nmass=0.13957, pmass=0.93827, des0=0.9437-0.1723; 
+  Double_t bmass=0.13957, mass =1.3213,  des =1.1243-0.1970;
 
-  switch (code) {
+  fPdgCode=code;
 
+  switch (code) {
+  case 213: 
+       bmass=0.93827; 
+       break;
   case kXiMinus:
-    massBach=0.13957; massV0=1.11568; break;
+       break;
   case kXiPlusBar:
-    massBach=0.13957; massV0=1.11568; break;
+       nmass=0.93827; pmass=0.13957; des0=-des0; 
+       des=-des;
+       break;
   case kOmegaMinus: 
-    massBach=0.49368; massV0=1.11568; break;
+       bmass=0.49368; mass=1.67245; des=1.1355-0.5369;
+       break;
   case kOmegaPlusBar: 
-    massBach=0.49368; massV0=1.11568; break;
-
+       nmass=0.93827; pmass=0.13957; des0=-des0; 
+       bmass=0.49368; mass=1.67245; des=0.5369-1.1355;
+       break;
   default:
-    cerr<<"AliCascadeVertex::ChangeMassHypothesis: ";
-    cerr<<"invalide PDG code ! Assuming XiMinus's...\n";
-    massBach=0.13957; massV0=1.11568; break;
+       cerr<<"AliCascadeVertex::ChangeMassHypothesis: ";
+       cerr<<"Invalide PDG code !  Assuming XiMinus's...\n";
+       fPdgCode=kXiMinus;
+    break;
   }
 
-  Double_t px1=fBachMom[0], py1=fBachMom[1], pz1=fBachMom[2]; 
-  Double_t px2=fV0mom[0], py2=fV0mom[1], pz2=fV0mom[2];
+  Double_t pxn=fV0mom[0][0], pyn=fV0mom[0][1], pzn=fV0mom[0][2];
+  Double_t pxp=fV0mom[1][0], pyp=fV0mom[1][1], pzp=fV0mom[1][2];
+  Double_t en=TMath::Sqrt(nmass*nmass + pxn*pxn + pyn*pyn + pzn*pzn);
+  Double_t ep=TMath::Sqrt(pmass*pmass + pxp*pxp + pyp*pyp + pzp*pzp);
+  Double_t px0=pxn+pxp, py0=pyn+pyp, pz0=pzn+pzp;
+  Double_t p0=TMath::Sqrt(px0*px0 + py0*py0 + pz0*pz0);
 
-  Double_t e1=TMath::Sqrt(massBach*massBach + px1*px1 + py1*py1 + pz1*pz1);
-  Double_t e2=TMath::Sqrt(massV0*massV0 + px2*px2 + py2*py2 + pz2*pz2);
-  fEffMass=TMath::Sqrt((e1+e2)*(e1+e2)-
-    (px1+px2)*(px1+px2)-(py1+py2)*(py1+py2)-(pz1+pz2)*(pz1+pz2));
+  Double_t gamma0=(en+ep)/1.11568, betagamma0=p0/1.11568;
+  Double_t pln=(pxn*px0 + pyn*py0 + pzn*pz0)/p0;
+  Double_t plp=(pxp*px0 + pyp*py0 + pzp*pz0)/p0;
+  Double_t plps=gamma0*plp - betagamma0*ep;
+
+  Double_t diff0=2*gamma0*plps + betagamma0*des0;
+
+
+  v0q=plp-pln-diff0;
+
+
+  Double_t pxb=fBachMom[0], pyb=fBachMom[1], pzb=fBachMom[2]; 
+
+  Double_t e0=TMath::Sqrt(1.11568*1.11568 + p0*p0);
+  Double_t eb=TMath::Sqrt(bmass*bmass + pxb*pxb + pyb*pyb + pzb*pzb);
+  Double_t pxl=px0+pxb, pyl=py0+pyb, pzl=pz0+pzb;
+  Double_t pl=TMath::Sqrt(pxl*pxl + pyl*pyl + pzl*pzl);
   
+  fEffMass=TMath::Sqrt((e0+eb)*(e0+eb) - pl*pl);
+
+  Double_t gamma=(e0+eb)/mass, betagamma=pl/mass;
+  Double_t pl0=(px0*pxl + py0*pyl + pz0*pzl)/pl;
+  Double_t plb=(pxb*pxl + pyb*pyl + pzb*pzl)/pl;
+  Double_t pl0s=gamma*pl0 - betagamma*e0;
+
+  Double_t diff=2*gamma*pl0s + betagamma*des;
+
+  return (pl0-plb-diff);
+}
+*/
+
+Double_t AliCascadeVertex::ChangeMassHypothesis(Double_t &v0q, Int_t code) {
+  //--------------------------------------------------------------------
+  // This function changes the mass hypothesis for this cascade
+  // and returns the "kinematical quality" of this hypothesis
+  // together with the "quality" of associated V0 (argument v0q) 
+  //--------------------------------------------------------------------
+  Double_t nmass=0.13957, pmass=0.93827, ps0=0.101; 
+  Double_t bmass=0.13957, mass =1.3213,  ps =0.139;
+
   fPdgCode=code;
+
+  switch (code) {
+  case 213: 
+       bmass=0.93827; 
+       break;
+  case kXiMinus:
+       break;
+  case kXiPlusBar:
+       nmass=0.93827; pmass=0.13957; 
+       break;
+  case kOmegaMinus: 
+       bmass=0.49368; mass=1.67245; ps=0.211;
+       break;
+  case kOmegaPlusBar: 
+       nmass=0.93827; pmass=0.13957; 
+       bmass=0.49368; mass=1.67245; ps=0.211;
+       break;
+  default:
+       cerr<<"AliCascadeVertex::ChangeMassHypothesis: ";
+       cerr<<"Invalide PDG code !  Assuming XiMinus's...\n";
+       fPdgCode=kXiMinus;
+    break;
+  }
+
+  Double_t pxn=fV0mom[0][0], pyn=fV0mom[0][1], pzn=fV0mom[0][2];
+  Double_t pxp=fV0mom[1][0], pyp=fV0mom[1][1], pzp=fV0mom[1][2];
+  Double_t px0=pxn+pxp, py0=pyn+pyp, pz0=pzn+pzp;
+  Double_t p0=TMath::Sqrt(px0*px0 + py0*py0 + pz0*pz0);
+
+  Double_t e0=TMath::Sqrt(1.11568*1.11568 + p0*p0);
+  Double_t beta0=p0/e0;
+  Double_t pln=(pxn*px0 + pyn*py0 + pzn*pz0)/p0;
+  Double_t plp=(pxp*px0 + pyp*py0 + pzp*pz0)/p0;
+  Double_t pt2=pxp*pxp + pyp*pyp + pzp*pzp - plp*plp;
+
+  Double_t a=(plp-pln)/(plp+pln);
+  a -= (pmass*pmass-nmass*nmass)/(1.11568*1.11568);
+  a = 0.25*beta0*beta0*1.11568*1.11568*a*a + pt2;
+
+
+  v0q=a - ps0*ps0;
+
+
+  Double_t pxb=fBachMom[0], pyb=fBachMom[1], pzb=fBachMom[2]; 
+
+  Double_t eb=TMath::Sqrt(bmass*bmass + pxb*pxb + pyb*pyb + pzb*pzb);
+  Double_t pxl=px0+pxb, pyl=py0+pyb, pzl=pz0+pzb;
+  Double_t pl=TMath::Sqrt(pxl*pxl + pyl*pyl + pzl*pzl);
+  
+  fEffMass=TMath::Sqrt((e0+eb)*(e0+eb) - pl*pl);
+
+  Double_t beta=pl/(e0+eb);
+  Double_t pl0=(px0*pxl + py0*pyl + pz0*pzl)/pl;
+  Double_t plb=(pxb*pxl + pyb*pyl + pzb*pzl)/pl;
+  pt2=p0*p0 - pl0*pl0;
+
+  a=(pl0-plb)/(pl0+plb);
+  a -= (1.11568*1.11568-bmass*bmass)/(mass*mass);
+  a = 0.25*beta*beta*mass*mass*a*a + pt2;
+
+  return (a - ps*ps);
 }
 
 void 
@@ -160,9 +273,9 @@ AliCascadeVertex::GetPxPyPz(Double_t &px, Double_t &py, Double_t &pz) const {
   //--------------------------------------------------------------------
   // This function returns the cascade momentum (global)
   //--------------------------------------------------------------------
-  px=fV0mom[0]+fBachMom[0]; 
-  py=fV0mom[1]+fBachMom[1]; 
-  pz=fV0mom[2]+fBachMom[2]; 
+  px=fV0mom[0][0]+fV0mom[1][0]+fBachMom[0]; 
+  py=fV0mom[0][1]+fV0mom[1][1]+fBachMom[1]; 
+  pz=fV0mom[0][2]+fV0mom[1][2]+fBachMom[2]; 
 }
 
 void AliCascadeVertex::GetXYZ(Double_t &x, Double_t &y, Double_t &z) const {
@@ -180,9 +293,9 @@ Double_t AliCascadeVertex::GetD(Double_t x0, Double_t y0, Double_t z0) const {
   //--------------------------------------------------------------------
 
   Double_t x=fPos[0],y=fPos[1],z=fPos[2];
-  Double_t px=fV0mom[0]+fBachMom[0];
-  Double_t py=fV0mom[1]+fBachMom[1];
-  Double_t pz=fV0mom[2]+fBachMom[2];
+  Double_t px=fV0mom[0][0]+fV0mom[1][0]+fBachMom[0];
+  Double_t py=fV0mom[0][1]+fV0mom[1][1]+fBachMom[1];
+  Double_t pz=fV0mom[0][2]+fV0mom[1][2]+fBachMom[2];
 
   Double_t dx=(y0-y)*pz - (z0-z)*py; 
   Double_t dy=(x0-x)*pz - (z0-z)*px;
@@ -191,3 +304,4 @@ Double_t AliCascadeVertex::GetD(Double_t x0, Double_t y0, Double_t z0) const {
 
   return d;
 }
+
index 6979e73..32eaa9d 100644 (file)
@@ -26,7 +26,7 @@ public:
   AliCascadeVertex();
   AliCascadeVertex(const AliV0vertex &vtx, const AliITStrackV2 &trk);
 
-  void ChangeMassHypothesis(Int_t code=kXiMinus); 
+  Double_t ChangeMassHypothesis(Double_t &v0q, Int_t code=kXiMinus); 
 
   Int_t GetPdgCode() const {return fPdgCode;}
   Double_t GetEffMass() const {return fEffMass;}
@@ -34,8 +34,19 @@ public:
   void GetPxPyPz(Double_t &px, Double_t &py, Double_t &pz) const;
   void GetXYZ(Double_t &x, Double_t &y, Double_t &z) const;
   Double_t GetD(Double_t x0=0.,Double_t y0=0.,Double_t z0=0.) const;
-  void GetV0labels(Int_t &n, Int_t &p) const {n=fV0lab[0]; p=fV0lab[1];}
-  Int_t GetBachelorLabel() const {return fBachLab;}
+
+  void GetNPxPyPz(Double_t &px, Double_t &py, Double_t &pz) const {
+     px=fV0mom[0][0]; py=fV0mom[0][1]; pz=fV0mom[0][2];
+  }
+  Int_t GetNlabel() const {return fV0lab[0];}
+  void GetPPxPyPz(Double_t &px, Double_t &py, Double_t &pz) const {
+     px=fV0mom[1][0]; py=fV0mom[1][1]; pz=fV0mom[1][2];
+  }
+  Int_t GetPlabel() const {return fV0lab[1];}
+  void GetBPxPyPz(Double_t &px, Double_t &py, Double_t &pz) const {
+     px=fBachMom[0]; py=fBachMom[1]; pz=fBachMom[2];
+  }
+  Int_t GetBlabel() const {return fBachLab;}
 
 private: 
   Int_t fPdgCode;           // reconstructed cascade type (PDG code)
@@ -45,7 +56,7 @@ private:
   Double_t fPosCov[6];      // covariance matrix of the vertex position
 
   Int_t fV0lab[2];          // labels of the V0 daughter tracks
-  Double_t fV0mom[3];       // V0 momentum (global)
+  Double_t fV0mom[2][3];    // V0 daughters' momenta (global)
   Double_t fV0momCov[6];    // covariance matrix of the V0 momentum.
 
   Int_t fBachLab;           // label of the bachelor track
index 16b91ce..459266b 100644 (file)
@@ -25,7 +25,7 @@
    };
 
    const Double_t kChi2PerCluster=5.;//7.;
-   const Double_t kMaxChi2=17.;//15.;
+   const Double_t kMaxChi2=15.;//17.;
    const Double_t kMaxRoad=3.0;
 
    const Double_t kSigmaYV=0.005e+0;
index d942037..156df01 100644 (file)
@@ -37,5 +37,17 @@ Int_t AliITStestV2(Char_t SlowOrFast='s') {
    gROOT->LoadMacro("$(ALICE_ROOT)/ITS/AliITSComparisonV2.C");
    if (rc=AliITSComparisonV2()) return rc;
 
+   gROOT->LoadMacro("$(ALICE_ROOT)/ITS/AliV0FindVertices.C");
+   if (rc=AliV0FindVertices()) return rc;
+
+   gROOT->LoadMacro("$(ALICE_ROOT)/ITS/AliV0Comparison.C");
+   if (rc=AliV0Comparison()) return rc;
+
+   gROOT->LoadMacro("$(ALICE_ROOT)/ITS/AliCascadeFindVertices.C");
+   if (rc=AliCascadeFindVertices()) return rc;
+
+   gROOT->ProcessLine(".L $(ALICE_ROOT)/ITS/AliCascadeComparison.C+");
+   if (rc=AliCascadeComparison()) return rc;
+
    return rc;
 }
index 92bdc39..93ece7e 100644 (file)
@@ -38,12 +38,18 @@ Int_t good_vertices(GoodVertex *gt, Int_t max);
 Int_t AliV0Comparison(Int_t code=310) { //Lambda=3122, LambdaBar=-3122
    cerr<<"Doing comparison...\n";
 
-   const Double_t V0window=0.05, V0width=0.015; 
-   Double_t V0mass=0.5;
+   const Double_t V0window=0.05;
+   Double_t ptncut=0.13, ptpcut=0.13, kinecut=0.03; 
+   Double_t V0mass=0.497672, V0width=0.020;
    switch (code) {
-   case kK0Short:    V0mass=0.497672; break;
-   case kLambda0:    V0mass=1.115683; break;
-   case kLambda0Bar: V0mass=1.115683; break;
+   case kK0Short: 
+        break;
+   case kLambda0:    
+        V0mass=1.115683; V0width=0.015; ptpcut=0.50; kinecut=0.002; 
+        break;
+   case kLambda0Bar: 
+        V0mass=1.115683; V0width=0.015; ptncut=0.50; kinecut=0.002;
+        break;
    default: cerr<<"Invalid PDG code !\n"; return 1;
    }
 
@@ -122,7 +128,10 @@ Int_t AliV0Comparison(Int_t code=310) { //Lambda=3122, LambdaBar=-3122
 
    Double_t mmin=V0mass-V0window, mmax=V0mass+V0window;
    TH1F *v0s =new TH1F("v0s","V0s Effective Mass",40, mmin, mmax);
-   v0s->SetXTitle("(GeV)"); v0s->SetFillColor(6);
+   v0s->SetXTitle("(GeV)");
+   v0s->SetLineColor(4); v0s->SetLineWidth(4);
+   TH1F *v0sf =new TH1F("v0sf","Fake V0s Effective Mass",40, mmin, mmax);
+   v0sf->SetXTitle("(GeV)"); v0sf->SetFillColor(6);
 
 
    Double_t pxg=0.,pyg=0.,ptg=0.;
@@ -133,10 +142,19 @@ Int_t AliV0Comparison(Int_t code=310) { //Lambda=3122, LambdaBar=-3122
        nlab=TMath::Abs(vertex->GetNlabel());
        plab=TMath::Abs(vertex->GetPlabel());
 
-       vertex->ChangeMassHypothesis(code);
+       /** Kinematical cuts **/
+       Double_t pxn,pyn,pzn; vertex->GetNPxPyPz(pxn,pyn,pzn); 
+       Double_t ptn=TMath::Sqrt(pxn*pxn + pyn*pyn);
+       if (ptn < ptncut) continue;
+       Double_t pxp,pyp,pzp; vertex->GetPPxPyPz(pxp,pyp,pzp); 
+       Double_t ptp=TMath::Sqrt(pxp*pxp + pyp*pyp);
+       if (ptp < ptpcut) continue;
+       Double_t kine=vertex->ChangeMassHypothesis(code);
+       //if (TMath::Abs(kine)>kinecut) continue;
 
        Double_t mass=vertex->GetEffMass();
        v0s->Fill(mass);
+       v0sf->Fill(mass);
 
        Int_t j;
        for (j=0; j<ngood; j++) {
@@ -155,6 +173,7 @@ Int_t AliV0Comparison(Int_t code=310) { //Lambda=3122, LambdaBar=-3122
           cerr<<"Fake vertex: ("<<nlab<<","<<plab<<")\n";
           continue;
        }
+       v0sf->Fill(mass,-1);
 
        pxg=gv[j].px; pyg=gv[j].py; ptg=TMath::Sqrt(pxg*pxg+pyg*pyg);
        Double_t phig=TMath::ATan2(pyg,pxg), phi=TMath::ATan2(py,px);
@@ -254,8 +273,9 @@ Int_t AliV0Comparison(Int_t code=310) { //Lambda=3122, LambdaBar=-3122
 
    c2->cd(2);
    gPad->SetFillColor(42); gPad->SetFrameFillColor(10);
-   v0s->SetXTitle("(GeV/c)"); 
-   v0s->Fit("gaus","","",V0mass-V0width,V0mass+V0width);
+   //v0s->Fit("gaus","","",V0mass-V0width,V0mass+V0width);
+   v0s->Draw();
+   v0sf->Draw("same");
    Double_t max=v0s->GetMaximum();
    TLine *line3 = new TLine(V0mass-V0width,0.,V0mass-V0width,max);
    line3->Draw("same");
index b2e1cb5..c781466 100644 (file)
@@ -15,8 +15,8 @@ Int_t AliV0FindVertices() {
    if (!in->IsOpen()) {cerr<<"Can't open AliITStracksV2.root !\n"; return 2;}
 
    Double_t cuts[]={33,  // max. allowed chi2
-                    0.12,// min. allowed negative daughter's impact parameter 
-                    0.06,// min. allowed positive daughter's impact parameter 
+                    0.16,// min. allowed negative daughter's impact parameter 
+                    0.05,// min. allowed positive daughter's impact parameter 
                     0.080,// max. allowed DCA between the daughter tracks
                     0.998,// max. allowed cosine of V0's pointing angle
                     0.9,  // min. radius of the fiducial volume
index ca305e3..d675175 100644 (file)
@@ -85,35 +85,96 @@ AliV0vertex::AliV0vertex(const AliITStrackV2 &n, const AliITStrackV2 &p) {
 
   fChi2=7.;   
 }
-
-void AliV0vertex::ChangeMassHypothesis(Int_t code) {
+/*
+Double_t AliV0vertex::ChangeMassHypothesis(Int_t code) {
   //--------------------------------------------------------------------
   // This function changes the mass hypothesis for this V0
+  // and returns the "kinematical quality" of this hypothesis 
   //--------------------------------------------------------------------
-  Double_t nmass, pmass;
+  Double_t nmass=0.13957, pmass=0.13957, mass=0.49767, des=0;
+
+  fPdgCode=code;
 
   switch (code) {
   case kLambda0:
-    nmass=0.13957; pmass=0.93827; break;
+    nmass=0.13957; pmass=0.93827; mass=1.1157; des=0.9437-0.1723; break;
   case kLambda0Bar:
-    pmass=0.13957; nmass=0.93827; break;
+    pmass=0.13957; nmass=0.93827; mass=1.1157; des=0.1723-0.9437; break;
   case kK0Short: 
-    nmass=0.13957; pmass=0.13957; break;
+    break;
   default:
     cerr<<"AliV0vertex::ChangeMassHypothesis: ";
     cerr<<"invalide PDG code ! Assuming K0s...\n";
-    nmass=0.13957; pmass=0.13957; break;
+    fPdgCode=kK0Short;
+    break;
   }
 
-  Double_t px1=fNmom[0], py1=fNmom[1], pz1=fNmom[2]; 
-  Double_t px2=fPmom[0], py2=fPmom[1], pz2=fPmom[2];
+  Double_t pxn=fNmom[0], pyn=fNmom[1], pzn=fNmom[2]; 
+  Double_t pxp=fPmom[0], pyp=fPmom[1], pzp=fPmom[2];
 
-  Double_t e1=TMath::Sqrt(nmass*nmass + px1*px1 + py1*py1 + pz1*pz1);
-  Double_t e2=TMath::Sqrt(pmass*pmass + px2*px2 + py2*py2 + pz2*pz2);
-  fEffMass=TMath::Sqrt((e1+e2)*(e1+e2)-
-    (px1+px2)*(px1+px2)-(py1+py2)*(py1+py2)-(pz1+pz2)*(pz1+pz2));
+  Double_t en=TMath::Sqrt(nmass*nmass + pxn*pxn + pyn*pyn + pzn*pzn);
+  Double_t ep=TMath::Sqrt(pmass*pmass + pxp*pxp + pyp*pyp + pzp*pzp);
+  Double_t pxl=pxn+pxp, pyl=pyn+pyp, pzl=pzn+pzp;
+  Double_t pl=TMath::Sqrt(pxl*pxl + pyl*pyl + pzl*pzl);
+
+  fEffMass=TMath::Sqrt((en+ep)*(en+ep)-pl*pl);
+
+  Double_t gamma=(en+ep)/mass, betagamma=pl/mass;
+  Double_t pln=(pxn*pxl + pyn*pyl + pzn*pzl)/pl;
+  Double_t plp=(pxp*pxl + pyp*pyl + pzp*pzl)/pl;
+  Double_t plps=gamma*plp - betagamma*ep;
+
+  Double_t diff=2*gamma*plps + betagamma*des;
+
+  return (plp-pln-diff);
   
+}
+*/
+Double_t AliV0vertex::ChangeMassHypothesis(Int_t code) {
+  //--------------------------------------------------------------------
+  // This function changes the mass hypothesis for this V0
+  // and returns the "kinematical quality" of this hypothesis 
+  //--------------------------------------------------------------------
+  Double_t nmass=0.13957, pmass=0.13957, mass=0.49767, ps=0.206;
+
   fPdgCode=code;
+
+  switch (code) {
+  case kLambda0:
+    nmass=0.13957; pmass=0.93827; mass=1.1157; ps=0.101; break;
+  case kLambda0Bar:
+    pmass=0.13957; nmass=0.93827; mass=1.1157; ps=0.101; break;
+  case kK0Short: 
+    break;
+  default:
+    cerr<<"AliV0vertex::ChangeMassHypothesis: ";
+    cerr<<"invalide PDG code ! Assuming K0s...\n";
+    fPdgCode=kK0Short;
+    break;
+  }
+
+  Double_t pxn=fNmom[0], pyn=fNmom[1], pzn=fNmom[2]; 
+  Double_t pxp=fPmom[0], pyp=fPmom[1], pzp=fPmom[2];
+
+  Double_t en=TMath::Sqrt(nmass*nmass + pxn*pxn + pyn*pyn + pzn*pzn);
+  Double_t ep=TMath::Sqrt(pmass*pmass + pxp*pxp + pyp*pyp + pzp*pzp);
+  Double_t pxl=pxn+pxp, pyl=pyn+pyp, pzl=pzn+pzp;
+  Double_t pl=TMath::Sqrt(pxl*pxl + pyl*pyl + pzl*pzl);
+
+  fEffMass=TMath::Sqrt((en+ep)*(en+ep)-pl*pl);
+
+  Double_t beta=pl/(en+ep);
+  Double_t pln=(pxn*pxl + pyn*pyl + pzn*pzl)/pl;
+  Double_t plp=(pxp*pxl + pyp*pyl + pzp*pzl)/pl;
+
+  Double_t pt2=pxp*pxp + pyp*pyp + pzp*pzp - plp*plp;
+
+  Double_t a=(plp-pln)/(plp+pln);
+  a -= (pmass*pmass-nmass*nmass)/(mass*mass);
+  a = 0.25*beta*beta*mass*mass*a*a + pt2;
+
+  return (a - ps*ps);
+  
 }
 
 void AliV0vertex::GetPxPyPz(Double_t &px, Double_t &py, Double_t &pz) const {
index 2b6ebcd..53a37e1 100644 (file)
@@ -20,7 +20,7 @@ public:
   AliV0vertex();
   AliV0vertex(const AliITStrackV2 &neg, const AliITStrackV2 &pos);
 
-  void ChangeMassHypothesis(Int_t code=kLambda0); 
+  Double_t ChangeMassHypothesis(Int_t code=kK0Short); 
 
   Int_t GetPdgCode() const {return fPdgCode;}
   Double_t GetEffMass() const {return fEffMass;}